commit d4919a8c6ad9b9ffe4d2abcc5fe89798a6d043c1 Author: Joanna-HE Date: Thu Jan 18 08:54:06 2024 -0500 point-lio with grid map diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100755 index 0000000..3055c75 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,86 @@ +cmake_minimum_required(VERSION 2.8.3) +project(point_lio) + +SET(CMAKE_BUILD_TYPE "Debug") + +ADD_COMPILE_OPTIONS(-std=c++14 ) +ADD_COMPILE_OPTIONS(-std=c++14 ) +set( CMAKE_CXX_FLAGS "-std=c++14 -O3" ) + +add_definitions(-DROOT_DIR=\"${CMAKE_CURRENT_SOURCE_DIR}/\") + +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fexceptions" ) +set(CMAKE_CXX_STANDARD 14) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_EXTENSIONS OFF) +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -pthread -std=c++0x -std=c++14 -fexceptions") + +message("Current CPU archtecture: ${CMAKE_SYSTEM_PROCESSOR}") +if(CMAKE_SYSTEM_PROCESSOR MATCHES "(x86)|(X86)|(amd64)|(AMD64)" ) + include(ProcessorCount) + ProcessorCount(N) + message("Processer number: ${N}") + if(N GREATER 5) + add_definitions(-DMP_EN) + add_definitions(-DMP_PROC_NUM=4) + message("core for MP: 3") + elseif(N GREATER 3) + math(EXPR PROC_NUM "${N} - 2") + add_definitions(-DMP_EN) + add_definitions(-DMP_PROC_NUM="${PROC_NUM}") + message("core for MP: ${PROC_NUM}") + else() + add_definitions(-DMP_PROC_NUM=1) + endif() +else() + add_definitions(-DMP_PROC_NUM=1) +endif() + +find_package(OpenMP QUIET) +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}") + +find_package(PythonLibs REQUIRED) +find_path(MATPLOTLIB_CPP_INCLUDE_DIRS "matplotlibcpp.h") + +find_package(catkin REQUIRED COMPONENTS + geometry_msgs + nav_msgs + sensor_msgs + roscpp + rospy + std_msgs + pcl_ros + tf + livox_ros_driver + message_generation + eigen_conversions +) + +find_package(Eigen3 REQUIRED) +find_package(PCL 1.8 REQUIRED) + + +message(Eigen: ${EIGEN3_INCLUDE_DIR}) + +include_directories( + ${catkin_INCLUDE_DIRS} + ${EIGEN3_INCLUDE_DIR} + ${PCL_INCLUDE_DIRS} + ${PYTHON_INCLUDE_DIRS} + include) + +link_directories( + include + ${PCL_LIBRARY_DIRS} +) + +add_executable(pointlio_mapping src/laserMapping.cpp + src/li_initialization.cpp src/parameters.cpp src/preprocess.cpp src/Estimator.cpp + src/IMU_Processing.cpp) +target_link_libraries(pointlio_mapping ${catkin_LIBRARIES} ${PCL_LIBRARIES} ${PYTHON_LIBRARIES}) + +target_include_directories(pointlio_mapping PRIVATE ${PYTHON_INCLUDE_DIRS}) + + + diff --git a/LICENSE b/LICENSE new file mode 100755 index 0000000..399a50f --- /dev/null +++ b/LICENSE @@ -0,0 +1,34 @@ +This is an advanced implementation of the algorithm described in the following paper: + J. Zhang and S. Singh. LOAM: Lidar Odometry and Mapping in Real-time. + Robotics: Science and Systems Conference (RSS). Berkeley, CA, July 2014. + +Modifier: livox dev@livoxtech.com + +Copyright 2013, Ji Zhang, Carnegie Mellon University +Further contributions copyright (c) 2016, Southwest Research Institute +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +2. 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. +3. 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/Log/IMU_before_filter.txt b/Log/IMU_before_filter.txt new file mode 100644 index 0000000..e69de29 diff --git a/Log/IMU_meas.txt b/Log/IMU_meas.txt new file mode 100644 index 0000000..e69de29 diff --git a/Log/LiDAR_meas.txt b/Log/LiDAR_meas.txt new file mode 100644 index 0000000..e69de29 diff --git a/Log/Lidar_before_filter.txt b/Log/Lidar_before_filter.txt new file mode 100644 index 0000000..e69de29 diff --git a/Log/Lidar_omg_after_rot.txt b/Log/Lidar_omg_after_rot.txt new file mode 100644 index 0000000..e69de29 diff --git a/Log/acc_cost.txt b/Log/acc_cost.txt new file mode 100644 index 0000000..e69de29 diff --git a/Log/guide.md b/Log/guide.md new file mode 100755 index 0000000..883b3d4 --- /dev/null +++ b/Log/guide.md @@ -0,0 +1 @@ +Here saved the debug records which can be drew by the ../log/plot.py. The record function can be found frm the MACRO: DEBUG_FILE_DIR(name) in common_lib.h. diff --git a/Log/imu.txt b/Log/imu.txt new file mode 100755 index 0000000..e69de29 diff --git a/Log/imu_pbp.txt b/Log/imu_pbp.txt new file mode 100644 index 0000000..e69de29 diff --git a/Log/mat_out.txt b/Log/mat_out.txt new file mode 100644 index 0000000..e69de29 diff --git a/Log/plot.py b/Log/plot.py new file mode 100755 index 0000000..b5d1c1a --- /dev/null +++ b/Log/plot.py @@ -0,0 +1,46 @@ +# import matplotlib +# matplotlib.use('Agg') +import numpy as np +import matplotlib.pyplot as plt + +a_out=np.loadtxt('mat_out.txt') +#######for normal####### +fig, axs = plt.subplots(3,2) +lab_out = ['', 'out-x', 'out-y', 'out-z'] +plot_ind = range(7,10) +time=a_out[:,0] +axs[0,0].set_title('Attitude') +axs[1,0].set_title('Translation') +axs[2,0].set_title('Velocity') +axs[0,1].set_title('bg') +axs[1,1].set_title('ba') +axs[2,1].set_title('Gravity') +for i in range(1,4): + for j in range(6): + axs[j%3, j//3].plot(time, a_out[:,i+j*3],'.-', label=lab_out[i]) + for j in range(6): + axs[j%3, j//3].grid() + axs[j%3, j//3].legend() +plt.grid() + #######for normal####### + + +#### Draw IMU data +#fig, axs = plt.subplots(2) +#imu=np.loadtxt('imu_pbp.txt') +#time=imu[:,0] +#axs[0].set_title('Gyroscope') +#axs[1].set_title('Accelerameter') +#lab_1 = ['gyr-x', 'gyr-y', 'gyr-z'] +#lab_2 = ['acc-x', 'acc-y', 'acc-z'] +#for i in range(3): + #if i==1: +# axs[0].plot(time, imu[:,i+1],'.-', label=lab_1[i]) +# axs[1].plot(time, imu[:,i+4],'.-', label=lab_2[i]) +#for i in range(2): + #axs[i].set_xlim(386,389) +# axs[i].grid() +# axs[i].legend() +#plt.grid() + +plt.show() diff --git a/Log/plot_imu.py b/Log/plot_imu.py new file mode 100755 index 0000000..0177273 --- /dev/null +++ b/Log/plot_imu.py @@ -0,0 +1,125 @@ +# import matplotlib +# matplotlib.use('Agg') +import numpy as np +import matplotlib.pyplot as plt + +#### Draw IMU data +fig, axs = plt.subplots(2) +imu=np.loadtxt('imu_pbp.txt') +time=imu[:,0] +axs[0].set_title('Gyroscope') +axs[1].set_title('Accelerameter') +lab_1 = ['gyr-x', 'gyr-y', 'gyr-z'] +lab_2 = ['acc-x', 'acc-y', 'acc-z'] +for i in range(3): + #if i==1: + axs[0].plot(time, imu[:,i+1],'.-', label=lab_1[i]) + axs[1].plot(time, imu[:,i+4],'.-', label=lab_2[i]) +for i in range(2): + #axs[i].set_xlim(386,389) + axs[i].grid() + axs[i].legend() +plt.grid() + +#fig, axs = plt.subplots(5) +#axs[0].set_title('miss') +#axs[1].set_title('miss') +#axs[2].set_title('miss') +#axs[3].set_title('miss') +#axs[4].set_title('miss') +#len_time1 = np.arange(0,1977) +#len_time2 = np.arange(1977, 3954) +#len_time3 = np.arange(3954,5931) +#len_time4 = np.arange(5931,7908) +#len_time5 = np.arange(7908,9885) + #if i==1: +#axs[0].plot(len_time1, time[0:1977],'.-', label='check') +#axs[1].plot(len_time2, time[1977:3954],'.-', label='check') +#axs[2].plot(len_time3, time[3954:5931],'.-', label='check') +#axs[3].plot(len_time4, time[5931:7908],'.-', label='check') +#axs[4].plot(len_time5, time[7908:9885],'.-', label='check') + #axs[i].set_xlim(386,389) +#axs[0].grid() +#axs[0].legend() +#axs[1].grid() +#axs[1].legend() +#axs[2].grid() +#axs[2].legend() +#axs[3].grid() +#axs[3].legend() +#axs[4].grid() +#axs[4].legend() +#plt.grid() + +#fig, axs = plt.subplots(5) +#axs[0].set_title('miss') +#axs[1].set_title('miss') +#axs[2].set_title('miss') +#axs[3].set_title('miss') +#axs[4].set_title('miss') +#len_time1 = np.arange(9885,9885+1977) +#len_time2 = np.arange(9885+1977,9885+3954) +#len_time3 = np.arange(9885+3954,9885+5931) +#len_time4 = np.arange(9885+5931,9885+7908) +#len_time5 = np.arange(9885+7908,9885+9885) + #if i==1: +#axs[0].plot(len_time1, time[9885+0:9885+1977],'.-', label='check') +#axs[1].plot(len_time2, time[9885+1977:9885+3954],'.-', label='check') +#axs[2].plot(len_time3, time[9885+3954:9885+5931],'.-', label='check') +#axs[3].plot(len_time4, time[9885+5931:9885+7908],'.-', label='check') +#axs[4].plot(len_time5, time[9885+7908:9885+9885],'.-', label='check') + #axs[i].set_xlim(386,389) +#axs[0].grid() +#axs[0].legend() +#axs[1].grid() +#axs[1].legend() +#axs[2].grid() +#axs[2].legend() +#axs[3].grid() +#axs[3].legend() +#axs[4].grid() +#axs[4].legend() +#plt.grid() + +# #### Draw time calculation +# plt.figure(3) +# fig = plt.figure() +# font1 = {'family' : 'Times New Roman', +# 'weight' : 'normal', +# 'size' : 12, +# } +# c="red" +# a_out1=np.loadtxt('Log/mat_out_time_indoor1.txt') +# a_out2=np.loadtxt('Log/mat_out_time_indoor2.txt') +# a_out3=np.loadtxt('Log/mat_out_time_outdoor.txt') +# # n = a_out[:,1].size +# # time_mean = a_out[:,1].mean() +# # time_se = a_out[:,1].std() / np.sqrt(n) +# # time_err = a_out[:,1] - time_mean +# # feat_mean = a_out[:,2].mean() +# # feat_err = a_out[:,2] - feat_mean +# # feat_se = a_out[:,2].std() / np.sqrt(n) +# ax1 = fig.add_subplot(111) +# ax1.set_ylabel('Effective Feature Numbers',font1) +# ax1.boxplot(a_out1[:,2], showfliers=False, positions=[0.9]) +# ax1.boxplot(a_out2[:,2], showfliers=False, positions=[1.9]) +# ax1.boxplot(a_out3[:,2], showfliers=False, positions=[2.9]) +# ax1.set_ylim([0, 3000]) + +# ax2 = ax1.twinx() +# ax2.spines['right'].set_color('red') +# ax2.set_ylabel('Compute Time (ms)',font1) +# ax2.yaxis.label.set_color('red') +# ax2.tick_params(axis='y', colors='red') +# ax2.boxplot(a_out1[:,1]*1000, showfliers=False, positions=[1.1],boxprops=dict(color=c),capprops=dict(color=c),whiskerprops=dict(color=c)) +# ax2.boxplot(a_out2[:,1]*1000, showfliers=False, positions=[2.1],boxprops=dict(color=c),capprops=dict(color=c),whiskerprops=dict(color=c)) +# ax2.boxplot(a_out3[:,1]*1000, showfliers=False, positions=[3.1],boxprops=dict(color=c),capprops=dict(color=c),whiskerprops=dict(color=c)) +# ax2.set_xlim([0.5, 3.5]) +# ax2.set_ylim([0, 100]) + +# plt.xticks([1,2,3], ('Outdoor Scene', 'Indoor Scene 1', 'Indoor Scene 2')) +# # # print(time_se) +# # # print(a_out3[:,2]) +# plt.grid() +# plt.savefig("time.pdf", dpi=1200) +plt.show() diff --git a/Log/plot_out.py b/Log/plot_out.py new file mode 100755 index 0000000..8dd80cb --- /dev/null +++ b/Log/plot_out.py @@ -0,0 +1,178 @@ +# import matplotlib +# matplotlib.use('Agg') +import numpy as np +import matplotlib.pyplot as plt + +# a_pre=np.loadtxt('mat_pre.txt') +a_out=np.loadtxt('mat_out.txt') +if((a_out.shape[1] != 19) & (a_out.shape[1] != 20)): + ######for ikfom + fig, axs = plt.subplots(4,2) + #lab_pre = ['', 'pre-x', 'pre-y', 'pre-z'] + lab_out = ['', 'out-x', 'out-y', 'out-z'] + plot_ind = range(7,10) + time=a_out[:,0] + axs[0,0].set_title('Attitude') + axs[1,0].set_title('Translation') + axs[2,0].set_title('Velocity') + axs[3,0].set_title('Angular velocity') + axs[0,1].set_title('Acceleration') + axs[1,1].set_title('Gravity') + axs[2,1].set_title('bg') + axs[3,1].set_title('ba') + for i in range(1,4): + for j in range(8): + #axs[j%4, j//4].plot(time, a_pre[:,i+j*3],'.-', label=lab_pre[i]) + axs[j%4, j//4].plot(time, a_out[:,i+j*3],'.-', label=lab_out[i]) + for j in range(8): + # axs[j].set_xlim(386,389) + axs[j%4, j//4].grid() + axs[j%4, j//4].legend() + plt.grid() + ######for ikfom####### +else: + #######for normal####### + fig, axs = plt.subplots(3,2) + lab_pre = ['', 'pre-x', 'pre-y', 'pre-z'] + lab_out = ['', 'out-x', 'out-y', 'out-z'] + plot_ind = range(7,10) + time=a_out[:,0] + time1 = a_pre[:,0] + axs[0,0].set_title('Attitude') + axs[1,0].set_title('Translation') + axs[2,0].set_title('Velocity') + axs[0,1].set_title('bg') + axs[1,1].set_title('ba') + axs[2,1].set_title('Gravity') + for i in range(1,4): + for j in range(6): + axs[j%3, j/3].plot(time1, a_pre[:,i+j*3],'.-', label=lab_pre[i]) + axs[j%3, j/3].plot(time, a_out[:,i+j*3],'.-', label=lab_out[i]) + for j in range(6): + # axs[j].set_xlim(386,389) + axs[j%3, j//3].grid() + axs[j%3, j//3].legend() + plt.grid() + #######for normal####### + + +#### Draw IMU data +fig, axs = plt.subplots(2) +imu=np.loadtxt('imu_pbp.txt') +time=imu[:,0] +axs[0].set_title('Gyroscope') +axs[1].set_title('Accelerameter') +lab_1 = ['gyr-x', 'gyr-y', 'gyr-z'] +lab_2 = ['acc-x', 'acc-y', 'acc-z'] +for i in range(3): + #if i==1: + axs[0].plot(time, imu[:,i+1],'.-', label=lab_1[i]) + axs[1].plot(time, imu[:,i+4],'.-', label=lab_2[i]) +for i in range(2): + #axs[i].set_xlim(386,389) + axs[i].grid() + axs[i].legend() +plt.grid() + +#fig, axs = plt.subplots(5) +#axs[0].set_title('miss') +#axs[1].set_title('miss') +#axs[2].set_title('miss') +#axs[3].set_title('miss') +#axs[4].set_title('miss') +#len_time1 = np.arange(0,1977) +#len_time2 = np.arange(1977, 3954) +#len_time3 = np.arange(3954,5931) +#len_time4 = np.arange(5931,7908) +#len_time5 = np.arange(7908,9885) + #if i==1: +#axs[0].plot(len_time1, time[0:1977],'.-', label='check') +#axs[1].plot(len_time2, time[1977:3954],'.-', label='check') +#axs[2].plot(len_time3, time[3954:5931],'.-', label='check') +#axs[3].plot(len_time4, time[5931:7908],'.-', label='check') +#axs[4].plot(len_time5, time[7908:9885],'.-', label='check') + #axs[i].set_xlim(386,389) +#axs[0].grid() +#axs[0].legend() +#axs[1].grid() +#axs[1].legend() +#axs[2].grid() +#axs[2].legend() +#axs[3].grid() +#axs[3].legend() +#axs[4].grid() +#axs[4].legend() +#plt.grid() + +#fig, axs = plt.subplots(5) +#axs[0].set_title('miss') +#axs[1].set_title('miss') +#axs[2].set_title('miss') +#axs[3].set_title('miss') +#axs[4].set_title('miss') +#len_time1 = np.arange(9885,9885+1977) +#len_time2 = np.arange(9885+1977,9885+3954) +#len_time3 = np.arange(9885+3954,9885+5931) +#len_time4 = np.arange(9885+5931,9885+7908) +#len_time5 = np.arange(9885+7908,9885+9885) + #if i==1: +#axs[0].plot(len_time1, time[9885+0:9885+1977],'.-', label='check') +#axs[1].plot(len_time2, time[9885+1977:9885+3954],'.-', label='check') +#axs[2].plot(len_time3, time[9885+3954:9885+5931],'.-', label='check') +#axs[3].plot(len_time4, time[9885+5931:9885+7908],'.-', label='check') +#axs[4].plot(len_time5, time[9885+7908:9885+9885],'.-', label='check') + #axs[i].set_xlim(386,389) +#axs[0].grid() +#axs[0].legend() +#axs[1].grid() +#axs[1].legend() +#axs[2].grid() +#axs[2].legend() +#axs[3].grid() +#axs[3].legend() +#axs[4].grid() +#axs[4].legend() +#plt.grid() + +# #### Draw time calculation +# plt.figure(3) +# fig = plt.figure() +# font1 = {'family' : 'Times New Roman', +# 'weight' : 'normal', +# 'size' : 12, +# } +# c="red" +# a_out1=np.loadtxt('Log/mat_out_time_indoor1.txt') +# a_out2=np.loadtxt('Log/mat_out_time_indoor2.txt') +# a_out3=np.loadtxt('Log/mat_out_time_outdoor.txt') +# # n = a_out[:,1].size +# # time_mean = a_out[:,1].mean() +# # time_se = a_out[:,1].std() / np.sqrt(n) +# # time_err = a_out[:,1] - time_mean +# # feat_mean = a_out[:,2].mean() +# # feat_err = a_out[:,2] - feat_mean +# # feat_se = a_out[:,2].std() / np.sqrt(n) +# ax1 = fig.add_subplot(111) +# ax1.set_ylabel('Effective Feature Numbers',font1) +# ax1.boxplot(a_out1[:,2], showfliers=False, positions=[0.9]) +# ax1.boxplot(a_out2[:,2], showfliers=False, positions=[1.9]) +# ax1.boxplot(a_out3[:,2], showfliers=False, positions=[2.9]) +# ax1.set_ylim([0, 3000]) + +# ax2 = ax1.twinx() +# ax2.spines['right'].set_color('red') +# ax2.set_ylabel('Compute Time (ms)',font1) +# ax2.yaxis.label.set_color('red') +# ax2.tick_params(axis='y', colors='red') +# ax2.boxplot(a_out1[:,1]*1000, showfliers=False, positions=[1.1],boxprops=dict(color=c),capprops=dict(color=c),whiskerprops=dict(color=c)) +# ax2.boxplot(a_out2[:,1]*1000, showfliers=False, positions=[2.1],boxprops=dict(color=c),capprops=dict(color=c),whiskerprops=dict(color=c)) +# ax2.boxplot(a_out3[:,1]*1000, showfliers=False, positions=[3.1],boxprops=dict(color=c),capprops=dict(color=c),whiskerprops=dict(color=c)) +# ax2.set_xlim([0.5, 3.5]) +# ax2.set_ylim([0, 100]) + +# plt.xticks([1,2,3], ('Outdoor Scene', 'Indoor Scene 1', 'Indoor Scene 2')) +# # # print(time_se) +# # # print(a_out3[:,2]) +# plt.grid() +# plt.savefig("time.pdf", dpi=1200) +plt.show() diff --git a/Log/plot_rtk.py b/Log/plot_rtk.py new file mode 100755 index 0000000..a08e122 --- /dev/null +++ b/Log/plot_rtk.py @@ -0,0 +1,38 @@ +import numpy as np +import matplotlib.pyplot as plt + +a_grdt=np.loadtxt('pos_rtk.txt') +a_out=np.loadtxt('mat_out.txt') +#######for normal####### +fig, axs = plt.subplots(3,1) +lab_grdt = ['', 'gt-x', 'gt-y', 'gt-z'] +lab_out = ['', 'out-x', 'out-y', 'out-z'] +plot_ind = range(7,10) +time=a_out[:,0] +time1 = a_grdt[:,0] +axs[0].set_title('East [m]') +axs[1].set_title('North [m]') +axs[2].set_title('Up [m]') +for i in range(1,4): + axs[i-1].plot(time1, a_grdt[:,i],'.-', label=lab_grdt[i]) + axs[i-1].plot(time, a_out[:,i+3],'.-', label=lab_out[i]) +for j in range(1,4): + axs[j-1].grid() + axs[j-1].legend() +plt.grid() +#######for normal####### + +fig, axs = plt.subplots(2,1) +axs[0].set_title('clock drift') +lab_1 = ['dt-g', 'dt-r', 'dt-e', 'dt-c'] +for i in range(3): + #if i==1: + axs[0].plot(time, a_out[:,i+13],'.-', label=lab_1[i]) +axs[0].plot(time, a_out[:,19],'.-', label=lab_1[3]) +for i in range(1): + #axs[i].set_xlim(386,389) + axs[i].grid() + axs[i].legend() +plt.grid() + +plt.show() diff --git a/Log/pos_log.txt b/Log/pos_log.txt new file mode 100644 index 0000000..e69de29 diff --git a/Log/pos_rtk.txt b/Log/pos_rtk.txt new file mode 100644 index 0000000..74e0dbd --- /dev/null +++ b/Log/pos_rtk.txt @@ -0,0 +1,13978 @@ + 0 0 0 0 + 0.0999999 0.0102959 -0.0221475 -0.048 + 0.2 0.0308878 -0.0332213 -0.064 + 0.3 0.0308878 -0.0221475 -0.079 + 0.4 0.0617756 -0.0332213 -0.134 + 0.5 0.0617756 -0.0664426 -0.1 + 0.6 0.0720715 -0.0775163 -0.11 + 0.7 0.0617756 -0.0775163 -0.079 + 0.8 0.0823674 -0.0996639 -0.076 + 0.9 0.0823674 -0.0996639 -0.139 + 1 0.0926633 -0.0996639 -0.136 + 1.1 0.0926633 -0.0996639 -0.135 + 1.2 0.0823674 -0.0996639 -0.136 + 1.3 0.0823674 -0.110738 -0.155 + 1.4 0.0720715 -0.121811 -0.118 + 1.5 0.0617756 -0.121811 -0.109 + 1.6 0.0720715 -0.132885 -0.112 + 1.7 0.0720715 -0.166106 -0.065 + 1.8 0.0411837 -0.166106 -0.023 + 1.9 0.0617756 -0.166106 -0.054 + 2 0.0720715 -0.188254 -0.047 + 2.1 0.0720715 -0.188254 -0.062 + 2.2 0.0823674 -0.199328 -0.07 + 2.3 0.0720715 -0.17718 -0.107 + 2.4 0.0617756 -0.17718 -0.104 + 2.5 0.0926633 -0.188254 -0.146 + 2.6 0.133847 -0.17718 -0.24 + 2.7 0.144143 -0.166106 -0.303 + 2.8 0.144143 -0.166106 -0.262 + 2.9 0.154439 -0.166106 -0.32 + 3 0.185327 -0.199328 -0.301 + 3.1 0.175031 -0.188254 -0.321 + 3.2 0.205919 -0.221475 -0.328 + 3.3 0.195623 -0.221475 -0.302 + 3.4 0.175031 -0.232549 -0.248 + 3.5 0.236806 -0.221475 -0.425 + 3.6 0.22651 -0.232549 -0.373 + 3.7 0.247102 -0.254697 -0.364 + 3.8 0.257398 -0.243623 -0.404 + 3.9 0.267694 -0.26577 -0.397 + 4 0.267694 -0.254697 -0.473 + 4.1 0.308878 -0.276844 -0.482 + 4.2 0.308878 -0.26577 -0.523 + 4.3 0.350061 -0.26577 -0.604 + 4.4 0.360357 -0.276844 -0.634 + 4.5 0.370653 -0.254697 -0.691 + 4.6 0.463317 -0.254696 -0.866 + 4.7 0.5045 -0.232549 -0.957 + 4.8 0.5045 -0.210401 -1.049 + 4.9 0.535388 -0.221475 -1.112 + 5 0.576572 -0.210401 -1.158 + 5.1 0.60746 -0.243623 -1.19 + 5.2 0.617756 -0.243623 -1.196 + 5.3 0.638347 -0.243623 -1.263 + 5.4 0.648643 -0.26577 -1.266 + 5.5 0.669235 -0.310065 -1.233 + 5.6 0.689827 -0.298992 -1.308 + 5.7 0.720715 -0.321139 -1.317 + 5.8 0.700123 -0.321139 -1.294 + 5.9 0.741307 -0.332213 -1.371 + 6 0.803082 -0.310065 -1.512 + 6.1 0.803082 -0.321139 -1.495 + 6.2 0.823674 -0.321139 -1.578 + 6.3 0.854562 -0.343287 -1.596 + 6.4 0.895745 -0.321139 -1.699 + 6.5 0.906041 -0.343287 -1.715 + 6.6 0.947225 -0.321139 -1.851 + 6.7 0.967817 -0.310065 -1.906 + 6.8 1.0193 -0.321139 -1.962 + 6.9 1.05018 -0.310065 -2.08 + 7 1.05018 -0.321139 -2.045 + 7.1 1.08107 -0.321139 -2.094 + 7.2 1.10166 -0.332213 -2.124 + 7.3 1.12226 -0.321139 -2.211 + 7.4 1.16344 -0.332213 -2.262 + 7.5 1.17374 -0.321139 -2.305 + 7.6 1.20462 -0.321139 -2.367 + 7.7 1.2561 -0.298991 -2.513 + 7.8 1.24581 -0.310065 -2.49 + 7.9 1.29729 -0.321139 -2.549 + 8 1.30758 -0.310065 -2.592 + 8.1 1.32817 -0.310065 -2.647 + 8.2 1.36936 -0.321139 -2.705 + 8.3 1.35906 -0.310065 -2.695 + 8.4 1.37965 -0.321139 -2.706 + 8.5 1.43113 -0.310065 -2.843 + 8.6 1.44143 -0.310065 -2.887 + 8.7 1.45173 -0.321139 -2.882 + 8.8 1.49291 -0.310065 -2.981 + 8.9 1.47232 -0.298991 -2.977 + 9 1.5135 -0.321139 -3.028 + 9.1 1.5135 -0.310065 -3.043 + 9.2 1.57528 -0.321139 -3.164 + 9.3 1.58557 -0.321139 -3.19 + 9.4 1.59587 -0.298991 -3.216 + 9.5 1.62676 -0.310065 -3.277 + 9.6 1.64735 -0.298991 -3.352 + 9.7 1.66794 -0.287918 -3.411 + 9.8 1.68853 -0.298991 -3.418 + 9.9 1.69883 -0.287918 -3.441 + 10 1.71942 -0.298991 -3.491 + 10.1 1.74001 -0.298991 -3.534 + 10.2 1.72971 -0.287918 -3.56 + 10.3 1.75031 -0.298991 -3.534 + 10.4 1.75031 -0.287918 -3.559 + 10.5 1.79149 -0.298991 -3.622 + 10.6 1.78119 -0.298991 -3.625 + 10.7 1.82238 -0.298991 -3.695 + 10.8 1.83267 -0.298991 -3.724 + 10.9 1.86356 -0.298991 -3.764 + 11 1.84297 -0.298991 -3.752 + 11.1 1.86356 -0.298991 -3.798 + 11.2 1.87386 -0.298991 -3.815 + 11.3 1.89445 -0.310065 -3.838 + 11.4 1.90475 -0.310065 -3.85 + 11.5 1.91504 -0.298991 -3.882 + 11.6 1.92534 -0.321139 -3.917 + 11.7 1.91504 -0.310065 -3.891 + 11.8 1.95622 -0.321139 -3.958 + 11.9 1.95623 -0.321139 -3.937 + 12 1.94593 -0.321139 -3.951 + 12.1 1.99741 -0.310065 -4.044 + 12.2 1.99741 -0.321139 -4.057 + 12.3 2.03859 -0.332213 -4.124 + 12.4 2.018 -0.321139 -4.095 + 12.5 2.03859 -0.343286 -4.098 + 12.6 2.0283 -0.343286 -4.085 + 12.7 2.04889 -0.343286 -4.115 + 12.8 2.05918 -0.343286 -4.145 + 12.9 2.03859 -0.343286 -4.117 + 13 2.07978 -0.343286 -4.184 + 13.1 2.06948 -0.35436 -4.186 + 13.2 2.07978 -0.343286 -4.2 + 13.3 2.10037 -0.343286 -4.233 + 13.4 2.11066 -0.35436 -4.247 + 13.5 2.11066 -0.35436 -4.25 + 13.6 2.12096 -0.343286 -4.298 + 13.7 2.18274 -0.310065 -4.496 + 13.8 2.23421 -0.26577 -4.719 + 13.9 2.32688 -0.221475 -4.983 + 14 2.36806 -0.166106 -5.182 + 14.1 2.41954 -0.143959 -5.385 + 14.2 2.47102 -0.0996636 -5.585 + 14.3 2.54309 -0.0553686 -5.805 + 14.4 2.57398 -0.0110735 -6.004 + 14.5 2.64605 0.0332215 -6.237 + 14.6 2.68723 0.0664427 -6.419 + 14.7 2.73871 0.110738 -6.637 + 14.8 2.87256 0.221475 -7.15 + 14.9 2.97552 0.310065 -7.613 + 15 3.12996 0.420803 -8.151 + 15.1 3.25351 0.53154 -8.654 + 15.2 3.35647 0.631204 -9.121 + 15.3 3.48002 0.719794 -9.567 + 15.4 3.61386 0.819458 -10.081 + 15.5 3.69623 0.919121 -10.488 + 15.6 3.81978 1.00771 -10.961 + 15.7 3.95363 1.11845 -11.464 + 15.8 4.04629 1.20704 -11.875 + 15.9 4.14925 1.29563 -12.308 + 16 4.2625 1.39529 -12.764 + 16.1 4.37576 1.48388 -13.18 + 16.2 4.46842 1.57247 -13.622 + 16.3 4.57138 1.66106 -14.024 + 16.4 4.68464 1.74965 -14.468 + 16.5 4.7773 1.82717 -14.86 + 16.6 4.86996 1.91576 -15.249 + 16.7 4.97292 2.00435 -15.67 + 16.8 5.04499 2.10401 -16.068 + 16.9 5.15825 2.17045 -16.468 + 17 5.25091 2.2369 -16.814 + 17.1 5.33328 2.31441 -17.178 + 17.2 5.43623 2.403 -17.562 + 17.3 5.53919 2.48052 -17.965 + 17.4 5.64215 2.56911 -18.377 + 17.5 5.69363 2.63555 -18.676 + 17.6 5.80688 2.71306 -19.075 + 17.7 5.92014 3.67648 -21.675 + 17.8 5.83777 3.59896 -21.431 + 17.9 5.7657 3.4993 -21.194 + 18 5.67304 3.42178 -20.93 + 18.1 5.61126 3.33319 -20.751 + 18.2 5.54949 3.26675 -20.555 + 18.3 5.44653 3.21138 -20.347 + 18.4 5.38475 3.14494 -20.189 + 18.5 5.31268 3.05635 -19.932 + 18.6 5.23031 2.95669 -19.671 + 18.7 5.48771 4.09728 -22.768 + 18.8 5.58037 4.1305 -22.978 + 18.9 5.67303 4.19694 -23.241 + 19 5.7657 4.28553 -23.535 + 19.1 5.86865 4.38519 -23.897 + 19.2 5.94073 4.45164 -24.189 + 19.3 6.03339 4.51808 -24.453 + 19.4 6.12605 4.58452 -24.728 + 19.5 6.19812 4.65096 -24.98 + 19.6 6.30108 4.72848 -25.297 + 19.7 6.38345 4.78385 -25.522 + 19.8 6.45552 4.82814 -25.709 + 19.9 6.53789 4.90566 -26.004 + 20 6.62025 4.96103 -26.24 + 20.1 6.71291 5.01639 -26.475 + 20.2 6.78499 5.08284 -26.697 + 20.3 6.87765 5.13821 -26.976 + 20.4 6.93942 5.19357 -27.165 + 20.5 7.03209 5.24894 -27.437 + 20.6 7.12475 5.30431 -27.691 + 20.7 7.18652 5.35968 -27.908 + 20.8 7.26889 5.4372 -28.143 + 20.9 7.34096 5.50364 -28.403 + 21 7.40274 5.50364 -28.483 + 21.1 7.4851 5.6033 -28.82 + 21.2 7.56747 5.65867 -29.061 + 21.3 7.62924 5.68082 -29.229 + 21.4 7.71161 5.75833 -29.44 + 21.5 7.80427 5.80263 -29.707 + 21.6 7.83516 5.86907 -29.908 + 21.7 7.92782 5.94658 -30.175 + 21.8 7.99989 6.0241 -30.482 + 21.9 8.11315 6.06839 -30.696 + 22 8.16463 6.09054 -30.8 + 22.1 8.21611 6.14591 -31.03 + 22.2 8.28818 6.20128 -31.248 + 22.3 8.38084 6.25665 -31.489 + 22.4 8.42202 6.31202 -31.677 + 22.5 8.49409 6.35631 -31.826 + 22.6 8.54557 6.4006 -32.037 + 22.7 8.61764 6.43383 -32.212 + 22.8 8.67942 6.50027 -32.394 + 22.9 8.76179 6.54456 -32.647 + 23 8.83386 6.611 -32.868 + 23.1 8.89563 6.6553 -33.065 + 23.2 8.9677 6.72174 -33.333 + 23.3 9.02948 6.77711 -33.513 + 23.4 9.12214 6.83248 -33.784 + 23.5 9.18391 6.87677 -33.972 + 23.6 9.27658 6.93214 -34.207 + 23.7 9.32806 7.00966 -34.466 + 23.8 9.41042 7.05395 -34.688 + 23.9 9.45161 7.10932 -34.883 + 24 9.54427 7.16469 -35.099 + 24.1 9.60604 7.20898 -35.3 + 24.2 9.65752 7.23113 -35.443 + 24.3 9.75018 7.27542 -35.663 + 24.4 9.82225 7.33079 -35.904 + 24.5 9.91492 7.38616 -36.165 + 24.6 9.97669 7.43046 -36.355 + 24.7 10.0488 7.4969 -36.612 + 24.8 10.4812 7.75159 -38.024 + 24.9 10.8827 8.05058 -39.481 + 25 11.1813 8.30527 -40.612 + 25.1 11.3563 8.41601 -41.209 + 25.2 11.5108 8.5046 -41.66 + 25.3 11.6343 8.61533 -42.088 + 25.4 11.7785 8.70392 -42.495 + 25.5 11.9329 8.80359 -43.022 + 25.6 12.0873 8.91432 -43.573 + 25.7 12.3138 9.04721 -44.276 + 25.8 12.4889 9.16902 -44.856 + 25.9 12.6536 9.29083 -45.42 + 26 12.8183 9.39049 -45.933 + 26.1 12.9522 9.45693 -46.307 + 26.2 12.9934 9.49015 -46.415 + 26.3 13.0037 9.49015 -46.39 + 26.4 13.0551 9.49015 -46.466 + 26.5 13.086 9.47908 -46.446 + 26.6 13.1272 9.47908 -46.466 + 26.7 13.1272 9.44586 -46.369 + 26.8 13.0242 9.31297 -45.77 + 26.9 12.8595 9.12472 -44.984 + 27 12.6845 8.94754 -44.165 + 27.1 12.4374 8.73714 -43.11 + 27.2 12.1182 8.44923 -41.792 + 27.3 11.8093 8.12809 -40.336 + 27.4 11.5005 7.82911 -38.96 + 27.5 11.274 7.58549 -37.915 + 27.6 11.0475 7.36401 -36.908 + 27.7 10.8724 7.19791 -36.124 + 27.8 10.7283 7.0318 -35.401 + 27.9 10.5842 6.88785 -34.738 + 28 10.4709 6.69959 -34.012 + 28.1 10.3473 6.54456 -33.381 + 28.2 10.2238 6.40061 -32.717 + 28.3 10.1311 6.31202 -32.34 + 28.4 10.0488 6.13484 -31.729 + 28.5 9.9664 6.03517 -31.281 + 28.6 9.89433 5.99088 -30.994 + 28.7 9.7399 5.82477 -30.296 + 28.8 9.61635 5.75833 -29.811 + 28.9 9.46191 5.6033 -29.123 + 29 9.28688 5.44827 -28.336 + 29.1 9.12215 5.31539 -27.629 + 29.2 8.94712 5.10499 -26.772 + 29.3 8.80298 4.94995 -26.107 + 29.4 8.65884 4.83922 -25.487 + 29.5 8.47351 4.70633 -24.769 + 29.6 8.30878 4.5513 -24.033 + 29.7 8.14405 4.41842 -23.39 + 29.8 8.03079 4.24124 -22.724 + 29.9 7.91754 4.14157 -22.201 + 30 7.82488 4.06406 -21.818 + 30.1 7.7734 4.01976 -21.577 + 30.2 7.70133 3.98654 -21.243 + 30.3 7.55718 3.85366 -20.661 + 30.4 7.42334 3.754 -20.124 + 30.5 7.23801 3.62111 -19.411 + 30.6 7.11446 3.4993 -18.838 + 30.7 6.98062 3.39964 -18.331 + 30.8 6.82618 3.26675 -17.657 + 30.9 6.68204 3.11172 -16.912 + 31 6.5379 3.00098 -16.378 + 31.1 6.41435 2.91239 -15.866 + 31.2 6.30109 2.80166 -15.311 + 31.3 6.17754 2.69092 -14.818 + 31.4 6.09517 2.62448 -14.409 + 31.5 5.98192 2.52481 -13.934 + 31.6 5.88926 2.42515 -13.45 + 31.7 5.81719 2.36978 -13.108 + 31.8 5.70393 2.29227 -12.712 + 31.9 5.64216 2.1926 -12.308 + 32 5.55979 2.11509 -11.965 + 32.1 5.48772 2.05972 -11.605 + 32.2 5.39506 1.97113 -11.224 + 32.3 5.33328 1.92683 -10.947 + 32.4 5.2921 1.84932 -10.643 + 32.5 5.27151 1.79395 -10.474 + 32.6 5.24062 1.76073 -10.27 + 32.7 5.17884 1.72751 -10.039 + 32.8 5.12736 1.68321 -9.817 + 32.9 5.09648 1.62784 -9.616 + 33 5.08618 1.60569 -9.5 + 33.1 5.06559 1.59462 -9.399 + 33.2 5.05529 1.59462 -9.337 + 33.3 5.05529 1.59462 -9.326 + 33.4 5.0347 1.5614 -9.176 + 33.5 5.0244 1.55033 -9.123 + 33.6 4.97293 1.5171 -8.934 + 33.7 4.92145 1.49496 -8.751 + 33.8 4.88026 1.47281 -8.594 + 33.9 4.82878 1.43959 -8.388 + 34 4.7876 1.40637 -8.182 + 34.1 4.73612 1.36207 -7.957 + 34.2 4.69494 1.31778 -7.733 + 34.3 4.64346 1.29563 -7.558 + 34.4 4.59198 1.26241 -7.359 + 34.5 4.5405 1.22919 -7.162 + 34.6 4.50961 1.22919 -7.075 + 34.7 4.48902 1.19597 -6.953 + 34.8 4.46843 1.18489 -6.839 + 34.9 4.43754 1.16274 -6.71 + 35 4.43754 1.15167 -6.647 + 35.1 4.41695 1.12952 -6.535 + 35.2 4.38606 1.10738 -6.398 + 35.3 4.33458 1.06308 -6.213 + 35.4 4.33458 1.06308 -6.141 + 35.5 4.31399 1.04093 -6.046 + 35.6 4.2831 1.00771 -5.915 + 35.7 4.26251 1.00771 -5.838 + 35.8 4.25221 0.985565 -5.732 + 35.9 4.22133 0.996638 -5.69 + 36 4.21103 0.996638 -5.678 + 36.1 4.21103 0.974491 -5.539 + 36.2 4.19044 0.974491 -5.515 + 36.3 4.16985 0.963417 -5.442 + 36.4 4.15955 0.930196 -5.3 + 36.5 4.13896 0.919122 -5.221 + 36.6 4.11837 0.908048 -5.145 + 36.7 4.10807 0.896975 -5.069 + 36.8 3.43884 0.210402 -2.06 + 36.9 3.26381 0.0442954 -1.282 + 37 3.20203 -0.0110734 -1 + 37.1 3.16085 -0.0553685 -0.788001 + 37.2 3.11967 -0.110737 -0.585001 + 37.3 3.08878 -0.132885 -0.453001 + 37.4 3.05789 -0.155032 -0.321001 + 37.5 3.05789 -0.17718 -0.221001 + 37.6 3.01671 -0.199327 -0.0970007 + 37.7 3.00641 -0.232549 0.0249993 + 37.8 2.97552 -0.254696 0.132999 + 37.9 2.96523 -0.276844 0.223999 + 38 2.95493 -0.287918 0.322999 + 38.1 2.94464 -0.287918 0.317999 + 38.2 2.97552 -0.287918 0.310999 + 38.3 2.97552 -0.276844 0.276999 + 38.4 2.98582 -0.26577 0.251999 + 38.5 3.01671 -0.26577 0.204999 + 38.6 3.027 -0.243622 0.172999 + 38.7 3.0373 -0.232549 0.109999 + 38.8 3.07848 -0.221475 0.0469993 + 38.9 3.09907 -0.210401 -0.0200008 + 39 3.11967 -0.188254 -0.113001 + 39.1 3.14026 -0.166106 -0.196001 + 39.2 3.17115 -0.132885 -0.276001 + 39.3 3.20203 -0.132885 -0.341001 + 39.4 3.22263 -0.121811 -0.371001 + 39.5 3.23292 -0.110737 -0.442001 + 39.6 3.25351 -0.0885898 -0.487001 + 39.7 3.2741 -0.0885897 -0.499001 + 39.8 3.2844 -0.0885897 -0.522001 + 39.9 3.2947 -0.077516 -0.514001 + 40 3.2947 -0.0996635 -0.489001 + 40.1 3.30499 -0.0885897 -0.483001 + 40.2 3.2947 -0.0996635 -0.445001 + 40.3 3.2947 -0.0996635 -0.419001 + 40.4 3.30499 -0.110737 -0.399001 + 40.5 3.30499 -0.110737 -0.380001 + 40.6 3.31529 -0.132885 -0.349001 + 40.7 3.30499 -0.121811 -0.313001 + 40.8 3.30499 -0.132885 -0.286001 + 40.9 3.31529 -0.143959 -0.264001 + 41 3.31529 -0.155032 -0.246001 + 41.1 3.31529 -0.155032 -0.215001 + 41.2 3.31529 -0.166106 -0.186001 + 41.3 3.32558 -0.166106 -0.168001 + 41.4 3.31529 -0.17718 -0.112001 + 41.5 3.32558 -0.188254 -0.0690009 + 41.6 3.31529 -0.188254 -0.0660009 + 41.7 3.31529 -0.188254 -0.0360009 + 41.8 3.32558 -0.210401 -0.0120009 + 41.9 3.32558 -0.199327 -8.69204e-07 + 42 3.32558 -0.210401 0.0249991 + 42.1 3.33588 -0.210401 0.0229991 + 42.2 3.33588 -0.210401 0.0479991 + 42.3 3.34618 -0.221475 0.0579991 + 42.4 3.34618 -0.221475 0.0719991 + 42.5 3.34618 -0.221475 0.0989991 + 42.6 3.34618 -0.232549 0.108999 + 42.7 3.33588 -0.221475 0.134999 + 42.8 3.34618 -0.232549 0.124999 + 42.9 3.35647 -0.243622 0.144999 + 43 3.35647 -0.243622 0.179999 + 43.1 3.34618 -0.243622 0.179999 + 43.2 3.36677 -0.254696 0.187999 + 43.3 3.35647 -0.243622 0.229999 + 43.4 3.36677 -0.26577 0.223999 + 43.5 3.36677 -0.26577 0.227999 + 43.6 3.37706 -0.26577 0.256999 + 43.7 3.36677 -0.26577 0.264999 + 43.8 3.37706 -0.26577 0.289999 + 43.9 3.37706 -0.276844 0.282999 + 44 3.38736 -0.276844 0.312999 + 44.1 3.37706 -0.276844 0.321999 + 44.2 3.37706 -0.276844 0.330999 + 44.3 3.38736 -0.276844 0.335999 + 44.4 3.38736 -0.298991 0.356999 + 44.5 3.38736 -0.287917 0.365999 + 44.6 3.39766 -0.287917 0.392999 + 44.7 3.38736 -0.287917 0.364999 + 44.8 3.38736 -0.287917 0.429999 + 44.9 3.37706 -0.298991 0.484999 + 45 3.35647 -0.310065 0.551999 + 45.1 3.33588 -0.310065 0.614999 + 45.2 3.32558 -0.321139 0.687999 + 45.3 3.2947 -0.332213 0.754999 + 45.4 3.2844 -0.343286 0.815999 + 45.5 3.25351 -0.35436 0.904999 + 45.6 3.24322 -0.365434 0.959999 + 45.7 3.21233 -0.365434 1.039 + 45.8 3.17115 -0.376508 1.161 + 45.9 3.12996 -0.387581 1.28 + 46 3.08878 -0.398655 1.385 + 46.1 3.05789 -0.398655 1.499 + 46.2 3.01671 -0.409729 1.598 + 46.3 2.96523 -0.420803 1.683 + 46.4 2.94464 -0.420803 1.795 + 46.5 2.90345 -0.420803 1.86 + 46.6 2.87256 -0.431877 1.956 + 46.7 2.84168 -0.431877 2.033 + 46.8 2.81079 -0.431877 2.106 + 46.9 2.7799 -0.44295 2.187 + 47 2.74901 -0.44295 2.266 + 47.1 2.71813 -0.44295 2.332 + 47.2 2.69753 -0.44295 2.384 + 47.3 2.66665 -0.44295 2.467 + 47.4 2.64605 -0.44295 2.514 + 47.5 2.61517 -0.44295 2.579 + 47.6 2.58428 -0.44295 2.637 + 47.7 2.55339 -0.44295 2.701 + 47.8 2.5328 -0.44295 2.736 + 47.9 2.51221 -0.44295 2.799 + 48 2.49162 -0.442951 2.849 + 48.1 2.46073 -0.442951 2.892 + 48.2 2.44014 -0.442951 2.954 + 48.3 2.41954 -0.442951 2.984 + 48.4 2.39895 -0.431877 3.039 + 48.5 2.37836 -0.431877 3.084 + 48.6 2.35777 -0.442951 3.124 + 48.7 2.34747 -0.431877 3.17 + 48.8 2.32688 -0.431877 3.199 + 48.9 2.30629 -0.431877 3.248 + 49 2.2857 -0.431877 3.297 + 49.1 2.26511 -0.431877 3.319 + 49.2 2.25481 -0.420803 3.361 + 49.3 2.22392 -0.420803 3.399 + 49.4 2.21363 -0.420803 3.435 + 49.5 2.20333 -0.420803 3.474 + 49.6 2.18274 -0.420803 3.508 + 49.7 2.16215 -0.409729 3.534 + 49.8 2.15185 -0.409729 3.551 + 49.9 2.13126 -0.409729 3.595 + 50 2.12096 -0.409729 3.633 + 50.1 2.11067 -0.409729 3.664 + 50.2 2.10037 -0.398656 3.679 + 50.3 2.07978 -0.398656 3.697 + 50.4 2.06948 -0.398656 3.739 + 50.5 2.05919 -0.398656 3.747 + 50.6 2.04889 -0.398656 3.779 + 50.7 2.03859 -0.398656 3.796 + 50.8 2.0283 -0.398656 3.827 + 50.9 2.018 -0.387582 3.85 + 51 2.00771 -0.387582 3.873 + 51.1 1.98712 -0.387582 3.892 + 51.2 1.98712 -0.387582 3.921 + 51.3 1.97682 -0.387582 3.94 + 51.4 1.96652 -0.387582 3.952 + 51.5 1.95623 -0.387582 3.988 + 51.6 1.94593 -0.376508 4.004 + 51.7 1.93564 -0.376508 4.028 + 51.8 1.92534 -0.376508 4.041 + 51.9 1.91504 -0.376508 4.06 + 52 1.90475 -0.376508 4.089 + 52.1 1.89445 -0.365434 4.09 + 52.2 1.88416 -0.365434 4.122 + 52.3 1.88416 -0.365434 4.135 + 52.4 1.86356 -0.365434 4.142 + 52.5 1.86356 -0.354361 4.193 + 52.6 1.85327 -0.354361 4.202 + 52.7 1.84297 -0.354361 4.199 + 52.8 1.83268 -0.343287 4.227 + 52.9 1.83268 -0.343287 4.233 + 53 1.82238 -0.343287 4.249 + 53.1 1.81208 -0.343287 4.264 + 53.2 1.80179 -0.343287 4.289 + 53.3 1.79149 -0.343287 4.297 + 53.4 1.79149 -0.332213 4.327 + 53.5 1.7812 -0.332213 4.341 + 53.6 1.7812 -0.332213 4.338 + 53.7 1.7709 -0.332213 4.368 + 53.8 1.7606 -0.321139 4.385 + 53.9 1.75031 -0.321139 4.391 + 54 1.74001 -0.321139 4.411 + 54.1 1.74001 -0.321139 4.424 + 54.2 1.72972 -0.321139 4.43 + 54.3 1.72972 -0.321139 4.453 + 54.4 1.71942 -0.310065 4.464 + 54.5 1.70913 -0.310065 4.482 + 54.6 1.69883 -0.310065 4.503 + 54.7 1.69883 -0.310065 4.507 + 54.8 1.68853 -0.298992 4.529 + 54.9 1.68853 -0.298992 4.546 + 55 1.67824 -0.298992 4.559 + 55.1 1.67824 -0.298992 4.559 + 55.2 1.66794 -0.298992 4.572 + 55.3 1.65765 -0.298992 4.588 + 55.4 1.64735 -0.287918 4.601 + 55.5 1.64735 -0.287918 4.618 + 55.6 1.64735 -0.287918 4.617 + 55.7 1.63705 -0.287918 4.642 + 55.8 1.62676 -0.276844 4.659 + 55.9 1.62676 -0.276844 4.656 + 56 1.61646 -0.276844 4.677 + 56.1 1.61646 -0.26577 4.696 + 56.2 1.60617 -0.26577 4.694 + 56.3 1.60617 -0.26577 4.704 + 56.4 1.59587 -0.26577 4.722 + 56.5 1.59587 -0.26577 4.74 + 56.6 1.59587 -0.26577 4.724 + 56.7 1.57528 -0.254697 4.747 + 56.8 1.58557 -0.254697 4.767 + 56.9 1.56498 -0.243623 4.765 + 57 1.57528 -0.243623 4.787 + 57.1 1.56498 -0.243623 4.801 + 57.2 1.56498 -0.243623 4.795 + 57.3 1.55469 -0.243623 4.822 + 57.4 1.55469 -0.232549 4.814 + 57.5 1.54439 -0.232549 4.836 + 57.6 1.54439 -0.232549 4.834 + 57.7 1.53409 -0.232549 4.85 + 57.8 1.53409 -0.232549 4.855 + 57.9 1.53409 -0.221475 4.871 + 58 1.53409 -0.221475 4.877 + 58.1 1.5238 -0.221475 4.891 + 58.2 1.5135 -0.221475 4.893 + 58.3 1.5135 -0.221475 4.901 + 58.4 1.50321 -0.221475 4.922 + 58.5 1.50321 -0.210402 4.929 + 58.6 1.50321 -0.210402 4.935 + 58.7 1.49291 -0.199328 4.948 + 58.8 1.49291 -0.199328 4.96 + 58.9 1.49291 -0.199328 4.965 + 59 1.48261 -0.199328 4.972 + 59.1 1.48261 -0.199328 4.988 + 59.2 1.47232 -0.199328 5.001 + 59.3 1.47232 -0.199328 4.996 + 59.4 1.47232 -0.188254 5.022 + 59.5 1.46202 -0.188254 5.028 + 59.6 1.46202 -0.188254 5.038 + 59.7 1.46202 -0.17718 5.045 + 59.8 1.45173 -0.188254 5.048 + 59.9 1.45173 -0.17718 5.067 + 60 1.45173 -0.17718 5.07 + 60.1 1.44143 -0.17718 5.071 + 60.2 1.43114 -0.17718 5.089 + 60.3 1.43114 -0.17718 5.093 + 60.4 1.43114 -0.166107 5.108 + 60.5 1.42084 -0.166107 5.113 + 60.6 1.42084 -0.166107 5.118 + 60.7 1.41054 -0.166107 5.118 + 60.8 1.42084 -0.166107 5.14 + 60.9 1.41054 -0.166107 5.131 + 61 1.41054 -0.166107 5.138 + 61.1 1.41054 -0.166107 5.142 + 61.2 1.41054 -0.166107 5.147 + 61.3 1.41054 -0.155033 5.157 + 61.4 1.40025 -0.155033 5.161 + 61.5 1.40025 -0.166107 5.177 + 61.6 1.38995 -0.166107 5.171 + 61.7 1.38995 -0.155033 5.187 + 61.8 1.37966 -0.155033 5.19 + 61.9 1.38995 -0.155033 5.19 + 62 1.37966 -0.143959 5.202 + 62.1 1.37966 -0.143959 5.217 + 62.2 1.37966 -0.143959 5.228 + 62.3 1.35906 -0.143959 5.221 + 62.4 1.37966 -0.143959 5.233 + 62.5 1.36936 -0.132885 5.248 + 62.6 1.35906 -0.132885 5.256 + 62.7 1.35906 -0.132885 5.265 + 62.8 1.35906 -0.132885 5.284 + 62.9 1.34877 -0.132885 5.287 + 63 1.33847 -0.121811 5.298 + 63.1 1.33847 -0.121811 5.322 + 63.2 1.33847 -0.110738 5.336 + 63.3 1.33847 -0.0996639 5.357 + 63.4 1.31788 -0.0996639 5.367 + 63.5 1.31788 -0.0996639 5.393 + 63.6 1.30758 -0.0885901 5.403 + 63.7 1.29729 -0.0775163 5.423 + 63.8 1.30758 -0.0775163 5.439 + 63.9 1.28699 -0.0664426 5.479 + 64 1.28699 -0.0664426 5.465 + 64.1 1.28699 -0.0553688 5.483 + 64.2 1.2767 -0.0553688 5.516 + 64.3 1.2767 -0.0553688 5.52 + 64.4 1.28699 -0.0553688 5.553 + 64.5 1.2767 -0.0553688 5.608 + 64.6 1.28699 -0.0553688 5.694 + 64.7 1.30758 -0.0553688 5.759 + 64.8 1.30758 -0.0664426 5.887 + 64.9 1.30758 -0.0553688 6.02 + 65 1.30758 -0.0664426 6.142 + 65.1 1.32818 -0.0553688 6.352 + 65.2 1.31788 -0.0553688 6.501 + 65.3 1.32818 -0.0553688 6.706 + 65.4 1.32818 -0.044295 6.916 + 65.5 1.33847 -0.0332213 7.135 + 65.6 1.32818 -0.0332213 7.356 + 65.7 1.33847 -0.0221475 7.617 + 65.8 1.34877 -0.0221475 7.871 + 65.9 1.32818 -0.0110737 8.119 + 66 1.32818 -0.0110737 8.35 + 66.1 1.32818 5.69776e-08 8.618 + 66.2 1.32818 0.0110738 8.859 + 66.3 1.31788 0.0110738 9.12 + 66.4 1.32818 0.0221476 9.371 + 66.5 1.31788 0.0221476 9.64 + 66.6 1.30758 0.0332214 9.851 + 66.7 1.31788 0.0332214 10.084 + 66.8 1.31788 0.0442952 10.302 + 66.9 1.31788 0.0442952 10.504 + 67 1.30758 0.0442952 10.677 + 67.1 1.32818 0.055369 10.851 + 67.2 1.31788 0.055369 10.962 + 67.3 1.32818 0.0442952 11.078 + 67.4 1.32818 0.055369 11.116 + 67.5 1.32818 0.0664427 11.161 + 67.6 1.33847 0.055369 11.2 + 67.7 1.34877 0.055369 11.214 + 67.8 1.33847 0.055369 11.229 + 67.9 1.34877 0.0664428 11.204 + 68 1.33847 0.0664428 11.19 + 68.1 1.34877 0.0664428 11.179 + 68.2 1.34877 0.0775165 11.183 + 68.3 1.35906 0.0664428 11.186 + 68.4 1.36936 0.0664428 11.183 + 68.5 1.35906 0.0664428 11.179 + 68.6 1.35906 0.0664428 11.169 + 68.7 1.36936 0.0664428 11.19 + 68.8 1.36936 0.055369 11.173 + 68.9 1.36936 0.055369 11.185 + 69 1.37966 0.055369 11.175 + 69.1 1.36936 0.055369 11.2 + 69.2 1.36936 0.055369 11.203 + 69.3 1.36936 0.055369 11.215 + 69.4 1.37966 0.055369 11.221 + 69.5 1.36936 0.055369 11.225 + 69.6 1.37966 0.055369 11.226 + 69.7 1.36936 0.055369 11.243 + 69.8 1.36936 0.055369 11.243 + 69.9 1.37966 0.055369 11.254 + 70 1.36936 0.055369 11.258 + 70.1 1.36936 0.055369 11.271 + 70.2 1.36936 0.0664428 11.29 + 70.3 1.35906 0.0664428 11.307 + 70.4 1.35906 0.0664428 11.315 + 70.5 1.35906 0.0664428 11.338 + 70.6 1.35906 0.0664428 11.34 + 70.7 1.34877 0.0664428 11.36 + 70.8 1.34877 0.0664428 11.358 + 70.9 1.34877 0.0664428 11.383 + 71 1.33847 0.0664428 11.408 + 71.1 1.33847 0.0664428 11.409 + 71.2 1.32818 0.0664428 11.419 + 71.3 1.31788 0.0664428 11.453 + 71.4 1.31788 0.0664428 11.454 + 71.5 1.30759 0.0664428 11.471 + 71.6 1.30759 0.0664428 11.48 + 71.7 1.29729 0.0664428 11.491 + 71.8 1.28699 0.0664427 11.492 + 71.9 1.28699 0.0664427 11.521 + 72 1.28699 0.0664427 11.517 + 72.1 1.2767 0.0664427 11.545 + 72.2 1.2767 0.0664427 11.545 + 72.3 1.2664 0.0664427 11.563 + 72.4 1.2664 0.0664427 11.577 + 72.5 1.25611 0.0664427 11.593 + 72.6 1.25611 0.0775165 11.599 + 72.7 1.24581 0.0664427 11.605 + 72.8 1.24581 0.0775165 11.629 + 72.9 1.24581 0.0664427 11.64 + 73 1.23551 0.0775165 11.641 + 73.1 1.24581 0.0775165 11.643 + 73.2 1.23551 0.0775165 11.652 + 73.3 1.24581 0.0775165 11.653 + 73.4 1.23551 0.0775165 11.667 + 73.5 1.24581 0.0775165 11.675 + 73.6 1.23551 0.0775165 11.671 + 73.7 1.24581 0.0775165 11.688 + 73.8 1.24581 0.0775165 11.707 + 73.9 1.24581 0.0775165 11.7 + 74 1.24581 0.0775165 11.717 + 74.1 1.24581 0.0775165 11.725 + 74.2 1.24581 0.0775165 11.719 + 74.3 1.24581 0.0885903 11.737 + 74.4 1.24581 0.0885903 11.752 + 74.5 1.24581 0.0885903 11.741 + 74.6 1.23551 0.0996641 11.78 + 74.7 1.24581 0.0996641 11.774 + 74.8 1.23551 0.110738 11.786 + 74.9 1.23551 0.121812 11.791 + 75 1.23551 0.110738 11.798 + 75.1 1.23551 0.121812 11.8 + 75.2 1.23551 0.121812 11.829 + 75.3 1.22522 0.132885 11.824 + 75.4 1.21492 0.143959 11.822 + 75.5 1.22522 0.143959 11.841 + 75.6 1.22522 0.143959 11.842 + 75.7 1.21492 0.155033 11.83 + 75.8 1.21492 0.155033 11.856 + 75.9 1.21492 0.155033 11.852 + 76 1.21492 0.155033 11.852 + 76.1 1.20463 0.155033 11.854 + 76.2 1.20463 0.166107 11.852 + 76.3 1.20463 0.166107 11.859 + 76.4 1.20463 0.155033 11.86 + 76.5 1.20463 0.155033 11.883 + 76.6 1.21492 0.155033 11.867 + 76.7 1.20463 0.143959 11.866 + 76.8 1.19433 0.155033 11.872 + 76.9 1.19433 0.155033 11.874 + 77 1.19433 0.143959 11.888 + 77.1 1.19433 0.143959 11.873 + 77.2 1.19433 0.143959 11.883 + 77.3 1.18403 0.143959 11.906 + 77.4 1.19433 0.143959 11.898 + 77.5 1.18403 0.143959 11.907 + 77.6 1.18403 0.143959 11.917 + 77.7 1.17374 0.155033 11.91 + 77.8 1.17374 0.143959 11.916 + 77.9 1.17374 0.143959 11.927 + 78 1.17374 0.143959 11.927 + 78.1 1.18403 0.143959 11.926 + 78.2 1.17374 0.143959 11.932 + 78.3 1.17374 0.132885 11.935 + 78.4 1.17374 0.143959 11.937 + 78.5 1.18403 0.132885 11.942 + 78.6 1.17374 0.132885 11.951 + 78.7 1.17374 0.132885 11.944 + 78.8 1.17374 0.132885 11.955 + 78.9 1.17374 0.132885 11.968 + 79 1.17374 0.132885 11.966 + 79.1 1.17374 0.132885 11.96 + 79.2 1.17374 0.132885 11.989 + 79.3 1.17374 0.132885 11.986 + 79.4 1.16344 0.143959 11.99 + 79.5 1.16344 0.143959 11.99 + 79.6 1.16344 0.143959 11.997 + 79.7 1.16344 0.143959 11.998 + 79.8 1.16344 0.143959 11.993 + 79.9 1.16344 0.143959 12.003 + 80 1.16344 0.143959 12 + 80.1 1.16344 0.143959 12.002 + 80.2 1.16344 0.155033 11.997 + 80.3 1.16344 0.143959 12.012 + 80.4 1.16344 0.155033 11.996 + 80.5 1.16344 0.155033 11.999 + 80.6 1.17374 0.155033 12.011 + 80.7 1.17374 0.155033 11.988 + 80.8 1.17374 0.155033 12.006 + 80.9 1.18403 0.155033 12.007 + 81 1.17374 0.155033 12 + 81.1 1.18403 0.155033 12.02 + 81.2 1.17374 0.155033 12.012 + 81.3 1.18403 0.155033 12.007 + 81.4 1.18403 0.155033 12.013 + 81.5 1.18403 0.155033 12.016 + 81.6 1.19433 0.155033 12.009 + 81.7 1.19433 0.143959 12.018 + 81.8 1.19433 0.143959 12.02 + 81.9 1.19433 0.155033 12.015 + 82 1.19433 0.143959 12.015 + 82.1 1.19433 0.143959 12.022 + 82.2 1.19433 0.143959 12.014 + 82.3 1.19433 0.155033 12.008 + 82.4 1.19433 0.155033 12.026 + 82.5 1.20463 0.155033 12.012 + 82.6 1.19433 0.155033 12.025 + 82.7 1.18403 0.155033 12.011 + 82.8 1.19433 0.155033 12.014 + 82.9 1.19433 0.155033 12.012 + 83 1.19433 0.155033 12.013 + 83.1 1.18403 0.155033 12.01 + 83.2 1.19433 0.155033 12.019 + 83.3 1.18403 0.155033 12.029 + 83.4 1.18403 0.166107 12.019 + 83.5 1.18403 0.155033 12.018 + 83.6 1.18403 0.166107 12.031 + 83.7 1.17374 0.166107 12.022 + 83.8 1.17374 0.166107 12.043 + 83.9 1.17374 0.166107 12.027 + 84 1.17374 0.166107 12.046 + 84.1 1.18403 0.155033 12.039 + 84.2 1.19433 0.143959 12.036 + 84.3 1.19433 0.121812 12.048 + 84.4 1.21492 0.0996641 12.047 + 84.5 1.23551 0.055369 12.038 + 84.6 1.2664 0.0221476 12.056 + 84.7 1.29729 -0.0332213 12.05 + 84.8 1.33847 -0.099664 12.061 + 84.9 1.38995 -0.188254 12.059 + 85 1.44143 -0.276845 12.058 + 85.1 1.49291 -0.365435 12.067 + 85.2 1.56498 -0.476173 12.053 + 85.3 1.62676 -0.58691 12.076 + 85.4 1.70913 -0.719796 12.075 + 85.5 1.79149 -0.852681 12.074 + 85.6 1.88416 -0.985567 12.08 + 85.7 1.97682 -1.1406 12.076 + 85.8 2.07978 -1.30671 12.083 + 85.9 2.18274 -1.48389 12.088 + 86 2.296 -1.66107 12.069 + 86.1 2.41955 -1.8604 12.069 + 86.2 2.5431 -2.0708 12.07 + 86.3 2.66665 -2.2812 12.069 + 86.4 2.81079 -2.50267 12.077 + 86.5 2.95494 -2.73522 12.059 + 86.6 3.09908 -2.97885 12.073 + 86.7 3.24322 -3.2114 12.068 + 86.8 3.39766 -3.46609 12.052 + 86.9 3.5624 -3.72079 12.055 + 87 3.72713 -3.98656 12.066 + 87.1 3.89187 -4.25233 12.055 + 87.2 4.0669 -4.52918 12.073 + 87.3 4.23164 -4.80602 12.067 + 87.4 4.41696 -5.09394 12.065 + 87.5 4.5817 -5.38186 12.062 + 87.6 4.75673 -5.68085 12.067 + 87.7 4.94206 -5.97984 12.067 + 87.8 5.11709 -6.27883 12.078 + 87.9 5.31271 -6.57783 12.082 + 88 5.48774 -6.88789 12.09 + 88.1 5.68337 -7.19796 12.072 + 88.2 5.86869 -7.50802 12.093 + 88.3 6.06432 -7.81809 12.091 + 88.4 6.23935 -8.12816 12.093 + 88.5 6.42467 -8.43822 12.117 + 88.6 6.58941 -8.72614 12.089 + 88.7 6.72326 -8.95869 12.069 + 88.8 6.8571 -9.20231 12.078 + 88.9 7.00125 -9.42379 12.066 + 89 7.09391 -9.60097 12.067 + 89.1 7.18658 -9.756 12.074 + 89.2 7.25865 -9.87781 12.078 + 89.3 7.32042 -9.97748 12.068 + 89.4 7.36161 -10.055 12.079 + 89.5 7.40279 -10.1104 12.075 + 89.6 7.43368 -10.1657 12.092 + 89.7 7.45427 -10.21 12.097 + 89.8 7.50575 -10.2543 12.084 + 89.9 7.51605 -10.2875 12.127 + 90 7.53664 -10.3097 12.126 + 90.1 7.54693 -10.3208 12.124 + 90.2 7.56753 -10.3429 12.126 + 90.3 7.57782 -10.3651 12.138 + 90.4 7.58812 -10.3651 12.125 + 90.5 7.58812 -10.3761 12.118 + 90.6 7.58812 -10.3761 12.11 + 90.7 7.58812 -10.3761 12.126 + 90.8 7.59841 -10.3761 12.149 + 90.9 7.58812 -10.3761 12.142 + 91 7.57782 -10.3651 12.126 + 91.1 7.56753 -10.354 12.151 + 91.2 7.54693 -10.3429 12.145 + 91.3 7.52634 -10.3208 12.157 + 91.4 7.50575 -10.2765 12.141 + 91.5 7.47486 -10.2432 12.162 + 91.6 7.44397 -10.199 12.158 + 91.7 7.40279 -10.1547 12.167 + 91.8 7.34101 -10.0771 12.17 + 91.9 7.29983 -10.0107 12.184 + 92 7.23806 -9.92211 12.15 + 92.1 7.16598 -9.83352 12.172 + 92.2 7.1145 -9.72278 12.165 + 92.3 7.03214 -9.61204 12.162 + 92.4 6.94977 -9.51238 12.165 + 92.5 6.8674 -9.36842 12.178 + 92.6 6.78503 -9.23553 12.162 + 92.7 6.68207 -9.09157 12.16 + 92.8 6.57911 -8.93654 12.17 + 92.9 6.48645 -8.78151 12.17 + 93 6.38349 -8.60433 12.179 + 93.1 6.27024 -8.42715 12.163 + 93.2 6.15698 -8.23889 12.169 + 93.3 6.02313 -8.03957 12.153 + 93.4 5.90988 -7.82916 12.152 + 93.5 5.77603 -7.60769 12.172 + 93.6 5.64218 -7.38621 12.155 + 93.7 5.50833 -7.15366 12.172 + 93.8 5.36419 -6.91004 12.148 + 93.9 5.22005 -6.66642 12.164 + 94 5.06561 -6.40065 12.168 + 94.1 4.91117 -6.14595 12.171 + 94.2 4.74643 -5.8691 12.165 + 94.3 4.5817 -5.59226 12.179 + 94.4 4.40667 -5.29327 12.167 + 94.5 4.23164 -5.00535 12.171 + 94.6 4.0566 -4.70636 12.169 + 94.7 3.87128 -4.40737 12.174 + 94.8 3.67565 -4.08623 12.181 + 94.9 3.49033 -3.78723 12.192 + 95 3.305 -3.46609 12.176 + 95.1 3.10938 -3.13388 12.205 + 95.2 2.90346 -2.81274 12.193 + 95.3 2.68724 -2.46945 12.184 + 95.4 2.49162 -2.14831 12.197 + 95.5 2.2857 -1.80503 12.205 + 95.6 2.05919 -1.47281 12.211 + 95.7 1.84297 -1.12953 12.219 + 95.8 1.62676 -0.786239 12.222 + 95.9 1.41054 -0.442951 12.207 + 96 1.20463 -0.0775164 12.214 + 96.1 0.988411 0.276845 12.21 + 96.2 0.7619 0.642279 12.207 + 96.3 0.545685 1.00771 12.22 + 96.4 0.319174 1.38422 12.218 + 96.5 0.113255 1.76073 12.197 + 96.6 -0.123551 2.14831 12.222 + 96.7 -0.350062 2.52482 12.218 + 96.8 -0.566277 2.91241 12.22 + 96.9 -0.803084 3.29999 12.215 + 97 -1.02959 3.70972 12.24 + 97.1 -1.2664 4.10837 12.234 + 97.2 -1.50321 4.50703 12.224 + 97.3 -1.72972 4.91676 12.236 + 97.4 -1.97682 5.31542 12.228 + 97.5 -2.21363 5.72515 12.229 + 97.6 -2.45043 6.14595 12.23 + 97.7 -2.68724 6.55568 12.224 + 97.8 -2.93434 6.96541 12.223 + 97.9 -3.17115 7.38621 12.214 + 98 -3.41825 7.80702 12.23 + 98.1 -3.64476 8.22782 12.224 + 98.2 -3.90216 8.63755 12.225 + 98.3 -4.14926 9.05836 12.223 + 98.4 -4.39637 9.47916 12.231 + 98.5 -4.64347 9.89996 12.213 + 98.6 -4.89057 10.3208 12.224 + 98.7 -5.12738 10.7305 12.231 + 98.8 -5.36418 11.1402 12.228 + 98.9 -5.5701 11.5057 12.231 + 99 -5.73484 11.8379 12.16 + 99.1 -5.94076 12.1812 12.155 + 99.2 -6.10549 12.4469 12.155 + 99.3 -6.24963 12.6906 12.158 + 99.4 -6.38348 12.8788 12.132 + 99.5 -6.48644 13.056 12.176 + 99.6 -6.5894 13.2 12.132 + 99.7 -6.66147 13.3107 12.123 + 99.8 -6.72325 13.3993 12.117 + 99.9 -6.77473 13.4768 12.117 + 100 -6.81591 13.5543 12.126 + 100.1 -6.8468 13.6097 12.143 + 100.2 -6.87769 13.6651 12.143 + 100.3 -6.88798 13.6983 12.163 + 100.4 -6.89828 13.7315 12.175 + 100.5 -6.89828 13.7647 12.181 + 100.6 -6.89828 13.7758 12.195 + 100.7 -6.88798 13.7758 12.2 + 100.8 -6.86739 13.7647 12.196 + 100.9 -6.8468 13.7536 12.207 + 101 -6.82621 13.7315 12.199 + 101.1 -6.79532 13.6983 12.21 + 101.2 -6.75414 13.6429 12.205 + 101.3 -6.71295 13.5986 12.207 + 101.4 -6.66147 13.5322 12.211 + 101.5 -6.60999 13.4546 12.207 + 101.6 -6.54822 13.3771 12.208 + 101.7 -6.47615 13.2775 12.215 + 101.8 -6.41437 13.1778 12.21 + 101.9 -6.3423 13.0781 12.209 + 102 -6.25993 12.9674 12.198 + 102.1 -6.17756 12.8345 12.204 + 102.2 -6.0952 12.7127 12.202 + 102.3 -6.00253 12.5687 12.202 + 102.4 -5.90987 12.4137 12.192 + 102.5 -5.80691 12.2698 12.21 + 102.6 -5.71425 12.1147 12.182 + 102.7 -5.61129 11.9597 12.202 + 102.8 -5.49803 11.7936 12.202 + 102.9 -5.40537 11.6275 12.187 + 103 -5.29211 11.4503 12.177 + 103.1 -5.17886 11.2842 12.178 + 103.2 -5.0759 11.107 12.153 + 103.3 -4.97294 10.9298 12.152 + 103.4 -4.85968 10.7526 12.157 + 103.5 -4.73613 10.5755 12.147 + 103.6 -4.62288 10.3872 12.144 + 103.7 -4.50962 10.21 12.144 + 103.8 -4.39637 10.0218 12.131 + 103.9 -4.27282 9.83352 12.118 + 104 -4.15956 9.64527 12.137 + 104.1 -4.03601 9.45701 12.108 + 104.2 -3.91246 9.26876 12.107 + 104.3 -3.7992 9.0805 12.105 + 104.4 -3.66535 8.88118 12.11 + 104.5 -3.5521 8.68185 12.084 + 104.6 -3.41825 8.49359 12.079 + 104.7 -3.305 8.30534 12.079 + 104.8 -3.18145 8.10601 12.07 + 104.9 -3.0476 7.90668 12.067 + 105 -2.93434 7.70735 12.066 + 105.1 -2.81079 7.50803 12.056 + 105.2 -2.67694 7.29762 12.056 + 105.3 -2.55339 7.10937 12.052 + 105.4 -2.42984 6.89897 12.044 + 105.5 -2.296 6.69964 12.035 + 105.6 -2.16215 6.48924 12.03 + 105.7 -2.0386 6.28991 12.033 + 105.8 -1.90475 6.06843 12.019 + 105.9 -1.76061 5.85803 12.013 + 106 -1.62676 5.64763 12.018 + 106.1 -1.49291 5.41508 11.998 + 106.2 -1.35906 5.1936 12.001 + 106.3 -1.20463 4.97213 11.985 + 106.4 -1.06048 4.73958 11.987 + 106.5 -0.916339 4.49596 11.985 + 106.6 -0.772196 4.26341 11.982 + 106.7 -0.617757 4.03086 11.978 + 106.8 -0.463317 3.78723 11.958 + 106.9 -0.308878 3.53254 11.974 + 107 -0.164735 3.28891 11.957 + 107.1 -0.0102959 3.04529 11.95 + 107.2 0.144143 2.79059 11.941 + 107.3 0.298582 2.5359 11.943 + 107.4 0.453022 2.2812 11.934 + 107.5 0.607461 2.0265 11.931 + 107.6 0.7619 1.77181 11.925 + 107.7 0.926635 1.51711 11.918 + 107.8 1.08107 1.27349 11.932 + 107.9 1.21492 1.01879 11.909 + 108 1.32818 0.830534 11.88 + 108.1 1.44143 0.653353 11.884 + 108.2 1.55469 0.465099 11.881 + 108.3 1.64735 0.32114 11.873 + 108.4 1.72972 0.199328 11.867 + 108.5 1.79149 0.0996642 11.871 + 108.6 1.84297 0.0332215 11.887 + 108.7 1.87386 -0.0221475 11.878 + 108.8 1.90475 -0.0775164 11.871 + 108.9 1.93564 -0.121811 11.874 + 109 1.96653 -0.166107 11.885 + 109.1 1.97682 -0.199328 11.869 + 109.2 2.00771 -0.221476 11.889 + 109.3 2.01801 -0.243623 11.888 + 109.4 2.01801 -0.265771 11.881 + 109.5 2.0386 -0.265771 11.882 + 109.6 2.0386 -0.276844 11.879 + 109.7 2.0386 -0.287918 11.875 + 109.8 2.04889 -0.287918 11.873 + 109.9 2.04889 -0.287918 11.872 + 110 2.04889 -0.287918 11.861 + 110.1 2.04889 -0.287918 11.86 + 110.2 2.04889 -0.287918 11.864 + 110.3 2.04889 -0.276844 11.849 + 110.4 2.0386 -0.276844 11.842 + 110.5 2.0386 -0.276844 11.85 + 110.6 2.0283 -0.265771 11.834 + 110.7 2.01801 -0.254697 11.835 + 110.8 2.01801 -0.243623 11.846 + 110.9 1.99741 -0.221476 11.82 + 111 1.97682 -0.188254 11.821 + 111.1 1.96653 -0.155033 11.812 + 111.2 1.93564 -0.121811 11.799 + 111.3 1.89445 -0.0664426 11.817 + 111.4 1.87386 -0.0221475 11.826 + 111.5 1.83268 0.0442952 11.812 + 111.6 1.82238 0.0775166 11.807 + 111.7 1.79149 0.121812 11.8 + 111.8 1.7709 0.166107 11.807 + 111.9 1.74001 0.199328 11.807 + 112 1.71942 0.23255 11.802 + 112.1 1.69883 0.243623 11.787 + 112.2 1.69883 0.254697 11.801 + 112.3 1.68854 0.265771 11.793 + 112.4 1.67824 0.276845 11.806 + 112.5 1.66794 0.287918 11.795 + 112.6 1.65765 0.298992 11.798 + 112.7 1.64735 0.310066 11.794 + 112.8 1.64735 0.32114 11.788 + 112.9 1.63706 0.343287 11.81 + 113 1.62676 0.354361 11.795 + 113.1 1.60617 0.387582 11.792 + 113.2 1.59587 0.420804 11.794 + 113.3 1.56498 0.454025 11.8 + 113.4 1.5341 0.509394 11.792 + 113.5 1.5135 0.553689 11.779 + 113.6 1.47232 0.620132 11.806 + 113.7 1.44143 0.686575 11.791 + 113.8 1.43114 0.741944 11.791 + 113.9 1.38995 0.786239 11.788 + 114 1.36936 0.841608 11.758 + 114.1 1.33847 0.896976 11.792 + 114.2 1.32818 0.930198 11.787 + 114.3 1.29729 0.952345 11.798 + 114.4 1.29729 0.974493 11.853 + 114.5 1.28699 0.985567 11.898 + 114.6 1.2767 0.996641 11.953 + 114.7 1.2767 1.00771 12.039 + 114.8 1.2664 1.00771 12.143 + 114.9 1.2767 1.01879 12.217 + 115 1.2664 1.01879 12.324 + 115.1 1.2664 1.01879 12.426 + 115.2 1.2664 1.00771 12.532 + 115.3 1.2664 1.01879 12.641 + 115.4 1.2767 1.01879 12.757 + 115.5 1.2767 1.02986 12.879 + 115.6 1.2767 1.01879 13.019 + 115.7 1.2664 1.01879 13.13 + 115.8 1.2767 1.02986 13.283 + 115.9 1.25611 1.02986 13.425 + 116 1.2767 1.04094 13.563 + 116.1 1.25611 1.04094 13.719 + 116.2 1.2664 1.04094 13.897 + 116.3 1.25611 1.04094 14.028 + 116.4 1.2664 1.04094 14.207 + 116.5 1.2664 1.04094 14.365 + 116.6 1.25611 1.04094 14.544 + 116.7 1.2767 1.04094 14.721 + 116.8 1.2664 1.04094 14.901 + 116.9 1.25611 1.04094 15.064 + 117 1.2664 1.04094 15.231 + 117.1 1.2664 1.04094 15.406 + 117.2 1.2767 1.01879 15.677 + 117.3 1.28699 1.01879 15.828 + 117.4 1.2767 1.01879 16.022 + 117.5 1.2767 1.02986 16.201 + 117.6 1.2664 1.01879 16.384 + 117.7 1.2767 1.01879 16.574 + 117.8 1.2664 1.02986 16.733 + 117.9 1.25611 1.02986 16.928 + 118 1.24581 1.04094 17.142 + 118.1 1.25611 1.02986 17.32 + 118.2 1.23551 1.04094 17.508 + 118.3 1.23551 1.04094 17.717 + 118.4 1.23551 1.04094 17.912 + 118.5 1.24581 1.05201 18.103 + 118.6 1.23551 1.04094 18.294 + 118.7 1.23551 1.05201 18.516 + 118.8 1.22522 1.05201 18.691 + 118.9 1.23551 1.06308 18.885 + 119 1.22522 1.05201 19.111 + 119.1 1.23551 1.05201 19.32 + 119.2 1.22522 1.06308 19.542 + 119.3 1.22522 1.06308 19.754 + 119.4 1.23552 1.06308 19.983 + 119.5 1.21492 1.06308 20.193 + 119.6 1.22522 1.06308 20.415 + 119.7 1.20463 1.07416 20.637 + 119.8 1.22522 1.07416 20.871 + 119.9 1.21492 1.07416 21.081 + 120 1.21492 1.07416 21.292 + 120.1 1.21492 1.07416 21.513 + 120.2 1.21492 1.08523 21.751 + 120.3 1.21492 1.08523 21.95 + 120.4 1.20463 1.08523 22.173 + 120.5 1.21492 1.08523 22.396 + 120.6 1.21492 1.07416 22.62 + 120.7 1.21492 1.08523 22.832 + 120.8 1.21492 1.08523 23.064 + 120.9 1.22522 1.08523 23.248 + 121 1.21492 1.08523 23.436 + 121.1 1.22522 1.07416 23.593 + 121.2 1.25611 1.04094 23.695 + 121.3 1.2767 1.01879 23.776 + 121.4 1.30759 0.963421 23.834 + 121.5 1.34877 0.908052 23.877 + 121.6 1.40025 0.819462 23.879 + 121.7 1.47232 0.719797 23.875 + 121.8 1.55469 0.575838 23.874 + 121.9 1.65765 0.409731 23.874 + 122 1.77091 0.221476 23.859 + 122.1 1.90475 1.17259e-07 23.842 + 122.2 2.0386 -0.243624 23.828 + 122.3 2.20334 -0.509395 23.816 + 122.4 2.37837 -0.78624 23.795 + 122.5 2.5534 -1.09631 23.786 + 122.6 2.74902 -1.41745 23.788 + 122.7 2.95494 -1.77181 23.765 + 122.8 3.17116 -2.13724 23.775 + 122.9 3.40797 -2.52483 23.763 + 123 3.63448 -2.92348 23.759 + 123.1 3.89188 -3.33321 23.756 + 123.2 4.13898 -3.76509 23.75 + 123.3 4.39638 -4.19697 23.748 + 123.4 4.67437 -4.651 23.744 + 123.5 4.95236 -5.12717 23.744 + 123.6 5.24065 -5.60334 23.741 + 123.7 5.52894 -6.09059 23.753 + 123.8 5.82752 -6.58891 23.739 + 123.9 6.1261 -7.09831 23.745 + 124 6.45557 -7.61878 23.76 + 124.1 6.77475 -8.15032 23.747 + 124.2 7.10422 -8.70401 23.75 + 124.3 7.43369 -9.2577 23.758 + 124.4 7.78375 -9.82246 23.761 + 124.5 8.12352 -10.3983 23.777 + 124.6 8.48388 -10.9741 23.775 + 124.7 8.83395 -11.561 23.79 + 124.8 9.1943 -12.148 23.785 + 124.9 9.56496 -12.7459 23.798 + 125 9.92532 -13.3439 23.788 + 125.1 10.296 -13.953 23.805 + 125.2 10.6563 -14.562 23.781 + 125.3 11.027 -15.1711 23.807 + 125.4 11.4079 -15.7912 23.813 + 125.5 11.7786 -16.4003 23.809 + 125.6 12.1493 -17.0094 23.827 + 125.7 12.5199 -17.6184 23.808 + 125.8 12.8906 -18.2164 23.819 + 125.9 13.2509 -18.8144 23.807 + 126 13.6113 -19.3902 23.824 + 126.1 13.9099 -19.9107 23.759 + 126.2 14.2187 -20.3979 23.731 + 126.3 14.5173 -20.8741 23.7429 + 126.4 14.7747 -21.2838 23.7199 + 126.5 15.0012 -21.6493 23.7059 + 126.6 15.1866 -21.9593 23.6889 + 126.7 15.3616 -22.2362 23.6809 + 126.8 15.5263 -22.4687 23.6989 + 126.9 15.6499 -22.6902 23.6899 + 127 15.7837 -22.8674 23.6919 + 127.1 15.8764 -23.0003 23.6829 + 127.2 15.9485 -23.1221 23.7079 + 127.3 16 -23.2107 23.6969 + 127.4 16.0514 -23.2661 23.7009 + 127.5 16.072 -23.2882 23.7069 + 127.6 16.072 -23.2771 23.6939 + 127.7 16.0617 -23.2328 23.7109 + 127.8 16.0308 -23.1553 23.7149 + 127.9 15.9588 -23.0446 23.7189 + 128 15.8867 -22.9117 23.7039 + 128.1 15.8146 -22.7567 23.7079 + 128.2 15.7014 -22.5684 23.6879 + 128.3 15.5881 -22.358 23.6989 + 128.4 15.4543 -22.1255 23.6949 + 128.5 15.2998 -21.8818 23.6859 + 128.6 15.1454 -21.605 23.6739 + 128.7 14.9909 -21.3171 23.6799 + 128.8 14.8056 -21.007 23.6479 + 128.9 14.61 -20.6859 23.6469 + 129 14.4144 -20.3536 23.633 + 129.1 14.1982 -19.9993 23.622 + 129.2 13.9819 -19.6338 23.606 + 129.3 13.7657 -19.2573 23.587 + 129.4 13.5083 -18.8587 23.55 + 129.5 13.2818 -18.46 23.548 + 129.6 13.0347 -18.0503 23.555 + 129.7 12.7876 -17.6184 23.545 + 129.8 12.5199 -17.1865 23.53 + 129.9 12.2625 -16.7436 23.531 + 130 11.9845 -16.2674 23.499 + 130.1 11.6962 -15.8023 23.512 + 130.2 11.4182 -15.3372 23.501 + 130.3 11.1299 -14.85 23.484 + 130.4 10.8417 -14.3516 23.467 + 130.5 10.5431 -13.8533 23.472 + 130.6 10.2342 -13.3329 23.465 + 130.7 9.93561 -12.8235 23.453 + 130.8 9.62673 -12.303 23.447 + 130.9 9.31786 -11.7825 23.439 + 131 9.00898 -11.251 23.419 + 131.1 8.6898 -10.7084 23.426 + 131.2 8.37063 -10.1657 23.415 + 131.3 8.04115 -9.61206 23.4 + 131.4 7.72198 -9.05837 23.406 + 131.5 7.39251 -8.50468 23.393 + 131.6 7.07333 -7.95099 23.38 + 131.7 6.74386 -7.37515 23.37 + 131.8 6.41439 -6.81039 23.385 + 131.9 6.08492 -6.24562 23.358 + 132 5.74515 -5.65871 23.342 + 132.1 5.41568 -5.08287 23.337 + 132.2 5.07591 -4.50704 23.338 + 132.3 4.72585 -3.92013 23.316 + 132.4 4.38608 -3.32214 23.304 + 132.5 4.03602 -2.71308 23.305 + 132.6 3.68596 -2.10402 23.288 + 132.7 3.3153 -1.48389 23.256 + 132.8 2.96524 -0.863756 23.28 + 132.9 2.59458 -0.221476 23.279 + 133 2.22393 0.431878 23.254 + 133.1 1.83268 1.09631 23.225 + 133.2 1.46203 1.74966 23.227 + 133.3 1.07078 2.42516 23.227 + 133.4 0.679534 3.11174 23.21 + 133.5 0.288287 3.78724 23.207 + 133.6 -0.113256 4.47382 23.191 + 133.7 -0.514798 5.17147 23.173 + 133.8 -0.916341 5.86912 23.168 + 133.9 -1.32818 6.57784 23.152 + 134 -1.74002 7.28656 23.145 + 134.1 -2.15186 7.99529 23.138 + 134.2 -2.56369 8.71508 23.133 + 134.3 -2.98583 9.44595 23.113 + 134.4 -3.40796 10.1768 23.123 + 134.5 -3.8198 10.9077 23.099 + 134.6 -4.25223 11.6386 23.097 + 134.7 -4.68466 12.3805 23.071 + 134.8 -5.10679 13.1114 23.091 + 134.9 -5.51863 13.8533 23.075 + 135 -5.95106 14.5842 23.074 + 135.1 -6.38349 15.3151 23.064 + 135.2 -6.79533 16.0459 23.071 + 135.3 -7.21746 16.7768 23.061 + 135.4 -7.64989 17.5077 23.053 + 135.5 -8.06173 18.2275 23.044 + 135.6 -8.46327 18.9362 23.049 + 135.7 -8.88541 19.6671 23.026 + 135.8 -9.30754 20.3758 23.011 + 135.9 -9.70908 21.0845 23.006 + 136 -10.1209 21.7932 22.986 + 136.1 -10.5225 22.502 22.983 + 136.2 -10.9446 23.1996 22.9819 + 136.3 -11.3358 23.8973 22.9719 + 136.4 -11.7374 24.5949 22.9679 + 136.5 -12.1286 25.2704 22.9549 + 136.6 -12.5199 25.9459 22.9549 + 136.7 -12.9008 26.6104 22.9569 + 136.8 -13.2509 27.2416 22.9479 + 136.9 -13.5598 27.8063 22.8979 + 137 -13.9098 28.3711 22.8749 + 137.1 -14.1981 28.8805 22.8889 + 137.2 -14.4555 29.3456 22.8739 + 137.3 -14.7026 29.7553 22.8869 + 137.4 -14.9085 30.1097 22.8869 + 137.5 -15.1041 30.4419 22.8749 + 137.6 -15.2689 30.7298 22.8399 + 137.7 -15.4027 30.9734 22.8359 + 137.8 -15.5366 31.1728 22.8079 + 137.9 -15.6395 31.361 22.7899 + 138 -15.7219 31.505 22.7609 + 138.1 -15.8043 31.6379 22.7359 + 138.2 -15.8558 31.7375 22.7149 + 138.3 -15.8969 31.815 22.6919 + 138.4 -15.9175 31.8704 22.6679 + 138.5 -15.9278 31.8926 22.6529 + 138.6 -15.9175 31.8926 22.6619 + 138.7 -15.8969 31.8704 22.6419 + 138.8 -15.8558 31.815 22.6379 + 138.9 -15.8043 31.7375 22.6379 + 139 -15.7219 31.6379 22.6399 + 139.1 -15.6498 31.4939 22.6279 + 139.2 -15.5469 31.3499 22.6169 + 139.3 -15.4439 31.1728 22.6189 + 139.4 -15.3204 30.9734 22.6099 + 139.5 -15.1865 30.7741 22.5969 + 139.6 -15.0424 30.5416 22.6009 + 139.7 -14.8982 30.2979 22.6009 + 139.8 -14.7335 30.0432 22.6049 + 139.9 -14.5688 29.7885 22.5759 + 140 -14.3937 29.5338 22.5579 + 140.1 -14.2084 29.2791 22.5529 + 140.2 -14.0025 29.0134 22.5399 + 140.3 -13.8069 28.7587 22.5379 + 140.4 -13.5906 28.515 22.5189 + 140.5 -13.3538 28.2714 22.5209 + 140.6 -13.1273 28.0389 22.5019 + 140.7 -12.8905 27.8174 22.5009 + 140.8 -12.6331 27.6181 22.4899 + 140.9 -12.3757 27.4187 22.4779 + 141 -12.108 27.2416 22.4669 + 141.1 -11.8197 27.0644 22.4709 + 141.2 -11.5418 26.9093 22.4769 + 141.3 -11.2432 26.7765 22.4679 + 141.4 -10.924 26.6546 22.4649 + 141.5 -10.6048 26.5328 22.4529 + 141.6 -10.2754 26.4332 22.4589 + 141.7 -9.93559 26.3557 22.4619 + 141.8 -9.59582 26.2892 22.4659 + 141.9 -9.22517 26.2449 22.4689 + 142 -8.87511 26.2117 22.4939 + 142.1 -8.51475 26.2006 22.4959 + 142.2 -8.11321 26.1785 22.5199 + 142.3 -7.73226 26.1895 22.5429 + 142.4 -7.34101 26.2117 22.5539 + 142.5 -6.92917 26.2338 22.5619 + 142.6 -6.51733 26.2781 22.5559 + 142.7 -6.1055 26.3335 22.5729 + 142.8 -5.67307 26.3889 22.5689 + 142.9 -5.24064 26.4553 22.5879 + 143 -4.79791 26.5439 22.5789 + 143.1 -4.35519 26.6325 22.5829 + 143.2 -3.89187 26.7322 22.5929 + 143.3 -3.43885 26.8429 22.5909 + 143.4 -2.98582 26.9426 22.5929 + 143.5 -2.51221 27.0644 22.6069 + 143.6 -2.04889 27.1862 22.6099 + 143.7 -1.57528 27.3191 22.6209 + 143.8 -1.10167 27.463 22.6369 + 143.9 -0.617757 27.5959 22.6339 + 144 -0.133847 27.7509 22.6549 + 144.1 0.360358 27.906 22.6619 + 144.2 0.833972 28.0721 22.6789 + 144.3 1.31788 28.2382 22.6929 + 144.4 1.81209 28.4043 22.7159 + 144.5 2.30629 28.5704 22.7159 + 144.6 2.7902 28.7587 22.7399 + 144.7 3.26381 28.9248 22.7369 + 144.8 3.74772 29.102 22.7479 + 144.9 4.23163 29.2902 22.7809 + 145 4.71554 29.4674 22.7809 + 145.1 5.18916 29.6556 22.7979 + 145.2 5.67307 29.8439 22.8099 + 145.3 6.13638 30.0322 22.8149 + 145.4 6.61 30.2315 22.8279 + 145.5 7.08361 30.4197 22.8439 + 145.6 7.54693 30.6191 22.8569 + 145.7 8.02054 30.8184 22.8629 + 145.8 8.49415 31.0177 22.8559 + 145.9 8.95747 31.2281 22.8779 + 146 9.43108 31.4164 22.8909 + 146.1 9.8944 31.6268 22.8969 + 146.2 10.3474 31.8261 22.9049 + 146.3 10.8107 32.0365 22.9159 + 146.4 11.2741 32.2358 22.9219 + 146.5 11.7168 32.4462 22.9249 + 146.6 12.1698 32.6456 22.9379 + 146.7 12.6228 32.856 22.9479 + 146.8 13.0656 33.0664 22.9429 + 146.9 13.498 33.2768 22.9749 + 147 13.9407 33.4761 22.9579 + 147.1 14.3834 33.6976 22.9589 + 147.2 14.8159 33.8969 22.9749 + 147.3 15.2483 34.1073 22.9839 + 147.4 15.7013 34.3288 22.9829 + 147.5 16.144 34.5392 23.0029 + 147.6 16.5971 34.7607 22.9979 + 147.7 17.0398 34.9822 23.0109 + 147.8 17.5031 35.2147 23.0149 + 147.9 17.9458 35.4362 23.0339 + 148 18.3988 35.6798 23.0259 + 148.1 18.8725 35.9124 23.0539 + 148.2 19.3255 36.1671 23.0579 + 148.3 19.7888 36.3885 23.0719 + 148.4 20.2521 36.6322 23.0629 + 148.5 20.7051 36.8758 23.0759 + 148.6 21.1685 37.1194 23.0959 + 148.7 21.6215 37.363 23.0969 + 148.8 22.0745 37.6067 23.1029 + 148.9 22.5378 37.8503 23.1008 + 149 22.9908 38.0939 23.1088 + 149.1 23.4336 38.3265 23.1158 + 149.2 23.8969 38.5811 23.1278 + 149.3 24.3396 38.8137 23.1348 + 149.4 24.7926 39.0573 23.1178 + 149.5 25.2353 39.3009 23.1308 + 149.6 25.6678 39.5556 23.1248 + 149.7 26.1208 39.7882 23.1418 + 149.8 26.5532 40.0318 23.1238 + 149.9 27.0062 40.2754 23.1388 + 150 27.4387 40.5191 23.1308 + 150.1 27.8814 40.7627 23.1238 + 150.2 28.3138 41.0063 23.1408 + 150.3 28.7463 41.2499 23.1358 + 150.4 29.1787 41.4936 23.1338 + 150.5 29.6111 41.7261 23.1298 + 150.6 30.0435 41.9697 23.1318 + 150.7 30.476 42.2134 23.1358 + 150.8 30.8981 42.457 23.1478 + 150.9 31.3305 42.6895 23.1548 + 151 31.763 42.9442 23.1248 + 151.1 32.2057 43.1879 23.1448 + 151.2 32.6484 43.4315 23.1538 + 151.3 33.0911 43.6862 23.1468 + 151.4 33.5339 43.9298 23.1388 + 151.5 33.9972 44.1956 23.1468 + 151.6 34.4708 44.4503 23.1458 + 151.7 34.9341 44.7161 23.1367 + 151.8 35.4077 44.9818 23.1547 + 151.9 35.8813 45.2587 23.1367 + 152 36.3652 45.5355 23.1447 + 152.1 36.8491 45.8124 23.1467 + 152.2 37.3434 46.1003 23.1507 + 152.3 37.8376 46.3771 23.1577 + 152.4 38.3421 46.6651 23.1627 + 152.5 38.8363 46.964 23.1597 + 152.6 39.3511 47.2409 23.1737 + 152.7 39.8659 47.5399 23.1777 + 152.8 40.3806 47.8389 23.1677 + 152.9 40.9057 48.1268 23.1917 + 153 41.4205 48.4258 23.1717 + 153.1 41.9456 48.7359 23.1877 + 153.2 42.4913 49.0349 23.1947 + 153.3 43.0164 49.3339 23.1957 + 153.4 43.5518 49.6439 23.2007 + 153.5 44.0872 49.954 23.1897 + 153.6 44.6329 50.2641 23.2046 + 153.7 45.1682 50.552 23.2146 + 153.8 45.7036 50.862 23.2016 + 153.9 46.2596 51.1721 23.1986 + 154 46.795 51.4711 23.2116 + 154.1 47.3407 51.7923 23.1986 + 154.2 47.8864 52.1023 23.2136 + 154.3 48.4423 52.4013 23.1976 + 154.4 48.988 52.7225 23.2046 + 154.5 49.544 53.0325 23.2146 + 154.6 50.0897 53.3426 23.2086 + 154.7 50.6457 53.6527 23.2106 + 154.8 51.1914 53.9627 23.2236 + 154.9 51.7473 54.2839 23.2346 + 155 52.2827 54.5939 23.2376 + 155.1 52.8284 54.9151 23.2335 + 155.2 53.3844 55.2141 23.2555 + 155.3 53.9095 55.5352 23.2645 + 155.4 54.4552 55.8564 23.2725 + 155.5 54.9905 56.1664 23.2745 + 155.6 55.5259 56.4765 23.2765 + 155.7 56.0613 56.7976 23.2875 + 155.8 56.5864 57.0966 23.2905 + 155.9 57.1218 57.4067 23.2955 + 156 57.6469 57.7168 23.2995 + 156.1 58.1823 58.0268 23.2975 + 156.2 58.7074 58.3258 23.3085 + 156.3 59.2325 58.647 23.3135 + 156.4 59.7678 58.957 23.3064 + 156.5 60.2929 59.256 23.3074 + 156.6 60.8283 59.5661 23.3124 + 156.7 61.3431 59.8762 23.3194 + 156.8 61.8785 60.1752 23.3184 + 156.9 62.4139 60.4852 23.3214 + 157 62.9493 60.7953 23.3284 + 157.1 63.4641 61.1054 23.3124 + 157.2 63.9995 61.4044 23.3394 + 157.3 64.5349 61.7255 23.3274 + 157.4 65.0599 62.0356 23.3324 + 157.5 65.6056 62.3346 23.3404 + 157.6 66.1307 62.6336 23.3563 + 157.7 66.6558 62.9547 23.3263 + 157.8 67.1912 63.2648 23.3443 + 157.9 67.7163 63.5749 23.3313 + 158 68.2517 63.8739 23.3413 + 158.1 68.7871 64.1728 23.3523 + 158.2 69.3019 64.494 23.3573 + 158.3 69.8372 64.793 23.3393 + 158.4 70.3623 65.1031 23.3553 + 158.5 70.8874 65.4131 23.3563 + 158.6 71.4125 65.7121 23.3523 + 158.7 71.9376 66.0222 23.3463 + 158.8 72.4524 66.3212 23.3542 + 158.9 72.9672 66.6202 23.3432 + 159 73.4923 66.9192 23.3442 + 159.1 73.9865 67.2292 23.3272 + 159.2 74.5013 67.5172 23.3482 + 159.3 75.0058 67.8051 23.3372 + 159.4 75.5103 68.093 23.3122 + 159.5 76.0045 68.3809 23.3432 + 159.6 76.4987 68.6799 23.3342 + 159.7 76.9929 68.9568 23.3402 + 159.8 77.4871 69.2447 23.3422 + 159.9 77.971 69.5326 23.3321 + 160 78.4549 69.8095 23.3511 + 160.1 78.9388 70.0974 23.3691 + 160.2 79.4227 70.3742 23.3591 + 160.3 79.9066 70.6511 23.3491 + 160.4 80.3802 70.9168 23.3601 + 160.5 80.8538 71.1937 23.3701 + 160.6 81.3275 71.4595 23.3681 + 160.7 81.8011 71.7142 23.3861 + 160.8 82.2644 71.9689 23.3931 + 160.9 82.7277 72.2236 23.3741 + 161 83.2013 72.4672 23.374 + 161.1 83.6646 72.6997 23.38 + 161.2 84.1176 72.9434 23.387 + 161.3 84.581 73.1649 23.385 + 161.4 85.0443 73.3863 23.382 + 161.5 85.4973 73.5967 23.377 + 161.6 85.9606 73.7961 23.373 + 161.7 86.4136 73.9954 23.374 + 161.8 86.8769 74.1837 23.371 + 161.9 87.33 74.3498 23.363 + 162 87.783 74.5159 23.363 + 162.1 88.236 74.6709 23.37 + 162.2 88.689 74.8259 23.3819 + 162.3 89.1523 74.9588 23.3789 + 162.4 89.5951 75.0917 23.3669 + 162.5 90.0481 75.2135 23.3919 + 162.6 90.5011 75.3132 23.3689 + 162.7 90.9438 75.4239 23.3749 + 162.8 91.3968 75.5236 23.3939 + 162.9 91.8499 75.6122 23.3919 + 163 92.2926 75.6897 23.3859 + 163.1 92.7456 75.7672 23.3839 + 163.2 93.178 75.8337 23.3959 + 163.3 93.6413 75.9001 23.3849 + 163.4 94.0738 75.9555 23.3929 + 163.5 94.5268 75.9998 23.3928 + 163.6 94.9695 76.0552 23.3898 + 163.7 95.4019 76.0884 23.3978 + 163.8 95.8447 76.1216 23.3898 + 163.9 96.2874 76.1438 23.3868 + 164 96.7198 76.1659 23.3918 + 164.1 97.1522 76.177 23.3918 + 164.2 97.595 76.177 23.4018 + 164.3 98.0274 76.177 23.3878 + 164.4 98.4804 76.1549 23.3928 + 164.5 98.9128 76.1549 23.3898 + 164.6 99.335 76.1216 23.4008 + 164.7 99.788 76.0884 23.3878 + 164.8 100.22 76.0441 23.3948 + 164.9 100.663 75.9888 23.3968 + 165 101.116 75.9334 23.4097 + 165.1 101.559 75.867 23.4137 + 165.2 102.012 75.7895 23.4137 + 165.3 102.455 75.7009 23.4367 + 165.4 102.918 75.6123 23.4397 + 165.5 103.35 75.5015 23.4497 + 165.6 103.814 75.3797 23.4637 + 165.7 104.256 75.2579 23.4477 + 165.8 104.709 75.114 23.4687 + 165.9 105.152 74.97 23.4747 + 166 105.595 74.8039 23.5037 + 166.1 106.038 74.6267 23.4827 + 166.2 106.47 74.4385 23.4977 + 166.3 106.892 74.2502 23.5137 + 166.4 107.335 74.0509 23.5177 + 166.5 107.757 73.8294 23.5317 + 166.6 108.179 73.619 23.5417 + 166.7 108.591 73.3865 23.5397 + 166.8 109.013 73.1318 23.5596 + 166.9 109.425 72.8882 23.5636 + 167 109.827 72.6335 23.5826 + 167.1 110.228 72.3677 23.5716 + 167.2 110.63 72.0909 23.5826 + 167.3 111 71.814 23.6036 + 167.4 111.392 71.515 23.6136 + 167.5 111.772 71.2271 23.6196 + 167.6 112.153 70.917 23.6176 + 167.7 112.524 70.6181 23.6356 + 167.8 112.905 70.2969 23.6446 + 167.9 113.276 69.9869 23.6476 + 168 113.646 69.6546 23.6526 + 168.1 114.007 69.3335 23.6716 + 168.2 114.388 69.0124 23.6596 + 168.3 114.758 68.6802 23.6716 + 168.4 115.119 68.359 23.6846 + 168.5 115.5 68.0379 23.6876 + 168.6 115.86 67.7167 23.6786 + 168.7 116.241 67.3735 23.6786 + 168.8 116.622 67.0523 23.7096 + 168.9 116.982 66.7423 23.7186 + 169 117.353 66.4211 23.7666 + 169.1 117.724 66.1 23.8096 + 169.2 118.094 65.7899 23.8936 + 169.3 118.465 65.4799 23.9626 + 169.4 118.825 65.1809 24.0706 + 169.5 119.186 64.8708 24.1546 + 169.6 119.536 64.5718 24.2676 + 169.7 119.886 64.2728 24.3715 + 169.8 120.236 63.9738 24.4935 + 169.9 120.576 63.6859 24.6215 + 170 120.926 63.3869 24.7315 + 170.1 121.276 63.099 24.8645 + 170.2 121.626 62.8111 24.9995 + 170.3 121.966 62.5232 25.1305 + 170.4 122.305 62.2353 25.2695 + 170.5 122.635 61.9584 25.3995 + 170.6 122.975 61.6816 25.5395 + 170.7 123.294 61.3937 25.6985 + 170.8 123.634 61.1279 25.8405 + 170.9 123.963 60.8511 25.9895 + 171 124.272 60.5853 26.1455 + 171.1 124.591 60.2974 26.2795 + 171.2 124.91 60.0427 26.4585 + 171.3 125.229 59.7659 26.6095 + 171.4 125.538 59.5112 26.7825 + 171.5 125.837 59.2454 26.9905 + 171.6 126.146 58.9907 27.1925 + 171.7 126.434 58.7249 27.4065 + 171.8 126.743 58.4813 27.6525 + 171.9 127.011 58.2377 27.9005 + 172 127.299 57.9941 28.1445 + 172.1 127.577 57.7505 28.4095 + 172.2 127.855 57.529 28.6915 + 172.3 128.123 57.2854 28.9615 + 172.4 128.38 57.075 29.2575 + 172.5 128.648 56.8535 29.5624 + 172.6 128.905 56.632 29.8504 + 172.7 129.152 56.4216 30.1584 + 172.8 129.399 56.2112 30.4654 + 172.9 129.646 56.0119 30.7594 + 173 129.873 55.8015 31.0754 + 173.1 130.11 55.6022 31.3704 + 173.2 130.347 55.4029 31.6644 + 173.3 130.573 55.2035 31.9494 + 173.4 130.8 55.0153 32.2464 + 173.5 131.026 54.816 32.5474 + 173.6 131.242 54.6166 32.8384 + 173.7 131.469 54.4284 33.1304 + 173.8 131.675 54.2401 33.4074 + 173.9 131.891 54.0519 33.7084 + 174 132.118 53.8636 34.0014 + 174.1 132.324 53.6643 34.2814 + 174.2 132.529 53.4761 34.5824 + 174.3 132.746 53.2878 34.8744 + 174.4 132.962 53.0996 35.1714 + 174.5 133.178 52.9002 35.4624 + 174.6 133.394 52.712 35.7574 + 174.7 133.611 52.5127 36.0624 + 174.8 133.827 52.3244 36.3514 + 174.9 134.033 52.1362 36.6414 + 175 134.259 51.9368 36.9514 + 175.1 134.486 51.7486 37.2344 + 175.2 134.702 51.5493 37.5274 + 175.3 134.918 51.361 37.8114 + 175.4 135.145 51.1617 38.1014 + 175.5 135.371 50.9624 38.3854 + 175.6 135.598 50.763 38.6584 + 175.7 135.814 50.5748 38.9464 + 175.8 136.051 50.3644 39.2173 + 175.9 136.277 50.1651 39.5053 + 176 136.504 49.9657 39.8073 + 176.1 136.73 49.7664 40.0803 + 176.2 136.957 49.556 40.3523 + 176.3 137.194 49.3567 40.6363 + 176.4 137.42 49.1574 40.9223 + 176.5 137.647 48.947 41.2013 + 176.6 137.884 48.7366 41.4783 + 176.7 138.11 48.5262 41.7573 + 176.8 138.347 48.3158 42.0363 + 176.9 138.573 48.1054 42.3213 + 177 138.82 47.8839 42.5863 + 177.1 139.057 47.6735 42.8683 + 177.2 139.294 47.452 43.1463 + 177.3 139.531 47.2306 43.4263 + 177.4 139.778 47.0091 43.6903 + 177.5 140.015 46.7876 43.9363 + 177.6 140.272 46.5551 44.1493 + 177.7 140.53 46.3336 44.3713 + 177.8 140.787 46.09 44.5263 + 177.9 141.044 45.8574 44.6533 + 178 141.312 45.6138 44.7593 + 178.1 141.59 45.3591 44.8223 + 178.2 141.878 45.1044 44.8613 + 178.3 142.167 44.8497 44.9023 + 178.4 142.476 44.5729 44.9133 + 178.5 142.774 44.3071 44.9192 + 178.6 143.093 44.0303 44.9082 + 178.7 143.413 43.7423 44.9252 + 178.8 143.752 43.4433 44.9112 + 178.9 144.082 43.1444 44.9152 + 179 144.411 42.8343 44.8902 + 179.1 144.761 42.5242 44.8962 + 179.2 145.101 42.1809 44.8922 + 179.3 145.431 41.8377 44.8902 + 179.4 145.76 41.4833 44.9012 + 179.5 146.069 41.1289 44.9052 + 179.6 146.398 40.7746 44.9352 + 179.7 146.687 40.3981 44.9302 + 179.8 146.975 40.0216 44.9442 + 179.9 147.243 39.7004 44.9402 + 180 147.5 39.4347 44.9582 + 180.1 147.727 39.1246 44.9682 + 180.2 147.912 38.881 44.9742 + 180.3 148.087 38.6595 44.9692 + 180.4 148.241 38.4712 44.9622 + 180.5 148.375 38.3162 44.9752 + 180.6 148.478 38.1722 44.9902 + 180.7 148.571 38.0504 45.0122 + 180.8 148.643 37.9397 45.0112 + 180.9 148.694 37.84 45.0262 + 181 148.767 37.7404 45.0502 + 181.1 148.818 37.6518 45.0532 + 181.2 148.859 37.5632 45.0582 + 181.3 148.9 37.4857 45.0672 + 181.4 148.942 37.4082 45.0752 + 181.5 148.983 37.3196 45.0702 + 181.6 149.014 37.242 45.0812 + 181.7 149.045 37.1424 45.0732 + 181.8 149.065 37.0427 45.0812 + 181.9 149.086 36.932 45.0762 + 182 149.106 36.7991 45.0952 + 182.1 149.117 36.6551 45.0882 + 182.2 149.117 36.5112 45.1022 + 182.3 149.117 36.334 45.1082 + 182.4 149.117 36.1347 45.1182 + 182.5 149.106 35.9464 45.1182 + 182.6 149.096 35.736 45.1212 + 182.7 149.096 35.5035 45.1282 + 182.8 149.075 35.2709 45.1252 + 182.9 149.065 35.0162 45.1442 + 183 149.045 34.7615 45.1412 + 183.1 149.024 34.4847 45.1582 + 183.2 148.993 34.2078 45.1612 + 183.3 148.952 33.9199 45.1622 + 183.4 148.9 33.632 45.1492 + 183.5 148.849 33.3219 45.1422 + 183.6 148.787 33.0229 45.1232 + 183.7 148.705 32.7239 45.0982 + 183.8 148.643 32.4138 45.0602 + 183.9 148.561 32.1038 45.0372 + 184 148.468 31.7937 45.0262 + 184.1 148.396 31.4726 45.0472 + 184.2 148.303 31.1514 45.0262 + 184.3 148.211 30.8303 45.0372 + 184.4 148.128 30.4981 45.0172 + 184.5 148.025 30.1769 45.0332 + 184.6 147.922 29.8558 45.0182 + 184.7 147.819 29.5346 45.0072 + 184.8 147.696 29.2246 44.9592 + 184.9 147.583 28.9145 44.9182 + 185 147.459 28.6266 44.8602 + 185.1 147.305 28.3276 44.8012 + 185.2 147.171 28.0618 44.7722 + 185.3 146.996 27.796 44.7522 + 185.4 146.831 27.5413 44.7213 + 185.5 146.646 27.3199 44.7153 + 185.6 146.45 27.0984 44.7143 + 185.7 146.244 26.888 44.7023 + 185.8 146.028 26.6776 44.7183 + 185.9 145.801 26.5004 44.7153 + 186 145.606 26.2789 44.7113 + 186.1 145.379 26.0796 44.7173 + 186.2 145.142 25.8913 44.7353 + 186.3 144.916 25.6809 44.7283 + 186.4 144.679 25.4594 44.7323 + 186.5 144.453 25.238 44.7453 + 186.6 144.216 25.0165 44.7413 + 186.7 143.979 24.7839 44.7523 + 186.8 143.732 24.5514 44.7523 + 186.9 143.485 24.3077 44.7633 + 187 143.238 24.0641 44.7563 + 187.1 142.96 23.8316 44.7564 + 187.2 142.682 23.599 44.7684 + 187.3 142.393 23.3665 44.7504 + 187.4 142.105 23.1561 44.7534 + 187.5 141.807 22.9346 44.7604 + 187.6 141.498 22.7242 44.7654 + 187.7 141.158 22.5581 44.7644 + 187.8 140.818 22.3809 44.7604 + 187.9 140.478 22.2258 44.7584 + 188 140.128 22.0929 44.7644 + 188.1 139.778 21.9711 44.7614 + 188.2 139.418 21.8604 44.7604 + 188.3 139.047 21.7607 44.7594 + 188.4 138.677 21.6943 44.7555 + 188.5 138.296 21.6389 44.7595 + 188.6 137.915 21.6057 44.7625 + 188.7 137.544 21.5835 44.7525 + 188.8 137.153 21.5724 44.7585 + 188.9 136.762 21.5835 44.7725 + 189 136.37 21.5946 44.7735 + 189.1 135.969 21.5724 44.7685 + 189.2 135.578 21.5946 44.7585 + 189.3 135.166 21.6057 44.7545 + 189.4 134.744 21.6167 44.7845 + 189.5 134.321 21.6167 44.7865 + 189.6 133.889 21.6056 44.7696 + 189.7 133.457 21.5946 44.7776 + 189.8 133.024 21.5835 44.7816 + 189.9 132.581 21.5724 44.7856 + 190 132.128 21.5613 44.7796 + 190.1 131.675 21.5503 44.7826 + 190.2 131.222 21.5392 44.7796 + 190.3 130.759 21.517 44.7836 + 190.4 130.296 21.5059 44.7876 + 190.5 129.832 21.4727 44.7916 + 190.6 129.369 21.4616 44.7847 + 190.7 128.895 21.4395 44.7857 + 190.8 128.412 21.4173 44.7967 + 190.9 127.938 21.3952 44.7897 + 191 127.464 21.373 44.8087 + 191.1 126.98 21.3509 44.7917 + 191.2 126.507 21.3287 44.8017 + 191.3 126.033 21.2955 44.8037 + 191.4 125.549 21.2844 44.8087 + 191.5 125.065 21.2623 44.8017 + 191.6 124.592 21.2401 44.8077 + 191.7 124.118 21.218 44.8098 + 191.8 123.644 21.1958 44.8198 + 191.9 123.161 21.1737 44.8118 + 192 122.677 21.1515 44.8048 + 192.1 122.213 21.1294 44.8158 + 192.2 121.75 21.1072 44.8228 + 192.3 121.276 21.0961 44.8238 + 192.4 120.803 21.074 44.8248 + 192.5 120.339 21.0518 44.8478 + 192.6 119.886 21.0297 44.8318 + 192.7 119.433 21.0075 44.8488 + 192.8 118.96 20.9965 44.8489 + 192.9 118.538 20.9743 44.8449 + 193 118.095 20.9854 44.8489 + 193.1 117.663 20.9743 44.8449 + 193.2 117.23 20.9522 44.8579 + 193.3 116.808 20.9411 44.8649 + 193.4 116.396 20.8968 44.8489 + 193.5 115.995 20.8525 44.8409 + 193.6 115.603 20.7971 44.8469 + 193.7 115.212 20.7307 44.8519 + 193.8 114.852 20.631 44.8479 + 193.9 114.481 20.5313 44.8539 + 194 114.131 20.4538 44.8379 + 194.1 113.781 20.3431 44.828 + 194.2 113.451 20.2434 44.842 + 194.3 113.132 20.1548 44.83 + 194.4 112.803 20.0662 44.822 + 194.5 112.473 19.9776 44.845 + 194.6 112.144 19.9001 44.842 + 194.7 111.825 19.8226 44.839 + 194.8 111.495 19.7451 44.829 + 194.9 111.166 19.6675 44.831 + 195 110.847 19.59 44.838 + 195.1 110.517 19.5125 44.835 + 195.2 110.188 19.435 44.83 + 195.3 109.848 19.3575 44.84 + 195.4 109.518 19.2799 44.838 + 195.5 109.179 19.2024 44.837 + 195.6 108.829 19.1249 44.836 + 195.7 108.489 19.0585 44.828 + 195.8 108.128 18.9809 44.8351 + 195.9 107.778 18.9034 44.8351 + 196 107.428 18.8259 44.8411 + 196.1 107.068 18.7484 44.8401 + 196.2 106.697 18.6709 44.8341 + 196.3 106.337 18.6044 44.8331 + 196.4 105.977 18.5269 44.8271 + 196.5 105.606 18.4494 44.8241 + 196.6 105.246 18.3276 44.8361 + 196.7 104.885 18.1836 44.8141 + 196.8 104.525 18.0507 44.8171 + 196.9 104.175 17.9178 44.8391 + 197 103.794 17.7849 44.8331 + 197.1 103.464 17.6078 44.8171 + 197.2 103.104 17.4416 44.8101 + 197.3 102.744 17.2866 44.8141 + 197.4 102.394 17.1316 44.8302 + 197.5 102.033 16.9876 44.8292 + 197.6 101.673 16.8326 44.8322 + 197.7 101.313 16.6775 44.8472 + 197.8 100.962 16.5114 44.8452 + 197.9 100.602 16.3453 44.8442 + 198 100.252 16.1681 44.8432 + 198.1 99.8917 15.9909 44.8432 + 198.2 99.5416 15.8138 44.8402 + 198.3 99.1916 15.6255 44.8572 + 198.4 98.8415 15.4483 44.8532 + 198.5 98.4914 15.2711 44.8432 + 198.6 98.1414 15.0829 44.8392 + 198.7 97.8016 14.8836 44.8272 + 198.8 97.4412 14.7064 44.8392 + 198.9 97.0912 14.5181 44.8322 + 199 96.7411 14.3299 44.8233 + 199.1 96.3808 14.1416 44.8253 + 199.2 96.0307 13.9533 44.8343 + 199.3 95.66 13.7651 44.8133 + 199.4 95.31 13.5768 44.8183 + 199.5 94.9496 13.3886 44.8033 + 199.6 94.5893 13.2003 44.8143 + 199.7 94.2289 13.012 44.8093 + 199.8 93.8685 12.8238 44.8083 + 199.9 93.5082 12.6355 44.8013 + 200 93.1478 12.4584 44.8083 + 200.1 92.7875 12.2701 44.8093 + 200.2 92.4271 12.0708 44.7963 + 200.3 92.0565 11.8825 44.8043 + 200.4 91.6858 11.7053 44.7993 + 200.5 91.3254 11.506 44.7973 + 200.6 90.9548 11.3177 44.7913 + 200.7 90.5841 11.1295 44.7933 + 200.8 90.2238 10.9412 44.7964 + 200.9 89.8531 10.753 44.7814 + 201 89.4825 10.5536 44.7924 + 201.1 89.1118 10.3543 44.7934 + 201.2 88.7309 10.166 44.8004 + 201.3 88.3602 9.97778 44.7924 + 201.4 87.9793 9.77845 44.7964 + 201.5 87.5983 9.59019 44.8034 + 201.6 87.238 9.40194 44.7964 + 201.7 86.8364 9.20261 44.7924 + 201.8 86.4658 9.00327 44.8004 + 201.9 86.0745 8.81502 44.7964 + 202 85.6936 8.61569 44.7964 + 202.1 85.3023 8.42743 44.7904 + 202.2 84.9111 8.2281 44.7984 + 202.3 84.5198 8.02877 44.7884 + 202.4 84.1286 7.84051 44.8004 + 202.5 83.7373 7.64118 44.7894 + 202.6 83.3461 7.44185 44.7725 + 202.7 82.9548 7.24251 44.7765 + 202.8 82.5533 7.04318 44.7775 + 202.9 82.162 6.84385 44.7675 + 203 81.7605 6.64452 44.7565 + 203.1 81.359 6.44519 44.7525 + 203.2 80.9677 6.24586 44.7555 + 203.3 80.5662 6.04653 44.7395 + 203.4 80.1749 5.83612 44.7575 + 203.5 79.7631 5.64786 44.7385 + 203.6 79.3615 5.43746 44.7365 + 203.7 78.9497 5.23813 44.7285 + 203.8 78.5584 5.02772 44.7155 + 203.9 78.1466 4.81732 44.7095 + 204 77.7348 4.60691 44.7075 + 204.1 77.3332 4.40758 44.7015 + 204.2 76.9214 4.1861 44.6995 + 204.3 76.5096 3.9757 44.6865 + 204.4 76.0874 3.75422 44.6805 + 204.5 75.6756 3.55489 44.6816 + 204.6 75.2637 3.33341 44.6826 + 204.7 74.8519 3.123 44.6776 + 204.8 74.4401 2.9126 44.6726 + 204.9 74.0179 2.70219 44.6766 + 205 73.5958 2.48072 44.6806 + 205.1 73.1737 2.27031 44.6776 + 205.2 72.7515 2.05991 44.6736 + 205.3 72.3191 1.83843 44.6836 + 205.4 71.897 1.62802 44.6786 + 205.5 71.4542 1.40654 44.6876 + 205.6 71.0218 1.18506 44.6796 + 205.7 70.5791 0.963585 44.6796 + 205.8 70.126 0.742106 44.6756 + 205.9 69.6833 0.509554 44.6776 + 206 69.2097 0.277001 44.6666 + 206.1 68.7464 0.0444481 44.6546 + 206.2 68.2831 -0.199178 44.6676 + 206.3 67.7992 -0.442805 44.6666 + 206.4 67.3255 -0.686432 44.6636 + 206.5 66.8313 -0.941132 44.6696 + 206.6 66.3371 -1.18476 44.6587 + 206.7 65.8326 -1.45053 44.6567 + 206.8 65.3281 -1.70523 44.6557 + 206.9 64.8133 -1.95993 44.6667 + 207 64.2985 -2.22571 44.6647 + 207.1 63.7734 -2.49148 44.6627 + 207.2 63.2483 -2.75726 44.6657 + 207.3 62.7129 -3.02303 44.6637 + 207.4 62.1776 -3.28881 44.6687 + 207.5 61.6525 -3.56565 44.6657 + 207.6 61.1068 -3.82035 44.6667 + 207.7 60.6023 -4.13042 44.6807 + 207.8 60.0875 -4.44049 44.6697 + 207.9 59.5727 -4.73949 44.6887 + 208 59.0888 -5.08278 44.6817 + 208.1 58.6254 -5.43714 44.6877 + 208.2 58.1518 -5.81366 44.6917 + 208.3 57.6679 -6.16802 44.6797 + 208.4 57.2149 -6.53346 44.6857 + 208.5 56.7928 -6.90997 44.6737 + 208.6 56.3706 -7.25326 44.6697 + 208.7 56.0309 -7.55226 44.6537 + 208.8 55.6499 -7.86233 44.6718 + 208.9 55.2998 -8.1281 44.6598 + 209 54.991 -8.39387 44.6268 + 209.1 54.7336 -8.61535 44.6228 + 209.2 54.5276 -8.81468 44.6288 + 209.3 54.3423 -8.99186 44.6258 + 209.4 54.1673 -9.15797 44.6278 + 209.5 54.0128 -9.30193 44.6158 + 209.6 53.8893 -9.42374 44.6168 + 209.7 53.776 -9.54556 44.6208 + 209.8 53.6834 -9.64522 44.6348 + 209.9 53.5804 -9.73381 44.6408 + 210 53.498 -9.81133 44.6548 + 210.1 53.4157 -9.87777 44.6508 + 210.2 53.3436 -9.93314 44.6588 + 210.3 53.2715 -9.97744 44.6688 + 210.4 53.2201 -10.0328 44.6528 + 210.5 53.1789 -10.066 44.6458 + 210.6 53.1274 -10.0882 44.6548 + 210.7 53.0862 -10.1103 44.6438 + 210.8 53.0553 -10.1325 44.6448 + 210.9 53.0244 -10.1435 44.6388 + 211 53.0038 -10.1325 44.6328 + 211.1 52.9832 -10.1435 44.6128 + 211.2 52.9627 -10.1325 44.6198 + 211.3 52.9318 -10.1103 44.6148 + 211.4 52.9215 -10.0993 44.6108 + 211.5 52.8906 -10.066 44.6138 + 211.6 52.8494 -10.0439 44.6038 + 211.7 52.8185 -9.99959 44.5978 + 211.8 52.767 -9.95529 44.5808 + 211.9 52.6847 -9.88885 44.5708 + 212 52.6023 -9.80026 44.5578 + 212.1 52.4993 -9.71167 44.5588 + 212.2 52.3655 -9.58986 44.5598 + 212.3 52.211 -9.45697 44.5638 + 212.4 52.036 -9.29086 44.5668 + 212.5 51.8404 -9.11368 44.5678 + 212.6 51.6139 -8.91436 44.5648 + 212.7 51.3771 -8.70395 44.5658 + 212.8 51.1094 -8.4714 44.5578 + 212.9 50.8314 -8.21671 44.5568 + 213 50.5431 -7.95093 44.5668 + 213.1 50.2342 -7.67409 44.5608 + 213.2 49.8841 -7.3751 44.5578 + 213.3 49.5444 -7.06503 44.5568 + 213.4 49.184 -6.74389 44.5458 + 213.5 48.8134 -6.41168 44.5008 + 213.6 48.4221 -6.06839 44.4318 + 213.7 48.0206 -5.71403 44.3528 + 213.8 47.6293 -5.35967 44.2278 + 213.9 47.2072 -4.99423 44.0948 + 214 46.7644 -4.61772 43.9188 + 214.1 46.332 -4.23014 43.7588 + 214.2 45.879 -3.84255 43.5768 + 214.3 45.4259 -3.43282 43.3598 + 214.4 44.9729 -3.03417 43.1618 + 214.5 44.5199 -2.62444 42.9358 + 214.6 44.0566 -2.20363 42.7108 + 214.7 43.583 -1.78283 42.4779 + 214.8 43.1093 -1.36202 42.2449 + 214.9 42.646 -0.930143 41.9819 + 215 42.1724 -0.509339 41.7439 + 215.1 41.7091 -0.0885345 41.5019 + 215.2 41.2252 0.33227 41.2289 + 215.3 40.7721 0.730927 40.9649 + 215.4 40.3191 1.14066 40.6799 + 215.5 39.8867 1.52824 40.4119 + 215.6 39.5057 1.87153 40.1259 + 215.7 39.1042 2.22589 39.8089 + 215.8 38.7232 2.56918 39.4819 + 215.9 38.3629 2.8571 39.1579 + 216 38.0437 3.13394 38.8079 + 216.1 37.7348 3.37756 38.4739 + 216.2 37.4774 3.61011 38.1189 + 216.3 37.22 3.82052 37.7739 + 216.4 36.9935 4.00877 37.3989 + 216.5 36.7978 4.18595 37.0079 + 216.6 36.6022 4.34098 36.6309 + 216.7 36.4272 4.49602 36.2149 + 216.8 36.283 4.6289 35.8239 + 216.9 36.1286 4.76179 35.4059 + 217 36.005 4.8836 34.9859 + 217.1 35.8815 4.98326 34.5719 + 217.2 35.7785 5.08293 34.1539 + 217.3 35.6859 5.17152 33.7619 + 217.4 35.6035 5.24903 33.3499 + 217.5 35.5211 5.31547 32.9279 + 217.6 35.449 5.37084 32.5339 + 217.7 35.377 5.44836 32.1099 + 217.8 35.3152 5.49265 31.7049 + 217.9 35.274 5.54802 31.2909 + 218 35.2328 5.59232 30.8919 + 218.1 35.2019 5.63661 30.5079 + 218.2 35.1607 5.68091 30.1029 + 218.3 35.1299 5.7252 29.7109 + 218.4 35.099 5.7695 29.2909 + 218.5 35.0784 5.79164 28.8939 + 218.6 35.0578 5.83594 28.4899 + 218.7 35.0372 5.85809 28.0859 + 218.8 35.0475 5.88023 27.6859 + 218.9 35.0475 5.89131 27.3049 + 219 35.0269 5.92453 26.8779 + 219.1 35.0269 5.92453 26.4709 + 219.2 35.0269 5.9356 26.0569 + 219.3 35.0372 5.94667 25.6759 + 219.4 35.0372 5.9356 25.2729 + 219.5 35.0269 5.94667 24.8859 + 219.6 35.0372 5.9356 24.4799 + 219.7 35.0269 5.92453 24.0779 + 219.8 35.0166 5.91345 23.6889 + 219.9 34.996 5.91345 23.2799 + 220 34.996 5.88023 22.9069 + 220.1 34.9857 5.86915 22.5369 + 220.2 34.9857 5.86915 22.2059 + 220.3 35.0063 5.85808 21.8919 + 220.4 35.0166 5.84701 21.6259 + 220.5 35.0371 5.82486 21.3969 + 220.6 35.0577 5.81378 21.1849 + 220.7 35.0989 5.79164 21.0269 + 220.8 35.1195 5.78056 20.8819 + 220.9 35.1195 5.74734 20.7649 + 221 35.1298 5.71412 20.7029 + 221.1 35.1298 5.6809 20.6669 + 221.2 35.1401 5.64768 20.6609 + 221.3 35.1401 5.62553 20.6769 + 221.4 35.1298 5.60338 20.7119 + 221.5 35.1298 5.58123 20.7339 + 221.6 35.1401 5.57016 20.7799 + 221.7 35.1298 5.53694 20.8099 + 221.8 35.1195 5.49264 20.8369 + 221.9 35.0989 5.4705 20.8389 + 222 35.0783 5.43728 20.8429 + 222.1 35.0474 5.41513 20.8699 + 222.2 35.0268 5.40405 20.8649 + 222.3 35.0063 5.39298 20.8639 + 222.4 34.9857 5.38191 20.8689 + 222.5 34.996 5.38191 20.8649 + 222.6 35.0063 5.39298 20.8549 + 222.7 35.0371 5.39298 20.8509 + 222.8 35.068 5.40405 20.8359 + 222.9 35.1092 5.41513 20.8029 + 223 35.1813 5.43728 20.7999 + 223.1 35.2637 5.45942 20.7939 + 223.2 35.3666 5.48157 20.7859 + 223.3 35.449 5.51479 20.7759 + 223.4 35.5108 5.52587 20.7369 + 223.5 35.5725 5.53694 20.7339 + 223.6 35.6549 5.55909 20.7349 + 223.7 35.7064 5.55909 20.7469 + 223.8 35.7373 5.55909 20.7569 + 223.9 35.7682 5.57016 20.7569 + 224 35.7785 5.55909 20.7409 + 224.1 35.7887 5.55909 20.7479 + 224.2 35.7785 5.53694 20.7429 + 224.3 35.7682 5.52587 20.7459 + 224.4 35.7373 5.50372 20.7459 + 224.5 35.6755 5.48157 20.7419 + 224.6 35.6137 5.44835 20.7449 + 224.7 35.5313 5.4262 20.7559 + 224.8 35.449 5.37083 20.7659 + 224.9 35.3357 5.32654 20.7489 + 225 35.2019 5.27117 20.7589 + 225.1 35.0474 5.2158 20.7669 + 225.2 34.9033 5.14936 20.7759 + 225.3 34.7077 5.08291 20.7889 + 225.4 34.5223 5.0054 20.7859 + 225.5 34.3061 4.9168 20.7879 + 225.6 34.0796 4.82821 20.8159 + 225.7 33.8325 4.7507 20.8209 + 225.8 33.5751 4.65103 20.8259 + 225.9 33.3074 4.55137 20.8489 + 226 33.0191 4.4517 20.8369 + 226.1 32.7206 4.34096 20.8549 + 226.2 32.4014 4.23023 20.8629 + 226.3 32.0719 4.11949 20.8719 + 226.4 31.7218 4.00875 20.8809 + 226.5 31.3615 3.87586 20.8969 + 226.6 30.9908 3.74298 20.8899 + 226.7 30.6202 3.62116 20.8859 + 226.8 30.2186 3.48828 20.8969 + 226.9 29.8274 3.34432 20.9099 + 227 29.395 3.21143 20.9019 + 227.1 28.9728 3.06747 20.9069 + 227.2 28.5404 2.91244 20.9039 + 227.3 28.0874 2.76848 20.9079 + 227.4 27.6241 2.61344 20.9179 + 227.5 27.171 2.45841 20.9139 + 227.6 26.6974 2.30337 20.9229 + 227.7 26.2135 2.13727 20.9269 + 227.8 25.7193 1.97116 20.9299 + 227.9 25.2251 1.80505 20.9279 + 228 24.7103 1.65002 20.932 + 228.1 24.1955 1.48391 20.939 + 228.2 23.6704 1.30673 20.948 + 228.3 23.1453 1.12954 20.951 + 228.4 22.6202 0.952363 20.947 + 228.5 22.0848 0.775182 20.958 + 228.6 21.5391 0.598 20.96 + 228.7 20.9832 0.420819 20.957 + 228.8 20.4375 0.232563 20.976 + 228.9 19.8712 0.0553818 20.974 + 229 19.3049 -0.132874 20.974 + 229.1 18.7284 -0.310055 20.989 + 229.2 18.1518 -0.49831 20.986 + 229.3 17.5855 -0.697639 20.995 + 229.4 16.9986 -0.885895 20.989 + 229.5 16.4118 -1.07415 21.006 + 229.6 15.8249 -1.27348 21.003 + 229.7 15.2277 -1.47281 21.001 + 229.8 14.6306 -1.67214 20.999 + 229.9 14.0437 -1.87147 21.007 + 230 13.4362 -2.07079 21.01 + 230.1 12.8288 -2.27012 21.019 + 230.2 12.2316 -2.46945 21.015 + 230.3 11.6241 -2.66878 21.014 + 230.4 11.0064 -2.86811 21.019 + 230.5 10.4195 -3.06744 21.027 + 230.6 9.81205 -3.26677 21.022 + 230.7 9.21489 -3.4661 21.029 + 230.8 8.62802 -3.66543 21.03 + 230.9 8.04115 -3.84261 21.027 + 231 7.46457 -4.04193 21.037 + 231.1 6.888 -4.23019 21.05 + 231.2 6.34231 -4.41844 21.042 + 231.3 5.84811 -4.57348 21.066 + 231.4 5.39509 -4.71744 21.055 + 231.5 4.95236 -4.8614 21.059 + 231.6 4.54052 -4.99428 21.047 + 231.7 4.19046 -5.10502 21.041 + 231.8 3.91247 -5.21576 21.029 + 231.9 3.66536 -5.29328 21.028 + 232 3.43885 -5.38187 21.017 + 232.1 3.24323 -5.45938 20.962 + 232.2 3.0682 -5.52583 20.897 + 232.3 2.92405 -5.58119 20.815 + 232.4 2.77991 -5.62549 20.709 + 232.5 2.67695 -5.68086 20.573 + 232.6 2.5534 -5.72515 20.418 + 232.7 2.46074 -5.76945 20.239 + 232.8 2.36807 -5.81374 20.075 + 232.9 2.2857 -5.84696 19.853 + 233 2.22393 -5.88019 19.611 + 233.1 2.16215 -5.91341 19.338 + 233.2 2.12097 -5.93555 19.081 + 233.3 2.07978 -5.9577 18.789 + 233.4 2.0489 -5.99092 18.504 + 233.5 2.00771 -6.01307 18.2 + 233.6 1.98712 -6.04629 17.905 + 233.7 1.96653 -6.05736 17.615 + 233.8 1.95623 -6.07951 17.363 + 233.9 1.94594 -6.09059 17.128 + 234 1.94594 -6.10166 16.873 + 234.1 1.93564 -6.10166 16.68 + 234.2 1.94594 -6.11273 16.521 + 234.3 1.94594 -6.12381 16.376 + 234.4 1.94594 -6.11273 16.286 + 234.5 1.94594 -6.11273 16.234 + 234.6 1.94594 -6.11273 16.214 + 234.7 1.94594 -6.11273 16.206 + 234.8 1.94594 -6.12381 16.204 + 234.9 1.95623 -6.13488 16.206 + 235 1.94594 -6.15703 16.194 + 235.1 1.94594 -6.15703 16.236 + 235.2 1.95623 -6.15703 16.264 + 235.3 1.95623 -6.1681 16.295 + 235.4 1.96653 -6.1681 16.315 + 235.5 1.96653 -6.17918 16.329 + 235.6 1.96653 -6.17918 16.335 + 235.7 1.96653 -6.19025 16.337 + 235.8 1.98712 -6.20132 16.338 + 235.9 1.98712 -6.2124 16.333 + 236 2.00771 -6.23454 16.322 + 236.1 2.0283 -6.24562 16.309 + 236.2 2.05919 -6.24562 16.314 + 236.3 2.07978 -6.25669 16.314 + 236.4 2.10038 -6.25669 16.296 + 236.5 2.13126 -6.26777 16.295 + 236.6 2.16215 -6.26777 16.277 + 236.7 2.19304 -6.27884 16.276 + 236.8 2.21363 -6.27884 16.273 + 236.9 2.24452 -6.27884 16.268 + 237 2.27541 -6.27884 16.283 + 237.1 2.30629 -6.26777 16.275 + 237.2 2.32689 -6.27884 16.261 + 237.3 2.34748 -6.25669 16.238 + 237.4 2.36807 -6.24562 16.24 + 237.5 2.39896 -6.23454 16.246 + 237.6 2.40925 -6.2124 16.239 + 237.7 2.41955 -6.19025 16.231 + 237.8 2.44014 -6.17918 16.236 + 237.9 2.44014 -6.1681 16.224 + 238 2.45044 -6.14595 16.226 + 238.1 2.47103 -6.11273 16.23 + 238.2 2.48133 -6.06844 16.212 + 238.3 2.48133 -6.01307 16.204 + 238.4 2.50192 -5.93555 16.206 + 238.5 2.51221 -5.83589 16.181 + 238.6 2.5431 -5.71408 16.184 + 238.7 2.5534 -5.55904 16.187 + 238.8 2.58429 -5.38186 16.183 + 238.9 2.61517 -5.19361 16.203 + 239 2.64606 -4.99428 16.187 + 239.1 2.67695 -4.7728 16.187 + 239.2 2.69754 -4.54025 16.183 + 239.3 2.70784 -4.3077 16.205 + 239.4 2.70784 -4.06408 16.199 + 239.5 2.70784 -3.80938 16.204 + 239.6 2.68724 -3.56576 16.212 + 239.7 2.66665 -3.31106 16.212 + 239.8 2.62547 -3.06744 16.2 + 239.9 2.57399 -2.81274 16.196 + 240 2.5328 -2.56912 16.193 + 240.1 2.47103 -2.33657 16.198 + 240.2 2.39896 -2.09295 16.175 + 240.3 2.34748 -1.83825 16.19 + 240.4 2.296 -1.58355 16.193 + 240.5 2.23422 -1.31778 16.178 + 240.6 2.18274 -1.06308 16.181 + 240.7 2.13126 -0.786239 16.187 + 240.8 2.07978 -0.520468 16.181 + 240.9 2.01801 -0.243623 16.182 + 241 1.97682 0.0332215 16.173 + 241.1 1.92534 0.298992 16.185 + 241.2 1.90475 0.55369 16.175 + 241.3 1.86357 0.775165 16.178 + 241.4 1.85327 0.974494 16.156 + 241.5 1.83268 1.16275 16.162 + 241.6 1.82238 1.33993 16.18 + 241.7 1.80179 1.47281 16.176 + 241.8 1.81209 1.58355 16.172 + 241.9 1.81209 1.68322 16.169 + 242 1.81209 1.76073 16.147 + 242.1 1.82238 1.82718 16.151 + 242.2 1.82238 1.89362 16.135 + 242.3 1.84298 1.94899 16.129 + 242.4 1.85327 1.99328 16.086 + 242.5 1.86357 2.0265 16.034 + 242.6 1.86357 2.0708 15.961 + 242.7 1.88416 2.09295 15.848 + 242.8 1.88416 2.12617 15.697 + 242.9 1.90475 2.15939 15.539 + 243 1.92534 2.15939 15.395 + 243.1 1.93564 2.19261 15.224 + 243.2 1.94593 2.20368 15.093 + 243.3 1.95623 2.20368 14.983 + 243.4 1.95623 2.21476 14.887 + 243.5 1.95623 2.20368 14.831 + 243.6 1.94593 2.19261 14.773 + 243.7 1.90475 2.19261 14.754 + 243.8 1.86357 2.17046 14.741 + 243.9 1.82238 2.14832 14.719 + 244 1.75031 2.12617 14.74 + 244.1 1.66794 2.09295 14.744 + 244.2 1.57528 2.0708 14.761 + 244.3 1.47232 2.0265 14.776 + 244.4 1.34877 1.98221 14.792 + 244.5 1.23551 1.92684 14.809 + 244.6 1.09137 1.88254 14.832 + 244.7 0.936931 1.84932 14.832 + 244.8 0.792788 1.78288 14.848 + 244.9 0.628053 1.73858 14.839 + 245 0.463318 1.67214 14.842 + 245.1 0.288287 1.6057 14.851 + 245.2 0.113255 1.55033 14.839 + 245.3 -0.0617757 1.49496 14.857 + 245.4 -0.247103 1.43959 14.845 + 245.5 -0.391246 1.3953 14.81 + 245.6 -0.535389 1.36208 14.792 + 245.7 -0.658941 1.30671 14.806 + 245.8 -0.792788 1.28456 14.819 + 245.9 -0.926636 1.26241 14.812 + 246 -1.0193 1.25134 14.799 + 246.1 -1.12226 1.26241 14.802 + 246.2 -1.22522 1.28456 14.803 + 246.3 -1.31788 1.31778 14.803 + 246.4 -1.42084 1.36208 14.799 + 246.5 -1.54439 1.41744 14.79 + 246.6 -1.64735 1.49496 14.8 + 246.7 -1.76061 1.58355 14.796 + 246.8 -1.88416 1.68322 14.782 + 246.9 -1.99741 1.8161 14.799 + 247 -2.12097 1.94899 14.791 + 247.1 -2.26511 2.10402 14.782 + 247.2 -2.38866 2.27013 14.79 + 247.3 -2.52251 2.44731 14.792 + 247.4 -2.65635 2.62449 14.778 + 247.5 -2.8005 2.81274 14.796 + 247.6 -2.93435 3.01207 14.788 + 247.7 -3.07849 3.22247 14.797 + 247.8 -3.21234 3.44395 14.801 + 247.9 -3.35648 3.66542 14.793 + 248 -3.49033 3.89797 14.804 + 248.1 -3.63447 4.13052 14.802 + 248.2 -3.76832 4.37415 14.785 + 248.3 -3.92276 4.61777 14.78 + 248.4 -4.0669 4.88354 14.773 + 248.5 -4.21104 5.13824 14.768 + 248.6 -4.36548 5.41508 14.765 + 248.7 -4.50962 5.69193 14.769 + 248.8 -4.66406 5.97985 14.774 + 248.9 -4.8288 6.27884 14.771 + 249 -4.97294 6.57783 14.778 + 249.1 -5.12738 6.8879 14.79 + 249.2 -5.30241 7.20904 14.787 + 249.3 -5.45685 7.53018 14.798 + 249.4 -5.61129 7.86239 14.784 + 249.5 -5.77603 8.18353 14.797 + 249.6 -5.93046 8.52682 14.8 + 249.7 -6.1055 8.87011 14.789 + 249.8 -6.24964 9.21339 14.796 + 249.9 -6.42467 9.56775 14.801 + 250 -6.57911 9.91104 14.803 + 250.1 -6.74384 10.2654 14.819 + 250.2 -6.89828 10.6198 14.808 + 250.3 -7.06302 10.9852 14.808 + 250.4 -7.21746 11.3506 14.799 + 250.5 -7.39249 11.7161 14.792 + 250.6 -7.54693 12.0704 14.806 + 250.7 -7.71166 12.4359 14.793 + 250.8 -7.8661 12.8013 14.79 + 250.9 -8.02054 13.1667 14.793 + 251 -8.17498 13.5322 14.798 + 251.1 -8.29853 13.8533 14.785 + 251.2 -8.40149 14.1302 14.758 + 251.3 -8.51474 14.407 14.75 + 251.4 -8.58682 14.6396 14.78 + 251.5 -8.66918 14.8278 14.764 + 251.6 -8.72066 14.9939 14.779 + 251.7 -8.77214 15.1268 14.793 + 251.8 -8.80303 15.2375 14.795 + 251.9 -8.83392 15.3151 14.777 + 252 -8.83392 15.3815 14.753 + 252.1 -8.84421 15.4369 14.741 + 252.2 -8.85451 15.4922 14.749 + 252.3 -8.8648 15.5365 14.738 + 252.4 -8.8751 15.5697 14.739 + 252.5 -8.8854 15.603 14.752 + 252.6 -8.89569 15.6362 14.748 + 252.7 -8.8854 15.6473 14.755 + 252.8 -8.8751 15.6473 14.756 + 252.9 -8.8751 15.6473 14.765 + 253 -8.85451 15.6251 14.76 + 253.1 -8.80303 15.5808 14.764 + 253.2 -8.75155 15.5365 14.75 + 253.3 -8.70007 15.4701 14.75 + 253.4 -8.628 15.3815 14.752 + 253.5 -8.54563 15.2708 14.734 + 253.6 -8.40149 15.1157 14.743 + 253.7 -8.24705 14.9275 14.73 + 253.8 -8.07202 14.7281 14.738 + 253.9 -7.88669 14.4845 14.737 + 254 -7.66018 14.252 14.725 + 254.1 -7.42337 13.9751 14.738 + 254.2 -7.16598 13.6651 14.751 + 254.3 -6.87769 13.3439 14.766 + 254.4 -6.56881 12.9896 14.762 + 254.5 -6.24964 12.613 14.773 + 254.6 -5.89958 12.2255 14.758 + 254.7 -5.53922 11.7936 14.766 + 254.8 -5.15827 11.3617 14.764 + 254.9 -4.75673 10.9077 14.773 + 255 -4.33459 10.4204 14.771 + 255.1 -3.91246 9.93319 14.766 + 255.2 -3.46973 9.41272 14.769 + 255.3 -3.00642 8.88118 14.759 + 255.4 -2.52251 8.33856 14.766 + 255.5 -2.0386 7.7738 14.755 + 255.6 -1.54439 7.19796 14.751 + 255.7 -1.02959 6.61105 14.743 + 255.8 -0.504501 6.01307 14.742 + 255.9 0.0308878 5.38186 14.74 + 256 0.576573 4.76173 14.731 + 256.1 1.13255 4.13052 14.725 + 256.2 1.68854 3.47717 14.731 + 256.3 2.25481 2.82382 14.732 + 256.4 2.84168 2.17046 14.733 + 256.5 3.42855 1.50604 14.738 + 256.6 4.01542 0.819461 14.746 + 256.7 4.61259 0.14396 14.744 + 256.8 5.18916 -0.542615 14.755 + 256.9 5.78632 -1.21812 14.761 + 257 6.39379 -1.91576 14.761 + 257.1 6.98066 -2.60234 14.744 + 257.2 7.58812 -3.28891 14.746 + 257.3 8.17499 -3.98656 14.744 + 257.4 8.76186 -4.67314 14.725 + 257.5 9.34873 -5.35971 14.725 + 257.6 9.94589 -6.04629 14.72 + 257.7 10.5328 -6.73286 14.724 + 257.8 11.099 -7.40836 14.717 + 257.9 11.6756 -8.07279 14.712 + 258 12.2419 -8.73721 14.734 + 258.1 12.7979 -9.39057 14.728 + 258.2 13.3333 -10.0218 14.722 + 258.3 13.8275 -10.6308 14.735 + 258.4 14.2805 -11.1734 14.67 + 258.5 14.7335 -11.7161 14.652 + 258.6 15.1454 -12.2033 14.669 + 258.7 15.5366 -12.6573 14.687 + 258.8 15.8764 -13.056 14.689 + 258.9 16.1852 -13.4103 14.667 + 259 16.4735 -13.7315 14.645 + 259.1 16.7 -13.9973 14.626 + 259.2 16.906 -14.2409 14.624 + 259.3 17.081 -14.4402 14.604 + 259.4 17.2148 -14.6063 14.598 + 259.5 17.3281 -14.7503 14.6 + 259.6 17.4105 -14.8499 14.571 + 259.7 17.4619 -14.9164 14.575 + 259.8 17.4928 -14.9496 14.563 + 259.9 17.4619 -14.9496 14.582 + 260 17.4414 -14.9164 14.58 + 260.1 17.3899 -14.861 14.603 + 260.2 17.3075 -14.7724 14.598 + 260.3 17.2148 -14.6617 14.607 + 260.4 17.1119 -14.5399 14.611 + 260.5 16.9986 -14.407 14.606 + 260.6 16.8648 -14.252 14.598 + 260.7 16.7206 -14.0969 14.608 + 260.8 16.5559 -13.9197 14.59 + 260.9 16.3809 -13.7426 14.605 + 261 16.2161 -13.5543 14.582 + 261.1 16.0411 -13.355 14.591 + 261.2 15.8558 -13.1557 14.575 + 261.3 15.6602 -12.9453 14.581 + 261.4 15.4645 -12.7348 14.568 + 261.5 15.2792 -12.5023 14.561 + 261.6 15.063 -12.2697 14.544 + 261.7 14.8468 -12.0372 14.553 + 261.8 14.6306 -11.7936 14.549 + 261.9 14.4349 -11.5389 14.539 + 262 14.2084 -11.2842 14.543 + 262.1 14.0025 -11.0073 14.533 + 262.2 13.7863 -10.7305 14.535 + 262.3 13.5598 -10.4426 14.517 + 262.4 13.323 -10.1436 14.54 + 262.5 13.0965 -9.84459 14.543 + 262.6 12.8597 -9.53453 14.56 + 262.7 12.6228 -9.21339 14.562 + 262.8 12.386 -8.90332 14.567 + 262.9 12.1389 -8.58218 14.57 + 263 11.8918 -8.27212 14.585 + 263.1 11.6344 -7.9399 14.587 + 263.2 11.3667 -7.60769 14.589 + 263.3 11.1093 -7.27547 14.589 + 263.4 10.8519 -6.93219 14.583 + 263.5 10.5739 -6.57783 14.6 + 263.6 10.3063 -6.22347 14.595 + 263.7 10.0386 -5.8691 14.604 + 263.8 9.76056 -5.50367 14.599 + 263.9 9.49287 -5.13823 14.603 + 264 9.22517 -4.78387 14.622 + 264.1 8.93689 -4.39629 14.614 + 264.2 8.6383 -4.01978 14.624 + 264.3 8.33972 -3.6322 14.618 + 264.4 8.06173 -3.24462 14.615 + 264.5 7.75285 -2.85704 14.612 + 264.6 7.44397 -2.44731 14.611 + 264.7 7.13509 -2.04865 14.616 + 264.8 6.83651 -1.64999 14.616 + 264.9 6.50704 -1.24026 14.61 + 265 6.19816 -0.830533 14.609 + 265.1 5.8584 -0.409729 14.617 + 265.2 5.53922 0.0110748 14.628 + 265.3 5.20975 0.442952 14.635 + 265.4 4.86998 0.87483 14.636 + 265.5 4.53022 1.31778 14.618 + 265.6 4.18016 1.76073 14.635 + 265.7 3.84039 2.20368 14.636 + 265.8 3.48003 2.65771 14.64 + 265.9 3.11967 3.11173 14.647 + 266 2.7902 3.54361 14.655 + 266.1 2.49162 3.94227 14.662 + 266.2 2.21363 4.29663 14.656 + 266.3 1.90475 4.68421 14.649 + 266.4 1.64735 5.00535 14.653 + 266.5 1.42084 5.27112 14.682 + 266.6 1.23551 5.50367 14.696 + 266.7 1.08107 5.68085 14.707 + 266.8 0.926635 5.82481 14.762 + 266.9 0.803084 5.94662 14.793 + 267 0.71042 6.04629 14.847 + 267.1 0.638349 6.10166 14.93 + 267.2 0.576573 6.15703 14.988 + 267.3 0.545685 6.2124 15.089 + 267.4 0.514797 6.24562 15.204 + 267.5 0.494205 6.30099 15.295 + 267.6 0.504501 6.34528 15.358 + 267.7 0.525093 6.38958 15.422 + 267.8 0.576573 6.45602 15.45 + 267.9 0.648645 6.53354 15.493 + 268 0.751604 6.6332 15.505 + 268.1 0.885452 6.74394 15.54 + 268.2 1.02959 6.87682 15.549 + 268.3 1.21492 7.02078 15.56 + 268.4 1.42084 7.17582 15.558 + 268.5 1.64735 7.34192 15.569 + 268.6 1.85327 7.55232 15.572 + 268.7 2.07978 7.76273 15.562 + 268.8 2.296 7.99528 15.556 + 268.9 2.52251 8.26105 15.567 + 269 2.75931 8.53789 15.552 + 269.1 2.97553 8.84796 15.537 + 269.2 3.19174 9.18017 15.552 + 269.3 3.40796 9.55668 15.53 + 269.4 3.63447 9.94426 15.549 + 269.5 3.86098 10.3651 15.562 + 269.6 4.10808 10.7969 15.553 + 269.7 4.34489 11.251 15.561 + 269.8 4.60229 11.7161 15.571 + 269.9 4.84939 12.1922 15.567 + 270 5.11708 12.7016 15.572 + 270.1 5.38478 13.2221 15.577 + 270.2 5.65247 13.7426 15.578 + 270.3 5.96135 14.2741 15.565 + 270.4 6.25993 14.8167 15.564 + 270.5 6.56881 15.3704 15.565 + 270.6 6.88798 15.9241 15.549 + 270.7 7.23805 16.4999 15.552 + 270.8 7.58811 17.0758 15.538 + 270.9 7.95876 17.6516 15.52 + 271 8.33971 18.2496 15.506 + 271.1 8.75155 18.8587 15.503 + 271.2 9.18398 19.4788 15.498 + 271.3 9.637 20.0989 15.499 + 271.4 10.1106 20.7301 15.494 + 271.5 10.6048 21.3724 15.478 + 271.6 11.1093 22.0368 15.486 + 271.7 11.655 22.7013 15.4729 + 271.8 12.211 23.3657 15.4979 + 271.9 12.7876 24.0412 15.4949 + 272 13.3847 24.7389 15.4869 + 272.1 14.0128 25.4254 15.4979 + 272.2 14.6408 26.1231 15.4979 + 272.3 15.2895 26.8318 15.4869 + 272.4 15.9587 27.5294 15.4909 + 272.5 16.6382 28.2492 15.4849 + 272.6 17.3281 28.958 15.4809 + 272.7 18.0385 29.6778 15.4879 + 272.8 18.7592 30.3976 15.5029 + 272.9 19.4902 31.1284 15.4919 + 273 20.2315 31.8704 15.4869 + 273.1 20.9831 32.5902 15.5009 + 273.2 21.7347 33.321 15.5089 + 273.3 22.5069 34.0408 15.5099 + 273.4 23.2688 34.7717 15.5089 + 273.5 24.0307 35.4915 15.5319 + 273.6 24.8029 36.2113 15.5308 + 273.7 25.5648 36.9311 15.5278 + 273.8 26.3267 37.6398 15.5488 + 273.9 27.0886 38.3596 15.5348 + 274 27.8402 39.0573 15.5388 + 274.1 28.6021 39.7549 15.5388 + 274.2 29.364 40.4637 15.5338 + 274.3 30.1156 41.1613 15.5388 + 274.4 30.8775 41.859 15.5318 + 274.5 31.6291 42.5455 15.5318 + 274.6 32.391 43.2321 15.5268 + 274.7 33.1426 43.9187 15.5208 + 274.8 33.9045 44.6053 15.5208 + 274.9 34.6561 45.2808 15.5177 + 275 35.4077 45.9563 15.5097 + 275.1 36.1593 46.6318 15.5017 + 275.2 36.9212 47.2962 15.4937 + 275.3 37.6728 47.9717 15.4927 + 275.4 38.4347 48.6361 15.4877 + 275.5 39.1863 49.3116 15.4817 + 275.6 39.9482 49.9761 15.4807 + 275.7 40.6998 50.6516 15.4737 + 275.8 41.4617 51.316 15.4817 + 275.9 42.2339 51.9804 15.4816 + 276 42.9957 52.6449 15.4776 + 276.1 43.7576 53.3204 15.4736 + 276.2 44.5401 53.9848 15.4866 + 276.3 45.3123 54.6603 15.4876 + 276.4 46.0948 55.3358 15.4776 + 276.5 46.8773 56.0113 15.4746 + 276.6 47.6598 56.6757 15.4826 + 276.7 48.4526 57.3512 15.4876 + 276.8 49.2454 58.0267 15.4975 + 276.9 50.0381 58.7022 15.4835 + 277 50.8412 59.3888 15.4855 + 277.1 51.634 60.0643 15.4785 + 277.2 52.4371 60.7398 15.4915 + 277.3 53.2505 61.4264 15.4865 + 277.4 54.0638 62.1019 15.4875 + 277.5 54.8772 62.7774 15.4885 + 277.6 55.6906 63.464 15.4864 + 277.7 56.504 64.1506 15.4854 + 277.8 57.3276 64.8371 15.4744 + 277.9 58.1513 65.5127 15.4854 + 278 58.975 66.2103 15.4764 + 278.1 59.7986 66.908 15.4824 + 278.2 60.6326 67.5945 15.4844 + 278.3 61.4563 68.2922 15.4793 + 278.4 62.3005 68.9898 15.4843 + 278.5 63.1345 69.6875 15.4923 + 278.6 63.9788 70.3851 15.4893 + 278.7 64.823 71.0828 15.4983 + 278.8 65.6673 71.7694 15.4983 + 278.9 66.5115 72.4781 15.5022 + 279 67.3558 73.1758 15.5092 + 279.1 68.2001 73.8734 15.5192 + 279.2 69.0443 74.5821 15.5272 + 279.3 69.8886 75.2798 15.5222 + 279.4 70.7328 75.9774 15.5582 + 279.5 71.5771 76.6862 15.6101 + 279.6 72.4214 77.3727 15.6731 + 279.7 73.2553 78.0593 15.7641 + 279.8 74.0893 78.7459 15.8681 + 279.9 74.9336 79.4214 15.9941 + 280 75.7675 80.0969 16.138 + 280.1 76.6015 80.7724 16.3 + 280.2 77.4355 81.4479 16.454 + 280.3 78.2591 82.1013 16.629 + 280.4 79.0828 82.7768 16.815 + 280.5 79.9065 83.4412 16.993 + 280.6 80.7301 84.0946 17.1639 + 280.7 81.5435 84.759 17.3429 + 280.8 82.3672 85.4124 17.5249 + 280.9 83.1703 86.0658 17.7039 + 281 83.9836 86.7191 17.8749 + 281.1 84.797 87.3614 18.0598 + 281.2 85.5898 88.0148 18.2308 + 281.3 86.3929 88.657 18.4088 + 281.4 87.1857 89.2883 18.5868 + 281.5 87.9681 89.9195 18.7598 + 281.6 88.7403 90.5507 18.9337 + 281.7 89.5125 91.1708 19.1057 + 281.8 90.2744 91.7799 19.2767 + 281.9 91.026 92.3779 19.4527 + 282 91.757 92.9759 19.6217 + 282.1 92.488 93.5739 19.7716 + 282.2 93.2088 94.1497 19.9396 + 282.3 93.9295 94.7256 20.1136 + 282.4 94.6296 95.2903 20.2706 + 282.5 95.3194 95.844 20.4176 + 282.6 96.0092 96.3977 20.5955 + 282.7 96.6785 96.9403 20.7535 + 282.8 97.3477 97.483 20.9135 + 282.9 98.0066 98.0145 21.0745 + 283 98.6553 98.5461 21.2215 + 283.1 99.3039 99.0665 21.3765 + 283.2 99.9423 99.5759 21.5374 + 283.3 100.57 100.085 21.6974 + 283.4 101.209 100.584 21.8444 + 283.5 101.826 101.093 22.0094 + 283.6 102.444 101.591 22.1634 + 283.7 103.072 102.079 22.2953 + 283.8 103.68 102.577 22.4383 + 283.9 104.277 103.064 22.5763 + 284 104.895 103.551 22.7053 + 284.1 105.492 104.039 22.8323 + 284.2 106.089 104.515 22.9473 + 284.3 106.686 104.991 23.0632 + 284.4 107.294 105.478 23.1562 + 284.5 107.87 105.955 23.2452 + 284.6 108.467 106.431 23.2972 + 284.7 109.054 106.907 23.3422 + 284.8 109.651 107.372 23.3861 + 284.9 110.218 107.837 23.4071 + 285 110.794 108.302 23.4271 + 285.1 111.34 108.767 23.4491 + 285.2 111.906 109.221 23.4491 + 285.3 112.462 109.664 23.4501 + 285.4 113.008 110.107 23.443 + 285.5 113.553 110.539 23.445 + 285.6 114.109 110.938 23.435 + 285.7 114.665 111.325 23.436 + 285.8 115.252 111.669 23.39 + 285.9 115.818 112.001 23.406 + 286 116.395 112.289 23.3819 + 286.1 117.002 112.521 23.4039 + 286.2 117.6 112.721 23.3989 + 286.3 118.197 112.865 23.3869 + 286.4 118.804 112.975 23.3799 + 286.5 119.401 113.042 23.3789 + 286.6 119.988 113.097 23.3789 + 286.7 120.585 113.097 23.3849 + 286.8 121.162 113.119 23.3888 + 286.9 121.759 113.153 23.3678 + 287 122.336 113.153 23.3788 + 287.1 122.892 113.153 23.3978 + 287.2 123.396 113.164 23.4328 + 287.3 123.911 113.175 23.4268 + 287.4 124.395 113.219 23.4338 + 287.5 124.827 113.241 23.4458 + 287.6 125.229 113.263 23.4568 + 287.7 125.569 113.286 23.4558 + 287.8 125.888 113.274 23.4437 + 287.9 126.145 113.286 23.4667 + 288 126.403 113.286 23.4727 + 288.1 126.619 113.286 23.4757 + 288.2 126.804 113.297 23.4937 + 288.3 126.979 113.286 23.4997 + 288.4 127.134 113.297 23.5067 + 288.5 127.288 113.286 23.5127 + 288.6 127.432 113.297 23.5207 + 288.7 127.576 113.297 23.5117 + 288.8 127.721 113.286 23.5137 + 288.9 127.875 113.274 23.5027 + 289 128.029 113.263 23.5077 + 289.1 128.204 113.23 23.5107 + 289.2 128.39 113.197 23.5097 + 289.3 128.596 113.164 23.5297 + 289.4 128.822 113.108 23.5297 + 289.5 129.069 113.053 23.5237 + 289.6 129.347 112.987 23.5197 + 289.7 129.625 112.92 23.5407 + 289.8 129.903 112.843 23.5267 + 289.9 130.222 112.754 23.5277 + 290 130.552 112.654 23.5367 + 290.1 130.902 112.566 23.5437 + 290.2 131.252 112.455 23.5457 + 290.3 131.633 112.344 23.5576 + 290.4 132.014 112.222 23.5506 + 290.5 132.415 112.101 23.5576 + 290.6 132.827 111.979 23.5586 + 290.7 133.249 111.846 23.5666 + 290.8 133.692 111.702 23.5606 + 290.9 134.135 111.569 23.5596 + 291 134.598 111.414 23.5636 + 291.1 135.072 111.27 23.5656 + 291.2 135.556 111.115 23.5636 + 291.3 136.05 110.96 23.5586 + 291.4 136.554 110.794 23.5756 + 291.5 137.069 110.628 23.5746 + 291.6 137.584 110.451 23.5686 + 291.7 138.119 110.296 23.5775 + 291.8 138.665 110.141 23.5785 + 291.9 139.221 109.997 23.5985 + 292 139.787 109.853 23.5895 + 292.1 140.354 109.709 23.5895 + 292.2 140.951 109.576 23.5905 + 292.3 141.548 109.443 23.6005 + 292.4 142.145 109.321 23.6005 + 292.5 142.742 109.199 23.5965 + 292.6 143.36 109.067 23.6065 + 292.7 143.967 108.934 23.6084 + 292.8 144.596 108.801 23.6034 + 292.9 145.213 108.657 23.6204 + 293 145.831 108.513 23.6164 + 293.1 146.459 108.38 23.6384 + 293.2 147.077 108.236 23.6244 + 293.3 147.674 108.048 23.6334 + 293.4 148.271 107.848 23.6274 + 293.5 148.837 107.649 23.6354 + 293.6 149.393 107.483 23.6643 + 293.7 149.97 107.328 23.6233 + 293.8 150.495 107.107 23.6303 + 293.9 151 106.896 23.6453 + 294 151.514 106.708 23.6583 + 294.1 151.988 106.52 23.6643 + 294.2 152.4 106.387 23.6683 + 294.3 152.822 106.221 23.6753 + 294.4 153.213 106.099 23.6653 + 294.5 153.563 105.977 23.6583 + 294.6 153.913 105.855 23.6623 + 294.7 154.212 105.733 23.6683 + 294.8 154.49 105.623 23.6793 + 294.9 154.788 105.512 23.6902 + 295 155.087 105.401 23.6992 + 295.1 155.396 105.279 23.7102 + 295.2 155.715 105.158 23.7232 + 295.3 156.045 105.036 23.7332 + 295.4 156.395 104.903 23.7262 + 295.5 156.734 104.77 23.7412 + 295.6 157.105 104.626 23.7472 + 295.7 157.476 104.482 23.7452 + 295.8 157.857 104.338 23.7502 + 295.9 158.248 104.172 23.7532 + 296 158.66 104.017 23.7602 + 296.1 159.082 103.851 23.7462 + 296.2 159.514 103.685 23.7532 + 296.3 159.957 103.508 23.7562 + 296.4 160.42 103.342 23.7581 + 296.5 160.873 103.153 23.7651 + 296.6 161.357 102.976 23.7591 + 296.7 161.841 102.788 23.7511 + 296.8 162.346 102.6 23.7641 + 296.9 162.85 102.411 23.7811 + 297 163.365 102.212 23.7721 + 297.1 163.89 102.013 23.7751 + 297.2 164.425 101.813 23.7841 + 297.3 164.971 101.603 23.7931 + 297.4 165.507 101.404 23.788 + 297.5 166.063 101.193 23.806 + 297.6 166.619 100.983 23.806 + 297.7 167.175 100.784 23.807 + 297.8 167.73 100.562 23.822 + 297.9 168.297 100.363 23.819 + 298 168.842 100.152 23.826 + 298.1 169.388 99.942 23.836 + 298.2 169.862 99.7648 23.86 + 298.3 170.325 99.5766 23.8249 + 298.4 170.788 99.3994 23.8329 + 298.5 171.19 99.2555 23.8139 + 298.6 171.53 99.1226 23.8169 + 298.7 171.828 99.0008 23.8429 + 298.8 172.086 98.9011 23.8499 + 298.9 172.322 98.8014 23.8609 + 299 172.518 98.6686 23.8479 + 299.1 172.703 98.58 23.8569 + 299.2 172.878 98.5135 23.8639 + 299.3 173.043 98.4249 23.8679 + 299.4 173.187 98.3364 23.8909 + 299.5 173.342 98.2367 23.8949 + 299.6 173.496 98.1481 23.8959 + 299.7 173.651 98.0595 23.8939 + 299.8 173.815 97.9599 23.8949 + 299.9 173.99 97.8602 23.9039 + 300 174.165 97.7384 23.9009 + 300.1 174.361 97.6166 23.9089 + 300.2 174.567 97.4726 23.9019 + 300.3 174.783 97.3287 23.9119 + 300.4 175.01 97.1626 23.9079 + 300.5 175.247 96.9854 23.9079 + 300.6 175.504 96.8082 23.9218 + 300.7 175.761 96.6089 23.9148 + 300.8 176.029 96.3985 23.9138 + 300.9 176.317 96.177 23.9238 + 301 176.595 95.9555 23.9368 + 301.1 176.904 95.723 23.9288 + 301.2 177.213 95.4683 23.9278 + 301.3 177.532 95.2025 23.9298 + 301.4 177.851 94.9257 23.9338 + 301.5 178.181 94.6488 23.9398 + 301.6 178.521 94.3498 23.9468 + 301.7 178.85 94.0509 23.9548 + 301.8 179.19 93.7297 23.9458 + 301.9 179.519 93.3975 23.9478 + 302 179.859 93.0542 23.9548 + 302.1 180.209 92.6999 23.9608 + 302.2 180.539 92.3344 23.9548 + 302.3 180.889 91.969 23.9428 + 302.4 181.229 91.5814 23.9598 + 302.5 181.589 91.1828 23.9608 + 302.6 181.939 90.7841 23.9578 + 302.7 182.279 90.3744 23.9598 + 302.8 182.639 89.9647 23.9677 + 302.9 182.999 89.5328 23.9647 + 303 183.36 89.0898 23.9597 + 303.1 183.72 88.6469 23.9627 + 303.2 184.07 88.1929 23.9577 + 303.3 184.42 87.7278 23.9537 + 303.4 184.77 87.2516 23.9607 + 303.5 185.12 86.7754 23.9527 + 303.6 185.46 86.2882 23.9607 + 303.7 185.8 85.7788 23.9567 + 303.8 186.129 85.2694 23.9637 + 303.9 186.449 84.7379 23.9647 + 304 186.778 84.2063 23.9697 + 304.1 187.097 83.6748 23.9777 + 304.2 187.416 83.1322 23.9767 + 304.3 187.705 82.5785 23.9817 + 304.4 188.014 82.0248 23.9747 + 304.5 188.323 81.4601 23.9757 + 304.6 188.621 80.9064 23.9847 + 304.7 188.909 80.3305 23.9837 + 304.8 189.187 79.7436 23.9837 + 304.9 189.445 79.1456 23.9747 + 305 189.671 78.5477 23.9677 + 305.1 189.898 77.9497 23.9667 + 305.2 190.063 77.3406 23.9667 + 305.3 190.196 76.7205 23.9877 + 305.4 190.289 76.1114 23.9737 + 305.5 190.361 75.5024 23.9917 + 305.6 190.402 74.8933 24.0007 + 305.7 190.444 74.2953 24.0057 + 305.8 190.505 73.7084 23.9987 + 305.9 190.526 73.1437 24.0117 + 306 190.536 72.6453 24.0357 + 306.1 190.536 72.147 24.0187 + 306.2 190.577 71.6598 24.0097 + 306.3 190.619 71.239 24.0008 + 306.4 190.65 70.8182 24.0108 + 306.5 190.67 70.4195 24.0008 + 306.6 190.691 70.043 23.9868 + 306.7 190.691 69.6776 24.0028 + 306.8 190.691 69.29 24.0278 + 306.9 190.68 68.9024 24.0498 + 307 190.66 68.5148 24.0648 + 307.1 190.629 68.1161 24.0798 + 307.2 190.577 67.7175 24.0958 + 307.3 190.536 67.3299 24.0948 + 307.4 190.485 66.9423 24.1098 + 307.5 190.454 66.5547 24.1298 + 307.6 190.392 66.1782 24.1288 + 307.7 190.33 65.7906 24.1278 + 307.8 190.279 65.4141 24.1348 + 307.9 190.227 65.0376 24.1448 + 308 190.186 64.6611 24.1378 + 308.1 190.155 64.2846 24.1588 + 308.2 190.114 63.9192 24.1938 + 308.3 190.073 63.5537 24.2359 + 308.4 190.032 63.1772 24.3309 + 308.5 189.991 62.8118 24.4229 + 308.6 189.96 62.4464 24.5459 + 308.7 189.919 62.0588 24.6899 + 308.8 189.888 61.6823 24.8299 + 308.9 189.836 61.3058 24.9989 + 309 189.795 60.9071 25.1669 + 309.1 189.764 60.4974 25.3299 + 309.2 189.702 60.0987 25.4999 + 309.3 189.661 59.6779 25.6969 + 309.4 189.62 59.2571 25.8789 + 309.5 189.569 58.8363 26.0879 + 309.6 189.527 58.4155 26.2939 + 309.7 189.476 57.9836 26.5269 + 309.8 189.425 57.5628 26.7419 + 309.9 189.383 57.1309 26.9749 + 310 189.332 56.6991 27.2129 + 310.1 189.28 56.2672 27.4579 + 310.2 189.239 55.8353 27.6859 + 310.3 189.188 55.4034 27.925 + 310.4 189.147 54.9605 28.163 + 310.5 189.085 54.5175 28.409 + 310.6 189.033 54.0635 28.649 + 310.7 188.982 53.6095 28.867 + 310.8 188.91 53.1555 29.101 + 310.9 188.869 52.6904 29.319 + 311 188.797 52.2253 29.524 + 311.1 188.735 51.7491 29.733 + 311.2 188.673 51.2729 29.952 + 311.3 188.601 50.7967 30.141 + 311.4 188.55 50.2984 30.342 + 311.5 188.488 49.8001 30.523 + 311.6 188.416 49.3018 30.698 + 311.7 188.344 48.8035 30.873 + 311.8 188.272 48.2941 30.998 + 311.9 188.22 47.7847 31.141 + 312 188.148 47.2642 31.2391 + 312.1 188.066 46.7437 31.3191 + 312.2 187.953 46.2233 31.3861 + 312.3 187.808 45.7028 31.4091 + 312.4 187.685 45.1934 31.4221 + 312.5 187.51 44.6951 31.4461 + 312.6 187.304 44.2189 31.4531 + 312.7 187.057 43.7427 31.4421 + 312.8 186.799 43.2887 31.4481 + 312.9 186.501 42.8679 31.4391 + 313 186.182 42.4803 31.4461 + 313.1 185.862 42.0927 31.4372 + 313.2 185.523 41.7273 31.4442 + 313.3 185.173 41.3618 31.4412 + 313.4 184.823 41.0075 31.4162 + 313.5 184.473 40.642 31.4162 + 313.6 184.133 40.2876 31.3992 + 313.7 183.772 39.9111 31.4002 + 313.8 183.412 39.5346 31.4112 + 313.9 183.072 39.147 31.4113 + 314 182.722 38.7484 31.4123 + 314.1 182.383 38.3497 31.4193 + 314.2 182.022 37.94 31.4163 + 314.3 181.672 37.5302 31.4153 + 314.4 181.322 37.1094 31.4173 + 314.5 180.972 36.6997 31.4163 + 314.6 180.612 36.2789 31.4233 + 314.7 180.262 35.847 31.4264 + 314.8 179.901 35.4151 31.4304 + 314.9 179.551 34.9943 31.4284 + 315 179.191 34.5624 31.4294 + 315.1 178.83 34.1305 31.4304 + 315.2 178.449 33.6987 31.3954 + 315.3 178.099 33.2778 31.3324 + 315.4 177.739 32.846 31.2644 + 315.5 177.368 32.4252 31.1435 + 315.6 176.987 32.0265 30.9965 + 315.7 176.617 31.6278 30.8015 + 315.8 176.226 31.2513 30.5955 + 315.9 175.845 30.8859 30.3555 + 316 175.453 30.5426 30.1105 + 316.1 175.052 30.2325 29.8565 + 316.2 174.63 29.9667 29.6025 + 316.3 174.228 29.7231 29.4186 + 316.4 173.806 29.5127 29.2096 + 316.5 173.394 29.3134 29.0266 + 316.6 173.013 29.0808 28.8956 + 316.7 172.591 28.8815 28.7496 + 316.8 172.2 28.6821 28.6986 + 316.9 171.86 28.5049 28.6966 + 317 171.551 28.3056 28.6766 + 317.1 171.263 28.1284 28.7256 + 317.2 171.036 27.9845 28.7886 + 317.3 170.851 27.8737 28.9147 + 317.4 170.686 27.763 29.0827 + 317.5 170.573 27.6633 29.2597 + 317.6 170.48 27.5969 29.5257 + 317.7 170.388 27.5304 29.7987 + 317.8 170.305 27.4751 30.0967 + 317.9 170.233 27.4197 30.4137 + 318 170.161 27.3643 30.7587 + 318.1 170.11 27.309 31.0987 + 318.2 170.038 27.2647 31.4347 + 318.3 169.966 27.2204 31.7397 + 318.4 169.904 27.1761 32.0597 + 318.5 169.842 27.1429 32.3907 + 318.6 169.801 27.1096 32.7337 + 318.7 169.739 27.0764 33.0767 + 318.8 169.688 27.0432 33.3887 + 318.9 169.636 27.01 33.6917 + 319 169.564 26.9768 34.0097 + 319.1 169.513 26.9325 34.3227 + 319.2 169.43 26.8882 34.6187 + 319.3 169.348 26.8439 34.9117 + 319.4 169.255 26.7885 35.2177 + 319.5 169.152 26.7331 35.4997 + 319.6 169.039 26.6667 35.7747 + 319.7 168.916 26.6003 36.0397 + 319.8 168.772 26.5227 36.2897 + 319.9 168.627 26.4452 36.5317 + 320 168.452 26.3566 36.7607 + 320.1 168.288 26.268 36.9997 + 320.2 168.092 26.1905 37.2317 + 320.3 167.896 26.1019 37.4487 + 320.4 167.69 26.0133 37.6617 + 320.5 167.474 25.9247 37.8657 + 320.6 167.237 25.8251 38.0508 + 320.7 167.021 25.7365 38.2648 + 320.8 166.764 25.6479 38.4538 + 320.9 166.506 25.5482 38.6238 + 321 166.249 25.4596 38.8138 + 321.1 165.961 25.371 38.9738 + 321.2 165.693 25.2824 39.1528 + 321.3 165.395 25.1828 39.3038 + 321.4 165.096 25.1053 39.4478 + 321.5 164.787 25.0277 39.5938 + 321.6 164.478 24.9502 39.7278 + 321.7 164.149 24.8838 39.8458 + 321.8 163.819 24.8284 39.9758 + 321.9 163.479 24.773 40.0899 + 322 163.129 24.7287 40.1949 + 322.1 162.779 24.6844 40.3129 + 322.2 162.429 24.6401 40.4439 + 322.3 162.069 24.6069 40.5489 + 322.4 161.698 24.5737 40.6699 + 322.5 161.338 24.5294 40.8019 + 322.6 160.947 24.4962 40.9139 + 322.7 160.576 24.4519 41.0569 + 322.8 160.205 24.4186 41.1979 + 322.9 159.814 24.3743 41.306 + 323 159.433 24.3411 41.431 + 323.1 159.042 24.3079 41.553 + 323.2 158.651 24.2747 41.664 + 323.3 158.259 24.2414 41.789 + 323.4 157.848 24.2082 41.893 + 323.5 157.456 24.1861 42.001 + 323.6 157.055 24.1639 42.114 + 323.7 156.643 24.1307 42.227 + 323.8 156.231 24.1196 42.328 + 323.9 155.819 24.0975 42.4211 + 324 155.408 24.0753 42.5301 + 324.1 154.996 24.0753 42.6341 + 324.2 154.574 24.0642 42.7331 + 324.3 154.151 24.0642 42.8141 + 324.4 153.729 24.0642 42.9061 + 324.5 153.307 24.0753 42.9961 + 324.6 152.875 24.0974 43.0711 + 324.7 152.442 24.1306 43.1601 + 324.8 152.02 24.1639 43.2401 + 324.9 151.577 24.1971 43.3042 + 325 151.155 24.2303 43.4012 + 325.1 150.723 24.2857 43.4702 + 325.2 150.301 24.341 43.5482 + 325.3 149.858 24.3964 43.6262 + 325.4 149.436 24.4628 43.6992 + 325.5 149.003 24.5182 43.7952 + 325.6 148.581 24.5957 43.8672 + 325.7 148.149 24.6732 43.9512 + 325.8 147.716 24.7507 44.0322 + 325.9 147.274 24.8282 44.1133 + 326 146.841 24.9168 44.1803 + 326.1 146.409 24.9943 44.2513 + 326.2 145.976 25.0829 44.3383 + 326.3 145.534 25.1826 44.4093 + 326.4 145.091 25.2712 44.4743 + 326.5 144.638 25.3598 44.5363 + 326.6 144.206 25.4594 44.6083 + 326.7 143.753 25.5591 44.6953 + 326.8 143.32 25.6477 44.7743 + 326.9 142.867 25.7473 44.8503 + 327 142.424 25.8359 44.9034 + 327.1 141.971 25.9245 44.9674 + 327.2 141.518 25.9799 45.0054 + 327.3 141.065 26.0242 45.0524 + 327.4 140.612 26.0795 45.1044 + 327.5 140.17 26.1017 45.1404 + 327.6 139.706 26.1017 45.1794 + 327.7 139.253 26.1017 45.2154 + 327.8 138.79 26.0906 45.2444 + 327.9 138.337 26.0574 45.2584 + 328 137.884 26.0241 45.3015 + 328.1 137.42 26.002 45.3145 + 328.2 136.967 25.9688 45.3375 + 328.3 136.514 25.9245 45.3415 + 328.4 136.041 25.9023 45.3355 + 328.5 135.598 25.8691 45.3555 + 328.6 135.135 25.8469 45.3495 + 328.7 134.671 25.8248 45.3565 + 328.8 134.208 25.8026 45.3675 + 328.9 133.755 25.7805 45.3715 + 329 133.292 25.7583 45.3686 + 329.1 132.839 25.7362 45.3756 + 329.2 132.375 25.7251 45.3846 + 329.3 131.922 25.7029 45.3856 + 329.4 131.459 25.6808 45.3866 + 329.5 131.006 25.6476 45.3946 + 329.6 130.553 25.6254 45.4016 + 329.7 130.09 25.5922 45.3876 + 329.8 129.647 25.559 45.4126 + 329.9 129.184 25.5147 45.4176 + 330 128.741 25.4704 45.4207 + 330.1 128.288 25.415 45.4287 + 330.2 127.835 25.3486 45.4387 + 330.3 127.392 25.2932 45.4537 + 330.4 126.949 25.2046 45.4587 + 330.5 126.496 25.1381 45.4557 + 330.6 126.064 25.0495 45.4537 + 330.7 125.632 24.961 45.4867 + 330.8 125.199 24.8724 45.4887 + 330.9 124.767 24.7727 45.4967 + 331 124.334 24.6841 45.5017 + 331.1 123.902 24.5844 45.5107 + 331.2 123.48 24.4958 45.5288 + 331.3 123.047 24.3962 45.5288 + 331.4 122.615 24.2965 45.5368 + 331.5 122.182 24.2079 45.5388 + 331.6 121.76 24.1082 45.5458 + 331.7 121.328 24.0196 45.5588 + 331.8 120.906 23.92 45.5658 + 331.9 120.473 23.8425 45.5618 + 332 120.041 23.7428 45.5688 + 332.1 119.619 23.6542 45.5798 + 332.2 119.176 23.5545 45.5768 + 332.3 118.744 23.4659 45.5849 + 332.4 118.321 23.3773 45.5899 + 332.5 117.879 23.2777 45.5849 + 332.6 117.446 23.1891 45.6079 + 332.7 117.004 23.1005 45.6109 + 332.8 116.571 23.0119 45.6009 + 332.9 116.128 22.9233 45.6099 + 333 115.696 22.8347 45.6169 + 333.1 115.274 22.7461 45.6179 + 333.2 114.821 22.6575 45.6289 + 333.3 114.388 22.5689 45.6269 + 333.4 113.956 22.4914 45.6349 + 333.5 113.513 22.4028 45.638 + 333.6 113.071 22.3142 45.631 + 333.7 112.638 22.2256 45.65 + 333.8 112.195 22.137 45.635 + 333.9 111.753 22.0484 45.649 + 334 111.32 21.9598 45.653 + 334.1 110.877 21.8712 45.653 + 334.2 110.424 21.7826 45.66 + 334.3 109.992 21.7051 45.653 + 334.4 109.539 21.5944 45.654 + 334.5 109.086 21.4836 45.654 + 334.6 108.633 21.3618 45.642 + 334.7 108.19 21.2289 45.666 + 334.8 107.727 21.085 45.6631 + 334.9 107.274 20.9189 45.6581 + 335 106.821 20.7306 45.6651 + 335.1 106.368 20.5534 45.6541 + 335.2 105.915 20.3541 45.6561 + 335.3 105.472 20.1215 45.6661 + 335.4 105.019 19.9001 45.6501 + 335.5 104.566 19.6786 45.6471 + 335.6 104.103 19.446 45.6671 + 335.7 103.65 19.2135 45.6601 + 335.8 103.186 18.9809 45.6631 + 335.9 102.723 18.7373 45.6741 + 336 102.26 18.4937 45.6692 + 336.1 101.796 18.25 45.6752 + 336.2 101.333 17.9953 45.6762 + 336.3 100.87 17.7296 45.6792 + 336.4 100.406 17.4527 45.6852 + 336.5 99.9432 17.1648 45.6912 + 336.6 99.4901 16.8658 45.6852 + 336.7 99.0371 16.5446 45.6992 + 336.8 98.6047 16.2235 45.7022 + 336.9 98.1723 15.8691 45.7102 + 337 97.7398 15.5258 45.7092 + 337.1 97.2971 15.1715 45.7162 + 337.2 96.8647 14.806 45.7182 + 337.3 96.4426 14.4295 45.7273 + 337.4 96.0204 14.053 45.7273 + 337.5 95.6086 13.6654 45.7413 + 337.6 95.1762 13.2778 45.7363 + 337.7 94.754 12.8902 45.7493 + 337.8 94.3422 12.4916 45.7483 + 337.9 93.9303 12.0929 45.7613 + 338 93.5185 11.6943 45.7553 + 338.1 93.0964 11.2845 45.7493 + 338.2 92.7051 10.8748 45.7553 + 338.3 92.2933 10.454 45.7583 + 338.4 91.902 10.0332 45.7563 + 338.5 91.5005 9.60129 45.7573 + 338.6 91.1093 9.18048 45.7543 + 338.7 90.7077 8.7486 45.7623 + 338.8 90.3062 8.31672 45.7604 + 338.9 89.9252 7.87376 45.7704 + 339 89.5237 7.44188 45.7584 + 339.1 89.1221 6.99893 45.7584 + 339.2 88.7206 6.56704 45.7714 + 339.3 88.3191 6.12409 45.7674 + 339.4 87.9175 5.68113 45.7744 + 339.5 87.516 5.23818 45.7784 + 339.6 87.0938 4.79522 45.7824 + 339.7 86.682 4.35226 45.7724 + 339.8 86.2805 3.92038 45.7724 + 339.9 85.8583 3.47742 45.7794 + 340 85.4362 3.03447 45.7744 + 340.1 85.0141 2.61366 45.7834 + 340.2 84.561 2.20393 45.7684 + 340.3 84.1183 1.80527 45.7604 + 340.4 83.655 1.41768 45.7635 + 340.5 83.1917 1.03009 45.7715 + 340.6 82.749 0.63143 45.7775 + 340.7 82.265 0.254917 45.7705 + 340.8 81.7914 -0.110522 45.7805 + 340.9 81.3178 -0.498109 45.7905 + 341 80.8545 -0.874622 45.7885 + 341.1 80.4015 -1.27328 45.7935 + 341.2 79.9485 -1.67194 45.7895 + 341.3 79.4954 -2.05953 45.7855 + 341.4 79.0321 -2.45819 45.7795 + 341.5 78.5894 -2.84578 45.7755 + 341.6 78.1261 -3.23336 45.7795 + 341.7 77.6833 -3.63203 45.7715 + 341.8 77.22 -4.03069 45.7725 + 341.9 76.7773 -4.42935 45.7775 + 342 76.3243 -4.82801 45.7665 + 342.1 75.8713 -5.22667 45.7655 + 342.2 75.4285 -5.6364 45.7556 + 342.3 74.9755 -6.04614 45.7536 + 342.4 74.5328 -6.4448 45.7536 + 342.5 74.0901 -6.85453 45.7486 + 342.6 73.6473 -7.25319 45.7396 + 342.7 73.2046 -7.66293 45.7426 + 342.8 72.7619 -8.06159 45.7376 + 342.9 72.3192 -8.46025 45.7366 + 343 71.8867 -8.85891 45.7416 + 343.1 71.4337 -9.25757 45.7336 + 343.2 71.0013 -9.6673 45.7366 + 343.3 70.5688 -10.066 45.7356 + 343.4 70.1364 -10.4646 45.7466 + 343.5 69.6834 -10.8633 45.7356 + 343.6 69.251 -11.2619 45.7406 + 343.7 68.8185 -11.6606 45.7436 + 343.8 68.3861 -12.0593 45.7366 + 343.9 67.9537 -12.4579 45.7526 + 344 67.5212 -12.8455 45.7426 + 344.1 67.0888 -13.2442 45.7486 + 344.2 66.6564 -13.6318 45.7616 + 344.3 66.2342 -14.0304 45.7596 + 344.4 65.8018 -14.418 45.7686 + 344.5 65.3797 -14.8056 45.7806 + 344.6 64.9575 -15.1932 45.7837 + 344.7 64.5251 -15.5808 45.7947 + 344.8 64.0927 -15.9462 45.8027 + 344.9 63.6396 -16.3006 45.7987 + 345 63.1866 -16.6549 45.7837 + 345.1 62.7336 -16.9761 45.7887 + 345.2 62.2703 -17.2972 45.7947 + 345.3 61.7761 -17.5741 45.7957 + 345.4 61.2819 -17.8398 45.8027 + 345.5 60.7774 -18.0835 45.8077 + 345.6 60.2626 -18.3049 45.8127 + 345.7 59.7478 -18.5043 45.8157 + 345.8 59.2227 -18.6925 45.8097 + 345.9 58.6976 -18.8476 45.8037 + 346 58.1519 -18.9583 45.8017 + 346.1 57.6268 -19.058 45.8027 + 346.2 57.0914 -19.1133 45.8017 + 346.3 56.5663 -19.1576 45.8227 + 346.4 56.0412 -19.2352 45.8427 + 346.5 55.5161 -19.2795 45.8017 + 346.6 55.0013 -19.3016 45.8227 + 346.7 54.4865 -19.3238 45.8547 + 346.8 53.982 -19.357 45.8617 + 346.9 53.4775 -19.4124 45.8667 + 347 52.9936 -19.4677 45.8858 + 347.1 52.5303 -19.5009 45.8968 + 347.2 52.1493 -19.5452 45.8948 + 347.3 51.7272 -19.5785 45.8638 + 347.4 51.3462 -19.6228 45.8028 + 347.5 50.9962 -19.656 45.6928 + 347.6 50.6667 -19.6892 45.5708 + 347.7 50.3887 -19.7224 45.4118 + 347.8 50.1519 -19.7446 45.2858 + 347.9 49.9357 -19.7778 45.1188 + 348 49.74 -19.811 44.9278 + 348.1 49.5753 -19.8332 44.7428 + 348.2 49.4415 -19.8664 44.5508 + 348.3 49.3179 -19.8885 44.3618 + 348.4 49.2149 -19.9218 44.1518 + 348.5 49.1223 -19.955 43.9608 + 348.6 49.0502 -19.9771 43.7478 + 348.7 48.9781 -19.9993 43.5268 + 348.8 48.9266 -20.0214 43.3208 + 348.9 48.8649 -20.0436 43.0688 + 349 48.8237 -20.0657 42.7998 + 349.1 48.7928 -20.0879 42.5308 + 349.2 48.7516 -20.11 42.2368 + 349.3 48.7104 -20.1322 41.9208 + 349.4 48.6589 -20.1654 41.6218 + 349.5 48.5972 -20.1875 41.3268 + 349.6 48.5354 -20.1986 41.0598 + 349.7 48.4633 -20.2318 40.7908 + 349.8 48.3809 -20.254 40.5328 + 349.9 48.278 -20.2872 40.2768 + 350 48.1647 -20.3093 40.0358 + 350.1 48.0309 -20.3426 39.8138 + 350.2 47.8867 -20.3758 39.5638 + 350.3 47.7323 -20.409 39.3618 + 350.4 47.5572 -20.4311 39.1458 + 350.5 47.3616 -20.4754 38.9208 + 350.6 47.166 -20.5087 38.7398 + 350.7 46.9395 -20.553 38.5488 + 350.8 46.713 -20.5973 38.3748 + 350.9 46.4556 -20.6305 38.2198 + 351 46.1879 -20.6748 38.0688 + 351.1 45.8996 -20.7191 37.9048 + 351.2 45.5907 -20.7634 37.7408 + 351.3 45.2818 -20.8077 37.6228 + 351.4 44.942 -20.863 37.4538 + 351.5 44.592 -20.9073 37.2958 + 351.6 44.2316 -20.9516 37.1698 + 351.7 43.861 -21.007 37.0188 + 351.8 43.4594 -21.0624 36.8718 + 351.9 43.0476 -21.1177 36.7528 + 352 42.6151 -21.1842 36.6048 + 352.1 42.1724 -21.2395 36.5078 + 352.2 41.7194 -21.306 36.4238 + 352.3 41.2355 -21.3724 36.3548 + 352.4 40.7413 -21.4389 36.3168 + 352.5 40.2368 -21.5053 36.2958 + 352.6 39.722 -21.5828 36.2628 + 352.7 39.1763 -21.6604 36.2588 + 352.8 38.6409 -21.7379 36.2638 + 352.9 38.0849 -21.8154 36.2718 + 353 37.5186 -21.8929 36.2669 + 353.1 36.942 -21.9704 36.2939 + 353.2 36.3552 -22.059 36.2899 + 353.3 35.758 -22.1365 36.3069 + 353.4 35.1505 -22.2251 36.2949 + 353.5 34.5431 -22.3137 36.3109 + 353.6 33.9253 -22.4023 36.3129 + 353.7 33.2973 -22.4909 36.3119 + 353.8 32.6795 -22.5795 36.3189 + 353.9 32.0515 -22.6681 36.3219 + 354 31.444 -22.7456 36.3349 + 354.1 30.8468 -22.801 36.3479 + 354.2 30.332 -22.8785 36.3399 + 354.3 29.8069 -22.9449 36.3149 + 354.4 29.3333 -22.9892 36.3249 + 354.5 28.9215 -23.0225 36.3269 + 354.6 28.5611 -23.0557 36.3139 + 354.7 28.2625 -23.0889 36.3069 + 354.8 28.0154 -23.1221 36.2859 + 354.9 27.7992 -23.1553 36.2769 + 355 27.6036 -23.1443 36.2409 + 355.1 27.4388 -23.1 36.1969 + 355.2 27.305 -23.1 36.2179 + 355.3 27.1711 -23.0668 36.2369 + 355.4 27.0373 -23.0003 36.2399 + 355.5 26.8932 -22.9117 36.2379 + 355.6 26.749 -22.8231 36.2369 + 355.7 26.6255 -22.7235 36.2479 + 355.8 26.471 -22.6017 36.2609 + 355.9 26.3166 -22.4688 36.2809 + 356 26.1621 -22.3027 36.2649 + 356.1 25.9974 -22.1366 36.2909 + 356.2 25.8224 -21.9372 36.2949 + 356.3 25.6473 -21.7268 36.3129 + 356.4 25.462 -21.5053 36.3089 + 356.5 25.2767 -21.2728 36.3239 + 356.6 25.0811 -21.0181 36.3189 + 356.7 24.8957 -20.7302 36.3269 + 356.8 24.731 -20.4423 36.3469 + 356.9 24.5766 -20.1433 36.3439 + 357 24.4221 -19.8332 36.3559 + 357.1 24.2368 -19.501 36.3749 + 357.2 24.0823 -19.1688 36.3739 + 357.3 23.9279 -18.8144 36.3609 + 357.4 23.7632 -18.449 36.3719 + 357.5 23.5984 -18.0725 36.3729 + 357.6 23.4234 -17.696 36.3769 + 357.7 23.2381 -17.2973 36.3769 + 357.8 23.063 -16.8876 36.3829 + 357.9 22.8674 -16.4668 36.3929 + 358 22.6821 -16.046 36.3899 + 358.1 22.4865 -15.6141 36.3949 + 358.2 22.2908 -15.1601 36.3999 + 358.3 22.0849 -14.7171 36.3899 + 358.4 21.8893 -14.252 36.4009 + 358.5 21.6834 -13.7869 36.3959 + 358.6 21.4774 -13.3107 36.3949 + 358.7 21.2612 -12.8345 36.402 + 358.8 21.0553 -12.3473 36.403 + 358.9 20.8391 -11.8601 36.399 + 359 20.6229 -11.3617 36.42 + 359.1 20.4067 -10.8523 36.414 + 359.2 20.1698 -10.354 36.413 + 359.3 19.9433 -9.84462 36.419 + 359.4 19.7271 -9.33522 36.417 + 359.5 19.5006 -8.81475 36.416 + 359.6 19.2741 -8.29428 36.438 + 359.7 19.0373 -7.77381 36.432 + 359.8 18.8108 -7.25334 36.444 + 359.9 18.574 -6.7218 36.442 + 360 18.3475 -6.20133 36.458 + 360.1 18.1209 -5.68086 36.465 + 360.2 17.8841 -5.16039 36.479 + 360.3 17.6473 -4.62885 36.481 + 360.4 17.4208 -4.10838 36.49 + 360.5 17.184 -3.57684 36.484 + 360.6 16.9369 -3.05637 36.494 + 360.7 16.7104 -2.5359 36.5 + 360.8 16.4736 -2.01543 36.512 + 360.9 16.2368 -1.49496 36.517 + 361 16.0103 -0.985562 36.528 + 361.1 15.7837 -0.476166 36.531 + 361.2 15.5469 0.0221555 36.532 + 361.3 15.3307 0.49833 36.532 + 361.4 15.1042 0.985578 36.519 + 361.5 14.888 1.47283 36.513 + 361.6 14.6615 1.949 36.495 + 361.7 14.435 2.43625 36.476 + 361.8 14.2188 2.91242 36.466 + 361.9 13.9922 3.41074 36.451 + 362 13.7657 3.90907 36.449 + 362.1 13.5289 4.42954 36.454 + 362.2 13.2921 4.95001 36.451 + 362.3 13.0553 5.49262 36.442 + 362.4 12.8185 6.03524 36.451 + 362.5 12.5714 6.58893 36.448 + 362.6 12.314 7.14262 36.457 + 362.7 12.0875 7.72954 36.439 + 362.8 11.9227 8.31645 36.444 + 362.9 11.7477 8.90336 36.446 + 363 11.6036 9.49027 36.463 + 363.1 11.5109 10.0772 36.484 + 363.2 11.4697 10.6641 36.496 + 363.3 11.4594 11.2289 36.515 + 363.4 11.48 11.7826 36.524 + 363.5 11.5418 12.3141 36.532 + 363.6 11.6448 12.8346 36.547 + 363.7 11.7889 13.3329 36.558 + 363.8 11.9639 13.798 36.552 + 363.9 12.1698 14.252 36.56 + 364 12.4272 14.6728 36.556 + 364.1 12.7052 15.0604 36.567 + 364.2 13.0244 15.4148 36.568 + 364.3 13.3848 15.7248 36.554 + 364.4 13.7554 16.0017 36.56 + 364.5 14.157 16.2453 36.557 + 364.6 14.5585 16.4668 36.571 + 364.7 14.9498 16.7104 36.587 + 364.8 15.3822 16.9097 36.564 + 364.9 15.8352 17.0869 36.539 + 365 16.2882 17.2863 36.536 + 365.1 16.7516 17.4856 36.522 + 365.2 17.2252 17.696 36.51 + 365.3 17.6885 17.9064 36.521 + 365.4 18.193 18.1279 36.5389 + 365.5 18.6872 18.3383 36.5429 + 365.6 19.1917 18.5487 36.5459 + 365.7 19.7168 18.748 36.5509 + 365.8 20.2625 18.9252 36.5579 + 365.9 20.7979 19.0913 36.5609 + 366 21.3436 19.2463 36.5729 + 366.1 21.8892 19.3792 36.5849 + 366.2 22.4555 19.4789 36.5989 + 366.3 23.0115 19.5675 36.6129 + 366.4 23.5675 19.6561 36.6139 + 366.5 24.1338 19.7447 36.5989 + 366.6 24.7103 19.8111 36.5959 + 366.7 25.2869 19.8775 36.5869 + 366.8 25.8635 19.9551 36.5889 + 366.9 26.4504 20.0436 36.5809 + 367 27.0372 20.1322 36.5959 + 367.1 27.6241 20.2319 36.5979 + 367.2 28.2316 20.3316 36.6029 + 367.3 28.8287 20.4312 36.6159 + 367.4 29.4362 20.5309 36.6219 + 367.5 30.0334 20.6306 36.6329 + 367.6 30.6408 20.7413 36.6309 + 367.7 31.238 20.852 36.6469 + 367.8 31.8454 20.9739 36.6559 + 367.9 32.4529 21.0846 36.6529 + 368 33.0707 21.1953 36.6619 + 368.1 33.6781 21.3172 36.6659 + 368.2 34.2856 21.4279 36.6709 + 368.3 34.9033 21.5497 36.6619 + 368.4 35.5211 21.6715 36.6739 + 368.5 36.1286 21.7933 36.6799 + 368.6 36.7463 21.9151 36.6749 + 368.7 37.3641 22.037 36.6739 + 368.8 37.9818 22.1477 36.6748 + 368.9 38.5996 22.2695 36.6688 + 369 39.2174 22.3913 36.6608 + 369.1 39.8351 22.5242 36.6758 + 369.2 40.4632 22.6239 36.6768 + 369.3 41.0809 22.7235 36.6618 + 369.4 41.6987 22.8121 36.6648 + 369.5 42.3164 22.8897 36.6708 + 369.6 42.9342 22.9561 36.6688 + 369.7 43.552 22.9893 36.6748 + 369.8 44.1697 23.0225 36.6798 + 369.9 44.7978 23.0226 36.6718 + 370 45.4155 23.0226 36.6708 + 370.1 46.023 23.0115 36.6538 + 370.2 46.6407 22.9893 36.6708 + 370.3 47.2482 22.9672 36.6658 + 370.4 47.866 22.945 36.6688 + 370.5 48.4734 22.9118 36.6788 + 370.6 49.0912 22.8786 36.6638 + 370.7 49.7089 22.8454 36.6638 + 370.8 50.3061 22.8122 36.6668 + 370.9 50.9239 22.8011 36.6718 + 371 51.5313 22.7789 36.6858 + 371.1 52.1388 22.7568 36.6867 + 371.2 52.736 22.7568 36.6887 + 371.3 53.3331 22.7568 36.7007 + 371.4 53.9303 22.7568 36.7027 + 371.5 54.5378 22.7679 36.6987 + 371.6 55.1143 22.8011 36.7047 + 371.7 55.7115 22.8343 36.7087 + 371.8 56.2984 22.8786 36.7207 + 371.9 56.8852 22.9229 36.7157 + 372 57.4824 22.9672 36.7187 + 372.1 58.059 23.0337 36.7127 + 372.2 58.6356 23.1001 36.7287 + 372.3 59.2121 23.1666 36.7287 + 372.4 59.7784 23.2441 36.7197 + 372.5 60.3447 23.3437 36.7327 + 372.6 60.8904 23.4434 36.7287 + 372.7 61.4464 23.5652 36.7157 + 372.8 61.992 23.6981 36.7147 + 372.9 62.5274 23.831 36.6966 + 373 63.0525 24.0193 36.6966 + 373.1 63.5776 24.2186 36.6926 + 373.2 64.0718 24.4401 36.6846 + 373.3 64.5557 24.6837 36.6786 + 373.4 65.0396 24.9495 36.6676 + 373.5 65.503 25.2263 36.6846 + 373.6 65.956 25.5142 36.6846 + 373.7 66.3884 25.8465 36.6856 + 373.8 66.79 26.1897 36.6966 + 373.9 67.1812 26.5441 36.6986 + 374 67.5518 26.9095 36.6886 + 374.1 67.9122 27.2861 36.6976 + 374.2 68.2417 27.6847 36.6946 + 374.3 68.5403 28.0945 36.6866 + 374.4 68.8182 28.5153 36.6756 + 374.5 69.0551 28.9582 36.6776 + 374.6 69.2713 29.4122 36.6746 + 374.7 69.4566 29.8663 36.6736 + 374.8 69.611 30.3314 36.6705 + 374.9 69.7346 30.7965 36.6725 + 375 69.8272 31.2726 36.6715 + 375.1 69.889 31.7377 36.6765 + 375.2 69.9199 32.2028 36.6745 + 375.3 69.9508 32.6679 36.6655 + 375.4 70.0023 33.1552 36.6625 + 375.5 70.0229 33.6203 36.6565 + 375.6 70.0331 34.0965 36.6515 + 375.7 70.0537 34.5616 36.6535 + 375.8 70.0846 35.0267 36.6655 + 375.9 70.1464 35.5028 36.7045 + 376 70.1876 35.979 36.7785 + 376.1 70.2494 36.4552 36.8705 + 376.2 70.3111 36.9314 37.0105 + 376.3 70.3832 37.4075 37.1665 + 376.4 70.4656 37.8727 37.3525 + 376.5 70.5376 38.3599 37.5835 + 376.6 70.62 38.825 37.8485 + 376.7 70.7024 39.3123 38.1265 + 376.8 70.7847 39.7884 38.4515 + 376.9 70.8774 40.2646 38.7785 + 377 70.9701 40.7519 39.1205 + 377.1 71.0524 41.2391 39.4695 + 377.2 71.1348 41.7264 39.8325 + 377.3 71.2172 42.2136 40.1865 + 377.4 71.2996 42.7009 40.5345 + 377.5 71.3819 43.1992 40.8785 + 377.6 71.4849 43.6864 41.2104 + 377.7 71.5673 44.1737 41.5484 + 377.8 71.6393 44.672 41.8574 + 377.9 71.7217 45.1593 42.1524 + 378 71.7835 45.6465 42.4154 + 378.1 71.8555 46.1448 42.6484 + 378.2 71.907 46.6321 42.8854 + 378.3 71.9482 47.1304 43.0874 + 378.4 71.9791 47.6398 43.2664 + 378.5 71.9894 48.1492 43.4514 + 378.6 71.9894 48.6586 43.6214 + 378.7 71.9791 49.168 43.7714 + 378.8 71.9482 49.6885 43.9484 + 378.9 71.9173 50.209 44.0954 + 379 71.8864 50.7294 44.2584 + 379.1 71.8349 51.2499 44.4174 + 379.2 71.7835 51.7814 44.5634 + 379.3 71.732 52.313 44.7224 + 379.4 71.6805 52.8445 44.8654 + 379.5 71.629 53.3761 45.0044 + 379.6 71.5878 53.9187 45.1534 + 379.7 71.5364 54.4613 45.3014 + 379.8 71.4952 55.0039 45.4394 + 379.9 71.454 55.5576 45.5704 + 380 71.4128 56.1003 45.6684 + 380.1 71.3716 56.6539 45.7423 + 380.2 71.3407 57.2076 45.8093 + 380.3 71.2892 57.7724 45.8503 + 380.4 71.2584 58.3261 45.8733 + 380.5 71.2172 58.8909 45.9063 + 380.6 71.1863 59.4667 45.8923 + 380.7 71.1451 60.0425 45.9073 + 380.8 71.1245 60.6295 45.9073 + 380.9 71.0833 61.2164 45.9043 + 381 71.0524 61.8144 45.9013 + 381.1 71.0215 62.4013 45.8953 + 381.2 70.9906 63.0103 45.8893 + 381.3 70.9597 63.6194 45.8943 + 381.4 70.9186 64.2285 45.8943 + 381.5 70.8877 64.8486 45.8893 + 381.6 70.8671 65.4687 45.9013 + 381.7 70.8259 66.0889 45.8923 + 381.8 70.795 66.7201 45.8943 + 381.9 70.7641 67.3513 45.9083 + 382 70.7332 67.9936 45.9112 + 382.1 70.7023 68.6358 45.9212 + 382.2 70.6611 69.2781 45.9192 + 382.3 70.6302 69.9204 45.9212 + 382.4 70.5994 70.5738 45.9222 + 382.5 70.5685 71.2271 45.9362 + 382.6 70.5376 71.8805 45.9292 + 382.7 70.5067 72.5449 45.9332 + 382.8 70.4758 73.1983 45.9242 + 382.9 70.4449 73.8627 45.9212 + 383 70.414 74.5271 45.9272 + 383.1 70.4449 75.2026 45.9122 + 383.2 70.4861 75.856 45.9122 + 383.3 70.5376 76.4983 45.9261 + 383.4 70.6405 77.1406 45.9351 + 383.5 70.7744 77.7496 45.9471 + 383.6 70.9597 78.3476 45.9571 + 383.7 71.1759 78.9124 45.9771 + 383.8 71.423 79.455 45.9791 + 383.9 71.701 79.9644 45.9961 + 384 72.0099 80.4406 45.9931 + 384.1 72.3496 80.8835 46.0021 + 384.2 72.7203 81.2933 46.0111 + 384.3 73.1218 81.6587 46.0151 + 384.4 73.5542 81.9909 46.022 + 384.5 73.997 82.2899 46.024 + 384.6 74.4809 82.5446 46.025 + 384.7 74.9648 82.755 46.038 + 384.8 75.4796 82.91 46.044 + 384.9 75.9944 83.0429 46.049 + 385 76.5195 83.1315 46.05 + 385.1 77.0549 83.1869 46.058 + 385.2 77.58 83.198 46.058 + 385.3 78.105 83.1758 46.064 + 385.4 78.6404 83.1315 46.056 + 385.5 79.1655 83.0762 46.043 + 385.6 79.6803 82.9876 46.046 + 385.7 80.1848 82.8658 46.021 + 385.8 80.679 82.7218 46.016 + 385.9 81.1629 82.6111 45.9839 + 386 81.688 82.5225 45.9359 + 386.1 82.1822 82.3896 45.9229 + 386.2 82.6867 82.2567 45.9239 + 386.3 83.2118 82.1349 45.9109 + 386.4 83.7369 82.0353 45.9239 + 386.5 84.2723 81.9467 45.9489 + 386.6 84.818 81.8581 45.9749 + 386.7 85.3637 81.7584 45.9709 + 386.8 85.93 81.6588 45.9799 + 386.9 86.486 81.5812 45.9869 + 387 87.0419 81.4927 46.0019 + 387.1 87.6185 81.4151 46.0059 + 387.2 88.1848 81.3376 46.0249 + 387.3 88.782 81.2601 46.0369 + 387.4 89.3688 81.1937 46.0349 + 387.5 89.9557 81.0829 46.0448 + 387.6 90.5529 80.9611 46.0528 + 387.7 91.1397 80.8172 46.0498 + 387.8 91.706 80.6511 46.0628 + 387.9 92.2723 80.4407 46.0748 + 388 92.8077 80.2192 46.0808 + 388.1 93.3328 79.9534 46.0958 + 388.2 93.8373 79.6766 46.0978 + 388.3 94.3212 79.3665 46.0808 + 388.4 94.7845 79.0343 46.1038 + 388.5 95.2375 78.7132 46.1058 + 388.6 95.67 78.381 46.1098 + 388.7 96.0921 78.0045 46.1088 + 388.8 96.4936 77.6279 46.1158 + 388.9 96.8849 77.2404 46.1188 + 389 97.2555 76.8417 46.1208 + 389.1 97.6159 76.432 46.1308 + 389.2 97.9557 76.0222 46.1378 + 389.3 98.3057 75.6014 46.1318 + 389.4 98.6455 75.1585 46.1208 + 389.5 98.9853 74.7266 46.1388 + 389.6 99.3148 74.2837 46.1328 + 389.7 99.6648 73.8407 46.1458 + 389.8 100.015 73.3867 46.1408 + 389.9 100.375 72.9437 46.1488 + 390 100.746 72.4897 46.1518 + 390.1 101.127 72.0357 46.1608 + 390.2 101.508 71.5927 46.1558 + 390.3 101.909 71.1276 46.1608 + 390.4 102.301 70.6736 46.1728 + 390.5 102.702 70.2085 46.1628 + 390.6 103.114 69.7434 46.1678 + 390.7 103.526 69.2894 46.1728 + 390.8 103.938 68.8132 46.1658 + 390.9 104.37 68.3481 46.1818 + 391 104.792 67.883 46.1658 + 391.1 105.225 67.4068 46.1708 + 391.2 105.647 66.9307 46.1698 + 391.3 106.09 66.4545 46.1618 + 391.4 106.532 65.9673 46.1668 + 391.5 106.975 65.4911 46.1638 + 391.6 107.428 64.9928 46.1648 + 391.7 107.881 64.5055 46.1658 + 391.8 108.334 64.0072 46.1618 + 391.9 108.787 63.5089 46.1648 + 392 109.24 62.9995 46.1568 + 392.1 109.714 62.5012 46.1537 + 392.2 110.177 61.9918 46.1477 + 392.3 110.651 61.4824 46.1567 + 392.4 111.124 60.9619 46.1537 + 392.5 111.598 60.4525 46.1567 + 392.6 112.072 59.921 46.1517 + 392.7 112.535 59.3784 46.1557 + 392.8 112.988 58.8357 46.1387 + 392.9 113.431 58.2821 46.1407 + 393 113.853 57.7062 46.1387 + 393.1 114.265 57.1304 46.1337 + 393.2 114.646 56.5213 46.1487 + 393.3 115.006 55.9123 46.1357 + 393.4 115.356 55.2921 46.1447 + 393.5 115.665 54.6609 46.1077 + 393.6 115.963 54.0186 46.1267 + 393.7 116.241 53.3764 46.1277 + 393.8 116.499 52.723 46.1287 + 393.9 116.756 52.0697 46.1367 + 394 116.983 51.4052 46.1277 + 394.1 117.209 50.7408 46.1317 + 394.2 117.415 50.0653 46.1297 + 394.3 117.621 49.3898 46.1367 + 394.4 117.837 48.7143 46.1297 + 394.5 118.054 48.0277 46.1257 + 394.6 118.249 47.3411 46.1247 + 394.7 118.465 46.6546 46.1287 + 394.8 118.682 45.968 46.1317 + 394.9 118.898 45.2703 46.1357 + 395 119.124 44.5838 46.1277 + 395.1 119.351 43.8861 46.1217 + 395.2 119.567 43.1885 46.1157 + 395.3 119.804 42.4908 46.1177 + 395.4 120.03 41.7821 46.1127 + 395.5 120.257 41.0844 46.1117 + 395.6 120.483 40.3868 46.1037 + 395.7 120.71 39.6781 46.1067 + 395.8 120.947 38.9693 46.1057 + 395.9 121.173 38.2606 46.1047 + 396 121.41 37.5408 46.0967 + 396.1 121.647 36.8321 46.1047 + 396.2 121.884 36.1234 46.0987 + 396.3 122.121 35.4036 46.1027 + 396.4 122.357 34.6838 46.1097 + 396.5 122.594 33.975 46.0967 + 396.6 122.831 33.2552 46.1017 + 396.7 123.078 32.5244 46.1037 + 396.8 123.315 31.8156 46.1047 + 396.9 123.541 31.0958 46.1107 + 397 123.778 30.376 46.1167 + 397.1 124.005 29.6673 46.1147 + 397.2 124.242 28.9475 46.1197 + 397.3 124.489 28.2277 46.1177 + 397.4 124.715 27.5079 46.1207 + 397.5 124.942 26.7992 46.1307 + 397.6 125.168 26.0905 46.1317 + 397.7 125.405 25.3818 46.1337 + 397.8 125.632 24.6841 46.1297 + 397.9 125.858 23.9754 46.1357 + 398 126.085 23.2777 46.1267 + 398.1 126.27 22.5801 46.1447 + 398.2 126.424 21.8824 46.1377 + 398.3 126.589 21.1848 46.1237 + 398.4 126.733 20.4871 46.1107 + 398.5 126.805 19.7895 46.1087 + 398.6 126.847 19.1029 46.1157 + 398.7 126.857 18.4163 46.1277 + 398.8 126.836 17.7408 46.1357 + 398.9 126.775 17.0653 46.1487 + 399 126.682 16.412 46.1487 + 399.1 126.548 15.7807 46.1597 + 399.2 126.383 15.1606 46.1697 + 399.3 126.208 14.5626 46.1667 + 399.4 125.992 13.9757 46.1717 + 399.5 125.745 13.3999 46.1887 + 399.6 125.488 12.8572 46.1888 + 399.7 125.199 12.3146 46.1828 + 399.8 124.89 11.7941 46.1928 + 399.9 124.582 11.2847 46.2088 + 400 124.242 10.7864 46.2078 + 400.1 123.923 10.2881 46.1988 + 400.2 123.593 9.7787 46.2018 + 400.3 123.253 9.28037 46.2178 + 400.4 122.903 8.79312 46.2198 + 400.5 122.564 8.29479 46.2228 + 400.6 122.224 7.78539 46.2258 + 400.7 121.884 7.26492 46.2248 + 400.8 121.544 6.74445 46.2328 + 400.9 121.204 6.23505 46.2228 + 401 120.854 5.7035 46.2379 + 401.1 120.515 5.18303 46.2389 + 401.2 120.175 4.65148 46.2339 + 401.3 119.825 4.11993 46.2429 + 401.4 119.475 3.58839 46.2449 + 401.5 119.104 3.05684 46.2449 + 401.6 118.713 2.54744 46.2269 + 401.7 118.322 2.03804 46.2249 + 401.8 117.93 1.53971 46.2219 + 401.9 117.488 1.06354 46.2319 + 402 117.045 0.609504 46.2379 + 402.1 116.582 0.177621 46.2379 + 402.2 116.098 -0.232115 46.2359 + 402.3 115.614 -0.630777 46.237 + 402.4 115.099 -0.985144 46.244 + 402.5 114.574 -1.32844 46.262 + 402.6 114.049 -1.63851 46.263 + 402.7 113.503 -1.92643 46.254 + 402.8 112.957 -2.18113 46.268 + 402.9 112.391 -2.40262 46.268 + 403 111.825 -2.5798 46.27 + 403.1 111.259 -2.75699 46.279 + 403.2 110.692 -2.8788 46.273 + 403.3 110.116 -2.97847 46.284 + 403.4 109.539 -3.04492 46.2871 + 403.5 108.983 -3.11137 46.2971 + 403.6 108.417 -3.15567 46.2971 + 403.7 107.851 -3.15567 46.3001 + 403.8 107.295 -3.1446 46.3011 + 403.9 106.739 -3.11138 46.3051 + 404 106.183 -3.05602 46.3031 + 404.1 105.647 -2.98958 46.3001 + 404.2 105.112 -2.88992 46.2941 + 404.3 104.577 -2.77918 46.2881 + 404.4 104.062 -2.63522 46.2852 + 404.5 103.547 -2.46912 46.2922 + 404.6 103.053 -2.28087 46.2902 + 404.7 102.569 -2.08154 46.2902 + 404.8 102.085 -1.86007 46.2982 + 404.9 101.611 -1.61645 46.2842 + 405 101.158 -1.36175 46.2952 + 405.1 100.715 -1.08491 46.2772 + 405.2 100.283 -0.796992 46.2902 + 405.3 99.8712 -0.498001 46.2862 + 405.4 99.4594 -0.176862 46.2792 + 405.5 99.0784 0.155351 46.2732 + 405.6 98.6872 0.498638 46.2892 + 405.7 98.3165 0.852998 46.2632 + 405.8 97.9562 1.21843 46.2722 + 405.9 97.5855 1.58387 46.2603 + 406 97.2148 1.9493 46.2413 + 406.1 96.8442 2.32581 46.2533 + 406.2 96.4735 2.70232 46.2443 + 406.3 96.0926 3.07883 46.2403 + 406.4 95.7116 3.45534 46.2383 + 406.5 95.3101 3.83184 46.2253 + 406.6 94.9394 4.25265 46.2123 + 406.7 94.5996 4.66238 46.2213 + 406.8 94.2702 5.08318 46.2283 + 406.9 93.9819 5.53721 46.2303 + 407 93.7142 6.00231 46.2473 + 407.1 93.4156 6.45633 46.2443 + 407.2 93.117 6.92143 46.2133 + 407.3 92.8802 7.40868 46.2203 + 407.4 92.6331 7.87378 46.2273 + 407.5 92.3448 8.36103 46.2193 + 407.6 92.0668 8.84827 46.2343 + 407.7 91.7682 9.32445 46.2223 + 407.8 91.4696 9.80062 46.2423 + 407.9 91.1607 10.2989 46.2293 + 408 90.8622 10.7973 46.2433 + 408.1 90.5636 11.2956 46.2453 + 408.2 90.2547 11.805 46.2404 + 408.3 89.9458 12.3254 46.2354 + 408.4 89.6369 12.8459 46.2174 + 408.5 89.3074 13.3885 46.2114 + 408.6 88.978 13.9312 46.2094 + 408.7 88.6382 14.4848 46.2054 + 408.8 88.2984 15.0496 46.2044 + 408.9 87.9587 15.6144 46.1884 + 409 87.5983 16.2013 46.1784 + 409.1 87.2482 16.7882 46.2004 + 409.2 86.8673 17.3751 46.2104 + 409.3 86.5069 17.9731 46.1954 + 409.4 86.126 18.5711 46.2094 + 409.5 85.7553 19.1801 46.2204 + 409.6 85.3743 19.7892 46.2064 + 409.7 84.9934 20.4093 46.2124 + 409.8 84.6021 21.0405 46.2074 + 409.9 84.2109 21.6607 46.1954 + 410 83.8299 22.3029 46.1894 + 410.1 83.4284 22.9452 46.1884 + 410.2 83.0371 23.5875 46.1774 + 410.3 82.6356 24.2298 46.1824 + 410.4 82.234 24.8831 46.1674 + 410.5 81.8222 25.5365 46.1744 + 410.6 81.4206 26.2009 46.1724 + 410.7 81.0088 26.8432 46.1814 + 410.8 80.597 27.5076 46.1624 + 410.9 80.1851 28.161 46.1664 + 411 79.7733 28.8143 46.1584 + 411.1 79.3614 29.4788 46.1494 + 411.2 78.9393 30.1432 46.1464 + 411.3 78.5172 30.8187 46.1314 + 411.4 78.1156 31.4831 46.1304 + 411.5 77.6832 32.1586 46.1394 + 411.6 77.261 32.8452 46.1244 + 411.7 76.8389 33.5207 46.1284 + 411.8 76.4168 34.2073 46.1285 + 411.9 75.9843 34.8828 46.1085 + 412 75.5416 35.5694 46.1025 + 412.1 75.1092 36.2559 46.1115 + 412.2 74.687 36.9425 46.1125 + 412.3 74.2649 37.6623 46.0865 + 412.4 73.9045 38.3821 46.0655 + 412.5 73.5339 39.0908 46.0615 + 412.6 73.2147 39.8217 46.0815 + 412.7 72.9161 40.5526 46.1125 + 412.8 72.5763 41.2835 46.1005 + 412.9 72.2777 42.0033 46.0865 + 413 71.9997 42.7341 46.0824 + 413.1 71.7114 43.4539 46.0894 + 413.2 71.4026 44.1848 46.0784 + 413.3 71.0731 44.9046 46.0814 + 413.4 70.7436 45.6244 46.0834 + 413.5 70.3936 46.3553 46.0684 + 413.6 70.0538 47.0751 46.0634 + 413.7 69.714 47.8059 46.0554 + 413.8 69.3639 48.5368 46.0504 + 413.9 69.0036 49.2677 46.0404 + 414 68.6535 49.9875 46.0454 + 414.1 68.3034 50.7184 46.0324 + 414.2 67.9328 51.4603 46.0214 + 414.3 67.5724 52.1912 46.0274 + 414.4 67.2121 52.911 46.0334 + 414.5 66.8517 53.6529 46.0204 + 414.6 66.481 54.3949 46.0204 + 414.7 66.1207 55.1368 46.0264 + 414.8 65.7397 55.8788 46.0284 + 414.9 65.3691 56.6318 46.0314 + 415 64.9984 57.3737 46.0244 + 415.1 64.6175 58.1378 46.0324 + 415.2 64.2468 58.8908 46.0394 + 415.3 63.8659 59.6439 46.0374 + 415.4 63.4849 60.3969 46.0494 + 415.5 63.0936 61.1499 46.0504 + 415.6 62.7024 61.9029 46.0614 + 415.7 62.2906 62.6338 46.0534 + 415.8 61.8581 63.3647 46.0724 + 415.9 61.4154 64.0734 46.0604 + 416 60.9521 64.771 46.0724 + 416.1 60.4579 65.4576 46.0794 + 416.2 59.9534 66.122 46.0894 + 416.3 59.418 66.7643 46.0954 + 416.4 58.8826 67.4066 46.0974 + 416.5 58.3266 68.0157 46.1054 + 416.6 57.75 68.6136 46.1074 + 416.7 57.1734 69.2006 46.0994 + 416.8 56.5763 69.7764 46.1154 + 416.9 55.9688 70.2969 46.0994 + 417 55.3305 70.8395 46.0884 + 417.1 54.7127 71.3599 46.1034 + 417.2 54.0641 71.8472 46.1154 + 417.3 53.3948 72.3123 46.1224 + 417.4 52.7256 72.7442 46.1204 + 417.5 52.0357 73.1539 46.1244 + 417.6 51.3459 73.5193 46.1474 + 417.7 50.6458 73.8626 46.1454 + 417.8 49.9354 74.1505 46.1614 + 417.9 49.2044 74.3942 46.1744 + 418 48.4836 74.5824 46.1874 + 418.1 47.7629 74.7264 46.1944 + 418.2 47.0525 74.815 46.1944 + 418.3 46.3524 74.8482 46.1994 + 418.4 45.6523 74.8371 46.2204 + 418.5 44.9727 74.7928 46.2404 + 418.6 44.3138 74.6931 46.2364 + 418.7 43.6754 74.5603 46.2434 + 418.8 43.0577 74.372 46.2494 + 418.9 42.4708 74.1394 46.2594 + 419 41.9148 73.8737 46.2584 + 419.1 41.4 73.5747 46.2544 + 419.2 40.9058 73.2314 46.2404 + 419.3 40.4528 72.8659 46.2495 + 419.4 40.0204 72.4673 46.2465 + 419.5 39.6497 72.0354 46.2465 + 419.6 39.3202 71.5814 46.2415 + 419.7 39.0217 71.1163 46.2425 + 419.8 38.7643 70.629 46.2415 + 419.9 38.5584 70.1307 46.2245 + 420 38.3936 69.6324 46.2195 + 420.1 38.2701 69.1119 46.2275 + 420.2 38.198 68.6025 46.2285 + 420.3 38.1671 68.0931 46.2255 + 420.4 38.1671 67.5948 46.2335 + 420.5 38.2186 67.0965 46.2285 + 420.6 38.301 66.6203 46.2405 + 420.7 38.4245 66.1552 46.2475 + 420.8 38.5893 65.7012 46.2425 + 420.9 38.7643 65.2693 46.2425 + 421 39.0011 64.8485 46.2485 + 421.1 39.2379 64.4609 46.2546 + 421.2 39.5056 64.0955 46.2556 + 421.3 39.7939 63.7411 46.2586 + 421.4 40.0925 63.4089 46.2726 + 421.5 40.3602 63.0324 46.2776 + 421.6 40.6485 62.6669 46.2236 + 421.7 40.9573 62.3236 46.2306 + 421.8 41.2456 61.9582 46.2396 + 421.9 41.5133 61.5596 46.2486 + 422 41.7913 61.1609 46.2556 + 422.1 42.0487 60.729 46.2636 + 422.2 42.3164 60.2971 46.2576 + 422.3 42.5738 59.8431 46.2506 + 422.4 42.8518 59.378 46.2706 + 422.5 43.1195 58.9129 46.2686 + 422.6 43.3872 58.4146 46.2716 + 422.7 43.6549 57.9163 46.2626 + 422.8 43.9226 57.3958 46.2736 + 422.9 44.2109 56.8643 46.2706 + 423 44.4786 56.3216 46.2716 + 423.1 44.7566 55.7569 46.2876 + 423.2 45.0551 55.17 46.2676 + 423.3 45.3434 54.583 46.2786 + 423.4 45.6317 53.974 46.2826 + 423.5 45.9303 53.3538 46.2746 + 423.6 46.2392 52.7226 46.2766 + 423.7 46.5481 52.0693 46.2916 + 423.8 46.8467 51.4159 46.2746 + 423.9 47.1761 50.7404 46.2886 + 424 47.4953 50.0538 46.2966 + 424.1 47.8145 49.3562 46.2896 + 424.2 48.1542 48.6475 46.3056 + 424.3 48.4837 47.9277 46.3056 + 424.4 48.8235 47.1857 46.3066 + 424.5 49.1633 46.4549 46.3226 + 424.6 49.503 45.7018 46.3156 + 424.7 49.8634 44.9488 46.3186 + 424.8 50.2135 44.1736 46.3526 + 424.9 50.5635 43.3985 46.3747 + 425 50.9239 42.6233 46.4317 + 425.1 51.2842 41.826 46.4997 + 425.2 51.6446 41.0287 46.5627 + 425.3 52.005 40.2314 46.6297 + 425.4 52.3756 39.423 46.7127 + 425.5 52.736 38.6146 46.7687 + 425.6 53.1169 37.7951 46.8147 + 425.7 53.4773 36.9757 46.8617 + 425.8 53.8377 36.134 46.8817 + 425.9 54.1569 35.2814 46.8877 + 426 54.4657 34.4398 46.9097 + 426.1 54.7643 33.576 46.9197 + 426.2 55.0011 32.7233 46.9177 + 426.3 55.2173 31.8595 46.9157 + 426.4 55.3821 30.9958 46.9207 + 426.5 55.5159 30.132 46.9137 + 426.6 55.5983 29.2793 46.9187 + 426.7 55.6498 28.4377 46.9217 + 426.8 55.6601 27.6072 46.9207 + 426.9 55.6498 26.7877 46.9237 + 427 55.6498 25.9461 46.9257 + 427.1 55.6086 25.1156 46.9097 + 427.2 55.5468 24.2961 46.9197 + 427.3 55.4748 23.4766 46.9157 + 427.4 55.3924 22.635 46.9257 + 427.5 55.3203 21.7824 46.9267 + 427.6 55.2277 20.9407 46.9337 + 427.7 55.135 20.077 46.9277 + 427.8 55.0424 19.2132 46.9387 + 427.9 54.9291 18.3605 46.9377 + 428 54.8159 17.4857 46.9317 + 428.1 54.7026 16.6109 46.9527 + 428.2 54.5791 15.736 46.9517 + 428.3 54.4452 14.8501 46.9478 + 428.4 54.3114 13.9753 46.9598 + 428.5 54.1672 13.0894 46.9528 + 428.6 54.0231 12.1924 46.9658 + 428.7 53.8892 11.3065 46.9668 + 428.8 53.7348 10.4095 46.9618 + 428.9 53.5907 9.5236 46.9758 + 429 53.4465 8.62662 46.9808 + 429.1 53.3024 7.74071 46.9848 + 429.2 53.1582 6.8548 46.9798 + 429.3 53.0141 5.96889 46.9688 + 429.4 52.8803 5.08299 46.9778 + 429.5 52.7464 4.186 46.9788 + 429.6 52.6023 3.3001 46.9758 + 429.7 52.4684 2.41419 46.9718 + 429.8 52.3346 1.52828 46.9818 + 429.9 52.1904 0.620223 46.9768 + 430 52.0463 -0.276759 46.9758 + 430.1 51.9022 -1.19589 46.9738 + 430.2 51.7786 -2.11502 46.9728 + 430.3 51.6345 -3.03415 46.9738 + 430.4 51.4903 -3.95328 46.9798 + 430.5 51.3462 -4.87241 46.9938 + 430.6 51.202 -5.80261 47.0018 + 430.7 51.0991 -6.73281 47.0018 + 430.8 51.0167 -7.66302 47.0048 + 430.9 50.9652 -8.58215 47.0078 + 431 50.9241 -9.4902 47.0208 + 431.1 50.9344 -10.3983 47.0228 + 431.2 50.9755 -11.2952 47.0418 + 431.3 51.0785 -12.1701 47.0388 + 431.4 51.2227 -13.0338 47.0508 + 431.5 51.3977 -13.8754 47.0288 + 431.6 51.6242 -14.6838 47.0168 + 431.7 51.8816 -15.459 47.0258 + 431.8 52.1905 -16.212 47.0268 + 431.9 52.52 -16.9318 47.0278 + 432 52.8906 -17.6295 47.0328 + 432.1 53.3025 -18.2828 47.0378 + 432.2 53.7452 -18.9251 47.0287 + 432.3 54.2188 -19.512 47.0557 + 432.4 54.7233 -20.0657 47.0427 + 432.5 55.2381 -20.5862 47.0617 + 432.6 55.7838 -21.0734 47.0597 + 432.7 56.3398 -21.5164 47.0747 + 432.8 56.9267 -21.915 47.0867 + 432.9 57.5239 -22.2805 47.0927 + 433 58.121 -22.6016 47.0817 + 433.1 58.7285 -22.8785 47.1017 + 433.2 59.3565 -23.1221 47.1037 + 433.3 59.9743 -23.3325 47.1157 + 433.4 60.6024 -23.4875 47.1267 + 433.5 61.2201 -23.6093 47.1127 + 433.6 61.8276 -23.6868 47.1247 + 433.7 62.4454 -23.7422 47.1247 + 433.8 63.0425 -23.7311 47.1376 + 433.9 63.6294 -23.6979 47.1246 + 434 64.206 -23.6204 47.1296 + 434.1 64.762 -23.5207 47.1366 + 434.2 65.3076 -23.3767 47.1266 + 434.3 65.8224 -23.1885 47.1206 + 434.4 66.327 -22.9892 47.1256 + 434.5 66.8006 -22.7455 47.1246 + 434.6 67.233 -22.4798 47.1156 + 434.7 67.6654 -22.1808 47.1046 + 434.8 68.0567 -21.8596 47.1056 + 434.9 68.4067 -21.5163 47.0906 + 435 68.7362 -21.1509 47.0866 + 435.1 69.0451 -20.7633 47.0676 + 435.2 69.3643 -20.3757 47.0916 + 435.3 69.6628 -19.9438 47.0836 + 435.4 69.9408 -19.523 47.0796 + 435.5 70.2188 -19.0801 47.0676 + 435.6 70.5174 -18.6371 47.0616 + 435.7 70.816 -18.1831 47.0766 + 435.8 71.1249 -17.718 47.0626 + 435.9 71.4543 -17.2418 47.0756 + 436 71.7735 -16.7546 47.0816 + 436.1 72.0927 -16.2562 47.0716 + 436.2 72.4325 -15.7468 47.0796 + 436.3 72.7516 -15.2264 47.0696 + 436.4 73.0502 -14.6837 47.0506 + 436.5 73.3591 -14.1411 47.0606 + 436.6 73.6577 -13.5874 47.0626 + 436.7 73.9357 -13.0227 47.0576 + 436.8 74.2137 -12.4357 47.0476 + 436.9 74.471 -11.8378 47.0536 + 437 74.7284 -11.2398 47.0516 + 437.1 74.9961 -10.6418 47.0486 + 437.2 75.2535 -10.0216 47.0575 + 437.3 75.5212 -9.40151 47.0635 + 437.4 75.7992 -8.78137 47.0665 + 437.5 76.0772 -8.13909 47.0745 + 437.6 76.3655 -7.4968 47.0895 + 437.7 76.6641 -6.85452 47.0955 + 437.8 76.9627 -6.20116 47.1055 + 437.9 77.2715 -5.53673 47.0945 + 438 77.5804 -4.8723 47.0975 + 438.1 77.9099 -4.20786 47.1035 + 438.2 78.2188 -3.53236 47.1075 + 438.3 78.5482 -2.85685 47.1095 + 438.4 78.8777 -2.18135 47.1065 + 438.5 79.2072 -1.50584 47.0985 + 438.6 79.5366 -0.81926 47.1075 + 438.7 79.8764 -0.13268 47.1035 + 438.8 80.2162 0.5539 47.1045 + 438.9 80.5559 1.24048 47.1045 + 439 80.8854 1.93813 47.1065 + 439.1 81.2457 2.64686 47.1055 + 439.2 81.5855 3.35559 47.1145 + 439.3 81.9459 4.06432 47.1185 + 439.4 82.2959 4.77305 47.1215 + 439.5 82.646 5.49285 47.1285 + 439.6 83.0063 6.21265 47.1335 + 439.7 83.3667 6.93245 47.1335 + 439.8 83.7374 7.66333 47.1444 + 439.9 84.0977 8.3942 47.1324 + 440 84.4581 9.12508 47.1374 + 440.1 84.839 9.85595 47.1414 + 440.2 85.2097 10.5979 47.1354 + 440.3 85.5803 11.3399 47.1324 + 440.4 85.9613 12.0929 47.1404 + 440.5 86.3525 12.8459 47.1544 + 440.6 86.7335 13.5989 47.1554 + 440.7 87.1144 14.3519 47.1704 + 440.8 87.5056 15.105 47.1824 + 440.9 87.8969 15.8691 47.1804 + 441 88.2778 16.6332 47.1834 + 441.1 88.6794 17.3862 47.1864 + 441.2 89.0706 18.1503 47.1844 + 441.3 89.4619 18.9144 47.1883 + 441.4 89.8531 19.6785 47.1723 + 441.5 90.2443 20.4537 47.1733 + 441.6 90.6459 21.2178 47.1683 + 441.7 91.0474 21.9929 47.1713 + 441.8 91.4387 22.757 47.1583 + 441.9 91.8299 23.5211 47.1703 + 442 92.2315 24.2963 47.1793 + 442.1 92.6227 25.0493 47.1943 + 442.2 93.0242 25.8134 47.1883 + 442.3 93.4052 26.5664 47.1953 + 442.4 93.7964 27.3084 47.1963 + 442.5 94.1877 28.0614 47.1942 + 442.6 94.5686 28.7923 47.1922 + 442.7 94.9496 29.5232 47.1832 + 442.8 95.3202 30.2651 47.1772 + 442.9 95.7012 30.9849 47.1682 + 443 96.0821 31.7269 47.1692 + 443.1 96.4631 32.4467 47.1552 + 443.2 96.8337 33.1775 47.1372 + 443.3 97.2146 33.9084 47.1372 + 443.4 97.5853 34.6393 47.1272 + 443.5 97.9662 35.3702 47.1061 + 443.6 98.3472 36.1121 47.1061 + 443.7 98.7281 36.843 47.0891 + 443.8 99.1091 37.5849 47.0771 + 443.9 99.5003 38.3269 47.0711 + 444 99.8813 39.0799 47.0621 + 444.1 100.273 39.8219 47.0541 + 444.2 100.653 40.5749 47.0361 + 444.3 101.034 41.3279 47.0391 + 444.4 101.426 42.0809 47.0461 + 444.5 101.807 42.8229 47.039 + 444.6 102.198 43.5759 47.029 + 444.7 102.579 44.34 47.023 + 444.8 102.96 45.093 47.016 + 444.9 103.341 45.8461 47.017 + 445 103.732 46.5991 47.021 + 445.1 104.103 47.341 47.007 + 445.2 104.484 48.0941 47.01 + 445.3 104.875 48.836 47.001 + 445.4 105.245 49.578 47.0009 + 445.5 105.616 50.331 46.9899 + 445.6 105.956 51.084 46.9729 + 445.7 106.275 51.837 46.9559 + 445.8 106.594 52.6011 46.9539 + 445.9 106.893 53.3652 46.9459 + 446 107.15 54.1404 46.9329 + 446.1 107.387 54.9266 46.9389 + 446.2 107.593 55.7129 46.9278 + 446.3 107.758 56.4991 46.9388 + 446.4 107.902 57.2964 46.9378 + 446.5 108.036 58.0938 46.9218 + 446.6 108.139 58.8911 46.9328 + 446.7 108.221 59.6884 46.9368 + 446.8 108.303 60.4968 46.9278 + 446.9 108.375 61.2941 46.9298 + 447 108.437 62.1025 46.9288 + 447.1 108.509 62.8887 46.9328 + 447.2 108.581 63.6971 46.9268 + 447.3 108.664 64.4945 46.9187 + 447.4 108.746 65.2918 46.9207 + 447.5 108.839 66.1002 46.9127 + 447.6 108.931 66.9196 46.9027 + 447.7 109.034 67.7391 46.8857 + 447.8 109.127 68.5586 46.8837 + 447.9 109.22 69.4002 46.8777 + 448 109.322 70.2418 46.8837 + 448.1 109.436 71.0945 46.8757 + 448.2 109.539 71.9582 46.8777 + 448.3 109.642 72.8331 46.8776 + 448.4 109.755 73.7079 46.8786 + 448.5 109.868 74.5938 46.8676 + 448.6 109.981 75.4797 46.8716 + 448.7 110.105 76.3767 46.8576 + 448.8 110.228 77.2737 46.8596 + 448.9 110.342 78.1817 46.8596 + 449 110.465 79.0898 46.8546 + 449.1 110.589 80.0089 46.8635 + 449.2 110.712 80.9391 46.8545 + 449.3 110.836 81.8583 46.8595 + 449.4 110.97 82.7995 46.8535 + 449.5 111.104 83.7297 46.8585 + 449.6 111.237 84.671 46.8535 + 449.7 111.371 85.6234 46.8655 + 449.8 111.515 86.5646 46.8534 + 449.9 111.639 87.517 46.8564 + 450 111.783 88.4583 46.8514 + 450.1 111.917 89.4106 46.8584 + 450.2 112.061 90.363 46.8654 + 450.3 112.195 91.3153 46.8514 + 450.4 112.339 92.2788 46.8533 + 450.5 112.473 93.2422 46.8643 + 450.6 112.607 94.2056 46.8663 + 450.7 112.761 95.169 46.8573 + 450.8 112.895 96.1325 46.8473 + 450.9 113.029 97.107 46.8533 + 451 113.173 98.0704 46.8532 + 451.1 113.317 99.0449 46.8472 + 451.2 113.451 100.008 46.8482 + 451.3 113.574 100.983 46.8472 + 451.4 113.657 101.957 46.8182 + 451.5 113.739 102.91 46.8172 + 451.6 113.791 103.873 46.8341 + 451.7 113.801 104.825 46.8281 + 451.8 113.77 105.767 46.8391 + 451.9 113.708 106.697 46.8261 + 452 113.585 107.605 46.8311 + 452.1 113.41 108.491 46.8351 + 452.2 113.214 109.344 46.8271 + 452.3 112.967 110.163 46.826 + 452.4 112.689 110.96 46.816 + 452.5 112.37 111.724 46.818 + 452.6 112.009 112.455 46.819 + 452.7 111.608 113.142 46.828 + 452.8 111.186 113.806 46.821 + 452.9 110.743 114.415 46.809 + 453 110.249 114.991 46.815 + 453.1 109.744 115.512 46.824 + 453.2 109.209 115.999 46.827 + 453.3 108.653 116.508 46.823 + 453.4 108.118 116.984 46.795 + 453.5 107.531 117.416 46.775 + 453.6 106.944 117.859 46.783 + 453.7 106.357 118.302 46.791 + 453.8 105.77 118.745 46.768 + 453.9 105.163 119.199 46.776 + 454 104.555 119.642 46.763 + 454.1 103.948 120.096 46.759 + 454.2 103.33 120.539 46.756 + 454.3 102.692 120.982 46.756 + 454.4 102.053 121.436 46.746 + 454.5 101.415 121.89 46.752 + 454.6 100.766 122.344 46.755 + 454.7 100.107 122.809 46.739 + 454.8 99.4483 123.263 46.74 + 454.9 98.7894 123.728 46.746 + 455 98.1098 124.193 46.747 + 455.1 97.4303 124.67 46.747 + 455.2 96.7508 125.135 46.743 + 455.3 96.0506 125.622 46.747 + 455.4 95.3711 126.087 46.738 + 455.5 94.6607 126.574 46.741 + 455.6 93.9503 127.062 46.743 + 455.7 93.2501 127.549 46.746 + 455.8 92.5294 128.047 46.753 + 455.9 91.7984 128.545 46.749 + 456 91.0777 129.044 46.757 + 456.1 90.3467 129.531 46.758 + 456.2 89.6054 130.04 46.765 + 456.3 88.864 130.55 46.768 + 456.4 88.1124 131.048 46.773 + 456.5 87.3608 131.569 46.78 + 456.6 86.6092 132.078 46.77 + 456.7 85.8576 132.598 46.774 + 456.8 85.0957 133.119 46.765 + 456.9 84.3338 133.628 46.776 + 457 83.5719 134.149 46.771 + 457.1 82.7997 134.68 46.77 + 457.2 82.0275 135.201 46.773 + 457.3 81.2553 135.732 46.773 + 457.4 80.4831 136.253 46.779 + 457.5 79.6801 136.751 46.763 + 457.6 78.8564 137.249 46.768 + 457.7 78.0533 137.703 46.774 + 457.8 77.2296 138.135 46.784 + 457.9 76.3957 138.523 46.787 + 458 75.5411 138.877 46.801 + 458.1 74.6865 139.176 46.819 + 458.2 73.8217 139.431 46.837 + 458.3 72.9568 139.652 46.854 + 458.4 72.092 139.819 46.8671 + 458.5 71.2477 139.929 46.8611 + 458.6 70.3931 140.007 46.8871 + 458.7 69.5489 140.04 46.8911 + 458.8 68.7149 140.018 46.8861 + 458.9 67.8912 139.951 46.9131 + 459 67.0881 139.852 46.9271 + 459.1 66.3057 139.719 46.9391 + 459.2 65.482 139.619 46.9451 + 459.3 64.6995 139.486 46.8981 + 459.4 63.917 139.331 46.8822 + 459.5 63.1345 139.209 46.8872 + 459.6 62.3314 139.088 46.8882 + 459.7 61.5284 138.988 46.8902 + 459.8 60.715 138.899 46.8892 + 459.9 59.9016 138.811 46.8922 + 460 59.0779 138.733 46.9032 + 460.1 58.244 138.645 46.8952 + 460.2 57.4203 138.567 46.9152 + 460.3 56.5863 138.479 46.9122 + 460.4 55.7421 138.412 46.9292 + 460.5 54.9081 138.335 46.9333 + 460.6 54.0535 138.268 46.9363 + 460.7 53.2093 138.191 46.9383 + 460.8 52.365 138.124 46.9573 + 460.9 51.5001 138.058 46.9613 + 461 50.6559 137.991 46.9643 + 461.1 49.7807 137.925 46.9743 + 461.2 48.9159 137.858 46.9763 + 461.3 48.051 137.803 46.9883 + 461.4 47.1759 137.748 46.9953 + 461.5 46.311 137.681 47.0043 + 461.6 45.4359 137.615 46.9993 + 461.7 44.5607 137.559 47.0224 + 461.8 43.6856 137.515 47.0264 + 461.9 42.8207 137.46 47.0314 + 462 41.9352 137.393 47.0364 + 462.1 41.0601 137.338 47.0394 + 462.2 40.1849 137.294 47.0464 + 462.3 39.2995 137.238 47.0524 + 462.4 38.414 137.183 47.0454 + 462.5 37.5286 137.139 47.0534 + 462.6 36.6432 137.083 47.0514 + 462.7 35.7474 137.028 47.0514 + 462.8 34.862 136.972 47.0584 + 462.9 33.9662 136.917 47.0494 + 463 33.0602 136.862 47.0604 + 463.1 32.1541 136.795 47.0524 + 463.2 31.2481 136.751 47.0554 + 463.3 30.3523 136.685 47.0535 + 463.4 29.436 136.629 47.0625 + 463.5 28.5197 136.574 47.0625 + 463.6 27.6033 136.518 47.0685 + 463.7 26.687 136.452 47.0695 + 463.8 25.7707 136.397 47.0795 + 463.9 24.844 136.341 47.0755 + 464 23.9174 136.275 47.0845 + 464.1 23.0011 136.219 47.0825 + 464.2 22.0744 136.164 47.0885 + 464.3 21.1375 136.109 47.0965 + 464.4 20.2109 136.042 47.1035 + 464.5 19.2739 135.987 47.1075 + 464.6 18.3473 135.931 47.1195 + 464.7 17.4104 135.876 47.1265 + 464.8 16.4735 135.81 47.1265 + 464.9 15.5365 135.754 47.1365 + 465 14.5996 135.699 47.1315 + 465.1 13.6627 135.632 47.1425 + 465.2 12.7257 135.577 47.1425 + 465.3 11.7888 135.522 47.1645 + 465.4 10.8519 135.455 47.1565 + 465.5 9.91496 135.4 47.1755 + 465.6 8.97804 135.345 47.1926 + 465.7 8.0514 135.289 47.2566 + 465.8 7.11448 135.234 47.3196 + 465.9 6.17755 135.178 47.4036 + 466 5.26121 135.123 47.5106 + 466.1 4.33458 135.068 47.6166 + 466.2 3.41824 135.012 47.7376 + 466.3 2.49161 134.957 47.8716 + 466.4 1.57527 134.902 47.9946 + 466.5 0.669234 134.846 48.1386 + 466.6 -0.247102 134.791 48.2346 + 466.7 -1.16344 134.736 48.3376 + 466.8 -2.05918 134.68 48.4116 + 466.9 -2.97552 134.614 48.4726 + 467 -3.88156 134.558 48.5216 + 467.1 -4.77731 134.503 48.5596 + 467.2 -5.68335 134.437 48.5856 + 467.3 -6.57909 134.381 48.6046 + 467.4 -7.47484 134.326 48.5986 + 467.5 -8.36028 134.259 48.6116 + 467.6 -9.23544 134.204 48.6226 + 467.7 -10.1106 134.16 48.6536 + 467.8 -10.9754 134.093 48.6976 + 467.9 -11.8403 134.049 48.7626 + 468 -12.6949 133.983 48.8546 + 468.1 -13.5391 133.927 48.9396 + 468.2 -14.3731 133.872 49.0416 + 468.3 -15.1968 133.816 49.1516 + 468.4 -16.0102 133.761 49.3026 + 468.5 -16.8132 133.706 49.4736 + 468.6 -17.606 133.65 49.6686 + 468.7 -18.3988 133.595 49.9126 + 468.8 -19.171 133.551 50.1666 + 468.9 -19.9432 133.484 50.4366 + 469 -20.7154 133.44 50.7396 + 469.1 -21.4773 133.385 51.0576 + 469.2 -22.2289 133.329 51.3886 + 469.3 -22.9908 133.285 51.7456 + 469.4 -23.7527 133.23 52.0866 + 469.5 -24.5043 133.185 52.4596 + 469.6 -25.2559 133.13 52.8266 + 469.7 -26.0178 133.086 53.1966 + 469.8 -26.7694 133.041 53.5665 + 469.9 -27.521 132.986 53.9365 + 470 -28.2829 132.942 54.3115 + 470.1 -29.0448 132.886 54.6755 + 470.2 -29.7964 132.842 55.0415 + 470.3 -30.5583 132.798 55.3915 + 470.4 -31.3099 132.742 55.7495 + 470.5 -32.0718 132.698 56.0935 + 470.6 -32.8337 132.654 56.4195 + 470.7 -33.5956 132.598 56.7505 + 470.8 -34.3575 132.554 57.0655 + 470.9 -35.1091 132.499 57.3735 + 471 -35.871 132.455 57.6685 + 471.1 -36.6329 132.41 57.9385 + 471.2 -37.3948 132.355 58.1895 + 471.3 -38.1567 132.3 58.3995 + 471.4 -38.9186 132.255 58.5745 + 471.5 -39.6908 132.2 58.7105 + 471.6 -40.4527 132.144 58.8325 + 471.7 -41.2249 132.089 58.9005 + 471.8 -41.9971 132.045 58.9565 + 471.9 -42.7796 131.978 58.9965 + 472 -43.5724 131.923 59.0005 + 472.1 -44.3549 131.868 58.9985 + 472.2 -45.1477 131.801 59.0035 + 472.3 -45.9405 131.746 58.9955 + 472.4 -46.7435 131.69 58.9935 + 472.5 -47.5363 131.624 58.9785 + 472.6 -48.3394 131.569 58.9725 + 472.7 -49.1322 131.502 58.9754 + 472.8 -49.9456 131.436 58.9604 + 472.9 -50.7487 131.369 58.9604 + 473 -51.5517 131.314 58.9664 + 473.1 -52.3548 131.225 58.9714 + 473.2 -53.1682 131.126 58.9724 + 473.3 -53.9713 131.026 58.9764 + 473.4 -54.7847 130.904 58.9804 + 473.5 -55.5878 130.749 58.9984 + 473.6 -56.3908 130.583 59.0084 + 473.7 -57.2042 130.406 59.0164 + 473.8 -58.0279 130.24 59.0234 + 473.9 -58.831 130.052 59.0174 + 474 -59.6444 129.841 59.0274 + 474.1 -60.4474 129.653 59.0354 + 474.2 -61.2608 129.454 59.0404 + 474.3 -62.0742 129.243 59.0344 + 474.4 -62.8979 129.055 59.0494 + 474.5 -63.7113 128.845 59.0604 + 474.6 -64.5349 128.623 59.0714 + 474.7 -65.3586 128.368 59.0714 + 474.8 -66.172 128.114 59.0734 + 474.9 -67.006 127.881 59.0844 + 475 -67.8296 127.638 59.0974 + 475.1 -68.6533 127.383 59.0894 + 475.2 -69.4873 127.128 59.1033 + 475.3 -70.311 126.896 59.1123 + 475.4 -71.1449 126.641 59.1133 + 475.5 -71.9892 126.408 59.1463 + 475.6 -72.8232 126.165 59.1993 + 475.7 -73.6571 125.921 59.2813 + 475.8 -74.5014 125.689 59.3763 + 475.9 -75.3354 125.445 59.5003 + 476 -76.1797 125.201 59.6503 + 476.1 -77.0136 124.969 59.8073 + 476.2 -77.8476 124.736 59.9913 + 476.3 -78.6816 124.504 60.1853 + 476.4 -79.5156 124.282 60.3763 + 476.5 -80.3392 124.05 60.5833 + 476.6 -81.1732 123.828 60.7663 + 476.7 -81.9969 123.596 60.9633 + 476.8 -82.8206 123.374 61.1513 + 476.9 -83.6443 123.142 61.3513 + 477 -84.4576 122.92 61.5333 + 477.1 -85.2813 122.699 61.6952 + 477.2 -86.0947 122.488 61.8632 + 477.3 -86.8978 122.256 62.0162 + 477.4 -87.7009 122.045 62.1702 + 477.5 -88.4937 121.835 62.3052 + 477.6 -89.2762 121.602 62.4332 + 477.7 -90.0689 121.381 62.5672 + 477.8 -90.8411 121.16 62.6922 + 477.9 -91.6236 120.938 62.7942 + 478 -92.3958 120.717 62.9102 + 478.1 -93.1474 120.473 62.9972 + 478.2 -93.9094 120.229 63.1082 + 478.3 -94.6507 119.986 63.1952 + 478.4 -95.4023 119.742 63.2802 + 478.5 -96.1436 119.498 63.3592 + 478.6 -96.8849 119.244 63.4351 + 478.7 -97.6159 118.978 63.5001 + 478.8 -98.3366 118.712 63.5531 + 478.9 -99.0573 118.435 63.5971 + 479 -99.7678 118.147 63.6531 + 479.1 -100.478 117.86 63.7041 + 479.2 -101.178 117.55 63.7511 + 479.3 -101.868 117.228 63.7871 + 479.4 -102.548 116.896 63.8381 + 479.5 -103.207 116.553 63.8761 + 479.6 -103.866 116.187 63.9291 + 479.7 -104.525 115.822 63.9791 + 479.8 -105.173 115.446 64.0121 + 479.9 -105.801 115.058 64.0601 + 480 -106.44 114.67 64.0871 + 480.1 -107.068 114.261 64.1101 + 480.2 -107.696 113.851 64.1361 + 480.3 -108.313 113.452 64.1521 + 480.4 -108.931 113.031 64.1731 + 480.5 -109.539 112.611 64.1741 + 480.6 -110.156 112.19 64.1791 + 480.7 -110.774 111.769 64.1781 + 480.8 -111.392 111.348 64.1831 + 480.9 -111.999 110.927 64.18 + 481 -112.627 110.507 64.188 + 481.1 -113.256 110.086 64.174 + 481.2 -113.884 109.665 64.179 + 481.3 -114.512 109.244 64.179 + 481.4 -115.14 108.812 64.171 + 481.5 -115.788 108.392 64.178 + 481.6 -116.437 107.949 64.176 + 481.7 -117.086 107.517 64.169 + 481.8 -117.745 107.085 64.184 + 481.9 -118.393 106.642 64.206 + 482 -119.062 106.199 64.224 + 482.1 -119.721 105.767 64.294 + 482.2 -120.391 105.335 64.39 + 482.3 -121.06 104.892 64.49 + 482.4 -121.709 104.46 64.627 + 482.5 -122.378 104.028 64.788 + 482.6 -123.026 103.597 64.952 + 482.7 -123.675 103.165 65.125 + 482.8 -124.313 102.755 65.299 + 482.9 -124.952 102.334 65.486 + 483 -125.58 101.924 65.6659 + 483.1 -126.198 101.515 65.8489 + 483.2 -126.805 101.116 66.0299 + 483.3 -127.413 100.717 66.2159 + 483.4 -127.999 100.33 66.3949 + 483.5 -128.576 99.9534 66.5859 + 483.6 -129.163 99.5658 66.7589 + 483.7 -129.74 99.1893 66.9299 + 483.8 -130.306 98.8128 67.1199 + 483.9 -130.872 98.4363 67.2959 + 484 -131.438 98.0708 67.4819 + 484.1 -131.994 97.7054 67.6659 + 484.2 -132.561 97.3289 67.8509 + 484.3 -133.137 96.9635 68.0319 + 484.4 -133.704 96.5981 68.2179 + 484.5 -134.27 96.2215 68.4059 + 484.6 -134.836 95.8561 68.5929 + 484.7 -135.413 95.4796 68.7778 + 484.8 -135.979 95.1031 68.9508 + 484.9 -136.566 94.7266 69.1348 + 485 -137.142 94.3501 69.3128 + 485.1 -137.729 93.9736 69.4858 + 485.2 -138.316 93.5971 69.6708 + 485.3 -138.903 93.2095 69.8408 + 485.4 -139.49 92.8219 70.0128 + 485.5 -140.087 92.4344 70.1718 + 485.6 -140.684 92.0468 70.3388 + 485.7 -141.281 91.6481 70.4998 + 485.8 -141.889 91.2605 70.6558 + 485.9 -142.486 90.8508 70.8178 + 486 -143.094 90.4522 70.9708 + 486.1 -143.701 90.0535 71.1237 + 486.2 -144.308 89.6549 71.2747 + 486.3 -144.926 89.2341 71.4207 + 486.4 -145.544 88.8243 71.5667 + 486.5 -146.162 88.4146 71.7197 + 486.6 -146.79 87.9938 71.8727 + 486.7 -147.418 87.5841 72.0247 + 486.8 -148.056 87.1633 72.1727 + 486.9 -148.695 86.7314 72.3217 + 487 -149.333 86.3106 72.4577 + 487.1 -149.982 85.8787 72.6047 + 487.2 -150.641 85.4469 72.7566 + 487.3 -151.289 85.0039 72.8936 + 487.4 -151.958 84.561 73.0346 + 487.5 -152.617 84.1291 73.1816 + 487.6 -153.297 83.6751 73.3206 + 487.7 -153.966 83.2321 73.4616 + 487.8 -154.646 82.7781 73.5846 + 487.9 -155.325 82.313 73.7236 + 488 -156.015 81.859 73.8376 + 488.1 -156.705 81.405 73.9306 + 488.2 -157.395 80.9399 74.0315 + 488.3 -158.085 80.4748 74.0975 + 488.4 -158.785 80.0208 74.1575 + 488.5 -159.485 79.5557 74.2105 + 488.6 -160.185 79.0795 74.2615 + 488.7 -160.896 78.6144 74.2985 + 488.8 -161.606 78.1493 74.3035 + 488.9 -162.306 77.6842 74.3255 + 489 -163.017 77.208 74.3344 + 489.1 -163.727 76.7429 74.3314 + 489.2 -164.427 76.2668 74.3604 + 489.3 -165.127 75.8128 74.3924 + 489.4 -165.827 75.3477 74.4554 + 489.5 -166.517 74.8826 74.5364 + 489.6 -167.197 74.4285 74.6544 + 489.7 -167.876 73.9745 74.7984 + 489.8 -168.556 73.5205 74.9503 + 489.9 -169.225 73.0665 75.1143 + 490 -169.894 72.6235 75.2933 + 490.1 -170.553 72.1584 75.4713 + 490.2 -171.202 71.7044 75.6703 + 490.3 -171.851 71.2504 75.8553 + 490.4 -172.499 70.7853 76.0433 + 490.5 -173.148 70.3202 76.2173 + 490.6 -173.786 69.844 76.4102 + 490.7 -174.425 69.3568 76.5892 + 490.8 -175.053 68.8585 76.7682 + 490.9 -175.681 68.3491 76.9382 + 491 -176.299 67.8397 77.1082 + 491.1 -176.916 67.3192 77.2702 + 491.2 -177.534 66.7766 77.4412 + 491.3 -178.152 66.234 77.6012 + 491.4 -178.759 65.6803 77.7682 + 491.5 -179.356 65.1156 77.9421 + 491.6 -179.954 64.5508 78.0981 + 491.7 -180.541 63.9639 78.2611 + 491.8 -181.117 63.377 78.4161 + 491.9 -181.704 62.779 78.5651 + 492 -182.27 62.181 78.7251 + 492.1 -182.837 61.5609 78.8751 + 492.2 -183.382 60.9408 79.0141 + 492.3 -183.938 60.3096 79.1581 + 492.4 -184.484 59.6673 79.2811 + 492.5 -185.03 59.0361 79.427 + 492.6 -185.565 58.3938 79.544 + 492.7 -186.101 57.7404 79.672 + 492.8 -186.636 57.0871 79.791 + 492.9 -187.161 56.4448 79.906 + 493 -187.696 55.7915 80.008 + 493.1 -188.222 55.127 80.138 + 493.2 -188.747 54.4626 80.233 + 493.3 -189.272 53.7982 80.349 + 493.4 -189.776 53.1227 80.452 + 493.5 -190.291 52.4472 80.5539 + 493.6 -190.796 51.7606 80.6489 + 493.7 -191.3 51.074 80.7519 + 493.8 -191.805 50.3764 80.8379 + 493.9 -192.289 49.6677 80.9269 + 494 -192.772 48.97 81.0259 + 494.1 -193.246 48.2391 81.1109 + 494.2 -193.709 47.5304 81.2119 + 494.3 -194.173 46.7885 81.3049 + 494.4 -194.626 46.0576 81.3939 + 494.5 -195.069 45.3046 81.4929 + 494.6 -195.501 44.5516 81.5838 + 494.7 -195.923 43.7985 81.6728 + 494.8 -196.325 43.0234 81.7668 + 494.9 -196.726 42.2482 81.8548 + 495 -197.107 41.462 81.9278 + 495.1 -197.468 40.6757 81.9978 + 495.2 -197.828 39.8673 82.0718 + 495.3 -198.168 39.0589 82.1348 + 495.4 -198.487 38.2395 82.1798 + 495.5 -198.796 37.42 82.2198 + 495.6 -199.094 36.5895 82.2548 + 495.7 -199.383 35.7589 82.2898 + 495.8 -199.681 34.9173 82.3058 + 495.9 -199.98 34.0979 82.3038 + 496 -200.258 33.2673 82.3228 + 496.1 -200.536 32.4368 82.3268 + 496.2 -200.824 31.6173 82.3368 + 496.3 -201.113 30.8089 82.3288 + 496.4 -201.38 30.0005 82.3318 + 496.5 -201.658 29.2254 82.3377 + 496.6 -201.916 28.4613 82.3467 + 496.7 -202.183 27.7636 82.3307 + 496.8 -202.41 27.077 82.3157 + 496.9 -202.616 26.4347 82.3347 + 497 -202.822 25.8478 82.3047 + 497.1 -202.986 25.3163 82.3157 + 497.2 -203.131 24.818 82.3227 + 497.3 -203.213 24.3196 82.2937 + 497.4 -203.285 23.921 82.2897 + 497.5 -203.326 23.5445 82.3107 + 497.6 -203.337 23.1679 82.3157 + 497.7 -203.337 22.8136 82.3107 + 497.8 -203.295 22.4703 82.3057 + 497.9 -203.254 22.1602 82.3077 + 498 -203.192 21.8502 82.3067 + 498.1 -203.131 21.5622 82.3287 + 498.2 -203.059 21.2632 82.3377 + 498.3 -202.976 20.9753 82.3287 + 498.4 -202.873 20.6874 82.3267 + 498.5 -202.76 20.4105 82.3417 + 498.6 -202.647 20.1337 82.3358 + 498.7 -202.513 19.8679 82.3278 + 498.8 -202.369 19.6021 82.3348 + 498.9 -202.204 19.3364 82.3318 + 499 -202.039 19.0817 82.3298 + 499.1 -201.864 18.827 82.3208 + 499.2 -201.679 18.5723 82.3058 + 499.3 -201.473 18.3397 82.3168 + 499.4 -201.257 18.085 82.3108 + 499.5 -201.03 17.8414 82.3068 + 499.6 -200.804 17.6088 82.3048 + 499.7 -200.567 17.3763 82.3038 + 499.8 -200.299 17.1548 82.2958 + 499.9 -200.032 16.9333 82.3018 + 500 -199.764 16.7229 82.2959 + 500.1 -199.476 16.5236 82.2839 + 500.2 -199.177 16.3353 82.2839 + 500.3 -198.858 16.1581 82.2799 + 500.4 -198.539 16.0031 82.2669 + 500.5 -198.209 15.848 82.2559 + 500.6 -197.869 15.7262 82.2469 + 500.7 -197.519 15.6155 82.2599 + 500.8 -197.169 15.5158 82.2489 + 500.9 -196.809 15.4161 82.2449 + 501 -196.449 15.3275 82.237 + 501.1 -196.068 15.25 82.234 + 501.2 -195.687 15.1946 82.216 + 501.3 -195.306 15.1282 82.229 + 501.4 -194.915 15.0728 82.224 + 501.5 -194.503 15.0396 82.222 + 501.6 -194.091 15.0064 82.23 + 501.7 -193.679 15.0064 82.231 + 501.8 -193.257 15.0063 82.2191 + 501.9 -192.824 15.0285 82.2121 + 502 -192.392 15.0396 82.2201 + 502.1 -191.96 15.0728 82.2111 + 502.2 -191.537 15.1281 82.2091 + 502.3 -191.105 15.1724 82.2161 + 502.4 -190.662 15.2056 82.2181 + 502.5 -190.23 15.2389 82.2121 + 502.6 -189.797 15.2721 82.2412 + 502.7 -189.355 15.3053 82.2922 + 502.8 -188.912 15.3385 82.3392 + 502.9 -188.49 15.3607 82.3932 + 503 -188.057 15.3828 82.4582 + 503.1 -187.615 15.4049 82.5292 + 503.2 -187.203 15.4271 82.5932 + 503.3 -186.781 15.4492 82.6522 + 503.4 -186.369 15.4714 82.7093 + 503.5 -185.967 15.4935 82.7663 + 503.6 -185.566 15.5157 82.8263 + 503.7 -185.174 15.5378 82.8813 + 503.8 -184.773 15.571 82.9453 + 503.9 -184.402 15.5932 82.9813 + 504 -184.021 15.6153 83.0363 + 504.1 -183.651 15.6374 83.0833 + 504.2 -183.27 15.6596 83.1093 + 504.3 -182.899 15.6817 83.1434 + 504.4 -182.539 15.715 83.1694 + 504.5 -182.178 15.7371 83.1844 + 504.6 -181.818 15.7592 83.2124 + 504.7 -181.468 15.7925 83.2224 + 504.8 -181.108 15.8035 83.2414 + 504.9 -180.768 15.8367 83.2664 + 505 -180.428 15.8478 83.2864 + 505.1 -180.078 15.881 83.3024 + 505.2 -179.748 15.8921 83.3284 + 505.3 -179.409 15.9142 83.3395 + 505.4 -179.079 15.9364 83.3835 + 505.5 -178.739 15.9585 83.4035 + 505.6 -178.41 15.9807 83.4235 + 505.7 -178.081 16.0028 83.4595 + 505.8 -177.751 16.0139 83.4955 + 505.9 -177.411 16.036 83.5035 + 506 -177.071 16.0582 83.5435 + 506.1 -176.742 16.0803 83.5685 + 506.2 -176.402 16.0914 83.5835 + 506.3 -176.062 16.1135 83.6086 + 506.4 -175.723 16.1357 83.6266 + 506.5 -175.393 16.1468 83.6346 + 506.6 -175.053 16.1689 83.6526 + 506.7 -174.724 16.191 83.6546 + 506.8 -174.395 16.2132 83.6566 + 506.9 -174.055 16.2243 83.6526 + 507 -173.736 16.2464 83.6506 + 507.1 -173.416 16.2685 83.6586 + 507.2 -173.108 16.2907 83.6546 + 507.3 -172.788 16.3018 83.6466 + 507.4 -172.459 16.3239 83.6296 + 507.5 -172.129 16.346 83.6317 + 507.6 -171.8 16.3682 83.6287 + 507.7 -171.45 16.3793 83.6277 + 507.8 -171.11 16.4014 83.6357 + 507.9 -170.75 16.4235 83.6397 + 508 -170.369 16.4457 83.6357 + 508.1 -169.978 16.4789 83.6437 + 508.2 -169.586 16.5011 83.6437 + 508.3 -169.185 16.5232 83.6317 + 508.4 -168.773 16.5453 83.6347 + 508.5 -168.34 16.5786 83.6308 + 508.6 -167.908 16.6007 83.6578 + 508.7 -167.465 16.6339 83.6388 + 508.8 -167.012 16.6671 83.6438 + 508.9 -166.559 16.6893 83.6398 + 509 -166.086 16.7225 83.6648 + 509.1 -165.622 16.7668 83.6578 + 509.2 -165.149 16.7889 83.6398 + 509.3 -164.665 16.8221 83.6449 + 509.4 -164.171 16.8554 83.6459 + 509.5 -163.676 16.8886 83.6559 + 509.6 -163.182 16.9218 83.6429 + 509.7 -162.678 16.955 83.6569 + 509.8 -162.163 16.9882 83.6459 + 509.9 -161.648 17.0214 83.6569 + 510 -161.133 17.0657 83.6739 + 510.1 -160.608 17.0989 83.666 + 510.2 -160.083 17.1322 83.667 + 510.3 -159.558 17.1654 83.654 + 510.4 -159.023 17.1986 83.657 + 510.5 -158.487 17.2429 83.669 + 510.6 -157.941 17.2761 83.661 + 510.7 -157.406 17.3093 83.667 + 510.8 -156.85 17.3425 83.663 + 510.9 -156.315 17.3758 83.6601 + 511 -155.759 17.42 83.6711 + 511.1 -155.203 17.4643 83.6671 + 511.2 -154.657 17.4975 83.6701 + 511.3 -154.101 17.5308 83.6721 + 511.4 -153.535 17.564 83.6721 + 511.5 -152.989 17.6083 83.6671 + 511.6 -152.423 17.6526 83.6802 + 511.7 -151.856 17.6858 83.6752 + 511.8 -151.3 17.7301 83.6722 + 511.9 -150.734 17.7633 83.6782 + 512 -150.178 17.8076 83.6712 + 512.1 -149.612 17.8519 83.6782 + 512.2 -149.046 17.8851 83.6792 + 512.3 -148.479 17.9183 83.6822 + 512.4 -147.923 17.9626 83.6873 + 512.5 -147.357 17.9958 83.6843 + 512.6 -146.801 18.0401 83.6803 + 512.7 -146.245 18.0733 83.6983 + 512.8 -145.689 18.1176 83.6903 + 512.9 -145.143 18.1508 83.6893 + 513 -144.598 18.184 83.6873 + 513.1 -144.062 18.2283 83.6843 + 513.2 -143.517 18.2615 83.6834 + 513.3 -142.981 18.2948 83.6874 + 513.4 -142.446 18.339 83.6814 + 513.5 -141.921 18.3612 83.6834 + 513.6 -141.396 18.4055 83.6794 + 513.7 -140.881 18.4387 83.6754 + 513.8 -140.356 18.4719 83.6804 + 513.9 -139.841 18.5051 83.6684 + 514 -139.326 18.5384 83.6775 + 514.1 -138.811 18.5716 83.6655 + 514.2 -138.276 18.6048 83.6645 + 514.3 -137.761 18.638 83.6575 + 514.4 -137.236 18.6712 83.6645 + 514.5 -136.69 18.7044 83.6525 + 514.6 -136.155 18.7377 83.6545 + 514.7 -135.609 18.7709 83.6425 + 514.8 -135.053 18.8152 83.6465 + 514.9 -134.487 18.8484 83.6376 + 515 -133.931 18.8816 83.6316 + 515.1 -133.344 18.9148 83.6276 + 515.2 -132.757 18.948 83.6316 + 515.3 -132.15 18.9923 83.6206 + 515.4 -131.542 19.0255 83.6316 + 515.5 -130.925 19.0698 83.6296 + 515.6 -130.286 19.1141 83.6336 + 515.7 -129.638 19.1473 83.6427 + 515.8 -128.989 19.1916 83.6357 + 515.9 -128.32 19.2359 83.6337 + 516 -127.661 19.2802 83.6317 + 516.1 -126.981 19.3245 83.6437 + 516.2 -126.302 19.3688 83.6457 + 516.3 -125.622 19.4352 83.6377 + 516.4 -124.932 19.5127 83.6397 + 516.5 -124.242 19.6013 83.6468 + 516.6 -123.553 19.7121 83.6378 + 516.7 -122.863 19.8339 83.6418 + 516.8 -122.183 19.9778 83.6368 + 516.9 -121.493 20.155 83.6368 + 517 -120.814 20.3432 83.6428 + 517.1 -120.124 20.5315 83.6518 + 517.2 -119.434 20.7197 83.6528 + 517.3 -118.755 20.9301 83.6449 + 517.4 -118.065 21.1295 83.6479 + 517.5 -117.375 21.3288 83.6449 + 517.6 -116.685 21.5281 83.6649 + 517.7 -115.985 21.7164 83.6629 + 517.8 -115.295 21.9046 83.6549 + 517.9 -114.605 22.1039 83.6639 + 518 -113.905 22.2922 83.6629 + 518.1 -113.205 22.4694 83.672 + 518.2 -112.505 22.6576 83.678 + 518.3 -111.805 22.857 83.681 + 518.4 -111.105 23.0452 83.685 + 518.5 -110.405 23.2335 83.691 + 518.6 -109.694 23.4217 83.701 + 518.7 -108.994 23.61 83.709 + 518.8 -108.294 23.7982 83.713 + 518.9 -107.583 23.9865 83.711 + 519 -106.883 24.1747 83.7131 + 519.1 -106.173 24.374 83.7151 + 519.2 -105.462 24.5623 83.7171 + 519.3 -104.752 24.7395 83.7091 + 519.4 -104.042 24.9388 83.7071 + 519.5 -103.331 25.127 83.7161 + 519.6 -102.621 25.3153 83.7201 + 519.7 -101.9 25.5035 83.7131 + 519.8 -101.19 25.7029 83.7141 + 519.9 -100.479 25.8911 83.7152 + 520 -99.7584 26.0794 83.7272 + 520.1 -99.048 26.2676 83.7202 + 520.2 -98.3375 26.467 83.7212 + 520.3 -97.6168 26.6552 83.7202 + 520.4 -96.8961 26.8435 83.7372 + 520.5 -96.1753 27.0317 83.7282 + 520.6 -95.4546 27.231 83.7372 + 520.7 -94.7442 27.4082 83.7332 + 520.8 -94.0132 27.6075 83.7222 + 520.9 -93.3027 27.7958 83.7313 + 521 -92.582 27.973 83.7203 + 521.1 -91.8613 28.1612 83.7213 + 521.2 -91.1406 28.3495 83.7133 + 521.3 -90.4199 28.5377 83.7243 + 521.4 -89.6991 28.726 83.7183 + 521.5 -88.9681 28.9142 83.7283 + 521.6 -88.2577 29.1025 83.7353 + 521.7 -87.5267 29.2907 83.7263 + 521.8 -86.8059 29.479 83.7193 + 521.9 -86.0955 29.6562 83.7293 + 522 -85.3645 29.8444 83.7254 + 522.1 -84.6541 30.0216 83.7224 + 522.2 -83.9436 30.2099 83.7324 + 522.3 -83.2229 30.3981 83.7184 + 522.4 -82.5125 30.5753 83.7174 + 522.5 -81.7918 30.7635 83.7064 + 522.6 -81.0813 30.9518 83.7114 + 522.7 -80.3709 31.1511 83.7104 + 522.8 -79.6605 31.3394 83.7004 + 522.9 -78.9603 31.5498 83.6934 + 523 -78.2602 31.7602 83.7004 + 523.1 -77.5498 31.9816 83.6914 + 523.2 -76.8599 32.2253 83.6865 + 523.3 -76.1701 32.4689 83.6855 + 523.4 -75.4803 32.7236 83.6945 + 523.5 -74.7904 33.0004 83.6845 + 523.6 -74.1109 33.2773 83.6895 + 523.7 -73.4314 33.5652 83.6885 + 523.8 -72.7621 33.8642 83.7015 + 523.9 -72.0929 34.1743 83.6945 + 524 -71.4339 34.4954 83.6865 + 524.1 -70.7647 34.8276 83.6825 + 524.2 -70.116 35.1598 83.6905 + 524.3 -69.4777 35.5142 83.6865 + 524.4 -68.8393 35.8796 83.6685 + 524.5 -68.201 36.2451 83.6795 + 524.6 -67.5832 36.6326 83.6905 + 524.7 -66.9448 37.0091 83.6795 + 524.8 -66.3168 37.3857 83.6945 + 524.9 -65.699 37.7732 83.6945 + 525 -65.071 38.1719 83.6946 + 525.1 -64.4635 38.5595 83.7066 + 525.2 -63.8251 38.936 83.7156 + 525.3 -63.2074 39.3125 83.7156 + 525.4 -62.5793 39.689 83.7236 + 525.5 -61.9512 40.0655 83.7246 + 525.6 -61.3232 40.442 83.7266 + 525.7 -60.6642 40.7964 83.7346 + 525.8 -60.0053 41.1175 83.7256 + 525.9 -59.3463 41.4387 83.7236 + 526 -58.6771 41.7155 83.7236 + 526.1 -57.9976 41.9591 83.7256 + 526.2 -57.318 42.1696 83.7446 + 526.3 -56.6282 42.3357 83.7376 + 526.4 -55.9486 42.4907 83.7606 + 526.5 -55.2691 42.6789 83.7536 + 526.6 -54.5999 42.8451 83.7296 + 526.7 -53.91 42.9779 83.7086 + 526.8 -53.2099 43.1108 83.7136 + 526.9 -52.5304 43.2769 83.7136 + 527 -51.8405 43.4541 83.7186 + 527.1 -51.1713 43.6313 83.7406 + 527.2 -50.4712 43.8085 83.7536 + 527.3 -49.771 43.9635 83.7657 + 527.4 -49.0606 44.0964 83.7487 + 527.5 -48.3605 44.2071 83.7527 + 527.6 -47.6706 44.3179 83.7587 + 527.7 -46.9808 44.3954 83.7797 + 527.8 -46.291 44.5061 83.7777 + 527.9 -45.5908 44.6058 83.7447 + 528 -44.901 44.6833 83.7537 + 528.1 -44.2009 44.7387 83.7297 + 528.2 -43.511 44.8162 83.7087 + 528.3 -42.8212 44.9158 83.7357 + 528.4 -42.1108 44.9823 83.7427 + 528.5 -41.4106 45.0044 83.7347 + 528.6 -40.7208 45.0155 83.7327 + 528.7 -40.031 44.9933 83.7507 + 528.8 -39.3514 44.949 83.7597 + 528.9 -38.6822 44.8715 83.7807 + 529 -38.013 44.7829 83.7827 + 529.1 -37.3437 44.7054 83.7817 + 529.2 -36.6745 44.6279 83.7867 + 529.3 -36.0052 44.5061 83.7797 + 529.4 -35.336 44.3843 83.7737 + 529.5 -34.6667 44.2182 83.7718 + 529.6 -34.0181 44.0853 83.7598 + 529.7 -33.3797 43.9081 83.7798 + 529.8 -32.7414 43.7641 83.7948 + 529.9 -32.0721 43.6312 83.7498 + 530 -31.4338 43.443 83.6918 + 530.1 -30.7954 43.2436 83.6018 + 530.2 -30.1571 43 83.5088 + 530.3 -29.5496 42.7675 83.4008 + 530.4 -28.9524 42.5349 83.3178 + 530.5 -28.3759 42.247 83.2718 + 530.6 -27.8199 41.9258 83.2228 + 530.7 -27.3257 41.5604 83.1958 + 530.8 -26.8521 41.1617 83.1708 + 530.9 -26.4402 40.7409 83.1648 + 531 -26.0593 40.298 83.1588 + 531.1 -25.7092 39.8439 83.1648 + 531.2 -25.3385 39.3899 83.1488 + 531.3 -25.0091 38.9027 83.1498 + 531.4 -24.6899 38.4265 83.1648 + 531.5 -24.381 37.9392 83.1858 + 531.6 -24.0824 37.4409 83.2088 + 531.7 -23.7735 36.9426 83.2268 + 531.8 -23.4647 36.4442 83.2149 + 531.9 -23.1558 35.9459 83.2319 + 532 -22.8469 35.4365 83.2329 + 532.1 -22.5483 34.9271 83.2309 + 532.2 -22.2497 34.4177 83.2359 + 532.3 -21.9615 33.8972 83.2379 + 532.4 -21.6629 33.3768 83.2419 + 532.5 -21.3643 32.8563 83.2309 + 532.6 -21.0554 32.3358 83.2169 + 532.7 -20.7568 31.8043 83.2239 + 532.8 -20.4479 31.2727 83.2109 + 532.9 -20.1494 30.7301 83.2089 + 533 -19.8405 30.1764 83.1909 + 533.1 -19.5316 29.6227 83.1899 + 533.2 -19.2124 29.0579 83.1739 + 533.3 -18.8932 28.4821 83.1659 + 533.4 -18.5638 27.8952 83.1729 + 533.5 -18.224 27.2972 83.1459 + 533.6 -17.8739 26.6771 83.1579 + 533.7 -17.5239 26.0458 83.1549 + 533.8 -17.1635 25.4146 83.1419 + 533.9 -16.8031 24.7613 83.1449 + 534 -16.4325 24.1079 83.1319 + 534.1 -16.0618 23.4324 83.1339 + 534.2 -15.6706 22.768 83.1069 + 534.3 -15.2999 22.0925 83.0529 + 534.4 -14.9087 21.4169 82.9839 + 534.5 -14.5277 20.7525 82.8939 + 534.6 -14.1468 20.0881 82.802 + 534.7 -13.7761 19.4236 82.666 + 534.8 -13.4055 18.7814 82.548 + 534.9 -13.0348 18.128 82.437 + 535 -12.6538 17.4857 82.323 + 535.1 -12.2832 16.8434 82.232 + 535.2 -11.9228 16.2122 82.164 + 535.3 -11.511 15.6031 82.115 + 535.4 -11.0683 15.0162 82.069 + 535.5 -10.6255 14.4404 82.058 + 535.6 -10.1519 13.8756 82.052 + 535.7 -9.62681 13.3551 82.03 + 535.8 -9.08112 12.89 82.046 + 535.9 -8.49424 12.4581 82.05 + 536 -7.90737 12.0706 82.053 + 536.1 -7.2999 11.7273 82.072 + 536.2 -6.70273 11.3729 82.112 + 536.3 -6.11586 11.0075 82.112 + 536.4 -5.52898 10.6974 82.089 + 536.5 -4.99359 10.4316 82.123 + 536.6 -4.48908 10.1658 82.095 + 536.7 -3.96398 9.87792 82.028 + 536.8 -3.45947 9.61215 81.938 + 536.9 -3.01674 9.36852 81.827 + 537 -2.58431 9.13597 81.68 + 537.1 -2.18276 8.92557 81.513 + 537.2 -1.81211 8.73731 81.293 + 537.3 -1.46204 8.54905 81.057 + 537.4 -1.15316 8.40509 80.826 + 537.5 -0.895756 8.27221 80.593 + 537.6 -0.648651 8.15039 80.373 + 537.7 -0.432434 8.03965 80.165 + 537.8 -0.236809 7.95106 79.942 + 537.9 -0.0617763 7.87354 79.746 + 538 0.0823684 7.8071 79.55 + 538.1 0.216217 7.74066 79.364 + 538.2 0.350066 7.68529 79.185 + 538.3 0.473618 7.62992 79.019 + 538.4 0.586875 7.5967 78.851 + 538.5 0.689835 7.56347 78.689 + 538.6 0.792796 7.51918 78.519 + 538.7 0.88546 7.49703 78.34 + 538.8 0.967829 7.47488 78.138 + 538.9 1.0399 7.45273 77.917 + 539 1.11197 7.43059 77.677 + 539.1 1.19434 7.41951 77.436 + 539.2 1.24582 7.40844 77.185 + 539.3 1.31789 7.39736 76.906 + 539.4 1.35908 7.38629 76.65 + 539.5 1.42085 7.37521 76.375 + 539.6 1.46204 7.36414 76.11 + 539.7 1.51352 7.35307 75.796 + 539.8 1.5547 7.35307 75.464 + 539.9 1.59589 7.34199 75.126 + 540 1.62677 7.33092 74.754 + 540.1 1.65766 7.33092 74.37 + 540.2 1.68855 7.31984 73.993 + 540.3 1.71944 7.31984 73.582 + 540.4 1.74003 7.30877 73.167 + 540.5 1.77092 7.30877 72.772 + 540.6 1.79151 7.29769 72.352 + 540.7 1.80181 7.30877 71.951 + 540.8 1.8121 7.29769 71.535 + 540.9 1.83269 7.30877 71.142 + 541 1.84299 7.30876 70.733 + 541.1 1.85329 7.30876 70.323 + 541.2 1.85329 7.31984 69.935 + 541.3 1.85329 7.31984 69.534 + 541.4 1.86358 7.31984 69.127 + 541.5 1.86358 7.34198 68.725 + 541.6 1.87388 7.34198 68.331 + 541.7 1.87388 7.34198 67.932 + 541.8 1.87388 7.34198 67.53 + 541.9 1.87388 7.34198 67.135 + 542 1.87388 7.34198 66.724 + 542.1 1.87388 7.34198 66.314 + 542.2 1.86358 7.34198 65.925 + 542.3 1.86358 7.34198 65.523 + 542.4 1.85328 7.34198 65.117 + 542.5 1.84299 7.34198 64.715 + 542.6 1.8224 7.34198 64.311 + 542.7 1.8121 7.34198 63.909 + 542.8 1.8018 7.34198 63.52 + 542.9 1.78121 7.34198 63.121 + 543 1.77092 7.36413 62.727 + 543.1 1.75032 7.3752 62.317 + 543.2 1.72973 7.3752 61.93 + 543.3 1.69884 7.38627 61.526 + 543.4 1.67825 7.38627 61.121 + 543.5 1.65766 7.39734 60.718 + 543.6 1.62677 7.40842 60.329 + 543.7 1.58559 7.41949 59.911 + 543.8 1.5547 7.43056 59.502 + 543.9 1.51351 7.46379 59.077 + 544 1.48263 7.47486 58.688 + 544.1 1.44144 7.47486 58.324 + 544.2 1.40026 7.47486 57.959 + 544.3 1.37967 7.49701 57.643 + 544.4 1.36937 7.50808 57.338 + 544.5 1.34878 7.50808 57.056 + 544.6 1.33848 7.50808 56.801 + 544.7 1.32819 7.50808 56.554 + 544.8 1.31789 7.497 56.342 + 544.9 1.31789 7.50808 56.108 + 545 1.31789 7.51915 55.887 + 545.1 1.31789 7.51915 55.659 + 545.2 1.32819 7.53022 55.446 + 545.3 1.32819 7.5413 55.208 + 545.4 1.31789 7.5413 54.99 + 545.5 1.30759 7.55237 54.76 + 545.6 1.30759 7.55237 54.513 + 545.7 1.30759 7.55237 54.265 + 545.8 1.2973 7.56344 54.015 + 545.9 1.287 7.56344 53.762 + 546 1.27671 7.56344 53.508 + 546.1 1.26641 7.56344 53.263 + 546.2 1.25611 7.56344 53.017 + 546.3 1.24582 7.55237 52.756 + 546.4 1.22522 7.55237 52.496 + 546.5 1.21493 7.55237 52.231 + 546.6 1.20463 7.54129 51.98 + 546.7 1.19434 7.54129 51.715 + 546.8 1.18404 7.54129 51.476 + 546.9 1.17374 7.53022 51.24 + 547 1.16345 7.53022 51.004 + 547.1 1.15315 7.53022 50.751 + 547.2 1.15315 7.53022 50.493 + 547.3 1.15315 7.51914 50.265 + 547.4 1.14286 7.53022 49.999 + 547.5 1.13256 7.53022 49.743 + 547.6 1.12226 7.53022 49.494 + 547.7 1.12226 7.53022 49.248 + 547.8 1.11197 7.51914 48.975 + 547.9 1.11197 7.51914 48.715 + 548 1.11197 7.51914 48.466 + 548.1 1.10167 7.51914 48.226 + 548.2 1.08108 7.50807 47.98 + 548.3 1.07078 7.50807 47.727 + 548.4 1.06049 7.50807 47.511 + 548.5 1.0296 7.50807 47.275 + 548.6 1.0193 7.48592 47.019 + 548.7 1.0193 7.47484 46.754 + 548.8 0.998712 7.46377 46.517 + 548.9 0.988416 7.43055 46.293 + 549 0.97812 7.4084 46.07 + 549.1 0.97812 7.36411 45.846 + 549.2 0.97812 7.31981 45.617 + 549.3 0.998712 7.26444 45.407 + 549.4 1.0193 7.20907 45.192 + 549.5 1.0296 7.14263 44.994 + 549.6 1.06049 7.04296 44.771 + 549.7 1.10167 6.95437 44.579 + 549.8 1.14286 6.86578 44.389 + 549.9 1.19434 6.76612 44.193 + 550 1.23552 6.65538 44.001 + 550.1 1.287 6.55571 43.767 + 550.2 1.30759 6.46712 43.524 + 550.3 1.33848 6.40068 43.29 + 550.4 1.37966 6.32316 43.025 + 550.5 1.40025 6.25672 42.761 + 550.6 1.42085 6.20135 42.471 + 550.7 1.43114 6.1792 42.14 + 550.8 1.43114 6.15705 41.825 + 550.9 1.43114 6.14598 41.468 + 551 1.44144 6.14598 41.091 + 551.1 1.45173 6.12383 40.739 + 551.2 1.46203 6.11276 40.374 + 551.3 1.47233 6.12383 39.984 + 551.4 1.48262 6.1349 39.605 + 551.5 1.50321 6.15705 39.241 + 551.6 1.5341 6.15705 38.862 + 551.7 1.56499 6.16812 38.498 + 551.8 1.58558 6.16812 38.12 + 551.9 1.60617 6.15705 37.748 + 552 1.62677 6.15705 37.359 + 552.1 1.65765 6.16812 36.964 + 552.2 1.68854 6.1792 36.552 + 552.3 1.69884 6.17919 36.154 + 552.4 1.70913 6.17919 35.749 + 552.5 1.71943 6.19027 35.341 + 552.6 1.74002 6.20134 34.943 + 552.7 1.75032 6.21241 34.543 + 552.8 1.77091 6.22349 34.148 + 552.9 1.77091 6.23456 33.767 + 553 1.7915 6.24564 33.381 + 553.1 1.7915 6.25671 32.978 + 553.2 1.7915 6.26778 32.588 + 553.3 1.8018 6.26778 32.186 + 553.4 1.7915 6.26778 31.806 + 553.5 1.8018 6.26778 31.396 + 553.6 1.8018 6.26778 30.996 + 553.7 1.8018 6.26778 30.58 + 553.8 1.7915 6.28993 30.177 + 553.9 1.7915 6.28993 29.781 + 554 1.7915 6.28993 29.387 + 554.1 1.80179 6.28993 28.985 + 554.2 1.80179 6.27885 28.595 + 554.3 1.7812 6.27885 28.202 + 554.4 1.7812 6.28992 27.816 + 554.5 1.7812 6.28992 27.448 + 554.6 1.7915 6.28992 27.085 + 554.7 1.7812 6.301 26.742 + 554.8 1.7812 6.301 26.421 + 554.9 1.77091 6.31207 26.095 + 555 1.76061 6.31207 25.776 + 555.1 1.75031 6.32314 25.463 + 555.2 1.74002 6.33422 25.16 + 555.3 1.71943 6.34529 24.864 + 555.4 1.69883 6.34529 24.573 + 555.5 1.67824 6.34529 24.279 + 555.6 1.65765 6.33422 23.995 + 555.7 1.61647 6.34529 23.711 + 555.8 1.60617 6.34529 23.41 + 555.9 1.58558 6.34529 23.118 + 556 1.55469 6.35636 22.836 + 556.1 1.5341 6.35636 22.54 + 556.2 1.51351 6.35636 22.265 + 556.3 1.49291 6.34529 21.976 + 556.4 1.46203 6.34529 21.677 + 556.5 1.44143 6.34529 21.403 + 556.6 1.42084 6.34529 21.112 + 556.7 1.38995 6.33421 20.837 + 556.8 1.36936 6.32314 20.556 + 556.9 1.35907 6.31206 20.264 + 557 1.33847 6.31206 19.998 + 557.1 1.31788 6.30099 19.714 + 557.2 1.31788 6.30099 19.443 + 557.3 1.29729 6.28992 19.159 + 557.4 1.28699 6.27884 18.871 + 557.5 1.2767 6.26777 18.589 + 557.6 1.2664 6.25669 18.318 + 557.7 1.25611 6.25669 18.034 + 557.8 1.24581 6.24562 17.752 + 557.9 1.24581 6.23455 17.466 + 558 1.22522 6.22347 17.201 + 558.1 1.22522 6.20132 16.92 + 558.2 1.20463 6.20132 16.64 + 558.3 1.17374 6.19025 16.361 + 558.4 1.16344 6.19025 16.08 + 558.5 1.15315 6.17917 15.801 + 558.6 1.14285 6.17917 15.565 + 558.7 1.14285 6.1681 15.346 + 558.8 1.15315 6.15703 15.148 + 558.9 1.15315 6.15703 15.01 + 559 1.16344 6.14595 14.911 + 559.1 1.18403 6.14595 14.832 + 559.2 1.20463 6.14595 14.788 + 559.3 1.22522 6.14595 14.771 + 559.4 1.24581 6.14595 14.758 + 559.5 1.25611 6.15703 14.767 + 559.6 1.2664 6.15703 14.783 + 559.7 1.28699 6.14595 14.803 + 559.8 1.31788 6.13488 14.828 + 559.9 1.33847 6.11273 14.834 + 560 1.36936 6.09058 14.851 + 560.1 1.41054 6.03521 14.869 + 560.2 1.44143 5.97985 14.868 + 560.3 1.49291 5.9134 14.886 + 560.4 1.54439 5.83589 14.885 + 560.5 1.59587 5.73622 14.879 + 560.6 1.64735 5.63656 14.894 + 560.7 1.69883 5.54797 14.955 + 560.8 1.7709 5.43723 15.011 + 560.9 1.80179 5.38186 15.03 + 561 1.83268 5.2822 15.071 + 561.1 1.88416 5.18253 15.088 + 561.2 1.92534 5.09394 15.121 + 561.3 1.94593 5.01643 15.141 + 561.4 1.93564 4.93891 15.142 + 561.5 1.92534 4.87247 15.16 + 561.6 1.90475 4.78388 15.167 + 561.7 1.87386 4.69529 15.154 + 561.8 1.82238 4.6067 15.155 + 561.9 1.75031 4.51811 15.146 + 562 1.67824 4.40737 15.146 + 562.1 1.58558 4.3077 15.125 + 562.2 1.48262 4.20804 15.133 + 562.3 1.36936 4.08623 15.125 + 562.4 1.23551 3.97549 15.112 + 562.5 1.10167 3.8426 15.116 + 562.6 0.957523 3.72079 15.128 + 562.7 0.81338 3.59898 15.149 + 562.8 0.658941 3.4661 15.196 + 562.9 0.504502 3.34428 15.264 + 563 0.350062 3.2114 15.327 + 563.1 0.195623 3.07851 15.417 + 563.2 0.0411838 2.94563 15.485 + 563.3 -0.0823676 2.83489 15.546 + 563.4 -0.195623 2.73523 15.583 + 563.5 -0.319174 2.64664 15.608 + 563.6 -0.422134 2.55805 15.649 + 563.7 -0.504502 2.4916 15.688 + 563.8 -0.576573 2.43623 15.76 + 563.9 -0.617757 2.39194 15.844 + 564 -0.658941 2.35872 15.936 + 564.1 -0.700125 2.33657 16.066 + 564.2 -0.731013 2.3255 16.189 + 564.3 -0.751604 2.30335 16.334 + 564.4 -0.782492 2.29227 16.509 + 564.5 -0.792788 2.27013 16.701 + 564.6 -0.81338 2.25905 16.887 + 564.7 -0.823676 2.24798 17.081 + 564.8 -0.833972 2.23691 17.282 + 564.9 -0.844268 2.22583 17.484 + 565 -0.854564 2.22583 17.662 + 565.1 -0.86486 2.21476 17.858 + 565.2 -0.86486 2.21476 18.016 + 565.3 -0.875156 2.20369 18.163 + 565.4 -0.875156 2.19261 18.272 + 565.5 -0.875156 2.19261 18.327 + 565.6 -0.854564 2.19261 18.41 + 565.7 -0.844268 2.20369 18.432 + 565.8 -0.823676 2.22583 18.435 + 565.9 -0.782493 2.24798 18.422 + 566 -0.731013 2.27013 18.427 + 566.1 -0.658941 2.30335 18.425 + 566.2 -0.576573 2.34764 18.395 + 566.3 -0.463318 2.40301 18.393 + 566.4 -0.350062 2.46946 18.379 + 566.5 -0.216215 2.5359 18.367 + 566.6 -0.0720717 2.60234 18.349 + 566.7 0.0411838 2.65771 18.38 + 566.8 0.144143 2.71308 18.375 + 566.9 0.247103 2.75737 18.35 + 567 0.360358 2.81274 18.361 + 567.1 0.442726 2.84597 18.354 + 567.2 0.504502 2.87919 18.359 + 567.3 0.555982 2.91241 18.345 + 567.4 0.597165 2.92348 18.344 + 567.5 0.617757 2.93456 18.329 + 567.6 0.648645 2.9567 18.335 + 567.7 0.679533 2.96778 18.341 + 567.8 0.700125 2.97885 18.327 + 567.9 0.731013 2.97885 18.336 + 568 0.761901 2.96778 18.338 + 568.1 0.81338 2.93456 18.323 + 568.2 0.854564 2.91241 18.32 + 568.3 0.91634 2.85704 18.327 + 568.4 0.988412 2.7906 18.323 + 568.5 1.08108 2.69093 18.349 + 568.6 1.16344 2.58019 18.338 + 568.7 1.2664 2.45838 18.353 + 568.8 1.36936 2.31442 18.364 + 568.9 1.48262 2.14832 18.376 + 569 1.58558 1.96006 18.373 + 569.1 1.69883 1.77181 18.376 + 569.2 1.80179 1.57248 18.379 + 569.3 1.90475 1.32886 18.387 + 569.4 1.99742 1.10738 18.385 + 569.5 2.09008 0.852682 18.391 + 569.6 2.19304 0.609059 18.387 + 569.7 2.2857 0.354362 18.395 + 569.8 2.36807 0.0775167 18.38 + 569.9 2.47103 -0.188254 18.395 + 570 2.56369 -0.465099 18.399 + 570.1 2.66665 -0.73087 18.391 + 570.2 2.77991 -1.00772 18.388 + 570.3 2.87257 -1.28456 18.399 + 570.4 2.98583 -1.5614 18.396 + 570.5 3.08879 -1.82718 18.39 + 570.6 3.19175 -2.09295 18.371 + 570.7 3.29471 -2.35872 18.386 + 570.8 3.39767 -2.62449 18.39 + 570.9 3.50063 -2.87919 18.381 + 571 3.59329 -3.13388 18.382 + 571.1 3.69625 -3.38858 18.373 + 571.2 3.79921 -3.6322 18.388 + 571.3 3.89187 -3.8869 18.374 + 571.4 3.99483 -4.13052 18.391 + 571.5 4.0875 -4.37415 18.387 + 571.6 4.19046 -4.61777 18.375 + 571.7 4.28312 -4.87247 18.383 + 571.8 4.38608 -5.11609 18.384 + 571.9 4.48904 -5.37079 18.378 + 572 4.60229 -5.63656 18.373 + 572.1 4.70525 -5.89126 18.382 + 572.2 4.80821 -6.1681 18.381 + 572.3 4.92147 -6.44495 18.392 + 572.4 5.04502 -6.73287 18.379 + 572.5 5.15828 -7.03186 18.393 + 572.6 5.27153 -7.31978 18.394 + 572.7 5.38479 -7.6077 18.396 + 572.8 5.46716 -7.84025 18.384 + 572.9 5.55982 -8.0728 18.37 + 573 5.65248 -8.30534 18.381 + 573.1 5.73485 -8.47145 18.367 + 573.2 5.79663 -8.63756 18.374 + 573.3 5.84811 -8.7483 18.382 + 573.4 5.87899 -8.81474 18.374 + 573.5 5.90988 -8.87011 18.383 + 573.6 5.93047 -8.90333 18.385 + 573.7 5.93047 -8.9144 18.372 + 573.8 5.94077 -8.90333 18.372 + 573.9 5.93047 -8.85903 18.364 + 574 5.92018 -8.80367 18.361 + 574.1 5.88929 -8.71508 18.362 + 574.2 5.84811 -8.61541 18.36 + 574.3 5.81722 -8.4936 18.353 + 574.4 5.76574 -8.34964 18.347 + 574.5 5.70396 -8.18353 18.347 + 574.6 5.64219 -8.00635 18.332 + 574.7 5.57012 -7.80702 18.334 + 574.8 5.49804 -7.58555 18.336 + 574.9 5.40538 -7.34192 18.344 + 575 5.32301 -7.0983 18.329 + 575.1 5.23035 -6.82146 18.317 + 575.2 5.13768 -6.54461 18.324 + 575.3 5.02443 -6.24562 18.317 + 575.4 4.92147 -5.94663 18.315 + 575.5 4.80821 -5.62549 18.319 + 575.6 4.69496 -5.29327 18.323 + 575.7 4.5817 -4.96106 18.322 + 575.8 4.45815 -4.61777 18.316 + 575.9 4.34489 -4.26341 18.315 + 576 4.21105 -3.92012 18.323 + 576.1 4.0875 -3.55469 18.323 + 576.2 3.96394 -3.18925 18.311 + 576.3 3.84039 -2.82382 18.311 + 576.4 3.70655 -2.45838 18.314 + 576.5 3.5727 -2.0708 18.318 + 576.6 3.43885 -1.70536 18.302 + 576.7 3.305 -1.31778 18.299 + 576.8 3.17115 -0.941272 18.282 + 576.9 3.03731 -0.542616 18.28 + 577 2.90346 -0.155033 18.275 + 577.1 2.75932 0.243624 18.282 + 577.2 2.62547 0.64228 18.269 + 577.3 2.48133 1.05201 18.264 + 577.4 2.33718 1.45067 18.264 + 577.5 2.19304 1.8604 18.256 + 577.6 2.0386 2.2812 18.243 + 577.7 1.89446 2.70201 18.23 + 577.8 1.74002 3.12281 18.24 + 577.9 1.58558 3.54361 18.225 + 578 1.43114 3.95334 18.251 + 578.1 1.2664 4.37415 18.237 + 578.2 1.10167 4.78388 18.26 + 578.3 0.936932 5.18254 18.257 + 578.4 0.772196 5.55904 18.247 + 578.5 0.607461 5.93555 18.253 + 578.6 0.442726 6.30099 18.254 + 578.7 0.267695 6.65535 18.265 + 578.8 0.113255 6.99864 18.244 + 578.9 -0.0617757 7.33085 18.243 + 579 -0.226511 7.66307 18.232 + 579.1 -0.391246 7.98421 18.246 + 579.2 -0.566277 8.30535 18.236 + 579.3 -0.731013 8.60434 18.236 + 579.4 -0.906044 8.9144 18.249 + 579.5 -1.08107 9.2134 18.237 + 579.6 -1.24581 9.51239 18.229 + 579.7 -1.42084 9.81138 18.224 + 579.8 -1.60617 10.0993 18.228 + 579.9 -1.7709 10.3872 18.239 + 580 -1.95623 10.6862 18.234 + 580.1 -2.13126 10.9631 18.225 + 580.2 -2.31659 11.251 18.238 + 580.3 -2.50192 11.5389 18.238 + 580.4 -2.67695 11.8157 18.226 + 580.5 -2.86227 12.1147 18.217 + 580.6 -3.0373 12.3916 18.222 + 580.7 -3.23293 12.6795 18.226 + 580.8 -3.41825 12.9563 18.228 + 580.9 -3.60358 13.2443 18.217 + 581 -3.78891 13.5322 18.218 + 581.1 -3.98453 13.809 18.233 + 581.2 -4.16986 14.0969 18.219 + 581.3 -4.36548 14.3849 18.216 + 581.4 -4.5611 14.6728 18.222 + 581.5 -4.75673 14.9496 18.206 + 581.6 -4.94205 15.2375 18.205 + 581.7 -5.14797 15.5255 18.22 + 581.8 -5.3436 15.8134 18.217 + 581.9 -5.52892 16.0902 18.212 + 582 -5.72455 16.3781 18.192 + 582.1 -5.92017 16.6661 18.201 + 582.2 -6.1055 16.9429 18.199 + 582.3 -6.23934 17.1644 18.191 + 582.4 -6.38349 17.3859 18.173 + 582.5 -6.51733 17.5963 18.163 + 582.6 -6.64088 17.7734 18.162 + 582.7 -6.75414 17.9174 18.175 + 582.8 -6.82621 18.0503 18.176 + 582.9 -6.88799 18.15 18.153 + 583 -6.92917 18.2164 18.147 + 583.1 -6.94976 18.2607 18.132 + 583.2 -6.96006 18.2939 18.108 + 583.3 -6.96006 18.2939 18.094 + 583.4 -6.92917 18.2607 18.085 + 583.5 -6.87769 18.2053 18.08 + 583.6 -6.80562 18.1167 18.08 + 583.7 -6.71296 18.006 18.072 + 583.8 -6.5997 17.862 18.071 + 583.9 -6.46585 17.6959 18.091 + 584 -6.32171 17.4966 18.098 + 584.1 -6.14668 17.2751 18.097 + 584.2 -5.96135 17.0315 18.111 + 584.3 -5.75543 16.7657 18.107 + 584.4 -5.53922 16.4667 18.121 + 584.5 -5.31271 16.1567 18.125 + 584.6 -5.06561 15.8355 18.12 + 584.7 -4.80821 15.4812 18.13 + 584.8 -4.54051 15.1157 18.132 + 584.9 -4.27282 14.7503 18.137 + 585 -3.99483 14.3516 18.125 + 585.1 -3.69625 13.953 18.094 + 585.2 -3.39766 13.5433 18.109 + 585.3 -3.09908 13.1224 18.106 + 585.4 -2.77991 12.6795 18.091 + 585.5 -2.47103 12.2365 18.085 + 585.6 -2.14156 11.7936 18.074 + 585.7 -1.82238 11.3285 18.068 + 585.8 -1.49291 10.8634 18.056 + 585.9 -1.15315 10.3872 18.048 + 586 -0.81338 9.92212 18.036 + 586.1 -0.473614 9.43487 18.036 + 586.2 -0.123551 8.94763 18.024 + 586.3 0.226511 8.4493 18.015 + 586.4 0.576573 7.96206 18.01 + 586.5 0.926636 7.46374 18.014 + 586.6 1.2767 6.95434 18.01 + 586.7 1.62676 6.45602 17.994 + 586.8 1.97682 5.9577 17.998 + 586.9 2.32689 5.45938 17.99 + 587 2.68724 4.96106 17.984 + 587.1 3.03731 4.47381 17.988 + 587.2 3.38737 3.97549 17.989 + 587.3 3.71684 3.47717 17.985 + 587.4 4.0772 2.98992 17.978 + 587.5 4.43756 2.4916 17.966 + 587.6 4.77732 1.99328 17.979 + 587.7 5.12739 1.50604 17.975 + 587.8 5.47745 1.00772 17.973 + 587.9 5.81722 0.509396 17.984 + 588 6.17757 0.011075 17.981 + 588.1 6.51734 -0.487246 17.977 + 588.2 6.85711 -0.985566 17.978 + 588.3 7.20717 -1.47281 17.977 + 588.4 7.55723 -1.98221 17.981 + 588.5 7.897 -2.46945 17.975 + 588.6 8.23677 -2.9567 17.968 + 588.7 8.58683 -3.44395 17.962 + 588.8 8.9163 -3.94227 17.955 + 588.9 9.25607 -4.41844 17.96 + 589 9.59583 -4.89461 17.96 + 589.1 9.9356 -5.37079 17.948 + 589.2 10.2651 -5.84696 17.948 + 589.3 10.5945 -6.31206 17.939 + 589.4 10.924 -6.77716 17.942 + 589.5 11.2535 -7.23118 17.943 + 589.6 11.5727 -7.68521 17.926 + 589.7 11.9021 -8.13923 17.936 + 589.8 12.211 -8.58219 17.932 + 589.9 12.5302 -9.01406 17.924 + 590 12.8288 -9.44594 17.931 + 590.1 13.1376 -9.86674 17.93 + 590.2 13.4362 -10.2875 17.923 + 590.3 13.7348 -10.6973 17.933 + 590.4 14.0231 -11.0959 17.91 + 590.5 14.3011 -11.4946 17.926 + 590.6 14.5791 -11.8711 17.908 + 590.7 14.8571 -12.2476 17.91 + 590.8 15.1248 -12.6352 17.904 + 590.9 15.3822 -13.0006 17.898 + 591 15.6396 -13.3661 17.891 + 591.1 15.897 -13.7204 17.873 + 591.2 16.1544 -14.0859 17.878 + 591.3 16.3912 -14.4402 17.871 + 591.4 16.6486 -14.8057 17.865 + 591.5 16.8854 -15.16 17.86 + 591.6 17.1325 -15.5144 17.871 + 591.7 17.3693 -15.8577 17.869 + 591.8 17.5752 -16.1677 17.848 + 591.9 17.7708 -16.4446 17.83 + 592 17.9665 -16.7214 17.85 + 592.1 18.1312 -16.954 17.822 + 592.2 18.2753 -17.1533 17.823 + 592.3 18.4092 -17.3083 17.8349 + 592.4 18.543 -17.4301 17.8069 + 592.5 18.6666 -17.5409 17.8189 + 592.6 18.7798 -17.6073 17.8199 + 592.7 18.924 -17.6848 17.8279 + 592.8 19.0681 -17.7181 17.8209 + 592.9 19.2329 -17.7402 17.8299 + 593 19.4182 -17.7513 17.8389 + 593.1 19.6035 -17.7291 17.8449 + 593.2 19.8197 -17.6959 17.8379 + 593.3 20.036 -17.6516 17.8509 + 593.4 20.2728 -17.5852 17.8589 + 593.5 20.5199 -17.5077 17.8439 + 593.6 20.7773 -17.4191 17.8339 + 593.7 21.0553 -17.3194 17.8419 + 593.8 21.3435 -17.1976 17.8389 + 593.9 21.6421 -17.0647 17.8369 + 594 21.951 -16.9207 17.8269 + 594.1 22.2908 -16.7657 17.8449 + 594.2 22.6305 -16.6107 17.8209 + 594.3 22.9806 -16.4335 17.8219 + 594.4 23.341 -16.2452 17.8299 + 594.5 23.7116 -16.0459 17.8299 + 594.6 24.0926 -15.8355 17.8179 + 594.7 24.4838 -15.6251 17.8199 + 594.8 24.8854 -15.4147 17.8369 + 594.9 25.3075 -15.1711 17.8299 + 595 25.7296 -14.9385 17.8329 + 595.1 26.162 -14.6949 17.8609 + 595.2 26.6151 -14.4402 17.9169 + 595.3 27.0681 -14.1855 18.0019 + 595.4 27.5211 -13.9197 18.1209 + 595.5 28.005 -13.6429 18.2779 + 595.6 28.4889 -13.355 18.4649 + 595.7 28.9728 -13.0671 18.6999 + 595.8 29.4568 -12.7791 18.9739 + 595.9 29.951 -12.4801 19.2659 + 596 30.4452 -12.1811 19.5919 + 596.1 30.9394 -11.8822 19.9389 + 596.2 31.4336 -11.5832 20.2969 + 596.3 31.9381 -11.2731 20.6709 + 596.4 32.4323 -10.9741 21.0509 + 596.5 32.9368 -10.6751 21.4479 + 596.6 33.431 -10.365 21.8189 + 596.7 33.9252 -10.055 22.2119 + 596.8 34.4194 -9.74491 22.5889 + 596.9 34.9239 -9.43484 22.9559 + 597 35.4181 -9.13585 23.3209 + 597.1 35.9226 -8.81471 23.6669 + 597.2 36.4374 -8.50464 23.9959 + 597.3 36.9522 -8.1835 24.2989 + 597.4 37.467 -7.86236 24.5859 + 597.5 37.9921 -7.54122 24.8849 + 597.6 38.5172 -7.209 25.1389 + 597.7 39.0423 -6.86571 25.3899 + 597.8 39.5777 -6.5335 25.6429 + 597.9 40.1131 -6.19021 25.8669 + 598 40.6485 -5.83584 26.1099 + 598.1 41.1942 -5.49255 26.3309 + 598.2 41.7399 -5.13819 26.5609 + 598.3 42.2959 -4.78383 26.7789 + 598.4 42.8518 -4.41839 26.9809 + 598.5 43.4078 -4.05295 27.1889 + 598.6 43.9741 -3.68752 27.3808 + 598.7 44.5404 -3.32208 27.5638 + 598.8 45.1067 -2.94557 27.7178 + 598.9 45.6832 -2.56906 27.8618 + 599 46.2701 -2.20362 28.0068 + 599.1 46.857 -1.81603 28.1158 + 599.2 47.4336 -1.43952 28.2318 + 599.3 48.0307 -1.06301 28.3438 + 599.4 48.6279 -0.675426 28.4428 + 599.5 49.225 -0.298915 28.5518 + 599.6 49.8325 0.077597 28.6278 + 599.7 50.4606 0.443035 28.6988 + 599.8 51.0989 0.786325 28.7738 + 599.9 51.7373 1.09639 28.8358 + 600 52.3859 1.39539 28.8918 + 600.1 53.0449 1.67224 28.9438 + 600.2 53.7038 1.92694 28.9998 + 600.3 54.3627 2.19271 29.0598 + 600.4 55.032 2.44741 29.1008 + 600.5 55.7115 2.65782 29.1488 + 600.6 56.391 2.90144 29.2028 + 600.7 57.0706 3.14507 29.2457 + 600.8 57.7398 3.39977 29.3147 + 600.9 58.4193 3.65447 29.3857 + 601 59.0886 3.92024 29.4507 + 601.1 59.7784 4.18602 29.4937 + 601.2 60.4682 4.45179 29.5537 + 601.3 61.1581 4.71757 29.6077 + 601.4 61.8582 4.97227 29.6607 + 601.5 62.548 5.22697 29.7047 + 601.6 63.2276 5.51489 29.7387 + 601.7 63.9174 5.78066 29.8177 + 601.8 64.6278 6.04644 29.8697 + 601.9 65.3073 6.31221 29.9947 + 602 65.9972 6.58906 30.1407 + 602.1 66.687 6.85484 30.3066 + 602.2 67.3665 7.13168 30.5186 + 602.3 68.0358 7.39746 30.7636 + 602.4 68.7153 7.67431 31.0386 + 602.5 69.3949 7.95116 31.3456 + 602.6 70.0641 8.21693 31.6636 + 602.7 70.7127 8.48271 32.0156 + 602.8 71.382 8.74848 32.3996 + 602.9 72.0306 9.01426 32.7816 + 603 72.6793 9.29111 33.1816 + 603.1 73.3176 9.54581 33.5816 + 603.2 73.956 9.81158 33.9836 + 603.3 74.5943 10.0774 34.3836 + 603.4 75.2121 10.3321 34.7805 + 603.5 75.8299 10.5978 35.1685 + 603.6 76.4476 10.8525 35.5495 + 603.7 77.0551 11.1183 35.9455 + 603.8 77.6729 11.373 36.3085 + 603.9 78.27 11.6388 36.6755 + 604 78.8672 11.8824 37.0355 + 604.1 79.4747 12.1371 37.3825 + 604.2 80.0615 12.3918 37.7355 + 604.3 80.6587 12.6576 38.0725 + 604.4 81.2456 12.9012 38.4125 + 604.5 81.8325 13.1559 38.7415 + 604.6 82.4193 13.3996 39.0825 + 604.7 83.0062 13.6543 39.3894 + 604.8 83.5931 13.8979 39.7024 + 604.9 84.18 14.1194 39.9774 + 605 84.7668 14.3519 40.2664 + 605.1 85.364 14.5623 40.5214 + 605.2 85.9612 14.7506 40.7684 + 605.3 86.5377 14.9499 41.0164 + 605.4 87.1143 15.1382 41.2774 + 605.5 87.6806 15.2932 41.5504 + 605.6 88.2469 15.4483 41.8154 + 605.7 88.8132 15.5922 42.0964 + 605.8 89.3486 15.7362 42.3754 + 605.9 89.8942 15.8691 42.6903 + 606 90.4296 16.002 42.9853 + 606.1 90.9444 16.1348 43.2893 + 606.2 91.4798 16.2567 43.6203 + 606.3 92.0049 16.3785 43.9393 + 606.4 92.5506 16.5114 44.2433 + 606.5 93.086 16.6443 44.5413 + 606.6 93.6317 16.7772 44.8523 + 606.7 94.1877 16.9211 45.1493 + 606.8 94.7334 17.054 45.4243 + 606.9 95.2997 17.198 45.7003 + 607 95.8557 17.3419 45.9583 + 607.1 96.4322 17.4859 46.2102 + 607.2 96.9882 17.6409 46.4592 + 607.3 97.5545 17.7849 46.7022 + 607.4 98.1311 17.9178 46.9462 + 607.5 98.6974 18.0618 47.1412 + 607.6 99.2534 18.2168 47.3042 + 607.7 99.8299 18.3497 47.4412 + 607.8 100.407 18.4715 47.5552 + 607.9 100.983 18.5933 47.6182 + 608 101.539 18.693 47.6582 + 608.1 102.105 18.8037 47.6922 + 608.2 102.692 18.8812 47.7311 + 608.3 103.259 18.9477 47.7601 + 608.4 103.835 19.0141 47.7551 + 608.5 104.422 19.0474 47.7381 + 608.6 104.999 19.0695 47.7311 + 608.7 105.575 19.0695 47.7301 + 608.8 106.162 19.0363 47.7201 + 608.9 106.749 18.9477 47.7061 + 609 107.315 18.8591 47.6941 + 609.1 107.881 18.7816 47.7221 + 609.2 108.468 18.7041 47.7061 + 609.3 109.024 18.5602 47.735 + 609.4 109.591 18.4273 47.805 + 609.5 110.147 18.3055 47.935 + 609.6 110.692 18.1837 48.074 + 609.7 111.217 18.0729 48.28 + 609.8 111.681 17.9954 48.488 + 609.9 112.144 17.8957 48.728 + 610 112.546 17.8182 48.986 + 610.1 112.906 17.7407 49.274 + 610.2 113.184 17.6854 49.592 + 610.3 113.431 17.6411 49.902 + 610.4 113.658 17.5968 50.243 + 610.5 113.863 17.5746 50.578 + 610.6 114.038 17.5414 50.92 + 610.7 114.183 17.5193 51.278 + 610.8 114.316 17.5082 51.637 + 610.9 114.44 17.486 51.9889 + 611 114.553 17.475 52.3209 + 611.1 114.646 17.4639 52.6869 + 611.2 114.739 17.4639 53.0219 + 611.3 114.821 17.4639 53.3399 + 611.4 114.893 17.4528 53.6549 + 611.5 114.945 17.4528 53.9909 + 611.6 115.006 17.4528 54.2969 + 611.7 115.058 17.4528 54.6089 + 611.8 115.099 17.4528 54.9369 + 611.9 115.151 17.4639 55.2289 + 612 115.212 17.4639 55.5349 + 612.1 115.274 17.475 55.7959 + 612.2 115.346 17.4971 56.0579 + 612.3 115.439 17.5082 56.3069 + 612.4 115.521 17.5193 56.5599 + 612.5 115.634 17.5414 56.7909 + 612.6 115.748 17.5636 56.9999 + 612.7 115.882 17.5857 57.1909 + 612.8 116.026 17.6079 57.3179 + 612.9 116.18 17.6411 57.4199 + 613 116.355 17.6632 57.5079 + 613.1 116.53 17.6965 57.5379 + 613.2 116.726 17.7297 57.5829 + 613.3 116.942 17.7629 57.6039 + 613.4 117.169 17.7961 57.5979 + 613.5 117.405 17.8404 57.5999 + 613.6 117.652 17.9069 57.5879 + 613.7 117.889 17.9955 57.5749 + 613.8 118.157 18.073 57.5559 + 613.9 118.414 18.1616 57.5349 + 614 118.682 18.2723 57.5229 + 614.1 118.95 18.3941 57.4909 + 614.2 119.197 18.5381 57.4279 + 614.3 119.423 18.7042 57.3869 + 614.4 119.65 18.8593 57.3539 + 614.5 119.887 19.0475 57.3128 + 614.6 120.103 19.2247 57.2818 + 614.7 120.309 19.424 57.2458 + 614.8 120.484 19.6344 57.2118 + 614.9 120.669 19.8559 57.1748 + 615 120.844 20.0885 57.1668 + 615.1 120.988 20.3321 57.1428 + 615.2 121.122 20.5868 57.1168 + 615.3 121.246 20.8415 57.1138 + 615.4 121.349 21.1183 57.0888 + 615.5 121.441 21.3952 57.0878 + 615.6 121.524 21.6831 57.0948 + 615.7 121.586 21.971 57.1078 + 615.8 121.647 22.2811 57.0898 + 615.9 121.688 22.5801 57.1108 + 616 121.709 22.8902 57.1128 + 616.1 121.719 23.2113 57.1088 + 616.2 121.719 23.5214 57.0948 + 616.3 121.719 23.8536 57.0968 + 616.4 121.699 24.1858 57.0928 + 616.5 121.678 24.5291 57.0978 + 616.6 121.647 24.8724 57.0838 + 616.7 121.606 25.2267 57.0868 + 616.8 121.575 25.5922 57.0948 + 616.9 121.544 25.9687 57.0678 + 617 121.513 26.3452 57.0588 + 617.1 121.483 26.7328 57.0688 + 617.2 121.462 27.1314 57.0548 + 617.3 121.431 27.5522 57.0628 + 617.4 121.41 27.962 57.0558 + 617.5 121.4 28.3939 57.0438 + 617.6 121.39 28.8257 57.0538 + 617.7 121.369 29.2687 57.0388 + 617.8 121.359 29.7227 57.0428 + 617.9 121.349 30.1768 57.0448 + 618 121.338 30.6419 57.0488 + 618.1 121.338 31.107 57.0498 + 618.2 121.328 31.5942 57.0408 + 618.3 121.318 32.0704 57.0458 + 618.4 121.318 32.5687 57.0528 + 618.5 121.307 33.056 57.0528 + 618.6 121.307 33.5654 57.0428 + 618.7 121.297 34.0747 57.0338 + 618.8 121.297 34.5841 57.0468 + 618.9 121.287 35.1046 57.0348 + 619 121.287 35.614 57.0417 + 619.1 121.287 36.1456 57.0437 + 619.2 121.287 36.6771 57.0177 + 619.3 121.287 37.2087 57.0307 + 619.4 121.277 37.7513 57.0277 + 619.5 121.266 38.2828 57.0287 + 619.6 121.266 38.8254 57.0277 + 619.7 121.266 39.3791 57.0317 + 619.8 121.256 39.9328 57.0327 + 619.9 121.256 40.4976 57.0247 + 620 121.256 41.0402 57.0307 + 620.1 121.246 41.616 57.0287 + 620.2 121.246 42.1697 57.0147 + 620.3 121.235 42.7345 57.0297 + 620.4 121.235 43.2993 57.0117 + 620.5 121.225 43.864 57.0037 + 620.6 121.225 44.4288 57.0127 + 620.7 121.225 44.9936 56.9867 + 620.8 121.225 45.5694 56.9957 + 620.9 121.215 46.1342 56.9867 + 621 121.215 46.71 56.9917 + 621.1 121.215 47.2859 56.9797 + 621.2 121.215 47.8617 56.9887 + 621.3 121.204 48.4375 56.9877 + 621.4 121.204 49.0245 56.9937 + 621.5 121.204 49.6003 57.0027 + 621.6 121.184 50.1872 57.0097 + 621.7 121.173 50.7631 57.0016 + 621.8 121.163 51.35 57.0126 + 621.9 121.153 51.9369 56.9986 + 622 121.143 52.5238 57.0156 + 622.1 121.132 53.1107 56.9956 + 622.2 121.122 53.6976 57.0006 + 622.3 121.112 54.2845 56.9886 + 622.4 121.101 54.8825 56.9786 + 622.5 121.101 55.4695 56.9726 + 622.6 121.091 56.0674 56.9646 + 622.7 121.081 56.6654 56.9516 + 622.8 121.07 57.2523 56.9436 + 622.9 121.081 57.8614 56.9356 + 623 121.07 58.4594 56.9236 + 623.1 121.06 59.0574 56.9156 + 623.2 121.05 59.6554 56.9166 + 623.3 121.05 60.2534 56.9086 + 623.4 121.05 60.8513 56.9016 + 623.5 121.04 61.4604 56.9046 + 623.6 121.04 62.0805 56.8935 + 623.7 121.029 62.6896 56.8965 + 623.8 121.029 63.2987 56.8895 + 623.9 121.019 63.9188 56.8895 + 624 121.019 64.5279 56.8755 + 624.1 121.009 65.148 56.8665 + 624.2 121.009 65.7681 56.8625 + 624.3 121.009 66.3883 56.8735 + 624.4 121.009 67.0084 56.8335 + 624.5 120.998 67.6285 56.8385 + 624.6 120.988 68.2487 56.8335 + 624.7 120.998 68.8688 56.8415 + 624.8 120.988 69.489 56.8315 + 624.9 120.988 70.1202 56.8325 + 625 120.988 70.7292 56.8305 + 625.1 120.988 71.3604 56.8235 + 625.2 120.967 71.9917 56.8164 + 625.3 120.947 72.6118 56.8114 + 625.4 120.916 73.243 56.8044 + 625.5 120.895 73.8742 56.8044 + 625.6 120.864 74.5054 56.7824 + 625.7 120.823 75.1477 56.7784 + 625.8 120.761 75.7789 56.7844 + 625.9 120.72 76.4101 56.7684 + 626 120.648 77.0413 56.7614 + 626.1 120.576 77.6725 56.7494 + 626.2 120.514 78.3037 56.7534 + 626.3 120.432 78.935 56.7504 + 626.4 120.35 79.5662 56.7334 + 626.5 120.247 80.1974 56.7384 + 626.6 120.154 80.8397 56.7394 + 626.7 120.041 81.4709 56.7233 + 626.8 119.927 82.1021 56.7223 + 626.9 119.794 82.7333 56.7233 + 627 119.67 83.3534 56.7053 + 627.1 119.516 83.9846 56.7083 + 627.2 119.371 84.6048 56.7053 + 627.3 119.207 85.236 56.7033 + 627.4 119.042 85.8672 56.7053 + 627.5 118.867 86.4873 56.7033 + 627.6 118.682 87.1185 56.7003 + 627.7 118.496 87.7276 56.6983 + 627.8 118.28 88.3477 56.7003 + 627.9 118.074 88.9568 56.7013 + 628 117.858 89.5769 56.7043 + 628.1 117.631 90.186 56.6913 + 628.2 117.395 90.784 56.6943 + 628.3 117.158 91.393 56.7033 + 628.4 116.911 92.0021 56.7003 + 628.5 116.643 92.589 56.6973 + 628.6 116.385 93.1981 56.6923 + 628.7 116.107 93.785 56.6883 + 628.8 115.819 94.383 56.6772 + 628.9 115.521 94.9588 56.6842 + 629 115.222 95.5346 56.6772 + 629.1 114.903 96.1105 56.6702 + 629.2 114.584 96.6863 56.6652 + 629.3 114.244 97.2511 56.6602 + 629.4 113.914 97.8048 56.6602 + 629.5 113.564 98.3585 56.6522 + 629.6 113.214 98.9011 56.6442 + 629.7 112.844 99.4437 56.6412 + 629.8 112.473 99.9752 56.6402 + 629.9 112.092 100.507 56.6312 + 630 111.721 101.038 56.6252 + 630.1 111.32 101.548 56.6372 + 630.2 110.918 102.068 56.6372 + 630.3 110.517 102.578 56.6302 + 630.4 110.105 103.087 56.6302 + 630.5 109.693 103.574 56.6292 + 630.6 109.281 104.073 56.6322 + 630.7 108.859 104.571 56.6302 + 630.8 108.437 105.058 56.6302 + 630.9 107.994 105.545 56.6222 + 631 107.572 106.022 56.6292 + 631.1 107.129 106.498 56.6202 + 631.2 106.687 106.963 56.6262 + 631.3 106.244 107.428 56.6222 + 631.4 105.801 107.893 56.6192 + 631.5 105.358 108.358 56.6232 + 631.6 104.905 108.812 56.6282 + 631.7 104.452 109.266 56.6302 + 631.8 103.999 109.72 56.6372 + 631.9 103.546 110.163 56.6342 + 632 103.093 110.606 56.6512 + 632.1 102.63 111.049 56.6462 + 632.2 102.167 111.492 56.6482 + 632.3 101.693 111.924 56.6442 + 632.4 101.23 112.356 56.6452 + 632.5 100.756 112.788 56.6462 + 632.6 100.282 113.208 56.6422 + 632.7 99.8089 113.629 56.6412 + 632.8 99.325 114.05 56.6382 + 632.9 98.841 114.471 56.6292 + 633 98.3571 114.881 56.6302 + 633.1 97.8835 115.29 56.6342 + 633.2 97.3996 115.7 56.6262 + 633.3 96.9054 116.099 56.6322 + 633.4 96.4112 116.497 56.6332 + 633.5 95.9273 116.896 56.6122 + 633.6 95.4331 117.295 56.6272 + 633.7 94.9389 117.682 56.6232 + 633.8 94.455 118.059 56.6142 + 633.9 93.9607 118.446 56.6232 + 634 93.4665 118.823 56.6222 + 634.1 92.9723 119.199 56.6172 + 634.2 92.4781 119.576 56.6202 + 634.3 91.9736 119.941 56.6052 + 634.4 91.4794 120.307 56.6162 + 634.5 90.9852 120.672 56.6012 + 634.6 90.4807 121.027 56.6092 + 634.7 89.9968 121.392 56.6182 + 634.8 89.5026 121.735 56.6172 + 634.9 88.9981 122.101 56.6122 + 635 88.5142 122.444 56.6192 + 635.1 88.02 122.798 56.6152 + 635.2 87.5258 123.131 56.6032 + 635.3 87.0315 123.485 56.6072 + 635.4 86.5373 123.817 56.6052 + 635.5 86.0431 124.149 56.6092 + 635.6 85.5489 124.482 56.6132 + 635.7 85.065 124.814 56.6072 + 635.8 84.5708 125.146 56.6112 + 635.9 84.0663 125.467 56.5882 + 636 83.5824 125.788 56.6042 + 636.1 83.0882 126.109 56.5942 + 636.2 82.594 126.431 56.5972 + 636.3 82.0998 126.752 56.6032 + 636.4 81.6056 127.062 56.5892 + 636.5 81.1114 127.372 56.6012 + 636.6 80.6275 127.682 56.5982 + 636.7 80.1332 127.992 56.6042 + 636.8 79.639 128.291 56.6042 + 636.9 79.1551 128.59 56.5992 + 637 78.6712 128.9 56.6102 + 637.1 78.1873 129.199 56.6122 + 637.2 77.7034 129.487 56.6032 + 637.3 77.2195 129.786 56.6072 + 637.4 76.7459 130.085 56.6092 + 637.5 76.262 130.373 56.6012 + 637.6 75.7884 130.672 56.5842 + 637.7 75.3147 130.96 56.5882 + 637.8 74.8411 131.248 56.5802 + 637.9 74.3675 131.536 56.5672 + 638 73.9042 131.823 56.5652 + 638.1 73.4409 132.111 56.5572 + 638.2 72.9776 132.399 56.5512 + 638.3 72.5142 132.687 56.5552 + 638.4 72.0509 132.975 56.5452 + 638.5 71.5876 133.252 56.5402 + 638.6 71.1243 133.54 56.5342 + 638.7 70.6713 133.828 56.5302 + 638.8 70.2079 134.105 56.5342 + 638.9 69.7652 134.381 56.5182 + 639 69.3019 134.669 56.5092 + 639.1 68.8489 134.946 56.4992 + 639.2 68.3959 135.234 56.5012 + 639.3 67.9325 135.511 56.5012 + 639.4 67.4898 135.799 56.5022 + 639.5 67.0265 136.076 56.4892 + 639.6 66.5838 136.353 56.4862 + 639.7 66.1204 136.629 56.4882 + 639.8 65.6674 136.917 56.4772 + 639.9 65.2247 137.194 56.4772 + 640 64.7717 137.482 56.4812 + 640.1 64.3084 137.759 56.4632 + 640.2 63.8656 138.036 56.4532 + 640.3 63.4126 138.313 56.4652 + 640.4 62.9699 138.59 56.4602 + 640.5 62.5169 138.877 56.4602 + 640.6 62.0638 139.143 56.4492 + 640.7 61.6108 139.431 56.4492 + 640.8 61.1681 139.708 56.4442 + 640.9 60.7151 139.974 56.4442 + 641 60.2518 140.251 56.4462 + 641.1 59.809 140.527 56.4422 + 641.2 59.3457 140.793 56.4352 + 641.3 58.8927 141.059 56.4452 + 641.4 58.4397 141.336 56.4392 + 641.5 57.9763 141.591 56.4292 + 641.6 57.513 141.856 56.4252 + 641.7 57.06 142.111 56.4282 + 641.8 56.5967 142.377 56.4322 + 641.9 56.1334 142.631 56.4251 + 642 55.6701 142.886 56.4181 + 642.1 55.1964 143.141 56.4161 + 642.2 54.7331 143.373 56.4261 + 642.3 54.2492 143.606 56.4261 + 642.4 53.7653 143.827 56.4251 + 642.5 53.2711 144.038 56.4231 + 642.6 52.7666 144.226 56.4251 + 642.7 52.2621 144.403 56.4231 + 642.8 51.7473 144.569 56.4191 + 642.9 51.2222 144.713 56.4191 + 643 50.7074 144.846 56.4101 + 643.1 50.172 144.968 56.4071 + 643.2 49.6366 145.09 56.4071 + 643.3 49.1012 145.201 56.4051 + 643.4 48.5762 145.311 56.4022 + 643.5 48.0408 145.422 56.4022 + 643.6 47.5054 145.522 56.4042 + 643.7 46.9597 145.621 56.4022 + 643.8 46.4243 145.721 56.4032 + 643.9 45.8786 145.821 56.4032 + 644 45.3432 145.909 56.4032 + 644.1 44.7976 145.998 56.4072 + 644.2 44.2622 146.075 56.4042 + 644.3 43.7165 146.153 56.4042 + 644.4 43.1708 146.23 56.4032 + 644.5 42.6251 146.297 56.4122 + 644.6 42.0897 146.352 56.4022 + 644.7 41.544 146.419 56.3942 + 644.8 41.0087 146.474 56.4022 + 644.9 40.463 146.529 56.4002 + 645 39.9173 146.585 56.3952 + 645.1 39.3716 146.629 56.4002 + 645.2 38.8259 146.673 56.3942 + 645.3 38.2905 146.707 56.3932 + 645.4 37.7448 146.751 56.3922 + 645.5 37.1992 146.784 56.3852 + 645.6 36.6535 146.817 56.3822 + 645.7 36.1078 146.839 56.3892 + 645.8 35.5518 146.862 56.3782 + 645.9 35.0164 146.873 56.3732 + 646 34.4707 146.884 56.3892 + 646.1 33.9251 146.884 56.3712 + 646.2 33.3897 146.884 56.3692 + 646.3 32.844 146.884 56.3682 + 646.4 32.2983 146.873 56.3512 + 646.5 31.7526 146.862 56.3592 + 646.6 31.2069 146.851 56.3542 + 646.7 30.6613 146.828 56.3482 + 646.8 30.1259 146.806 56.3432 + 646.9 29.5905 146.773 56.3452 + 647 29.0448 146.74 56.3402 + 647.1 28.4991 146.707 56.3432 + 647.2 27.9637 146.662 56.3392 + 647.3 27.4283 146.618 56.3392 + 647.4 26.8826 146.574 56.3443 + 647.5 26.3473 146.518 56.3263 + 647.6 25.8119 146.463 56.3413 + 647.7 25.2765 146.408 56.3303 + 647.8 24.7411 146.341 56.3333 + 647.9 24.216 146.253 56.3393 + 648 23.6909 146.153 56.3353 + 648.1 23.1761 146.042 56.3263 + 648.2 22.6613 145.931 56.3053 + 648.3 22.1465 145.787 56.2833 + 648.4 21.642 145.632 56.2533 + 648.5 21.1581 145.466 56.2363 + 648.6 20.6742 145.267 56.2073 + 648.7 20.2109 145.057 56.1753 + 648.8 19.7476 144.813 56.1373 + 648.9 19.3151 144.558 56.0803 + 649 18.9033 144.281 56.0503 + 649.1 18.5018 143.971 56.0033 + 649.2 18.1105 143.661 55.9523 + 649.3 17.7502 143.318 55.9144 + 649.4 17.4104 142.964 55.8624 + 649.5 17.0706 142.609 55.8244 + 649.6 16.7412 142.244 55.7764 + 649.7 16.4117 141.889 55.7394 + 649.8 16.0822 141.535 55.7264 + 649.9 15.7631 141.17 55.7074 + 650 15.4336 140.815 55.6904 + 650.1 15.0938 140.472 55.6994 + 650.2 14.7438 140.14 55.7004 + 650.3 14.3937 139.796 55.7044 + 650.4 14.0539 139.464 55.7065 + 650.5 13.6936 139.121 55.7075 + 650.6 13.3538 138.789 55.7025 + 650.7 12.9935 138.456 55.7145 + 650.8 12.6434 138.124 55.7225 + 650.9 12.283 137.792 55.7045 + 651 11.9227 137.471 55.7175 + 651.1 11.5623 137.15 55.7135 + 651.2 11.1814 136.84 55.7155 + 651.3 10.8004 136.541 55.7035 + 651.4 10.4092 136.264 55.7055 + 651.5 10.0076 135.998 55.6825 + 651.6 9.58551 135.754 55.6925 + 651.7 9.17367 135.511 55.6915 + 651.8 8.76183 135.256 55.6896 + 651.9 8.32941 135.024 55.6846 + 652 7.89698 134.802 55.6876 + 652.1 7.46455 134.581 55.6786 + 652.2 7.02182 134.348 55.6816 + 652.3 6.59969 134.116 55.6726 + 652.4 6.16726 133.872 55.6726 + 652.5 5.73483 133.639 55.6646 + 652.6 5.3024 133.396 55.6556 + 652.7 4.85968 133.163 55.6486 + 652.8 4.41695 132.92 55.6476 + 652.9 3.98452 132.676 55.6706 + 653 3.5315 132.432 55.7016 + 653.1 3.07848 132.178 55.7756 + 653.2 2.63576 131.923 55.8546 + 653.3 2.17244 131.668 55.9816 + 653.4 1.72972 131.414 56.1496 + 653.5 1.2561 131.159 56.3116 + 653.6 0.803083 130.904 56.5216 + 653.7 0.350062 130.649 56.7457 + 653.8 -0.123551 130.384 56.9877 + 653.9 -0.576572 130.129 57.2527 + 654 -1.03989 129.863 57.5217 + 654.1 -1.5135 129.609 57.8047 + 654.2 -1.97682 129.343 58.1157 + 654.3 -2.45043 129.077 58.4287 + 654.4 -2.93434 128.811 58.7407 + 654.5 -3.40796 128.545 59.0597 + 654.6 -3.90216 128.28 59.3677 + 654.7 -4.38607 128.003 59.6777 + 654.8 -4.89057 127.726 59.9897 + 654.9 -5.38478 127.449 60.3147 + 655 -5.88928 127.183 60.6177 + 655.1 -6.39378 126.907 60.9267 + 655.2 -6.89828 126.619 61.2387 + 655.3 -7.41308 126.342 61.5497 + 655.4 -7.91758 126.054 61.8497 + 655.5 -8.42208 125.777 62.1687 + 655.6 -8.93688 125.489 62.4488 + 655.7 -9.45168 125.212 62.7438 + 655.8 -9.95618 124.924 63.0468 + 655.9 -10.471 124.648 63.3378 + 656 -10.9858 124.36 63.6158 + 656.1 -11.5006 124.061 63.8978 + 656.2 -12.0154 123.773 64.1858 + 656.3 -12.5302 123.485 64.4508 + 656.4 -13.045 123.197 64.7348 + 656.5 -13.5598 122.898 65.0138 + 656.6 -14.0746 122.61 65.2848 + 656.7 -14.5894 122.322 65.5618 + 656.8 -15.0939 122.034 65.8508 + 656.9 -15.6087 121.735 66.1208 + 657 -16.1235 121.447 66.3948 + 657.1 -16.6383 121.148 66.6778 + 657.2 -17.1428 120.86 66.9618 + 657.3 -17.6576 120.572 67.2498 + 657.4 -18.1724 120.273 67.5268 + 657.5 -18.6872 119.986 67.8078 + 657.6 -19.1917 119.687 68.0838 + 657.7 -19.6962 119.399 68.3658 + 657.8 -20.2007 119.1 68.6399 + 657.9 -20.7155 118.812 68.9079 + 658 -21.2303 118.513 69.1749 + 658.1 -21.7348 118.214 69.4399 + 658.2 -22.2393 117.915 69.7169 + 658.3 -22.7644 117.616 69.9699 + 658.4 -23.2792 117.317 70.2339 + 658.5 -23.8043 117.007 70.4859 + 658.6 -24.3294 116.697 70.7549 + 658.7 -24.8545 116.387 70.9979 + 658.8 -25.4001 116.065 71.2299 + 658.9 -25.9355 115.755 71.4509 + 659 -26.4915 115.423 71.6489 + 659.1 -27.0475 115.102 71.8339 + 659.2 -27.5932 114.759 72.0269 + 659.3 -28.1595 114.438 72.1929 + 659.4 -28.7155 114.094 72.3209 + 659.5 -29.292 113.74 72.4189 + 659.6 -29.8686 113.408 72.4879 + 659.7 -30.4452 113.064 72.5289 + 659.8 -31.0321 112.721 72.5619 + 659.9 -31.6189 112.378 72.5799 + 660 -32.2161 112.012 72.5859 + 660.1 -32.8133 111.658 72.5779 + 660.2 -33.4207 111.304 72.5689 + 660.3 -34.0282 110.938 72.5689 + 660.4 -34.6356 110.584 72.5539 + 660.5 -35.2534 110.218 72.5409 + 660.6 -35.8609 109.853 72.5359 + 660.7 -36.4786 109.488 72.535 + 660.8 -37.1067 109.111 72.532 + 660.9 -37.7244 108.735 72.528 + 661 -38.3525 108.369 72.519 + 661.1 -38.9806 107.982 72.516 + 661.2 -39.6189 107.605 72.524 + 661.3 -40.247 107.229 72.519 + 661.4 -40.8853 106.841 72.52 + 661.5 -41.5237 106.464 72.523 + 661.6 -42.162 106.077 72.522 + 661.7 -42.8107 105.689 72.525 + 661.8 -43.4593 105.302 72.525 + 661.9 -44.108 104.903 72.514 + 662 -44.7669 104.515 72.513 + 662.1 -45.4155 104.117 72.527 + 662.2 -46.0745 103.729 72.528 + 662.3 -46.7334 103.331 72.518 + 662.4 -47.3924 102.932 72.525 + 662.5 -48.0719 102.544 72.522 + 662.6 -48.7206 102.146 72.526 + 662.7 -49.3898 101.747 72.532 + 662.8 -50.059 101.348 72.528 + 662.9 -50.7283 100.95 72.516 + 663 -51.3975 100.551 72.524 + 663.1 -52.0668 100.152 72.514 + 663.2 -52.7463 99.7537 72.512 + 663.3 -53.4258 99.355 72.532 + 663.4 -54.1157 98.9564 72.583 + 663.5 -54.7849 98.5577 72.656 + 663.6 -55.4644 98.148 72.758 + 663.7 -56.1543 97.7493 72.875 + 663.8 -56.8338 97.3507 73.026 + 663.9 -57.5133 96.952 73.19 + 664 -58.2032 96.5423 73.351 + 664.1 -58.893 96.1436 73.542 + 664.2 -59.5726 95.745 73.725 + 664.3 -60.2521 95.3353 73.921 + 664.4 -60.9522 94.9366 74.121 + 664.5 -61.6318 94.5379 74.345 + 664.6 -62.3216 94.1393 74.584 + 664.7 -62.9908 93.7406 74.826 + 664.8 -63.6704 93.3531 75.076 + 664.9 -64.3602 92.9544 75.324 + 665 -65.0192 92.5668 75.584 + 665.1 -65.6987 92.1903 75.851 + 665.2 -66.3576 91.8027 76.113 + 665.3 -67.0166 91.4262 76.364 + 665.4 -67.6755 91.0497 76.64 + 665.5 -68.3242 90.6732 76.924 + 665.6 -68.9728 90.2967 77.21 + 665.7 -69.6215 89.9313 77.505 + 665.8 -70.2599 89.5548 77.799 + 665.9 -70.9085 89.2004 78.091 + 666 -71.5366 88.835 78.4 + 666.1 -72.1749 88.4696 78.701 + 666.2 -72.803 88.1041 79.025 + 666.3 -73.431 87.7387 79.332 + 666.4 -74.0591 87.3843 79.644 + 666.5 -74.6872 87.03 79.969 + 666.6 -75.3049 86.6756 80.286 + 666.7 -75.9227 86.3213 80.598 + 666.8 -76.5302 85.9669 80.918 + 666.9 -77.1479 85.6126 81.244 + 667 -77.7554 85.2693 81.555 + 667.1 -78.3629 84.9149 81.865 + 667.2 -78.9601 84.5716 82.1879 + 667.3 -79.5572 84.2283 82.4989 + 667.4 -80.1544 83.8851 82.8229 + 667.5 -80.7516 83.5418 83.1279 + 667.6 -81.3385 83.2096 83.4409 + 667.7 -81.9253 82.8663 83.7639 + 667.8 -82.5122 82.5341 84.0809 + 667.9 -83.0888 82.1908 84.3899 + 668 -83.6757 81.8586 84.7059 + 668.1 -84.2523 81.5264 85.0209 + 668.2 -84.8288 81.1942 85.3449 + 668.3 -85.3951 80.8619 85.6679 + 668.4 -85.9717 80.5408 85.9859 + 668.5 -86.538 80.2086 86.3079 + 668.6 -87.1043 79.8875 86.6329 + 668.7 -87.6603 79.5553 86.9639 + 668.8 -88.2369 79.2341 87.2919 + 668.9 -88.7928 78.9019 87.6269 + 669 -89.3488 78.5808 87.9519 + 669.1 -89.9048 78.2596 88.2819 + 669.2 -90.4711 77.9385 88.5989 + 669.3 -91.0271 77.6063 88.9299 + 669.4 -91.5831 77.2741 89.2599 + 669.5 -92.1494 76.9529 89.5789 + 669.6 -92.726 76.6207 89.9019 + 669.7 -93.2923 76.2885 90.2429 + 669.8 -93.8585 75.9563 90.5909 + 669.9 -94.4351 75.613 90.9359 + 670 -95.022 75.2697 91.2738 + 670.1 -95.5883 74.9375 91.5678 + 670.2 -96.1649 74.5832 91.8578 + 670.3 -96.7415 74.251 92.1178 + 670.4 -97.318 73.8966 92.3418 + 670.5 -97.8946 73.5533 92.5428 + 670.6 -98.4815 73.21 92.6958 + 670.7 -99.0581 72.8557 92.8058 + 670.8 -99.6244 72.5013 92.8898 + 670.9 -100.201 72.1248 92.9388 + 671 -100.757 71.7372 92.9548 + 671.1 -101.303 71.3386 92.9688 + 671.2 -101.859 70.9399 92.9678 + 671.3 -102.404 70.5191 92.9388 + 671.4 -102.909 70.0651 92.8978 + 671.5 -103.393 69.5889 92.8318 + 671.6 -103.856 69.1016 92.7428 + 671.7 -104.299 68.6144 92.6258 + 671.8 -104.711 68.0939 92.4978 + 671.9 -105.092 67.5624 92.3568 + 672 -105.442 67.0197 92.1858 + 672.1 -105.751 66.455 91.9988 + 672.2 -106.008 65.8791 91.8178 + 672.3 -106.234 65.2811 91.6358 + 672.4 -106.42 64.6831 91.4308 + 672.5 -106.574 64.0741 91.1978 + 672.6 -106.687 63.465 90.9568 + 672.7 -106.76 62.8559 90.6858 + 672.8 -106.821 62.2247 90.4108 + 672.9 -106.873 61.6046 90.0998 + 673 -106.893 60.9734 89.7548 + 673.1 -106.893 60.3422 89.3968 + 673.2 -106.873 59.722 89.0238 + 673.3 -106.852 59.0908 88.6258 + 673.4 -106.832 58.4596 88.2268 + 673.5 -106.801 57.8173 87.8508 + 673.6 -106.78 57.175 87.4348 + 673.7 -106.739 56.5327 87.0319 + 673.8 -106.698 55.8904 86.6289 + 673.9 -106.667 55.226 86.2299 + 674 -106.657 54.5726 85.8639 + 674.1 -106.636 53.9082 85.5119 + 674.2 -106.636 53.2548 85.1959 + 674.3 -106.615 52.5904 84.9289 + 674.4 -106.615 51.937 84.6809 + 674.5 -106.605 51.2726 84.4829 + 674.6 -106.595 50.6192 84.3109 + 674.7 -106.595 49.9658 84.1659 + 674.8 -106.585 49.3346 84.0689 + 674.9 -106.492 48.6813 83.9829 + 675 -106.389 48.039 83.9519 + 675.1 -106.276 47.4188 83.9529 + 675.2 -106.131 46.7987 83.9089 + 675.3 -105.936 46.1896 83.853 + 675.4 -105.72 45.6027 83.788 + 675.5 -105.452 45.0379 83.722 + 675.6 -105.164 44.4953 83.648 + 675.7 -104.855 43.997 83.569 + 675.8 -104.525 43.5097 83.478 + 675.9 -104.165 43.0779 83.391 + 676 -103.774 42.6681 83.317 + 676.1 -103.393 42.2473 83.298 + 676.2 -102.981 41.8708 83.231 + 676.3 -102.548 41.5164 83.2 + 676.4 -102.095 41.2063 83.19 + 676.5 -101.642 40.8963 83.1621 + 676.6 -101.169 40.6084 83.1891 + 676.7 -100.695 40.3426 83.1941 + 676.8 -100.201 40.0989 83.2121 + 676.9 -99.7068 39.8553 83.2481 + 677 -99.2023 39.6006 83.2471 + 677.1 -98.7081 39.3791 83.2481 + 677.2 -98.2139 39.1466 83.2541 + 677.3 -97.7197 38.9029 83.2761 + 677.4 -97.2358 38.6482 83.2741 + 677.5 -96.7416 38.3825 83.2702 + 677.6 -96.2473 38.1167 83.2782 + 677.7 -95.7428 37.8398 83.2852 + 677.8 -95.228 37.6184 83.2832 + 677.9 -94.6926 37.4301 83.2522 + 678 -94.1573 37.2308 83.2502 + 678.1 -93.6219 37.0647 83.2582 + 678.2 -93.0659 36.9207 83.2512 + 678.3 -92.5099 36.7989 83.2612 + 678.4 -91.9436 36.6992 83.2482 + 678.5 -91.3773 36.6438 83.2442 + 678.6 -90.8213 36.5552 83.2482 + 678.7 -90.2448 36.4666 83.2553 + 678.8 -89.6785 36.378 83.2573 + 678.9 -89.1019 36.2895 83.2623 + 679 -88.5253 36.1898 83.2523 + 679.1 -87.9385 36.0901 83.2603 + 679.2 -87.3516 35.9683 83.2653 + 679.3 -86.7544 35.8686 83.2633 + 679.4 -86.1572 35.7468 83.2623 + 679.5 -85.5601 35.625 83.2593 + 679.6 -84.9526 35.5032 83.2593 + 679.7 -84.3451 35.3814 83.2683 + 679.8 -83.7274 35.2595 83.2614 + 679.9 -83.1096 35.1377 83.2554 + 680 -82.4919 34.9938 83.2534 + 680.1 -81.8638 34.872 83.2444 + 680.2 -81.246 34.728 83.2474 + 680.3 -80.618 34.5951 83.2484 + 680.4 -79.9796 34.4511 83.2414 + 680.5 -79.3516 34.3072 83.2364 + 680.6 -78.7132 34.1632 83.2344 + 680.7 -78.0646 34.0192 83.2254 + 680.8 -77.4262 33.8753 83.2334 + 680.9 -76.7879 33.7313 83.2254 + 681 -76.1392 33.5984 83.2075 + 681.1 -75.4803 33.4545 83.2025 + 681.2 -74.8316 33.2994 83.2085 + 681.3 -74.1727 33.1555 83.1975 + 681.4 -73.5137 33.0226 83.1955 + 681.5 -72.8548 32.8675 83.1875 + 681.6 -72.1752 32.7346 83.1865 + 681.7 -71.506 32.5796 83.1775 + 681.8 -70.8265 32.4356 83.1645 + 681.9 -70.1469 32.2806 83.1775 + 682 -69.4674 32.1366 83.1675 + 682.1 -68.7673 31.9816 83.1655 + 682.2 -68.0774 31.8266 83.1626 + 682.3 -67.3773 31.6715 83.1536 + 682.4 -66.6772 31.5276 83.1546 + 682.5 -65.9667 31.3836 83.1586 + 682.6 -65.2563 31.2286 83.1506 + 682.7 -64.5459 31.0735 83.1646 + 682.8 -63.8355 30.9185 83.1586 + 682.9 -63.1147 30.7634 83.1506 + 683 -62.394 30.6084 83.1466 + 683.1 -61.6733 30.4534 83.1536 + 683.2 -60.9526 30.2873 83.1506 + 683.3 -60.2318 30.099 83.1486 + 683.4 -59.5111 29.9107 83.1407 + 683.5 -58.7904 29.7336 83.1367 + 683.6 -58.08 29.5342 83.1247 + 683.7 -57.3695 29.3127 83.1287 + 683.8 -56.6797 29.0359 83.1257 + 683.9 -56.0105 28.759 83.1237 + 684 -55.3309 28.5043 83.1667 + 684.1 -54.6205 28.2829 83.1207 + 684.2 -53.9307 27.9728 83.0737 + 684.3 -53.282 27.6073 83.1017 + 684.4 -52.654 27.2641 83.1137 + 684.5 -52.0053 26.954 83.1337 + 684.6 -51.3361 26.655 83.1367 + 684.7 -50.6874 26.3006 83.1227 + 684.8 -50.0594 25.9573 83.1348 + 684.9 -49.421 25.5919 83.1438 + 685 -48.793 25.2486 83.1628 + 685.1 -48.1443 24.9164 83.1748 + 685.2 -47.506 24.562 83.1738 + 685.3 -46.8573 24.2298 83.1858 + 685.4 -46.2087 23.8865 83.1848 + 685.5 -45.56 23.5432 83.1998 + 685.6 -44.9216 23.211 83.2138 + 685.7 -44.2833 22.8788 83.2068 + 685.8 -43.6346 22.5908 83.2048 + 685.9 -42.9654 22.3361 83.1658 + 686 -42.3168 22.0814 83.1628 + 686.1 -41.6475 21.86 83.1348 + 686.2 -40.9886 21.6938 83.1118 + 686.3 -40.3193 21.572 83.0908 + 686.4 -39.6501 21.4945 83.0458 + 686.5 -38.9911 21.4613 83.0168 + 686.6 -38.3425 21.4613 82.9838 + 686.7 -37.6938 21.5056 82.9689 + 686.8 -37.0555 21.5499 82.9419 + 686.9 -36.4068 21.5831 82.9129 + 687 -35.7891 21.6495 82.8939 + 687.1 -35.1816 21.727 82.8919 + 687.2 -34.5638 21.7935 82.8969 + 687.3 -33.9461 21.8489 82.9029 + 687.4 -33.3386 21.8932 82.9089 + 687.5 -32.7311 21.9374 82.9189 + 687.6 -32.1237 21.9817 82.9239 + 687.7 -31.5059 21.9817 82.9199 + 687.8 -30.9087 21.9596 82.8929 + 687.9 -30.3116 21.9374 82.9049 + 688 -29.735 21.8931 82.9349 + 688.1 -29.1481 21.871 82.9409 + 688.2 -28.5612 21.8156 82.9349 + 688.3 -27.9744 21.7381 82.9269 + 688.4 -27.3875 21.6606 82.9189 + 688.5 -26.8006 21.5941 82.9109 + 688.6 -26.2137 21.5388 82.9319 + 688.7 -25.6269 21.4723 82.9359 + 688.8 -25.04 21.417 82.9249 + 688.9 -24.4428 21.3616 82.9269 + 689 -23.8456 21.2951 82.9319 + 689.1 -23.2382 21.2287 82.9239 + 689.2 -22.6307 21.1733 82.9179 + 689.3 -22.0232 21.1069 82.9209 + 689.4 -21.3952 21.0404 82.8999 + 689.5 -20.7671 20.974 82.9109 + 689.6 -20.1288 20.9076 82.8919 + 689.7 -19.4801 20.8411 82.9059 + 689.8 -18.8212 20.7747 82.9009 + 689.9 -18.1519 20.7082 82.9009 + 690 -17.4724 20.6307 82.8899 + 690.1 -16.7826 20.5643 82.8929 + 690.2 -16.0824 20.4978 82.8959 + 690.3 -15.3823 20.4203 82.9039 + 690.4 -14.6616 20.3317 82.888 + 690.5 -13.9511 20.1767 82.893 + 690.6 -13.2407 20.0438 82.888 + 690.7 -12.5406 19.8777 82.895 + 690.8 -11.8508 19.6783 82.901 + 690.9 -11.1815 19.4347 82.902 + 691 -10.5329 19.1689 82.913 + 691.1 -9.8945 18.8699 82.911 + 691.2 -9.28704 18.5488 82.922 + 691.3 -8.67957 18.2166 82.929 + 691.4 -8.0824 17.8733 82.935 + 691.5 -7.47493 17.5411 82.913 + 691.6 -6.87776 17.1978 82.89 + 691.7 -6.27029 16.8323 82.889 + 691.8 -5.65253 16.489 82.88 + 691.9 -5.02447 16.1458 82.89 + 692 -4.37582 15.8025 82.894 + 692.1 -3.71687 15.4481 82.898 + 692.2 -3.05793 15.0937 82.882 + 692.3 -2.40928 14.7172 82.878 + 692.4 -1.76062 14.3296 82.88 + 692.5 -1.11197 13.942 82.886 + 692.6 -0.453026 13.5434 82.881 + 692.7 0.195625 13.1115 82.894 + 692.8 0.823684 12.6464 82.879 + 692.9 1.43115 12.1592 82.885 + 693 2.02832 11.6719 82.891 + 693.1 2.6049 11.1736 82.902 + 693.2 3.20207 10.6752 82.913 + 693.3 3.79924 10.1769 82.902 + 693.4 4.36553 9.64537 82.893 + 693.5 4.94211 9.1249 82.905 + 693.6 5.52898 8.60443 82.913 + 693.7 6.12615 8.08395 82.912 + 693.8 6.73362 7.57455 82.916 + 693.9 7.35138 7.06515 82.931 + 694 7.95885 6.54468 82.938 + 694.1 8.57662 6.02421 82.935 + 694.2 9.19438 5.50373 82.94 + 694.3 9.81214 4.98326 82.945 + 694.4 10.4299 4.46279 82.958 + 694.5 11.058 3.94231 82.956 + 694.6 11.686 3.42184 82.958 + 694.7 12.3244 2.90137 82.975 + 694.8 12.9421 2.3809 82.964 + 694.9 13.5805 1.86042 82.977 + 695 14.2086 1.35102 82.985 + 695.1 14.8469 0.83055 82.983 + 695.2 15.475 0.310077 82.972 + 695.3 16.103 -0.199322 82.99 + 695.4 16.7311 -0.719795 82.99 + 695.5 17.3592 -1.22919 82.988 + 695.6 17.9769 -1.72752 82.995 + 695.7 18.605 -2.23692 82.992 + 695.8 19.233 -2.75739 82.991 + 695.9 19.8611 -3.25572 82.992 + 696 20.4892 -3.77619 82.99 + 696.1 21.1172 -4.28559 82.977 + 696.2 21.7556 -4.79499 82.969 + 696.3 22.3939 -5.31546 82.935 + 696.4 23.0323 -5.83593 82.875 + 696.5 23.6809 -6.3564 82.803 + 696.6 24.3296 -6.88795 82.6839 + 696.7 24.9783 -7.40842 82.5409 + 696.8 25.6269 -7.9289 82.3559 + 696.9 26.2653 -8.44937 82.1439 + 697 26.9139 -8.96984 81.9059 + 697.1 27.5626 -9.50139 81.6489 + 697.2 28.2112 -10.0108 81.3759 + 697.3 28.8599 -10.5313 81.0969 + 697.4 29.5085 -11.0517 80.8069 + 697.5 30.1572 -11.5722 80.5089 + 697.6 30.8058 -12.0927 80.2109 + 697.7 31.4442 -12.6131 79.9199 + 697.8 32.0928 -13.1336 79.6469 + 697.9 32.7209 -13.643 79.3809 + 698 33.3592 -14.1635 79.1379 + 698.1 34.0079 -14.684 78.9049 + 698.2 34.6566 -15.1934 78.6699 + 698.3 35.2846 -15.7138 78.4489 + 698.4 35.9333 -16.2121 78.2399 + 698.5 36.5716 -16.7326 78.0089 + 698.6 37.21 -17.242 77.8099 + 698.7 37.8586 -17.7514 77.6339 + 698.8 38.5073 -18.2608 77.4929 + 698.9 39.1559 -18.7591 77.3669 + 699 39.8046 -19.2685 77.2658 + 699.1 40.4532 -19.789 77.1908 + 699.2 41.0916 -20.2873 77.1568 + 699.3 41.7608 -20.7746 77.1128 + 699.4 42.4507 -21.2175 77.0758 + 699.5 43.1302 -21.6605 77.0638 + 699.6 43.8407 -22.0813 77.0558 + 699.7 44.5511 -22.4467 77.0418 + 699.8 45.2924 -22.7679 77.0548 + 699.9 46.044 -23.0558 77.0708 + 700 46.7853 -23.2994 77.0688 + 700.1 47.5266 -23.4987 77.0638 + 700.2 48.268 -23.6316 77.0748 + 700.3 49.0093 -23.7313 77.0808 + 700.4 49.7403 -23.7867 77.0908 + 700.5 50.4507 -23.7977 77.0858 + 700.6 51.1509 -23.7756 77.0878 + 700.7 51.851 -23.6981 77.0807 + 700.8 52.5202 -23.5873 77.0907 + 700.9 53.1792 -23.4433 77.0847 + 701 53.797 -23.2551 77.0797 + 701.1 54.3941 -23.0336 77.0617 + 701.2 54.981 -22.7789 77.0767 + 701.3 55.5267 -22.491 77.0777 + 701.4 56.0415 -22.1698 77.0607 + 701.5 56.5254 -21.8265 77.0567 + 701.6 56.9887 -21.45 77.0557 + 701.7 57.4109 -21.0624 77.0497 + 701.8 57.8227 -20.6527 77.0437 + 701.9 58.214 -20.2208 77.0457 + 702 58.6361 -19.8222 77.0427 + 702.1 59.017 -19.4014 77.0367 + 702.2 59.3877 -18.9695 77.0427 + 702.3 59.7687 -18.5487 77.0337 + 702.4 60.1496 -18.1389 77.0617 + 702.5 60.5511 -17.7292 77.0427 + 702.6 60.9527 -17.3195 77.0447 + 702.7 61.3542 -16.9097 77.0357 + 702.8 61.7661 -16.4889 77.0217 + 702.9 62.1676 -16.0902 77.0047 + 703 62.5898 -15.6805 77.0057 + 703.1 63.0222 -15.2708 77.0047 + 703.2 63.4443 -14.85 76.9747 + 703.3 63.8871 -14.4292 76.9897 + 703.4 64.3092 -13.9973 76.9787 + 703.5 64.7416 -13.5654 76.9777 + 703.6 65.1638 -13.1224 76.9807 + 703.7 65.5962 -12.6684 76.9747 + 703.8 66.0286 -12.2144 76.9676 + 703.9 66.4611 -11.7603 76.9646 + 704 66.8935 -11.2952 76.9796 + 704.1 67.3156 -10.8301 76.9766 + 704.2 67.7687 -10.3539 76.9716 + 704.3 68.2217 -9.91099 76.9846 + 704.4 68.6953 -9.46803 76.9876 + 704.5 69.1792 -9.02507 76.9806 + 704.6 69.6734 -8.60426 76.9876 + 704.7 70.1985 -8.2056 76.9836 + 704.8 70.7236 -7.81801 76.9906 + 704.9 71.2693 -7.45257 76.9856 + 705 71.8356 -7.12035 76.9926 + 705.1 72.4019 -6.7992 76.9896 + 705.2 72.9784 -6.50021 76.9956 + 705.3 73.5653 -6.22336 76.9966 + 705.4 74.1728 -5.95758 76.9916 + 705.5 74.7802 -5.71395 76.9916 + 705.6 75.3877 -5.47032 76.9836 + 705.7 75.9952 -5.20454 76.9795 + 705.8 76.6026 -4.97199 76.9855 + 705.9 77.2307 -4.72836 76.9735 + 706 77.8588 -4.48473 76.9695 + 706.1 78.4765 -4.23003 76.9735 + 706.2 79.1046 -3.97533 76.9605 + 706.3 79.7326 -3.70955 76.9685 + 706.4 80.3607 -3.44377 76.9635 + 706.5 80.9888 -3.178 76.9615 + 706.6 81.6374 -2.91222 76.9595 + 706.7 82.2655 -2.63537 76.9555 + 706.8 82.9038 -2.35852 76.9495 + 706.9 83.5525 -2.08167 76.9475 + 707 84.1908 -1.80482 76.9364 + 707.1 84.8292 -1.52797 76.9344 + 707.2 85.4778 -1.25111 76.9274 + 707.3 86.1265 -0.963189 76.9174 + 707.4 86.7751 -0.675264 76.9204 + 707.5 87.4341 -0.398413 76.9104 + 707.6 88.0827 -0.0994143 76.9164 + 707.7 88.7314 0.188511 76.9014 + 707.8 89.4006 0.476436 76.9044 + 707.9 90.0596 0.764361 76.8934 + 708 90.7082 1.06336 76.8844 + 708.1 91.3774 1.36236 76.8843 + 708.2 92.0364 1.65028 76.8793 + 708.3 92.6953 1.94928 76.8653 + 708.4 93.3646 2.24828 76.8563 + 708.5 94.0441 2.54728 76.8423 + 708.6 94.7134 2.84628 76.8333 + 708.7 95.3929 3.14528 76.8243 + 708.8 96.0724 3.44428 76.8233 + 708.9 96.7623 3.75435 76.8103 + 709 97.4418 4.05335 76.8073 + 709.1 98.1213 4.36343 76.7962 + 709.2 98.8112 4.66243 76.7872 + 709.3 99.501 4.9725 76.7892 + 709.4 100.191 5.2715 76.7672 + 709.5 100.881 5.59265 76.7562 + 709.6 101.581 5.89165 76.7442 + 709.7 102.271 6.21279 76.7442 + 709.8 102.971 6.51179 76.7322 + 709.9 103.661 6.81079 76.7122 + 710 104.361 7.10979 76.7121 + 710.1 105.061 7.41987 76.6871 + 710.2 105.771 7.72994 76.6861 + 710.3 106.471 8.02894 76.6761 + 710.4 107.192 8.33902 76.6701 + 710.5 107.913 8.63802 76.6471 + 710.6 108.644 8.93702 76.6231 + 710.7 109.385 9.23602 76.6391 + 710.8 110.126 9.53502 76.632 + 710.9 110.878 9.83402 76.623 + 711 111.64 10.133 76.613 + 711.1 112.402 10.4209 76.611 + 711.2 113.174 10.7199 76.615 + 711.3 113.946 11.0189 76.609 + 711.4 114.708 11.3179 76.617 + 711.5 115.46 11.6723 76.5869 + 711.6 116.181 12.0488 76.5839 + 711.7 116.922 12.4143 76.5929 + 711.8 117.612 12.8129 76.5749 + 711.9 118.291 13.267 76.5609 + 712 118.919 13.7432 76.5489 + 712.1 119.516 14.2415 76.5469 + 712.2 120.083 14.762 76.5379 + 712.3 120.618 15.3157 76.5248 + 712.4 121.102 15.8804 76.5218 + 712.5 121.576 16.4674 76.5318 + 712.6 122.029 17.0543 76.5228 + 712.7 122.44 17.6523 76.5068 + 712.8 122.821 18.2613 76.5058 + 712.9 123.182 18.8815 76.5108 + 713 123.522 19.5127 76.5108 + 713.1 123.83 20.1328 76.4708 + 713.2 124.16 20.7641 76.4698 + 713.3 124.469 21.3953 76.4678 + 713.4 124.778 22.0265 76.4617 + 713.5 125.056 22.6577 76.4477 + 713.6 125.354 23.2778 76.4467 + 713.7 125.653 23.8869 76.4297 + 713.8 125.962 24.496 76.4307 + 713.9 126.271 25.105 76.4267 + 714 126.579 25.703 76.4207 + 714.1 126.888 26.301 76.4007 + 714.2 127.197 26.8879 76.3917 + 714.3 127.506 27.4749 76.3797 + 714.4 127.825 28.0618 76.3647 + 714.5 128.134 28.6487 76.3466 + 714.6 128.443 29.2245 76.3356 + 714.7 128.762 29.8004 76.3306 + 714.8 129.071 30.3762 76.3146 + 714.9 129.39 30.941 76.3116 + 715 129.709 31.5169 76.2956 + 715.1 130.029 32.0816 76.2966 + 715.2 130.348 32.6464 76.2766 + 715.3 130.646 33.2222 76.2626 + 715.4 130.955 33.787 76.2466 + 715.5 131.264 34.3629 76.2346 + 715.6 131.563 34.9387 76.2275 + 715.7 131.841 35.5145 76.2175 + 715.8 132.119 36.1015 76.2025 + 715.9 132.386 36.6884 76.1925 + 716 132.644 37.2864 76.1735 + 716.1 132.901 37.8733 76.1715 + 716.2 133.128 38.4824 76.1565 + 716.3 133.354 39.0804 76.1545 + 716.4 133.57 39.6894 76.1395 + 716.5 133.766 40.3096 76.1295 + 716.6 133.951 40.9297 76.1205 + 716.7 134.137 41.5498 76.1195 + 716.8 134.281 42.17 76.1084 + 716.9 134.445 42.8012 76.0984 + 717 134.579 43.4324 76.0874 + 717.1 134.713 44.0636 76.0704 + 717.2 134.826 44.6948 76.0734 + 717.3 134.929 45.326 76.0674 + 717.4 135.022 45.9573 76.0374 + 717.5 135.094 46.5885 76.0434 + 717.6 135.156 47.2197 76.0344 + 717.7 135.197 47.8509 76.0224 + 717.8 135.228 48.4821 76.0024 + 717.9 135.248 49.1133 76.0194 + 718 135.238 49.7335 75.9924 + 718.1 135.228 50.3647 75.9814 + 718.2 135.197 50.9848 75.9754 + 718.3 135.156 51.6049 75.9614 + 718.4 135.104 52.2362 75.9614 + 718.5 135.043 52.8563 75.9524 + 718.6 134.97 53.4654 75.9383 + 718.7 134.867 54.0855 75.9243 + 718.8 134.744 54.6835 75.9113 + 718.9 134.6 55.2815 75.9063 + 719 134.445 55.8795 75.8833 + 719.1 134.26 56.4664 75.8923 + 719.2 134.054 57.0422 75.8703 + 719.3 133.828 57.607 75.8643 + 719.4 133.57 58.1607 75.8473 + 719.5 133.302 58.7033 75.8543 + 719.6 133.014 59.2348 75.8513 + 719.7 132.726 59.7664 75.8313 + 719.8 132.407 60.2758 75.8203 + 719.9 132.067 60.7741 75.8183 + 720 131.717 61.2613 75.7843 + 720.1 131.356 61.7486 75.7843 + 720.2 130.976 62.2026 75.7734 + 720.3 130.574 62.6456 75.7584 + 720.4 130.152 63.0775 75.7394 + 720.5 129.719 63.4761 75.7194 + 720.6 129.277 63.8637 75.7024 + 720.7 128.824 64.2181 75.7014 + 720.8 128.35 64.5503 75.6724 + 720.9 127.866 64.8714 75.6634 + 721 127.362 65.1482 75.6594 + 721.1 126.857 65.4029 75.6604 + 721.2 126.342 65.6355 75.6614 + 721.3 125.817 65.8348 75.6524 + 721.4 125.292 66.012 75.6584 + 721.5 124.767 66.1781 75.6554 + 721.6 124.242 66.3331 75.6514 + 721.7 123.707 66.4771 75.6335 + 721.8 123.181 66.621 75.6125 + 721.9 122.646 66.765 75.5875 + 722 122.111 66.909 75.5685 + 722.1 121.555 67.0418 75.5655 + 722.2 120.999 67.1858 75.5585 + 722.3 120.432 67.3297 75.5745 + 722.4 119.856 67.4626 75.5635 + 722.5 119.259 67.5955 75.5555 + 722.6 118.661 67.7284 75.5625 + 722.7 118.054 67.8613 75.5415 + 722.8 117.436 67.9831 75.5166 + 722.9 116.818 68.116 75.5046 + 723 116.18 68.2488 75.5086 + 723.1 115.531 68.4039 75.5096 + 723.2 114.873 68.57 75.4936 + 723.3 114.203 68.7361 75.4846 + 723.4 113.513 68.9022 75.4826 + 723.5 112.803 69.0794 75.4806 + 723.6 112.093 69.2233 75.4716 + 723.7 111.351 69.3894 75.4806 + 723.8 110.61 69.5334 75.4937 + 723.9 109.848 69.6773 75.4927 + 724 109.076 69.8102 75.5037 + 724.1 108.293 69.932 75.5007 + 724.2 107.501 70.0428 75.4877 + 724.3 106.697 70.1535 75.4907 + 724.4 105.884 70.2642 75.4807 + 724.5 105.05 70.386 75.4797 + 724.6 104.216 70.5078 75.4698 + 724.7 103.362 70.6186 75.4678 + 724.8 102.497 70.7515 75.4568 + 724.9 101.622 70.8843 75.4508 + 725 100.736 71.0172 75.4438 + 725.1 99.8403 71.1612 75.4438 + 725.2 98.9343 71.2941 75.4328 + 725.3 98.0076 71.438 75.4318 + 725.4 97.081 71.582 75.4229 + 725.5 96.1441 71.737 75.4259 + 725.6 95.1968 71.8809 75.4199 + 725.7 94.229 72.0249 75.4119 + 725.8 93.2715 72.191 75.4059 + 725.9 92.3036 72.335 75.3659 + 726 91.3152 72.49 75.2929 + 726.1 90.3371 72.645 75.2099 + 726.2 89.3487 72.8 75.082 + 726.3 88.3603 72.9551 74.918 + 726.4 87.3616 73.1101 74.724 + 726.5 86.3628 73.2651 74.496 + 726.6 85.3538 73.4312 74.257 + 726.7 84.3345 73.5973 74.031 + 726.8 83.3049 73.7523 73.82 + 726.9 82.2753 73.9295 73.652 + 727 81.2251 74.1067 73.4941 + 727.1 80.1852 74.2839 73.3481 + 727.2 79.135 74.45 73.2501 + 727.3 78.0848 74.6271 73.1781 + 727.4 77.0346 74.8043 73.1231 + 727.5 75.9741 74.9926 73.1001 + 727.6 74.9034 75.1698 73.0611 + 727.7 73.8429 75.3359 73.0441 + 727.8 72.7618 75.513 73.0481 + 727.9 71.691 75.6902 73.0471 + 728 70.6202 75.8785 73.0522 + 728.1 69.5391 76.0999 73.0632 + 728.2 68.489 76.3325 73.0512 + 728.3 67.4491 76.5761 73.0462 + 728.4 66.4092 76.8529 73.0602 + 728.5 65.4002 77.163 73.0642 + 728.6 64.422 77.5174 73.0792 + 728.7 63.4645 77.905 73.0712 + 728.8 62.5276 78.3036 73.0772 + 728.9 61.6318 78.7466 73.0772 + 729 60.7669 79.2227 73.0722 + 729.1 59.933 79.7211 73.0842 + 729.2 59.1299 80.2526 73.0822 + 729.3 58.368 80.7952 73.0802 + 729.4 57.6473 81.3711 73.0792 + 729.5 56.9368 81.958 73.0802 + 729.6 56.1955 82.5338 73.0762 + 729.7 55.5057 83.1429 73.0472 + 729.8 54.8261 83.7519 73.0322 + 729.9 54.1363 84.3721 73.0362 + 730 53.4465 84.9922 73.0242 + 730.1 52.7463 85.6123 73.0242 + 730.2 52.0565 86.2435 73.0122 + 730.3 51.3873 86.908 72.9972 + 730.4 50.7386 87.5613 72.9792 + 730.5 50.09 88.2368 72.9862 + 730.6 49.4722 88.9234 73.0092 + 730.7 48.8956 89.6321 73.0102 + 730.8 48.3294 90.363 73.0082 + 730.9 47.8146 91.116 73.0182 + 731 47.3306 91.858 73.0272 + 731.1 46.8776 92.6221 73.0392 + 731.2 46.4452 93.364 73.0481 + 731.3 45.9613 94.1171 73.0221 + 731.4 45.5185 94.8701 73.0171 + 731.5 45.1067 95.6342 73.0041 + 731.6 44.664 96.3983 73.0101 + 731.7 44.2006 97.1624 72.9981 + 731.8 43.7373 97.9265 72.9981 + 731.9 43.2534 98.6795 72.9971 + 732 42.7798 99.4325 72.9911 + 732.1 42.2959 100.197 72.9911 + 732.2 41.812 100.961 72.9911 + 732.3 41.3281 101.725 72.9931 + 732.4 40.8338 102.489 72.985 + 732.5 40.3396 103.264 72.977 + 732.6 39.8351 104.028 72.979 + 732.7 39.3203 104.803 72.982 + 732.8 38.8055 105.59 72.978 + 732.9 38.2907 106.365 72.971 + 733 37.7862 107.14 72.965 + 733.1 37.2611 107.937 72.965 + 733.2 36.736 108.724 72.966 + 733.3 36.2109 109.51 72.971 + 733.4 35.6858 110.307 72.9639 + 733.5 35.1504 111.104 72.9579 + 733.6 34.6151 111.913 72.9589 + 733.7 34.0694 112.721 72.9529 + 733.8 33.534 113.53 72.9459 + 733.9 32.9883 114.349 72.9439 + 734 32.4426 115.157 72.9339 + 734.1 31.8969 115.988 72.9389 + 734.2 31.3409 116.807 72.9328 + 734.3 30.7849 117.638 72.9318 + 734.4 30.2393 118.457 72.9318 + 734.5 29.6833 119.288 72.9298 + 734.6 29.117 120.119 72.9268 + 734.7 28.561 120.96 72.9218 + 734.8 28.005 121.802 72.9148 + 734.9 27.449 122.632 72.9168 + 735 26.8725 123.474 72.9177 + 735.1 26.3165 124.316 72.9157 + 735.2 25.7502 125.157 72.9057 + 735.3 25.1839 125.999 72.9057 + 735.4 24.6176 126.84 72.9057 + 735.5 24.0514 127.682 72.9007 + 735.6 23.4954 128.513 72.8987 + 735.7 22.9394 129.365 72.8906 + 735.8 22.4143 130.229 72.8926 + 735.9 21.9201 131.104 72.8856 + 736 21.4568 131.968 72.8896 + 736.1 21.0243 132.842 72.9096 + 736.2 20.6434 133.728 72.9196 + 736.3 20.3036 134.614 72.9335 + 736.4 20.0256 135.5 72.9425 + 736.5 19.7785 136.386 72.9665 + 736.6 19.5726 137.272 72.9645 + 736.7 19.4182 138.125 72.9805 + 736.8 19.3049 138.988 72.9884 + 736.9 19.2431 139.841 72.9844 + 737 19.2328 140.672 72.9934 + 737.1 19.2534 141.491 72.9974 + 737.2 19.3255 142.288 72.9894 + 737.3 19.4285 143.064 72.9714 + 737.4 19.5726 143.828 72.9753 + 737.5 19.7579 144.559 72.9583 + 737.6 19.9844 145.267 72.9633 + 737.7 20.2418 145.954 72.9563 + 737.8 20.5404 146.607 72.9443 + 737.9 20.8596 147.238 72.9423 + 738 21.2302 147.836 72.9312 + 738.1 21.5906 148.423 72.9332 + 738.2 21.951 149.032 72.9132 + 738.3 22.3628 149.608 72.8892 + 738.4 22.7849 150.162 72.8862 + 738.5 23.2379 150.716 72.8612 + 738.6 23.6807 151.269 72.8382 + 738.7 24.1234 151.823 72.8441 + 738.8 24.5867 152.377 72.8381 + 738.9 25.0603 152.919 72.8401 + 739 25.5545 153.451 72.8371 + 739.1 26.0487 153.982 72.8221 + 739.2 26.5429 154.514 72.8221 + 739.3 27.0474 155.034 72.81 + 739.4 27.5622 155.544 72.801 + 739.5 28.0667 156.075 72.799 + 739.6 28.5815 156.585 72.793 + 739.7 29.1066 157.105 72.78 + 739.8 29.642 157.615 72.769 + 739.9 30.1774 158.124 72.769 + 740 30.7128 158.634 72.7549 + 740.1 31.2585 159.132 72.7429 + 740.2 31.8247 159.63 72.7319 + 740.3 32.4013 160.095 72.7419 + 740.4 32.9882 160.549 72.7189 + 740.5 33.5853 160.992 72.7179 + 740.6 34.1928 161.413 72.7119 + 740.7 34.8209 161.812 72.7128 + 740.8 35.4489 162.166 72.7178 + 740.9 36.1078 162.509 72.6968 + 741 36.7565 162.831 72.6978 + 741.1 37.4154 163.118 72.6838 + 741.2 38.0847 163.373 72.6818 + 741.3 38.7539 163.606 72.6748 + 741.4 39.4334 163.816 72.6708 + 741.5 40.1027 164.027 72.6598 + 741.6 40.7822 164.237 72.6517 + 741.7 41.472 164.436 72.6287 + 741.8 42.1516 164.613 72.6187 + 741.9 42.8517 164.802 72.6017 + 742 43.5415 165.001 72.5857 + 742.1 44.2313 165.211 72.5957 + 742.2 44.9212 165.433 72.5987 + 742.3 45.611 165.643 72.5887 + 742.4 46.3111 165.865 72.6037 + 742.5 47.0009 166.086 72.5977 + 742.6 47.6908 166.308 72.6056 + 742.7 48.3909 166.518 72.6016 + 742.8 49.091 166.717 72.6086 + 742.9 49.8014 166.917 72.5976 + 743 50.5118 167.083 72.6046 + 743.1 51.2326 167.238 72.6016 + 743.2 51.9327 167.36 72.6286 + 743.3 52.6534 167.459 72.6156 + 743.4 53.3535 167.515 72.6226 + 743.5 54.0742 167.559 72.6256 + 743.6 54.7744 167.57 72.6396 + 743.7 55.4745 167.559 72.6335 + 743.8 56.1746 167.526 72.6245 + 743.9 56.8747 167.471 72.6055 + 744 57.5646 167.393 72.6105 + 744.1 58.2544 167.293 72.6145 + 744.2 58.9442 167.183 72.6135 + 744.3 59.634 167.094 72.6185 + 744.4 60.3239 166.994 72.6045 + 744.5 61.0137 166.873 72.6185 + 744.6 61.7138 166.762 72.5925 + 744.7 62.4139 166.651 72.5935 + 744.8 63.1038 166.529 72.5945 + 744.9 63.8039 166.407 72.5955 + 745 64.504 166.275 72.5925 + 745.1 65.1939 166.108 72.5985 + 745.2 65.8734 165.942 72.5985 + 745.3 66.5529 165.743 72.5955 + 745.4 67.2222 165.544 72.6045 + 745.5 67.8914 165.322 72.6035 + 745.6 68.5503 165.09 72.5865 + 745.7 69.199 164.835 72.5815 + 745.8 69.8476 164.58 72.5775 + 745.9 70.4963 164.315 72.5685 + 746 71.1346 164.06 72.5545 + 746.1 71.7833 163.794 72.5525 + 746.2 72.4319 163.517 72.5395 + 746.3 73.0806 163.229 72.5355 + 746.4 73.7292 162.93 72.5205 + 746.5 74.3675 162.62 72.5355 + 746.6 74.9956 162.299 72.5245 + 746.7 75.6134 161.945 72.5265 + 746.8 76.2208 161.568 72.5435 + 746.9 76.8077 161.17 72.5485 + 747 77.3637 160.771 72.5595 + 747.1 77.9094 160.339 72.5495 + 747.2 78.455 159.896 72.5445 + 747.3 78.9698 159.442 72.5365 + 747.4 79.4743 158.977 72.5245 + 747.5 79.9583 158.49 72.5265 + 747.6 80.4319 157.991 72.5365 + 747.7 80.8952 157.493 72.5285 + 747.8 81.3379 156.973 72.5215 + 747.9 81.7704 156.441 72.5435 + 748 82.1822 155.898 72.5256 + 748.1 82.594 155.356 72.5336 + 748.2 83.0265 154.813 72.5196 + 748.3 83.4383 154.271 72.5316 + 748.4 83.8604 153.717 72.5096 + 748.5 84.2826 153.152 72.5076 + 748.6 84.7047 152.598 72.5046 + 748.7 85.1372 152.045 72.5026 + 748.8 85.5799 151.48 72.5116 + 748.9 86.0226 150.926 72.5016 + 749 86.4653 150.362 72.4976 + 749.1 86.9287 149.797 72.4936 + 749.2 87.3817 149.243 72.5026 + 749.3 87.8244 148.678 72.5057 + 749.4 88.2877 148.114 72.4937 + 749.5 88.7408 147.56 72.4877 + 749.6 89.1938 147.006 72.4877 + 749.7 89.6571 146.441 72.4917 + 749.8 90.1204 145.877 72.4747 + 749.9 90.5837 145.323 72.4757 + 750 91.0471 144.758 72.4867 + 750.1 91.5104 144.204 72.4757 + 750.2 91.9737 143.64 72.4777 + 750.3 92.4473 143.075 72.4747 + 750.4 92.9209 142.521 72.4747 + 750.5 93.3843 141.956 72.4727 + 750.6 93.8579 141.392 72.4617 + 750.7 94.3315 140.827 72.4677 + 750.8 94.7742 140.251 72.4617 + 750.9 95.217 139.653 72.4458 + 751 95.6391 139.055 72.4328 + 751.1 96.0303 138.446 72.4378 + 751.2 96.401 137.826 72.4368 + 751.3 96.7408 137.184 72.4388 + 751.4 97.0291 136.53 72.4428 + 751.5 97.3071 135.877 72.4368 + 751.6 97.5542 135.224 72.4508 + 751.7 97.7498 134.57 72.4518 + 751.8 97.9145 133.906 72.4448 + 751.9 98.0484 133.241 72.4458 + 752 98.1925 132.588 72.4479 + 752.1 98.3676 131.935 72.4429 + 752.2 98.5014 131.281 72.4389 + 752.3 98.6147 130.639 72.4389 + 752.4 98.7588 129.975 72.4389 + 752.5 98.903 129.332 72.4469 + 752.6 99.0677 128.679 72.4319 + 752.7 99.2325 128.026 72.4389 + 752.8 99.3972 127.372 72.4279 + 752.9 99.5722 126.719 72.435 + 753 99.7473 126.065 72.425 + 753.1 99.9223 125.412 72.416 + 753.2 100.108 124.748 72.41 + 753.3 100.283 124.083 72.41 + 753.4 100.468 123.419 72.409 + 753.5 100.653 122.754 72.412 + 753.6 100.849 122.09 72.416 + 753.7 101.045 121.426 72.407 + 753.8 101.24 120.75 72.4 + 753.9 101.415 120.075 72.3861 + 754 101.59 119.388 72.3821 + 754.1 101.724 118.701 72.3961 + 754.2 101.868 118.004 72.3811 + 754.3 101.992 117.317 72.3711 + 754.4 102.105 116.608 72.3861 + 754.5 102.198 115.911 72.3811 + 754.6 102.28 115.202 72.3911 + 754.7 102.352 114.482 72.3891 + 754.8 102.404 113.773 72.3972 + 754.9 102.445 113.065 72.3892 + 755 102.486 112.345 72.3882 + 755.1 102.527 111.625 72.3862 + 755.2 102.548 110.905 72.3932 + 755.3 102.558 110.186 72.3912 + 755.4 102.568 109.455 72.3792 + 755.5 102.568 108.735 72.3782 + 755.6 102.558 108.015 72.3773 + 755.7 102.538 107.284 72.3793 + 755.8 102.517 106.553 72.3693 + 755.9 102.476 105.834 72.3663 + 756 102.435 105.103 72.3683 + 756.1 102.393 104.372 72.3593 + 756.2 102.332 103.63 72.3483 + 756.3 102.27 102.888 72.3453 + 756.4 102.198 102.124 72.3314 + 756.5 102.126 101.371 72.3344 + 756.6 102.033 100.596 72.3244 + 756.7 101.93 99.8093 72.3244 + 756.8 101.796 99.0341 72.3334 + 756.9 101.642 98.259 72.3314 + 757 101.457 97.4838 72.3414 + 757.1 101.251 96.7197 72.3425 + 757.2 101.004 95.9667 72.3445 + 757.3 100.726 95.2358 72.3565 + 757.4 100.437 94.527 72.3665 + 757.5 100.139 93.8294 72.3725 + 757.6 99.8195 93.1317 72.3805 + 757.7 99.4798 92.4451 72.3796 + 757.8 99.1297 91.7586 72.3666 + 757.9 98.8003 91.072 72.3496 + 758 98.4605 90.3854 72.3436 + 758.1 98.131 89.6877 72.3536 + 758.2 97.7913 88.979 72.3516 + 758.3 97.4515 88.2703 72.3486 + 758.4 97.122 87.5615 72.3677 + 758.5 96.7823 86.8307 72.3577 + 758.6 96.4528 86.0998 72.3647 + 758.7 96.1233 85.3578 72.3657 + 758.8 95.7836 84.6159 72.3707 + 758.9 95.4541 83.8739 72.3677 + 759 95.1143 83.1209 72.3787 + 759.1 94.7849 82.3679 72.3758 + 759.2 94.4245 81.6038 72.3738 + 759.3 94.0539 80.8618 72.3768 + 759.4 93.6729 80.0977 72.3718 + 759.5 93.2714 79.3779 72.3808 + 759.6 92.8493 78.647 72.3718 + 759.7 92.3962 77.9383 72.3829 + 759.8 91.9329 77.2517 72.3959 + 759.9 91.4387 76.5873 72.3959 + 760 90.9342 75.9339 72.4059 + 760.1 90.44 75.2695 72.3949 + 760.2 89.9355 74.6051 72.4169 + 760.3 89.431 73.9628 72.4249 + 760.4 88.9162 73.3094 72.426 + 760.5 88.4117 72.645 72.436 + 760.6 87.9072 71.9805 72.43 + 760.7 87.413 71.305 72.456 + 760.8 86.9188 70.6295 72.434 + 760.9 86.4143 69.954 72.446 + 761 85.9098 69.2674 72.437 + 761.1 85.4156 68.5919 72.4481 + 761.2 84.9111 67.9053 72.4571 + 761.3 84.4066 67.2187 72.4581 + 761.4 83.9124 66.5322 72.4561 + 761.5 83.4079 65.8456 72.4681 + 761.6 82.9034 65.1479 72.4671 + 761.7 82.3989 64.4613 72.4751 + 761.8 81.9047 63.7637 72.4712 + 761.9 81.4002 63.0771 72.4682 + 762 80.906 62.3794 72.4742 + 762.1 80.4118 61.6928 72.4822 + 762.2 79.9073 60.9952 72.4862 + 762.3 79.4028 60.2975 72.4892 + 762.4 78.8983 59.5999 72.4832 + 762.5 78.4041 58.9022 72.4822 + 762.6 77.8996 58.2046 72.4903 + 762.7 77.3951 57.518 72.4983 + 762.8 76.8906 56.8203 72.4873 + 762.9 76.3964 56.1227 72.4893 + 763 75.8919 55.425 72.4983 + 763.1 75.3874 54.7273 72.4813 + 763.2 74.8829 54.0297 72.4793 + 763.3 74.3784 53.332 72.4803 + 763.4 73.8636 52.6344 72.4804 + 763.5 73.3591 51.9256 72.4834 + 763.6 72.8546 51.228 72.4964 + 763.7 72.3501 50.5303 72.4824 + 763.8 71.8353 49.8216 72.4854 + 763.9 71.3308 49.1239 72.4844 + 764 70.8263 48.4263 72.4804 + 764.1 70.3115 47.7175 72.4694 + 764.2 69.807 47.0199 72.4724 + 764.3 69.2922 46.3112 72.4595 + 764.4 68.7774 45.6135 72.4735 + 764.5 68.2626 44.9048 72.4665 + 764.6 67.7478 44.2071 72.4585 + 764.7 67.233 43.4873 72.4535 + 764.8 66.7182 42.7786 72.4615 + 764.9 66.2034 42.0698 72.4485 + 765 65.6783 41.3611 72.4365 + 765.1 65.1532 40.6302 72.4335 + 765.2 64.6281 39.9104 72.4375 + 765.3 64.0927 39.1796 72.4346 + 765.4 63.5573 38.4487 72.4286 + 765.5 63.0116 37.7178 72.4246 + 765.6 62.4248 36.998 72.4086 + 765.7 61.8379 36.3114 72.4106 + 765.8 61.2407 35.6359 72.4046 + 765.9 60.623 34.9936 72.4106 + 766 59.9846 34.3735 72.4116 + 766.1 59.336 33.8087 72.4206 + 766.2 58.6564 33.2771 72.4256 + 766.3 57.9769 32.7899 72.4227 + 766.4 57.2974 32.3359 72.4277 + 766.5 56.5972 31.9372 72.4347 + 766.6 55.8971 31.5607 72.4517 + 766.7 55.1867 31.2285 72.4377 + 766.8 54.4866 30.9516 72.4427 + 766.9 53.7658 30.708 72.4587 + 767 53.0451 30.5087 72.4497 + 767.1 52.3347 30.3536 72.4587 + 767.2 51.6346 30.2318 72.4597 + 767.3 50.9344 30.1543 72.4567 + 767.4 50.2446 30.1211 72.4577 + 767.5 49.5651 30.11 72.4737 + 767.6 48.8649 30.0989 72.4567 + 767.7 48.1751 30.11 72.4367 + 767.8 47.4647 30.1543 72.4378 + 767.9 46.7645 30.2096 72.4228 + 768 46.0541 30.265 72.4328 + 768.1 45.3231 30.3314 72.4368 + 768.2 44.5818 30.3868 72.4318 + 768.3 43.8405 30.4533 72.4188 + 768.4 43.0786 30.5418 72.4088 + 768.5 42.3372 30.6969 72.3958 + 768.6 41.6062 30.8408 72.3938 + 768.7 40.8855 31.018 72.3998 + 768.8 40.1751 31.2395 72.4248 + 768.9 39.4955 31.5053 72.4208 + 769 38.8572 31.8043 72.4238 + 769.1 38.2291 32.1254 72.4308 + 769.2 37.6423 32.4687 72.4408 + 769.3 37.0863 32.8341 72.4468 + 769.4 36.5612 33.2439 72.4558 + 769.5 36.0361 33.6536 72.4568 + 769.6 35.5007 34.0633 72.4668 + 769.7 35.0065 34.5174 72.4718 + 769.8 34.5226 34.9825 72.4598 + 769.9 34.0283 35.4476 72.4568 + 770 33.5238 35.9348 72.4638 + 770.1 33.009 36.4221 72.4588 + 770.2 32.4839 36.9204 72.4618 + 770.3 31.9588 37.4298 72.4538 + 770.4 31.4337 37.9503 72.4478 + 770.5 30.8984 38.4929 72.4468 + 770.6 30.3527 39.0355 72.4438 + 770.7 29.807 39.6003 72.4448 + 770.8 29.2407 40.165 72.4458 + 770.9 28.6744 40.7519 72.4378 + 771 28.0875 41.3389 72.4388 + 771.1 27.5007 41.9368 72.4368 + 771.2 26.9035 42.557 72.4398 + 771.3 26.3063 43.1771 72.4408 + 771.4 25.6886 43.7973 72.4438 + 771.5 25.0708 44.4395 72.4518 + 771.6 24.453 45.0818 72.4498 + 771.7 23.8147 45.7352 72.4538 + 771.8 23.166 46.3996 72.4458 + 771.9 22.5277 47.064 72.4248 + 772 21.879 47.7396 72.4158 + 772.1 21.2098 48.4151 72.4158 + 772.2 20.5508 49.1016 72.4168 + 772.3 19.8713 49.7993 72.4008 + 772.4 19.1918 50.4969 72.4028 + 772.5 18.5122 51.2057 72.3988 + 772.6 17.8224 51.9144 72.3978 + 772.7 17.1223 52.6342 72.3958 + 772.8 16.4221 53.354 72.3848 + 772.9 15.7117 54.0849 72.3838 + 773 15.0013 54.8268 72.3827 + 773.1 14.2703 55.5688 72.3777 + 773.2 13.5392 56.3107 72.3957 + 773.3 12.8082 57.0638 72.3777 + 773.4 12.0669 57.8279 72.3837 + 773.5 11.3256 58.5809 72.3807 + 773.6 10.5843 59.3561 72.3867 + 773.7 9.82239 60.1201 72.3787 + 773.8 9.06048 60.8953 72.3807 + 773.9 8.30887 61.6705 72.3857 + 774 7.53667 62.4567 72.3877 + 774.1 6.76447 63.2319 72.3857 + 774.2 5.99227 64.0182 72.3867 + 774.3 5.20978 64.8044 72.3777 + 774.4 4.42728 65.6017 72.3847 + 774.5 3.64478 66.388 72.3727 + 774.6 2.85199 67.1853 72.3836 + 774.7 2.0592 67.9826 72.3726 + 774.8 1.26641 68.791 72.3776 + 774.9 0.46332 69.5883 72.3716 + 775 -0.339768 70.3967 72.3836 + 775.1 -1.14286 71.2051 72.3816 + 775.2 -1.93565 72.0135 72.3916 + 775.3 -2.73873 72.8219 72.3986 + 775.4 -3.54182 73.6303 72.4036 + 775.5 -4.34491 74.4498 72.4066 + 775.6 -5.148 75.2582 72.3996 + 775.7 -5.96138 76.0776 72.4145 + 775.8 -6.77476 76.886 72.4115 + 775.9 -7.57785 77.6944 72.4125 + 776 -8.38094 78.5139 72.4185 + 776.1 -9.18402 79.3223 72.4385 + 776.2 -9.98711 80.1307 72.4295 + 776.3 -10.8005 80.9391 72.4345 + 776.4 -11.5933 81.7364 72.4315 + 776.5 -12.3861 82.5448 72.4365 + 776.6 -13.1892 83.3532 72.4404 + 776.7 -13.982 84.1505 72.4404 + 776.8 -14.7747 84.9478 72.4384 + 776.9 -15.5675 85.7562 72.4334 + 777 -16.3603 86.5535 72.4334 + 777.1 -17.1531 87.3619 72.4314 + 777.2 -17.9356 88.1592 72.4284 + 777.3 -18.7284 88.9566 72.4263 + 777.4 -19.5212 89.7539 72.4183 + 777.5 -20.3037 90.5512 72.4263 + 777.6 -21.0965 91.3485 72.4153 + 777.7 -21.879 92.1348 72.4133 + 777.8 -22.6615 92.921 72.4153 + 777.9 -23.444 93.7183 72.4093 + 778 -24.2264 94.5046 72.4113 + 778.1 -24.9986 95.3019 72.4152 + 778.2 -25.7502 96.0992 72.4062 + 778.3 -26.5019 96.9076 72.4182 + 778.4 -27.2432 97.705 72.4112 + 778.5 -27.9742 98.5133 72.4382 + 778.6 -28.6949 99.3328 72.4332 + 778.7 -29.395 100.163 72.4331 + 778.8 -30.0848 100.994 72.4381 + 778.9 -30.7747 101.824 72.4331 + 779 -31.4336 102.666 72.4281 + 779.1 -32.072 103.53 72.4401 + 779.2 -32.6897 104.405 72.4251 + 779.3 -33.2663 105.268 72.44 + 779.4 -33.8532 106.143 72.455 + 779.5 -34.4606 107.007 72.446 + 779.6 -35.0372 107.871 72.455 + 779.7 -35.5829 108.757 72.453 + 779.8 -36.1492 109.62 72.459 + 779.9 -36.6845 110.517 72.4579 + 780 -37.1993 111.392 72.4529 + 780.1 -37.6935 112.267 72.4689 + 780.2 -38.1672 113.142 72.4829 + 780.3 -38.5687 114.028 72.4989 + 780.4 -38.9496 114.914 72.4958 + 780.5 -39.2688 115.789 72.5158 + 780.6 -39.5468 116.663 72.5288 + 780.7 -39.7836 117.538 72.5388 + 780.8 -39.9689 118.391 72.5398 + 780.9 -40.1234 119.244 72.5418 + 781 -40.2263 120.085 72.5427 + 781.1 -40.2881 120.905 72.5357 + 781.2 -40.3087 121.724 72.5537 + 781.3 -40.2881 122.522 72.5577 + 781.4 -40.216 123.297 72.5507 + 781.5 -40.1131 124.061 72.5487 + 781.6 -39.9483 124.814 72.5546 + 781.7 -39.763 125.534 72.5576 + 781.8 -39.5159 126.209 72.5566 + 781.9 -39.2585 126.874 72.5626 + 782 -38.9496 127.505 72.5656 + 782.1 -38.6201 128.103 72.5506 + 782.2 -38.2392 128.668 72.5436 + 782.3 -37.8479 129.199 72.5476 + 782.4 -37.4258 129.675 72.5386 + 782.5 -36.9728 130.107 72.5316 + 782.6 -36.4992 130.495 72.5176 + 782.7 -36.0153 130.838 72.5045 + 782.8 -35.5108 131.126 72.4985 + 782.9 -34.996 131.359 72.4845 + 783 -34.4812 131.547 72.4885 + 783.1 -33.9561 131.68 72.4855 + 783.2 -33.4207 131.768 72.4805 + 783.3 -32.8853 131.835 72.4555 + 783.4 -32.3602 131.868 72.4735 + 783.5 -31.8145 131.868 72.4586 + 783.6 -31.2585 131.835 72.4466 + 783.7 -30.7025 131.779 72.4556 + 783.8 -30.1363 131.713 72.4526 + 783.9 -29.5494 131.624 72.4586 + 784 -28.9522 131.536 72.4806 + 784.1 -28.3448 131.425 72.4806 + 784.2 -27.7167 131.292 72.4876 + 784.3 -27.0887 131.159 72.4926 + 784.4 -26.4503 131.026 72.5096 + 784.5 -25.8017 130.871 72.5096 + 784.6 -25.153 130.705 72.5066 + 784.7 -24.4838 130.539 72.5216 + 784.8 -23.8043 130.362 72.5276 + 784.9 -23.1144 130.174 72.5246 + 785 -22.4143 129.985 72.5216 + 785.1 -21.7142 129.786 72.5216 + 785.2 -21.0038 129.587 72.5206 + 785.3 -20.283 129.376 72.5226 + 785.4 -19.552 129.177 72.5247 + 785.5 -18.821 128.967 72.5197 + 785.6 -18.0797 128.745 72.5257 + 785.7 -17.3178 128.524 72.5267 + 785.8 -16.5662 128.302 72.5217 + 785.9 -15.8043 128.081 72.5297 + 786 -15.0321 127.848 72.5257 + 786.1 -14.2599 127.627 72.5307 + 786.2 -13.4774 127.416 72.5427 + 786.3 -12.6846 127.272 72.4997 + 786.4 -11.8918 127.117 72.5077 + 786.5 -11.099 126.973 72.5187 + 786.6 -10.296 126.896 72.5117 + 786.7 -9.51347 126.874 72.5317 + 786.8 -8.73097 126.896 72.5347 + 786.9 -7.95878 126.94 72.5227 + 787 -7.19688 127.051 72.5347 + 787.1 -6.47616 127.184 72.5447 + 787.2 -5.72455 127.317 72.5387 + 787.3 -4.96265 127.46 72.5317 + 787.4 -4.23164 127.638 72.5037 + 787.5 -3.51092 127.826 72.5177 + 787.6 -2.77991 128.003 72.5247 + 787.7 -2.0386 128.169 72.5237 + 787.8 -1.29729 128.346 72.5317 + 787.9 -0.545686 128.512 72.5267 + 788 0.205919 128.701 72.5357 + 788.1 0.96782 128.878 72.5277 + 788.2 1.72972 129.066 72.5247 + 788.3 2.50192 129.254 72.5317 + 788.4 3.26382 129.443 72.5297 + 788.5 4.04631 129.631 72.5287 + 788.6 4.8288 129.83 72.5207 + 788.7 5.6113 130.019 72.5217 + 788.8 6.40409 130.218 72.5287 + 788.9 7.19687 130.417 72.5387 + 789 7.99996 130.617 72.5407 + 789.1 8.80304 130.816 72.5446 + 789.2 9.60613 131.026 72.5646 + 789.3 10.4092 131.237 72.5656 + 789.4 11.2226 131.447 72.5726 + 789.5 12.0463 131.657 72.5616 + 789.6 12.8802 131.868 72.5566 + 789.7 13.7039 132.078 72.5616 + 789.8 14.5379 132.3 72.5616 + 789.9 15.3822 132.51 72.5556 + 790 16.2264 132.721 72.5476 + 790.1 17.081 132.942 72.5426 + 790.2 17.9356 133.152 72.5426 + 790.3 18.7901 133.363 72.5346 + 790.4 19.655 133.584 72.5406 + 790.5 20.5301 133.806 72.5276 + 790.6 21.4053 134.016 72.5255 + 790.7 22.2702 134.238 72.5205 + 790.8 23.1556 134.459 72.5225 + 790.9 24.0411 134.67 72.5125 + 791 24.9265 134.891 72.5115 + 791.1 25.8223 135.113 72.5035 + 791.2 26.718 135.334 72.4975 + 791.3 27.624 135.556 72.4915 + 791.4 28.5301 135.777 72.4845 + 791.5 29.4361 135.998 72.4815 + 791.6 30.3422 136.22 72.4955 + 791.7 31.2482 136.441 72.4955 + 791.8 32.1646 136.674 72.4864 + 791.9 33.0603 136.895 72.4904 + 792 33.9766 137.117 72.4994 + 792.1 34.8724 137.338 72.5004 + 792.2 35.7784 137.56 72.4984 + 792.3 36.6742 137.781 72.5104 + 792.4 37.5699 138.003 72.5064 + 792.5 38.4657 138.213 72.5094 + 792.6 39.3511 138.435 72.5094 + 792.7 40.2263 138.645 72.5134 + 792.8 41.0911 138.856 72.5183 + 792.9 41.9457 139.066 72.5143 + 793 42.8003 139.265 72.5153 + 793.1 43.6342 139.476 72.5193 + 793.2 44.4785 139.653 72.5203 + 793.3 45.3228 139.775 72.5033 + 793.4 46.1465 139.897 72.4853 + 793.5 46.9598 139.996 72.4913 + 793.6 47.7629 140.04 72.5163 + 793.7 48.5557 140.04 72.5253 + 793.8 49.3382 139.996 72.5423 + 793.9 50.1104 139.908 72.5353 + 794 50.8517 139.775 72.5363 + 794.1 51.5724 139.62 72.5233 + 794.2 52.2622 139.42 72.5223 + 794.3 52.9315 139.177 72.5103 + 794.4 53.5801 138.9 72.5163 + 794.5 54.1979 138.601 72.5173 + 794.6 54.8156 138.28 72.5073 + 794.7 55.4128 137.936 72.5083 + 794.8 56.01 137.582 72.4993 + 794.9 56.5969 137.206 72.4923 + 795 57.194 136.84 72.4673 + 795.1 57.7912 136.464 72.4663 + 795.2 58.3884 136.087 72.4723 + 795.3 59.0061 135.688 72.4813 + 795.4 59.6239 135.312 72.4853 + 795.5 60.2622 134.924 72.4833 + 795.6 60.8903 134.548 72.4693 + 795.7 61.5286 134.16 72.4153 + 795.8 62.1773 133.784 72.3423 + 795.9 62.8156 133.396 72.2413 + 796 63.4643 133.009 72.0973 + 796.1 64.1232 132.632 71.9363 + 796.2 64.7821 132.245 71.7303 + 796.3 65.4308 131.868 71.4993 + 796.4 66.1 131.491 71.2233 + 796.5 66.759 131.115 70.9253 + 796.6 67.4282 130.738 70.6203 + 796.7 68.1077 130.362 70.2743 + 796.8 68.777 129.985 69.9233 + 796.9 69.4565 129.598 69.5433 + 797 70.1463 129.221 69.1863 + 797.1 70.8362 128.834 68.8093 + 797.2 71.526 128.457 68.4263 + 797.3 72.2261 128.081 68.0623 + 797.4 72.9365 127.693 67.6943 + 797.5 73.6469 127.306 67.3473 + 797.6 74.3574 126.907 66.9943 + 797.7 75.0781 126.519 66.6623 + 797.8 75.8194 126.132 66.3253 + 797.9 76.5607 125.744 65.9793 + 798 77.2917 125.345 65.6183 + 798.1 78.0433 124.947 65.2543 + 798.2 78.8052 124.548 64.8823 + 798.3 79.5671 124.149 64.5063 + 798.4 80.329 123.751 64.1083 + 798.5 81.1012 123.341 63.7273 + 798.6 81.8734 122.931 63.3283 + 798.7 82.6662 122.522 62.9253 + 798.8 83.4486 122.112 62.5223 + 798.9 84.2414 121.691 62.1313 + 799 85.0342 121.27 61.7423 + 799.1 85.8373 120.838 61.3333 + 799.2 86.6301 120.418 60.9393 + 799.3 87.4435 119.986 60.5333 + 799.4 88.2568 119.554 60.1343 + 799.5 89.0702 119.122 59.7303 + 799.6 89.8733 118.69 59.3503 + 799.7 90.697 118.258 58.9453 + 799.8 91.5103 117.815 58.5443 + 799.9 92.334 117.383 58.1602 + 800 93.1474 116.94 57.7542 + 800.1 93.9608 116.508 57.3492 + 800.2 94.7844 116.065 56.9612 + 800.3 95.5978 115.634 56.5672 + 800.4 96.4215 115.191 56.1682 + 800.5 97.2349 114.748 55.7772 + 800.6 98.0585 114.316 55.3722 + 800.7 98.8822 113.873 54.9662 + 800.8 99.7059 113.43 54.5682 + 800.9 100.53 112.998 54.1652 + 801 101.353 112.544 53.7602 + 801.1 102.187 112.112 53.3632 + 801.2 103.001 111.658 52.9672 + 801.3 103.835 111.215 52.5702 + 801.4 104.658 110.772 52.1672 + 801.5 105.492 110.329 51.7742 + 801.6 106.316 109.886 51.3652 + 801.7 107.15 109.443 50.9752 + 801.8 107.984 108.989 50.5822 + 801.9 108.807 108.557 50.1711 + 802 109.641 108.103 49.7701 + 802.1 110.475 107.66 49.3751 + 802.2 111.309 107.217 48.9721 + 802.3 112.143 106.763 48.5731 + 802.4 112.977 106.309 48.1861 + 802.5 113.822 105.866 47.7761 + 802.6 114.656 105.412 47.3831 + 802.7 115.5 104.958 46.9861 + 802.8 116.354 104.493 46.5911 + 802.9 117.188 104.039 46.1981 + 803 118.043 103.585 45.8001 + 803.1 118.887 103.12 45.3981 + 803.2 119.731 102.655 44.999 + 803.3 120.586 102.201 44.599 + 803.4 121.441 101.725 44.202 + 803.5 122.295 101.271 43.807 + 803.6 123.15 100.795 43.397 + 803.7 124.014 100.341 43.008 + 803.8 124.869 99.8644 42.601 + 803.9 125.724 99.3993 42.211 + 804 126.578 98.9231 41.808 + 804.1 127.433 98.458 41.404 + 804.2 128.287 97.9929 41.009 + 804.3 129.152 97.5278 40.6079 + 804.4 130.007 97.0627 40.2009 + 804.5 130.851 96.6087 39.7959 + 804.6 131.716 96.1325 39.3999 + 804.7 132.57 95.6785 39.0119 + 804.8 133.425 95.2134 38.6019 + 804.9 134.279 94.7483 38.2019 + 805 135.124 94.2832 37.8039 + 805.1 135.978 93.8181 37.4049 + 805.2 136.833 93.364 37.0068 + 805.3 137.677 92.8989 36.6048 + 805.4 138.511 92.4449 36.2388 + 805.5 139.335 91.9909 35.9008 + 805.6 140.158 91.5479 35.5788 + 805.7 140.972 91.105 35.2908 + 805.8 141.775 90.6731 35.0308 + 805.9 142.568 90.2302 34.7988 + 806 143.36 89.8094 34.6228 + 806.1 144.143 89.3775 34.4647 + 806.2 144.915 88.9567 34.3587 + 806.3 145.687 88.5359 34.2817 + 806.4 146.46 88.1262 34.2297 + 806.5 147.232 87.7054 34.1977 + 806.6 148.004 87.3067 34.1787 + 806.7 148.776 86.9192 34.1697 + 806.8 149.548 86.5205 34.1857 + 806.9 150.331 86.1219 34.2016 + 807 151.103 85.7232 34.2316 + 807.1 151.885 85.3467 34.2526 + 807.2 152.658 84.9702 34.2706 + 807.3 153.44 84.5937 34.2816 + 807.4 154.223 84.2172 34.2886 + 807.5 155.005 83.8518 34.3046 + 807.6 155.788 83.5085 34.3015 + 807.7 156.57 83.1652 34.3125 + 807.8 157.363 82.8441 34.2945 + 807.9 158.166 82.5451 34.3025 + 808 158.979 82.2461 34.3155 + 808.1 159.772 81.936 34.3135 + 808.2 160.575 81.6481 34.3195 + 808.3 161.368 81.3713 34.3104 + 808.4 162.151 81.0945 34.3414 + 808.5 162.923 80.8176 34.3584 + 808.6 163.685 80.5519 34.3954 + 808.7 164.457 80.3304 34.4144 + 808.8 165.219 80.1089 34.4634 + 808.9 165.97 79.9207 34.5093 + 809 166.732 79.7324 34.6003 + 809.1 167.494 79.5885 34.6643 + 809.2 168.246 79.4888 34.7353 + 809.3 169.008 79.3892 34.8083 + 809.4 169.759 79.3227 34.8842 + 809.5 170.511 79.2674 34.9442 + 809.6 171.263 79.2231 34.9842 + 809.7 172.004 79.212 35.0282 + 809.8 172.755 79.212 35.0692 + 809.9 173.486 79.2342 35.0891 + 810 174.217 79.2785 35.0931 + 810.1 174.938 79.3339 35.1121 + 810.2 175.659 79.4225 35.1091 + 810.3 176.369 79.5332 35.1201 + 810.4 177.069 79.6661 35.124 + 810.5 177.759 79.8101 35.111 + 810.6 178.449 79.954 35.115 + 810.7 179.159 80.0869 35.112 + 810.8 179.839 80.242 35.1 + 810.9 180.498 80.4302 35.1149 + 811 181.147 80.6517 35.0929 + 811.1 181.806 80.8511 35.0899 + 811.2 182.444 81.0725 35.0739 + 811.3 183.051 81.3383 35.0779 + 811.4 183.638 81.6373 35.0728 + 811.5 184.194 81.9695 35.0938 + 811.6 184.719 82.3239 35.1028 + 811.7 185.224 82.7004 35.0958 + 811.8 185.687 83.1102 35.1028 + 811.9 186.109 83.5421 35.1027 + 812 186.5 83.9739 35.1127 + 812.1 186.85 84.439 35.1027 + 812.2 187.149 84.9041 35.1117 + 812.3 187.417 85.3803 35.1087 + 812.4 187.633 85.8676 35.1077 + 812.5 187.798 86.3437 35.1096 + 812.6 187.932 86.831 35.1036 + 812.7 188.014 87.2961 35.0986 + 812.8 188.045 87.7723 35.0816 + 812.9 188.024 88.2263 35.0916 + 813 187.973 88.6582 35.0946 + 813.1 187.88 89.0679 35.0856 + 813.2 187.736 89.4555 35.0746 + 813.3 187.551 89.8099 35.0746 + 813.4 187.334 90.1421 35.0666 + 813.5 187.077 90.4189 35.0756 + 813.6 186.809 90.6736 35.0706 + 813.7 186.5 90.8729 35.0756 + 813.8 186.171 91.028 35.0686 + 813.9 185.821 91.1498 35.0876 + 814 185.45 91.2716 35.0916 + 814.1 185.059 91.3602 35.0897 + 814.2 184.647 91.4155 35.0627 + 814.3 184.215 91.4709 35.0377 + 814.4 183.762 91.5152 35.0327 + 814.5 183.288 91.5705 35.0317 + 814.6 182.794 91.6148 35.0347 + 814.7 182.279 91.6591 35.0307 + 814.8 181.754 91.6923 35.0157 + 814.9 181.198 91.7366 35.0098 + 815 180.632 91.7698 35.0038 + 815.1 180.045 91.8031 34.9988 + 815.2 179.448 91.8363 35.0028 + 815.3 178.84 91.8695 35.0058 + 815.4 178.212 91.9027 35.0018 + 815.5 177.563 91.9359 34.9989 + 815.6 176.915 91.958 34.9909 + 815.7 176.246 91.9913 34.9949 + 815.8 175.556 92.0245 34.9859 + 815.9 174.845 92.0577 34.9919 + 816 174.135 92.0909 34.997 + 816.1 173.404 92.1241 35.005 + 816.2 172.663 92.1684 35 + 816.3 171.911 92.2016 35.004 + 816.4 171.139 92.2348 35.009 + 816.5 170.356 92.2791 35.0121 + 816.6 169.564 92.3234 35.0011 + 816.7 168.76 92.3566 35.0131 + 816.8 167.937 92.4009 35.0011 + 816.9 167.113 92.4452 35.0021 + 817 166.279 92.5005 35.0052 + 817.1 165.425 92.5448 34.9972 + 817.2 164.57 92.5891 35.0002 + 817.3 163.705 92.6445 35.0022 + 817.4 162.83 92.6998 34.9942 + 817.5 161.945 92.7552 34.9993 + 817.6 161.049 92.8106 34.9933 + 817.7 160.143 92.8881 35.0053 + 817.8 159.237 92.9988 34.9943 + 817.9 158.351 93.1095 34.9994 + 818 157.476 93.2645 35.0094 + 818.1 156.611 93.4417 35.0274 + 818.2 155.757 93.6632 35.0274 + 818.3 154.902 93.8625 35.0384 + 818.4 154.037 94.0729 35.0064 + 818.5 153.203 94.3165 34.9955 + 818.6 152.359 94.5823 35.0045 + 818.699 151.504 94.837 35.0015 + 818.799 150.64 95.0806 35.0055 + 818.899 149.764 95.3353 35.0165 + 819 148.879 95.59 35.0175 + 819.1 148.004 95.8447 35.0176 + 819.2 147.118 96.0993 35.0176 + 819.3 146.223 96.354 35.0286 + 819.4 145.327 96.5977 35.0306 + 819.5 144.421 96.8413 35.0366 + 819.6 143.515 97.0849 35.0336 + 819.7 142.598 97.3064 35.0497 + 819.8 141.672 97.5057 35.0497 + 819.9 140.735 97.6828 35.0587 + 820 139.808 97.8268 35.0537 + 820.1 138.871 97.9375 35.0507 + 820.2 137.934 98.004 35.0928 + 820.3 137.008 98.0261 35.1088 + 820.4 136.091 98.0039 35.1238 + 820.5 135.196 97.9375 35.1248 + 820.6 134.321 97.8267 35.1278 + 820.7 133.466 97.6606 35.1399 + 820.8 132.632 97.4613 35.1289 + 820.9 131.829 97.2066 35.1219 + 821 131.057 96.9297 35.1089 + 821.1 130.336 96.6086 35.0869 + 821.2 129.626 96.2432 35.062 + 821.3 128.967 95.8445 35.033 + 821.4 128.339 95.4126 35.013 + 821.5 127.7 94.9807 35.003 + 821.6 127.021 94.5488 34.947 + 821.7 126.413 94.0837 34.8871 + 821.8 125.785 93.6075 34.8791 + 821.9 125.147 93.1535 34.8711 + 822 124.488 92.6884 34.8811 + 822.1 123.798 92.2344 34.9031 + 822.2 123.098 91.7914 34.9061 + 822.3 122.408 91.3263 34.9092 + 822.4 121.708 90.8723 34.9012 + 822.5 120.998 90.4072 34.9192 + 822.6 120.287 89.9531 34.9262 + 822.7 119.567 89.4991 34.9322 + 822.8 118.846 89.034 34.9423 + 822.9 118.115 88.58 34.9423 + 823 117.374 88.1259 34.9473 + 823.1 116.632 87.6719 34.9593 + 823.2 115.891 87.2068 34.9663 + 823.3 115.129 86.7528 34.9564 + 823.4 114.377 86.2877 34.9574 + 823.5 113.616 85.8336 34.9644 + 823.6 112.854 85.3685 34.9684 + 823.7 112.071 84.9145 34.9704 + 823.8 111.299 84.4494 34.9665 + 823.9 110.516 83.9843 34.9765 + 824 109.724 83.5192 34.9695 + 824.1 108.931 83.0541 34.9725 + 824.2 108.138 82.589 34.9805 + 824.3 107.335 82.1239 34.9696 + 824.4 106.532 81.6477 34.9606 + 824.5 105.729 81.1826 34.9746 + 824.6 104.926 80.7064 34.9786 + 824.7 104.112 80.2413 34.9716 + 824.8 103.299 79.7651 34.9737 + 824.9 102.486 79.2889 34.9807 + 825 101.662 78.8127 34.9737 + 825.1 100.838 78.3366 34.9867 + 825.2 100.015 77.8604 34.9827 + 825.3 99.191 77.3731 34.9848 + 825.4 98.3673 76.8969 34.9978 + 825.5 97.5334 76.4208 34.9958 + 825.6 96.7097 75.9335 35.0038 + 825.7 95.886 75.4573 35.0028 + 825.8 95.0418 74.9922 34.9968 + 825.9 94.2078 74.5382 34.9999 + 826 93.3635 74.0842 34.9969 + 826.1 92.5193 73.6523 34.9749 + 826.2 91.6544 73.2536 34.9799 + 826.3 90.7896 72.8882 34.9709 + 826.4 89.935 72.5449 34.973 + 826.5 89.0907 72.1351 34.957 + 826.6 88.2156 71.7586 34.913 + 826.7 87.3713 71.4043 34.909 + 826.8 86.5579 70.9835 34.917 + 826.9 85.7549 70.5405 34.928 + 827 84.9724 70.0643 34.952 + 827.1 84.2311 69.566 34.9771 + 827.2 83.4486 69.0898 35.0091 + 827.3 82.6867 68.5915 34.9761 + 827.4 81.966 68.071 34.9541 + 827.5 81.2555 67.5395 34.9641 + 827.6 80.5348 67.0411 34.9611 + 827.7 79.7935 66.5428 34.9592 + 827.8 79.0522 66.0445 34.9562 + 827.9 78.3006 65.5462 34.9822 + 828 77.549 65.0368 34.9742 + 828.1 76.8077 64.5274 34.9652 + 828.2 76.0561 64.018 34.9782 + 828.3 75.3045 63.5196 34.9692 + 828.4 74.5632 63.0102 34.9773 + 828.5 73.8219 62.5008 34.9853 + 828.6 73.0703 61.9914 34.9753 + 828.7 72.3187 61.482 34.9743 + 828.8 71.5671 60.9726 34.9723 + 828.9 70.8155 60.4632 34.9723 + 829 70.0536 59.9538 34.9733 + 829.1 69.302 59.4444 34.9743 + 829.2 68.5401 58.935 34.9714 + 829.3 67.7782 58.4146 34.9684 + 829.4 67.0163 57.9052 34.9634 + 829.5 66.2647 57.3958 34.9654 + 829.6 65.4925 56.8753 34.9674 + 829.7 64.7306 56.3548 34.9604 + 829.8 63.9687 55.8454 34.9654 + 829.9 63.1965 55.325 34.9584 + 830 62.4346 54.8045 34.9665 + 830.1 61.6624 54.284 34.9655 + 830.2 60.9108 53.7525 34.9725 + 830.3 60.1592 53.2098 34.9695 + 830.4 59.4385 52.634 34.9785 + 830.5 58.7281 52.0582 34.9825 + 830.6 58.0383 51.4712 35.0005 + 830.7 57.3587 50.8511 35.0195 + 830.8 56.6998 50.2199 35.0285 + 830.9 56.0717 49.5665 35.0306 + 831 55.4746 48.9021 35.0256 + 831.1 54.898 48.2266 35.0316 + 831.2 54.342 47.54 35.0346 + 831.3 53.7655 46.8645 35.0256 + 831.4 53.1786 46.1779 35.0046 + 831.5 52.6432 45.4914 34.9906 + 831.6 52.0872 44.8048 34.9896 + 831.7 51.5313 44.1182 34.9966 + 831.8 50.9444 43.4427 34.9926 + 831.9 50.3472 42.7672 34.9967 + 832 49.7706 42.0917 34.9937 + 832.1 49.1838 41.4051 35.0047 + 832.2 48.5866 40.7517 35.0107 + 832.3 47.9483 40.1095 35.0037 + 832.4 47.3202 39.4783 34.9987 + 832.5 46.6819 38.8692 34.9937 + 832.6 46.0332 38.2823 35.0107 + 832.7 45.4258 37.6621 35.0207 + 832.8 44.7771 37.0642 35.0167 + 832.9 44.1285 36.4994 35.0197 + 833 43.4798 35.9235 35.0318 + 833.1 42.8518 35.3366 35.0558 + 833.2 42.234 34.7386 35.0608 + 833.3 41.6163 34.1517 35.0648 + 833.4 40.9985 33.5537 35.0538 + 833.5 40.3911 32.9558 35.0678 + 833.6 39.7939 32.3688 35.0618 + 833.7 39.1761 31.7819 35.0618 + 833.8 38.5687 31.1839 35.0678 + 833.9 37.9612 30.5859 35.0788 + 834 37.3538 29.999 35.0878 + 834.1 36.7463 29.401 35.0828 + 834.2 36.1491 28.8031 35.0798 + 834.3 35.5417 28.2161 35.0938 + 834.4 34.9445 27.6292 35.1008 + 834.5 34.3576 27.0423 35.1018 + 834.6 33.7605 26.4554 35.0929 + 834.7 33.1736 25.8796 35.0949 + 834.9 32.0102 24.7279 35.0829 + 835 31.4336 24.1631 35.0769 + 835.1 30.8776 23.5983 35.0609 + 835.2 30.3216 23.0336 35.0239 + 835.3 29.7451 22.4799 35.0009 + 835.4 29.1994 21.9151 34.9679 + 835.5 28.6434 21.3725 34.9589 + 835.6 28.0977 20.8077 34.9429 + 835.7 27.5417 20.2651 34.9279 + 835.8 27.0063 19.7114 34.9239 + 835.9 26.4606 19.1688 34.9239 + 836 25.915 18.6151 34.9209 + 836.1 25.3693 18.0614 34.8959 + 836.2 24.8236 17.5077 34.9079 + 836.3 24.2882 16.943 34.9029 + 836.4 23.7425 16.4004 34.9049 + 836.5 23.2071 15.8467 34.9059 + 836.6 22.6717 15.293 34.8979 + 836.7 22.126 14.7393 34.9029 + 836.8 21.5907 14.1967 34.8999 + 836.9 21.0656 13.643 34.898 + 837 20.5302 13.1003 34.894 + 837.1 19.9948 12.5688 34.885 + 837.2 19.4697 12.0262 34.896 + 837.3 18.9446 11.4946 34.888 + 837.4 18.4298 10.9742 34.889 + 837.5 17.9253 10.4537 34.877 + 837.6 17.4208 9.93323 34.891 + 837.7 16.9163 9.43491 34.89 + 837.8 16.4221 8.92551 34.881 + 837.9 15.9279 8.42719 34.869 + 838 15.444 7.93994 34.874 + 838.1 14.9601 7.44162 34.872 + 838.2 14.4864 6.95437 34.865 + 838.3 14.0025 6.46712 34.864 + 838.4 13.5392 5.99094 34.862 + 838.5 13.0656 5.5037 34.865 + 838.6 12.592 5.02752 34.871 + 838.7 12.1287 4.55135 34.864 + 838.8 11.6653 4.08625 34.869 + 838.9 11.202 3.62114 34.864 + 839 10.7593 3.16712 34.861 + 839.1 10.3063 2.71309 34.827 + 839.2 9.89444 2.30336 34.754 + 839.3 9.51349 1.9047 34.639 + 839.4 9.13254 1.49497 34.517 + 839.5 8.76188 1.10738 34.362 + 839.6 8.42211 0.730875 34.184 + 839.7 8.10294 0.387586 33.974 + 839.8 7.79406 0.0664449 33.741 + 839.9 7.51607 -0.254696 33.471 + 840 7.24837 -0.564763 33.174 + 840.1 6.99097 -0.841609 32.859 + 840.2 6.76446 -1.10738 32.517 + 840.3 6.55854 -1.351 32.171 + 840.4 6.36292 -1.58355 31.813 + 840.5 6.18788 -1.79396 31.43 + 840.6 6.02315 -1.97114 31.041 + 840.7 5.879 -2.14832 30.645 + 840.8 5.76575 -2.30335 30.25 + 840.9 5.66279 -2.43624 29.841 + 841 5.57012 -2.55805 29.471 + 841.1 5.47746 -2.66879 29.077 + 841.2 5.41568 -2.76845 28.699 + 841.3 5.35391 -2.85704 28.316 + 841.4 5.31272 -2.95671 27.939 + 841.5 5.26124 -3.03422 27.563 + 841.6 5.22006 -3.11174 27.166 + 841.7 5.18917 -3.17818 26.797 + 841.8 5.16858 -3.23355 26.445 + 841.9 5.14799 -3.28892 26.103 + 842 5.13769 -3.33322 25.791 + 842.1 5.1171 -3.36644 25.509 + 842.2 5.1171 -3.41073 25.199 + 842.3 5.1068 -3.43288 24.933 + 842.4 5.1068 -3.45503 24.667 + 842.5 5.1068 -3.47717 24.382 + 842.6 5.1068 -3.48825 24.119 + 842.7 5.1171 -3.5104 23.863 + 842.8 5.13769 -3.52147 23.594 + 842.9 5.14798 -3.53254 23.328 + 843 5.14798 -3.55469 23.084 + 843.1 5.14798 -3.55469 22.818 + 843.2 5.15828 -3.55469 22.583 + 843.3 5.16857 -3.55469 22.317 + 843.4 5.17887 -3.56576 22.063 + 843.5 5.15828 -3.56576 21.802 + 843.6 5.16857 -3.56576 21.538 + 843.7 5.16857 -3.55469 21.282 + 843.8 5.16857 -3.55469 21.01 + 843.9 5.16857 -3.55469 20.746 + 844 5.15828 -3.54361 20.482 + 844.1 5.15828 -3.53254 20.208 + 844.2 5.15828 -3.53254 19.96 + 844.3 5.14798 -3.52147 19.692 + 844.4 5.13768 -3.51039 19.428 + 844.5 5.13768 -3.51039 19.161 + 844.6 5.12739 -3.49932 18.904 + 844.7 5.13768 -3.49932 18.637 + 844.8 5.12739 -3.49932 18.363 + 844.9 5.12739 -3.49932 18.099 + 845 5.11709 -3.48824 17.834 + 845.1 5.11709 -3.48824 17.579 + 845.2 5.10679 -3.48824 17.313 + 845.3 5.0965 -3.49932 17.047 + 845.4 5.0862 -3.49932 16.798 + 845.5 5.07591 -3.49932 16.526 + 845.6 5.06561 -3.49932 16.261 + 845.7 5.05531 -3.51039 16.015 + 845.8 5.04502 -3.51039 15.746 + 845.9 5.04502 -3.51039 15.493 + 846 5.03472 -3.49932 15.252 + 846.1 5.03472 -3.49932 14.992 + 846.2 5.02443 -3.49932 14.737 + 846.3 5.02443 -3.49932 14.474 + 846.4 5.01413 -3.48824 14.211 + 846.5 5.00383 -3.48824 13.978 + 846.6 4.99354 -3.48824 13.733 + 846.7 4.99354 -3.47717 13.53 + 846.8 4.99354 -3.47717 13.36 + 846.9 4.97294 -3.47717 13.189 + 847 4.95235 -3.47717 13.071 + 847.1 4.94206 -3.47717 12.99 + 847.2 4.94206 -3.47717 12.937 + 847.3 4.93176 -3.46609 12.886 + 847.4 4.92146 -3.46609 12.862 + 847.5 4.91117 -3.46609 12.846 + 847.6 4.92146 -3.46609 12.849 + 847.7 4.93176 -3.45502 12.858 + 847.8 4.93176 -3.44395 12.874 + 847.9 4.94206 -3.43287 12.886 + 848 4.95235 -3.4218 12.905 + 848.1 4.96265 -3.41073 12.929 + 848.2 4.97294 -3.41073 12.928 + 848.3 4.97294 -3.38858 12.943 + 848.4 4.98324 -3.38858 12.944 + 848.5 4.98324 -3.3775 12.955 + 848.6 4.99354 -3.36643 12.965 + 848.7 4.99354 -3.36643 12.953 + 848.8 5.00383 -3.35536 12.96 + 848.9 5.01413 -3.33321 12.969 + 849 5.01413 -3.29999 12.988 + 849.1 5.02442 -3.29999 12.995 + 849.2 5.01413 -3.29999 12.982 + 849.3 5.02442 -3.28891 12.969 + 849.4 5.03472 -3.28891 12.976 + 849.5 5.04502 -3.27784 12.966 + 849.6 5.04502 -3.27784 12.965 + 849.7 5.05531 -3.26677 12.969 + 849.8 5.06561 -3.25569 12.965 + 849.9 5.0759 -3.24462 12.972 + 850 5.0862 -3.24462 12.973 + 850.1 5.0862 -3.23354 12.97 + 850.2 5.0965 -3.2114 12.954 + 850.3 5.0965 -3.20032 12.975 + 850.4 5.0965 -3.18925 12.975 + 850.5 5.0965 -3.17818 12.972 + 850.6 5.0965 -3.1671 12.984 + 850.7 5.0965 -3.15603 12.974 + 850.8 5.0965 -3.14495 12.975 + 850.9 5.0965 -3.13388 12.974 + 851 5.0965 -3.11173 12.976 + 851.1 5.0965 -3.10066 12.978 + 851.2 5.0965 -3.08959 12.973 + 851.3 5.10679 -3.06744 12.973 + 851.4 5.0965 -3.05636 12.979 + 851.5 5.0862 -3.04529 12.975 + 851.6 5.0862 -3.04529 12.975 + 851.7 5.0862 -3.03422 12.986 + 851.8 5.06561 -3.03422 12.988 + 851.9 5.05531 -3.04529 12.989 + 852 5.03472 -3.04529 12.985 + 852.1 4.99354 -3.06744 12.998 + 852.2 4.95235 -3.07851 13 + 852.3 4.90087 -3.08959 12.997 + 852.4 4.8288 -3.12281 13.005 + 852.5 4.74643 -3.15603 12.993 + 852.6 4.64347 -3.20032 13.003 + 852.7 4.53022 -3.24462 13.002 + 852.8 4.39637 -3.28891 13.01 + 852.9 4.24193 -3.35536 13 + 853 4.0772 -3.41073 12.99 + 853.1 3.89187 -3.47717 12.988 + 853.2 3.68595 -3.55468 12.977 + 853.3 3.45944 -3.64327 12.969 + 853.4 3.21234 -3.72079 12.969 + 853.5 2.95494 -3.82046 12.973 + 853.6 2.67695 -3.92012 12.969 + 853.7 2.38866 -4.03086 12.966 + 853.8 2.09008 -4.1416 12.957 + 853.9 1.7812 -4.26341 12.955 + 854 1.46203 -4.38522 12.956 + 854.1 1.13255 -4.50703 12.952 + 854.2 0.792788 -4.62884 12.953 + 854.3 0.473614 -4.76173 12.947 + 854.4 0.195623 -4.86139 12.897 + 854.5 -0.0720717 -4.96106 12.842 + 854.6 -0.319174 -5.03857 12.838 + 854.7 -0.525094 -5.11609 12.816 + 854.8 -0.689829 -5.17146 12.846 + 854.9 -0.833972 -5.21575 12.881 + 855 -0.947228 -5.24897 12.887 + 855.1 -1.03989 -5.27112 12.873 + 855.2 -1.11196 -5.29327 12.877 + 855.3 -1.18403 -5.29327 12.876 + 855.4 -1.24581 -5.29327 12.872 + 855.5 -1.30759 -5.2822 12.878 + 855.6 -1.35907 -5.24897 12.887 + 855.7 -1.41055 -5.21575 12.881 + 855.8 -1.46203 -5.16038 12.889 + 855.9 -1.5135 -5.08287 12.892 + 856 -1.56498 -4.99428 12.9 + 856.1 -1.62676 -4.88354 12.909 + 856.2 -1.68854 -4.76173 12.916 + 856.3 -1.75031 -4.61777 12.921 + 856.4 -1.82238 -4.46274 12.923 + 856.5 -1.88416 -4.28555 12.916 + 856.6 -1.96653 -4.0973 12.925 + 856.7 -2.04889 -3.89797 12.925 + 856.8 -2.13126 -3.66542 12.93 + 856.9 -2.22393 -3.43287 12.923 + 857 -2.32688 -3.18925 12.92 + 857.1 -2.42984 -2.92348 12.922 + 857.2 -2.5431 -2.63556 12.941 + 857.3 -2.65636 -2.33657 12.923 + 857.4 -2.77991 -2.0265 12.929 + 857.5 -2.92405 -1.69429 12.919 + 857.6 -3.0579 -1.36208 12.932 + 857.7 -3.21234 -1.00771 12.933 + 857.8 -3.35648 -0.653353 12.927 + 857.9 -3.51092 -0.287918 12.936 + 858 -3.65506 0.0775169 12.929 + 858.1 -3.8095 0.454026 12.924 + 858.2 -3.96394 0.841608 12.935 + 858.3 -4.11838 1.22919 12.925 + 858.4 -4.26252 1.61677 12.931 + 858.5 -4.42726 2.01543 12.932 + 858.6 -4.5714 2.42516 12.921 + 858.7 -4.73614 2.82382 12.926 + 858.8 -4.89057 3.23355 12.921 + 858.9 -5.05531 3.64328 12.91 + 859 -5.20975 4.07515 12.901 + 859.1 -5.38478 4.49596 12.916 + 859.2 -5.55981 4.93891 12.904 + 859.3 -5.72455 5.37079 12.892 + 859.4 -5.89958 5.82481 12.895 + 859.5 -6.07461 6.26776 12.891 + 859.6 -6.24964 6.72179 12.884 + 859.7 -6.42467 7.17581 12.892 + 859.8 -6.5997 7.64091 12.881 + 859.9 -6.76443 8.08386 12.889 + 860 -6.91887 8.49359 12.873 + 860.1 -7.04242 8.85903 12.854 + 860.2 -7.18657 9.22446 12.835 + 860.3 -7.32041 9.53453 12.855 + 860.4 -7.42337 9.78923 12.844 + 860.5 -7.52633 9.99963 12.872 + 860.6 -7.619 10.199 12.871 + 860.7 -7.68077 10.354 12.861 + 860.8 -7.74255 10.4537 12.841 + 860.9 -7.77344 10.5201 12.812 + 861 -7.80432 10.5644 12.798 + 861.1 -7.81462 10.5865 12.795 + 861.2 -7.81462 10.5865 12.784 + 861.3 -7.81462 10.5644 12.763 + 861.4 -7.79403 10.498 12.75 + 861.5 -7.75284 10.4204 12.741 + 861.6 -7.70136 10.3097 12.729 + 861.7 -7.66018 10.1879 12.734 + 861.8 -7.58811 10.0329 12.744 + 861.9 -7.51604 9.87782 12.749 + 862 -7.43367 9.70064 12.764 + 862.1 -7.3513 9.52346 12.755 + 862.2 -7.25864 9.32413 12.734 + 862.3 -7.16598 9.1248 12.69 + 862.4 -7.08361 8.9144 12.625 + 862.5 -6.98065 8.704 12.541 + 862.6 -6.88798 8.48252 12.454 + 862.7 -6.79532 8.26104 12.36 + 862.8 -6.69236 8.02849 12.271 + 862.9 -6.60999 7.80702 12.195 + 863 -6.52763 7.57447 12.13 + 863.1 -6.42467 7.34192 12.063 + 863.2 -6.332 7.12044 12.02 + 863.3 -6.25993 6.88789 12.009 + 863.4 -6.17757 6.66642 11.998 + 863.5 -6.10549 6.44494 11.983 + 863.6 -6.03342 6.22347 11.981 + 863.7 -5.96135 6.02414 11.977 + 863.8 -5.90987 5.81374 11.975 + 863.9 -5.85839 5.62548 11.982 + 864 -5.80691 5.42616 11.992 + 864.1 -5.75543 5.2379 11.991 + 864.2 -5.71425 5.04965 12.006 + 864.3 -5.67306 4.85032 12.015 + 864.4 -5.63188 4.67314 11.999 + 864.5 -5.5804 4.47381 12.009 + 864.6 -5.53922 4.27448 11.993 + 864.7 -5.48774 4.07515 12.002 + 864.8 -5.44655 3.86475 11.983 + 864.9 -5.38478 3.65435 11.975 + 865 -5.3333 3.43287 11.974 + 865.1 -5.28182 3.20032 11.956 + 865.2 -5.20975 2.96777 11.958 + 865.3 -5.14797 2.73523 11.947 + 865.4 -5.0862 2.4916 11.945 + 865.5 -5.00383 2.24798 11.94 + 865.6 -4.93176 1.99328 11.936 + 865.7 -4.85969 1.72751 11.93 + 865.8 -4.76702 1.47281 11.932 + 865.9 -4.67436 1.19597 11.926 + 866 -4.59199 0.919125 11.922 + 866.1 -4.48903 0.631206 11.921 + 866.2 -4.39637 0.354362 11.924 + 866.3 -4.29341 0.0442957 11.9 + 866.4 -4.18015 -0.243623 11.91 + 866.5 -4.07719 -0.553689 11.907 + 866.6 -3.96394 -0.863755 11.904 + 866.7 -3.85068 -1.17382 11.888 + 866.8 -3.72713 -1.48389 11.881 + 866.9 -3.59329 -1.79395 11.864 + 867 -3.45944 -2.11509 11.875 + 867.1 -3.32559 -2.42516 11.863 + 867.2 -3.17115 -2.7463 11.863 + 867.3 -3.01671 -3.06744 11.869 + 867.4 -2.87257 -3.3775 11.862 + 867.5 -2.71813 -3.69864 11.856 + 867.6 -2.5534 -4.01978 11.852 + 867.7 -2.39896 -4.34092 11.845 + 867.8 -2.24452 -4.66206 11.839 + 867.9 -2.09008 -4.9832 11.836 + 868 -1.93564 -5.30434 11.832 + 868.1 -1.7812 -5.62548 11.839 + 868.2 -1.62676 -5.94662 11.829 + 868.3 -1.47232 -6.26776 11.83 + 868.4 -1.31788 -6.5889 11.823 + 868.5 -1.16344 -6.89897 11.824 + 868.6 -1.0193 -7.20903 11.826 + 868.7 -0.86486 -7.5191 11.834 + 868.8 -0.710421 -7.82916 11.813 + 868.9 -0.576573 -8.11708 11.822 + 869 -0.453022 -8.37178 11.803 + 869.1 -0.350062 -8.60433 11.788 + 869.2 -0.236807 -8.83688 11.821 + 869.3 -0.123551 -9.05835 11.811 + 869.4 -0.0205919 -9.25768 11.802 + 869.5 0.0617757 -9.43486 11.801 + 869.6 0.144143 -9.57882 11.793 + 869.7 0.216215 -9.73386 11.795 + 869.8 0.288287 -9.89996 11.801 + 869.9 0.370654 -10.0661 11.792 + 870 0.453022 -10.2211 11.784 + 870.1 0.525094 -10.3872 11.791 + 870.2 0.597165 -10.5422 11.786 + 870.3 0.669237 -10.7083 11.783 + 870.4 0.741309 -10.8634 11.787 + 870.5 0.823676 -11.0295 11.776 + 870.6 0.895748 -11.1845 11.779 + 870.7 0.96782 -11.3506 11.78 + 870.8 1.05019 -11.5167 11.78 + 870.9 1.11196 -11.6718 11.781 + 871 1.16344 -11.7936 11.76 + 871.1 1.21492 -11.9043 11.758 + 871.2 1.2664 -12.0261 11.764 + 871.3 1.31788 -12.1258 11.77 + 871.4 1.34877 -12.2033 11.746 + 871.5 1.35907 -12.2476 11.756 + 871.6 1.36936 -12.2698 11.751 + 871.7 1.36936 -12.2808 11.749 + 871.8 1.35907 -12.2698 11.739 + 871.9 1.32818 -12.2365 11.733 + 872 1.29729 -12.1812 11.725 + 872.1 1.24581 -12.0926 11.72 + 872.2 1.18403 -11.9818 11.727 + 872.3 1.11196 -11.86 11.714 + 872.4 1.0296 -11.705 11.719 + 872.5 0.936932 -11.5278 11.711 + 872.6 0.833972 -11.3396 11.711 + 872.7 0.731013 -11.1292 11.717 + 872.8 0.607461 -10.9077 11.714 + 872.9 0.473614 -10.653 11.713 + 873 0.339766 -10.3983 11.714 + 873.1 0.185327 -10.1104 11.714 + 873.2 0.0308879 -9.82245 11.716 + 873.3 -0.133847 -9.51238 11.715 + 873.4 -0.308879 -9.19124 11.702 + 873.5 -0.48391 -8.85903 11.711 + 873.6 -0.679533 -8.51574 11.694 + 873.7 -0.875156 -8.1503 11.699 + 873.8 -1.09137 -7.78487 11.692 + 873.9 -1.28699 -7.39729 11.694 + 874 -1.50321 -6.99863 11.696 + 874.1 -1.71942 -6.5889 11.676 + 874.2 -1.94593 -6.15702 11.681 + 874.3 -2.17245 -5.71407 11.684 + 874.4 -2.39896 -5.26005 11.688 + 874.5 -2.63576 -4.79495 11.675 + 874.6 -2.87257 -4.3077 11.669 + 874.7 -3.12997 -3.82045 11.682 + 874.8 -3.37707 -3.31106 11.683 + 874.9 -3.63447 -2.81274 11.684 + 875 -3.89187 -2.2812 11.677 + 875.1 -4.15956 -1.74966 11.673 + 875.2 -4.42726 -1.20704 11.672 + 875.3 -4.70525 -0.653352 11.676 + 875.4 -4.98324 -0.0885895 11.689 + 875.5 -5.27152 0.476174 11.675 + 875.6 -5.55981 1.05201 11.661 + 875.7 -5.85839 1.63892 11.669 + 875.8 -6.14668 2.22583 11.67 + 875.9 -6.44526 2.82382 11.667 + 876 -6.74384 3.43287 11.656 + 876.1 -7.04243 4.04193 11.669 + 876.2 -7.3513 4.65099 11.672 + 876.3 -7.67048 5.27112 11.673 + 876.4 -7.97936 5.89125 11.669 + 876.5 -8.28823 6.51139 11.655 + 876.6 -8.59711 7.14259 11.659 + 876.7 -8.92658 7.7738 11.673 + 876.8 -9.24575 8.41608 11.657 + 876.9 -9.56493 9.04728 11.659 + 877 -9.8944 9.70064 11.652 + 877.1 -10.2136 10.3429 11.662 + 877.2 -10.543 10.9963 11.653 + 877.3 -10.8725 11.6385 11.674 + 877.4 -11.202 12.303 11.668 + 877.5 -11.5314 12.9674 11.673 + 877.6 -11.8609 13.6208 11.661 + 877.7 -12.1904 14.2852 11.676 + 877.8 -12.5199 14.9496 11.68 + 877.9 -12.839 15.603 11.678 + 878 -13.1685 16.2674 11.677 + 878.1 -13.4877 16.9097 11.681 + 878.2 -13.8068 17.552 11.687 + 878.3 -14.1157 18.1942 11.693 + 878.4 -14.3937 18.7701 11.689 + 878.5 -14.6511 19.3016 11.649 + 878.6 -14.9188 19.8442 11.655 + 878.7 -15.1556 20.3204 11.6809 + 878.8 -15.3718 20.7412 11.6939 + 878.9 -15.5469 21.1177 11.7249 + 879 -15.7116 21.4389 11.7299 + 879.1 -15.8557 21.7157 11.7169 + 879.2 -15.969 21.9593 11.7129 + 879.3 -16.0719 22.1586 11.7069 + 879.4 -16.1543 22.3137 11.6739 + 879.5 -16.2264 22.4355 11.6599 + 879.6 -16.2676 22.5241 11.6389 + 879.7 -16.2985 22.5573 11.6089 + 879.8 -16.3191 22.5795 11.5749 + 879.9 -16.3293 22.5573 11.5619 + 880 -16.3088 22.513 11.5079 + 880.1 -16.2779 22.4466 11.4739 + 880.2 -16.2367 22.358 11.4449 + 880.3 -16.1749 22.2362 11.4269 + 880.4 -16.1131 22.0922 11.4239 + 880.5 -16.0308 21.9261 11.4209 + 880.6 -15.9278 21.7489 11.4179 + 880.7 -15.8248 21.5607 11.3999 + 880.8 -15.7116 21.3503 11.4219 + 880.9 -15.5983 21.1288 11.4139 + 881 -15.4748 20.8962 11.4209 + 881.1 -15.3409 20.6526 11.4209 + 881.2 -15.1968 20.3979 11.4139 + 881.3 -15.0527 20.1432 11.426 + 881.4 -14.9085 19.8664 11.418 + 881.5 -14.7541 19.5895 11.427 + 881.6 -14.5893 19.3016 11.415 + 881.7 -14.4246 19.0026 11.416 + 881.8 -14.2599 18.7036 11.416 + 881.9 -14.0951 18.3825 11.417 + 882 -13.9304 18.0724 11.414 + 882.1 -13.7451 17.7513 11.414 + 882.2 -13.57 17.408 11.411 + 882.3 -13.395 17.0758 11.407 + 882.4 -13.2097 16.7325 11.395 + 882.5 -13.0347 16.3892 11.395 + 882.6 -12.8493 16.057 11.405 + 882.7 -12.664 15.7026 11.411 + 882.8 -12.489 15.3593 11.394 + 882.9 -12.3036 15.0271 11.399 + 883 -12.1286 14.6838 11.406 + 883.1 -11.9433 14.3516 11.394 + 883.2 -11.7683 14.0194 11.394 + 883.3 -11.5829 13.6983 11.391 + 883.4 -11.3976 13.3771 11.391 + 883.5 -11.2226 13.056 11.404 + 883.6 -11.0475 12.7459 11.463 + 883.7 -10.8519 12.4359 11.51 + 883.8 -10.6563 12.1479 11.601 + 883.9 -10.4813 11.849 11.683 + 884 -10.2959 11.55 11.758 + 884.1 -10.1209 11.2731 11.823 + 884.2 -9.93558 10.9963 11.871 + 884.3 -9.76055 10.7084 11.921 + 884.4 -9.58552 10.4315 11.954 + 884.5 -9.41049 10.1657 11.968 + 884.6 -9.23546 9.89997 11.978 + 884.7 -9.07072 9.64527 11.987 + 884.8 -8.91628 9.39057 12.02 + 884.9 -8.75155 9.1248 12.064 + 885 -8.59711 8.88118 12.14 + 885.1 -8.44267 8.63755 12.226 + 885.2 -8.29853 8.39393 12.367 + 885.3 -8.16468 8.16138 12.537 + 885.4 -8.02054 7.92883 12.739 + 885.5 -7.88669 7.69628 12.991 + 885.6 -7.75285 7.48588 13.272 + 885.7 -7.6087 7.26441 13.581 + 885.8 -7.48515 7.054 13.926 + 885.9 -7.3616 6.85468 14.272 + 886 -7.22775 6.65535 14.66 + 886.1 -7.1145 6.45602 15.037 + 886.2 -6.99095 6.25669 15.437 + 886.3 -6.87769 6.06844 15.806 + 886.4 -6.76444 5.88018 16.176 + 886.5 -6.65118 5.69193 16.51 + 886.6 -6.52763 5.50368 16.82 + 886.7 -6.41438 5.31542 17.103 + 886.8 -6.30112 5.11609 17.351 + 886.9 -6.18787 4.92784 17.571 + 887 -6.07461 4.73958 17.73 + 887.1 -5.96136 4.54026 17.873 + 887.2 -5.83781 4.34093 17.957 + 887.3 -5.73485 4.1416 18.035 + 887.4 -5.61129 3.94227 18.065 + 887.5 -5.48774 3.73187 18.08 + 887.6 -5.3539 3.52147 18.088 + 887.7 -5.23034 3.29999 18.082 + 887.8 -5.0965 3.07852 18.072 + 887.9 -4.96265 2.83489 18.055 + 888 -4.81851 2.59127 18.04 + 888.1 -4.66407 2.34765 18.013 + 888.2 -4.50963 2.0708 18.007 + 888.3 -4.34489 1.79396 17.994 + 888.4 -4.16986 1.49496 17.976 + 888.5 -3.99483 1.1849 17.977 + 888.6 -3.8095 0.863756 17.976 + 888.7 -3.61388 0.520469 17.973 + 888.9 -3.19175 -0.188254 18.004 + 889 -2.97553 -0.575837 18.004 + 889.1 -2.73872 -0.96342 18.011 + 889.2 -2.49162 -1.36208 18.014 + 889.3 -2.24452 -1.77181 18.025 + 889.4 -1.98712 -2.19261 18.032 + 889.5 -1.72972 -2.62449 18.03 + 889.6 -1.45173 -3.06744 18.029 + 889.7 -1.18404 -3.52147 18.045 + 889.8 -0.906044 -3.97549 18.049 + 889.9 -0.617758 -4.44059 18.05 + 890 -0.339767 -4.90569 18.053 + 890.1 -0.0411838 -5.38186 18.055 + 890.2 0.257399 -5.85804 18.06 + 890.3 0.545686 -6.33421 18.066 + 890.4 0.844269 -6.82146 18.065 + 890.5 1.14285 -7.29763 18.062 + 890.6 1.43114 -7.7738 18.076 + 890.7 1.71943 -8.24998 18.077 + 890.8 2.00771 -8.71508 18.067 + 890.9 2.3063 -9.19125 18.09 + 891 2.58429 -9.65635 18.09 + 891.1 2.87257 -10.1214 18.091 + 891.2 3.15056 -10.5865 18.1 + 891.3 3.42856 -11.0406 18.104 + 891.4 3.71684 -11.4946 18.114 + 891.5 3.99483 -11.9597 18.121 + 891.6 4.27283 -12.4137 18.119 + 891.7 4.56111 -12.8677 18.129 + 891.8 4.82881 -13.3107 18.135 + 891.9 5.0965 -13.7537 18.141 + 892 5.33331 -14.1523 18.127 + 892.1 5.55982 -14.5177 18.105 + 892.2 5.77604 -14.8721 18.131 + 892.3 5.97166 -15.1932 18.119 + 892.4 6.1364 -15.459 18.124 + 892.5 6.27024 -15.6694 18.13 + 892.6 6.3835 -15.8577 18.163 + 892.7 6.47616 -16.0238 18.181 + 892.8 6.56883 -16.1677 18.178 + 892.9 6.65119 -16.2895 18.187 + 893 6.71297 -16.3892 18.202 + 893.1 6.76445 -16.4778 18.205 + 893.2 6.81593 -16.5664 18.21 + 893.3 6.86741 -16.6439 18.22 + 893.4 6.91889 -16.7214 18.215 + 893.5 6.94978 -16.7879 18.208 + 893.6 6.98067 -16.8432 18.204 + 893.7 7.01155 -16.8986 18.214 + 893.8 7.04244 -16.9429 18.205 + 893.9 7.06303 -16.9761 18.204 + 894 7.07333 -17.0093 18.189 + 894.1 7.07333 -17.0093 18.186 + 894.2 7.07333 -17.0093 18.197 + 894.3 7.06303 -16.9983 18.196 + 894.4 7.04244 -16.9761 18.187 + 894.5 7.02185 -16.9429 18.192 + 894.6 6.99096 -16.8986 18.195 + 894.7 6.94978 -16.8432 18.189 + 894.8 6.90859 -16.7768 18.194 + 894.9 6.84682 -16.6882 18.199 + 895 6.78504 -16.5885 18.206 + 895.1 6.71297 -16.4778 18.206 + 895.2 6.6409 -16.356 18.198 + 895.3 6.55853 -16.2231 18.207 + 895.4 6.47616 -16.0791 18.2 + 895.5 6.3732 -15.9241 18.211 + 895.6 6.25995 -15.758 18.213 + 895.7 6.15699 -15.5808 18.204 + 895.8 6.04373 -15.4036 18.209 + 895.9 5.90988 -15.2154 18.215 + 896 5.79663 -15.0161 18.217 + 896.1 5.67308 -14.8057 18.219 + 896.2 5.52893 -14.5953 18.219 + 896.3 5.39509 -14.3738 18.214 + 896.4 5.25094 -14.1523 18.214 + 896.5 5.0965 -13.9198 18.215 + 896.6 4.94206 -13.6761 18.225 + 896.7 4.77733 -13.4104 18.216 + 896.8 4.61259 -13.1557 18.219 + 896.9 4.43756 -12.8788 18.208 + 897 4.25223 -12.5909 18.216 + 897.1 4.06691 -12.2919 18.226 + 897.2 3.88158 -11.9929 18.227 + 897.3 3.68596 -11.6718 18.217 + 897.4 3.48004 -11.3506 18.22 + 897.5 3.27412 -11.0074 18.226 + 897.6 3.0579 -10.6641 18.227 + 897.7 2.84169 -10.3097 18.245 + 897.8 2.61517 -9.94427 18.225 + 897.9 2.37837 -9.56776 18.239 + 898 2.14156 -9.18018 18.249 + 898.1 1.90475 -8.78152 18.231 + 898.2 1.65765 -8.38286 18.234 + 898.3 1.38995 -7.95098 18.246 + 898.4 1.13256 -7.53018 18.252 + 898.5 0.864861 -7.08723 18.241 + 898.6 0.58687 -6.62213 18.251 + 898.7 0.298583 -6.14596 18.249 + 898.8 0.010296 -5.66978 18.247 + 898.9 -0.288287 -5.17146 18.259 + 899 -0.58687 -4.66207 18.269 + 899.1 -0.895748 -4.1416 18.261 + 899.2 -1.22522 -3.61006 18.265 + 899.3 -1.55469 -3.06744 18.272 + 899.4 -1.88416 -2.50268 18.264 + 899.5 -2.22393 -1.93791 18.283 + 899.6 -2.57399 -1.351 18.281 + 899.7 -2.92405 -0.753018 18.282 + 899.8 -3.29471 -0.143959 18.287 + 899.9 -3.66536 0.4651 18.295 + 900 -4.04631 1.09631 18.28 + 900.1 -4.42726 1.73859 18.283 + 900.2 -4.81851 2.38087 18.284 + 900.3 -5.22005 3.04529 18.303 + 900.4 -5.63189 3.7208 18.309 + 900.5 -6.04372 4.3963 18.314 + 900.6 -6.46586 5.09395 18.31 + 900.7 -6.88799 5.7916 18.321 + 900.8 -7.32042 6.51139 18.325 + 900.9 -7.75285 7.23119 18.338 + 901 -8.19558 7.96206 18.336 + 901.1 -8.6486 8.71508 18.352 + 901.2 -9.10162 9.45702 18.348 + 901.3 -9.56494 10.2211 18.349 + 901.4 -10.0386 10.9852 18.358 + 901.5 -10.5019 11.7493 18.361 + 901.6 -10.9858 12.5355 18.356 + 901.7 -11.4594 13.3329 18.374 + 901.8 -11.933 14.1191 18.376 + 901.9 -12.4169 14.9275 18.377 + 902 -12.9008 15.7359 18.373 + 902.1 -13.3847 16.5443 18.4 + 902.2 -13.8789 17.3637 18.402 + 902.3 -14.3628 18.1721 18.41 + 902.4 -14.857 18.9916 18.411 + 902.5 -15.341 19.811 18.424 + 902.6 -15.8455 20.6416 18.4149 + 902.7 -16.3294 21.4721 18.4299 + 902.8 -16.8236 22.2805 18.4449 + 902.9 -17.3178 23.0889 18.4499 + 903 -17.812 23.9083 18.4429 + 903.1 -18.2959 24.7278 18.4499 + 903.2 -18.7901 25.5362 18.4679 + 903.3 -19.274 26.3556 18.4689 + 903.4 -19.7579 27.164 18.4779 + 903.5 -20.2418 27.9835 18.4899 + 903.6 -20.736 28.7919 18.5099 + 903.7 -21.2096 29.6003 18.4989 + 903.8 -21.6935 30.4087 18.5179 + 903.9 -22.1774 31.217 18.5189 + 904 -22.6614 32.0365 18.5339 + 904.1 -23.1453 32.8338 18.5349 + 904.2 -23.6189 33.6422 18.5429 + 904.3 -24.1028 34.4395 18.5369 + 904.4 -24.5867 35.2479 18.5449 + 904.5 -25.0603 36.0452 18.5638 + 904.6 -25.5339 36.8425 18.5558 + 904.7 -26.0178 37.6399 18.5728 + 904.8 -26.4914 38.4372 18.5778 + 904.9 -26.965 39.2234 18.5938 + 905 -27.4284 40.0207 18.5908 + 905.1 -27.8917 40.7959 18.5978 + 905.2 -28.3653 41.5821 18.6188 + 905.3 -28.8286 42.3573 18.6208 + 905.4 -29.2919 43.1325 18.6158 + 905.5 -29.7449 43.8966 18.6268 + 905.6 -30.198 44.6606 18.6208 + 905.7 -30.651 45.4247 18.6268 + 905.8 -31.104 46.1778 18.6388 + 905.9 -31.5467 46.9197 18.6387 + 906 -31.9894 47.6616 18.6327 + 906.1 -32.4322 48.4036 18.6327 + 906.2 -32.8749 49.1345 18.6377 + 906.3 -33.3073 49.8543 18.6577 + 906.4 -33.7397 50.5741 18.6477 + 906.5 -34.1722 51.3049 18.6617 + 906.6 -34.6149 52.0247 18.6647 + 906.7 -35.0473 52.7445 18.6667 + 906.8 -35.4797 53.4643 18.6847 + 906.9 -35.9122 54.1841 18.6837 + 907 -36.3446 54.9039 18.6967 + 907.1 -36.777 55.6126 18.7017 + 907.2 -37.1992 56.3214 18.7066 + 907.3 -37.6007 57.0079 18.7286 + 907.4 -37.9713 57.6281 18.7226 + 907.5 -38.3317 58.2482 18.7376 + 907.6 -38.6715 58.8019 18.8326 + 907.7 -38.9701 59.2892 18.9316 + 907.8 -39.2274 59.6878 19.0656 + 907.9 -39.4437 60.02 19.2316 + 908 -39.629 60.2969 19.4386 + 908.1 -39.7731 60.5294 19.6866 + 908.2 -39.9173 60.7177 19.9306 + 908.3 -40.0202 60.8727 20.2366 + 908.4 -40.1129 60.9945 20.5566 + 908.5 -40.1747 61.1053 20.9246 + 908.6 -40.2468 61.2049 21.3006 + 908.7 -40.2982 61.2935 21.7056 + 908.8 -40.3394 61.3711 22.1076 + 908.9 -40.3806 61.4264 22.5096 + 909 -40.4218 61.4818 22.9246 + 909.1 -40.4424 61.5261 23.3386 + 909.2 -40.4733 61.5815 23.7346 + 909.3 -40.4836 61.6147 24.1246 + 909.4 -40.4836 61.659 24.5076 + 909.5 -40.4733 61.7033 24.8546 + 909.6 -40.4527 61.7476 25.1856 + 909.7 -40.4218 61.7919 25.5026 + 909.8 -40.3703 61.8473 25.7866 + 909.9 -40.3086 61.9026 26.0476 + 910 -40.2262 61.958 26.2806 + 910.1 -40.1438 62.0355 26.4666 + 910.2 -40.0203 62.113 26.6176 + 910.3 -39.907 62.2016 26.7206 + 910.4 -39.7629 62.2902 26.7896 + 910.5 -39.5981 62.3899 26.8586 + 910.6 -39.4128 62.5006 26.8936 + 910.7 -39.2172 62.6224 26.9036 + 910.8 -38.9907 62.7553 26.9036 + 910.9 -38.7436 62.8993 26.8906 + 911 -38.4759 63.0543 26.8906 + 911.1 -38.1773 63.2204 26.8816 + 911.2 -37.8684 63.3865 26.8696 + 911.3 -37.5493 63.5748 26.8586 + 911.4 -37.1992 63.7741 26.8596 + 911.5 -36.8491 63.9734 26.8436 + 911.6 -36.4682 64.1838 26.8366 + 911.7 -36.0769 64.3942 26.8366 + 911.8 -35.6651 64.6268 26.8346 + 911.9 -35.2533 64.8593 26.8376 + 912 -34.8208 65.0919 26.8456 + 912.1 -34.3781 65.3466 26.8436 + 912.2 -33.9251 65.6013 26.8476 + 912.3 -33.4618 65.856 26.8446 + 912.4 -32.9881 66.1218 26.8706 + 912.5 -32.5042 66.3986 26.8616 + 912.6 -32.0203 66.6754 26.8796 + 912.7 -31.5158 66.9523 26.8856 + 912.8 -31.001 67.2402 26.8966 + 912.9 -30.4965 67.5281 26.9046 + 913 -29.9817 67.816 26.9056 + 913.1 -29.4669 68.115 26.9216 + 913.2 -28.9315 68.414 26.9286 + 913.3 -28.3962 68.7241 26.9266 + 913.4 -27.8608 69.0231 26.9276 + 913.5 -27.3254 69.3331 26.9336 + 913.6 -26.7797 69.6432 26.9316 + 913.7 -26.2237 69.9644 26.9466 + 913.8 -25.6677 70.2855 26.9476 + 913.9 -25.1118 70.6066 26.9506 + 914 -24.5455 70.9388 26.9556 + 914.1 -23.9792 71.26 26.9666 + 914.2 -23.4026 71.5922 26.9596 + 914.3 -22.8261 71.9244 26.9676 + 914.4 -22.2392 72.2677 26.9835 + 914.5 -21.6626 72.5999 26.9955 + 914.6 -21.0758 72.9543 27.0005 + 914.7 -20.4683 73.2976 27.0025 + 914.8 -19.8814 73.6409 27.0145 + 914.9 -19.274 74.0063 27.0185 + 915 -18.6665 74.3496 27.0325 + 915.1 -18.0693 74.715 27.0355 + 915.2 -17.4516 75.0694 27.0515 + 915.3 -16.8338 75.4348 27.0505 + 915.4 -16.2161 75.8002 27.0545 + 915.5 -15.5983 76.1657 27.0575 + 915.6 -14.9703 76.5422 27.0575 + 915.7 -14.3525 76.9076 27.0625 + 915.8 -13.7142 77.2841 27.0665 + 915.9 -13.0861 77.6606 27.0605 + 916 -12.4478 78.0482 27.0595 + 916.1 -11.8094 78.4247 27.0595 + 916.2 -11.1814 78.8012 27.0715 + 916.3 -10.543 79.1888 27.0705 + 916.4 -9.91497 79.5875 27.0655 + 916.5 -9.27662 79.9751 27.0635 + 916.6 -8.64857 80.3737 27.0725 + 916.7 -8.02052 80.7834 27.0785 + 916.8 -7.39247 81.1932 27.0765 + 916.9 -6.76442 81.6029 27.0755 + 917 -6.14666 82.0237 27.0845 + 917.1 -5.52891 82.4556 27.0885 + 917.2 -4.91115 82.8764 27.0975 + 917.3 -4.2934 83.3193 27.0885 + 917.4 -3.67564 83.7512 27.0894 + 917.5 -3.06818 84.1942 27.1034 + 917.6 -2.46072 84.6482 27.1154 + 917.7 -1.85326 85.0912 27.1214 + 917.8 -1.24581 85.5341 27.1314 + 917.9 -0.638347 85.9771 27.1384 + 918 -0.0308877 86.4311 27.1534 + 918.1 0.566275 86.874 27.1564 + 918.2 1.17373 87.3281 27.1674 + 918.3 1.79149 87.771 27.1524 + 918.4 2.39895 88.214 27.1654 + 918.5 3.00641 88.6569 27.1584 + 918.6 3.62416 89.0999 27.1544 + 918.7 4.23162 89.5539 27.1584 + 918.8 4.82878 89.9969 27.1594 + 918.9 5.44654 90.4398 27.1544 + 919 6.0437 90.8828 27.1593 + 919.1 6.65116 91.3257 27.1503 + 919.2 7.25862 91.7797 27.1663 + 919.3 7.85578 92.2227 27.1553 + 919.4 8.46324 92.6767 27.1483 + 919.5 9.0707 93.1197 27.1503 + 919.6 9.68845 93.5626 27.1373 + 919.7 10.2959 94.0056 27.1273 + 919.8 10.8931 94.4596 27.1253 + 919.9 11.5005 94.9026 27.1313 + 920 12.108 95.3455 27.1203 + 920.1 12.7257 95.7995 27.1133 + 920.2 13.3332 96.2425 27.1263 + 920.3 13.9407 96.6965 27.1172 + 920.4 14.5481 97.1395 27.1252 + 920.5 15.1556 97.5935 27.1292 + 920.6 15.763 98.0365 27.1282 + 920.7 16.3705 98.4905 27.1332 + 920.8 16.9779 98.9334 27.1402 + 920.9 17.5854 99.3985 27.1622 + 921 18.1929 99.8415 27.2172 + 921.1 18.8106 100.284 27.2822 + 921.2 19.4181 100.727 27.3922 + 921.3 20.0152 101.17 27.5302 + 921.4 20.6227 101.602 27.6972 + 921.5 21.2199 102.045 27.8921 + 921.6 21.8067 102.466 28.1451 + 921.7 22.3936 102.887 28.4231 + 921.8 22.9805 103.308 28.7321 + 921.9 23.557 103.728 29.0581 + 922 24.1233 104.138 29.4181 + 922.1 24.6896 104.559 29.7841 + 922.2 25.2456 104.969 30.1721 + 922.3 25.8015 105.367 30.5761 + 922.4 26.3472 105.777 30.9581 + 922.5 26.9032 106.176 31.3481 + 922.6 27.4386 106.586 31.734 + 922.7 27.974 106.973 32.108 + 922.8 28.4991 107.372 32.491 + 922.9 29.0345 107.759 32.859 + 923 29.5699 108.158 33.213 + 923.1 30.0846 108.546 33.571 + 923.2 30.6097 108.933 33.91 + 923.3 31.1245 109.31 34.247 + 923.4 31.6393 109.697 34.576 + 923.5 32.1541 110.085 34.906 + 923.6 32.6689 110.461 35.218 + 923.7 33.194 110.838 35.5209 + 923.8 33.7088 111.226 35.8259 + 923.9 34.2236 111.602 36.1229 + 924 34.7384 111.979 36.4079 + 924.1 35.2635 112.366 36.6929 + 924.2 35.7886 112.743 36.9689 + 924.3 36.3137 113.13 37.2429 + 924.4 36.8388 113.507 37.5249 + 924.5 37.3742 113.894 37.7829 + 924.6 37.9095 114.282 38.0309 + 924.7 38.4449 114.67 38.2808 + 924.8 38.9906 115.068 38.4848 + 924.9 39.5363 115.456 38.6758 + 925 40.082 115.854 38.8258 + 925.1 40.6277 116.253 39.0088 + 925.2 41.1837 116.641 39.1718 + 925.3 41.7396 117.05 39.3268 + 925.4 42.3059 117.46 39.4948 + 925.5 42.8722 117.859 39.6768 + 925.6 43.4385 118.269 39.8557 + 925.7 44.0047 118.678 40.0507 + 925.8 44.571 119.088 40.2477 + 925.9 45.1476 119.498 40.4447 + 926 45.7241 119.896 40.6457 + 926.1 46.3007 120.317 40.8337 + 926.2 46.8773 120.727 41.0067 + 926.3 47.4539 121.148 41.1637 + 926.4 48.0407 121.558 41.2927 + 926.5 48.6173 121.967 41.3846 + 926.6 49.2042 122.388 41.4576 + 926.7 49.791 122.798 41.5156 + 926.8 50.3779 123.208 41.5456 + 926.9 50.9648 123.628 41.5566 + 927 51.5516 124.049 41.5826 + 927.1 52.1488 124.47 41.6006 + 927.2 52.746 124.88 41.6236 + 927.3 53.3328 125.301 41.6455 + 927.4 53.9197 125.721 41.6465 + 927.5 54.5168 126.142 41.6625 + 927.6 55.114 126.563 41.6625 + 927.7 55.7009 126.984 41.6685 + 927.8 56.3083 127.394 41.6645 + 927.9 56.8952 127.814 41.6665 + 928 57.4924 128.235 41.6824 + 928.1 58.0895 128.656 41.7304 + 928.2 58.6867 129.077 41.7944 + 928.3 59.2838 129.498 41.8764 + 928.4 59.8604 129.918 41.9684 + 928.5 60.4576 130.339 42.0774 + 928.6 61.0547 130.76 42.1824 + 928.7 61.6416 131.17 42.3043 + 928.8 62.2182 131.591 42.4623 + 928.9 62.805 132 42.6323 + 929 63.3919 132.421 42.8223 + 929.1 63.9685 132.842 43.0173 + 929.2 64.545 133.252 43.2133 + 929.3 65.1216 133.661 43.4233 + 929.4 65.6982 134.071 43.6112 + 929.5 66.2645 134.481 43.8122 + 929.6 66.8307 134.88 43.9882 + 929.7 67.397 135.278 44.1662 + 929.8 67.9633 135.688 44.3302 + 929.9 68.5296 136.087 44.4852 + 930 69.0855 136.485 44.6162 + 930.1 69.6415 136.884 44.7691 + 930.2 70.1975 137.283 44.9161 + 930.3 70.7432 137.681 45.0621 + 930.4 71.2992 138.08 45.2111 + 930.5 71.8551 138.479 45.3311 + 930.6 72.3905 138.866 45.4451 + 930.7 72.9465 139.254 45.5201 + 930.8 73.4922 139.652 45.578 + 930.9 74.0276 140.04 45.626 + 931 74.5733 140.439 45.657 + 931.1 75.1189 140.837 45.678 + 931.2 75.6543 141.236 45.69 + 931.3 76.1897 141.624 45.7 + 931.4 76.7251 142.022 45.7029 + 931.5 77.2605 142.41 45.7079 + 931.6 77.7856 142.808 45.6979 + 931.7 78.3107 143.185 45.6989 + 931.8 78.846 143.55 45.6899 + 931.9 79.3711 143.905 45.6799 + 932 79.9065 144.237 45.6829 + 932.1 80.4522 144.547 45.6768 + 932.2 80.9979 144.824 45.6668 + 932.3 81.5436 145.079 45.6888 + 932.4 82.0995 145.311 45.6938 + 932.5 82.6658 145.511 45.6868 + 932.6 83.2218 145.688 45.7008 + 932.7 83.7881 145.832 45.6868 + 932.8 84.3646 145.953 45.6828 + 932.9 84.9309 146.053 45.6898 + 933 85.4972 146.12 45.6887 + 933.1 86.0635 146.164 45.6877 + 933.2 86.6297 146.197 45.7047 + 933.3 87.196 146.197 45.7087 + 933.4 87.7623 146.175 45.7047 + 933.5 88.3286 146.131 45.7057 + 933.6 88.8845 146.075 45.7007 + 933.7 89.4508 145.987 45.7077 + 933.8 89.9965 145.887 45.7027 + 933.9 90.5422 145.776 45.7107 + 934 91.0879 145.632 45.7157 + 934.1 91.6233 145.488 45.7297 + 934.2 92.1689 145.344 45.7277 + 934.3 92.7146 145.201 45.7177 + 934.4 93.25 145.034 45.7197 + 934.5 93.7854 144.879 45.7157 + 934.6 94.3311 144.724 45.6987 + 934.7 94.8768 144.569 45.7236 + 934.8 95.443 144.414 45.7206 + 934.9 95.9887 144.27 45.7256 + 935 96.555 144.126 45.7276 + 935.1 97.1316 143.982 45.7366 + 935.2 97.6978 143.838 45.7406 + 935.3 98.2744 143.683 45.7526 + 935.4 98.8613 143.539 45.7476 + 935.5 99.4482 143.396 45.7566 + 935.6 100.045 143.252 45.7476 + 935.7 100.642 143.108 45.7446 + 935.8 101.25 142.964 45.7536 + 935.9 101.847 142.82 45.7526 + 936 102.465 142.676 45.7576 + 936.1 103.083 142.532 45.7536 + 936.2 103.711 142.377 45.7616 + 936.3 104.318 142.233 45.7576 + 936.4 104.956 142.089 45.7655 + 936.5 105.585 141.934 45.7605 + 936.6 106.223 141.79 45.7615 + 936.7 106.861 141.635 45.7665 + 936.8 107.489 141.491 45.7745 + 936.9 108.138 141.336 45.7795 + 937 108.787 141.192 45.7855 + 937.1 109.435 141.026 45.7805 + 937.2 110.094 140.86 45.7915 + 937.3 110.743 140.683 45.7905 + 937.4 111.391 140.483 45.8035 + 937.5 112.04 140.284 45.8055 + 937.6 112.689 140.085 45.8065 + 937.7 113.337 139.885 45.8195 + 937.8 113.996 139.686 45.8144 + 937.9 114.655 139.453 45.7994 + 938 115.324 139.243 45.7824 + 938.1 115.983 139.033 45.7974 + 938.2 116.653 138.822 45.7904 + 938.3 117.332 138.623 45.7904 + 938.4 118.001 138.412 45.7944 + 938.5 118.691 138.213 45.7844 + 938.6 119.371 138.003 45.7864 + 938.7 120.05 137.792 45.7874 + 938.8 120.74 137.582 45.7844 + 938.9 121.43 137.383 45.7854 + 939 122.12 137.183 45.7903 + 939.1 122.81 136.973 45.7883 + 939.2 123.51 136.762 45.7913 + 939.3 124.21 136.552 45.7893 + 939.4 124.9 136.353 45.8023 + 939.5 125.61 136.142 45.7873 + 939.6 126.31 135.943 45.8033 + 939.7 127.021 135.733 45.8003 + 939.8 127.721 135.533 45.8043 + 939.9 128.431 135.323 45.8133 + 940 129.152 135.113 45.8053 + 940.1 129.862 134.913 45.8182 + 940.2 130.593 134.703 45.8152 + 940.3 131.314 134.492 45.8262 + 940.4 132.035 134.282 45.8232 + 940.5 132.766 134.072 45.8282 + 940.6 133.497 133.861 45.8282 + 940.7 134.218 133.651 45.8382 + 940.8 134.969 133.44 45.8382 + 940.9 135.7 133.23 45.8442 + 941 136.441 133.02 45.8391 + 941.1 137.172 132.798 45.8461 + 941.2 137.914 132.588 45.8521 + 941.3 138.665 132.366 45.8391 + 941.4 139.407 132.156 45.8301 + 941.5 140.138 131.945 45.8391 + 941.6 140.889 131.724 45.8321 + 941.7 141.631 131.48 45.8361 + 941.8 142.362 131.181 45.8141 + 941.9 143.072 130.905 45.825 + 942 143.772 130.595 45.847 + 942.1 144.441 130.262 45.867 + 942.2 145.1 129.897 45.881 + 942.3 145.759 129.543 45.886 + 942.4 146.408 129.166 45.871 + 942.5 147.046 128.767 45.857 + 942.6 147.674 128.38 45.848 + 942.7 148.313 127.981 45.85 + 942.8 148.961 127.594 45.844 + 942.9 149.61 127.206 45.852 + 943 150.259 126.818 45.853 + 943.1 150.918 126.442 45.869 + 943.2 151.566 126.054 45.8779 + 943.3 152.235 125.667 45.8799 + 943.4 152.884 125.279 45.8839 + 943.5 153.543 124.892 45.8849 + 943.6 154.202 124.504 45.8869 + 943.7 154.84 124.072 45.8899 + 943.8 155.468 123.629 45.8759 + 943.9 156.076 123.175 45.9049 + 944 156.642 122.71 45.9149 + 944.1 157.208 122.223 45.9359 + 944.2 157.795 121.758 45.9489 + 944.3 158.362 121.282 45.9119 + 944.4 158.907 120.772 45.9039 + 944.5 159.463 120.252 45.9049 + 944.6 160.019 119.764 45.9129 + 944.7 160.585 119.277 45.9139 + 944.8 161.162 118.79 45.9239 + 944.9 161.739 118.303 45.9238 + 945 162.315 117.804 45.9388 + 945.1 162.912 117.317 45.9388 + 945.2 163.499 116.819 45.9518 + 945.3 164.076 116.321 45.9588 + 945.4 164.663 115.822 45.9578 + 945.5 165.26 115.335 45.9628 + 945.6 165.847 114.837 45.9728 + 945.7 166.444 114.338 45.9798 + 945.8 167.041 113.851 45.9848 + 945.9 167.638 113.353 45.9738 + 946 168.235 112.854 45.9778 + 946.1 168.833 112.356 45.9778 + 946.2 169.43 111.847 45.9738 + 946.3 170.017 111.326 45.9738 + 946.4 170.593 110.784 45.9578 + 946.5 171.16 110.23 45.9707 + 946.6 171.705 109.676 45.9787 + 946.7 172.23 109.112 45.9957 + 946.8 172.725 108.525 45.9987 + 946.9 173.219 107.938 45.9997 + 947 173.692 107.34 45.9987 + 947.1 174.176 106.742 45.9937 + 947.2 174.64 106.133 45.9777 + 947.3 175.103 105.524 45.9617 + 947.4 175.566 104.926 45.9617 + 947.5 176.04 104.317 45.9587 + 947.6 176.513 103.708 45.9647 + 947.7 177.008 103.098 45.9717 + 947.8 177.492 102.501 45.9707 + 947.9 177.986 101.891 45.9697 + 948 178.47 101.282 45.9627 + 948.1 178.974 100.673 45.9607 + 948.2 179.458 100.064 45.9607 + 948.3 179.963 99.4552 45.9727 + 948.4 180.457 98.8462 45.9667 + 948.5 180.961 98.2371 45.9757 + 948.6 181.466 97.6391 45.9727 + 948.7 181.97 97.019 45.9617 + 948.8 182.475 96.41 45.9757 + 948.9 182.979 95.8009 45.9737 + 949 183.484 95.1918 45.9776 + 949.1 183.999 94.5717 45.9766 + 949.2 184.503 93.9737 45.9806 + 949.3 185.018 93.3536 45.9816 + 949.4 185.523 92.7446 45.9856 + 949.5 186.037 92.1244 45.9836 + 949.6 186.542 91.5264 45.9906 + 949.7 187.057 90.9063 45.9966 + 949.8 187.571 90.2862 45.9886 + 949.9 188.076 89.6661 45.9936 + 950 188.57 89.0349 45.9956 + 950.1 189.075 88.4147 46.0006 + 950.2 189.569 87.7835 46.0066 + 950.3 190.053 87.1523 46.0126 + 950.4 190.537 86.51 46.0236 + 950.5 191.01 85.8456 46.0306 + 950.6 191.474 85.2033 46.0276 + 950.7 191.937 84.5389 46.0256 + 950.8 192.39 83.8745 46.0245 + 950.9 192.822 83.2101 46.0245 + 951 193.255 82.5346 46.0275 + 951.1 193.698 81.848 46.0295 + 951.2 194.12 81.1614 46.0295 + 951.3 194.542 80.4638 46.0275 + 951.4 194.954 79.7772 46.0235 + 951.5 195.366 79.0685 46.0135 + 951.6 195.767 78.3708 46.0275 + 951.7 196.158 77.6621 46.0325 + 951.8 196.55 76.9423 46.0235 + 951.9 196.941 76.2225 46.0265 + 952 197.312 75.5027 46.0335 + 952.1 197.672 74.7719 46.0385 + 952.2 198.022 74.041 46.0365 + 952.3 198.362 73.299 46.0395 + 952.4 198.691 72.5571 46.0465 + 952.5 199.01 71.8152 46.0375 + 952.6 199.319 71.0621 46.0475 + 952.7 199.618 70.3091 46.0565 + 952.8 199.886 69.534 46.0515 + 952.9 200.153 68.7699 46.0485 + 953 200.39 67.9947 46.0415 + 953.1 200.637 67.2085 46.0585 + 953.2 200.843 66.4333 46.0615 + 953.3 201.039 65.636 46.0525 + 953.4 201.224 64.8497 46.0685 + 953.5 201.399 64.0524 46.0595 + 953.6 201.554 63.244 46.0615 + 953.7 201.688 62.4467 46.0625 + 953.8 201.821 61.6383 46.0645 + 953.9 201.935 60.8299 46.0665 + 954 202.038 60.0216 46.0635 + 954.1 202.13 59.2021 46.0625 + 954.2 202.192 58.3937 46.0565 + 954.3 202.254 57.5853 46.0645 + 954.4 202.305 56.7658 46.0645 + 954.5 202.336 55.9575 46.0675 + 954.6 202.357 55.1491 46.0736 + 954.7 202.367 54.3296 46.0596 + 954.8 202.357 53.5101 46.0586 + 954.9 202.347 52.7017 46.0596 + 955 202.316 51.8823 46.0566 + 955.1 202.285 51.0739 46.0536 + 955.2 202.244 50.2544 46.0496 + 955.3 202.192 49.435 46.0506 + 955.4 202.13 48.6266 46.0566 + 955.5 202.058 47.8071 46.0506 + 955.6 201.986 46.9876 46.0506 + 955.7 201.904 46.1792 46.0506 + 955.8 201.801 45.3598 46.0496 + 955.9 201.698 44.5403 46.0467 + 956 201.585 43.7319 46.0447 + 956.1 201.461 42.9125 46.0367 + 956.2 201.327 42.093 46.0397 + 956.3 201.173 41.2957 46.0377 + 956.4 200.998 40.4873 46.0347 + 956.5 200.813 39.6789 46.0337 + 956.6 200.617 38.8816 46.0417 + 956.7 200.391 38.0842 46.0307 + 956.8 200.154 37.298 46.0348 + 956.9 199.907 36.5228 46.0458 + 957 199.629 35.7477 46.0408 + 957.1 199.33 34.9946 46.0508 + 957.2 199.021 34.2416 46.0468 + 957.3 198.692 33.4997 46.0608 + 957.4 198.342 32.7688 46.0628 + 957.5 197.981 32.049 46.0618 + 957.6 197.6 31.3292 46.0729 + 957.7 197.199 30.6315 46.0689 + 957.8 196.797 29.9338 46.0659 + 957.9 196.365 29.2362 46.0749 + 958 195.922 28.5718 46.0699 + 958.1 195.469 27.8962 46.0619 + 958.2 195.006 27.2429 46.063 + 958.3 194.532 26.5895 46.064 + 958.4 194.048 25.9583 46.059 + 958.5 193.565 25.316 46.064 + 958.6 193.06 24.6848 46.063 + 958.7 192.556 24.0647 46.059 + 958.8 192.041 23.4556 46.0601 + 958.9 191.516 22.8465 46.0591 + 959 190.991 22.2485 46.0561 + 959.1 190.455 21.6616 46.0661 + 959.2 189.909 21.0858 46.0451 + 959.3 189.354 20.5099 46.0592 + 959.4 188.798 19.9562 46.0592 + 959.5 188.221 19.4025 46.0552 + 959.6 187.644 18.871 46.0692 + 959.7 187.068 18.3394 46.0592 + 959.8 186.481 17.8189 46.0753 + 959.9 185.874 17.3206 46.0713 + 960 185.276 16.8223 46.0773 + 960.1 184.659 16.335 46.0753 + 960.2 184.041 15.8588 46.0883 + 960.3 183.413 15.3827 46.0883 + 960.4 182.774 14.9286 46.0994 + 960.5 182.136 14.4746 46.0984 + 960.6 181.487 14.0427 46.1144 + 960.7 180.829 13.6108 46.1114 + 960.9 179.49 12.7803 46.1065 + 961 178.811 12.3816 46.1095 + 961.1 178.121 11.994 46.1165 + 961.2 177.431 11.6175 46.1195 + 961.3 176.72 11.252 46.1105 + 961.4 176.01 10.8977 46.1246 + 961.5 175.279 10.5433 46.1266 + 961.6 174.558 10.2221 46.1316 + 961.7 173.807 9.91207 46.1336 + 961.8 173.045 9.63521 46.1356 + 961.9 172.293 9.39158 46.1377 + 962 171.542 9.15902 46.1287 + 962.1 170.78 8.95968 46.1337 + 962.2 170.028 8.80464 46.1367 + 962.3 169.276 8.66067 46.1317 + 962.4 168.515 8.53885 46.1308 + 962.5 167.763 8.46133 46.1328 + 962.6 167.011 8.39487 46.1338 + 962.7 166.249 8.30628 46.1318 + 962.8 165.498 8.21768 46.1148 + 962.9 164.746 8.15123 46.1339 + 963 163.984 8.08477 46.1529 + 963.1 163.222 7.99618 46.1539 + 963.2 162.45 7.91865 46.1569 + 963.3 161.688 7.83005 46.1549 + 963.4 160.916 7.73038 46.165 + 963.5 160.154 7.63071 46.153 + 963.6 159.382 7.55318 46.153 + 963.7 158.6 7.4978 46.127 + 963.8 157.817 7.47565 46.116 + 963.9 157.065 7.45349 46.0931 + 964 156.314 7.47563 46.1041 + 964.1 155.562 7.531 46.1111 + 964.2 154.831 7.63065 46.1121 + 964.3 154.121 7.76353 46.1101 + 964.4 153.431 7.92963 46.1012 + 964.5 152.751 8.12895 46.0972 + 964.6 152.092 8.35043 46.0802 + 964.7 151.464 8.60512 46.1062 + 964.8 150.816 8.81551 46.1062 + 964.9 150.167 9.04806 46.0892 + 965 149.539 9.31382 46.0822 + 965.1 148.911 9.56852 46.0763 + 965.2 148.262 9.81214 46.0643 + 965.3 147.614 10.0447 46.0663 + 965.4 146.965 10.2772 46.0643 + 965.5 146.306 10.5098 46.0583 + 965.6 145.637 10.7312 46.0543 + 965.7 144.968 10.9638 46.0343 + 965.8 144.309 11.1963 46.0374 + 965.9 143.629 11.4399 46.0364 + 966 142.95 11.6725 46.0214 + 966.1 142.26 11.905 46.0224 + 966.2 141.57 12.1376 46.0274 + 966.3 140.89 12.3591 46.0154 + 966.4 140.19 12.6027 46.0154 + 966.5 139.49 12.8352 46.0105 + 966.6 138.8 13.0678 46.0025 + 966.7 138.09 13.3003 46.0005 + 966.8 137.39 13.5328 45.9975 + 966.9 136.679 13.7654 45.9905 + 967 135.969 14.009 46.0025 + 967.1 135.258 14.2416 45.9866 + 967.2 134.548 14.4852 45.9836 + 967.3 133.838 14.7177 45.9826 + 967.4 133.117 14.9613 45.9776 + 967.5 132.406 15.205 45.9666 + 967.6 131.675 15.4375 45.9786 + 967.7 130.955 15.6811 45.9656 + 967.8 130.224 15.9137 45.9657 + 967.9 129.503 16.1573 45.9737 + 968 128.772 16.4009 45.9667 + 968.1 128.041 16.6445 45.9657 + 968.2 127.32 16.8881 45.9697 + 968.3 126.589 17.1318 45.9587 + 968.4 125.858 17.3754 45.9567 + 968.5 125.127 17.619 45.9547 + 968.6 124.396 17.8626 45.9448 + 968.7 123.665 18.1062 45.9388 + 968.8 122.924 18.3498 45.9458 + 968.9 122.183 18.5935 45.9258 + 969 121.451 18.8371 45.9308 + 969.1 120.71 19.0918 45.9288 + 969.2 119.969 19.3354 45.9258 + 969.3 119.228 19.579 45.9329 + 969.4 118.486 19.8226 45.9269 + 969.5 117.735 20.0773 45.9209 + 969.6 116.993 20.332 45.9239 + 969.7 116.252 20.5756 45.9239 + 969.8 115.5 20.8193 45.9259 + 969.9 114.759 21.0739 45.9229 + 970 114.028 21.3176 45.9169 + 970.1 113.287 21.5612 45.919 + 970.2 112.545 21.8048 45.911 + 970.3 111.804 22.0374 45.906 + 970.4 111.063 22.292 45.902 + 970.5 110.332 22.5246 45.9 + 970.6 109.601 22.7682 45.896 + 970.7 108.87 23.0118 45.896 + 970.8 108.139 23.2444 45.897 + 970.9 107.418 23.488 45.9071 + 971 106.697 23.7316 45.9051 + 971.1 105.977 23.9642 45.8931 + 971.2 105.266 24.2078 45.8991 + 971.3 104.556 24.4403 45.9021 + 971.4 103.845 24.6729 45.8981 + 971.5 103.145 24.9165 45.8991 + 971.6 102.445 25.149 45.8871 + 971.7 101.745 25.3816 45.8891 + 971.8 101.065 25.6141 45.8821 + 971.9 100.365 25.8467 45.8782 + 972 99.6754 26.0681 45.8572 + 972.1 98.9959 26.2896 45.8512 + 972.2 98.3061 26.5222 45.8482 + 972.3 97.6265 26.7436 45.8332 + 972.4 96.9367 26.9762 45.8262 + 972.5 96.2468 27.1977 45.8122 + 972.6 95.5673 27.4191 45.8142 + 972.7 94.8878 27.6406 45.7972 + 972.8 94.2082 27.8731 45.7952 + 972.9 93.5287 28.0946 45.7893 + 973 92.8492 28.3161 45.7943 + 973.1 92.1696 28.5376 45.7833 + 973.2 91.4901 28.7701 45.7823 + 973.3 90.8003 29.0027 45.7763 + 973.4 90.1207 29.2241 45.7723 + 973.5 89.4206 29.4345 45.7673 + 973.6 88.7308 29.6339 45.7713 + 973.7 88.0203 29.8221 45.7543 + 973.8 87.3202 29.9771 45.7583 + 973.9 86.6098 30.11 45.7623 + 974 85.8994 30.2208 45.7763 + 974.1 85.1889 30.2983 45.7724 + 974.2 84.4579 30.3758 45.7824 + 974.3 83.7475 30.4533 45.7974 + 974.4 83.0474 30.5087 45.7614 + 974.5 82.337 30.564 45.7584 + 974.6 81.6265 30.6083 45.7594 + 974.7 80.9161 30.6858 45.7654 + 974.8 80.2057 30.7633 45.7674 + 974.9 79.4953 30.8409 45.7754 + 975 78.7951 30.9184 45.7764 + 975.1 78.0744 31.007 45.7924 + 975.2 77.3537 31.0845 45.7855 + 975.3 76.633 31.162 45.7905 + 975.4 75.9123 31.2506 45.7885 + 975.5 75.1915 31.3281 45.8015 + 975.6 74.4605 31.4167 45.7815 + 975.7 73.7398 31.4942 45.7865 + 975.8 73.0191 31.5828 45.7875 + 975.9 72.2881 31.6603 45.7735 + 976 71.5571 31.7599 45.7735 + 976.1 70.8157 31.8375 45.7635 + 976.2 70.0847 31.9371 45.7645 + 976.3 69.3434 32.0257 45.7595 + 976.4 68.6021 32.1143 45.7515 + 976.5 67.8608 32.214 45.7546 + 976.6 67.1092 32.3025 45.7496 + 976.7 66.3679 32.4022 45.7436 + 976.8 65.606 32.4908 45.7426 + 976.9 64.8441 32.5905 45.7476 + 977 64.0925 32.6901 45.7476 + 977.1 63.3306 32.7898 45.7486 + 977.2 62.5687 32.8894 45.7366 + 977.3 61.8068 32.9891 45.7416 + 977.4 61.0346 33.0888 45.7466 + 977.5 60.2624 33.1884 45.7506 + 977.6 59.4902 33.2881 45.7546 + 977.7 58.718 33.3988 45.7456 + 977.8 57.9458 33.5096 45.7476 + 977.9 57.1736 33.6092 45.7387 + 978 56.3911 33.72 45.7457 + 978.1 55.6086 33.8307 45.7427 + 978.2 54.8364 33.9414 45.7397 + 978.3 54.0539 34.0522 45.7347 + 978.4 53.2714 34.1629 45.7317 + 978.5 52.4889 34.2736 45.7337 + 978.6 51.6961 34.3844 45.7307 + 978.7 50.9136 34.4951 45.7207 + 978.8 50.1311 34.6058 45.7197 + 978.9 49.328 34.7387 45.7077 + 979 48.5455 34.9159 45.7067 + 979.1 47.7836 35.0931 45.6807 + 979.2 47.032 35.2924 45.6827 + 979.3 46.2907 35.525 45.6857 + 979.4 45.5803 35.7907 45.6957 + 979.5 44.8802 36.0786 45.7007 + 979.6 44.1491 36.3112 45.6887 + 979.7 43.449 36.6102 45.6857 + 979.8 42.7798 36.9203 45.6847 + 979.9 42.1002 37.2082 45.7038 + 980 41.4104 37.5072 45.7088 + 980.1 40.7103 37.784 45.7278 + 980.2 40.0102 38.0719 45.7268 + 980.3 39.31 38.3709 45.7188 + 980.4 38.6202 38.6588 45.7278 + 980.5 37.9201 38.9578 45.7188 + 980.6 37.2199 39.2457 45.7138 + 980.7 36.5095 39.5447 45.7018 + 980.8 35.7991 39.8437 45.7068 + 980.9 35.0887 40.1427 45.6988 + 981 34.368 40.4417 45.6928 + 981.1 33.6472 40.7407 45.6788 + 981.2 32.9162 41.0508 45.6758 + 981.3 32.1852 41.3608 45.6738 + 981.4 31.4542 41.6598 45.6708 + 981.5 30.7129 41.9699 45.6648 + 981.6 29.9716 42.28 45.6578 + 981.7 29.2303 42.59 45.6678 + 981.8 28.4684 42.8669 45.6668 + 981.9 27.7168 43.1548 45.6728 + 982 26.9549 43.4316 45.6748 + 982.1 26.1827 43.6974 45.6858 + 982.2 25.4002 43.9521 45.6848 + 982.3 24.628 44.1847 45.6888 + 982.4 23.8352 44.4061 45.6888 + 982.5 23.0424 44.6165 45.6908 + 982.6 22.2496 44.8048 45.6858 + 982.7 21.4362 44.993 45.6828 + 982.8 20.6434 45.137 45.6808 + 982.9 19.83 45.2256 45.6588 + 983 19.027 45.3363 45.7038 + 983.1 18.2033 45.4803 45.7098 + 983.2 17.3899 45.6021 45.6748 + 983.3 16.5868 45.6685 45.6738 + 983.4 15.7734 45.7571 45.6708 + 983.5 14.96 45.8457 45.6698 + 983.6 14.157 45.9565 45.6658 + 983.7 13.3436 46.0783 45.6638 + 983.8 12.5302 46.2001 45.6748 + 983.9 11.7168 46.3219 45.6908 + 984 10.8931 46.4326 45.6908 + 984.1 10.0798 46.5434 45.6988 + 984.2 9.25608 46.6652 45.7038 + 984.3 8.4324 46.787 45.7038 + 984.4 7.60872 46.9088 45.7068 + 984.5 6.79534 47.0417 45.7028 + 984.6 5.97166 47.1635 45.7058 + 984.7 5.13769 47.2964 45.7138 + 984.8 4.30372 47.4293 45.7038 + 984.9 3.46974 47.5622 45.7028 + 985 2.62547 47.695 45.7158 + 985.1 1.7915 47.8279 45.7278 + 985.2 0.957525 47.9719 45.7198 + 985.3 0.113256 48.1048 45.7228 + 985.4 -0.731014 48.2266 45.7128 + 985.5 -1.58558 48.282 45.6848 + 985.6 -2.41955 48.3595 45.7108 + 985.7 -3.25353 48.4038 45.7158 + 985.8 -4.0772 48.4038 45.7338 + 985.9 -4.89059 48.3705 45.7368 + 986 -5.70397 48.293 45.7358 + 986.1 -6.54824 48.2598 45.7368 + 986.2 -7.39251 48.2044 45.6878 + 986.3 -8.1853 48.1158 45.6628 + 986.4 -8.98838 48.0383 45.6708 + 986.5 -9.80176 47.983 45.6698 + 986.6 -10.6254 47.9387 45.6848 + 986.7 -11.4594 47.9054 45.6978 + 986.8 -12.2831 47.8722 45.7128 + 986.9 -13.1171 47.839 45.7038 + 987 -13.951 47.8058 45.7178 + 987.1 -14.7747 47.7726 45.7158 + 987.2 -15.6087 47.7393 45.7288 + 987.3 -16.453 47.7061 45.7168 + 987.4 -17.2766 47.684 45.7128 + 987.5 -18.1209 47.6618 45.7258 + 987.6 -18.9549 47.6397 45.7348 + 987.7 -19.7991 47.6286 45.7288 + 987.8 -20.6434 47.6065 45.7378 + 987.9 -21.4774 47.5732 45.7298 + 988 -22.3114 47.5289 45.7298 + 988.1 -23.1556 47.4957 45.7208 + 988.2 -23.9896 47.4182 45.7218 + 988.3 -24.8339 47.3407 45.7168 + 988.4 -25.6679 47.23 45.7078 + 988.5 -26.4915 47.1081 45.7248 + 988.6 -27.3255 46.9753 45.7178 + 988.7 -28.1286 46.787 45.7078 + 988.8 -28.9111 46.5766 45.7098 + 988.9 -29.6936 46.3441 45.7118 + 989 -30.4452 46.0894 45.7048 + 989.1 -31.1865 45.8014 45.7108 + 989.2 -31.8969 45.4914 45.7028 + 989.3 -32.597 45.1702 45.6878 + 989.4 -33.3487 44.8823 45.6658 + 989.5 -34.0797 44.5501 45.5958 + 989.6 -34.7695 44.2068 45.5748 + 989.7 -35.449 43.8635 45.5887 + 989.8 -36.1697 43.5535 45.5927 + 989.9 -36.8905 43.2545 45.6177 + 990 -37.6215 42.9444 45.6387 + 990.1 -38.3422 42.6343 45.6487 + 990.2 -39.0629 42.3132 45.6517 + 990.3 -39.7836 42.0031 45.6567 + 990.4 -40.4941 41.6931 45.6527 + 990.5 -41.2045 41.3941 45.6517 + 990.6 -41.9252 41.084 45.6567 + 990.7 -42.6459 40.785 45.6567 + 990.8 -43.3666 40.486 45.6627 + 990.9 -44.0977 40.187 45.6687 + 991 -44.8287 39.888 45.6597 + 991.1 -45.5494 39.5891 45.6547 + 991.2 -46.2804 39.2901 45.6577 + 991.3 -47.0217 39.0021 45.6497 + 991.4 -47.7424 38.7032 45.6437 + 991.5 -48.4735 38.4152 45.6747 + 991.6 -49.2045 38.1273 45.7267 + 991.7 -49.9458 37.8394 45.7907 + 991.8 -50.6768 37.5404 45.9187 + 991.9 -51.4078 37.2636 46.0627 + 992 -52.1491 36.9867 46.2337 + 992.1 -52.8801 36.7099 46.4687 + 992.2 -53.6112 36.433 46.7377 + 992.3 -54.3422 36.1562 47.0437 + 992.4 -55.0629 35.8794 47.3627 + 992.5 -55.7836 35.6025 47.7337 + 992.6 -56.494 35.3367 48.1057 + 992.7 -57.2045 35.0599 48.4936 + 992.8 -57.9149 34.7831 48.8946 + 992.9 -58.615 34.5173 49.2916 + 993 -59.3049 34.2515 49.7016 + 993.1 -59.9947 33.9858 50.1116 + 993.2 -60.6845 33.7311 50.5096 + 993.3 -61.3641 33.4653 50.9226 + 993.4 -62.0333 33.2106 51.3256 + 993.5 -62.6923 32.9559 51.7216 + 993.6 -63.3615 32.7123 52.1196 + 993.7 -64.0205 32.4687 52.5156 + 993.8 -64.6485 32.2361 52.8996 + 993.9 -65.256 32.0257 53.3136 + 994 -65.7914 31.8375 53.6606 + 994.1 -66.3371 31.6492 54.0476 + 994.2 -66.8416 31.461 54.4156 + 994.3 -67.274 31.3059 54.7816 + 994.4 -67.6756 31.162 55.1536 + 994.5 -68.0154 31.0402 55.5086 + 994.6 -68.3139 30.9294 55.8806 + 994.7 -68.5713 30.8409 56.2456 + 994.8 -68.8185 30.7633 56.6176 + 994.9 -69.0141 30.6858 56.9976 + 995 -69.1891 30.6194 57.3636 + 995.1 -69.3539 30.564 57.7535 + 995.2 -69.5083 30.5087 58.1435 + 995.3 -69.6627 30.4644 58.5115 + 995.4 -69.8172 30.409 58.9045 + 995.5 -69.9613 30.3647 59.2845 + 995.6 -70.1261 30.3093 59.6605 + 995.7 -70.2908 30.265 60.0475 + 995.8 -70.4659 30.2097 60.4035 + 995.9 -70.6512 30.1432 60.7705 + 996 -70.8365 30.0879 61.1185 + 996.1 -71.0321 30.0325 61.4615 + 996.2 -71.2484 29.9661 61.7965 + 996.3 -71.4646 29.8885 62.1195 + 996.4 -71.6911 29.811 62.4365 + 996.5 -71.9382 29.7335 62.7585 + 996.6 -72.1956 29.656 63.0675 + 996.7 -72.4633 29.5563 63.3615 + 996.8 -72.7413 29.4677 63.6665 + 996.9 -73.0296 29.3681 63.9455 + 997 -73.3385 29.2463 64.2415 + 997.1 -73.668 29.1355 64.5205 + 997.2 -73.9871 29.0137 64.7935 + 997.3 -74.3372 28.8919 65.0745 + 997.4 -74.6976 28.759 65.3385 + 997.5 -75.0785 28.6151 65.5885 + 997.6 -75.4698 28.4711 65.8415 + 997.7 -75.861 28.3161 66.0695 + 997.8 -76.2729 28.15 66.2585 + 997.9 -76.6847 27.9728 66.4245 + 998 -77.1069 27.7735 66.5505 + 998.1 -77.529 27.5852 66.6435 + 998.2 -77.9511 27.3638 66.7425 + 998.3 -78.3836 27.1312 66.7995 + 998.4 -78.816 26.8765 66.8205 + 998.5 -79.2484 26.6107 66.8475 + 998.6 -79.6809 26.3228 66.8514 + 998.7 -80.103 26.0128 66.8544 + 998.8 -80.5355 25.7027 66.8494 + 998.9 -80.9679 25.3705 66.8384 + 999 -81.39 25.0272 66.8184 + 999.1 -81.8225 24.6728 66.8104 + 999.2 -82.2549 24.3074 66.8004 + 999.3 -82.6976 23.9309 66.7874 + 999.4 -83.1507 23.5544 66.7834 + 999.5 -83.614 23.1557 66.7834 + 999.6 -84.0876 22.7571 66.7834 + 999.7 -84.5612 22.3473 66.8014 + 999.8 -85.0245 21.9154 66.8044 + 999.9 -85.4364 21.4503 66.8124 + 1000 -85.8688 20.9852 66.8294 + 1000.1 -86.2704 20.498 66.8504 + 1000.2 -86.641 19.9886 66.8654 + 1000.3 -86.9705 19.4571 66.8864 + 1000.4 -87.2897 18.9144 66.9064 + 1000.5 -87.6192 18.3829 66.8954 + 1000.6 -87.9589 17.8513 66.8534 + 1000.7 -88.2472 17.2977 66.8294 + 1000.8 -88.5561 16.755 66.8384 + 1000.9 -88.8856 16.2013 66.8344 + 1001 -89.2459 15.6587 66.8474 + 1001.1 -89.6269 15.094 66.8714 + 1001.2 -89.9976 14.5181 66.8773 + 1001.3 -90.3888 13.9423 66.8903 + 1001.4 -90.7801 13.3554 66.9053 + 1001.5 -91.1713 12.7685 66.9123 + 1001.6 -91.5729 12.1815 66.9203 + 1001.7 -91.9847 11.5946 66.9303 + 1001.8 -92.4069 10.9966 66.9343 + 1001.9 -92.829 10.3987 66.9493 + 1002 -93.282 9.80066 66.9543 + 1002.1 -93.7556 9.22483 66.9393 + 1002.2 -94.2499 8.66006 66.9283 + 1002.3 -94.7338 8.11744 66.9523 + 1002.4 -95.2589 7.60805 66.9593 + 1002.5 -95.8046 7.14295 66.9733 + 1002.6 -96.3708 6.71107 66.9803 + 1002.7 -96.9474 6.31242 66.9913 + 1002.8 -97.5343 5.95805 66.9983 + 1002.9 -98.1212 5.65906 67.0162 + 1003 -98.7184 5.38222 67.0242 + 1003.1 -99.3258 5.16075 67.0272 + 1003.2 -99.923 4.97249 67.0562 + 1003.3 -100.52 4.81746 67.0602 + 1003.4 -101.117 4.7178 67.0712 + 1003.5 -101.725 4.65136 67.0862 + 1003.6 -102.322 4.62922 67.0942 + 1003.7 -102.899 4.65137 67.1302 + 1003.8 -103.465 4.70674 67.1512 + 1003.9 -104.021 4.81749 67.2032 + 1004 -104.556 4.97253 67.2531 + 1004.1 -105.081 5.14971 67.3541 + 1004.2 -105.617 5.33797 67.4781 + 1004.3 -106.142 5.55945 67.6181 + 1004.4 -106.646 5.79201 67.8151 + 1004.5 -107.151 6.02456 68.0341 + 1004.6 -107.635 6.25712 68.3271 + 1004.7 -108.067 6.45645 68.6341 + 1004.8 -108.479 6.64471 68.9911 + 1004.9 -108.839 6.8219 69.3921 + 1005 -109.117 6.96586 69.8201 + 1005.1 -109.364 7.08767 70.2651 + 1005.2 -109.591 7.19841 70.7321 + 1005.3 -109.776 7.27593 71.2151 + 1005.4 -109.931 7.35345 71.714 + 1005.5 -110.065 7.43097 72.233 + 1005.6 -110.199 7.49742 72.75 + 1005.7 -110.322 7.56386 73.277 + 1005.8 -110.446 7.63031 73.799 + 1005.9 -110.549 7.68568 74.324 + 1006 -110.652 7.74105 74.828 + 1006.1 -110.734 7.78534 75.346 + 1006.2 -110.806 7.84071 75.842 + 1006.3 -110.888 7.88501 76.349 + 1006.4 -110.95 7.92931 76.858 + 1006.5 -111.012 7.98468 77.346 + 1006.6 -111.084 8.04005 77.835 + 1006.7 -111.146 8.10649 78.33 + 1006.8 -111.218 8.17294 78.822 + 1006.9 -111.29 8.25046 79.305 + 1007 -111.362 8.35012 79.772 + 1007.1 -111.434 8.44979 80.236 + 1007.2 -111.506 8.5716 80.686 + 1007.3 -111.589 8.70449 81.118 + 1007.4 -111.671 8.84845 81.548 + 1007.5 -111.753 9.01456 81.951 + 1007.6 -111.836 9.19175 82.343 + 1007.7 -111.918 9.39108 82.72 + 1007.8 -111.99 9.60148 83.072 + 1007.9 -112.062 9.82296 83.409 + 1008 -112.124 10.0666 83.741 + 1008.1 -112.186 10.3102 84.051 + 1008.2 -112.248 10.576 84.352 + 1008.3 -112.289 10.8528 84.641 + 1008.4 -112.32 11.1408 84.926 + 1008.5 -112.34 11.4398 85.2 + 1008.6 -112.351 11.7498 85.458 + 1008.7 -112.33 12.0599 85.726 + 1008.8 -112.32 12.37 85.971 + 1008.9 -112.289 12.6911 86.23 + 1009 -112.237 13.0233 86.482 + 1009.1 -112.176 13.3555 86.718 + 1009.2 -112.093 13.6988 86.966 + 1009.3 -112.001 14.0311 87.207 + 1009.4 -111.898 14.3743 87.431 + 1009.5 -111.784 14.7176 87.657 + 1009.6 -111.661 15.0609 87.881 + 1009.7 -111.527 15.4153 88.103 + 1009.8 -111.372 15.7586 88.322 + 1009.9 -111.208 16.1129 88.531 + 1010 -111.043 16.4562 88.741 + 1010.1 -110.858 16.7995 88.945 + 1010.2 -110.662 17.1428 89.146 + 1010.3 -110.456 17.4861 89.335 + 1010.4 -110.23 17.8183 89.526 + 1010.5 -109.993 18.1395 89.714 + 1010.6 -109.756 18.4717 89.893 + 1010.7 -109.499 18.7928 90.075 + 1010.8 -109.231 19.114 90.259 + 1010.9 -108.974 19.4573 90.423 + 1011 -108.726 19.8006 90.563 + 1011.1 -108.459 20.1438 90.681 + 1011.2 -108.191 20.4871 90.773 + 1011.3 -107.934 20.8526 90.8501 + 1011.4 -107.676 21.2291 90.9071 + 1011.5 -107.419 21.6167 90.9341 + 1011.6 -107.172 22.0153 90.9661 + 1011.7 -106.914 22.4251 90.9631 + 1011.8 -106.667 22.8459 90.9761 + 1011.9 -106.42 23.2777 90.9731 + 1012 -106.173 23.7207 90.9711 + 1012.1 -105.936 24.1747 90.9661 + 1012.2 -105.689 24.6398 90.9571 + 1012.3 -105.452 25.1049 90.9581 + 1012.4 -105.205 25.5811 90.9501 + 1012.5 -104.886 26.0351 90.9591 + 1012.6 -104.587 26.4781 90.9611 + 1012.7 -104.268 26.8989 90.9641 + 1012.8 -103.908 27.2865 90.9761 + 1012.9 -103.527 27.6519 90.9951 + 1013 -103.146 27.9952 90.9891 + 1013.1 -102.765 28.3717 90.9881 + 1013.2 -102.384 28.715 90.9661 + 1013.3 -101.993 29.0472 90.9651 + 1013.4 -101.601 29.4127 90.9501 + 1013.5 -101.231 29.7781 90.9571 + 1013.6 -100.87 30.1768 90.9751 + 1013.7 -100.52 30.5865 90.9711 + 1013.8 -100.181 31.0184 90.9731 + 1013.9 -99.8305 31.4503 90.9731 + 1014 -99.5011 31.8821 90.9681 + 1014.1 -99.1613 32.3251 90.9801 + 1014.2 -98.8112 32.757 90.9762 + 1014.3 -98.4611 33.1999 90.9942 + 1014.4 -98.1111 33.6318 90.9952 + 1014.5 -97.761 34.0637 91.0012 + 1014.6 -97.4109 34.5066 90.9952 + 1014.7 -97.0403 34.9385 91.0122 + 1014.8 -96.649 35.3593 91.0102 + 1014.9 -96.2784 35.7912 91.0032 + 1015 -95.918 36.2342 90.9962 + 1015.1 -95.5473 36.666 90.9952 + 1015.2 -95.1664 37.1201 90.9902 + 1015.3 -94.7751 37.563 90.9792 + 1015.4 -94.3324 37.9728 90.9862 + 1015.5 -93.9 38.3825 90.9532 + 1015.6 -93.4675 38.7701 90.9682 + 1015.7 -93.0042 39.1134 90.9652 + 1015.8 -92.5203 39.4124 90.9792 + 1015.9 -92.0158 39.6671 90.9772 + 1016 -91.5216 39.8775 90.9862 + 1016.1 -91.0377 40.0768 90.9932 + 1016.2 -90.5537 40.3315 90.9822 + 1016.3 -90.0595 40.5197 90.9452 + 1016.4 -89.555 40.6858 90.9272 + 1016.5 -89.0402 40.863 90.9292 + 1016.6 -88.5357 41.0624 90.9383 + 1016.7 -88.0312 41.2728 90.9553 + 1016.8 -87.5061 41.4942 90.9753 + 1016.9 -86.981 41.7157 90.9823 + 1017 -86.4559 41.9483 90.9793 + 1017.1 -85.9205 42.1697 90.9733 + 1017.2 -85.3954 42.4023 90.9753 + 1017.3 -84.86 42.6348 90.9693 + 1017.4 -84.3246 42.8785 90.9803 + 1017.5 -83.7892 43.1221 90.9763 + 1017.6 -83.2435 43.3768 90.9813 + 1017.7 -82.6978 43.6315 90.9743 + 1017.8 -82.1521 43.8972 90.9823 + 1017.9 -81.5962 44.163 90.9743 + 1018 -81.0505 44.4399 90.9733 + 1018.1 -80.4842 44.7389 90.9723 + 1018.2 -79.9282 45.0378 90.9643 + 1018.3 -79.3722 45.3368 90.9613 + 1018.4 -78.8059 45.658 90.9613 + 1018.5 -78.2396 45.9791 90.9444 + 1018.6 -77.6631 46.3113 90.9394 + 1018.7 -77.0968 46.6657 90.9454 + 1018.8 -76.5305 47.009 90.9394 + 1018.9 -75.9539 47.3633 90.9434 + 1019 -75.367 47.7177 90.9324 + 1019.1 -74.7802 48.0831 90.9324 + 1019.2 -74.2036 48.4597 90.9294 + 1019.3 -73.6167 48.814 90.9354 + 1019.4 -73.0195 49.1905 90.9304 + 1019.5 -72.4224 49.567 90.9194 + 1019.6 -71.8252 49.9436 90.9164 + 1019.7 -71.2177 50.3201 90.9224 + 1019.8 -70.6102 50.6966 90.9124 + 1019.9 -69.9925 51.0842 90.9184 + 1020 -69.3747 51.4717 90.9164 + 1020.1 -68.757 51.8593 90.9124 + 1020.2 -68.1392 52.258 90.9134 + 1020.3 -67.5111 52.6566 90.9094 + 1020.4 -66.8728 53.0553 90.9144 + 1020.5 -66.2447 53.454 90.9174 + 1020.6 -65.6064 53.8526 90.9204 + 1020.7 -64.9783 54.2734 90.9174 + 1020.8 -64.3502 54.7053 90.9184 + 1020.9 -63.7325 55.1483 90.9174 + 1021 -63.1147 55.5912 90.9224 + 1021.1 -62.4969 56.0452 90.9234 + 1021.2 -61.8895 56.5103 90.8924 + 1021.3 -61.2717 56.9754 90.8795 + 1021.4 -60.6539 57.4405 90.8855 + 1021.5 -60.0568 57.9057 90.8775 + 1021.6 -59.4493 58.3818 90.8665 + 1021.7 -58.8315 58.858 90.8575 + 1021.8 -58.2138 59.3231 90.8575 + 1021.9 -57.596 59.7993 90.8635 + 1022 -56.9783 60.2644 90.8635 + 1022.1 -56.3708 60.7295 90.8565 + 1022.2 -55.753 61.1946 90.8635 + 1022.3 -55.1353 61.6708 90.8645 + 1022.4 -54.5278 62.1359 90.8615 + 1022.5 -53.91 62.601 90.8675 + 1022.6 -53.2923 63.0661 90.8535 + 1022.7 -52.6848 63.5312 90.8625 + 1022.8 -52.0773 63.9852 90.8605 + 1022.9 -51.4596 64.4503 90.8595 + 1023 -50.8418 64.9154 90.8625 + 1023.1 -50.2343 65.3805 90.8625 + 1023.2 -49.6269 65.8345 90.8615 + 1023.3 -49.0194 66.2996 90.8555 + 1023.4 -48.4119 66.7537 90.8625 + 1023.5 -47.7942 67.2077 90.8535 + 1023.6 -47.1867 67.6728 90.8485 + 1023.7 -46.5895 68.1379 90.8485 + 1023.8 -45.9924 68.5809 90.8565 + 1023.9 -45.3952 69.0349 90.8505 + 1024 -44.7877 69.4889 90.8545 + 1024.1 -44.1905 69.943 90.8555 + 1024.2 -43.614 70.3859 90.8535 + 1024.3 -43.0271 70.8289 90.8585 + 1024.4 -42.4505 71.2718 90.8585 + 1024.5 -41.8636 71.7148 90.8505 + 1024.6 -41.2871 72.1467 90.8475 + 1024.7 -40.7105 72.5896 90.8345 + 1024.8 -40.1339 73.0215 90.8325 + 1024.9 -39.5573 73.4644 90.8325 + 1025 -38.9807 73.8963 90.8375 + 1025.1 -38.4042 74.3393 90.8254 + 1025.2 -37.8276 74.7822 90.8234 + 1025.3 -37.251 75.2141 90.8194 + 1025.4 -36.6641 75.6571 90.8194 + 1025.5 -36.0876 76.1 90.8134 + 1025.6 -35.511 76.543 90.8194 + 1025.7 -34.9447 76.9749 90.8164 + 1025.8 -34.3784 77.4067 90.8184 + 1025.9 -33.8018 77.8386 90.8034 + 1026 -33.2356 78.2705 90.8064 + 1026.1 -32.6693 78.7024 90.8064 + 1026.2 -32.103 79.1343 90.7984 + 1026.3 -31.5367 79.5662 90.7884 + 1026.4 -30.9704 79.987 90.7894 + 1026.5 -30.4041 80.4299 90.7874 + 1026.6 -29.8276 80.8618 90.7764 + 1026.7 -29.251 81.2937 90.7764 + 1026.8 -28.6641 81.7366 90.7724 + 1026.9 -28.0875 82.1796 90.7604 + 1027 -27.4904 82.6336 90.7674 + 1027.1 -26.8932 83.0877 90.7574 + 1027.2 -26.296 83.5417 90.7644 + 1027.3 -25.6886 84.0068 90.7504 + 1027.4 -25.0811 84.483 90.7574 + 1027.5 -24.4839 84.9702 90.7524 + 1027.6 -23.8662 85.4575 90.7644 + 1027.7 -23.2587 85.9669 90.7524 + 1027.8 -22.6615 86.4873 90.7454 + 1027.9 -22.0644 87.041 90.7484 + 1028 -21.4672 87.5837 90.7334 + 1028.1 -20.8494 88.1374 90.6884 + 1028.2 -20.2523 88.691 90.6263 + 1028.3 -19.6551 89.2558 90.5283 + 1028.4 -19.0682 89.8317 90.4173 + 1028.5 -18.471 90.4186 90.2953 + 1028.6 -17.8739 91.0055 90.1603 + 1028.7 -17.2664 91.6035 90.0273 + 1028.8 -16.6692 92.2125 89.8623 + 1028.9 -16.0721 92.8327 89.7083 + 1029 -15.4852 93.4639 89.5433 + 1029.1 -14.9086 94.1172 89.3583 + 1029.2 -14.332 94.7706 89.1443 + 1029.3 -13.7761 95.435 88.9213 + 1029.4 -13.2201 96.1216 88.6993 + 1029.5 -12.6538 96.8082 88.4622 + 1029.6 -12.1081 97.5169 88.2192 + 1029.7 -11.5727 98.2367 87.9842 + 1029.8 -11.0579 98.9676 87.7202 + 1029.9 -10.5328 99.7095 87.4542 + 1030 -10.018 100.451 87.2012 + 1030.1 -9.5135 101.205 86.9432 + 1030.2 -9.0193 101.98 86.6702 + 1030.3 -8.52509 102.755 86.4132 + 1030.4 -8.04117 103.53 86.1472 + 1030.5 -7.55726 104.327 85.8871 + 1030.6 -7.08364 105.125 85.6271 + 1030.7 -6.62032 105.922 85.3631 + 1030.8 -6.157 106.73 85.0911 + 1030.9 -5.70398 107.55 84.8491 + 1031 -5.25096 108.358 84.5901 + 1031.1 -4.79793 109.178 84.3371 + 1031.2 -4.34491 110.008 84.092 + 1031.3 -3.91248 110.85 83.859 + 1031.4 -3.49034 111.669 83.609 + 1031.5 -3.05791 112.511 83.364 + 1031.6 -2.62548 113.353 83.117 + 1031.7 -2.21364 114.183 82.882 + 1031.8 -1.7915 115.036 82.642 + 1031.9 -1.37966 115.877 82.4079 + 1032 -0.978118 116.73 82.1629 + 1032.1 -0.566279 117.583 81.9139 + 1032.2 -0.164736 118.435 81.6629 + 1032.3 0.236808 119.288 81.4279 + 1032.4 0.648647 120.13 81.1839 + 1032.5 1.05019 120.982 80.9378 + 1032.6 1.45173 121.835 80.6778 + 1032.7 1.85328 122.688 80.4218 + 1032.8 2.26511 123.54 80.1598 + 1032.9 2.67695 124.393 79.8988 + 1033 3.08879 125.246 79.6338 + 1033.1 3.50063 126.099 79.3947 + 1033.2 3.91247 126.951 79.1587 + 1033.3 4.3346 127.815 78.9067 + 1033.4 4.74644 128.668 78.6667 + 1033.5 5.15828 129.531 78.4387 + 1033.6 5.57012 130.384 78.1997 + 1033.7 5.99225 131.248 77.9566 + 1033.8 6.40409 132.112 77.7116 + 1033.9 6.83652 132.975 77.4526 + 1034 7.25865 133.839 77.2096 + 1034.1 7.67049 134.703 76.9606 + 1034.2 8.09263 135.578 76.6875 + 1034.3 8.52505 136.441 76.4345 + 1034.4 8.94719 137.316 76.1825 + 1034.5 9.36932 138.18 75.9255 + 1034.6 9.79145 139.055 75.6795 + 1034.7 10.2136 139.93 75.4124 + 1034.8 10.6357 140.793 75.1674 + 1034.9 11.0682 141.668 74.8964 + 1035 11.4903 142.543 74.6274 + 1035.1 11.9124 143.418 74.3584 + 1035.2 12.3448 144.293 74.0943 + 1035.3 12.7773 145.179 73.8553 + 1035.4 13.2097 146.065 73.6353 + 1035.5 13.6318 146.939 73.4493 + 1035.6 14.0746 147.814 73.2873 + 1035.7 14.507 148.689 73.1672 + 1035.8 14.9394 149.575 73.0632 + 1035.9 15.3718 150.472 72.9922 + 1036 15.8043 151.358 72.9322 + 1036.1 16.2367 152.244 72.8962 + 1036.2 16.6794 153.13 72.8751 + 1036.3 17.1222 154.027 72.8741 + 1036.4 17.6061 154.902 72.8571 + 1036.5 18.1106 155.754 72.8471 + 1036.6 18.6151 156.585 72.84 + 1036.7 19.1504 157.382 72.87 + 1036.8 19.7373 158.135 72.877 + 1036.9 20.3345 158.844 72.907 + 1037 20.9625 159.508 72.932 + 1037.1 21.6009 160.14 72.9409 + 1037.2 22.2495 160.726 72.9479 + 1037.3 22.9291 161.269 72.9539 + 1037.4 23.5983 161.767 72.9489 + 1037.5 24.2881 162.21 72.9579 + 1037.6 24.9779 162.609 72.9499 + 1037.7 25.6884 162.963 72.9519 + 1037.8 26.3988 163.262 72.9368 + 1037.9 27.1298 163.506 72.9218 + 1038 27.8402 163.694 72.9208 + 1038.1 28.5506 163.827 72.9118 + 1038.2 29.2405 163.905 72.9028 + 1038.3 29.9303 163.927 72.9078 + 1038.4 30.5995 163.894 72.8918 + 1038.5 31.2482 163.805 72.8868 + 1038.6 31.8762 163.683 72.8588 + 1038.7 32.5043 163.506 72.8478 + 1038.8 33.1117 163.296 72.8398 + 1038.9 33.6883 163.052 72.8358 + 1039 34.2752 162.775 72.8488 + 1039.1 34.862 162.509 72.8508 + 1039.2 35.4489 162.188 72.8348 + 1039.3 36.0564 161.867 72.8378 + 1039.4 36.6638 161.524 72.8448 + 1039.5 37.2713 161.181 72.8408 + 1039.6 37.8891 160.848 72.8518 + 1039.7 38.5274 160.516 72.8729 + 1039.8 39.1555 160.162 72.8699 + 1039.9 39.7835 159.785 72.8649 + 1040 40.4219 159.409 72.8539 + 1040.1 41.0602 159.021 72.8719 + 1040.2 41.7088 158.622 72.8629 + 1040.3 42.3472 158.224 72.8759 + 1040.4 42.9958 157.814 72.8849 + 1040.5 43.6445 157.382 72.8769 + 1040.6 44.2828 156.961 72.8879 + 1040.7 44.9315 156.518 72.8919 + 1040.8 45.5801 156.087 72.9009 + 1040.9 46.2185 155.644 72.9029 + 1041 46.8465 155.212 72.9149 + 1041.1 47.4643 154.78 72.9319 + 1041.2 48.082 154.348 72.9429 + 1041.3 48.6895 153.916 72.9419 + 1041.4 49.2867 153.506 72.943 + 1041.5 49.8735 153.097 72.952 + 1041.6 50.4398 152.687 72.954 + 1041.7 51.0061 152.288 72.95 + 1041.8 51.5724 151.89 72.956 + 1041.9 52.1284 151.491 72.937 + 1042 52.6843 151.103 72.931 + 1042.1 53.2403 150.705 72.92 + 1042.2 53.786 150.306 72.936 + 1042.3 54.342 149.907 72.91 + 1042.4 54.898 149.509 72.908 + 1042.5 55.454 149.099 72.898 + 1042.6 56.0099 148.689 72.891 + 1042.7 56.5659 148.291 72.877 + 1042.8 57.1219 147.87 72.879 + 1042.9 57.6779 147.471 72.873 + 1043 58.2339 147.05 72.868 + 1043.1 58.7899 146.641 72.872 + 1043.2 59.3355 146.242 72.875 + 1043.3 59.8812 145.843 72.867 + 1043.4 60.4372 145.434 72.859 + 1043.5 60.9829 145.035 72.8551 + 1043.6 61.5286 144.636 72.8521 + 1043.7 62.0743 144.238 72.8501 + 1043.8 62.62 143.828 72.8451 + 1043.9 63.1759 143.429 72.8361 + 1044 63.7216 143.031 72.8381 + 1044.1 64.2776 142.621 72.8341 + 1044.2 64.8336 142.222 72.8391 + 1044.3 65.3896 141.812 72.8351 + 1044.4 65.9456 141.403 72.8281 + 1044.5 66.5118 140.993 72.8391 + 1044.6 67.0678 140.583 72.8431 + 1044.7 67.6341 140.173 72.8331 + 1044.8 68.2004 139.775 72.8401 + 1044.9 68.7667 139.365 72.8431 + 1045 69.3535 138.966 72.8451 + 1045.1 69.9301 138.568 72.8421 + 1045.2 70.517 138.169 72.8471 + 1045.3 71.1141 137.77 72.8481 + 1045.4 71.7113 137.383 72.8411 + 1045.5 72.3188 136.995 72.8531 + 1045.6 72.9262 136.619 72.8601 + 1045.7 73.5543 136.264 72.8561 + 1045.8 74.1824 135.921 72.8591 + 1045.9 74.8207 135.578 72.8611 + 1046 75.4693 135.235 72.8511 + 1046.1 76.1283 134.924 72.8631 + 1046.2 76.7872 134.625 72.8691 + 1046.3 77.4668 134.349 72.8671 + 1046.4 78.1566 134.072 72.8781 + 1046.5 78.8567 133.806 72.8681 + 1046.6 79.5466 133.551 72.8831 + 1046.7 80.257 133.319 72.8801 + 1046.8 80.9674 133.119 72.8781 + 1046.9 81.6881 132.92 72.8861 + 1047 82.4088 132.754 72.8831 + 1047.1 83.1296 132.621 72.9001 + 1047.2 83.8606 132.51 72.8971 + 1047.3 84.5916 132.433 72.9071 + 1047.4 85.3226 132.389 72.916 + 1047.5 86.0433 132.378 72.912 + 1047.6 86.7743 132.378 72.921 + 1047.7 87.495 132.4 72.919 + 1047.8 88.2158 132.433 72.922 + 1047.9 88.9468 132.455 72.923 + 1048 89.6778 132.477 72.909 + 1048.1 90.4088 132.51 72.919 + 1048.2 91.1295 132.544 72.921 + 1048.3 91.8811 132.577 72.918 + 1048.4 92.6224 132.621 72.9289 + 1048.5 93.374 132.654 72.9159 + 1048.6 94.1359 132.71 72.9169 + 1048.7 94.8978 132.765 72.9159 + 1048.8 95.6597 132.854 72.9209 + 1048.9 96.4319 132.931 72.9249 + 1049 97.2041 133.009 72.9229 + 1049.1 97.9866 133.086 72.9199 + 1049.2 98.7691 133.175 72.9158 + 1049.3 99.5619 133.252 72.9188 + 1049.4 100.344 133.341 72.9328 + 1049.5 101.147 133.396 72.9378 + 1049.6 101.93 133.474 72.9458 + 1049.7 102.712 133.54 72.9588 + 1049.8 103.505 133.585 72.9668 + 1049.9 104.277 133.596 72.9627 + 1050 105.06 133.596 72.9507 + 1050.1 105.801 133.574 72.9577 + 1050.2 106.543 133.518 72.9637 + 1050.3 107.253 133.419 72.9697 + 1050.4 107.963 133.275 72.9737 + 1050.5 108.633 133.097 72.9757 + 1050.6 109.292 132.876 72.9797 + 1050.7 109.93 132.632 72.9727 + 1050.8 110.558 132.389 72.9817 + 1050.9 111.186 132.134 72.9777 + 1051 111.794 131.846 72.9467 + 1051.1 112.391 131.525 72.9436 + 1051.2 112.978 131.215 72.9416 + 1051.3 113.564 130.883 72.9406 + 1051.4 114.141 130.528 72.9326 + 1051.5 114.697 130.141 72.9146 + 1051.6 115.212 129.731 72.9286 + 1051.7 115.706 129.299 72.9416 + 1051.8 116.159 128.834 72.9436 + 1051.9 116.612 128.413 72.9496 + 1052 117.106 127.981 72.9156 + 1052.1 117.559 127.516 72.8746 + 1052.2 118.002 127.04 72.8686 + 1052.3 118.476 126.575 72.8426 + 1052.4 118.97 126.121 72.8486 + 1052.5 119.464 125.678 72.8626 + 1052.6 119.979 125.224 72.8786 + 1052.7 120.483 124.715 72.9006 + 1052.8 120.957 124.172 72.8816 + 1052.9 121.41 123.663 72.8866 + 1053 121.853 123.109 72.8866 + 1053.1 122.254 122.555 72.8976 + 1053.2 122.625 121.968 72.8846 + 1053.3 122.954 121.392 72.8887 + 1053.4 123.315 120.817 72.8917 + 1053.5 123.685 120.219 72.8637 + 1053.6 124.005 119.621 72.8377 + 1053.7 124.313 119.012 72.8347 + 1053.8 124.643 118.403 72.8507 + 1053.9 124.993 117.793 72.8497 + 1054 125.353 117.173 72.8577 + 1054.1 125.714 116.564 72.8587 + 1054.2 126.064 115.933 72.8557 + 1054.3 126.414 115.302 72.8657 + 1054.4 126.774 114.671 72.8617 + 1054.5 127.124 114.028 72.8577 + 1054.6 127.485 113.386 72.8617 + 1054.7 127.855 112.744 72.8677 + 1054.8 128.226 112.09 72.8747 + 1054.9 128.597 111.437 72.8637 + 1055 128.967 110.784 72.8697 + 1055.1 129.348 110.119 72.8687 + 1055.2 129.729 109.466 72.8657 + 1055.3 130.11 108.79 72.8727 + 1055.4 130.501 108.115 72.8607 + 1055.5 130.893 107.451 72.8667 + 1055.6 131.274 106.775 72.8598 + 1055.7 131.665 106.1 72.8638 + 1055.8 132.056 105.424 72.8658 + 1055.9 132.447 104.737 72.8678 + 1056 132.839 104.062 72.8568 + 1056.1 133.23 103.375 72.8488 + 1056.2 133.631 102.7 72.8478 + 1056.3 134.002 102.002 72.8628 + 1056.4 134.373 101.305 72.8458 + 1056.5 134.764 100.618 72.8348 + 1056.6 135.155 99.9425 72.8428 + 1056.7 135.526 99.2448 72.8398 + 1056.8 135.907 98.5471 72.8348 + 1056.9 136.288 97.8495 72.8298 + 1057 136.669 97.1518 72.8408 + 1057.1 137.05 96.4542 72.8348 + 1057.2 137.431 95.7455 72.8238 + 1057.3 137.822 95.0478 72.8298 + 1057.4 138.213 94.3391 72.8248 + 1057.5 138.594 93.6414 72.8268 + 1057.6 138.975 92.9216 72.8178 + 1057.7 139.366 92.2129 72.8208 + 1057.8 139.758 91.4931 72.8278 + 1057.9 140.149 90.7844 72.8158 + 1058 140.53 90.0535 72.8248 + 1058.1 140.931 89.3337 72.8198 + 1058.2 141.323 88.6139 72.8128 + 1058.3 141.714 87.8941 72.8158 + 1058.4 142.105 87.1743 72.8198 + 1058.5 142.507 86.4434 72.8138 + 1058.6 142.898 85.7236 72.8138 + 1058.7 143.289 85.0038 72.8178 + 1058.8 143.681 84.284 72.8268 + 1058.9 144.072 83.5642 72.8218 + 1059 144.473 82.8444 72.8228 + 1059.1 144.865 82.1246 72.8238 + 1059.2 145.256 81.4159 72.8338 + 1059.3 145.637 80.7183 72.8258 + 1059.4 146.028 80.0095 72.8278 + 1059.5 146.419 79.3119 72.8238 + 1059.6 146.8 78.6142 72.8318 + 1059.7 147.181 77.9277 72.8328 + 1059.8 147.562 77.2411 72.8298 + 1059.9 147.943 76.5545 72.8258 + 1060 148.314 75.8679 72.8198 + 1060.1 148.695 75.1814 72.8188 + 1060.2 149.065 74.4948 72.8238 + 1060.3 149.446 73.8082 72.8198 + 1060.4 149.827 73.1327 72.8198 + 1060.5 150.198 72.435 72.8158 + 1060.6 150.579 71.7595 72.8078 + 1060.7 150.939 71.0619 72.8138 + 1060.8 151.31 70.3753 72.8038 + 1060.9 151.67 69.6777 72.8088 + 1061 152.031 68.9911 72.8178 + 1061.1 152.381 68.2934 72.7968 + 1061.2 152.731 67.5958 72.8058 + 1061.3 153.071 66.8981 72.8098 + 1061.4 153.4 66.1894 72.8098 + 1061.5 153.73 65.4917 72.7918 + 1061.6 154.059 64.783 72.8058 + 1061.7 154.389 64.0854 72.7958 + 1061.8 154.708 63.3766 72.7898 + 1061.9 155.037 62.6679 72.8058 + 1062 155.356 61.9592 72.8028 + 1062.1 155.676 61.2505 72.8088 + 1062.2 155.984 60.5307 72.8088 + 1062.3 156.262 59.8109 72.8058 + 1062.4 156.52 59.0911 72.7978 + 1062.5 156.746 58.3602 72.7948 + 1062.6 156.921 57.6404 72.7938 + 1062.7 157.066 56.9206 72.7968 + 1062.8 157.158 56.1897 72.8068 + 1062.9 157.22 55.4699 72.8008 + 1063 157.241 54.7501 72.7858 + 1063.1 157.23 54.0414 72.7898 + 1063.2 157.179 53.3548 72.7818 + 1063.3 157.086 52.6571 72.7878 + 1063.4 156.973 51.9927 72.7829 + 1063.5 156.819 51.3283 72.7889 + 1063.6 156.633 50.6971 72.7879 + 1063.7 156.407 50.0769 72.7859 + 1063.8 156.149 49.4789 72.7979 + 1063.9 155.871 48.892 72.8039 + 1064 155.562 48.3494 72.8139 + 1064.1 155.264 47.7957 72.8189 + 1064.2 154.986 47.2088 72.7849 + 1064.3 154.667 46.6551 72.779 + 1064.4 154.348 46.1014 72.765 + 1064.5 154.039 45.5366 72.771 + 1064.6 153.73 44.9497 72.779 + 1064.7 153.442 44.3517 72.78 + 1064.8 153.153 43.7426 72.779 + 1064.9 152.865 43.1225 72.789 + 1065 152.566 42.5134 72.794 + 1065.1 152.278 41.8933 72.785 + 1065.2 151.98 41.2621 72.7981 + 1065.3 151.691 40.6198 72.7991 + 1065.4 151.393 39.9775 72.8011 + 1065.5 151.094 39.3352 72.7941 + 1065.6 150.806 38.6708 72.8011 + 1065.7 150.497 37.9952 72.7931 + 1065.8 150.198 37.3308 72.7981 + 1065.9 149.889 36.6442 72.8021 + 1066 149.581 35.9466 72.8091 + 1066.1 149.282 35.2489 72.7992 + 1066.2 148.963 34.5291 72.8002 + 1066.3 148.654 33.8204 72.8102 + 1066.4 148.335 33.0895 72.8092 + 1066.5 148.016 32.3475 72.8092 + 1066.6 147.707 31.6167 72.8212 + 1066.7 147.388 30.8747 72.8302 + 1066.8 147.068 30.1328 72.8212 + 1066.9 146.739 29.3797 72.8392 + 1067 146.42 28.6156 72.8303 + 1067.1 146.09 27.8515 72.8383 + 1067.2 145.761 27.0874 72.8443 + 1067.3 145.431 26.3122 72.8473 + 1067.4 145.092 25.526 72.8463 + 1067.5 144.762 24.7397 72.8443 + 1067.6 144.422 23.9535 72.8443 + 1067.7 144.093 23.1451 72.8483 + 1067.8 143.753 22.3478 72.8343 + 1067.9 143.383 21.5505 72.8244 + 1068 142.981 20.7642 72.8184 + 1068.1 142.579 20.0001 72.8034 + 1068.2 142.157 19.2581 72.8144 + 1068.3 141.704 18.5383 72.8154 + 1068.4 141.22 17.8518 72.8134 + 1068.5 140.706 17.2095 72.8344 + 1068.6 140.17 16.5893 72.8404 + 1068.7 139.625 16.0024 72.8335 + 1068.8 139.058 15.4598 72.8325 + 1068.9 138.461 14.9504 72.8395 + 1069 137.864 14.4853 72.8445 + 1069.1 137.246 14.0534 72.8435 + 1069.2 136.618 13.6658 72.8385 + 1069.3 135.969 13.3003 72.8475 + 1069.4 135.321 12.9681 72.8536 + 1069.5 134.682 12.6248 72.8476 + 1069.6 134.013 12.3037 72.8496 + 1069.7 133.354 11.9936 72.8446 + 1069.8 132.675 11.7057 72.8496 + 1069.9 131.985 11.4177 72.8516 + 1070 131.295 11.1187 72.8516 + 1070.1 130.605 10.8197 72.8487 + 1070.2 129.915 10.5318 72.8337 + 1070.3 129.215 10.2217 72.8327 + 1070.4 128.505 9.93381 72.8427 + 1070.5 127.805 9.66803 72.8017 + 1070.6 127.105 9.38011 72.7507 + 1070.7 126.415 9.10325 72.6687 + 1070.8 125.746 8.8264 72.5768 + 1070.9 125.087 8.56062 72.4198 + 1071 124.417 8.2727 72.2108 + 1071.1 123.789 8.00692 71.9628 + 1071.2 123.213 7.76329 71.6958 + 1071.3 122.636 7.50858 71.3818 + 1071.4 122.049 7.26495 71.0808 + 1071.5 121.504 7.02132 70.7258 + 1071.6 120.989 6.79984 70.3458 + 1071.7 120.515 6.57836 69.9779 + 1071.8 120.052 6.36795 69.5929 + 1071.9 119.609 6.16862 69.2069 + 1072 119.197 5.95821 68.8119 + 1072.1 118.796 5.78102 68.4189 + 1072.2 118.404 5.60384 68.0169 + 1072.3 118.013 5.43773 67.6249 + 1072.4 117.642 5.26054 67.2299 + 1072.5 117.272 5.08336 66.8349 + 1072.6 116.911 4.90617 66.4719 + 1072.7 116.572 4.75113 66.1119 + 1072.8 116.242 4.5961 65.7529 + 1072.9 115.913 4.42998 65.4229 + 1073 115.604 4.28602 65.089 + 1073.1 115.295 4.13099 64.751 + 1073.2 114.996 3.9981 64.448 + 1073.3 114.687 3.84306 64.13 + 1073.4 114.399 3.72124 63.816 + 1073.5 114.131 3.6105 63.534 + 1073.6 113.905 3.52191 63.253 + 1073.7 113.689 3.43332 62.95 + 1073.8 113.493 3.33365 62.67 + 1073.9 113.318 3.25613 62.41 + 1074 113.143 3.16754 62.135 + 1074.1 112.989 3.1011 61.877 + 1074.2 112.865 3.03465 61.679 + 1074.3 112.731 2.97928 61.547 + 1074.4 112.597 2.91284 61.439 + 1074.5 112.443 2.85747 61.341 + 1074.6 112.288 2.8021 61.254 + 1074.7 112.144 2.73565 61.206 + 1074.8 111.98 2.65813 61.165 + 1074.9 111.815 2.59169 61.149 + 1075 111.629 2.52524 61.149 + 1075.1 111.444 2.44773 61.204 + 1075.2 111.228 2.35913 61.249 + 1075.3 110.991 2.27054 61.276 + 1075.4 110.734 2.17087 61.312 + 1075.5 110.456 2.06013 61.35 + 1075.6 110.157 1.92725 61.396 + 1075.7 109.848 1.80543 61.4141 + 1075.8 109.509 1.67254 61.4241 + 1075.9 109.148 1.51751 61.4471 + 1076 108.767 1.37354 61.4481 + 1076.1 108.376 1.20743 61.4421 + 1076.2 107.964 1.04132 61.4481 + 1076.3 107.532 0.853062 61.4491 + 1076.4 107.079 0.675877 61.4491 + 1076.5 106.615 0.487618 61.4471 + 1076.6 106.121 0.288285 61.4551 + 1076.7 105.627 0.0778777 61.4361 + 1076.8 105.112 -0.121455 61.4411 + 1076.9 104.577 -0.342936 61.4491 + 1077 104.031 -0.564418 61.4372 + 1077.1 103.465 -0.785899 61.4312 + 1077.2 102.898 -1.01845 61.4282 + 1077.3 102.301 -1.26208 61.4352 + 1077.4 101.714 -1.50571 61.4252 + 1077.5 101.097 -1.74934 61.4202 + 1077.6 100.469 -2.01512 61.4202 + 1077.7 99.8406 -2.26982 61.4262 + 1077.8 99.1919 -2.54667 61.4112 + 1077.9 98.533 -2.81245 61.4012 + 1078 97.874 -3.0893 61.4012 + 1078.1 97.1945 -3.37722 61.4013 + 1078.2 96.5047 -3.65408 61.3963 + 1078.3 95.8148 -3.95307 61.4023 + 1078.4 95.1044 -4.241 61.3953 + 1078.5 94.394 -4.55107 61.3943 + 1078.6 93.6733 -4.85007 61.3853 + 1078.7 92.9526 -5.14907 61.3893 + 1078.8 92.2215 -5.47022 61.3933 + 1078.9 91.4802 -5.78029 61.3873 + 1079 90.7389 -6.09036 61.3884 + 1079.1 89.9873 -6.42258 61.3804 + 1079.2 89.2254 -6.74373 61.3804 + 1079.3 88.4532 -7.06488 61.3774 + 1079.4 87.6707 -7.40817 61.3734 + 1079.5 86.8882 -7.74039 61.3734 + 1079.6 86.0954 -8.08369 61.3714 + 1079.7 85.2923 -8.41591 61.3724 + 1079.8 84.4892 -8.7592 61.3724 + 1079.9 83.6862 -9.11357 61.3724 + 1080 82.8625 -9.46794 61.3685 + 1080.1 82.0388 -9.81123 61.3735 + 1080.2 81.2254 -10.1767 61.3845 + 1080.3 80.3914 -10.52 61.3835 + 1080.4 79.5575 -10.8854 61.3795 + 1080.5 78.7235 -11.2509 61.3805 + 1080.6 77.8895 -11.6052 61.3975 + 1080.7 77.0555 -11.9707 61.3935 + 1080.8 76.2112 -12.325 61.3915 + 1080.9 75.367 -12.6905 61.4055 + 1081 74.5227 -13.0559 61.4086 + 1081.1 73.6784 -13.4214 61.4006 + 1081.2 72.8239 -13.7868 61.4106 + 1081.3 71.9796 -14.1633 61.4126 + 1081.4 71.125 -14.5288 61.4136 + 1081.5 70.2602 -14.8942 61.4146 + 1081.6 69.4159 -15.2596 61.4126 + 1081.7 68.5407 -15.6362 61.4096 + 1081.8 67.6861 -16.0127 61.4066 + 1081.9 66.811 -16.3781 61.4056 + 1082 65.9358 -16.7546 61.4226 + 1082.1 65.0607 -17.1311 61.4206 + 1082.2 64.1958 -17.5077 61.4367 + 1082.3 63.3206 -17.8731 61.4417 + 1082.4 62.4558 -18.2496 61.4407 + 1082.5 61.5909 -18.6151 61.4327 + 1082.6 60.7157 -18.9805 61.4397 + 1082.7 59.8612 -19.357 61.4297 + 1082.8 59.0066 -19.7114 61.4387 + 1082.9 58.152 -20.0879 61.4397 + 1083 57.2975 -20.4423 61.4377 + 1083.1 56.4429 -20.8077 61.4537 + 1083.2 55.5883 -21.1731 61.4417 + 1083.3 54.744 -21.5386 61.4467 + 1083.4 53.8998 -21.904 61.4407 + 1083.5 53.0555 -22.2584 61.4367 + 1083.6 52.2112 -22.6238 61.4367 + 1083.7 51.3772 -22.9782 61.4308 + 1083.8 50.5433 -23.3326 61.4408 + 1083.9 49.7299 -23.6869 61.4578 + 1084 48.9165 -24.0413 61.4628 + 1084.1 48.1134 -24.3846 61.4638 + 1084.2 47.3309 -24.7168 61.4688 + 1084.3 46.5587 -25.0379 61.4968 + 1084.4 45.8792 -25.3259 61.4968 + 1084.5 45.2202 -25.6027 61.4718 + 1084.6 44.5819 -25.8796 61.4858 + 1084.7 44.0053 -26.1232 61.4808 + 1084.8 43.4802 -26.3447 61.4878 + 1084.9 43.0169 -26.544 61.4968 + 1085 42.605 -26.7212 61.4958 + 1085.1 42.2344 -26.8984 61.4958 + 1085.2 41.9049 -27.0313 61.4908 + 1085.3 41.6063 -27.1641 61.4938 + 1085.4 41.3489 -27.286 61.4888 + 1085.5 41.1121 -27.3856 61.4858 + 1085.6 40.9062 -27.4853 61.4778 + 1085.7 40.7312 -27.5739 61.4648 + 1085.8 40.5664 -27.6403 61.4638 + 1085.9 40.4223 -27.7068 61.4608 + 1086 40.2884 -27.7621 61.4678 + 1086.1 40.1752 -27.8064 61.4668 + 1086.2 40.0722 -27.8397 61.4708 + 1086.3 39.9898 -27.8729 61.4698 + 1086.4 39.9075 -27.895 61.4758 + 1086.5 39.8354 -27.9061 61.4768 + 1086.6 39.7736 -27.9172 61.4638 + 1086.7 39.7221 -27.895 61.4388 + 1086.8 39.681 -27.9061 61.4428 + 1086.9 39.6295 -27.895 61.4438 + 1087 39.578 -27.8618 61.4338 + 1087.1 39.5265 -27.8175 61.4188 + 1087.2 39.4647 -27.7621 61.4048 + 1087.3 39.403 -27.6846 61.4148 + 1087.4 39.3206 -27.585 61.4018 + 1087.5 39.2382 -27.4631 61.4218 + 1087.6 39.1456 -27.3192 61.4208 + 1087.7 39.0323 -27.1531 61.4258 + 1087.8 38.919 -26.9648 61.4348 + 1087.9 38.7955 -26.7655 61.4318 + 1088 38.6616 -26.544 61.4178 + 1088.1 38.5072 -26.3004 61.4278 + 1088.2 38.3631 -26.0568 61.4318 + 1088.3 38.2086 -25.791 61.4398 + 1088.4 38.0439 -25.5031 61.4398 + 1088.5 37.8688 -25.2041 61.4358 + 1088.6 37.6835 -24.894 61.4338 + 1088.7 37.4982 -24.5729 61.4398 + 1088.8 37.3026 -24.2407 61.4308 + 1088.9 37.0966 -23.8863 61.4378 + 1089 36.8907 -23.5209 61.4328 + 1089.1 36.6642 -23.1443 61.4409 + 1089.2 36.4377 -22.7568 61.4429 + 1089.3 36.2112 -22.3581 61.4489 + 1089.4 35.9744 -21.9484 61.4529 + 1089.5 35.7273 -21.5276 61.4469 + 1089.6 35.4699 -21.0957 61.4519 + 1089.7 35.2125 -20.6638 61.4549 + 1089.8 34.9551 -20.2098 61.4549 + 1089.9 34.6874 -19.7557 61.4589 + 1090 34.4197 -19.2906 61.4639 + 1090.1 34.1417 -18.8255 61.4579 + 1090.2 33.8637 -18.3383 61.4619 + 1090.3 33.5651 -17.851 61.4639 + 1090.4 33.2768 -17.3527 61.4619 + 1090.5 32.9885 -16.8544 61.4639 + 1090.6 32.6899 -16.345 61.4679 + 1090.7 32.381 -15.8356 61.4679 + 1090.8 32.0722 -15.3151 61.4689 + 1090.9 31.7633 -14.7836 61.4769 + 1091 31.4544 -14.252 61.4809 + 1091.1 31.1352 -13.7205 61.4779 + 1091.2 30.8057 -13.1779 61.4789 + 1091.3 30.4866 -12.6242 61.4809 + 1091.4 30.1571 -12.0816 61.4769 + 1091.5 29.8276 -11.5168 61.4839 + 1091.6 29.4981 -10.9631 61.4789 + 1091.7 29.1584 -10.3983 61.4849 + 1091.8 28.8186 -9.83357 61.4899 + 1091.9 28.4788 -9.25773 61.4869 + 1092 28.1391 -8.69296 61.4939 + 1092.1 27.789 -8.11712 61.5019 + 1092.2 27.4389 -7.53021 61.5019 + 1092.3 27.0889 -6.95437 61.5019 + 1092.4 26.7388 -6.36745 61.5009 + 1092.5 26.3784 -5.78054 61.5129 + 1092.6 26.0284 -5.19362 61.5129 + 1092.7 25.668 -4.59563 61.5159 + 1092.8 25.3076 -3.99765 61.5209 + 1092.9 24.9473 -3.39966 61.523 + 1093 24.5869 -2.7906 61.52 + 1093.1 24.2163 -2.19261 61.52 + 1093.2 23.8559 -1.58355 61.512 + 1093.3 23.4852 -0.974483 61.526 + 1093.4 23.1146 -0.354347 61.525 + 1093.5 22.7439 0.254716 61.527 + 1093.6 22.363 0.885926 61.521 + 1093.7 21.9923 1.50606 61.519 + 1093.8 21.6114 2.1262 61.523 + 1093.9 21.2304 2.75741 61.525 + 1094 20.8597 3.38862 61.518 + 1094.1 20.4685 4.01983 61.516 + 1094.2 20.0875 4.65104 61.512 + 1094.3 19.7066 5.28225 61.514 + 1094.4 19.3153 5.92453 61.505 + 1094.5 18.9344 6.55574 61.511 + 1094.6 18.5431 7.19803 61.513 + 1094.7 18.1519 7.84031 61.51 + 1094.8 17.7606 8.48259 61.503 + 1094.9 17.3797 9.12488 61.503 + 1095 16.9884 9.75609 61.49 + 1095.1 16.5972 10.4094 61.506 + 1095.2 16.2059 11.0407 61.501 + 1095.3 15.825 11.6829 61.49 + 1095.4 15.4337 12.3363 61.487 + 1095.5 15.0528 12.9786 61.494 + 1095.6 14.6615 13.6098 61.493 + 1095.7 14.2703 14.2632 61.488 + 1095.8 13.879 14.9054 61.481 + 1095.9 13.4775 15.5588 61.478 + 1096 13.0862 16.2011 61.479 + 1096.1 12.695 16.8544 61.486 + 1096.2 12.3037 17.4967 61.484 + 1096.3 11.9022 18.1612 61.485 + 1096.4 11.5109 18.8145 61.485 + 1096.5 11.1094 19.4679 61.482 + 1096.6 10.7181 20.1212 61.481 + 1096.7 10.3166 20.7746 61.477 + 1096.8 9.91506 21.4501 61.467 + 1096.9 9.52381 22.1034 61.472 + 1097 9.12227 22.7679 61.472 + 1097.1 8.72072 23.4323 61.469 + 1097.2 8.31918 24.0967 61.4619 + 1097.3 7.90734 24.7722 61.4549 + 1097.4 7.50579 25.4367 61.4649 + 1097.5 7.09395 26.1122 61.4549 + 1097.6 6.68211 26.7877 61.4589 + 1097.7 6.27027 27.4632 61.4649 + 1097.8 5.84813 28.1498 61.4679 + 1097.9 5.44659 28.8253 61.4589 + 1098 5.02445 29.5119 61.4609 + 1098.1 4.61261 30.1984 61.4549 + 1098.2 4.20077 30.8961 61.4519 + 1098.3 3.77863 31.5827 61.4589 + 1098.4 3.3565 32.2803 61.4569 + 1098.5 2.93436 32.978 61.4609 + 1098.6 2.50193 33.6867 61.4529 + 1098.7 2.07979 34.3954 61.4619 + 1098.8 1.65766 35.1042 61.4689 + 1098.9 1.22522 35.8129 61.4689 + 1099 0.792792 36.5327 61.4789 + 1099.1 0.350064 37.2525 61.4759 + 1099.2 -0.082368 37.9723 61.4679 + 1099.3 -0.5148 38.7032 61.4759 + 1099.4 -0.947232 39.423 61.4759 + 1099.5 -1.38996 40.1539 61.4869 + 1099.6 -1.83269 40.8847 61.4879 + 1099.7 -2.28571 41.6156 61.4919 + 1099.8 -2.71814 42.3465 61.4879 + 1099.9 -3.17117 43.0884 61.4929 + 1100 -3.6139 43.8304 61.4988 + 1100.1 -4.06692 44.5613 61.5058 + 1100.2 -4.51994 45.3143 61.5088 + 1100.3 -4.96267 46.0673 61.5058 + 1100.4 -5.42599 46.8203 61.5078 + 1100.5 -5.88931 47.5844 61.5158 + 1100.6 -6.34233 48.3374 61.5018 + 1100.7 -6.80565 49.1015 61.5278 + 1100.8 -7.26897 49.8767 61.5198 + 1100.9 -7.73229 50.6408 61.5188 + 1101 -8.19561 51.416 61.5228 + 1101.1 -8.65893 52.2022 61.5218 + 1101.2 -9.14284 52.9885 61.5238 + 1101.3 -9.61646 53.7747 61.5238 + 1101.4 -10.0901 54.561 61.5168 + 1101.5 -10.5534 55.3472 61.5267 + 1101.6 -11.0373 56.1445 61.5257 + 1101.7 -11.5109 56.9418 61.5197 + 1101.8 -11.9845 57.7392 61.5297 + 1101.9 -12.4684 58.5254 61.5217 + 1102 -12.9421 59.3227 61.5207 + 1102.1 -13.426 60.12 61.5197 + 1102.2 -13.9099 60.9174 61.5137 + 1102.3 -14.3835 61.7258 61.5107 + 1102.4 -14.8674 62.512 61.5067 + 1102.5 -15.3513 63.3204 61.5057 + 1102.6 -15.8352 64.1177 61.5067 + 1102.7 -16.3191 64.9261 61.5056 + 1102.8 -16.803 65.7234 61.5106 + 1102.9 -17.287 66.5318 61.5006 + 1103 -17.7709 67.3402 61.5146 + 1103.1 -18.2651 68.1486 61.5096 + 1103.2 -18.749 68.957 61.5096 + 1103.3 -19.2329 69.7654 61.5046 + 1103.4 -19.7168 70.5738 61.5086 + 1103.5 -20.211 71.3822 61.5076 + 1103.6 -20.6949 72.1906 61.5156 + 1103.7 -21.1788 72.999 61.5115 + 1103.8 -21.6627 73.8184 61.5065 + 1103.9 -22.1569 74.6268 61.5045 + 1104 -22.6511 75.4463 61.5045 + 1104.1 -23.1351 76.2658 61.5075 + 1104.2 -23.6293 77.0852 61.4935 + 1104.3 -24.1235 77.9047 61.4955 + 1104.4 -24.6177 78.7242 61.5005 + 1104.5 -25.1119 79.5547 61.4985 + 1104.6 -25.6061 80.3852 61.4874 + 1104.7 -26.1003 81.2047 61.4824 + 1104.8 -26.6048 82.0353 61.4884 + 1104.9 -27.0887 82.8547 61.4854 + 1105 -27.5726 83.6853 61.4914 + 1105.1 -28.0771 84.5047 61.4934 + 1105.2 -28.561 85.3131 61.4954 + 1105.3 -29.0449 86.1215 61.5033 + 1105.4 -29.5185 86.9299 61.4993 + 1105.5 -29.9819 87.7272 61.5113 + 1105.6 -30.4658 88.5246 61.5063 + 1105.7 -30.9291 89.2997 61.5093 + 1105.8 -31.3821 90.086 61.4973 + 1105.9 -31.8248 90.8833 61.5033 + 1106 -32.2367 91.6806 61.5023 + 1106.1 -32.6279 92.4779 61.4832 + 1106.2 -32.9986 93.2863 61.4982 + 1106.3 -33.328 94.0947 61.4842 + 1106.4 -33.6163 94.9031 61.4832 + 1106.5 -33.8531 95.7226 61.4722 + 1106.6 -34.059 96.5531 61.4882 + 1106.7 -34.2135 97.3615 61.4842 + 1106.8 -34.3267 98.1699 61.4841 + 1106.9 -34.3885 98.9783 61.4921 + 1107 -34.4194 99.7756 61.4891 + 1107.1 -34.3988 100.562 61.4961 + 1107.2 -34.337 101.326 61.4901 + 1107.3 -34.2238 102.09 61.5001 + 1107.4 -34.0899 102.832 61.5111 + 1107.5 -33.8943 103.552 61.5161 + 1107.6 -33.6678 104.249 61.5261 + 1107.7 -33.4104 104.925 61.527 + 1107.8 -33.1118 105.567 61.543 + 1107.9 -32.772 106.176 61.542 + 1108 -32.4014 106.752 61.553 + 1108.1 -31.9998 107.284 61.555 + 1108.2 -31.5674 107.793 61.556 + 1108.3 -31.1144 108.258 61.568 + 1108.4 -30.6408 108.679 61.574 + 1108.5 -30.1363 109.067 61.574 + 1108.6 -29.6318 109.421 61.574 + 1108.7 -29.0964 109.72 61.589 + 1108.8 -28.561 109.975 61.591 + 1108.9 -28.005 110.185 61.585 + 1109 -27.449 110.34 61.598 + 1109.1 -26.893 110.462 61.597 + 1109.2 -26.3473 110.55 61.596 + 1109.3 -25.812 110.65 61.619 + 1109.4 -25.2663 110.772 61.581 + 1109.5 -24.7103 110.838 61.585 + 1109.6 -24.144 110.916 61.56 + 1109.7 -23.5777 110.993 61.547 + 1109.8 -23.0012 111.104 61.554 + 1109.9 -22.4246 111.226 61.583 + 1110 -21.8377 111.348 61.598 + 1110.1 -21.2508 111.47 61.605 + 1110.2 -20.6434 111.602 61.592 + 1110.3 -20.0462 111.735 61.593 + 1110.4 -19.4388 111.868 61.603 + 1110.5 -18.821 112.012 61.607 + 1110.6 -18.2135 112.156 61.619 + 1110.7 -17.5958 112.322 61.614 + 1110.8 -16.9677 112.477 61.624 + 1110.9 -16.3397 112.621 61.626 + 1111 -15.7013 112.787 61.625 + 1111.1 -15.0527 112.953 61.645 + 1111.2 -14.404 113.131 61.635 + 1111.3 -13.7554 113.297 61.649 + 1111.4 -13.1067 113.474 61.639 + 1111.5 -12.4375 113.651 61.631 + 1111.6 -11.7786 113.839 61.638 + 1111.7 -11.1093 114.028 61.637 + 1111.8 -10.4298 114.205 61.637 + 1111.9 -9.73997 114.371 61.638 + 1112 -9.03984 114.515 61.628 + 1112.1 -8.33972 114.615 61.627 + 1112.2 -7.64989 114.703 61.632 + 1112.3 -6.97036 114.747 61.657 + 1112.4 -6.27023 114.747 61.667 + 1112.5 -5.601 114.703 61.679 + 1112.6 -4.94206 114.615 61.688 + 1112.7 -4.30371 114.482 61.686 + 1112.8 -3.68595 114.327 61.685 + 1112.9 -3.08879 114.138 61.712 + 1113 -2.46073 114.006 61.697 + 1113.1 -1.85327 113.817 61.67 + 1113.2 -1.25611 113.596 61.666 + 1113.3 -0.648645 113.385 61.654 + 1113.4 -0.0308879 113.175 61.662 + 1113.5 0.586869 112.987 61.667 + 1113.6 1.22522 112.798 61.669 + 1113.7 1.86357 112.588 61.665 + 1113.8 2.50192 112.4 61.667 + 1113.9 3.14027 112.2 61.664 + 1114 3.78891 112.012 61.668 + 1114.1 4.44785 111.824 61.666 + 1114.2 5.10679 111.647 61.67 + 1114.3 5.78633 111.47 61.667 + 1114.4 6.46586 111.292 61.677 + 1114.5 7.14539 111.104 61.674 + 1114.6 7.84552 110.938 61.687 + 1114.7 8.53535 110.75 61.686 + 1114.8 9.23547 110.573 61.69 + 1114.9 9.94589 110.395 61.694 + 1115 10.6666 110.229 61.702 + 1115.1 11.3873 110.085 61.697 + 1115.2 12.108 109.975 61.689 + 1115.3 12.8494 109.831 61.719 + 1115.4 13.601 109.653 61.706 + 1115.5 14.3526 109.51 61.677 + 1115.6 15.0939 109.377 61.7 + 1115.7 15.8249 109.211 61.7 + 1115.8 16.5662 109 61.716 + 1115.9 17.2869 108.779 61.717 + 1116 17.9973 108.524 61.73 + 1116.1 18.6975 108.247 61.73 + 1116.2 19.3873 107.948 61.7321 + 1116.3 20.0565 107.627 61.7311 + 1116.4 20.7052 107.284 61.7341 + 1116.5 21.3332 106.896 61.7291 + 1116.6 21.9201 106.486 61.7371 + 1116.7 22.507 106.066 61.7391 + 1116.8 23.0732 105.645 61.7431 + 1116.9 23.6292 105.18 61.7291 + 1117 24.1646 104.715 61.7271 + 1117.1 24.7 104.261 61.7221 + 1117.2 25.256 103.795 61.6981 + 1117.3 25.7914 103.308 61.6801 + 1117.4 26.3371 102.821 61.6761 + 1117.5 26.9033 102.345 61.6811 + 1117.6 27.4799 101.869 61.6791 + 1117.7 28.0565 101.381 61.6851 + 1117.8 28.6537 100.905 61.6811 + 1117.9 29.2405 100.418 61.6761 + 1118 29.8377 99.9196 61.6741 + 1118.1 30.4452 99.4212 61.6721 + 1118.2 31.0526 98.9229 61.6732 + 1118.3 31.6704 98.4246 61.6652 + 1118.4 32.2984 97.9152 61.6662 + 1118.5 32.9368 97.4058 61.6562 + 1118.6 33.5854 96.8853 61.6412 + 1118.7 34.2444 96.3538 61.6402 + 1118.8 34.9136 95.8222 61.6352 + 1118.9 35.6034 95.2796 61.6312 + 1119 36.3036 94.7259 61.6342 + 1119.1 37.0037 94.1612 61.6342 + 1119.2 37.7141 93.5964 61.6352 + 1119.3 38.4348 93.0206 61.6482 + 1119.4 39.1761 92.4336 61.6342 + 1119.5 39.9175 91.8467 61.6472 + 1119.6 40.6588 91.2598 61.6482 + 1119.7 41.4207 90.6618 61.6462 + 1119.8 42.1826 90.0528 61.6482 + 1119.9 42.9548 89.4437 61.6552 + 1120 43.727 88.8347 61.6592 + 1120.1 44.4992 88.2145 61.6612 + 1120.2 45.2817 87.5944 61.6632 + 1120.3 46.0642 86.9742 61.6762 + 1120.4 46.8467 86.3541 61.6732 + 1120.5 47.6292 85.734 61.6802 + 1120.6 48.4219 85.1138 61.6842 + 1120.7 49.2044 84.4937 61.6732 + 1120.8 49.9869 83.8736 61.6902 + 1120.9 50.7694 83.2534 61.6823 + 1121 51.5622 82.6333 61.6873 + 1121.1 52.3447 82.0242 61.6933 + 1121.2 53.1169 81.4152 61.6993 + 1121.3 53.8994 80.7951 61.7113 + 1121.4 54.6613 80.186 61.7183 + 1121.5 55.4335 79.588 61.7093 + 1121.6 56.1851 78.99 61.7253 + 1121.7 56.947 78.4031 61.7223 + 1121.8 57.6883 77.8273 61.7253 + 1121.9 58.4194 77.2404 61.7133 + 1122 59.1607 76.6645 61.7163 + 1122.1 59.8917 76.0998 61.7053 + 1122.2 60.6124 75.535 61.7043 + 1122.3 61.3331 74.9702 61.6993 + 1122.4 62.0436 74.4055 61.7043 + 1122.5 62.7643 73.8407 61.6993 + 1122.6 63.4747 73.287 61.6993 + 1122.7 64.1851 72.7333 61.6853 + 1122.8 64.8956 72.1686 61.6883 + 1122.9 65.5957 71.6149 61.6753 + 1123 66.3061 71.0612 61.6703 + 1123.1 67.0062 70.5075 61.6633 + 1123.2 67.6961 69.9649 61.6713 + 1123.3 68.3859 69.4222 61.6743 + 1123.4 69.086 68.8796 61.6673 + 1123.5 69.7759 68.3259 61.6533 + 1123.6 70.4554 67.7944 61.6592 + 1123.7 71.1452 67.2518 61.6522 + 1123.8 71.8248 66.7092 61.6602 + 1123.9 72.5043 66.1665 61.6492 + 1124 73.1838 65.635 61.6522 + 1124.1 73.8634 65.0924 61.6582 + 1124.2 74.5429 64.5608 61.6532 + 1124.3 75.2122 64.0293 61.6572 + 1124.4 75.8814 63.5088 61.6562 + 1124.5 76.5609 62.9773 61.6532 + 1124.6 77.2199 62.4457 61.6502 + 1124.7 77.8891 61.9142 61.6482 + 1124.8 78.5481 61.3827 61.6502 + 1124.9 79.2173 60.8733 61.6392 + 1125 79.8763 60.3417 61.6462 + 1125.1 80.5352 59.8213 61.6362 + 1125.2 81.1942 59.3008 61.6392 + 1125.3 81.8531 58.7803 61.6292 + 1125.4 82.512 58.2488 61.6262 + 1125.5 83.171 57.7283 61.6262 + 1125.6 83.8402 57.1968 61.6262 + 1125.7 84.4992 56.6763 61.6232 + 1125.8 85.1581 56.1448 61.6242 + 1125.9 85.8274 55.6132 61.6192 + 1126 86.4863 55.0817 61.6192 + 1126.1 87.1659 54.5501 61.6102 + 1126.2 87.8351 54.0075 61.5972 + 1126.3 88.5146 53.476 61.6042 + 1126.4 89.2045 52.9223 61.5922 + 1126.5 89.8943 52.3686 61.5772 + 1126.6 90.5841 51.8038 61.5911 + 1126.7 91.2843 51.2169 61.5941 + 1126.8 91.9844 50.6411 61.5871 + 1126.9 92.6948 50.032 61.5911 + 1127 93.4053 49.423 61.5911 + 1127.1 94.1157 48.8028 61.5811 + 1127.2 94.8364 48.1827 61.5801 + 1127.3 95.5571 47.5515 61.5891 + 1127.4 96.2779 46.9203 61.5931 + 1127.5 97.0089 46.278 61.5971 + 1127.6 97.7399 45.6247 61.5811 + 1127.7 98.4812 44.9824 61.5931 + 1127.8 99.2122 44.329 61.5921 + 1127.9 99.9432 43.6757 61.5931 + 1128 100.674 43.0223 61.6011 + 1128.1 101.385 42.3247 61.5851 + 1128.2 102.064 41.627 61.588 + 1128.3 102.733 40.9294 61.594 + 1128.4 103.362 40.2096 61.597 + 1128.5 103.938 39.4676 61.597 + 1128.6 104.494 38.7035 61.596 + 1128.7 104.999 37.9394 61.599 + 1128.8 105.452 37.1643 61.603 + 1128.9 105.863 36.367 61.585 + 1129 106.234 35.5807 61.589 + 1129.1 106.564 34.7834 61.592 + 1129.2 106.852 33.9861 61.579 + 1129.3 107.099 33.1777 61.579 + 1129.4 107.295 32.3914 61.58 + 1129.5 107.449 31.5941 61.579 + 1129.6 107.562 30.7968 61.572 + 1129.7 107.634 30.0106 61.573 + 1129.8 107.665 29.2354 61.573 + 1129.9 107.645 28.4602 61.568 + 1130 107.583 27.7183 61.573 + 1130.1 107.48 26.9763 61.577 + 1130.2 107.336 26.2565 61.577 + 1130.3 107.171 25.5699 61.565 + 1130.4 106.955 24.8944 61.5621 + 1130.5 106.718 24.2521 61.5541 + 1130.6 106.44 23.6431 61.5561 + 1130.7 106.142 23.0562 61.5601 + 1130.8 105.802 22.5025 61.5561 + 1130.9 105.441 21.982 61.5671 + 1131 105.061 21.5058 61.5681 + 1131.1 104.649 21.0407 61.5731 + 1131.2 104.216 20.6199 61.5581 + 1131.3 103.743 20.2102 61.5561 + 1131.4 103.259 19.8226 61.5441 + 1131.5 102.713 19.4571 61.5401 + 1131.6 102.157 19.0917 61.5272 + 1131.7 101.55 18.7484 61.5352 + 1131.8 100.922 18.4051 61.5302 + 1131.9 100.263 18.0507 61.5252 + 1132 99.5728 17.7074 61.5302 + 1132.1 98.8623 17.3641 61.5252 + 1132.2 98.121 17.0319 61.5322 + 1132.3 97.3694 16.6886 61.5322 + 1132.4 96.5972 16.3453 61.5202 + 1132.5 95.7941 16.0131 61.5243 + 1132.6 94.9807 15.6698 61.5323 + 1132.7 94.1468 15.3265 61.5283 + 1132.8 93.2922 14.9943 61.5333 + 1132.9 92.4273 14.6399 61.5223 + 1133 91.5419 14.2966 61.5273 + 1133.1 90.6461 13.9533 61.5373 + 1133.2 89.7401 13.61 61.5424 + 1133.3 88.8134 13.2557 61.5384 + 1133.4 87.8868 12.9124 61.5424 + 1133.5 86.9499 12.558 61.5514 + 1133.6 85.9923 12.2036 61.5544 + 1133.7 85.0451 11.8382 61.5514 + 1133.8 84.0773 11.4838 61.5664 + 1133.9 83.0992 11.1295 61.5584 + 1134 82.1211 10.764 61.5665 + 1134.1 81.1223 10.3986 61.5655 + 1134.2 80.1236 10.0331 61.5725 + 1134.3 79.1146 9.66769 61.5805 + 1134.4 78.0953 9.30225 61.5885 + 1134.5 77.0863 8.93681 61.6015 + 1134.6 76.0567 8.56029 61.6015 + 1134.7 75.0271 8.19485 61.6136 + 1134.8 73.9975 7.81833 61.6116 + 1134.9 72.9576 7.44181 61.6296 + 1135 71.9177 7.0653 61.6276 + 1135.1 70.8572 6.67771 61.6366 + 1135.2 69.7967 6.30119 61.6476 + 1135.3 68.7465 5.9136 61.6526 + 1135.4 67.6758 5.52601 61.6556 + 1135.5 66.605 5.13842 61.6637 + 1135.6 65.5445 4.7619 61.6837 + 1135.7 64.4737 4.37431 61.6877 + 1135.8 63.4029 3.98672 61.6857 + 1135.9 62.3321 3.61021 61.6907 + 1136 61.2716 3.22262 61.6787 + 1136.1 60.2112 2.8461 61.6647 + 1136.2 59.1713 2.46959 61.6477 + 1136.3 58.1211 2.09307 61.6257 + 1136.4 57.1018 1.72763 61.5947 + 1136.5 56.0722 1.36219 61.5728 + 1136.6 55.0426 0.985672 61.5488 + 1136.7 54.013 0.631305 61.4968 + 1136.8 52.9936 0.25479 61.4828 + 1136.9 51.964 -0.110651 61.4648 + 1137 50.9447 -0.476093 61.4448 + 1137.1 49.9048 -0.852607 61.4548 + 1137.2 48.8649 -1.21805 61.4488 + 1137.3 47.825 -1.59456 61.4608 + 1137.4 46.7851 -1.97108 61.4598 + 1137.5 45.7453 -2.34759 61.4708 + 1137.6 44.7157 -2.71303 61.4928 + 1137.7 43.7066 -3.08955 61.5138 + 1137.8 42.6976 -3.43284 61.5429 + 1137.9 41.7195 -3.79828 61.5649 + 1138 40.7929 -4.11943 61.5689 + 1138.1 39.8971 -4.44057 61.5699 + 1138.2 39.0014 -4.76171 61.5519 + 1138.3 38.1468 -5.07179 61.4969 + 1138.4 37.3231 -5.37078 61.4069 + 1138.5 36.5509 -5.64763 61.3029 + 1138.6 35.8096 -5.93555 61.1759 + 1138.7 35.0786 -6.20133 61.0009 + 1138.8 34.3887 -6.4671 60.7889 + 1138.9 33.7298 -6.7218 60.5569 + 1139 33.112 -6.96543 60.2959 + 1139.1 32.5252 -7.20905 60.0409 + 1139.2 31.9692 -7.44161 59.7419 + 1139.3 31.4544 -7.66308 59.4459 + 1139.4 30.9705 -7.87349 59.1539 + 1139.5 30.5277 -8.08389 58.8369 + 1139.6 30.1262 -8.27215 58.5229 + 1139.7 29.7452 -8.4604 58.2079 + 1139.8 29.4055 -8.63759 57.8769 + 1139.9 29.0863 -8.79262 57.5509 + 1140 28.798 -8.92551 57.2399 + 1140.1 28.5509 -9.06947 56.8979 + 1140.2 28.3347 -9.21343 56.5869 + 1140.3 28.139 -9.33524 56.2749 + 1140.4 27.964 -9.45705 55.9649 + 1140.5 27.8199 -9.55672 55.6819 + 1140.6 27.6963 -9.66745 55.3629 + 1140.7 27.5933 -9.76712 55.0669 + 1140.8 27.5007 -9.85571 54.7729 + 1140.9 27.4183 -9.93323 54.4779 + 1141 27.3462 -9.99967 54.1829 + 1141.1 27.2845 -10.0661 53.8949 + 1141.2 27.233 -10.1215 53.6039 + 1141.3 27.1918 -10.1658 53.2989 + 1141.4 27.1403 -10.2101 53.0129 + 1141.5 27.0991 -10.2544 52.7249 + 1141.6 27.0682 -10.2987 52.4359 + 1141.7 27.0476 -10.343 52.1549 + 1141.8 27.0168 -10.3762 51.8649 + 1141.9 26.9962 -10.4094 51.5739 + 1142 26.9859 -10.4426 51.2699 + 1142.1 26.9756 -10.4758 50.9419 + 1142.2 26.9756 -10.5091 50.6139 + 1142.3 26.9859 -10.5423 50.2949 + 1142.4 27.0064 -10.5644 49.9609 + 1142.5 27.0167 -10.5866 49.6339 + 1142.6 27.0373 -10.5976 49.3199 + 1142.7 27.0579 -10.6087 49.0019 + 1142.8 27.0682 -10.6309 48.6859 + 1142.9 27.0785 -10.6419 48.3649 + 1143 27.0991 -10.653 48.0389 + 1143.1 27.0991 -10.6752 47.6959 + 1143.2 27.1094 -10.6862 47.3499 + 1143.3 27.1094 -10.6973 46.9989 + 1143.4 27.1094 -10.7195 46.6499 + 1143.5 27.1094 -10.7305 46.2739 + 1143.6 27.0991 -10.7416 45.8979 + 1143.7 27.0888 -10.7527 45.5079 + 1143.8 27.0682 -10.7527 45.1079 + 1143.9 27.0579 -10.7748 44.7199 + 1144 27.0476 -10.7748 44.3339 + 1144.1 27.0167 -10.7748 43.9669 + 1144.2 27.0064 -10.7748 43.6209 + 1144.3 27.0064 -10.7748 43.2729 + 1144.4 26.9858 -10.7748 42.9459 + 1144.5 26.9755 -10.7859 42.6169 + 1144.6 26.9549 -10.7859 42.2989 + 1144.7 26.9446 -10.7859 41.9769 + 1144.8 26.9446 -10.7748 41.6469 + 1144.9 26.9446 -10.7637 41.3139 + 1145 26.9343 -10.7527 40.9539 + 1145.1 26.924 -10.7416 40.6069 + 1145.2 26.9137 -10.7194 40.2319 + 1145.3 26.9137 -10.6973 39.8619 + 1145.4 26.924 -10.6752 39.4879 + 1145.5 26.924 -10.653 39.0999 + 1145.6 26.9446 -10.6198 38.7129 + 1145.7 26.9446 -10.6087 38.3099 + 1145.8 26.9446 -10.5866 37.9089 + 1145.9 26.9549 -10.5533 37.5339 + 1146 26.9549 -10.5201 37.1749 + 1146.1 26.9652 -10.498 36.8339 + 1146.2 26.9858 -10.498 36.4969 + 1146.3 26.9961 -10.498 36.1589 + 1146.4 26.9961 -10.498 35.8049 + 1146.5 26.9858 -10.498 35.4809 + 1146.6 26.9858 -10.498 35.1379 + 1146.7 27.0064 -10.509 34.8079 + 1146.8 27.027 -10.5201 34.4519 + 1146.9 27.0373 -10.5312 34.1009 + 1147 27.027 -10.5423 33.7099 + 1147.1 27.0167 -10.5423 33.3199 + 1147.2 27.0167 -10.5533 32.9289 + 1147.3 27.0167 -10.5423 32.5389 + 1147.4 27.0064 -10.5423 32.1349 + 1147.5 27.0064 -10.5423 31.7379 + 1147.6 26.9961 -10.5423 31.3369 + 1147.7 26.9858 -10.5312 30.9339 + 1147.8 26.9755 -10.5201 30.5389 + 1147.9 26.9652 -10.509 30.1369 + 1148 26.9549 -10.4869 29.7449 + 1148.1 26.9343 -10.4647 29.3309 + 1148.2 26.9343 -10.4537 28.9479 + 1148.3 26.924 -10.4426 28.5459 + 1148.4 26.8931 -10.4426 28.1489 + 1148.5 26.8519 -10.4315 27.7889 + 1148.6 26.7901 -10.4426 27.4309 + 1148.7 26.7078 -10.4537 27.1079 + 1148.8 26.6151 -10.4979 26.8159 + 1148.9 26.5018 -10.5312 26.5679 + 1149 26.368 -10.5644 26.3389 + 1149.1 26.2136 -10.6087 26.1599 + 1149.2 26.0488 -10.6751 26.0229 + 1149.3 25.8532 -10.7416 25.9209 + 1149.4 25.637 -10.808 25.8759 + 1149.5 25.4002 -10.8966 25.8449 + 1149.6 25.1222 -10.9852 25.8569 + 1149.7 24.8133 -11.0849 25.8849 + 1149.8 24.4838 -11.2067 25.9109 + 1149.9 24.1235 -11.3396 25.9369 + 1150 23.7528 -11.4614 25.9679 + 1150.1 23.3513 -11.6053 25.9999 + 1150.2 22.9291 -11.7604 26.0199 + 1150.3 22.4864 -11.9043 26.0399 + 1150.4 22.0334 -12.0704 26.056 + 1150.5 21.5598 -12.2255 26.063 + 1150.6 21.0656 -12.4027 26.08 + 1150.7 20.5611 -12.5798 26.087 + 1150.8 20.036 -12.757 26.079 + 1150.9 19.5006 -12.9453 26.087 + 1151 18.9549 -13.1335 26.076 + 1151.1 18.3886 -13.3218 26.067 + 1151.2 17.812 -13.5211 26.082 + 1151.3 17.2252 -13.7315 26.073 + 1151.4 16.628 -13.9308 26.055 + 1151.5 16.0205 -14.1412 26.076 + 1151.6 15.4131 -14.3627 26.068 + 1151.7 14.7953 -14.5731 26.079 + 1151.8 14.1776 -14.7835 26.071 + 1151.9 13.5598 -14.9939 26.076 + 1152 12.942 -15.2154 26.071 + 1152.1 12.3346 -15.4369 26.082 + 1152.2 11.7271 -15.6473 26.082 + 1152.3 11.13 -15.8577 26.084 + 1152.4 10.5431 -16.057 26.071 + 1152.5 10.0283 -16.2342 26.091 + 1152.6 9.54437 -16.4003 26.073 + 1152.7 9.06046 -16.5664 26.065 + 1152.9 8.23678 -16.8654 26.007 + 1153 7.88672 -16.9983 25.917 + 1153.1 7.59843 -17.1201 25.82 + 1153.2 7.31015 -17.2308 25.687 + 1153.3 7.06304 -17.3305 25.527 + 1153.4 6.82623 -17.4302 25.365 + 1153.5 6.62031 -17.5188 25.168 + 1153.6 6.43499 -17.6074 24.947 + 1153.7 6.27025 -17.6959 24.707 + 1153.8 6.12611 -17.7513 24.483 + 1153.9 6.01285 -17.8178 24.233 + 1154 5.8996 -17.8842 23.972 + 1154.1 5.79664 -17.9396 23.706 + 1154.2 5.70397 -17.9949 23.45 + 1154.3 5.6216 -18.0503 23.182 + 1154.4 5.54953 -18.0946 22.923 + 1154.5 5.49805 -18.1389 22.656 + 1154.6 5.44657 -18.1721 22.414 + 1154.7 5.39509 -18.2164 22.166 + 1154.8 5.34361 -18.2607 21.911 + 1154.9 5.30243 -18.2939 21.662 + 1155 5.26124 -18.3382 21.407 + 1155.1 5.23035 -18.3604 21.171 + 1155.2 5.19947 -18.4047 20.919 + 1155.3 5.16858 -18.4268 20.668 + 1155.4 5.13769 -18.46 20.421 + 1155.5 5.1068 -18.4932 20.169 + 1155.6 5.08621 -18.5154 19.914 + 1155.7 5.05532 -18.5375 19.658 + 1155.8 5.04503 -18.5597 19.399 + 1155.9 5.03473 -18.5818 19.153 + 1156 5.02443 -18.604 18.885 + 1156.1 5.01414 -18.615 18.626 + 1156.2 5.00384 -18.6372 18.375 + 1156.3 4.99354 -18.6483 18.105 + 1156.4 4.98325 -18.6704 17.828 + 1156.5 4.98325 -18.6815 17.583 + 1156.6 4.98325 -18.6815 17.34 + 1156.7 4.99354 -18.7036 17.084 + 1156.8 4.98325 -18.7036 16.843 + 1156.9 4.98325 -18.7036 16.573 + 1157 4.99354 -18.7147 16.34 + 1157.1 5.00384 -18.7147 16.094 + 1157.2 5.01414 -18.7036 15.883 + 1157.3 5.03473 -18.7036 15.714 + 1157.4 5.04502 -18.6926 15.57 + 1157.5 5.06561 -18.6815 15.44 + 1157.6 5.08621 -18.6593 15.355 + 1157.7 5.0965 -18.6261 15.307 + 1157.8 5.1068 -18.5818 15.261 + 1157.9 5.11709 -18.5264 15.237 + 1158 5.12739 -18.4489 15.236 + 1158.1 5.11709 -18.3714 15.235 + 1158.2 5.11709 -18.2718 15.253 + 1158.3 5.1068 -18.1499 15.255 + 1158.4 5.08621 -18.0171 15.275 + 1158.5 5.06561 -17.8731 15.293 + 1158.6 5.03473 -17.7181 15.307 + 1158.7 4.99354 -17.552 15.32 + 1158.8 4.95236 -17.3637 15.323 + 1158.9 4.90088 -17.1754 15.328 + 1159 4.85969 -16.9872 15.33 + 1159.1 4.78762 -16.7879 15.323 + 1159.2 4.72585 -16.5885 15.314 + 1159.3 4.65378 -16.3892 15.312 + 1159.4 4.56111 -16.1788 15.291 + 1159.5 4.48904 -15.9684 15.298 + 1159.6 4.39638 -15.7469 15.286 + 1159.7 4.30371 -15.5365 15.276 + 1159.8 4.20075 -15.315 15.27 + 1159.9 4.09779 -15.0936 15.265 + 1160 4.00513 -14.8721 15.25 + 1160.1 3.90217 -14.6506 15.238 + 1160.2 3.79921 -14.4181 15.224 + 1160.3 3.68595 -14.1744 15.209 + 1160.4 3.58299 -13.9419 15.21 + 1160.5 3.46974 -13.6872 15.19 + 1160.6 3.36678 -13.4436 15.189 + 1160.7 3.24323 -13.1889 15.176 + 1160.8 3.11968 -12.9231 15.174 + 1160.9 2.99612 -12.6463 15.168 + 1161 2.87257 -12.3694 15.158 + 1161.1 2.74902 -12.0926 15.15 + 1161.2 2.61517 -11.8047 15.153 + 1161.3 2.49162 -11.5167 15.141 + 1161.4 2.34748 -11.2177 15.148 + 1161.5 2.21363 -10.9298 15.129 + 1161.6 2.07978 -10.6198 15.137 + 1161.7 1.94594 -10.3208 15.132 + 1161.8 1.7915 -10.0107 15.121 + 1161.9 1.65765 -9.68957 15.127 + 1162 1.50321 -9.36843 15.117 + 1162.1 1.35907 -9.03621 15.104 + 1162.2 1.20463 -8.704 15.11 + 1162.3 1.05019 -8.37178 15.102 + 1162.4 0.895748 -8.0285 15.092 + 1162.5 0.741309 -7.68521 15.081 + 1162.6 0.576574 -7.33085 15.076 + 1162.7 0.411838 -6.96541 15.08 + 1162.8 0.257399 -6.61105 15.066 + 1162.9 0.0823676 -6.23454 15.064 + 1163 -0.0926636 -5.86911 15.057 + 1163.1 -0.247103 -5.4926 15.06 + 1163.2 -0.422134 -5.10502 15.056 + 1163.3 -0.597165 -4.72851 15.059 + 1163.4 -0.772197 -4.34093 15.041 + 1163.5 -0.947228 -3.94227 15.04 + 1163.6 -1.12226 -3.54361 15.062 + 1163.7 -1.30759 -3.14496 15.048 + 1163.8 -1.49291 -2.7463 15.047 + 1163.9 -1.67824 -2.33657 15.038 + 1164 -1.86357 -1.92684 15.038 + 1164.1 -2.05919 -1.51711 15.038 + 1164.2 -2.24452 -1.11845 15.029 + 1164.3 -2.42984 -0.697649 15.023 + 1164.4 -2.62547 -0.276844 15.028 + 1164.5 -2.82109 0.155033 15.02 + 1164.6 -3.01671 0.575837 15.019 + 1164.7 -3.21234 0.996641 15.009 + 1164.8 -3.40796 1.42852 15.005 + 1164.9 -3.60358 1.87147 15.005 + 1165 -3.8095 2.30335 14.995 + 1165.1 -4.01542 2.7463 14.995 + 1165.2 -4.21104 3.17818 14.983 + 1165.3 -4.41696 3.6322 14.988 + 1165.4 -4.62288 4.06408 14.981 + 1165.5 -4.8288 4.50703 14.976 + 1165.6 -5.03472 4.94998 14.966 + 1165.7 -5.24064 5.40401 14.965 + 1165.8 -5.43626 5.84696 14.957 + 1165.9 -5.64218 6.28991 14.952 + 1166 -5.8481 6.74394 14.95 + 1166.1 -6.05402 7.18689 14.941 + 1166.2 -6.25994 7.64092 14.936 + 1166.3 -6.47615 8.09494 14.925 + 1166.4 -6.67177 8.53789 14.928 + 1166.5 -6.87769 8.99192 14.912 + 1166.6 -7.08361 9.44594 14.908 + 1166.7 -7.28953 9.91104 14.915 + 1166.8 -7.49545 10.3651 14.902 + 1166.9 -7.70137 10.8191 14.895 + 1167 -7.90728 11.262 14.877 + 1167.1 -8.10291 11.705 14.892 + 1167.2 -8.30883 12.1479 14.874 + 1167.3 -8.49415 12.5577 14.875 + 1167.4 -8.6383 12.912 14.825 + 1167.5 -8.80303 13.2664 14.865 + 1167.6 -8.96777 13.5654 14.844 + 1167.7 -9.10161 13.809 14.842 + 1167.8 -9.21487 14.0194 14.831 + 1167.9 -9.31783 14.1966 14.839 + 1168 -9.42079 14.3516 14.823 + 1168.1 -9.49286 14.4513 14.794 + 1168.2 -9.54434 14.551 14.779 + 1168.3 -9.58552 14.6174 14.761 + 1168.4 -9.62671 14.6838 14.748 + 1168.5 -9.65759 14.7392 14.747 + 1168.6 -9.66789 14.7724 14.739 + 1168.7 -9.67818 14.8057 14.727 + 1168.8 -9.67818 14.8167 14.73 + 1168.9 -9.65759 14.8167 14.734 + 1169 -9.6473 14.8057 14.739 + 1169.1 -9.637 14.7946 14.736 + 1169.2 -9.60611 14.7724 14.747 + 1169.3 -9.56493 14.7392 14.753 + 1169.4 -9.52375 14.6728 14.762 + 1169.5 -9.47227 14.6174 14.765 + 1169.6 -9.41049 14.5288 14.772 + 1169.7 -9.33842 14.4402 14.776 + 1169.8 -9.26635 14.3295 14.787 + 1169.9 -9.18398 14.2077 14.801 + 1170 -9.09132 14.0748 14.802 + 1170.1 -8.99865 13.9308 14.814 + 1170.2 -8.8854 13.7758 14.816 + 1170.3 -8.78244 13.6208 14.819 + 1170.4 -8.65889 13.4325 14.822 + 1170.5 -8.53534 13.2664 14.837 + 1170.6 -8.41178 13.0671 14.836 + 1170.7 -8.27794 12.8677 14.834 + 1170.8 -8.13379 12.6573 14.847 + 1170.9 -7.97936 12.4248 14.854 + 1171 -7.83521 12.2033 14.845 + 1171.1 -7.68077 11.9708 14.858 + 1171.2 -7.52633 11.7271 14.861 + 1171.3 -7.3513 11.4724 14.86 + 1171.4 -7.18657 11.2067 14.854 + 1171.5 -7.00124 10.9409 14.851 + 1171.6 -6.82621 10.653 14.853 + 1171.7 -6.64088 10.3651 14.85 + 1171.8 -6.44526 10.0661 14.845 + 1171.9 -6.25993 9.76708 14.845 + 1172 -6.05402 9.44594 14.841 + 1172.1 -5.8481 9.13588 14.843 + 1172.2 -5.65247 8.80366 14.839 + 1172.3 -5.43626 8.47145 14.841 + 1172.4 -5.22004 8.12816 14.833 + 1172.5 -5.00383 7.78487 14.832 + 1172.6 -4.78761 7.43051 14.84 + 1172.7 -4.5611 7.07615 14.84 + 1172.8 -4.3243 6.69964 14.836 + 1172.9 -4.08749 6.33421 14.834 + 1173 -3.85068 5.94662 14.835 + 1173.1 -3.61388 5.54797 14.832 + 1173.2 -3.36677 5.16039 14.831 + 1173.3 -3.11967 4.75066 14.826 + 1173.4 -2.85198 4.34093 14.831 + 1173.5 -2.59458 3.92012 14.824 + 1173.6 -2.32688 3.48824 14.82 + 1173.7 -2.05919 3.05637 14.826 + 1173.8 -1.7812 2.61341 14.828 + 1173.9 -1.50321 2.15939 14.827 + 1174 -1.22522 1.71644 14.821 + 1174.1 -0.936931 1.25134 14.833 + 1174.2 -0.648645 0.797313 14.825 + 1174.3 -0.360358 0.332214 14.815 + 1174.4 -0.0720717 -0.132885 14.827 + 1174.5 0.216215 -0.597985 14.824 + 1174.6 0.504502 -1.06308 14.82 + 1174.7 0.792788 -1.52818 14.827 + 1174.8 1.08108 -1.99328 14.826 + 1174.9 1.37966 -2.45838 14.826 + 1175 1.65765 -2.92348 14.826 + 1175.1 1.94594 -3.37751 14.822 + 1175.2 2.22393 -3.83153 14.834 + 1175.3 2.50192 -4.27448 14.842 + 1175.4 2.77991 -4.71743 14.838 + 1175.5 3.0476 -5.14931 14.836 + 1175.6 3.3153 -5.57012 14.836 + 1175.7 3.5727 -5.99092 14.843 + 1175.8 3.84039 -6.41172 14.841 + 1175.9 4.08749 -6.81038 14.831 + 1176 4.3346 -7.20904 14.845 + 1176.1 4.5817 -7.59662 14.841 + 1176.2 4.81851 -7.9842 14.855 + 1176.3 5.05531 -8.36071 14.851 + 1176.4 5.29212 -8.73722 14.859 + 1176.5 5.51863 -9.10265 14.859 + 1176.6 5.74514 -9.46809 14.868 + 1176.7 5.98195 -9.82245 14.874 + 1176.8 6.19817 -10.1768 14.861 + 1176.9 6.41438 -10.5312 14.863 + 1177 6.64089 -10.8745 14.865 + 1177.1 6.84681 -11.2067 14.874 + 1177.2 7.06303 -11.55 14.871 + 1177.3 7.26895 -11.8932 14.871 + 1177.4 7.48516 -12.2144 14.877 + 1177.5 7.69108 -12.5466 14.881 + 1177.6 7.9073 -12.8788 14.879 + 1177.7 8.10292 -13.211 14.881 + 1177.8 8.31914 -13.5322 14.885 + 1177.9 8.51476 -13.8533 14.886 + 1178 8.73097 -14.1855 14.885 + 1178.1 8.9266 -14.5067 14.881 + 1178.2 9.14281 -14.8278 14.898 + 1178.3 9.33844 -15.1489 14.881 + 1178.4 9.55465 -15.4812 14.888 + 1178.5 9.75028 -15.7912 14.891 + 1178.6 9.96649 -16.1124 14.886 + 1178.7 10.1724 -16.4446 14.883 + 1178.8 10.368 -16.7657 14.874 + 1178.9 10.5842 -17.0758 14.874 + 1179 10.7387 -17.3415 14.87 + 1179.1 10.8931 -17.5962 14.862 + 1179.2 11.0682 -17.8509 14.85 + 1179.3 11.1917 -18.0613 14.842 + 1179.4 11.3256 -18.2496 14.855 + 1179.5 11.4285 -18.3936 14.881 + 1179.6 11.5109 -18.5264 14.873 + 1179.7 11.5727 -18.6261 14.861 + 1179.8 11.6241 -18.7147 14.88 + 1179.9 11.6653 -18.7811 14.873 + 1180 11.7065 -18.8254 14.874 + 1180.1 11.7168 -18.8476 14.874 + 1180.2 11.7271 -18.8587 14.874 + 1180.3 11.7065 -18.8476 14.874 + 1180.4 11.6859 -18.8033 14.883 + 1180.5 11.6447 -18.7479 14.865 + 1180.6 11.5933 -18.6704 14.866 + 1180.7 11.5315 -18.5818 14.858 + 1180.8 11.4594 -18.46 14.855 + 1180.9 11.377 -18.3382 14.855 + 1181 11.2741 -18.1942 14.859 + 1181.1 11.1711 -18.0392 14.852 + 1181.2 11.0579 -17.862 14.828 + 1181.3 10.9343 -17.6738 14.83 + 1181.4 10.8108 -17.4744 14.831 + 1181.5 10.6666 -17.264 14.831 + 1181.6 10.5225 -17.0426 14.818 + 1181.7 10.3886 -16.8211 14.819 + 1181.8 10.2239 -16.5775 14.81 + 1181.9 10.0695 -16.3228 14.812 + 1182 9.91501 -16.0681 14.817 + 1182.1 9.73998 -15.8134 14.796 + 1182.2 9.56495 -15.5476 14.79 + 1182.3 9.38992 -15.2708 14.81 + 1182.4 9.22518 -14.9939 14.806 + 1182.5 9.03985 -14.706 14.793 + 1182.6 8.85453 -14.4291 14.797 + 1182.7 8.67949 -14.1412 14.799 + 1182.8 8.49417 -13.8422 14.796 + 1182.9 8.29854 -13.5322 14.8 + 1183 8.11322 -13.2332 14.806 + 1183.1 7.91759 -12.9231 14.802 + 1183.2 7.72197 -12.613 14.795 + 1183.3 7.51605 -12.2919 14.799 + 1183.4 7.31013 -11.9597 14.797 + 1183.5 7.09392 -11.6275 14.791 + 1183.6 6.8777 -11.2953 14.801 + 1183.7 6.65119 -10.952 14.794 + 1183.8 6.42468 -10.5976 14.791 + 1183.9 6.18787 -10.2322 14.807 + 1184 5.95106 -9.86674 14.8 + 1184.1 5.71426 -9.50131 14.785 + 1184.2 5.47745 -9.13587 14.791 + 1184.3 5.23035 -8.74829 14.79 + 1184.4 4.97295 -8.36071 14.786 + 1184.5 4.72584 -7.96205 14.781 + 1184.6 4.47874 -7.5634 14.79 + 1184.7 4.22134 -7.16474 14.78 + 1184.8 3.95365 -6.74394 14.776 + 1184.9 3.69625 -6.32313 14.79 + 1185 3.42855 -5.9134 14.786 + 1185.1 3.17115 -5.48152 14.791 + 1185.2 2.90346 -5.04965 14.787 + 1185.3 2.63576 -4.61777 14.79 + 1185.4 2.36807 -4.18589 14.801 + 1185.5 2.10037 -3.75401 14.797 + 1185.6 1.82238 -3.31106 14.79 + 1185.7 1.55469 -2.87918 14.794 + 1185.8 1.28699 -2.43623 14.8 + 1185.9 1.009 -1.99328 14.796 + 1186 0.720717 -1.53926 14.79 + 1186.1 0.442726 -1.09631 14.791 + 1186.2 0.154439 -0.64228 14.796 + 1186.3 -0.133847 -0.188254 14.806 + 1186.4 -0.43243 0.276845 14.814 + 1186.5 -0.720717 0.741944 14.813 + 1186.6 -1.0296 1.20704 14.822 + 1186.7 -1.32818 1.68322 14.816 + 1186.8 -1.63706 2.17046 14.819 + 1186.9 -1.94593 2.64664 14.832 + 1187 -2.25481 3.13388 14.811 + 1187.1 -2.5534 3.62113 14.807 + 1187.2 -2.85198 4.10838 14.818 + 1187.3 -3.16086 4.59562 14.809 + 1187.4 -3.45944 5.08287 14.806 + 1187.5 -3.75802 5.57012 14.8 + 1187.6 -4.0566 6.04629 14.816 + 1187.7 -4.34489 6.53354 14.817 + 1187.8 -4.63318 7.00971 14.821 + 1187.9 -4.93176 7.48588 14.812 + 1188 -5.22004 7.96205 14.816 + 1188.1 -5.50833 8.42715 14.813 + 1188.2 -5.79662 8.89225 14.817 + 1188.3 -6.0849 9.36843 14.814 + 1188.4 -6.36289 9.82245 14.798 + 1188.5 -6.64088 10.2765 14.799 + 1188.6 -6.92917 10.7305 14.8 + 1188.7 -7.19686 11.1735 14.792 + 1188.8 -7.47485 11.6164 14.795 + 1188.9 -7.74255 12.0594 14.79 + 1189 -7.99995 12.4802 14.821 + 1189.1 -8.25735 12.901 14.867 + 1189.2 -8.51474 13.3107 14.935 + 1189.3 -8.74126 13.6872 15.05 + 1189.4 -8.92658 13.9973 15.151 + 1189.5 -9.11191 14.3073 15.305 + 1189.6 -9.26635 14.551 15.528 + 1189.7 -9.3899 14.7281 15.767 + 1189.8 -9.50316 14.8721 16.056 + 1189.9 -9.57523 14.9939 16.365 + 1190 -9.637 15.0825 16.713 + 1190.1 -9.67819 15.149 17.097 + 1190.2 -9.69878 15.1932 17.498 + 1190.3 -9.72967 15.2486 17.912 + 1190.4 -9.76056 15.2818 18.338 + 1190.5 -9.78115 15.3151 18.753 + 1190.6 -9.81204 15.3372 19.155 + 1190.7 -9.85322 15.3483 19.574 + 1190.8 -9.915 15.3483 19.955 + 1190.9 -9.97678 15.3261 20.35 + 1191 -10.0694 15.2929 20.717 + 1191.1 -10.1827 15.2486 21.09 + 1191.2 -10.3268 15.1822 21.465 + 1191.3 -10.4916 15.1047 21.863 + 1191.4 -10.6769 14.9939 22.218 + 1191.5 -10.8931 14.8832 22.564 + 1191.6 -11.1196 14.7503 22.907 + 1191.7 -11.377 14.6064 23.259 + 1191.8 -11.6447 14.4402 23.573 + 1191.9 -11.933 14.2631 23.885 + 1192 -12.2419 14.0859 24.183 + 1192.1 -12.5714 13.8976 24.445 + 1192.2 -12.9214 13.6762 24.72 + 1192.3 -13.2818 13.4547 24.969 + 1192.4 -13.673 13.2221 25.244 + 1192.5 -14.0849 12.9785 25.542 + 1192.6 -14.507 12.7127 25.861 + 1192.7 -14.9497 12.4359 26.205 + 1192.8 -15.4028 12.159 26.564 + 1192.9 -15.8661 11.8933 26.957 + 1193 -16.3294 11.5943 27.371 + 1193.1 -16.8236 11.3174 27.794 + 1193.2 -17.3178 11.0406 28.19 + 1193.3 -17.8326 10.797 28.621 + 1193.4 -18.3577 10.5755 29.05 + 1193.5 -18.8725 10.3651 29.446 + 1193.6 -19.4182 10.1879 29.835 + 1193.7 -19.9639 10.044 30.194 + 1193.8 -20.5096 9.9443 30.562 + 1193.9 -21.0553 9.87786 30.916 + 1194 -21.6112 9.85571 31.259 + 1194.1 -22.1466 9.85571 31.592 + 1194.2 -22.682 9.90001 31.918 + 1194.3 -23.2277 9.94431 32.2329 + 1194.4 -23.7734 9.99968 32.5399 + 1194.5 -24.3294 10.0661 32.8289 + 1194.6 -24.8957 10.1547 33.1059 + 1194.7 -25.4722 10.2322 33.3399 + 1194.8 -26.0488 10.2987 33.5599 + 1194.9 -26.6563 10.3651 33.7519 + 1195 -27.274 10.4316 33.8949 + 1195.1 -27.9021 10.4759 33.9919 + 1195.2 -28.5404 10.5312 34.0729 + 1195.3 -29.1994 10.5755 34.1249 + 1195.4 -29.8686 10.6198 34.1589 + 1195.5 -30.5379 10.653 34.1819 + 1195.6 -31.238 10.6973 34.1739 + 1195.7 -31.9381 10.7416 34.1729 + 1195.8 -32.6588 10.7638 34.1579 + 1195.9 -33.3898 10.8081 34.1439 + 1196 -34.1312 10.8413 34.1289 + 1196.1 -34.8828 10.8745 34.1079 + 1196.2 -35.6447 10.9188 34.0899 + 1196.3 -36.4272 10.9631 34.0889 + 1196.4 -37.2097 10.9964 34.0819 + 1196.5 -38.0024 11.0406 34.0649 + 1196.6 -38.8055 11.0849 34.0749 + 1196.7 -39.6189 11.1292 34.0699 + 1196.8 -40.4426 11.1625 34.0669 + 1196.9 -41.2663 11.2068 34.0689 + 1197 -42.1002 11.2511 34.0789 + 1197.1 -42.9445 11.2954 34.0898 + 1197.2 -43.7991 11.3397 34.0868 + 1197.3 -44.6536 11.384 34.0908 + 1197.4 -45.5185 11.4283 34.0958 + 1197.5 -46.3834 11.4725 34.1068 + 1197.6 -47.2585 11.5168 34.1098 + 1197.7 -48.144 11.5722 34.1168 + 1197.8 -49.0191 11.6165 34.1178 + 1197.9 -49.8943 11.6608 34.1188 + 1198 -50.7695 11.7051 34.1368 + 1198.1 -51.6549 11.7605 34.1518 + 1198.2 -52.5301 11.8048 34.1448 + 1198.3 -53.3949 11.8491 34.1578 + 1198.4 -54.2495 11.8934 34.1788 + 1198.5 -55.0835 11.9488 34.2038 + 1198.6 -55.9071 11.9931 34.2327 + 1198.7 -56.6279 12.0484 34.2857 + 1198.8 -57.3177 12.0927 34.3417 + 1198.9 -57.9663 12.1481 34.4537 + 1199 -58.512 12.2035 34.5737 + 1199.1 -58.9753 12.2367 34.7187 + 1199.2 -59.3563 12.2588 34.8987 + 1199.3 -59.6858 12.2699 35.0937 + 1199.4 -59.9844 12.281 35.3227 + 1199.5 -60.2212 12.2921 35.5717 + 1199.6 -60.4477 12.3031 35.8347 + 1199.7 -60.633 12.2921 36.1447 + 1199.8 -60.8183 12.281 36.4597 + 1199.9 -60.9831 12.281 36.7867 + 1200 -61.1375 12.281 37.1487 + 1200.1 -61.2611 12.281 37.5107 + 1200.2 -61.3743 12.281 37.9017 + 1200.3 -61.467 12.2921 38.3207 + 1200.4 -61.5494 12.2921 38.7557 + 1200.5 -61.6112 12.281 39.1867 + 1200.6 -61.6729 12.281 39.6467 + 1200.7 -61.7244 12.2921 40.1087 + 1200.8 -61.7759 12.2921 40.5877 + 1200.9 -61.8068 12.2921 41.0507 + 1201 -61.848 12.2921 41.5327 + 1201.1 -61.8789 12.3032 42.0147 + 1201.2 -61.9098 12.3032 42.4957 + 1201.3 -61.9304 12.3032 42.9897 + 1201.4 -61.9613 12.3032 43.4837 + 1201.5 -62.0025 12.3142 43.9837 + 1201.6 -62.0333 12.3253 44.4537 + 1201.7 -62.0848 12.3364 44.9407 + 1201.8 -62.1363 12.3475 45.4287 + 1201.9 -62.1981 12.3585 45.9197 + 1202 -62.2702 12.3585 46.3987 + 1202.1 -62.3525 12.3696 46.8887 + 1202.2 -62.4452 12.3918 47.3747 + 1202.3 -62.5482 12.4028 47.8647 + 1202.4 -62.6614 12.4028 48.3367 + 1202.5 -62.785 12.425 48.8127 + 1202.6 -62.9188 12.4361 49.2947 + 1202.7 -63.0527 12.4361 49.7687 + 1202.8 -63.2071 12.4471 50.2567 + 1202.9 -63.3719 12.4693 50.7337 + 1203 -63.5469 12.4804 51.2037 + 1203.1 -63.722 12.4914 51.6917 + 1203.2 -63.9176 12.5025 52.1587 + 1203.3 -64.1132 12.5136 52.6447 + 1203.4 -64.3294 12.5247 53.1207 + 1203.5 -64.556 12.5357 53.6007 + 1203.6 -64.7825 12.5579 54.0727 + 1203.7 -65.0296 12.569 54.5597 + 1203.8 -65.2664 12.58 55.0287 + 1203.9 -65.5238 12.5911 55.5117 + 1204 -65.7812 12.6133 55.9886 + 1204.1 -66.0489 12.6243 56.4576 + 1204.2 -66.3166 12.6354 56.9316 + 1204.3 -66.5843 12.6576 57.4016 + 1204.4 -66.8417 12.6686 57.8786 + 1204.5 -67.1094 12.6797 58.3446 + 1204.6 -67.3771 12.6908 58.8256 + 1204.7 -67.6345 12.7019 59.3066 + 1204.8 -67.8507 12.7129 59.8156 + 1204.9 -68.0464 12.724 60.2996 + 1205 -68.2111 12.7351 60.7936 + 1205.1 -68.3759 12.7351 61.2826 + 1205.2 -68.5097 12.7462 61.7876 + 1205.3 -68.6127 12.7351 62.2846 + 1205.4 -68.695 12.7351 62.7876 + 1205.5 -68.7671 12.7351 63.2606 + 1205.6 -68.8289 12.7351 63.7556 + 1205.7 -68.8804 12.7351 64.2616 + 1205.8 -68.9319 12.7351 64.7726 + 1205.9 -68.9834 12.7351 65.2636 + 1206 -69.0246 12.7462 65.7626 + 1206.1 -69.0657 12.7351 66.2656 + 1206.2 -69.0966 12.7462 66.7586 + 1206.3 -69.1275 12.7351 67.2576 + 1206.4 -69.1584 12.7351 67.7456 + 1206.5 -69.179 12.7351 68.2426 + 1206.6 -69.1996 12.7351 68.7326 + 1206.7 -69.2408 12.7351 69.2086 + 1206.8 -69.2717 12.7351 69.6916 + 1206.9 -69.3232 12.7351 70.1676 + 1207 -69.3953 12.7351 70.6436 + 1207.1 -69.4776 12.7462 71.1136 + 1207.2 -69.5806 12.7462 71.5756 + 1207.3 -69.7042 12.7462 72.0616 + 1207.4 -69.8483 12.7573 72.5136 + 1207.5 -70.0233 12.7684 72.9316 + 1207.6 -70.2087 12.7684 73.3326 + 1207.7 -70.4146 12.7794 73.7036 + 1207.8 -70.6411 12.7905 74.0396 + 1207.9 -70.8882 12.7905 74.3406 + 1208 -71.1559 12.8016 74.6066 + 1208.1 -71.4442 12.8016 74.8346 + 1208.2 -71.7428 12.8127 75.0426 + 1208.3 -72.0723 12.8348 75.1906 + 1208.4 -72.4121 12.868 75.3156 + 1208.5 -72.7518 12.9234 75.4026 + 1208.6 -73.1019 12.9899 75.4466 + 1208.7 -73.4622 13.0674 75.4806 + 1208.9 -74.1624 13.3221 75.6576 + 1209 -74.4919 13.4993 75.6386 + 1209.1 -74.811 13.7097 75.6075 + 1209.2 -75.1096 13.9422 75.5965 + 1209.3 -75.3773 14.1969 75.5715 + 1209.4 -75.6347 14.4627 75.5585 + 1209.5 -75.8818 14.7617 75.5595 + 1209.6 -76.098 15.0718 75.5405 + 1209.7 -76.2731 15.404 75.5335 + 1209.8 -76.4378 15.7473 75.5345 + 1209.9 -76.5716 16.1016 75.5345 + 1210 -76.6746 16.4671 75.5345 + 1210.1 -76.7364 16.8436 75.5505 + 1210.2 -76.7673 17.209 75.5645 + 1210.3 -76.7776 17.5855 75.5615 + 1210.4 -76.757 17.951 75.5795 + 1210.5 -76.7261 18.3164 75.5945 + 1210.6 -76.6746 18.6708 75.5965 + 1210.7 -76.6025 19.0251 75.6065 + 1210.8 -76.4995 19.3795 75.6125 + 1210.9 -76.3863 19.7228 75.6135 + 1211 -76.2524 20.055 75.6065 + 1211.1 -76.1083 20.3762 75.6275 + 1211.2 -75.9539 20.6862 75.6365 + 1211.3 -75.7891 20.9963 75.6375 + 1211.4 -75.6141 21.3174 75.6555 + 1211.5 -75.4288 21.6164 75.6555 + 1211.6 -75.2331 21.9265 75.6605 + 1211.7 -75.0375 22.2366 75.6665 + 1211.8 -74.8316 22.5577 75.6515 + 1211.9 -74.6257 22.8788 75.6525 + 1212 -74.4094 23.2111 75.6525 + 1212.1 -74.1829 23.5654 75.6515 + 1212.2 -73.9461 23.9087 75.6505 + 1212.3 -73.6784 24.252 75.6565 + 1212.4 -73.4107 24.6064 75.6675 + 1212.5 -73.1327 24.9497 75.6755 + 1212.6 -72.8444 25.304 75.6815 + 1212.7 -72.5664 25.6584 75.6825 + 1212.8 -72.2781 26.0349 75.6915 + 1212.9 -71.9693 26.4114 75.6765 + 1213 -71.6501 26.7768 75.6785 + 1213.1 -71.3515 27.1755 75.6815 + 1213.2 -71.0323 27.5742 75.6705 + 1213.3 -70.7337 27.9839 75.6825 + 1213.4 -70.4146 28.4047 75.6935 + 1213.5 -70.0954 28.8366 75.6875 + 1213.6 -69.7762 29.2685 75.6906 + 1213.7 -69.457 29.7114 75.6876 + 1213.8 -69.1275 30.1654 75.6796 + 1213.9 -68.8084 30.6416 75.6716 + 1214 -68.4892 31.1178 75.6736 + 1214.1 -68.1494 31.594 75.6726 + 1214.2 -67.8199 32.0923 75.6676 + 1214.3 -67.4802 32.5906 75.6726 + 1214.4 -67.1404 33.1111 75.6656 + 1214.5 -66.7903 33.6316 75.6646 + 1214.6 -66.4506 34.152 75.6616 + 1214.7 -66.0902 34.6836 75.6616 + 1214.8 -65.7298 35.2151 75.6676 + 1214.9 -65.3695 35.7467 75.6646 + 1215 -65.0091 36.3004 75.6656 + 1215.1 -64.6384 36.843 75.6616 + 1215.2 -64.2678 37.3967 75.6756 + 1215.3 -63.8971 37.9614 75.6656 + 1215.4 -63.5265 38.5151 75.6706 + 1215.5 -63.1558 39.091 75.6576 + 1215.6 -62.7954 39.6668 75.6606 + 1215.7 -62.4351 40.2648 75.6576 + 1215.8 -62.085 40.8628 75.6486 + 1215.9 -61.7452 41.4608 75.6546 + 1216 -61.4158 42.0809 75.6556 + 1216.1 -61.076 42.7232 75.6486 + 1216.2 -60.7362 43.3433 75.6516 + 1216.3 -60.4067 43.9856 75.6396 + 1216.4 -60.0773 44.6279 75.6476 + 1216.5 -59.7375 45.2702 75.6486 + 1216.6 -59.3977 45.9125 75.6586 + 1216.7 -59.058 46.5658 75.6646 + 1216.8 -58.7079 47.2192 75.6576 + 1216.9 -58.3578 47.8615 75.6686 + 1217 -57.9975 48.5148 75.6566 + 1217.1 -57.6474 49.1793 75.6565 + 1217.2 -57.2973 49.8326 75.6645 + 1217.3 -56.937 50.4971 75.6605 + 1217.4 -56.5663 51.1615 75.6535 + 1217.5 -56.1956 51.837 75.6535 + 1217.6 -55.825 52.5014 75.6575 + 1217.7 -55.4646 53.1769 75.6595 + 1217.8 -55.094 53.8414 75.6565 + 1217.9 -54.7233 54.5058 75.6635 + 1218 -54.3527 55.1813 75.6615 + 1218.1 -53.982 55.8457 75.6735 + 1218.2 -53.6113 56.5102 75.6705 + 1218.3 -53.251 57.1746 75.6735 + 1218.4 -52.8803 57.8501 75.6735 + 1218.5 -52.5097 58.5035 75.6815 + 1218.6 -52.1493 59.1679 75.6805 + 1218.7 -51.7786 59.8213 75.6775 + 1218.8 -51.408 60.4746 75.6895 + 1218.9 -51.0476 61.128 75.6805 + 1219 -50.6872 61.7703 75.6905 + 1219.1 -50.3269 62.4236 75.7015 + 1219.2 -49.9665 63.0548 75.7015 + 1219.3 -49.6062 63.6971 75.7065 + 1219.4 -49.2561 64.3283 75.7035 + 1219.5 -48.906 64.9374 75.7205 + 1219.6 -48.556 65.5575 75.7305 + 1219.7 -48.2265 66.1445 75.7455 + 1219.8 -47.9382 66.6538 75.7455 + 1219.9 -47.6602 67.1965 75.7505 + 1220 -47.3719 67.6948 75.7605 + 1220.1 -47.1145 68.1377 75.7575 + 1220.2 -46.8983 68.5475 75.7695 + 1220.3 -46.6924 68.9018 75.7885 + 1220.4 -46.5173 69.2341 75.7915 + 1220.5 -46.3629 69.522 75.7885 + 1220.6 -46.2188 69.7656 75.7974 + 1220.7 -46.0849 69.9871 75.7884 + 1220.8 -45.9717 70.1864 75.7774 + 1220.9 -45.8687 70.3525 75.7764 + 1221 -45.776 70.4965 75.7564 + 1221.1 -45.704 70.6183 75.7454 + 1221.2 -45.6319 70.729 75.7364 + 1221.3 -45.5701 70.8176 75.7224 + 1221.4 -45.5186 70.9062 75.7134 + 1221.5 -45.4774 70.9727 75.6924 + 1221.6 -45.4466 71.028 75.6964 + 1221.7 -45.426 71.0834 75.6844 + 1221.8 -45.3951 71.1277 75.6804 + 1221.9 -45.3642 71.172 75.6764 + 1222 -45.3436 71.2052 75.6714 + 1222.1 -45.3333 71.2274 75.6624 + 1222.2 -45.323 71.2274 75.6734 + 1222.3 -45.3127 71.2495 75.6564 + 1222.4 -45.3024 71.2495 75.6504 + 1222.5 -45.3024 71.2606 75.6464 + 1222.6 -45.3024 71.2606 75.6354 + 1222.7 -45.2921 71.2495 75.6444 + 1222.8 -45.3024 71.2495 75.6524 + 1222.9 -45.3024 71.2384 75.6464 + 1223 -45.3127 71.2274 75.6404 + 1223.1 -45.3024 71.2163 75.6444 + 1223.2 -45.3024 71.2052 75.6384 + 1223.3 -45.3024 71.1941 75.6344 + 1223.4 -45.3127 71.172 75.6414 + 1223.5 -45.3127 71.172 75.6414 + 1223.6 -45.3127 71.1498 75.6374 + 1223.7 -45.3127 71.1388 75.6304 + 1223.8 -45.323 71.1277 75.6344 + 1223.9 -45.323 71.1055 75.6344 + 1224 -45.3333 71.0945 75.6254 + 1224.1 -45.3333 71.0834 75.6334 + 1224.2 -45.3333 71.0723 75.6444 + 1224.3 -45.3333 71.0613 75.6364 + 1224.4 -45.3333 71.0391 75.6454 + 1224.5 -45.3333 71.028 75.6434 + 1224.6 -45.3333 71.017 75.6424 + 1224.7 -45.3333 71.0059 75.6394 + 1224.8 -45.3333 70.9948 75.6384 + 1224.9 -45.3333 70.9727 75.6444 + 1225 -45.323 70.9616 75.6404 + 1225.1 -45.323 70.9616 75.6504 + 1225.2 -45.323 70.9394 75.6474 + 1225.3 -45.323 70.9284 75.6574 + 1225.4 -45.323 70.9284 75.6454 + 1225.5 -45.3333 70.9173 75.6414 + 1225.6 -45.3333 70.9062 75.6424 + 1225.7 -45.323 70.9062 75.6374 + 1225.8 -45.3333 70.8951 75.6274 + 1225.9 -45.3436 70.8951 75.6384 + 1226 -45.3436 70.8841 75.6424 + 1226.1 -45.3333 70.8841 75.6394 + 1226.2 -45.3436 70.8841 75.6374 + 1226.3 -45.3539 70.8841 75.6274 + 1226.4 -45.3436 70.8841 75.6264 + 1226.5 -45.3436 70.873 75.6254 + 1226.6 -45.3436 70.873 75.6204 + 1226.7 -45.3436 70.873 75.6254 + 1226.8 -45.3436 70.873 75.6174 + 1226.9 -45.3436 70.873 75.6174 + 1227 -45.3333 70.873 75.6204 + 1227.1 -45.3436 70.873 75.6214 + 1227.2 -45.3436 70.873 75.6324 + 1227.3 -45.3333 70.8841 75.6184 + 1227.4 -45.3333 70.8841 75.6224 + 1227.5 -45.3333 70.8841 75.6314 + 1227.6 -45.3436 70.8841 75.6264 + 1227.7 -45.3333 70.8841 75.6244 + 1227.8 -45.3333 70.8841 75.6274 + 1227.9 -45.3333 70.8841 75.6194 + 1228 -45.3333 70.8841 75.6314 + 1228.1 -45.3333 70.8841 75.6324 + 1228.2 -45.3333 70.8841 75.6394 + 1228.3 -45.3333 70.8951 75.6354 + 1228.4 -45.3333 70.8951 75.6344 + 1228.5 -45.3436 70.8951 75.6454 + 1228.6 -45.3436 70.8951 75.6294 + 1228.7 -45.3436 70.8951 75.6404 + 1228.8 -45.3333 70.9062 75.6404 + 1228.9 -45.323 70.9173 75.6254 + 1229 -45.323 70.9394 75.6264 + 1229.1 -45.3024 70.9727 75.6204 + 1229.2 -45.2818 71.0059 75.6284 + 1229.3 -45.2406 71.0723 75.6214 + 1229.4 -45.1994 71.1498 75.6254 + 1229.5 -45.148 71.2384 75.6324 + 1229.6 -45.0759 71.3602 75.6494 + 1229.7 -45.0038 71.4931 75.6514 + 1229.8 -44.9112 71.6371 75.6564 + 1229.9 -44.8185 71.8032 75.6444 + 1230 -44.7155 71.9804 75.6574 + 1230.1 -44.6023 72.1797 75.6694 + 1230.2 -44.4787 72.4012 75.6794 + 1230.3 -44.3346 72.6227 75.6854 + 1230.4 -44.1904 72.8774 75.6814 + 1230.5 -44.036 73.1321 75.7034 + 1230.6 -43.8816 73.4089 75.7044 + 1230.7 -43.7065 73.6968 75.7094 + 1230.8 -43.5315 73.9958 75.7154 + 1230.9 -43.3565 74.3059 75.7254 + 1231 -43.1711 74.6381 75.7384 + 1231.1 -42.9652 74.9703 75.7454 + 1231.2 -42.7696 75.3247 75.7434 + 1231.3 -42.5637 75.6901 75.7664 + 1231.4 -42.3474 76.0556 75.7734 + 1231.5 -42.1209 76.4432 75.7904 + 1231.6 -41.8944 76.8307 75.7944 + 1231.7 -41.6679 77.2405 75.8014 + 1231.8 -41.4208 77.6391 75.8134 + 1231.9 -41.1737 78.0489 75.8274 + 1232 -40.9369 78.4697 75.8214 + 1232.1 -40.6795 78.8905 75.8234 + 1232.2 -40.4324 79.3113 75.8214 + 1232.3 -40.1647 79.7432 75.8284 + 1232.4 -39.897 80.1751 75.8334 + 1232.5 -39.619 80.6069 75.8474 + 1232.6 -39.3307 81.0388 75.8404 + 1232.7 -39.0527 81.4818 75.8394 + 1232.8 -38.7541 81.9247 75.8534 + 1232.9 -38.4555 82.3677 75.8553 + 1233 -38.1467 82.8106 75.8573 + 1233.1 -37.8275 83.2536 75.8603 + 1233.2 -37.5083 83.7076 75.8613 + 1233.3 -37.1891 84.1506 75.8613 + 1233.4 -36.8494 84.5935 75.8773 + 1233.5 -36.5199 85.0476 75.8753 + 1233.6 -36.1801 85.4905 75.8743 + 1233.7 -35.8301 85.9335 75.8783 + 1233.8 -35.4697 86.3875 75.8773 + 1233.9 -35.1196 86.8305 75.8763 + 1234 -34.7593 87.2734 75.8773 + 1234.1 -34.3886 87.7164 75.8673 + 1234.2 -34.018 88.1593 75.8773 + 1234.3 -33.637 88.6023 75.8763 + 1234.4 -33.256 89.0342 75.8743 + 1234.5 -32.8751 89.4771 75.8733 + 1234.6 -32.4838 89.909 75.8763 + 1234.7 -32.0823 90.3409 75.8753 + 1234.8 -31.6808 90.7617 75.8833 + 1234.9 -31.2689 91.1825 75.8833 + 1235 -30.8571 91.5922 75.8873 + 1235.1 -30.4246 92.002 75.8943 + 1235.2 -30.0025 92.4006 75.9003 + 1235.3 -29.5598 92.7882 75.8963 + 1235.4 -29.1171 93.1647 75.8982 + 1235.5 -28.664 93.5412 75.8962 + 1235.6 -28.2007 93.9177 75.8972 + 1235.7 -27.7271 94.2721 75.8932 + 1235.8 -27.2432 94.6375 75.8872 + 1235.9 -26.7696 94.9808 75.8922 + 1236 -26.2754 95.3352 75.8992 + 1236.1 -25.7709 95.6785 75.8972 + 1236.2 -25.2766 96.0107 75.8982 + 1236.3 -24.7618 96.3429 75.9072 + 1236.4 -24.247 96.6751 75.9002 + 1236.5 -23.7425 97.0073 75.9052 + 1236.6 -23.2174 97.3174 75.9022 + 1236.7 -22.7026 97.6386 75.8962 + 1236.8 -22.1776 97.9486 75.8912 + 1236.9 -21.6422 98.2476 75.8652 + 1237 -21.1068 98.5577 75.8212 + 1237.1 -20.5714 98.8567 75.7652 + 1237.2 -20.0257 99.1557 75.6752 + 1237.3 -19.48 99.4436 75.5992 + 1237.4 -18.9343 99.7426 75.4562 + 1237.5 -18.3886 100.031 75.3022 + 1237.6 -17.8326 100.318 75.1212 + 1237.7 -17.2767 100.595 74.9102 + 1237.8 -16.7207 100.872 74.6702 + 1237.9 -16.1544 101.149 74.3942 + 1238 -15.5881 101.415 74.0982 + 1238.1 -15.0218 101.68 73.7782 + 1238.2 -14.4453 101.935 73.4172 + 1238.3 -13.8687 102.19 73.0522 + 1238.4 -13.3024 102.456 72.6532 + 1238.5 -12.7258 102.699 72.2552 + 1238.6 -12.139 102.954 71.8642 + 1238.7 -11.5521 103.198 71.4612 + 1238.8 -10.9755 103.452 71.0521 + 1238.9 -10.3886 103.696 70.6531 + 1239 -9.79147 103.939 70.2461 + 1239.1 -9.2046 104.194 69.8451 + 1239.2 -8.60743 104.438 69.4561 + 1239.3 -7.99997 104.681 69.0541 + 1239.4 -7.4028 104.925 68.6641 + 1239.5 -6.79534 105.169 68.2771 + 1239.6 -6.17758 105.423 67.8731 + 1239.7 -5.57012 105.667 67.4901 + 1239.8 -4.94206 105.911 67.0871 + 1239.9 -4.3346 106.165 66.7061 + 1240 -3.70655 106.409 66.3051 + 1240.1 -3.08879 106.653 65.9211 + 1240.2 -2.46073 106.907 65.5341 + 1240.3 -1.83268 107.162 65.1571 + 1240.4 -1.20463 107.406 64.7991 + 1240.5 -0.576574 107.66 64.4411 + 1240.6 0.0514798 107.926 64.1091 + 1240.7 0.689829 108.17 63.7811 + 1240.8 1.31788 108.435 63.4661 + 1240.9 1.94594 108.69 63.1511 + 1241 2.58428 108.956 62.8421 + 1241.1 3.22263 109.211 62.5391 + 1241.2 3.86098 109.465 62.2451 + 1241.3 4.48904 109.731 61.946 + 1241.4 5.12738 109.997 61.645 + 1241.5 5.76573 110.263 61.353 + 1241.6 6.40408 110.528 61.058 + 1241.7 7.05273 110.794 60.768 + 1241.8 7.69108 111.06 60.474 + 1241.9 8.32942 111.326 60.173 + 1242 8.96777 111.591 59.885 + 1242.1 9.61642 111.857 59.578 + 1242.2 10.2548 112.123 59.279 + 1242.3 10.9034 112.389 58.98 + 1242.4 11.5418 112.666 58.669 + 1242.5 12.1904 112.92 58.367 + 1242.6 12.839 113.186 58.074 + 1242.7 13.4877 113.452 57.775 + 1242.8 14.1363 113.706 57.513 + 1242.9 14.8056 113.961 57.273 + 1243 15.4748 114.205 57.068 + 1243.1 16.1543 114.448 56.8959 + 1243.2 16.8442 114.681 56.7449 + 1243.3 17.5546 114.902 56.6469 + 1243.4 18.2547 115.113 56.5789 + 1243.5 18.9857 115.323 56.5329 + 1243.6 19.7064 115.523 56.5099 + 1243.7 20.4374 115.711 56.4939 + 1243.8 21.1685 115.888 56.4989 + 1243.9 21.8995 116.065 56.5129 + 1244 22.6305 116.231 56.5399 + 1244.1 23.3615 116.386 56.5569 + 1244.2 24.1028 116.519 56.5699 + 1244.3 24.8441 116.652 56.5869 + 1244.4 25.5751 116.763 56.6089 + 1244.5 26.3164 116.874 56.6159 + 1244.6 27.0577 116.962 56.6279 + 1244.7 27.799 117.051 56.6359 + 1244.8 28.5506 117.117 56.6259 + 1244.9 29.3022 117.173 56.6189 + 1245 30.0539 117.217 56.6258 + 1245.1 30.8055 117.25 56.6158 + 1245.2 31.5674 117.272 56.6098 + 1245.3 32.3293 117.283 56.6118 + 1245.4 33.0912 117.283 56.6018 + 1245.5 33.8633 117.272 56.6058 + 1245.6 34.6355 117.261 56.6018 + 1245.7 35.4077 117.228 56.5978 + 1245.8 36.1902 117.195 56.6048 + 1245.9 36.9624 117.15 56.5998 + 1246 37.7449 117.095 56.6088 + 1246.1 38.5274 117.04 56.6038 + 1246.2 39.3099 116.962 56.6058 + 1246.3 40.0924 116.885 56.6008 + 1246.4 40.8749 116.796 56.6008 + 1246.5 41.6677 116.696 56.6088 + 1246.6 42.4605 116.597 56.6098 + 1246.7 43.243 116.475 56.6038 + 1246.8 44.0357 116.353 56.6058 + 1246.9 44.8285 116.22 56.5998 + 1247 45.6213 116.076 56.6078 + 1247.1 46.4141 115.932 56.6078 + 1247.2 47.2069 115.766 56.6008 + 1247.3 47.9997 115.589 56.6078 + 1247.4 48.7925 115.412 56.6078 + 1247.5 49.5956 115.224 56.6018 + 1247.6 50.3986 115.024 56.6058 + 1247.7 51.2017 114.803 56.6148 + 1247.8 51.9945 114.592 56.6098 + 1247.9 52.7976 114.36 56.6038 + 1248 53.6007 114.127 56.6097 + 1248.1 54.4038 113.895 56.6097 + 1248.2 55.2068 113.651 56.6097 + 1248.3 56.0099 113.408 56.6237 + 1248.4 56.8027 113.153 56.6207 + 1248.5 57.6058 112.887 56.6147 + 1248.6 58.4089 112.621 56.6027 + 1248.7 59.2017 112.344 56.6087 + 1248.8 59.9945 112.068 56.6137 + 1248.9 60.777 111.78 56.6067 + 1249 61.5697 111.481 56.6127 + 1249.1 62.3625 111.193 56.6207 + 1249.2 63.1553 110.883 56.6117 + 1249.3 63.9378 110.584 56.6217 + 1249.4 64.7203 110.274 56.6287 + 1249.5 65.5028 109.964 56.6207 + 1249.6 66.2956 109.642 56.6397 + 1249.7 67.0678 109.31 56.6317 + 1249.8 67.84 108.967 56.6397 + 1249.9 68.6122 108.624 56.6487 + 1250 69.3844 108.28 56.6437 + 1250.1 70.136 107.926 56.6447 + 1250.2 70.8876 107.572 56.6517 + 1250.3 71.6392 107.206 56.6497 + 1250.4 72.3908 106.841 56.6427 + 1250.5 73.1321 106.464 56.6447 + 1250.6 73.8837 106.099 56.6437 + 1250.7 74.6353 105.722 56.6487 + 1250.8 75.3766 105.357 56.6487 + 1250.9 76.1282 104.969 56.6497 + 1251 76.8799 104.593 56.6477 + 1251.1 77.6315 104.205 56.6377 + 1251.2 78.3934 103.818 56.6497 + 1251.3 79.145 103.43 56.6507 + 1251.4 79.9172 103.02 56.6547 + 1251.5 80.6791 102.622 56.6527 + 1251.6 81.4513 102.212 56.6527 + 1251.7 82.2338 101.802 56.6517 + 1251.8 83.0163 101.381 56.6607 + 1251.9 83.7987 100.95 56.6666 + 1252 84.5915 100.518 56.6716 + 1252.1 85.3946 100.075 56.6816 + 1252.2 86.1977 99.6318 56.6816 + 1252.3 87.0111 99.1778 56.6866 + 1252.4 87.8348 98.7237 56.7006 + 1252.5 88.6687 98.2586 56.6946 + 1252.6 89.5027 97.7935 56.6986 + 1252.7 90.3573 97.3063 56.7006 + 1252.8 91.2119 96.819 56.7036 + 1252.9 92.087 96.3097 56.7086 + 1253 92.9725 95.8113 56.7106 + 1253.1 93.8682 95.2909 56.7206 + 1253.2 94.7743 94.7593 56.7296 + 1253.3 95.6906 94.2278 56.7306 + 1253.4 96.6276 93.6852 56.7336 + 1253.5 97.5748 93.1315 56.7386 + 1253.6 98.5117 92.5667 56.7496 + 1253.7 99.4795 92.002 56.7526 + 1253.8 100.437 91.4372 56.7596 + 1253.9 101.405 90.8614 56.7705 + 1254 102.383 90.2745 56.7735 + 1254.1 103.371 89.6986 56.7765 + 1254.2 104.37 89.0896 56.7755 + 1254.3 105.379 88.4916 56.7715 + 1254.4 106.398 87.8825 56.7615 + 1254.5 107.428 87.2513 56.7725 + 1254.6 108.478 86.6312 56.7745 + 1254.7 109.539 86 56.7715 + 1254.8 110.599 85.3577 56.7795 + 1254.9 111.68 84.7044 56.7765 + 1255 112.772 84.051 56.7784 + 1255.1 113.863 83.3977 56.7814 + 1255.2 114.965 82.7333 56.7914 + 1255.3 116.056 82.0688 56.7904 + 1255.4 117.137 81.3823 56.8004 + 1255.5 118.218 80.6957 56.8194 + 1255.6 119.279 80.0202 56.8224 + 1255.7 120.308 79.3225 56.8214 + 1255.8 121.317 78.6249 56.8414 + 1255.9 122.285 77.9051 56.8504 + 1256 123.232 77.1632 56.8563 + 1256.1 124.128 76.4212 56.8443 + 1256.2 124.993 75.6682 56.8423 + 1256.3 125.796 74.9152 56.8543 + 1256.4 126.579 74.1843 56.8273 + 1256.5 127.299 73.4645 56.8013 + 1256.6 127.979 72.7337 56.7973 + 1256.7 128.628 72.0582 56.7913 + 1256.8 129.235 71.4159 56.7903 + 1256.9 129.812 70.8068 56.7803 + 1257 130.337 70.231 56.7673 + 1257.1 130.821 69.6994 56.7553 + 1257.2 131.274 69.19 56.7303 + 1257.3 131.685 68.7139 56.7113 + 1257.4 132.066 68.2709 56.6943 + 1257.5 132.406 67.8612 56.6703 + 1257.6 132.705 67.4847 56.6743 + 1257.7 132.973 67.1303 56.6733 + 1257.8 133.209 66.787 56.6623 + 1257.9 133.436 66.477 56.6813 + 1258 133.662 66.1448 56.7123 + 1258.1 133.879 65.8236 56.7043 + 1258.2 134.084 65.5025 56.7013 + 1258.3 134.27 65.1703 56.7223 + 1258.4 134.476 64.8159 56.7173 + 1258.5 134.692 64.4394 56.7503 + 1258.6 134.918 64.0407 56.7743 + 1258.7 135.155 63.6199 56.7632 + 1258.8 135.382 63.188 56.7762 + 1258.9 135.629 62.734 56.7882 + 1259 135.876 62.28 56.7872 + 1259.1 136.133 61.8149 56.7862 + 1259.2 136.401 61.3166 56.7932 + 1259.3 136.669 60.8183 56.7762 + 1259.4 136.937 60.3089 56.7832 + 1259.5 137.215 59.7884 56.7742 + 1259.6 137.493 59.2568 56.7662 + 1259.7 137.781 58.7032 56.7702 + 1259.8 138.079 58.1384 56.7772 + 1259.9 138.388 57.5736 56.7622 + 1260 138.697 56.9867 56.7652 + 1260.1 139.016 56.3998 56.7662 + 1260.2 139.336 55.8018 56.7762 + 1260.3 139.655 55.1928 56.7712 + 1260.4 139.984 54.5726 56.7662 + 1260.5 140.314 53.9525 56.7732 + 1260.6 140.643 53.3324 56.7802 + 1260.7 140.973 52.7012 56.7812 + 1260.8 141.312 52.081 56.7862 + 1260.9 141.632 51.4609 56.7802 + 1261 141.951 50.8297 56.7902 + 1261.1 142.26 50.2206 56.7972 + 1261.2 142.548 49.6005 56.7962 + 1261.3 142.836 48.9914 56.7762 + 1261.4 143.114 48.3934 56.7772 + 1261.5 143.351 47.8065 56.7572 + 1261.6 143.588 47.2196 56.7492 + 1261.7 143.794 46.6438 56.7392 + 1261.8 143.989 46.079 56.7332 + 1261.9 144.164 45.5142 56.7352 + 1262 144.319 44.9716 56.7232 + 1262.1 144.473 44.4401 56.7122 + 1262.2 144.607 43.9196 56.7182 + 1262.3 144.731 43.4656 56.6582 + 1262.4 144.844 43.0337 56.6522 + 1262.5 144.947 42.6129 56.6392 + 1262.6 145.05 42.2585 56.6422 + 1262.7 145.122 41.9595 56.6592 + 1262.8 145.184 41.6938 56.6672 + 1262.9 145.246 41.4501 56.6912 + 1263 145.297 41.2176 56.6922 + 1263.1 145.318 41.0072 56.7052 + 1263.2 145.338 40.8079 56.7082 + 1263.3 145.338 40.6196 56.7202 + 1263.4 145.318 40.4314 56.7282 + 1263.5 145.287 40.2542 56.7352 + 1263.6 145.246 40.0659 56.7382 + 1263.7 145.194 39.8887 56.7322 + 1263.8 145.122 39.7226 56.7452 + 1263.9 145.04 39.5565 56.7482 + 1264 144.947 39.3904 56.7392 + 1264.1 144.834 39.2354 56.7372 + 1264.2 144.72 39.0582 56.7292 + 1264.3 144.576 38.8921 56.7242 + 1264.4 144.442 38.726 56.7122 + 1264.5 144.267 38.5599 56.7073 + 1264.6 144.103 38.3827 56.7013 + 1264.7 143.917 38.2166 56.6953 + 1264.8 143.711 38.0394 56.6953 + 1264.9 143.506 37.8622 56.7013 + 1265 143.279 37.6739 56.6933 + 1265.1 143.053 37.4857 56.6883 + 1265.2 142.816 37.2864 56.6793 + 1265.3 142.548 37.0981 56.6703 + 1265.4 142.28 36.8877 56.6843 + 1265.5 142.013 36.6994 56.6653 + 1265.6 141.735 36.489 56.6703 + 1265.7 141.436 36.2786 56.6573 + 1265.8 141.137 36.0682 56.6513 + 1265.9 140.829 35.8467 56.6583 + 1266 140.509 35.6363 56.6474 + 1266.1 140.18 35.4148 56.6604 + 1266.2 139.851 35.1823 56.6514 + 1266.3 139.511 34.9608 56.6444 + 1266.4 139.161 34.7283 56.6564 + 1266.5 138.8 34.4957 56.6434 + 1266.6 138.44 34.2631 56.6364 + 1266.7 138.069 34.0195 56.6384 + 1266.8 137.688 33.7759 56.6364 + 1266.9 137.318 33.5433 56.6434 + 1267 136.916 33.2997 56.6334 + 1267.1 136.535 33.045 56.6365 + 1267.2 136.134 32.8014 56.6455 + 1267.3 135.722 32.5467 56.6465 + 1267.4 135.31 32.303 56.6365 + 1267.5 134.898 32.0373 56.6445 + 1267.6 134.476 31.7936 56.6335 + 1267.7 134.054 31.5279 56.6365 + 1267.8 133.632 31.2621 56.6485 + 1267.9 133.199 30.9963 56.6425 + 1268 132.767 30.7416 56.6475 + 1268.1 132.324 30.4758 56.6466 + 1268.2 131.892 30.2211 56.6476 + 1268.3 131.439 29.9554 56.6386 + 1268.4 130.996 29.6785 56.6416 + 1268.5 130.553 29.4127 56.6436 + 1268.6 130.1 29.1359 56.6416 + 1268.7 129.647 28.8701 56.6346 + 1268.8 129.194 28.6043 56.6296 + 1268.9 128.731 28.3275 56.6386 + 1269 128.268 28.0506 56.6316 + 1269.1 127.815 27.7848 56.6247 + 1269.2 127.341 27.508 56.6257 + 1269.3 126.878 27.2311 56.6247 + 1269.4 126.404 26.9543 56.6237 + 1269.5 125.93 26.6664 56.6337 + 1269.6 125.457 26.4006 56.6267 + 1269.7 124.983 26.1127 56.6267 + 1269.8 124.499 25.8358 56.6277 + 1269.9 124.026 25.559 56.6277 + 1270 123.531 25.271 56.6378 + 1270.1 123.058 24.9942 56.6188 + 1270.2 122.564 24.7063 56.6298 + 1270.3 122.08 24.4294 56.6318 + 1270.4 121.606 24.1526 56.6188 + 1270.5 121.122 23.8646 56.6208 + 1270.6 120.628 23.5878 56.6258 + 1270.7 120.154 23.3109 56.6238 + 1270.8 119.66 23.023 56.6208 + 1270.9 119.176 22.7351 56.6318 + 1271 118.682 22.4582 56.6289 + 1271.1 118.198 22.1703 56.6349 + 1271.2 117.704 21.8824 56.6369 + 1271.3 117.21 21.5945 56.6339 + 1271.4 116.705 21.3065 56.6259 + 1271.5 116.201 21.0076 56.6329 + 1271.6 115.696 20.7307 56.6279 + 1271.7 115.192 20.4317 56.6289 + 1271.8 114.677 20.1327 56.6179 + 1271.9 114.162 19.8337 56.6229 + 1272 113.647 19.5347 56.605 + 1272.1 113.122 19.2357 56.612 + 1272.2 112.597 18.9367 56.617 + 1272.3 112.072 18.6266 56.611 + 1272.4 111.537 18.3276 56.612 + 1272.5 111.001 18.0065 56.607 + 1272.6 110.476 17.7075 56.602 + 1272.7 109.93 17.3974 56.6 + 1272.8 109.385 17.0763 56.6 + 1272.9 108.839 16.7662 56.6 + 1273 108.283 16.4451 56.6121 + 1273.1 107.737 16.1239 56.6121 + 1273.2 107.181 15.8138 56.6121 + 1273.3 106.625 15.4816 56.6141 + 1273.4 106.069 15.1605 56.6181 + 1273.5 105.503 14.8393 56.6121 + 1273.6 104.937 14.5293 56.6201 + 1273.7 104.371 14.197 56.6161 + 1273.8 103.794 13.8759 56.6171 + 1273.9 103.228 13.5437 56.6242 + 1274 102.662 13.2225 56.6162 + 1274.1 102.095 12.8903 56.6182 + 1274.2 101.529 12.5692 56.6322 + 1274.3 100.963 12.248 56.6352 + 1274.4 100.396 11.9269 56.6342 + 1274.5 99.8404 11.6057 56.6342 + 1274.6 99.2844 11.2846 56.6502 + 1274.7 98.7182 10.9634 56.6432 + 1274.8 98.1622 10.6423 56.6502 + 1274.9 97.6165 10.3322 56.6572 + 1275 97.0708 10.0111 56.6563 + 1275.1 96.5148 9.68993 56.6663 + 1275.2 95.9794 9.37986 56.6533 + 1275.3 95.4234 9.06979 56.6603 + 1275.4 94.8881 8.74864 56.6653 + 1275.5 94.3424 8.43857 56.6573 + 1275.6 93.7967 8.1285 56.6673 + 1275.7 93.251 7.81843 56.6703 + 1275.8 92.7156 7.50836 56.6643 + 1275.9 92.1596 7.19828 56.6783 + 1276 91.6242 6.88821 56.6613 + 1276.1 91.0785 6.57814 56.6663 + 1276.2 90.5329 6.257 56.6714 + 1276.3 89.9769 5.94693 56.6734 + 1276.4 89.4312 5.63685 56.6724 + 1276.5 88.8855 5.32678 56.6824 + 1276.6 88.3398 5.01671 56.6704 + 1276.7 87.7735 4.69557 56.6794 + 1276.8 87.2278 4.3855 56.6884 + 1276.9 86.6925 4.07542 56.6874 + 1277 86.1365 3.75428 56.6824 + 1277.1 85.5805 3.44421 56.6864 + 1277.2 85.0348 3.12306 56.6884 + 1277.3 84.4788 2.81299 56.6834 + 1277.4 83.9228 2.49185 56.6754 + 1277.5 83.3669 2.18178 56.6685 + 1277.6 82.8109 1.86063 56.6705 + 1277.7 82.2549 1.53949 56.6615 + 1277.8 81.6989 1.21834 56.6655 + 1277.9 81.1429 0.908269 56.6555 + 1278 80.5766 0.587125 56.6485 + 1278.1 80.0207 0.26598 56.6535 + 1278.2 79.4544 -0.0551653 56.6545 + 1278.3 78.8984 -0.37631 56.6455 + 1278.4 78.3424 -0.697455 56.6465 + 1278.5 77.7761 -1.00753 56.6505 + 1278.6 77.2201 -1.32867 56.6425 + 1278.7 76.6539 -1.63874 56.6455 + 1278.8 76.0979 -1.94881 56.6505 + 1278.9 75.5316 -2.26996 56.6466 + 1279 74.9756 -2.5911 56.6486 + 1279.1 74.4093 -2.90117 56.6466 + 1279.2 73.8534 -3.21124 56.6516 + 1279.3 73.2974 -3.52131 56.6486 + 1279.4 72.7414 -3.83139 56.6396 + 1279.5 72.1854 -4.14146 56.6466 + 1279.6 71.6397 -4.45153 56.6346 + 1279.7 71.0837 -4.7616 56.6446 + 1279.8 70.538 -5.07167 56.6266 + 1279.9 69.9924 -5.37066 56.6316 + 1280 69.4467 -5.68074 56.6356 + 1280.1 68.901 -5.99081 56.6266 + 1280.2 68.3553 -6.2898 56.6336 + 1280.3 67.8096 -6.5888 56.6346 + 1280.4 67.2639 -6.89887 56.6286 + 1280.5 66.7285 -7.19787 56.6286 + 1280.6 66.1931 -7.49686 56.6307 + 1280.7 65.6474 -7.80693 56.6397 + 1280.8 65.1121 -8.09486 56.6387 + 1280.9 64.5767 -8.40493 56.6397 + 1281 64.0516 -8.70392 56.6347 + 1281.1 63.5162 -8.99185 56.6357 + 1281.2 62.9911 -9.29084 56.6307 + 1281.3 62.4557 -9.58984 56.6407 + 1281.4 61.9306 -9.87776 56.6287 + 1281.5 61.4158 -10.1768 56.6407 + 1281.6 60.8907 -10.4647 56.6377 + 1281.7 60.3759 -10.7637 56.6347 + 1281.8 59.8714 -11.0516 56.6447 + 1281.9 59.3566 -11.3395 56.6497 + 1282 58.8521 -11.6274 56.6337 + 1282.1 58.3476 -11.9154 56.6497 + 1282.2 57.8534 -12.1922 56.6477 + 1282.3 57.3489 -12.4801 56.6397 + 1282.4 56.8547 -12.757 56.6507 + 1282.5 56.3605 -13.0449 56.6407 + 1282.6 55.8765 -13.3218 56.6447 + 1282.7 55.3823 -13.5986 56.6427 + 1282.8 54.8984 -13.8755 56.6407 + 1282.9 54.4145 -14.1523 56.6438 + 1283 53.9306 -14.4181 56.6398 + 1283.1 53.457 -14.6949 56.6478 + 1283.2 52.9834 -14.9718 56.6348 + 1283.3 52.5097 -15.2375 56.6298 + 1283.4 52.0361 -15.5144 56.6388 + 1283.5 51.5625 -15.7802 56.6268 + 1283.6 51.0992 -16.057 56.6308 + 1283.7 50.6359 -16.3228 56.6288 + 1283.8 50.1623 -16.5775 56.6378 + 1283.9 49.6989 -16.8433 56.6358 + 1284 49.2253 -17.109 56.6248 + 1284.1 48.7723 -17.3748 56.6298 + 1284.2 48.309 -17.6295 56.6338 + 1284.3 47.8559 -17.8953 56.6238 + 1284.4 47.3926 -18.15 56.6288 + 1284.5 46.9396 -18.4158 56.6298 + 1284.6 46.4866 -18.6594 56.6358 + 1284.7 46.0336 -18.9252 56.6308 + 1284.8 45.5805 -19.1799 56.6308 + 1284.9 45.1275 -19.4235 56.6338 + 1285 44.6745 -19.6782 56.6338 + 1285.1 44.2215 -19.9329 56.6298 + 1285.2 43.7684 -20.1876 56.6328 + 1285.3 43.3154 -20.4312 56.6458 + 1285.4 42.8624 -20.6859 56.6468 + 1285.5 42.4197 -20.9295 56.6518 + 1285.6 41.9666 -21.1842 56.6538 + 1285.7 41.5136 -21.4389 56.6508 + 1285.8 41.0709 -21.6826 56.6588 + 1285.9 40.6179 -21.9262 56.6628 + 1286 40.1648 -22.1698 56.6728 + 1286.1 39.7221 -22.4245 56.6788 + 1286.2 39.2897 -22.6681 56.6778 + 1286.3 38.8366 -22.9118 56.6868 + 1286.4 38.3939 -23.1554 56.6878 + 1286.5 37.9512 -23.399 56.6878 + 1286.6 37.5187 -23.6426 56.6928 + 1286.7 37.076 -23.8863 56.6818 + 1286.8 36.6333 -24.1299 56.7018 + 1286.9 36.2009 -24.3735 56.7089 + 1287 35.7581 -24.6172 56.6959 + 1287.1 35.3154 -24.8608 56.7079 + 1287.2 34.883 -25.1044 56.6999 + 1287.3 34.4505 -25.348 56.7019 + 1287.4 34.0078 -25.6027 56.6979 + 1287.5 33.5754 -25.8353 56.6979 + 1287.6 33.1326 -26.09 56.6869 + 1287.7 32.7002 -26.3336 56.6869 + 1287.8 32.2575 -26.5772 56.6899 + 1287.9 31.8148 -26.8209 56.6769 + 1288 31.3926 -27.0645 56.6789 + 1288.1 30.9499 -27.3081 56.6749 + 1288.2 30.5175 -27.5517 56.6629 + 1288.3 30.0747 -27.8064 56.6509 + 1288.4 29.6423 -28.0501 56.6549 + 1288.5 29.2099 -28.2937 56.6489 + 1288.6 28.7877 -28.5262 56.6469 + 1288.7 28.3965 -28.7477 56.6099 + 1288.8 28.0258 -28.947 56.5659 + 1288.9 27.6655 -29.1464 56.5509 + 1289 27.3669 -29.3236 56.5329 + 1289.1 27.0992 -29.4786 56.5169 + 1289.2 26.8933 -29.6004 56.5339 + 1289.3 26.6873 -29.7111 56.5759 + 1289.4 26.4917 -29.8108 56.5829 + 1289.5 26.3064 -29.8773 56.5819 + 1289.6 26.1519 -29.9105 56.5599 + 1289.7 25.9769 -29.9326 56.5459 + 1289.8 25.8122 -29.9326 56.5489 + 1289.9 25.6268 -29.9105 56.5469 + 1290 25.4415 -29.8551 56.5509 + 1290.1 25.2562 -29.7887 56.5529 + 1290.2 25.0709 -29.689 56.5629 + 1290.3 24.8752 -29.5672 56.5739 + 1290.4 24.6899 -29.4454 56.5689 + 1290.5 24.5046 -29.2903 56.5779 + 1290.6 24.3089 -29.1132 56.5729 + 1290.7 24.1133 -28.936 56.5729 + 1290.8 23.928 -28.7367 56.5769 + 1290.9 23.7221 -28.5262 56.5709 + 1291 23.5161 -28.2937 56.5709 + 1291.1 23.3102 -28.039 56.5689 + 1291.2 23.1043 -27.7732 56.5589 + 1291.3 22.8881 -27.4964 56.5599 + 1291.4 22.6616 -27.2085 56.5699 + 1291.5 22.4351 -26.8984 56.5609 + 1291.6 22.1983 -26.5773 56.5609 + 1291.7 21.9614 -26.2229 56.5619 + 1291.8 21.7143 -25.8685 56.5539 + 1291.9 21.4569 -25.5031 56.5469 + 1292 21.2098 -25.1155 56.5539 + 1292.1 20.9421 -24.7058 56.5579 + 1292.2 20.6641 -24.285 56.5589 + 1292.3 20.3861 -23.842 56.5459 + 1292.4 20.0979 -23.388 56.5529 + 1292.5 19.8096 -22.9229 56.5609 + 1292.6 19.511 -22.4356 56.5569 + 1292.7 19.2021 -21.9373 56.5649 + 1292.8 18.8829 -21.4279 56.5699 + 1292.9 18.574 -20.9185 56.5759 + 1293 18.2549 -20.387 56.5859 + 1293.1 17.9254 -19.8554 56.5839 + 1293.2 17.5959 -19.3017 56.5819 + 1293.3 17.2664 -18.748 56.5899 + 1293.4 16.9267 -18.1943 56.593 + 1293.5 16.5869 -17.6185 56.594 + 1293.6 16.2471 -17.0427 56.59 + 1293.7 15.9074 -16.4668 56.583 + 1293.8 15.5676 -15.891 56.578 + 1293.9 15.2175 -15.3041 56.583 + 1294 14.8675 -14.7172 56.584 + 1294.1 14.5071 -14.1192 56.584 + 1294.2 14.157 -13.5212 56.585 + 1294.3 13.807 -12.9232 56.568 + 1294.4 13.4569 -12.3252 56.579 + 1294.5 13.0965 -11.7161 56.577 + 1294.6 12.7362 -11.1071 56.579 + 1294.7 12.3758 -10.498 56.585 + 1294.8 12.0155 -9.88895 56.585 + 1294.9 11.6551 -9.26882 56.577 + 1295 11.2844 -8.64868 56.591 + 1295.1 10.9138 -8.02855 56.595 + 1295.2 10.5431 -7.39734 56.596 + 1295.3 10.1828 -6.7772 56.6 + 1295.4 9.81211 -6.14599 56.611 + 1295.5 9.44145 -5.51478 56.599 + 1295.6 9.0605 -4.88357 56.607 + 1295.7 8.70014 -4.25236 56.624 + 1295.8 8.32948 -3.62115 56.612 + 1295.9 7.94853 -2.98994 56.625 + 1296 7.57787 -2.35873 56.626 + 1296.1 7.20721 -1.71645 56.624 + 1296.2 6.83656 -1.09631 56.633 + 1296.3 6.4762 -0.465101 56.636 + 1296.4 6.11583 0.155035 56.625 + 1296.5 5.75547 0.775171 56.638 + 1296.6 5.39511 1.39531 56.646 + 1296.7 5.03475 1.9933 56.648 + 1296.8 4.68469 2.59128 56.665 + 1296.9 4.36551 3.14498 56.654 + 1297 4.08752 3.6433 56.622 + 1297.1 3.77864 4.1527 56.615 + 1297.2 3.51094 4.6178 56.643 + 1297.3 3.26384 5.02753 56.658 + 1297.4 3.04762 5.3819 56.667 + 1297.5 2.86229 5.69197 56.677 + 1297.6 2.68726 5.96881 56.679 + 1297.7 2.54312 6.21244 56.66 + 1297.8 2.39897 6.42284 56.628 + 1297.9 2.26512 6.62217 56.592 + 1298 2.15187 6.78828 56.529 + 1298.1 2.0592 6.93224 56.431 + 1298.2 1.96654 7.06512 56.298 + 1298.3 1.88417 7.18694 56.137 + 1298.4 1.82239 7.29767 55.953 + 1298.5 1.74003 7.40841 55.734 + 1298.6 1.67825 7.497 55.502 + 1298.7 1.62677 7.58559 55.24 + 1298.8 1.58559 7.66311 54.962 + 1298.9 1.5547 7.72955 54.671 + 1299 1.51351 7.78492 54.385 + 1299.1 1.49292 7.82922 54.08 + 1299.2 1.47233 7.88459 53.766 + 1299.3 1.46203 7.91781 53.478 + 1299.4 1.46203 7.95103 53.148 + 1299.5 1.45174 7.98425 52.821 + 1299.6 1.45174 8.0064 52.491 + 1299.7 1.45174 8.01747 52.172 + 1299.8 1.46203 8.02854 51.833 + 1299.9 1.47233 8.03962 51.493 + 1300 1.49292 8.03962 51.165 + 1300.1 1.50322 8.03962 50.854 + 1300.2 1.52381 8.03962 50.539 + 1300.3 1.5341 8.02854 50.213 + 1300.4 1.5547 8.01747 49.892 + 1300.5 1.56499 8.00639 49.565 + 1300.6 1.59588 8.00639 49.225 + 1300.7 1.60618 8.00639 48.875 + 1300.8 1.62677 7.99532 48.522 + 1300.9 1.63706 7.99532 48.156 + 1301 1.66795 7.98424 47.781 + 1301.1 1.68854 7.98424 47.399 + 1301.2 1.69884 7.97317 47.018 + 1301.3 1.70914 7.97317 46.636 + 1301.4 1.72973 7.97317 46.246 + 1301.5 1.74002 7.97317 45.868 + 1301.6 1.75032 7.97317 45.5 + 1301.7 1.75032 7.97317 45.133 + 1301.8 1.74002 7.96209 44.789 + 1301.9 1.72973 7.95102 44.466 + 1302 1.71943 7.93994 44.128 + 1302.1 1.70913 7.92887 43.803 + 1302.2 1.70913 7.91779 43.489 + 1302.3 1.70913 7.90672 43.184 + 1302.4 1.69884 7.89565 42.873 + 1302.5 1.67825 7.88457 42.596 + 1302.6 1.66795 7.8735 42.324 + 1302.7 1.66795 7.8735 42.041 + 1302.8 1.65765 7.86242 41.757 + 1302.9 1.63706 7.85135 41.498 + 1303 1.61647 7.84027 41.236 + 1303.1 1.59588 7.81813 40.973 + 1303.2 1.55469 7.78491 40.704 + 1303.3 1.51351 7.76276 40.438 + 1303.4 1.48262 7.74061 40.176 + 1303.5 1.42085 7.69631 39.907 + 1303.6 1.35907 7.66309 39.665 + 1303.7 1.287 7.6188 39.415 + 1303.8 1.21493 7.56343 39.162 + 1303.9 1.12226 7.50806 38.895 + 1304 1.0296 7.44161 38.646 + 1304.1 0.926639 7.37517 38.385 + 1304.2 0.813383 7.29765 38.129 + 1304.3 0.700127 7.20906 37.869 + 1304.4 0.566279 7.12047 37.614 + 1304.5 0.432431 7.04295 37.351 + 1304.6 0.288288 6.96544 37.096 + 1304.7 0.144144 6.87685 36.833 + 1304.8 -0.010296 6.78826 36.583 + 1304.9 -0.164736 6.69966 36.336 + 1305 -0.329471 6.62215 36.079 + 1305.1 -0.463319 6.56678 35.821 + 1305.2 -0.597167 6.51141 35.538 + 1305.3 -0.720719 6.44497 35.258 + 1305.4 -0.833974 6.37852 35.02 + 1305.5 -0.936934 6.31208 34.767 + 1305.6 -1.0296 6.24564 34.5 + 1305.7 -1.10167 6.20134 34.228 + 1305.8 -1.16345 6.15704 33.927 + 1305.9 -1.22522 6.12382 33.61 + 1306 -1.287 6.07953 33.311 + 1306.1 -1.33848 6.03523 32.987 + 1306.2 -1.41055 6.00201 32.67 + 1306.3 -1.46203 5.95771 32.361 + 1306.4 -1.5238 5.92449 32.038 + 1306.5 -1.57528 5.90235 31.715 + 1306.6 -1.62676 5.86912 31.369 + 1306.7 -1.67824 5.84698 31.04 + 1306.8 -1.71943 5.82483 30.713 + 1306.9 -1.76061 5.80268 30.406 + 1307 -1.81209 5.78053 30.122 + 1307.1 -1.84298 5.75838 29.842 + 1307.2 -1.86357 5.74731 29.543 + 1307.3 -1.87387 5.72516 29.257 + 1307.4 -1.88416 5.71409 28.978 + 1307.5 -1.89446 5.70301 28.724 + 1307.6 -1.90475 5.69194 28.463 + 1307.7 -1.91505 5.69194 28.208 + 1307.8 -1.92535 5.69194 27.943 + 1307.9 -1.93564 5.69194 27.7 + 1308 -1.93564 5.69194 27.438 + 1308.1 -1.92535 5.70301 27.173 + 1308.2 -1.92535 5.70301 26.911 + 1308.3 -1.94594 5.71409 26.66 + 1308.4 -1.95623 5.71409 26.422 + 1308.5 -1.95623 5.72516 26.171 + 1308.6 -1.95623 5.72516 25.906 + 1308.7 -1.94594 5.72516 25.653 + 1308.8 -1.94594 5.73623 25.397 + 1308.9 -1.93564 5.73623 25.142 + 1309 -1.92535 5.73623 24.894 + 1309.1 -1.92535 5.74731 24.649 + 1309.2 -1.91505 5.74731 24.406 + 1309.3 -1.89446 5.75838 24.147 + 1309.4 -1.87387 5.75838 23.889 + 1309.5 -1.86357 5.75838 23.642 + 1309.6 -1.86357 5.75838 23.406 + 1309.7 -1.86357 5.75838 23.167 + 1309.8 -1.85327 5.75838 22.942 + 1309.9 -1.85327 5.76945 22.715 + 1310 -1.85327 5.76945 22.499 + 1310.1 -1.87386 5.76945 22.288 + 1310.2 -1.86357 5.75838 22.073 + 1310.3 -1.86357 5.76945 21.877 + 1310.4 -1.88416 5.76945 21.669 + 1310.5 -1.88416 5.76945 21.465 + 1310.6 -1.88416 5.76945 21.269 + 1310.7 -1.90475 5.76945 21.065 + 1310.8 -1.91505 5.76945 20.856 + 1310.9 -1.91505 5.76945 20.648 + 1311 -1.92534 5.76945 20.43 + 1311.1 -1.91505 5.76945 20.214 + 1311.2 -1.92534 5.76945 19.995 + 1311.3 -1.92534 5.76945 19.785 + 1311.4 -1.93564 5.76945 19.577 + 1311.5 -1.92534 5.76945 19.363 + 1311.6 -1.92534 5.76945 19.148 + 1311.7 -1.91505 5.75837 18.932 + 1311.8 -1.91505 5.75837 18.713 + 1311.9 -1.90475 5.75837 18.518 + 1312 -1.89446 5.75837 18.312 + 1312.1 -1.89446 5.7473 18.101 + 1312.2 -1.89446 5.7473 17.898 + 1312.3 -1.89446 5.73623 17.692 + 1312.4 -1.87386 5.72515 17.495 + 1312.5 -1.87386 5.71408 17.289 + 1312.6 -1.85327 5.703 17.076 + 1312.7 -1.84298 5.69193 16.886 + 1312.8 -1.83268 5.68086 16.694 + 1312.9 -1.82238 5.65871 16.508 + 1313 -1.81209 5.64763 16.331 + 1313.1 -1.81209 5.64763 16.121 + 1313.2 -1.81209 5.62549 15.943 + 1313.3 -1.81209 5.61441 15.731 + 1313.4 -1.7915 5.61441 15.52 + 1313.5 -1.7812 5.61441 15.329 + 1313.6 -1.80179 5.61441 15.133 + 1313.7 -1.80179 5.61441 14.933 + 1313.8 -1.81209 5.62548 14.721 + 1313.9 -1.81209 5.62548 14.53 + 1314 -1.82238 5.64763 14.326 + 1314.1 -1.82238 5.64763 14.116 + 1314.2 -1.82238 5.65871 13.913 + 1314.3 -1.83268 5.65871 13.73 + 1314.4 -1.83268 5.68085 13.526 + 1314.5 -1.82238 5.68085 13.335 + 1314.6 -1.81209 5.69193 13.148 + 1314.7 -1.80179 5.703 12.951 + 1314.8 -1.81209 5.703 12.75 + 1314.9 -1.79149 5.71407 12.56 + 1315 -1.7812 5.71407 12.361 + 1315.1 -1.7709 5.72515 12.163 + 1315.2 -1.76061 5.72515 11.964 + 1315.3 -1.75031 5.72515 11.764 + 1315.4 -1.74001 5.73622 11.564 + 1315.5 -1.74001 5.73622 11.382 + 1315.6 -1.72972 5.73622 11.189 + 1315.7 -1.72972 5.74729 10.984 + 1315.8 -1.71942 5.73622 10.8 + 1315.9 -1.70913 5.74729 10.605 + 1316 -1.70913 5.74729 10.414 + 1316.1 -1.69883 5.74729 10.232 + 1316.2 -1.69883 5.74729 10.049 + 1316.3 -1.70913 5.74729 9.862 + 1316.4 -1.71942 5.74729 9.694 + 1316.5 -1.74001 5.73622 9.516 + 1316.6 -1.75031 5.73622 9.326 + 1316.7 -1.7812 5.74729 9.144 + 1316.8 -1.79149 5.73622 8.962 + 1316.9 -1.81209 5.73622 8.778 + 1317 -1.83268 5.74729 8.601 + 1317.1 -1.85327 5.73622 8.456 + 1317.2 -1.84297 5.73622 8.31 + 1317.3 -1.84297 5.72514 8.193 + 1317.4 -1.83268 5.73622 8.09 + 1317.5 -1.82238 5.73622 8.031 + 1317.6 -1.81208 5.71407 7.999 + 1317.7 -1.79149 5.71407 7.969 + 1317.8 -1.7709 5.70299 7.946 + 1317.9 -1.76061 5.70299 7.944 + 1318 -1.74001 5.69192 7.945 + 1318.1 -1.71942 5.66977 7.96 + 1318.2 -1.68853 5.63655 7.968 + 1318.3 -1.65765 5.60333 7.968 + 1318.4 -1.62676 5.54796 7.999 + 1318.5 -1.58557 5.48152 8.016 + 1318.6 -1.53409 5.404 8.017 + 1318.7 -1.48261 5.31541 8.021 + 1318.8 -1.43114 5.21575 8.031 + 1318.9 -1.35906 5.09394 8.037 + 1319 -1.28699 4.97213 8.037 + 1319.1 -1.21492 4.85031 8.027 + 1319.2 -1.14285 4.70636 8.025 + 1319.3 -1.06048 4.5624 8.014 + 1319.4 -0.978114 4.41844 8.005 + 1319.5 -0.895747 4.25233 8.007 + 1319.6 -0.803083 4.08622 7.984 + 1319.7 -0.71042 3.92012 7.99 + 1319.8 -0.617756 3.74294 7.976 + 1319.9 -0.514797 3.57683 7.974 + 1320 -0.411838 3.38858 7.963 + 1320.1 -0.319174 3.2114 7.957 + 1320.2 -0.226511 3.03421 7.952 + 1320.3 -0.144143 2.87918 7.952 + 1320.4 -0.0823675 2.73522 7.953 + 1320.5 -0.0205919 2.61341 7.94 + 1320.6 0.0514797 2.48053 7.944 + 1320.7 0.102959 2.38086 7.966 + 1320.8 0.144143 2.2812 7.974 + 1320.9 0.164735 2.20368 7.959 + 1321 0.175031 2.13724 7.969 + 1321.1 0.185327 2.0708 7.961 + 1321.2 0.175031 2.00435 7.962 + 1321.3 0.164735 1.92684 7.956 + 1321.4 0.144143 1.84932 7.964 + 1321.5 0.113255 1.78288 7.965 + 1321.6 0.0720716 1.70536 7.958 + 1321.7 0.0102959 1.62785 7.964 + 1321.8 -0.0514797 1.55033 7.972 + 1321.9 -0.113255 1.46174 7.971 + 1322 -0.195623 1.37315 7.975 + 1322.1 -0.288286 1.28456 7.974 + 1322.2 -0.38095 1.19597 7.975 + 1322.3 -0.494205 1.0963 7.995 + 1322.4 -0.597164 0.985566 7.982 + 1322.5 -0.720716 0.885902 7.987 + 1322.6 -0.854563 0.775164 7.981 + 1322.7 -0.98841 0.664427 7.984 + 1322.8 -1.10167 0.575836 7.967 + 1322.9 -1.21492 0.509394 7.923 + 1323 -1.32818 0.420804 7.931 + 1323.1 -1.44143 0.332213 7.943 + 1323.2 -1.54439 0.265771 7.951 + 1323.3 -1.63705 0.210402 7.956 + 1323.4 -1.71942 0.177181 7.954 + 1323.5 -1.81209 0.143959 7.953 + 1323.6 -1.90475 0.121812 7.96 + 1323.7 -1.99741 0.110738 7.95 + 1323.8 -2.10037 0.110738 7.935 + 1323.9 -2.20333 0.110738 7.936 + 1324 -2.30629 0.132885 7.941 + 1324.1 -2.39895 0.166107 7.953 + 1324.2 -2.50191 0.199328 7.946 + 1324.3 -2.60487 0.254697 7.938 + 1324.4 -2.71813 0.298992 7.937 + 1324.5 -2.82109 0.354361 7.935 + 1324.6 -2.90346 0.398656 7.925 + 1324.7 -2.97553 0.431878 7.926 + 1324.8 -3.0476 0.476173 7.908 + 1324.9 -3.12997 0.509394 7.915 + 1325 -3.19174 0.542615 7.92 + 1325.1 -3.23293 0.553689 7.901 + 1325.2 -3.27411 0.564763 7.896 + 1325.3 -3.31529 0.586911 7.887 + 1325.4 -3.33588 0.597984 7.855 + 1325.5 -3.35648 0.609058 7.826 + 1325.6 -3.37707 0.609058 7.78 + 1325.7 -3.38736 0.620132 7.727 + 1325.8 -3.38736 0.620132 7.687 + 1325.9 -3.40796 0.620132 7.64 + 1326 -3.40796 0.631206 7.554 + 1326.1 -3.39766 0.631206 7.493 + 1326.2 -3.40796 0.631206 7.417 + 1326.3 -3.40796 0.620132 7.359 + 1326.4 -3.39766 0.631206 7.303 + 1326.5 -3.39766 0.620132 7.239 + 1326.6 -3.40796 0.620132 7.183 + 1326.7 -3.39766 0.620132 7.122 + 1326.8 -3.39766 0.620132 7.081 + 1326.9 -3.39766 0.609058 7.023 + 1327 -3.38736 0.609058 6.968 + 1327.1 -3.38736 0.609058 6.943 + 1327.2 -3.37707 0.609058 6.914 + 1327.3 -3.37707 0.609058 6.866 + 1327.4 -3.36677 0.597984 6.834 + 1327.5 -3.35648 0.597984 6.802 + 1327.6 -3.33588 0.597984 6.772 + 1327.7 -3.32559 0.597984 6.744 + 1327.8 -3.31529 0.597984 6.726 + 1327.9 -3.305 0.597984 6.704 + 1328 -3.2844 0.597984 6.679 + 1328.1 -3.26381 0.597984 6.662 + 1328.2 -3.23292 0.609058 6.649 + 1328.3 -3.21233 0.609058 6.625 + 1328.4 -3.19174 0.631205 6.596 + 1328.5 -3.16085 0.631205 6.582 + 1328.6 -3.11967 0.642279 6.555 + 1328.7 -3.08878 0.653353 6.541 + 1328.8 -3.0476 0.675501 6.539 + 1328.9 -3.00641 0.697648 6.498 + 1329 -2.96523 0.719796 6.49 + 1329.1 -2.92405 0.741943 6.469 + 1329.2 -2.86227 0.775164 6.424 + 1329.3 -2.81079 0.808386 6.414 + 1329.4 -2.73872 0.841607 6.407 + 1329.5 -2.67694 0.874828 6.376 + 1329.6 -2.60487 0.919123 6.356 + 1329.7 -2.5431 0.952345 6.334 + 1329.8 -2.49162 0.99664 6.327 + 1329.9 -2.42984 1.01879 6.305 + 1330 -2.36807 1.06308 6.279 + 1330.1 -2.32688 1.0963 6.251 + 1330.2 -2.2857 1.11845 6.228 + 1330.3 -2.25481 1.1406 6.188 + 1330.4 -2.24451 1.15167 6.174 + 1330.5 -2.22392 1.16275 6.163 + 1330.6 -2.20333 1.18489 6.114 + 1330.7 -2.19303 1.19597 6.078 + 1330.8 -2.18274 1.21812 6.035 + 1330.9 -2.17244 1.21812 5.984 + 1331 -2.17244 1.22919 5.958 + 1331.1 -2.16215 1.22919 5.917 + 1331.2 -2.16215 1.24026 5.877 + 1331.3 -2.16215 1.25134 5.83 + 1331.4 -2.15185 1.25134 5.803 + 1331.5 -2.15185 1.25134 5.764 + 1331.6 -2.15185 1.25134 5.745 + 1331.7 -2.14155 1.25134 5.74 + 1331.8 -2.13126 1.25134 5.745 + 1331.9 -2.11067 1.25134 5.742 + 1332 -2.12096 1.25134 5.738 + 1332.1 -2.13126 1.25134 5.733 + 1332.2 -2.13126 1.25134 5.732 + 1332.3 -2.13126 1.24026 5.729 + 1332.4 -2.13126 1.25134 5.739 + 1332.5 -2.13126 1.24026 5.733 + 1332.6 -2.13126 1.25134 5.727 + 1332.7 -2.13126 1.24026 5.726 + 1332.8 -2.14155 1.24026 5.727 + 1332.9 -2.14155 1.25134 5.725 + 1333 -2.14155 1.25134 5.725 + 1333.1 -2.14155 1.24026 5.72 + 1333.2 -2.14155 1.24026 5.72 + 1333.3 -2.14155 1.24026 5.724 + 1333.4 -2.14155 1.25134 5.718 + 1333.5 -2.14155 1.24026 5.71 + 1333.6 -2.14155 1.24026 5.728 + 1333.7 -2.14155 1.24026 5.717 + 1333.8 -2.14155 1.25134 5.719 + 1333.9 -2.14155 1.24026 5.726 + 1334 -2.15185 1.25134 5.719 + 1334.1 -2.14155 1.24026 5.713 + 1334.2 -2.14155 1.24026 5.73 + 1334.3 -2.15185 1.24026 5.716 + 1334.4 -2.14155 1.24026 5.704 + 1334.5 -2.14155 1.24026 5.707 + 1334.6 -2.14155 1.24026 5.7 + 1334.7 -2.15185 1.25134 5.705 + 1334.8 -2.14155 1.24026 5.7 + 1334.9 -2.14155 1.24026 5.7 + 1335 -2.14155 1.24026 5.711 + 1335.1 -2.15185 1.24026 5.695 + 1335.2 -2.15185 1.24026 5.689 + 1335.3 -2.15185 1.24026 5.691 + 1335.4 -2.15185 1.24026 5.686 + 1335.5 -2.15185 1.24026 5.689 + 1335.6 -2.15185 1.24026 5.682 + 1335.7 -2.15185 1.24026 5.678 + 1335.8 -2.15185 1.24026 5.679 + 1335.9 -2.15185 1.24026 5.683 + 1336 -2.15185 1.24026 5.677 + 1336.1 -2.15185 1.24026 5.67 + 1336.2 -2.15185 1.24026 5.667 + 1336.3 -2.16215 1.24026 5.679 + 1336.4 -2.15185 1.24026 5.663 + 1336.5 -2.15185 1.24026 5.665 + 1336.6 -2.15185 1.24026 5.671 + 1336.7 -2.15185 1.25134 5.659 + 1336.8 -2.15185 1.24026 5.654 + 1336.9 -2.15185 1.24026 5.655 + 1337 -2.15185 1.24026 5.654 + 1337.1 -2.15185 1.24026 5.654 + 1337.2 -2.15185 1.24026 5.65 + 1337.3 -2.15185 1.24026 5.634 + 1337.4 -2.15185 1.24026 5.632 + 1337.5 -2.15185 1.24026 5.645 + 1337.6 -2.15185 1.24026 5.632 + 1337.7 -2.15185 1.25134 5.622 + 1337.8 -2.15185 1.24026 5.633 + 1337.9 -2.14155 1.24026 5.63 + 1338 -2.15185 1.24026 5.619 + 1338.1 -2.15185 1.24026 5.617 + 1338.2 -2.15185 1.24026 5.615 + 1338.3 -2.15185 1.25134 5.614 + 1338.4 -2.15185 1.24026 5.606 + 1338.5 -2.15185 1.25134 5.611 + 1338.6 -2.14155 1.24026 5.601 + 1338.7 -2.14155 1.24026 5.602 + 1338.8 -2.14155 1.24026 5.607 + 1338.9 -2.15185 1.24026 5.616 + 1339 -2.14155 1.24026 5.6 + 1339.1 -2.15185 1.24026 5.599 + 1339.2 -2.15185 1.25134 5.598 + 1339.3 -2.14155 1.24026 5.603 + 1339.4 -2.14155 1.24026 5.584 + 1339.5 -2.14155 1.25134 5.588 + 1339.6 -2.14155 1.24026 5.587 + 1339.7 -2.14155 1.24026 5.584 + 1339.8 -2.14155 1.24026 5.58 + 1339.9 -2.14155 1.24026 5.574 + 1340 -2.13126 1.24026 5.577 + 1340.1 -2.13126 1.24026 5.572 + 1340.2 -2.13126 1.24026 5.577 + 1340.3 -2.13126 1.24026 5.565 + 1340.4 -2.13126 1.24026 5.567 + 1340.5 -2.13126 1.24026 5.564 + 1340.6 -2.13126 1.25134 5.561 + 1340.7 -2.13126 1.24026 5.558 + 1340.8 -2.13126 1.25134 5.553 + 1340.9 -2.12096 1.25134 5.552 + 1341 -2.12096 1.25134 5.546 + 1341.1 -2.12096 1.25134 5.549 + 1341.2 -2.12096 1.25134 5.545 + 1341.3 -2.12096 1.25134 5.548 + 1341.4 -2.12096 1.25134 5.55 + 1341.5 -2.12096 1.25134 5.542 + 1341.6 -2.12096 1.25134 5.539 + 1341.7 -2.12096 1.25134 5.535 + 1341.8 -2.12096 1.25134 5.539 + 1341.9 -2.12096 1.25134 5.532 + 1342 -2.11067 1.25134 5.539 + 1342.1 -2.11067 1.25134 5.532 + 1342.2 -2.11067 1.25134 5.531 + 1342.3 -2.11067 1.25134 5.535 + 1342.4 -2.11067 1.25134 5.524 + 1342.5 -2.11067 1.25134 5.52 + 1342.6 -2.11067 1.25134 5.525 + 1342.7 -2.11067 1.25134 5.519 + 1342.8 -2.10037 1.25134 5.519 + 1342.9 -2.10037 1.25134 5.523 + 1343 -2.10037 1.25134 5.515 + 1343.1 -2.11067 1.25134 5.524 + 1343.2 -2.10037 1.25134 5.519 + 1343.3 -2.10037 1.25134 5.525 + 1343.4 -2.10037 1.25134 5.512 + 1343.5 -2.10037 1.25134 5.508 + 1343.6 -2.10037 1.25134 5.51 + 1343.7 -2.10037 1.25134 5.516 + 1343.8 -2.09007 1.25134 5.507 + 1343.9 -2.10037 1.25134 5.51 + 1344 -2.10037 1.25134 5.509 + 1344.1 -2.09007 1.25134 5.517 + 1344.2 -2.10037 1.25134 5.511 + 1344.3 -2.09007 1.25134 5.506 + 1344.4 -2.10037 1.25134 5.504 + 1344.5 -2.09007 1.25134 5.516 + 1344.6 -2.10037 1.25134 5.503 + 1344.7 -2.10037 1.25134 5.518 + 1344.8 -2.10037 1.25134 5.501 + 1344.9 -2.09007 1.25134 5.504 + 1345 -2.09007 1.25134 5.514 + 1345.1 -2.10037 1.25134 5.508 + 1345.2 -2.09007 1.25134 5.507 + 1345.3 -2.09007 1.25134 5.504 + 1345.4 -2.09007 1.25134 5.511 + 1345.5 -2.09007 1.25134 5.502 + 1345.6 -2.09007 1.25134 5.503 + 1345.7 -2.09007 1.25134 5.5 + 1345.8 -2.09007 1.25134 5.503 + 1345.9 -2.09007 1.25134 5.508 + 1346 -2.09007 1.25134 5.501 + 1346.1 -2.10037 1.24026 5.517 + 1346.2 -2.10037 1.25134 5.498 + 1346.3 -2.10037 1.25134 5.501 + 1346.4 -2.09007 1.25134 5.514 + 1346.5 -2.09007 1.25134 5.513 + 1346.6 -2.09007 1.24026 5.506 + 1346.7 -2.09007 1.24026 5.504 + 1346.8 -2.09007 1.24026 5.511 + 1346.9 -2.09007 1.25134 5.503 + 1347 -2.09007 1.24026 5.503 + 1347.1 -2.09007 1.24026 5.501 + 1347.2 -2.09007 1.24026 5.507 + 1347.3 -2.09007 1.24026 5.497 + 1347.4 -2.07978 1.24026 5.503 + 1347.5 -2.07978 1.24026 5.495 + 1347.6 -2.07978 1.24026 5.489 + 1347.7 -2.07978 1.24026 5.49 + 1347.8 -2.07978 1.24026 5.497 + 1347.9 -2.07978 1.24026 5.492 + 1348 -2.07978 1.24026 5.485 + 1348.1 -2.07978 1.24026 5.494 + 1348.2 -2.07978 1.24026 5.487 + 1348.3 -2.07978 1.24026 5.479 + 1348.4 -2.07978 1.24026 5.477 + 1348.5 -2.07978 1.24026 5.487 + 1348.6 -2.07978 1.24026 5.48 + 1348.7 -2.07978 1.24026 5.484 + 1348.8 -2.06948 1.24026 5.479 + 1348.9 -2.06948 1.24026 5.478 + 1349 -2.07978 1.24026 5.493 + 1349.1 -2.06948 1.24026 5.479 + 1349.2 -2.06948 1.24026 5.474 + 1349.3 -2.06948 1.24026 5.481 + 1349.4 -2.06948 1.24026 5.49 + 1349.5 -2.06948 1.24026 5.476 + 1349.6 -2.06948 1.22919 5.49 + 1349.7 -2.06948 1.24026 5.483 + 1349.8 -2.06948 1.24026 5.487 + 1349.9 -2.07978 1.22919 5.489 + 1350 -2.06948 1.24026 5.483 + 1350.1 -2.06948 1.22919 5.485 + 1350.2 -2.07978 1.24026 5.484 + 1350.3 -2.07978 1.22919 5.488 + 1350.4 -2.06948 1.22919 5.483 + 1350.5 -2.06948 1.24026 5.486 + 1350.6 -2.06948 1.24026 5.487 + 1350.7 -2.06948 1.22919 5.481 + 1350.8 -2.07978 1.22919 5.486 + 1350.9 -2.06948 1.24026 5.481 + 1351 -2.06948 1.24026 5.484 + 1351.1 -2.07978 1.24026 5.476 + 1351.2 -2.07978 1.24026 5.481 + 1351.3 -2.07978 1.22919 5.473 + 1351.4 -2.06948 1.22919 5.472 + 1351.5 -2.07978 1.22919 5.475 + 1351.6 -2.07978 1.24026 5.475 + 1351.7 -2.06948 1.24026 5.476 + 1351.8 -2.07978 1.24026 5.478 + 1351.9 -2.07978 1.24026 5.478 + 1352 -2.07978 1.24026 5.472 + 1352.1 -2.06948 1.24026 5.475 + 1352.2 -2.06948 1.24026 5.487 + 1352.3 -2.07978 1.24026 5.47 + 1352.4 -2.07978 1.24026 5.474 + 1352.5 -2.07978 1.24026 5.471 + 1352.6 -2.07978 1.24026 5.481 + 1352.7 -2.07978 1.24026 5.486 + 1352.8 -2.07978 1.24026 5.473 + 1352.9 -2.07978 1.24026 5.489 + 1353 -2.09007 1.24026 5.486 + 1353.1 -2.09007 1.24026 5.481 + 1353.2 -2.09007 1.24026 5.485 + 1353.3 -2.09007 1.24026 5.488 + 1353.4 -2.09007 1.24026 5.496 + 1353.5 -2.09007 1.24026 5.486 + 1353.6 -2.09007 1.24026 5.497 + 1353.7 -2.09007 1.25134 5.499 + 1353.8 -2.09007 1.25134 5.497 + 1353.9 -2.09007 1.25134 5.495 + 1354 -2.09007 1.25134 5.486 + 1354.1 -2.09007 1.25134 5.5 + 1354.2 -2.09007 1.25134 5.494 + 1354.3 -2.09007 1.25134 5.497 + 1354.4 -2.10037 1.25134 5.49 + 1354.5 -2.09007 1.25134 5.5 + 1354.6 -2.09007 1.25134 5.494 + 1354.7 -2.09007 1.25134 5.495 + 1354.8 -2.10037 1.25134 5.501 + 1354.9 -2.10037 1.25134 5.496 + 1355 -2.09007 1.25134 5.501 + 1355.1 -2.10037 1.25134 5.489 + 1355.2 -2.10037 1.25134 5.495 + 1355.3 -2.10037 1.25134 5.494 + 1355.4 -2.10037 1.25134 5.508 + 1355.5 -2.09007 1.25134 5.497 + 1355.6 -2.09007 1.25134 5.505 + 1355.7 -2.10037 1.25134 5.507 + 1355.8 -2.10037 1.25134 5.501 + 1355.9 -2.10037 1.26241 5.511 + 1356 -2.10037 1.25134 5.499 + 1356.1 -2.10037 1.25134 5.501 + 1356.2 -2.10037 1.25134 5.497 + 1356.3 -2.10037 1.25134 5.487 + 1356.4 -2.10037 1.26241 5.495 + 1356.5 -2.10037 1.26241 5.496 + 1356.6 -2.10037 1.25134 5.493 + 1356.7 -2.10037 1.25134 5.497 + 1356.8 -2.11067 1.26241 5.499 + 1356.9 -2.10037 1.26241 5.497 + 1357 -2.10037 1.26241 5.496 + 1357.1 -2.10037 1.26241 5.505 + 1357.2 -2.11067 1.26241 5.511 + 1357.3 -2.11067 1.26241 5.503 + 1357.4 -2.10037 1.26241 5.496 + 1357.5 -2.10037 1.26241 5.497 + 1357.6 -2.11067 1.26241 5.506 + 1357.7 -2.10037 1.26241 5.507 + 1357.8 -2.11067 1.26241 5.505 + 1357.9 -2.11067 1.26241 5.509 + 1358 -2.11067 1.26241 5.507 + 1358.1 -2.11067 1.26241 5.493 + 1358.2 -2.11067 1.26241 5.502 + 1358.3 -2.11067 1.25134 5.502 + 1358.4 -2.11067 1.26241 5.503 + 1358.5 -2.11067 1.25134 5.506 + 1358.6 -2.11067 1.26241 5.503 + 1358.7 -2.12096 1.25134 5.498 + 1358.8 -2.11067 1.25134 5.505 + 1358.9 -2.11067 1.25134 5.506 + 1359 -2.12096 1.25134 5.499 + 1359.1 -2.11067 1.25134 5.498 + 1359.2 -2.11067 1.25134 5.508 + 1359.3 -2.11067 1.25134 5.508 + 1359.4 -2.11067 1.25134 5.497 + 1359.5 -2.11067 1.25134 5.492 + 1359.6 -2.11067 1.24026 5.495 + 1359.7 -2.11067 1.25134 5.501 + 1359.8 -2.11067 1.25134 5.499 + 1359.9 -2.11067 1.25134 5.501 + 1360 -2.11067 1.25134 5.499 + 1360.1 -2.11067 1.25134 5.499 + 1360.2 -2.10037 1.24026 5.497 + 1360.3 -2.10037 1.24026 5.486 + 1360.4 -2.11067 1.24026 5.488 + 1360.5 -2.11067 1.24026 5.488 + 1360.6 -2.10037 1.24026 5.492 + 1360.7 -2.11067 1.24026 5.48 + 1360.8 -2.11067 1.24026 5.49 + 1360.9 -2.10037 1.24026 5.5 + 1361 -2.10037 1.24026 5.488 + 1361.1 -2.10037 1.24026 5.492 + 1361.2 -2.11067 1.24026 5.495 + 1361.3 -2.11067 1.24026 5.497 + 1361.4 -2.11067 1.24026 5.484 + 1361.5 -2.10037 1.24026 5.494 + 1361.6 -2.11067 1.24026 5.503 + 1361.7 -2.11067 1.22919 5.489 + 1361.8 -2.11067 1.24026 5.489 + 1361.9 -2.11067 1.22919 5.498 + 1362 -2.11067 1.22919 5.496 + 1362.1 -2.11067 1.24026 5.488 + 1362.2 -2.11067 1.22919 5.504 + 1362.3 -2.11067 1.24026 5.488 + 1362.4 -2.11067 1.22919 5.495 + 1362.5 -2.11067 1.22919 5.494 + 1362.6 -2.11067 1.22919 5.501 + 1362.7 -2.11067 1.22919 5.482 + 1362.8 -2.11067 1.22919 5.487 + 1362.9 -2.11067 1.22919 5.501 + 1363 -2.12096 1.22919 5.494 + 1363.1 -2.11067 1.22919 5.503 + 1363.2 -2.11067 1.22919 5.501 + 1363.3 -2.11067 1.22919 5.497 + 1363.4 -2.11067 1.22919 5.49 + 1363.5 -2.11067 1.22919 5.504 + 1363.6 -2.12096 1.22919 5.509 + 1363.7 -2.11067 1.21812 5.508 + 1363.8 -2.11067 1.21812 5.506 + 1363.9 -2.12096 1.21812 5.509 + 1364 -2.12096 1.21812 5.499 + 1364.1 -2.11067 1.21812 5.484 + 1364.2 -2.12096 1.21812 5.491 + 1364.3 -2.12096 1.20704 5.493 + 1364.4 -2.12096 1.20704 5.482 + 1364.5 -2.13126 1.21812 5.491 + 1364.6 -2.13126 1.21812 5.499 + 1364.7 -2.13126 1.21812 5.501 + 1364.8 -2.13126 1.21812 5.5 + 1364.9 -2.12096 1.20704 5.521 + 1365 -2.12096 1.20704 5.52 + 1365.1 -2.12096 1.20704 5.524 + 1365.2 -2.11067 1.20704 5.526 + 1365.3 -2.12096 1.20704 5.54 + 1365.4 -2.12096 1.21812 5.539 + 1365.5 -2.12096 1.21812 5.543 + 1365.6 -2.12096 1.20704 5.529 + 1365.7 -2.11067 1.20704 5.534 + 1365.8 -2.11067 1.20704 5.532 + 1365.9 -2.11067 1.21812 5.535 + 1366 -2.11067 1.21812 5.548 + 1366.1 -2.11067 1.20704 5.558 + 1366.2 -2.10037 1.21812 5.543 + 1366.3 -2.11067 1.21812 5.564 + 1366.4 -2.11067 1.20704 5.562 + 1366.5 -2.11067 1.20704 5.558 + 1366.6 -2.11067 1.20704 5.554 + 1366.7 -2.12096 1.20704 5.576 + 1366.8 -2.11067 1.19597 5.577 + 1366.9 -2.12096 1.20704 5.575 + 1367 -2.11067 1.20704 5.569 + 1367.1 -2.11067 1.20704 5.571 + 1367.2 -2.11067 1.20704 5.576 + 1367.3 -2.12096 1.20704 5.575 + 1367.4 -2.12096 1.20704 5.576 + 1367.5 -2.11067 1.20704 5.569 + 1367.6 -2.11067 1.20704 5.572 + 1367.7 -2.11067 1.20704 5.564 + 1367.8 -2.11067 1.20704 5.577 + 1367.9 -2.12096 1.20704 5.578 + 1368 -2.11067 1.20704 5.569 + 1368.1 -2.11067 1.20704 5.575 + 1368.2 -2.11067 1.20704 5.577 + 1368.3 -2.12096 1.20704 5.581 + 1368.4 -2.11067 1.20704 5.565 + 1368.5 -2.11067 1.19597 5.567 + 1368.6 -2.12096 1.20704 5.562 + 1368.7 -2.11067 1.20704 5.56 + 1368.8 -2.11067 1.20704 5.564 + 1368.9 -2.10037 1.20704 5.548 + 1369 -2.10037 1.20704 5.556 + 1369.1 -2.11067 1.20704 5.563 + 1369.2 -2.11067 1.20704 5.563 + 1369.3 -2.11067 1.20704 5.564 + 1369.4 -2.11067 1.20704 5.563 + 1369.5 -2.11067 1.20704 5.565 + 1369.6 -2.12096 1.20704 5.559 + 1369.7 -2.12096 1.20704 5.572 + 1369.8 -2.12096 1.20704 5.559 + 1369.9 -2.12096 1.20704 5.562 + 1370 -2.12096 1.20704 5.555 + 1370.1 -2.11067 1.20704 5.57 + 1370.2 -2.13126 1.20704 5.558 + 1370.3 -2.13126 1.19597 5.557 + 1370.4 -2.12096 1.20704 5.56 + 1370.5 -2.12096 1.19597 5.55 + 1370.6 -2.13126 1.19597 5.561 + 1370.7 -2.13126 1.19597 5.561 + 1370.8 -2.13126 1.19597 5.552 + 1370.9 -2.13126 1.19597 5.55 + 1371 -2.12096 1.19597 5.555 + 1371.1 -2.13126 1.19597 5.56 + 1371.2 -2.13126 1.19597 5.553 + 1371.3 -2.13126 1.19597 5.551 + 1371.4 -2.13126 1.19597 5.553 + 1371.5 -2.13126 1.20704 5.548 + 1371.6 -2.13126 1.19597 5.55 + 1371.7 -2.13126 1.19597 5.543 + 1371.8 -2.13126 1.19597 5.551 + 1371.9 -2.13126 1.19597 5.541 + 1372 -2.14155 1.19597 5.538 + 1372.1 -2.14155 1.19597 5.546 + 1372.2 -2.14155 1.19597 5.539 + 1372.3 -2.14155 1.19597 5.541 + 1372.4 -2.14155 1.19597 5.539 + 1372.5 -2.15185 1.19597 5.528 + 1372.6 -2.14155 1.19597 5.533 + 1372.7 -2.15185 1.19597 5.532 + 1372.8 -2.15185 1.18489 5.524 + 1372.9 -2.15185 1.19597 5.528 + 1373 -2.16215 1.18489 5.524 + 1373.1 -2.15185 1.18489 5.518 + 1373.2 -2.16215 1.18489 5.517 + 1373.3 -2.16215 1.18489 5.524 + 1373.4 -2.17244 1.18489 5.521 + 1373.5 -2.16215 1.18489 5.523 + 1373.6 -2.16215 1.18489 5.52 + 1373.7 -2.17244 1.18489 5.507 + 1373.8 -2.17244 1.18489 5.516 + 1373.9 -2.17244 1.17382 5.513 + 1374 -2.17244 1.18489 5.518 + 1374.1 -2.17244 1.18489 5.51 + 1374.2 -2.17244 1.17382 5.507 + 1374.3 -2.17244 1.18489 5.512 + 1374.4 -2.17244 1.18489 5.518 + 1374.5 -2.18274 1.17382 5.51 + 1374.6 -2.18274 1.17382 5.514 + 1374.7 -2.17244 1.17382 5.504 + 1374.8 -2.18274 1.17382 5.504 + 1374.9 -2.18274 1.17382 5.519 + 1375 -2.18274 1.17382 5.508 + 1375.1 -2.18274 1.17382 5.506 + 1375.2 -2.18274 1.17382 5.499 + 1375.3 -2.18274 1.17382 5.499 + 1375.4 -2.18274 1.16275 5.503 + 1375.5 -2.18274 1.17382 5.509 + 1375.6 -2.18274 1.16275 5.501 + 1375.7 -2.18274 1.17382 5.515 + 1375.8 -2.18274 1.16275 5.508 + 1375.9 -2.18274 1.16275 5.502 + 1376 -2.18274 1.16275 5.504 + 1376.1 -2.19303 1.16275 5.516 + 1376.2 -2.18274 1.16275 5.512 + 1376.3 -2.18274 1.16275 5.508 + 1376.4 -2.19303 1.16275 5.503 + 1376.5 -2.19303 1.16275 5.514 + 1376.6 -2.19303 1.16275 5.503 + 1376.7 -2.19303 1.16275 5.512 + 1376.8 -2.19303 1.15167 5.509 + 1376.9 -2.19303 1.16275 5.506 + 1377 -2.20333 1.15167 5.506 + 1377.1 -2.20333 1.15167 5.517 + 1377.2 -2.20333 1.15167 5.515 + 1377.3 -2.19303 1.15167 5.502 + 1377.4 -2.20333 1.15167 5.518 + 1377.5 -2.20333 1.1406 5.506 + 1377.6 -2.20333 1.15167 5.509 + 1377.7 -2.20333 1.1406 5.51 + 1377.8 -2.20333 1.1406 5.512 + 1377.9 -2.20333 1.1406 5.514 + 1378 -2.21363 1.1406 5.51 + 1378.1 -2.20333 1.1406 5.518 + 1378.2 -2.20333 1.1406 5.503 + 1378.3 -2.21363 1.1406 5.502 + 1378.4 -2.20333 1.1406 5.512 + 1378.5 -2.20333 1.1406 5.509 + 1378.6 -2.20333 1.1406 5.51 + 1378.7 -2.20333 1.12952 5.504 + 1378.8 -2.20333 1.12952 5.514 + 1378.9 -2.19303 1.12952 5.512 + 1379 -2.20333 1.12952 5.498 + 1379.1 -2.20333 1.12952 5.492 + 1379.2 -2.20333 1.12952 5.505 + 1379.3 -2.20333 1.11845 5.51 + 1379.4 -2.21363 1.12952 5.5 + 1379.5 -2.20333 1.11845 5.485 + 1379.6 -2.20333 1.11845 5.491 + 1379.7 -2.20333 1.11845 5.488 + 1379.8 -2.20333 1.11845 5.485 + 1379.9 -2.20333 1.10738 5.49 + 1380 -2.20333 1.10738 5.488 + 1380.1 -2.20333 1.10738 5.483 + 1380.2 -2.20333 1.10738 5.484 + 1380.3 -2.20333 1.10738 5.48 + 1380.4 -2.20333 1.10738 5.471 + 1380.5 -2.20333 1.10738 5.47 + 1380.6 -2.20333 1.0963 5.475 + 1380.7 -2.20333 1.0963 5.474 + 1380.8 -2.21363 1.08523 5.455 + 1380.9 -2.21363 1.08523 5.454 + 1381 -2.21363 1.08523 5.455 + 1381.1 -2.21363 1.08523 5.455 + 1381.2 -2.20333 1.0963 5.473 + 1381.3 -2.21363 1.08523 5.474 + 1381.4 -2.22392 1.08523 5.471 + 1381.5 -2.22392 1.08523 5.469 + 1381.6 -2.22392 1.08523 5.469 + 1381.7 -2.22392 1.08523 5.474 + 1381.8 -2.23422 1.08523 5.479 + 1381.9 -2.23422 1.08523 5.47 + 1382 -2.22392 1.08523 5.473 + 1382.1 -2.22392 1.08523 5.476 + 1382.2 -2.23422 1.08523 5.476 + 1382.3 -2.23422 1.08523 5.491 + 1382.4 -2.23422 1.07416 5.469 + 1382.5 -2.23422 1.07416 5.479 + 1382.6 -2.23422 1.07416 5.475 + 1382.7 -2.23422 1.07416 5.476 + 1382.8 -2.23422 1.08523 5.482 + 1382.9 -2.24451 1.07416 5.485 + 1383 -2.23422 1.07416 5.477 + 1383.1 -2.24451 1.07416 5.47 + 1383.2 -2.23422 1.07416 5.479 + 1383.3 -2.23422 1.07416 5.473 + 1383.4 -2.23422 1.07416 5.476 + 1383.5 -2.24451 1.07416 5.468 + 1383.6 -2.23422 1.07416 5.472 + 1383.7 -2.24451 1.07416 5.467 + 1383.8 -2.23422 1.06308 5.467 + 1383.9 -2.24451 1.06308 5.462 + 1384 -2.24451 1.07416 5.455 + 1384.1 -2.23422 1.06308 5.457 + 1384.2 -2.23422 1.06308 5.467 + 1384.3 -2.24451 1.06308 5.456 + 1384.4 -2.24451 1.07416 5.464 + 1384.5 -2.24451 1.06308 5.453 + 1384.6 -2.24451 1.06308 5.458 + 1384.7 -2.24451 1.06308 5.447 + 1384.8 -2.24451 1.06308 5.44 + 1384.9 -2.24451 1.06308 5.447 + 1385 -2.24451 1.06308 5.458 + 1385.1 -2.25481 1.06308 5.453 + 1385.2 -2.25481 1.06308 5.452 + 1385.3 -2.24451 1.06308 5.439 + 1385.4 -2.24451 1.06308 5.44 + 1385.5 -2.24451 1.06308 5.444 + 1385.6 -2.25481 1.06308 5.448 + 1385.7 -2.24451 1.06308 5.436 + 1385.8 -2.25481 1.06308 5.437 + 1385.9 -2.25481 1.06308 5.439 + 1386 -2.24451 1.06308 5.441 + 1386.1 -2.25481 1.06308 5.43 + 1386.2 -2.24451 1.06308 5.432 + 1386.3 -2.24451 1.06308 5.432 + 1386.4 -2.24451 1.05201 5.424 + 1386.5 -2.23422 1.06308 5.42 + 1386.6 -2.23422 1.06308 5.411 + 1386.7 -2.24451 1.05201 5.418 + 1386.8 -2.24451 1.06308 5.419 + 1386.9 -2.23422 1.05201 5.405 + 1387 -2.23422 1.05201 5.402 + 1387.1 -2.23422 1.05201 5.396 + 1387.2 -2.23422 1.05201 5.408 + 1387.3 -2.23422 1.05201 5.407 + 1387.4 -2.23422 1.05201 5.417 + 1387.5 -2.23422 1.06308 5.415 + 1387.6 -2.23422 1.05201 5.411 + 1387.7 -2.23422 1.05201 5.414 + 1387.8 -2.23422 1.05201 5.41 + 1387.9 -2.22392 1.04093 5.416 + 1388 -2.22392 1.05201 5.417 + 1388.1 -2.23422 1.04093 5.405 + 1388.2 -2.23422 1.05201 5.398 + 1388.3 -2.23422 1.05201 5.409 + 1388.4 -2.23422 1.04093 5.416 + 1388.5 -2.23422 1.05201 5.415 + 1388.6 -2.24451 1.05201 5.408 + 1388.7 -2.24451 1.05201 5.401 + 1388.8 -2.24451 1.05201 5.377 + 1388.9 -2.24451 1.04093 5.37 + 1389 -2.24451 1.04093 5.362 + 1389.1 -2.24451 1.04093 5.355 + 1389.2 -2.24451 1.05201 5.361 + 1389.3 -2.23422 1.04093 5.37 + 1389.4 -2.22392 1.02986 5.355 + 1389.5 -2.23422 1.02986 5.355 + 1389.6 -2.23422 1.02986 5.361 + 1389.7 -2.23422 1.04093 5.366 + 1389.8 -2.23422 1.02986 5.362 + 1389.9 -2.23422 1.02986 5.359 + 1390 -2.23422 1.02986 5.354 + 1390.1 -2.23422 1.02986 5.362 + 1390.2 -2.23422 1.01879 5.373 + 1390.3 -2.23422 1.02986 5.363 + 1390.4 -2.23422 1.01879 5.363 + 1390.5 -2.24451 1.01879 5.357 + 1390.6 -2.24451 1.01879 5.351 + 1390.7 -2.23422 1.01879 5.356 + 1390.8 -2.24451 1.01879 5.361 + 1390.9 -2.24451 1.01879 5.355 + 1391 -2.23422 1.00771 5.34 + 1391.1 -2.23422 1.01879 5.342 + 1391.2 -2.23422 1.00771 5.35 + 1391.3 -2.23422 1.00771 5.333 + 1391.4 -2.23422 0.99664 5.337 + 1391.5 -2.23422 1.00771 5.337 + 1391.6 -2.23422 0.99664 5.339 + 1391.7 -2.24451 1.00771 5.342 + 1391.8 -2.23422 0.99664 5.328 + 1391.9 -2.24451 0.985566 5.347 + 1392 -2.24451 0.99664 5.333 + 1392.1 -2.24451 0.99664 5.326 + 1392.2 -2.24451 0.99664 5.332 + 1392.3 -2.24451 0.99664 5.362 + 1392.4 -2.25481 0.99664 5.357 + 1392.5 -2.25481 0.985566 5.317 + 1392.6 -2.24451 0.985566 5.321 + 1392.7 -2.25481 0.985566 5.321 + 1392.8 -2.25481 0.985566 5.291 + 1392.9 -2.25481 0.985566 5.301 + 1393 -2.25481 0.985566 5.302 + 1393.1 -2.25481 0.985566 5.315 + 1393.2 -2.25481 0.985566 5.304 + 1393.3 -2.25481 0.985566 5.283 + 1393.4 -2.25481 0.985566 5.284 + 1393.5 -2.25481 0.985566 5.309 + 1393.6 -2.25481 0.985566 5.281 + 1393.7 -2.25481 0.985566 5.261 + 1393.8 -2.25481 0.974492 5.28 + 1393.9 -2.25481 0.974492 5.26 + 1394 -2.26511 0.985566 5.276 + 1394.1 -2.26511 0.985566 5.291 + 1394.2 -2.26511 0.974492 5.28 + 1394.3 -2.26511 0.974492 5.266 + 1394.4 -2.26511 0.974492 5.275 + 1394.5 -2.2754 0.974492 5.291 + 1394.6 -2.26511 0.974492 5.291 + 1394.7 -2.2754 0.974492 5.266 + 1394.8 -2.2857 0.974492 5.273 + 1394.9 -2.2754 0.974492 5.279 + 1395 -2.2857 0.963418 5.282 + 1395.1 -2.2754 0.963418 5.278 + 1395.2 -2.2857 0.963418 5.287 + 1395.3 -2.2857 0.963418 5.286 + 1395.4 -2.2857 0.963418 5.281 + 1395.5 -2.2857 0.963418 5.277 + 1395.6 -2.29599 0.963418 5.281 + 1395.7 -2.29599 0.952345 5.288 + 1395.8 -2.29599 0.952345 5.293 + 1395.9 -2.29599 0.952345 5.293 + 1396 -2.29599 0.952345 5.296 + 1396.1 -2.29599 0.952345 5.289 + 1396.2 -2.29599 0.952345 5.294 + 1396.3 -2.29599 0.952345 5.297 + 1396.4 -2.29599 0.941271 5.296 + 1396.5 -2.30629 0.952345 5.304 + 1396.6 -2.29599 0.941271 5.301 + 1396.7 -2.29599 0.941271 5.294 + 1396.8 -2.30629 0.941271 5.298 + 1396.9 -2.30629 0.941271 5.306 + 1397 -2.30629 0.941271 5.297 + 1397.1 -2.29599 0.930197 5.304 + 1397.2 -2.29599 0.930197 5.3 + 1397.3 -2.2857 0.930197 5.289 + 1397.4 -2.30629 0.930197 5.283 + 1397.5 -2.30629 0.930197 5.292 + 1397.6 -2.30629 0.930197 5.298 + 1397.7 -2.30629 0.919123 5.285 + 1397.8 -2.31659 0.930197 5.293 + 1397.9 -2.31659 0.919123 5.287 + 1398 -2.32688 0.919123 5.3 + 1398.1 -2.32688 0.919123 5.292 + 1398.2 -2.32688 0.919123 5.295 diff --git a/README.md b/README.md new file mode 100644 index 0000000..291988a --- /dev/null +++ b/README.md @@ -0,0 +1,174 @@ +# Point-LIO +## Point-LIO: Robust High-Bandwidth Lidar-Inertial Odometry + +## 1. Introduction + +
+
+ +
+ The framework and key points of the Point-LIO. +
+ +**Point-LIO** is a robust and high-bandwidth LiDAR-inertial odometry with the capability to estimate extremely aggressive robotic motions. Point-LIO has two key novelties that enable a high-bandwidth LiDAR-inertial odometry (LIO). The first one is a point-by-point LIO framework, where the state is updated at each LiDAR point measurement without accumulating them into a frame. This point-by-point update allows an extremely high-frequency odometry output, significantly increases the odometry bandwidth, and also fundamentally removes the artificial in-frame motion distortion in aggressive motions. The second main novelty is a stochastic process-augmented kinematic model which models the IMU measurements as an output, instead of input as in existing filter-based odometry or SLAM systems, of the model. This new modeling method enables accurate localization and reliable mapping for aggressive motions even when IMU measurements are saturated. In experiments, Point-LIO is able to provide accurate, high-frequency odometry (4-8 kHz) and reliable mapping under severe vibrations and aggressive motions with high angular velocity (75 rad s^{-1}) beyond the IMU measuring ranges. And Point-LIO is computationally efficient, robust, versatile on public datasets with general motions. As an odometry, Point-LIO could be used in various autonomous tasks, such as trajectory planning, control, and perception, especially in cases involving very fast ego-motions (e.g., in the presence of severe vibration and high angular or linear velocity) or requiring high-rate odometry output and mapping (e.g., for high-rate feedback control and perception). + +## **1.1. Developers:** +The codes of this repo are contributed by: +[Dongjiao He (贺东娇)](https://github.com/Joanna-HE) and [Wei Xu (徐威)](https://github.com/XW-HKU) + + +## **1.2. Related paper** +Our paper is accepted to Advanced Intelligent Systems(AIS), and is in the process of production. The preprint version is attached here, [Point-LIO_preprint.pdf](https://github.com/hku-mars/Point-LIO/files/10989136/Point-LIO_preprint.pdf) + + +## **1.3. Related video** +Our accompany video is available on **YouTube**. +
+ +
+ +## 2. What can Point-LIO do? +### 2.1 Simultaneous LiDAR localization and mapping (SLAM) without motion distortion + +### 2.2 Produce high odometry output frequence and high bandwidth + +### 2.3 SLAM with aggressive motions even the IMU is saturated + +# **3. Prerequisites** + +## **3.1 Ubuntu and [ROS](https://www.ros.org/)** +We tested our code on Ubuntu18.04 with ros melodic and Ubuntu20.04 with noetic. Additional ROS package is required: +``` +sudo apt-get install ros-xxx-pcl-conversions +``` + +## **3.2 Eigen** +Following the official [Eigen installation](eigen.tuxfamily.org/index.php?title=Main_Page), or directly install Eigen by: +``` +sudo apt-get install libeigen3-dev +``` + +## **3.3 livox_ros_driver** +Follow [livox_ros_driver Installation](https://github.com/Livox-SDK/livox_ros_driver). + +*Remarks:* +- Since the Point-LIO supports Livox serials LiDAR, so the **livox_ros_driver** must be installed and **sourced** before run any Point-LIO luanch file. +- How to source? The easiest way is add the line ``` source $Licox_ros_driver_dir$/devel/setup.bash ``` to the end of file ``` ~/.bashrc ```, where ``` $Licox_ros_driver_dir$ ``` is the directory of the livox ros driver workspace (should be the ``` ws_livox ``` directory if you completely followed the livox official document). + +## 4. Build +Clone the repository and catkin_make: + +``` + cd ~/$A_ROS_DIR$/src + git clone https://github.com/hku-mars/Point-LIO.git + cd Point-LIO + git submodule update --init + cd ../.. + catkin_make + source devel/setup.bash +``` +- Remember to source the livox_ros_driver before build (follow 3.3 **livox_ros_driver**) +- If you want to use a custom build of PCL, add the following line to ~/.bashrc +```export PCL_ROOT={CUSTOM_PCL_PATH}``` + +## 5. Directly run +Important notes: + +A. Please make sure the IMU and LiDAR are **Synchronized**, that's important. + +B. Please obtain the saturation values of your used IMU (i.e., accelerator and gyroscope), and the units of the accelerator of your used IMU, then modify the .yaml file according to those settings. That's improtant. + +C. The warning message "Failed to find match for field 'time'." means the timestamps of each LiDAR points are missed in the rosbag file. That is important because Point-LIO processes at the sampling time of each LiDAR point. + +D. We recommend to set the **extrinsic_est_en** to false if the extrinsic is give. As for the extrinsic initiallization, please refer to our recent work: [**Robust and Online LiDAR-inertial Initialization**](https://github.com/hku-mars/LiDAR_IMU_Init). + +E. If a high odometry output frequency without downsample is required, set ``` publish_odometry_without_downsample ``` as true. Then the warning message of tf "TF_REPEATED_DATA" will pop up in the terminal window, because the time interval between two publish odometery is too small. The following command could be used to suppress this warning to a smaller frequency: + +in your catkin_ws/src, + +git clone --branch throttle-tf-repeated-data-error git@github.com:BadgerTechnologies/geometry2.git + +Then rebuild, source setup.bash, run and then it should be reduced down to once every 10 seconds. If 10 seconds is still too much log output then change the ros::Duration(10.0) to 10000 seconds or whatever you like. + +### 5.1 For Avia +Connect to your PC to Livox Avia LiDAR by following [Livox-ros-driver installation](https://github.com/Livox-SDK/livox_ros_driver), then +``` + cd ~/$Point_LIO_ROS_DIR$ + source devel/setup.bash + roslaunch point_lio mapping_avia.launch + roslaunch livox_ros_driver livox_lidar_msg.launch +``` +- For livox serials, Point-LIO only support the data collected by the ``` livox_lidar_msg.launch ``` since only its ``` livox_ros_driver/CustomMsg ``` data structure produces the timestamp of each LiDAR point which is very important for Point-LIO. ``` livox_lidar.launch ``` can not produce it right now. +- If you want to change the frame rate, please modify the **publish_freq** parameter in the [livox_lidar_msg.launch](https://github.com/Livox-SDK/livox_ros_driver/blob/master/livox_ros_driver/launch/livox_lidar_msg.launch) of [Livox-ros-driver](https://github.com/Livox-SDK/livox_ros_driver) before make the livox_ros_driver pakage. + +### 5.2 For Livox serials with external IMU + +mapping_avia.launch theratically supports mid-70, mid-40 or other livox serial LiDAR, but need to setup some parameters befor run: + +Edit ``` config/avia.yaml ``` to set the below parameters: + +1. LiDAR point cloud topic name: ``` lid_topic ``` +2. IMU topic name: ``` imu_topic ``` +3. Translational extrinsic: ``` extrinsic_T ``` +4. Rotational extrinsic: ``` extrinsic_R ``` (only support rotation matrix) +- The extrinsic parameters in Point-LIO is defined as the LiDAR's pose (position and rotation matrix) in IMU body frame (i.e. the IMU is the base frame). They can be found in the official manual. +5. Saturation value of IMU's accelerator and gyroscope: ```satu_acc```, ```satu_gyro``` +6. The norm of IMU's acceleration according to unit of acceleration messages: ``` acc_norm ``` + +### 5.3 For Velodyne or Ouster (Velodyne as an example) + +Step A: Setup before run + +Edit ``` config/velodyne.yaml ``` to set the below parameters: + +1. LiDAR point cloud topic name: ``` lid_topic ``` +2. IMU topic name: ``` imu_topic ``` (both internal and external, 6-aixes or 9-axies are fine) +3. Set the parameter ```timestamp_unit``` based on the unit of **time** (Velodyne) or **t** (Ouster) field in PoindCloud2 rostopic +4. Line number (we tested 16, 32 and 64 line, but not tested 128 or above): ``` scan_line ``` +5. Translational extrinsic: ``` extrinsic_T ``` +6. Rotational extrinsic: ``` extrinsic_R ``` (only support rotation matrix) +- The extrinsic parameters in Point-LIO is defined as the LiDAR's pose (position and rotation matrix) in IMU body frame (i.e. the IMU is the base frame). +7. Saturation value of IMU's accelerator and gyroscope: ```satu_acc```, ```satu_gyro``` +8. The norm of IMU's acceleration according to unit of acceleration messages: ``` acc_norm ``` + +Step B: Run below +``` + cd ~/$Point_LIO_ROS_DIR$ + source devel/setup.bash + roslaunch point_lio mapping_velody16.launch +``` + +Step C: Run LiDAR's ros driver or play rosbag. + +### 5.4 PCD file save + +Set ``` pcd_save_enable ``` in launchfile to ``` 1 ```. All the scans (in global frame) will be accumulated and saved to the file ``` Point-LIO/PCD/scans.pcd ``` after the Point-LIO is terminated. ```pcl_viewer scans.pcd``` can visualize the point clouds. + +*Tips for pcl_viewer:* +- change what to visualize/color by pressing keyboard 1,2,3,4,5 when pcl_viewer is running. +``` + 1 is all random + 2 is X values + 3 is Y values + 4 is Z values + 5 is intensity +``` + +# **6. Examples** + +## **6.1. Example-1: SLAM on datasets with aggressive motions where IMU is saturated** +
+ + +
+ +## **6.2. Example-2: Application on FPV and PULSAR** +
+ + +
+ +PULSAR is a self-rotating actuated by only one motor, [PULSAR](https://github.com/hku-mars/PULSAR) + +## 7. Contact us +If you have any questions about this work, please feel free to contact me and Dr. Fu Zhang via email. diff --git a/config/avia.yaml b/config/avia.yaml new file mode 100755 index 0000000..1aa6642 --- /dev/null +++ b/config/avia.yaml @@ -0,0 +1,54 @@ +common: + lid_topic: "/livox/lidar" + imu_topic: "/livox/imu" + con_frame: false # true: if you need to combine several LiDAR frames into one + con_frame_num: 1 # the number of frames combined + cut_frame: false # true: if you need to cut one LiDAR frame into several subframes + cut_frame_time_interval: 0.1 # should be integral fraction of 1 / LiDAR frequency + time_diff_lidar_to_imu: 0.0 # Time offset between LiDAR and IMU calibrated by other algorithms, e.g., LI-Init (find in Readme) + +preprocess: + lidar_type: 1 # 4 + scan_line: 6 # 32 + timestamp_unit: 1 # the unit of time/t field in the PointCloud2 rostopic: 0-second, 1-milisecond, 2-microsecond, 3-nanosecond. + blind: 0.50 + +mapping: + imu_en: true + extrinsic_est_en: false # for aggressive motion, set this variable false + imu_time_inte: 0.005 # = 1 / frequency of IMU + lidar_time_inte: 0.1 + satu_acc: 3.0 # the saturation value of IMU's acceleration. not related to the units + satu_gyro: 35 # the saturation value of IMU's angular velocity. not related to the units + acc_norm: 1.0 # 9.810 # 1.0 for g as unit, 9.81 for m/s^2 as unit of the IMU's acceleration + lidar_meas_cov: 0.01 # 0.001; 0.01 + acc_cov_output: 500 + gyr_cov_output: 1000 + b_acc_cov: 0.0001 + b_gyr_cov: 0.0001 + imu_meas_acc_cov: 0.1 #0.1 # 0.1 + imu_meas_omg_cov: 0.1 #0.01 # 0.1 + gyr_cov_input: 0.01 # for IMU as input model + acc_cov_input: 0.1 # for IMU as input model + plane_thr: 0.1 # 0.05, the threshold for plane criteria, the smaller, the flatter a plane + match_s: 81 + ivox_grid_resolution: 2.0 + gravity: [0.0, 0.0, -9.810] # [0.0, 9.810, 0.0] # # [0.0, 0.0, -9.787561] # gvins # + gravity_init: [0.0, 0.0, -9.810] # preknown gravity for unstationary start + extrinsic_T: [ 0.04165, 0.02326, -0.0284 ] + extrinsic_R: [ 1, 0, 0, + 0, 1, 0, + 0, 0, 1 ] + +odometry: + publish_odometry_without_downsample: false + +publish: + path_en: true # false: close the path output + scan_publish_en: true # false: close all the point cloud output + scan_bodyframe_pub_en: false # true: output the point cloud scans in IMU-body-frame + +pcd_save: + pcd_save_en: false + interval: -1 # how many LiDAR frames saved in each pcd file; + # -1 : all frames will be saved in ONE pcd file, may lead to memory crash when having too much frames. \ No newline at end of file diff --git a/config/horizon.yaml b/config/horizon.yaml new file mode 100755 index 0000000..75041bd --- /dev/null +++ b/config/horizon.yaml @@ -0,0 +1,53 @@ +common: + lid_topic: "/livox/lidar" + imu_topic: "/livox/imu" + con_frame: false # true: if you need to combine several LiDAR frames into one + con_frame_num: 1 # the number of frames combined + cut_frame: false # true: if you need to cut one LiDAR frame into several subframes + cut_frame_time_interval: 0.1 # should be integral fraction of 1 / LiDAR frequency + time_diff_lidar_to_imu: 0.0 # Time offset between LiDAR and IMU calibrated by other algorithms, e.g., LI-Init (find in Readme) + +preprocess: + lidar_type: 1 + scan_line: 6 + timestamp_unit: 1 # the unit of time/t field in the PointCloud2 rostopic: 0-second, 1-milisecond, 2-microsecond, 3-nanosecond. + blind: 4.0 + +mapping: + imu_en: true + extrinsic_est_en: false # for aggressive motion, set this variable false + imu_time_inte: 0.005 # = 1 / frequency of IMU + lidar_time_inte: 0.1 + satu_acc: 3.0 # the saturation value of IMU's acceleration. not related to the units + satu_gyro: 35 # the saturation value of IMU's angular velocity. not related to the units + acc_norm: 1.0 # 1.0 for g as unit, 9.81 for m/s^2 as unit of the IMU's acceleration + lidar_meas_cov: 0.01 # 0.001 + acc_cov_output: 500 + gyr_cov_output: 1000 + b_acc_cov: 0.0001 + b_gyr_cov: 0.0001 + imu_meas_acc_cov: 0.01 #0.1 # 2 + imu_meas_omg_cov: 0.01 #0.1 # 2 + gyr_cov_input: 0.01 # for IMU as input model + acc_cov_input: 0.1 # for IMU as input model + plane_thr: 0.1 # 0.05, the threshold for plane criteria, the smaller, the flatter a plane + match_s: 81 + ivox_grid_resolution: 2.0 + gravity: [0.0, 0.0, -9.810] # preknown gravity, use when imu_en is false or start from a non-stationary state + extrinsic_T: [ 0.05512, 0.02226, -0.0297 ] + extrinsic_R: [ 1, 0, 0, + 0, 1, 0, + 0, 0, 1 ] + +odometry: + publish_odometry_without_downsample: false + +publish: + path_en: true # false: close the path output + scan_publish_en: true # false: close all the point cloud output + scan_bodyframe_pub_en: false # true: output the point cloud scans in IMU-body-frame + +pcd_save: + pcd_save_en: false + interval: -1 # how many LiDAR frames saved in each pcd file; + # -1 : all frames will be saved in ONE pcd file, may lead to memory crash when having too much frames. \ No newline at end of file diff --git a/config/ouster64.yaml b/config/ouster64.yaml new file mode 100755 index 0000000..08192d2 --- /dev/null +++ b/config/ouster64.yaml @@ -0,0 +1,53 @@ +common: + lid_topic: "/os_cloud_node/points" + imu_topic: "/os_cloud_node/imu" + con_frame: false # true: if you need to combine several LiDAR frames into one + con_frame_num: 1 # the number of frames combined + cut_frame: false # true: if you need to cut one LiDAR frame into several subframes + cut_frame_time_interval: 0.1 # should be integral fraction of 1 / LiDAR frequency + time_diff_lidar_to_imu: 0.0 # Time offset between LiDAR and IMU calibrated by other algorithms, e.g., LI-Init (find in Readme) + +preprocess: + lidar_type: 3 # 2 #velodyne # 1 Livox Avia LiDAR + scan_line: 64 # 32 #velodyne 6 avia + timestamp_unit: 3 # the unit of time/t field in the PointCloud2 rostopic: 0-second, 1-milisecond, 2-microsecond, 3-nanosecond. + blind: 4.0 + +mapping: + imu_en: true + extrinsic_est_en: false # for aggressive motion, set this variable false + imu_time_inte: 0.01 # = 1 / frequency of IMU + lidar_time_inte: 0.1 + satu_acc: 30.0 # the saturation value of IMU's acceleration. not related to the units + satu_gyro: 35 # the saturation value of IMU's angular velocity. not related to the units + acc_norm: 9.81 # 1.0 for g as unit, 9.81 for m/s^2 as unit of the IMU's acceleration + lidar_meas_cov: 0.01 # 0.001 + acc_cov_output: 500 + gyr_cov_output: 1000 + b_acc_cov: 0.0001 + b_gyr_cov: 0.0001 + imu_meas_acc_cov: 0.1 #0.1 # 2 + imu_meas_omg_cov: 0.1 #0.1 # 2 + gyr_cov_input: 0.01 # for IMU as input model + acc_cov_input: 0.1 # for IMU as input model + plane_thr: 0.1 # 0.05, the threshold for plane criteria, the smaller, the flatter a plane + match_s: 81 + ivox_grid_resolution: 2.0 + gravity: [0.0, 0.0, -9.810] # preknown gravity, use when imu_en is false or start from a non-stationary state + extrinsic_T: [0.0, 0.0, 0.0] + extrinsic_R: [ 1, 0, 0, + 0, 1, 0, + 0, 0, 1 ] + +odometry: + publish_odometry_without_downsample: false + +publish: + path_en: true # false: close the path output + scan_publish_en: true # false: close all the point cloud output + scan_bodyframe_pub_en: false # true: output the point cloud scans in IMU-body-frame + +pcd_save: + pcd_save_en: false + interval: -1 # how many LiDAR frames saved in each pcd file; + # -1 : all frames will be saved in ONE pcd file, may lead to memory crash when having too much frames. \ No newline at end of file diff --git a/config/velody16.yaml b/config/velody16.yaml new file mode 100755 index 0000000..a270e2e --- /dev/null +++ b/config/velody16.yaml @@ -0,0 +1,59 @@ +common: + lid_topic: "/velodyne_points" + imu_topic: "/imu/data" + con_frame: false # true: if you need to combine several LiDAR frames into one + con_frame_num: 1 # the number of frames combined + cut_frame: false # true: if you need to cut one LiDAR frame into several subframes + cut_frame_time_interval: 0.1 # should be integral fraction of 1 / LiDAR frequency + time_diff_lidar_to_imu: 0.0 # Time offset between LiDAR and IMU calibrated by other algorithms, e.g., LI-Init (find in Readme) + +preprocess: + lidar_type: 2 + scan_line: 32 + timestamp_unit: 2 # the unit of time/t field in the PointCloud2 rostopic: 0-second, 1-milisecond, 2-microsecond, 3-nanosecond. + blind: 2.0 + +mapping: + imu_en: true + extrinsic_est_en: false # for aggressive motion, set this variable false + imu_time_inte: 0.01 # = 1 / frequency of IMU + lidar_time_inte: 0.1 + satu_acc: 30.0 # the saturation value of IMU's acceleration. not related to the units + satu_gyro: 35 # the saturation value of IMU's angular velocity. not related to the units + acc_norm: 9.81 # 1.0 for g as unit, 9.81 for m/s^2 as unit of the IMU's acceleration + lidar_meas_cov: 0.01 # 0.001 + acc_cov_output: 500 + gyr_cov_output: 1000 + b_acc_cov: 0.0001 + b_gyr_cov: 0.0001 + imu_meas_acc_cov: 0.1 #0.1 # 2 + imu_meas_omg_cov: 0.1 #0.1 # 2 + gyr_cov_input: 0.01 # for IMU as input model + acc_cov_input: 0.1 # for IMU as input model + plane_thr: 0.1 # 0.05, the threshold for plane criteria, the smaller, the flatter a plane + match_s: 81 + ivox_grid_resolution: 2.0 + gravity: [0.0, 0.0, -9.810] # [-0.30, 0.880, -9.76] # liosam [0.0, 9.810, 0.0] # # preknown gravity, use when imu_en is false or start from a non-stationary state + extrinsic_T: [ 0, 0, 0.28] # ulhk # [-0.5, 1.4, 1.5] # utbm + # extrinsic_R: [ 0, 1, 0, + # -1, 0, 0, + # 0, 0, 1 ] # ulhk 5 6 + # extrinsic_R: [ 0, -1, 0, + # 1, 0, 0, + # 0, 0, 1 ] # utbm 1, 2 + extrinsic_R: [ 1, 0, 0, + 0, 1, 0, + 0, 0, 1 ] # ulhk 4 utbm 3 + +odometry: + publish_odometry_without_downsample: false + +publish: + path_en: true # false: close the path output + scan_publish_en: true # false: close all the point cloud output + scan_bodyframe_pub_en: false # true: output the point cloud scans in IMU-body-frame + +pcd_save: + pcd_save_en: false + interval: -1 # how many LiDAR frames saved in each pcd file; + # -1 : all frames will be saved in ONE pcd file, may lead to memory crash when having too much frames. \ No newline at end of file diff --git a/include/.vscode/c_cpp_properties.json b/include/.vscode/c_cpp_properties.json new file mode 100755 index 0000000..d7fe77d --- /dev/null +++ b/include/.vscode/c_cpp_properties.json @@ -0,0 +1,18 @@ +{ + "configurations": [ + { + "browse": { + "databaseFilename": "", + "limitSymbolsToIncludedHeaders": true + }, + "includePath": [ + "/home/ecstasy/catkin_ws/devel/include/**", + "/opt/ros/melodic/include/**", + "/home/ecstasy/catkin_ws/src/FAST_LIO/include/**", + "/usr/include/**" + ], + "name": "ROS" + } + ], + "version": 4 +} \ No newline at end of file diff --git a/include/.vscode/settings.json b/include/.vscode/settings.json new file mode 100755 index 0000000..4a9ea37 --- /dev/null +++ b/include/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "python.autoComplete.extraPaths": [ + "/home/ecstasy/catkin_ws/devel/lib/python2.7/dist-packages", + "/opt/ros/melodic/lib/python2.7/dist-packages" + ] +} \ No newline at end of file diff --git a/include/IKFoM/.gitignore b/include/IKFoM/.gitignore new file mode 100644 index 0000000..259148f --- /dev/null +++ b/include/IKFoM/.gitignore @@ -0,0 +1,32 @@ +# Prerequisites +*.d + +# Compiled Object files +*.slo +*.lo +*.o +*.obj + +# Precompiled Headers +*.gch +*.pch + +# Compiled Dynamic libraries +*.so +*.dylib +*.dll + +# Fortran module files +*.mod +*.smod + +# Compiled Static libraries +*.lai +*.la +*.a +*.lib + +# Executables +*.exe +*.out +*.app diff --git a/include/IKFoM/.vscode/settings.json b/include/IKFoM/.vscode/settings.json new file mode 100644 index 0000000..d756850 --- /dev/null +++ b/include/IKFoM/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "files.associations": { + "complex": "cpp" + } +} \ No newline at end of file diff --git a/include/IKFoM/IKFoM_toolkit/.vscode/settings.json b/include/IKFoM/IKFoM_toolkit/.vscode/settings.json new file mode 100755 index 0000000..b619d8a --- /dev/null +++ b/include/IKFoM/IKFoM_toolkit/.vscode/settings.json @@ -0,0 +1,62 @@ +{ + "files.associations": { + "iosfwd": "cpp", + "core": "cpp", + "cctype": "cpp", + "clocale": "cpp", + "cmath": "cpp", + "cstdarg": "cpp", + "cstddef": "cpp", + "cstdio": "cpp", + "cstdlib": "cpp", + "cstring": "cpp", + "ctime": "cpp", + "cwchar": "cpp", + "cwctype": "cpp", + "array": "cpp", + "atomic": "cpp", + "strstream": "cpp", + "*.tcc": "cpp", + "bitset": "cpp", + "chrono": "cpp", + "complex": "cpp", + "cstdint": "cpp", + "deque": "cpp", + "list": "cpp", + "unordered_map": "cpp", + "vector": "cpp", + "exception": "cpp", + "fstream": "cpp", + "functional": "cpp", + "initializer_list": "cpp", + "iomanip": "cpp", + "iostream": "cpp", + "istream": "cpp", + "limits": "cpp", + "new": "cpp", + "ostream": "cpp", + "numeric": "cpp", + "ratio": "cpp", + "sstream": "cpp", + "stdexcept": "cpp", + "streambuf": "cpp", + "system_error": "cpp", + "thread": "cpp", + "cfenv": "cpp", + "cinttypes": "cpp", + "tuple": "cpp", + "type_traits": "cpp", + "utility": "cpp", + "typeinfo": "cpp", + "algorithm": "cpp", + "iterator": "cpp", + "map": "cpp", + "memory": "cpp", + "memory_resource": "cpp", + "optional": "cpp", + "random": "cpp", + "set": "cpp", + "string": "cpp", + "string_view": "cpp" + } +} \ No newline at end of file diff --git a/include/IKFoM/IKFoM_toolkit/esekfom/.vscode/settings.json b/include/IKFoM/IKFoM_toolkit/esekfom/.vscode/settings.json new file mode 100755 index 0000000..c807bd5 --- /dev/null +++ b/include/IKFoM/IKFoM_toolkit/esekfom/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "files.associations": { + "core": "cpp" + } +} \ No newline at end of file diff --git a/include/IKFoM/IKFoM_toolkit/esekfom/esekfom.hpp b/include/IKFoM/IKFoM_toolkit/esekfom/esekfom.hpp new file mode 100755 index 0000000..75e2f02 --- /dev/null +++ b/include/IKFoM/IKFoM_toolkit/esekfom/esekfom.hpp @@ -0,0 +1,344 @@ +/* + * Copyright (c) 2019--2023, The University of Hong Kong + * All rights reserved. + * + * Author: Dongjiao HE + * + * 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 Universitaet Bremen 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 OWNER 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. + */ + +#ifndef ESEKFOM_EKF_HPP +#define ESEKFOM_EKF_HPP + + +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "../mtk/types/vect.hpp" +#include "../mtk/types/SOn.hpp" +#include "../mtk/types/S2.hpp" +#include "../mtk/types/SEn.hpp" +#include "../mtk/startIdx.hpp" +#include "../mtk/build_manifold.hpp" +#include "util.hpp" + +namespace esekfom { + +using namespace Eigen; + +template +struct dyn_share_modified +{ + bool valid; + bool converge; + T M_Noise; + Eigen::Matrix z; + Eigen::Matrix h_x; + Eigen::Matrix z_IMU; + Eigen::Matrix R_IMU; + bool satu_check[6]; +}; + +template +class esekf{ + + typedef esekf self; + enum{ + n = state::DOF, m = state::DIM, l = measurement::DOF + }; + +public: + + typedef typename state::scalar scalar_type; + typedef Matrix cov; + typedef Matrix cov_; + typedef SparseMatrix spMt; + typedef Matrix vectorized_state; + typedef Matrix flatted_state; + typedef flatted_state processModel(state &, const input &); + typedef Eigen::Matrix processMatrix1(state &, const input &); + typedef Eigen::Matrix processMatrix2(state &, const input &); + typedef Eigen::Matrix processnoisecovariance; + + typedef void measurementModel_dyn_share_modified_cov(state &, Eigen::Matrix3d, Eigen::Matrix3d, dyn_share_modified &); + typedef void measurementModel_dyn_share_modified(state &, dyn_share_modified &); + typedef Eigen::Matrix measurementMatrix1(state &); + typedef Eigen::Matrix measurementMatrix1_dyn(state &); + typedef Eigen::Matrix measurementMatrix2(state &); + typedef Eigen::Matrix measurementMatrix2_dyn(state &); + typedef Eigen::Matrix measurementnoisecovariance; + typedef Eigen::Matrix measurementnoisecovariance_dyn; + + esekf(const state &x = state(), + const cov &P = cov::Identity()): x_(x), P_(P){}; + + void init_dyn_share_modified_2h(processModel f_in, processMatrix1 f_x_in, measurementModel_dyn_share_modified_cov h_dyn_share_in1) + { + f = f_in; + f_x = f_x_in; + // f_w = f_w_in; + h_dyn_share_modified_1 = h_dyn_share_in1; + // h_dyn_share_modified_3 = h_dyn_share_in3; + maximum_iter = 1; + x_.build_S2_state(); + x_.build_SO3_state(); + x_.build_vect_state(); + x_.build_SEN_state(); + } + + void init_dyn_share_modified_3h(processModel f_in, processMatrix1 f_x_in, measurementModel_dyn_share_modified_cov h_dyn_share_in1, measurementModel_dyn_share_modified h_dyn_share_in2) + { + f = f_in; + f_x = f_x_in; + // f_w = f_w_in; + h_dyn_share_modified_1 = h_dyn_share_in1; + h_dyn_share_modified_2 = h_dyn_share_in2; + // h_dyn_share_modified_3 = h_dyn_share_in3; + maximum_iter = 1; + x_.build_S2_state(); + x_.build_SO3_state(); + x_.build_vect_state(); + x_.build_SEN_state(); + } + + // iterated error state EKF propogation + void predict(double &dt, processnoisecovariance &Q, const input &i_in, bool predict_state, bool prop_cov){ + if (predict_state) + { + flatted_state f_ = f(x_, i_in); + x_.oplus(f_, dt); + } + + if (prop_cov) + { + flatted_state f_ = f(x_, i_in); + // state x_before = x_; + + cov_ f_x_ = f_x(x_, i_in); + cov f_x_final; + F_x1 = cov::Identity(); + for (std::vector, int> >::iterator it = x_.vect_state.begin(); it != x_.vect_state.end(); it++) { + int idx = (*it).first.first; + int dim = (*it).first.second; + int dof = (*it).second; + for(int i = 0; i < n; i++){ + for(int j=0; j res_temp_SO3; + MTK::vect<3, scalar_type> seg_SO3; + for (std::vector >::iterator it = x_.SO3_state.begin(); it != x_.SO3_state.end(); it++) { + int idx = (*it).first; + int dim = (*it).second; + for(int i = 0; i < 3; i++){ + seg_SO3(i) = -1 * f_(dim + i) * dt; + } + // MTK::SO3 res; + // res.w() = MTK::exp(res.vec(), seg_SO3, scalar_type(1/2)); + F_x1.template block<3, 3>(idx, idx) = MTK::SO3::exp(seg_SO3); // res.normalized().toRotationMatrix(); + res_temp_SO3 = MTK::A_matrix(seg_SO3); + for(int i = 0; i < n; i++){ + f_x_final. template block<3, 1>(idx, i) = res_temp_SO3 * (f_x_. template block<3, 1>(dim, i)); + } + } + + F_x1 += f_x_final * dt; + P_ = F_x1 * P_ * (F_x1).transpose() + Q * (dt * dt); + } + } + + bool update_iterated_dyn_share_modified() { + dyn_share_modified dyn_share; + state x_propagated = x_; + int dof_Measurement; + double m_noise; + for(int i=0; i(0, 0), P_. template block<3, 3>(3, 3), dyn_share); + if(! dyn_share.valid) + { + return false; + // continue; + } + Matrix z = dyn_share.z; + // Matrix R = dyn_share.R; + Matrix h_x = dyn_share.h_x; + // Matrix h_v = dyn_share.h_v; + dof_Measurement = h_x.rows(); + m_noise = dyn_share.M_Noise; + // dof_Measurement_noise = dyn_share.R.rows(); + // vectorized_state dx, dx_new; + // x_.boxminus(dx, x_propagated); + // dx_new = dx; + // P_ = P_propagated; + + Matrix PHT; + Matrix HPHT; + Matrix K_; + if(n > dof_Measurement) + { + PHT = P_. template block(0, 0) * h_x.transpose(); + HPHT = h_x * PHT.topRows(12); + for (int m = 0; m < dof_Measurement; m++) + { + HPHT(m, m) += m_noise; + } + K_= PHT*HPHT.inverse(); + } + else + { + Matrix HTH = m_noise * h_x.transpose() * h_x; + Matrix P_inv = P_.inverse(); + P_inv.template block<12, 12>(0, 0) += HTH; + P_inv = P_inv.inverse(); + K_ = P_inv.template block(0, 0) * h_x.transpose() * m_noise; + } + Matrix dx_ = K_ * z; // - h) + (K_x - Matrix::Identity()) * dx_new; + // state x_before = x_; + + x_.boxplus(dx_); + { + P_ = P_ - K_*h_x*P_. template block<12, n>(0, 0); + } + } + return true; + } + + void update_iterated_dyn_share_IMU() { + + dyn_share_modified dyn_share; + for(int i=0; i z = dyn_share.z_IMU; + + Matrix PHT; + Matrix HP; + Matrix HPHT; + PHT.setZero(); + HP.setZero(); + HPHT.setZero(); + for (int l_ = 0; l_ < 6; l_++) + { + if (!dyn_share.satu_check[l_]) + { + PHT.col(l_) = P_.col(15+l_) + P_.col(24+l_); + HP.row(l_) = P_.row(15+l_) + P_.row(24+l_); + } + } + for (int l_ = 0; l_ < 6; l_++) + { + if (!dyn_share.satu_check[l_]) + { + HPHT.col(l_) = HP.col(15+l_) + HP.col(24+l_); + } + HPHT(l_, l_) += dyn_share.R_IMU(l_); //, l); + } + Eigen::Matrix K = PHT * HPHT.inverse(); + + Matrix dx_ = K * z; + + P_ -= K * HP; + x_.boxplus(dx_); + } + return; + } + + void change_x(state &input_state) + { + x_ = input_state; + + if((!x_.vect_state.size())&&(!x_.SO3_state.size())&&(!x_.S2_state.size())&&(!x_.SEN_state.size())) + { + x_.build_S2_state(); + x_.build_SO3_state(); + x_.build_vect_state(); + x_.build_SEN_state(); + } + } + + void change_P(cov &input_cov) + { + P_ = input_cov; + } + + const state& get_x() const { + return x_; + } + const cov& get_P() const { + return P_; + } + cov P_; + state x_; +private: + measurement m_; + spMt l_; + spMt f_x_1; + spMt f_x_2; + cov F_x1 = cov::Identity(); + cov F_x2 = cov::Identity(); + cov L_ = cov::Identity(); + + processModel *f; + processMatrix1 *f_x; + processMatrix2 *f_w; + + measurementMatrix1 *h_x; + measurementMatrix2 *h_v; + + measurementMatrix1_dyn *h_x_dyn; + measurementMatrix2_dyn *h_v_dyn; + + measurementModel_dyn_share_modified_cov *h_dyn_share_modified_1; + + measurementModel_dyn_share_modified *h_dyn_share_modified_2; + + measurementModel_dyn_share_modified *h_dyn_share_modified_3; + + int maximum_iter = 0; + scalar_type limit[n]; + +public: + EIGEN_MAKE_ALIGNED_OPERATOR_NEW +}; + +} // namespace esekfom + +#endif // ESEKFOM_EKF_HPP diff --git a/include/IKFoM/IKFoM_toolkit/esekfom/util.hpp b/include/IKFoM/IKFoM_toolkit/esekfom/util.hpp new file mode 100755 index 0000000..ab39fc4 --- /dev/null +++ b/include/IKFoM/IKFoM_toolkit/esekfom/util.hpp @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2019--2023, The University of Hong Kong + * All rights reserved. + * + * Author: Dongjiao HE + * + * 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 Universitaet Bremen 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 OWNER 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. + */ + +#ifndef __MEKFOM_UTIL_HPP__ +#define __MEKFOM_UTIL_HPP__ + +#include +#include "../mtk/src/mtkmath.hpp" +namespace esekfom { + +template +class is_same { +public: + operator bool() { + return false; + } +}; +template +class is_same { +public: + operator bool() { + return true; + } +}; + +template +class is_double { +public: + operator bool() { + return false; + } +}; + +template<> +class is_double { +public: + operator bool() { + return true; + } +}; + +template +static T +id(const T &x) +{ + return x; +} + +} // namespace esekfom + +#endif // __MEKFOM_UTIL_HPP__ diff --git a/include/IKFoM/IKFoM_toolkit/mtk/build_manifold.hpp b/include/IKFoM/IKFoM_toolkit/mtk/build_manifold.hpp new file mode 100755 index 0000000..115ec7e --- /dev/null +++ b/include/IKFoM/IKFoM_toolkit/mtk/build_manifold.hpp @@ -0,0 +1,248 @@ +// This is an advanced implementation of the algorithm described in the +// following paper: +// C. Hertzberg, R. Wagner, U. Frese, and L. Schroder. Integratinggeneric sensor fusion algorithms with sound state representationsthrough encapsulation of manifolds. +// CoRR, vol. abs/1107.1119, 2011.[Online]. Available: http://arxiv.org/abs/1107.1119 + +/* + * Copyright (c) 2019--2023, The University of Hong Kong + * All rights reserved. + * + * Modifier: Dongjiao HE + * + * 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 Universitaet Bremen 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 OWNER 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. + */ + +/* + * Copyright (c) 2008--2011, Universitaet Bremen + * All rights reserved. + * + * Author: Christoph Hertzberg + * + * 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 Universitaet Bremen 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 OWNER 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. + */ +/** + * @file mtk/build_manifold.hpp + * @brief Macro to automatically construct compound manifolds. + * + */ +#ifndef MTK_AUTOCONSTRUCT_HPP_ +#define MTK_AUTOCONSTRUCT_HPP_ + +#include + +#include +#include +#include + +#include "src/SubManifold.hpp" +#include "startIdx.hpp" + +#ifndef PARSED_BY_DOXYGEN +//////// internals ////// + +#define MTK_APPLY_MACRO_ON_TUPLE(r, macro, tuple) macro tuple + +#define MTK_TRANSFORM_COMMA(macro, entries) BOOST_PP_SEQ_ENUM(BOOST_PP_SEQ_TRANSFORM_S(1, MTK_APPLY_MACRO_ON_TUPLE, macro, entries)) + +#define MTK_TRANSFORM(macro, entries) BOOST_PP_SEQ_FOR_EACH_R(1, MTK_APPLY_MACRO_ON_TUPLE, macro, entries) + +#define MTK_CONSTRUCTOR_ARG( type, id) const type& id = type() +#define MTK_CONSTRUCTOR_COPY( type, id) id(id) +#define MTK_BOXPLUS( type, id) id.boxplus(MTK::subvector(__vec, &self::id), __scale); +#define MTK_OPLUS( type, id) id.oplus(MTK::subvector_(__vec, &self::id), __scale); +#define MTK_BOXMINUS( type, id) id.boxminus(MTK::subvector(__res, &self::id), __oth.id); +#define MTK_HAT( type, id) if(id.IDX == idx){id.hat(vec, res);} +#define MTK_JACOB_RIGHT_INV( type, id) if(id.IDX == idx){id.Jacob_right_inv(vec, res);} +#define MTK_JACOB_RIGHT( type, id) if(id.IDX == idx){id.Jacob_right(vec, res);} +#define MTK_S2_hat( type, id) if(id.IDX == idx){id.S2_hat(res);} +#define MTK_S2_Nx_yy( type, id) if(id.IDX == idx){id.S2_Nx_yy(res);} +#define MTK_S2_Mx( type, id) if(id.IDX == idx){id.S2_Mx(res, dx);} +#define MTK_OSTREAM( type, id) << __var.id << " " +#define MTK_ISTREAM( type, id) >> __var.id +#define MTK_S2_state( type, id) if(id.TYP == 1){S2_state.push_back(std::make_pair(id.IDX, id.DIM));} +#define MTK_SO3_state( type, id) if(id.TYP == 2){(SO3_state).push_back(std::make_pair(id.IDX, id.DIM));} +#define MTK_vect_state( type, id) if(id.TYP == 0){(vect_state).push_back(std::make_pair(std::make_pair(id.IDX, id.DIM), type::DOF));} +#define MTK_SEN_state( type, id) if(id.TYP == 4){(SEN_state).push_back(std::make_pair(std::make_pair(id.IDX, id.DIM), type::DOF));} + +#define MTK_SUBVARLIST(seq, S2state, SO3state, SENstate) \ +BOOST_PP_FOR_1( \ + ( \ + BOOST_PP_SEQ_SIZE(seq), \ + BOOST_PP_SEQ_HEAD(seq), \ + BOOST_PP_SEQ_TAIL(seq) (~), \ + 0,\ + 0,\ + S2state,\ + SO3state,\ + SENstate ),\ + MTK_ENTRIES_TEST, MTK_ENTRIES_NEXT, MTK_ENTRIES_OUTPUT) + +#define MTK_PUT_TYPE(type, id, dof, dim, S2state, SO3state, SENstate) \ + MTK::SubManifold id; +#define MTK_PUT_TYPE_AND_ENUM(type, id, dof, dim, S2state, SO3state, SENstate) \ + MTK_PUT_TYPE(type, id, dof, dim, S2state, SO3state, SENstate) \ + enum {DOF = type::DOF + dof}; \ + enum {DIM = type::DIM+dim}; \ + typedef type::scalar scalar; + +#define MTK_ENTRIES_OUTPUT(r, state) MTK_ENTRIES_OUTPUT_I state +#define MTK_ENTRIES_OUTPUT_I(s, head, seq, dof, dim, S2state, SO3state, SENstate) \ + MTK_APPLY_MACRO_ON_TUPLE(~, \ + BOOST_PP_IF(BOOST_PP_DEC(s), MTK_PUT_TYPE, MTK_PUT_TYPE_AND_ENUM), \ + ( BOOST_PP_TUPLE_REM_2 head, dof, dim, S2state, SO3state, SENstate)) + +#define MTK_ENTRIES_TEST(r, state) MTK_TUPLE_ELEM_4_0 state + +//! this used to be BOOST_PP_TUPLE_ELEM_4_0: +#define MTK_TUPLE_ELEM_4_0(a,b,c,d,e,f, g, h) a + +#define MTK_ENTRIES_NEXT(r, state) MTK_ENTRIES_NEXT_I state +#define MTK_ENTRIES_NEXT_I(len, head, seq, dof, dim, S2state, SO3state, SENstate) ( \ + BOOST_PP_DEC(len), \ + BOOST_PP_SEQ_HEAD(seq), \ + BOOST_PP_SEQ_TAIL(seq), \ + dof + BOOST_PP_TUPLE_ELEM_2_0 head::DOF,\ + dim + BOOST_PP_TUPLE_ELEM_2_0 head::DIM,\ + S2state,\ + SO3state,\ + SENstate ) + +#endif /* not PARSED_BY_DOXYGEN */ + + +/** + * Construct a manifold. + * @param name is the class-name of the manifold, + * @param entries is the list of sub manifolds + * + * Entries must be given in a list like this: + * @code + * typedef MTK::trafo > Pose; + * typedef MTK::vect Vec3; + * MTK_BUILD_MANIFOLD(imu_state, + * ((Pose, pose)) + * ((Vec3, vel)) + * ((Vec3, acc_bias)) + * ) + * @endcode + * Whitespace is optional, but the double parentheses are necessary. + * Construction is done entirely in preprocessor. + * After construction @a name is also a manifold. Its members can be + * accessed by names given in @a entries. + * + * @note Variable types are not allowed to have commas, thus types like + * @c vect need to be typedef'ed ahead. + */ +#define MTK_BUILD_MANIFOLD(name, entries) \ +struct name { \ + typedef name self; \ + std::vector > S2_state;\ + std::vector > SO3_state;\ + std::vector, int> > vect_state;\ + std::vector, int> > SEN_state;\ + MTK_SUBVARLIST(entries, S2_state, SO3_state, SEN_state) \ + name ( \ + MTK_TRANSFORM_COMMA(MTK_CONSTRUCTOR_ARG, entries) \ + ) : \ + MTK_TRANSFORM_COMMA(MTK_CONSTRUCTOR_COPY, entries) {}\ + int getDOF() const { return DOF; } \ + void boxplus(const MTK::vectview & __vec, scalar __scale = 1 ) { \ + MTK_TRANSFORM(MTK_BOXPLUS, entries)\ + } \ + void oplus(const MTK::vectview & __vec, scalar __scale = 1 ) { \ + MTK_TRANSFORM(MTK_OPLUS, entries)\ + } \ + void boxminus(MTK::vectview __res, const name& __oth) const { \ + MTK_TRANSFORM(MTK_BOXMINUS, entries)\ + } \ + friend std::ostream& operator<<(std::ostream& __os, const name& __var){ \ + return __os MTK_TRANSFORM(MTK_OSTREAM, entries); \ + } \ + void build_S2_state(){\ + MTK_TRANSFORM(MTK_S2_state, entries)\ + }\ + void build_vect_state(){\ + MTK_TRANSFORM(MTK_vect_state, entries)\ + }\ + void build_SO3_state(){\ + MTK_TRANSFORM(MTK_SO3_state, entries)\ + }\ + void build_SEN_state(){\ + MTK_TRANSFORM(MTK_SEN_state, entries)\ + }\ + void Lie_hat(Eigen::VectorXd &vec, Eigen::MatrixXd &res, int idx) {\ + MTK_TRANSFORM(MTK_HAT, entries)\ + }\ + void Lie_Jacob_Right_Inv(Eigen::VectorXd &vec, Eigen::MatrixXd &res, int idx) {\ + MTK_TRANSFORM(MTK_JACOB_RIGHT_INV, entries)\ + }\ + void Lie_Jacob_Right(Eigen::VectorXd &vec, Eigen::MatrixXd &res, int idx) {\ + MTK_TRANSFORM(MTK_JACOB_RIGHT, entries)\ + }\ + void S2_hat(Eigen::Matrix &res, int idx) {\ + MTK_TRANSFORM(MTK_S2_hat, entries)\ + }\ + void S2_Nx_yy(Eigen::Matrix &res, int idx) {\ + MTK_TRANSFORM(MTK_S2_Nx_yy, entries)\ + }\ + void S2_Mx(Eigen::Matrix &res, Eigen::Matrix dx, int idx) {\ + MTK_TRANSFORM(MTK_S2_Mx, entries)\ + }\ + friend std::istream& operator>>(std::istream& __is, name& __var){ \ + return __is MTK_TRANSFORM(MTK_ISTREAM, entries); \ + } \ +}; + + + +#endif /*MTK_AUTOCONSTRUCT_HPP_*/ diff --git a/include/IKFoM/IKFoM_toolkit/mtk/src/SubManifold.hpp b/include/IKFoM/IKFoM_toolkit/mtk/src/SubManifold.hpp new file mode 100755 index 0000000..a1b13de --- /dev/null +++ b/include/IKFoM/IKFoM_toolkit/mtk/src/SubManifold.hpp @@ -0,0 +1,123 @@ +// This is an advanced implementation of the algorithm described in the +// following paper: +// C. Hertzberg, R. Wagner, U. Frese, and L. Schroder. Integratinggeneric sensor fusion algorithms with sound state representationsthrough encapsulation of manifolds. +// CoRR, vol. abs/1107.1119, 2011.[Online]. Available: http://arxiv.org/abs/1107.1119 + +/* + * Copyright (c) 2019--2023, The University of Hong Kong + * All rights reserved. + * + * Modifier: Dongjiao HE + * + * 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 Universitaet Bremen 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 OWNER 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. + */ + +/* + * Copyright (c) 2008--2011, Universitaet Bremen + * All rights reserved. + * + * Author: Christoph Hertzberg + * + * 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 Universitaet Bremen 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 OWNER 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. + */ +/** + * @file mtk/src/SubManifold.hpp + * @brief Defines the SubManifold class + */ + + +#ifndef SUBMANIFOLD_HPP_ +#define SUBMANIFOLD_HPP_ + + +#include "vectview.hpp" + + +namespace MTK { + +/** + * @ingroup SubManifolds + * Helper class for compound manifolds. + * This class wraps a manifold T and provides an enum IDX refering to the + * index of the SubManifold within the compound manifold. + * + * Memberpointers to a submanifold can be used for @ref SubManifolds "functions accessing submanifolds". + * + * @tparam T The manifold type of the sub-type + * @tparam idx The index of the sub-type within the compound manifold + */ +template +struct SubManifold : public T +{ + enum {IDX = idx, DIM = dim /*!< index of the sub-type within the compound manifold */ }; + //! manifold type + typedef T type; + + //! Construct from derived type + template + explicit + SubManifold(const X& t) : T(t) {}; + + //! Construct from internal type + //explicit + SubManifold(const T& t) : T(t) {}; + + //! inherit assignment operator + using T::operator=; + +}; + +} // namespace MTK + + +#endif /* SUBMANIFOLD_HPP_ */ diff --git a/include/IKFoM/IKFoM_toolkit/mtk/src/mtkmath.hpp b/include/IKFoM/IKFoM_toolkit/mtk/src/mtkmath.hpp new file mode 100755 index 0000000..a8770e4 --- /dev/null +++ b/include/IKFoM/IKFoM_toolkit/mtk/src/mtkmath.hpp @@ -0,0 +1,294 @@ +// This is an advanced implementation of the algorithm described in the +// following paper: +// C. Hertzberg, R. Wagner, U. Frese, and L. Schroder. Integratinggeneric sensor fusion algorithms with sound state representationsthrough encapsulation of manifolds. +// CoRR, vol. abs/1107.1119, 2011.[Online]. Available: http://arxiv.org/abs/1107.1119 + +/* + * Copyright (c) 2019--2023, The University of Hong Kong + * All rights reserved. + * + * Modifier: Dongjiao HE + * + * 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 Universitaet Bremen 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 OWNER 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. + */ + +/* + * Copyright (c) 2008--2011, Universitaet Bremen + * All rights reserved. + * + * Author: Christoph Hertzberg + * + * 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 Universitaet Bremen 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 OWNER 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. + */ +/** + * @file mtk/src/mtkmath.hpp + * @brief several math utility functions. + */ + +#ifndef MTKMATH_H_ +#define MTKMATH_H_ + +#include + +#include + +#include "../types/vect.hpp" + +#ifndef M_PI +#define M_PI 3.1415926535897932384626433832795 +#endif + + +namespace MTK { + +namespace internal { + +template +struct traits { + typedef typename Manifold::scalar scalar; + enum {DOF = Manifold::DOF}; + typedef vect vectorized_type; + typedef Eigen::Matrix matrix_type; +}; + +template<> +struct traits : traits > {}; +template<> +struct traits : traits > {}; + +} // namespace internal + +/** + * \defgroup MTKMath Mathematical helper functions + */ +//@{ + +//! constant @f$ \pi @f$ +const double pi = M_PI; + +template inline scalar tolerance(); + +template<> inline float tolerance() { return 1e-5f; } +template<> inline double tolerance() { return 1e-11; } + + +/** + * normalize @a x to @f$[-bound, bound] @f$. + * + * result for @f$ x = bound + 2\cdot n\cdot bound @f$ is arbitrary @f$\pm bound @f$. + */ +template +inline scalar normalize(scalar x, scalar bound){ //not used + if(std::fabs(x) <= bound) return x; + int r = (int)(x *(scalar(1.0)/ bound)); + return x - ((r + (r>>31) + 1) & ~1)*bound; +} + +/** + * Calculate cosine and sinc of sqrt(x2). + * @param x2 the squared angle must be non-negative + * @return a pair containing cos and sinc of sqrt(x2) + */ +template +std::pair cos_sinc_sqrt(const scalar &x2){ + using std::sqrt; + using std::cos; + using std::sin; + static scalar const taylor_0_bound = boost::math::tools::epsilon(); + static scalar const taylor_2_bound = sqrt(taylor_0_bound); + static scalar const taylor_n_bound = sqrt(taylor_2_bound); + + assert(x2>=0 && "argument must be non-negative and must not be nan/-nan"); + + // FIXME check if bigger bounds are possible + if(x2>=taylor_n_bound) { + // slow fall-back solution + scalar x = sqrt(x2); + return std::make_pair(cos(x), sin(x)/x); // x is greater than 0. + } + + // FIXME Replace by Horner-Scheme (4 instead of 5 FLOP/term, numerically more stable, theoretically cos and sinc can be calculated in parallel using SSE2 mulpd/addpd) + // TODO Find optimal coefficients using Remez algorithm + static scalar const inv[] = {1/3., 1/4., 1/5., 1/6., 1/7., 1/8., 1/9.}; + scalar cosi = 1., sinc=1; + scalar term = -1/2. * x2; + for(int i=0; i<3; ++i) { + cosi += term; + term *= inv[2*i]; + sinc += term; + term *= -inv[2*i+1] * x2; + } + + return std::make_pair(cosi, sinc); + +} + +template +Eigen::Matrix hat(const Base& v) { + Eigen::Matrix res; + res << 0, -v[2], v[1], + v[2], 0, -v[0], + -v[1], v[0], 0; + return res; +} + +template +Eigen::Matrix A_inv_trans(const Base& v){ + Eigen::Matrix res; + if(v.norm() > MTK::tolerance()) + { + res = Eigen::Matrix::Identity() + 0.5 * hat(v) + (1 - v.norm() * std::cos(v.norm() / 2) / 2 / std::sin(v.norm() / 2)) * hat(v) * hat(v) / v.squaredNorm(); + + } + else + { + res = Eigen::Matrix::Identity(); + } + + return res; +} + +template +Eigen::Matrix A_inv(const Base& v){ + Eigen::Matrix res; + if(v.norm() > MTK::tolerance()) + { + res = Eigen::Matrix::Identity() - 0.5 * hat(v) + (1 - v.norm() * std::cos(v.norm() / 2) / 2 / std::sin(v.norm() / 2)) * hat(v) * hat(v) / v.squaredNorm(); + + } + else + { + res = Eigen::Matrix::Identity(); + } + + return res; +} + +template +Eigen::Matrix S2_w_expw_( Eigen::Matrix v, scalar length) + { + Eigen::Matrix res; + scalar norm = std::sqrt(v[0]*v[0] + v[1]*v[1]); + if(norm < MTK::tolerance()){ + res = Eigen::Matrix::Zero(); + res(0, 1) = 1; + res(1, 2) = 1; + res /= length; + } + else{ + res << -v[0]*(1/norm-1/std::tan(norm))/std::sin(norm), norm/std::sin(norm), 0, + -v[1]*(1/norm-1/std::tan(norm))/std::sin(norm), 0, norm/std::sin(norm); + res /= length; + } + } + +template +Eigen::Matrix A_matrix(const Base & v){ + Eigen::Matrix res; + double squaredNorm = v[0] * v[0] + v[1] * v[1] + v[2] * v[2]; + double norm = std::sqrt(squaredNorm); + if(norm < MTK::tolerance()){ + res = Eigen::Matrix::Identity(); + } + else{ + res = Eigen::Matrix::Identity() + (1 - std::cos(norm)) / squaredNorm * hat(v) + (1 - std::sin(norm) / norm) / squaredNorm * hat(v) * hat(v); + } + return res; +} + +template +scalar exp(vectview result, vectview vec, const scalar& scale = 1) { + scalar norm2 = vec.squaredNorm(); + std::pair cos_sinc = cos_sinc_sqrt(scale*scale * norm2); + scalar mult = cos_sinc.second * scale; + result = mult * vec; + return cos_sinc.first; +} + + +/** + * Inverse function to @c exp. + * + * @param result @c vectview to the result + * @param w scalar part of input + * @param vec vector part of input + * @param scale scale result by this value + * @param plus_minus_periodicity if true values @f$[w, vec]@f$ and @f$[-w, -vec]@f$ give the same result + */ +template +void log(vectview result, + const scalar &w, const vectview vec, + const scalar &scale, bool plus_minus_periodicity) +{ + // FIXME implement optimized case for vec.squaredNorm() <= tolerance() * (w*w) via Rational Remez approximation ~> only one division + scalar nv = vec.norm(); + if(nv < tolerance()) { + if(!plus_minus_periodicity && w < 0) { + // find the maximal entry: + int i; + nv = vec.cwiseAbs().maxCoeff(&i); + result = scale * std::atan2(nv, w) * vect::Unit(i); + return; + } + nv = tolerance(); + } + scalar s = scale / nv * (plus_minus_periodicity ? std::atan(nv / w) : std::atan2(nv, w) ); + + result = s * vec; +} + + +} // namespace MTK + + +#endif /* MTKMATH_H_ */ diff --git a/include/IKFoM/IKFoM_toolkit/mtk/src/vectview.hpp b/include/IKFoM/IKFoM_toolkit/mtk/src/vectview.hpp new file mode 100755 index 0000000..5025071 --- /dev/null +++ b/include/IKFoM/IKFoM_toolkit/mtk/src/vectview.hpp @@ -0,0 +1,168 @@ + +/* + * Copyright (c) 2008--2011, Universitaet Bremen + * All rights reserved. + * + * Author: Christoph Hertzberg + * + * 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 Universitaet Bremen 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 OWNER 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. + */ +/** + * @file mtk/src/vectview.hpp + * @brief Wrapper class around a pointer used as interface for plain vectors. + */ + +#ifndef VECTVIEW_HPP_ +#define VECTVIEW_HPP_ + +#include + +namespace MTK { + +/** + * A view to a vector. + * Essentially, @c vectview is only a pointer to @c scalar but can be used directly in @c Eigen expressions. + * The dimension of the vector is given as template parameter and type-checked when used in expressions. + * Data has to be modifiable. + * + * @tparam scalar Scalar type of the vector. + * @tparam dim Dimension of the vector. + * + * @todo @c vectview can be replaced by simple inheritance of @c Eigen::Map, as soon as they get const-correct + */ +namespace internal { + template + struct CovBlock { + typedef typename Eigen::Block, T1::DOF, T2::DOF> Type; + typedef typename Eigen::Block, T1::DOF, T2::DOF> ConstType; + }; + + template + struct CovBlock_ { + typedef typename Eigen::Block, T1::DIM, T2::DIM> Type; + typedef typename Eigen::Block, T1::DIM, T2::DIM> ConstType; + }; + + template + struct CrossCovBlock { + typedef typename Eigen::Block, T1::DOF, T2::DOF> Type; + typedef typename Eigen::Block, T1::DOF, T2::DOF> ConstType; + }; + + template + struct CrossCovBlock_ { + typedef typename Eigen::Block, T1::DIM, T2::DIM> Type; + typedef typename Eigen::Block, T1::DIM, T2::DIM> ConstType; + }; + + template + struct VectviewBase { + typedef Eigen::Matrix matrix_type; + typedef typename matrix_type::MapType Type; + typedef typename matrix_type::ConstMapType ConstType; + }; + + template + struct UnalignedType { + typedef T type; + }; +} + +template +class vectview : public internal::VectviewBase::Type { + typedef internal::VectviewBase VectviewBase; +public: + //! plain matrix type + typedef typename VectviewBase::matrix_type matrix_type; + //! base type + typedef typename VectviewBase::Type base; + //! construct from pointer + explicit + vectview(scalar* data, int dim_=dim) : base(data, dim_) {} + //! construct from plain matrix + vectview(matrix_type& m) : base(m.data(), m.size()) {} + //! construct from another @c vectview + vectview(const vectview &v) : base(v) {} + //! construct from Eigen::Block: + template + vectview(Eigen::VectorBlock block) : base(&block.coeffRef(0), block.size()) {} + template + vectview(Eigen::Block block) : base(&block.coeffRef(0), block.size()) {} + + //! inherit assignment operator + using base::operator=; + //! data pointer + scalar* data() {return const_cast(base::data());} +}; + +/** + * @c const version of @c vectview. + * Compared to @c Eigen::Map this implementation is const correct, i.e., + * data will not be modifiable using this view. + * + * @tparam scalar Scalar type of the vector. + * @tparam dim Dimension of the vector. + * + * @sa vectview + */ +template +class vectview : public internal::VectviewBase::ConstType { + typedef internal::VectviewBase VectviewBase; +public: + //! plain matrix type + typedef typename VectviewBase::matrix_type matrix_type; + //! base type + typedef typename VectviewBase::ConstType base; + //! construct from const pointer + explicit + vectview(const scalar* data, int dim_ = dim) : base(data, dim_) {} + //! construct from column vector + template + vectview(const Eigen::Matrix& m) : base(m.data()) {} + //! construct from row vector + template + vectview(const Eigen::Matrix& m) : base(m.data()) {} + //! construct from another @c vectview + vectview(vectview x) : base(x.data()) {} + //! construct from base + vectview(const base &x) : base(x) {} + /** + * Construct from Block + * @todo adapt this, when Block gets const-correct + */ + template + vectview(Eigen::VectorBlock block) : base(&block.coeffRef(0)) {} + template + vectview(Eigen::Block block) : base(&block.coeffRef(0)) {} + +}; + + +} // namespace MTK + +#endif /* VECTVIEW_HPP_ */ diff --git a/include/IKFoM/IKFoM_toolkit/mtk/startIdx.hpp b/include/IKFoM/IKFoM_toolkit/mtk/startIdx.hpp new file mode 100755 index 0000000..4dc2958 --- /dev/null +++ b/include/IKFoM/IKFoM_toolkit/mtk/startIdx.hpp @@ -0,0 +1,328 @@ +// This is an advanced implementation of the algorithm described in the +// following paper: +// C. Hertzberg, R. Wagner, U. Frese, and L. Schroder. Integratinggeneric sensor fusion algorithms with sound state representationsthrough encapsulation of manifolds. +// CoRR, vol. abs/1107.1119, 2011.[Online]. Available: http://arxiv.org/abs/1107.1119 + +/* + * Copyright (c) 2019--2023, The University of Hong Kong + * All rights reserved. + * + * Modifier: Dongjiao HE + * + * 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 Universitaet Bremen 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 OWNER 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. + */ + +/* + * Copyright (c) 2008--2011, Universitaet Bremen + * All rights reserved. + * + * Author: Christoph Hertzberg + * + * 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 Universitaet Bremen 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 OWNER 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. + */ +/** + * @file mtk/startIdx.hpp + * @brief Tools to access sub-elements of compound manifolds. + */ +#ifndef GET_START_INDEX_H_ +#define GET_START_INDEX_H_ + +#include + +#include "src/SubManifold.hpp" +#include "src/vectview.hpp" + +namespace MTK { + + +/** + * \defgroup SubManifolds Accessing Submanifolds + * For compound manifolds constructed using MTK_BUILD_MANIFOLD, member pointers + * can be used to get sub-vectors or matrix-blocks of a corresponding big matrix. + * E.g. for a type @a pose consisting of @a orient and @a trans the member pointers + * @c &pose::orient and @c &pose::trans give all required information and are still + * valid if the base type gets extended or the actual types of @a orient and @a trans + * change (e.g. from 2D to 3D). + * + * @todo Maybe require manifolds to typedef MatrixType and VectorType, etc. + */ +//@{ + +/** + * Determine the index of a sub-variable within a compound variable. + */ +template +int getStartIdx( MTK::SubManifold Base::*) +{ + return idx; +} + +template +int getStartIdx_( MTK::SubManifold Base::*) +{ + return dim; +} + +/** + * Determine the degrees of freedom of a sub-variable within a compound variable. + */ +template +int getDof( MTK::SubManifold Base::*) +{ + return T::DOF; +} +template +int getDim( MTK::SubManifold Base::*) +{ + return T::DIM; +} + +/** + * set the diagonal elements of a covariance matrix corresponding to a sub-variable + */ +template +void setDiagonal(Eigen::Matrix &cov, + MTK::SubManifold Base::*, const typename Base::scalar &val) +{ + cov.diagonal().template segment(idx).setConstant(val); +} + +template +void setDiagonal_(Eigen::Matrix &cov, + MTK::SubManifold Base::*, const typename Base::scalar &val) +{ + cov.diagonal().template segment(dim).setConstant(val); +} + +/** + * Get the subblock of corresponding to two members, i.e. + * \code + * Eigen::Matrix m; + * MTK::subblock(m, &Pose::orient, &Pose::trans) = some_expression; + * MTK::subblock(m, &Pose::trans, &Pose::orient) = some_expression.trans(); + * \endcode + * lets you modify mixed covariance entries in a bigger covariance matrix. + */ +template +typename MTK::internal::CovBlock::Type +subblock(Eigen::Matrix &cov, + MTK::SubManifold Base::*, MTK::SubManifold Base::*) +{ + return cov.template block(idx1, idx2); +} + +template +typename MTK::internal::CovBlock_::Type +subblock_(Eigen::Matrix &cov, + MTK::SubManifold Base::*, MTK::SubManifold Base::*) +{ + return cov.template block(dim1, dim2); +} + +template +typename MTK::internal::CrossCovBlock::Type +subblock(Eigen::Matrix &cov, MTK::SubManifold Base1::*, MTK::SubManifold Base2::*) +{ + return cov.template block(idx1, idx2); +} + +template +typename MTK::internal::CrossCovBlock_::Type +subblock_(Eigen::Matrix &cov, MTK::SubManifold Base1::*, MTK::SubManifold Base2::*) +{ + return cov.template block(dim1, dim2); +} +/** + * Get the subblock of corresponding to a member, i.e. + * \code + * Eigen::Matrix m; + * MTK::subblock(m, &Pose::orient) = some_expression; + * \endcode + * lets you modify covariance entries in a bigger covariance matrix. + */ +template +typename MTK::internal::CovBlock_::Type +subblock_(Eigen::Matrix &cov, + MTK::SubManifold Base::*) +{ + return cov.template block(dim, dim); +} + +template +typename MTK::internal::CovBlock::Type +subblock(Eigen::Matrix &cov, + MTK::SubManifold Base::*) +{ + return cov.template block(idx, idx); +} + +template +class get_cov { +public: + typedef Eigen::Matrix type; + typedef const Eigen::Matrix const_type; +}; + +template +class get_cov_ { +public: + typedef Eigen::Matrix type; + typedef const Eigen::Matrix const_type; +}; + +template +class get_cross_cov { +public: + typedef Eigen::Matrix type; + typedef const type const_type; +}; + +template +class get_cross_cov_ { +public: + typedef Eigen::Matrix type; + typedef const type const_type; +}; + + +template +vectview +subvector_impl_(vectview vec, SubManifold Base::*) +{ + return vec.template segment(dim); +} + +template +vectview +subvector_impl(vectview vec, SubManifold Base::*) +{ + return vec.template segment(idx); +} + +/** + * Get the subvector corresponding to a sub-manifold from a bigger vector. + */ + template +vectview +subvector_(vectview vec, SubManifold Base::* ptr) +{ + return subvector_impl_(vec, ptr); +} + +template +vectview +subvector(vectview vec, SubManifold Base::* ptr) +{ + return subvector_impl(vec, ptr); +} + +/** + * @todo This should be covered already by subvector(vectview vec,SubManifold Base::*) + */ +template +vectview +subvector(Eigen::Matrix& vec, SubManifold Base::* ptr) +{ + return subvector_impl(vectview(vec), ptr); +} + +template +vectview +subvector_(Eigen::Matrix& vec, SubManifold Base::* ptr) +{ + return subvector_impl_(vectview(vec), ptr); +} + +template +vectview +subvector_(const Eigen::Matrix& vec, SubManifold Base::* ptr) +{ + return subvector_impl_(vectview(vec), ptr); +} + +template +vectview +subvector(const Eigen::Matrix& vec, SubManifold Base::* ptr) +{ + return subvector_impl(vectview(vec), ptr); +} + + +/** + * const version of subvector(vectview vec,SubManifold Base::*) + */ +template +vectview +subvector_impl(const vectview cvec, SubManifold Base::*) +{ + return cvec.template segment(idx); +} + +template +vectview +subvector_impl_(const vectview cvec, SubManifold Base::*) +{ + return cvec.template segment(dim); +} + +template +vectview +subvector(const vectview cvec, SubManifold Base::* ptr) +{ + return subvector_impl(cvec, ptr); +} + + +} // namespace MTK + +#endif // GET_START_INDEX_H_ diff --git a/include/IKFoM/IKFoM_toolkit/mtk/types/S2.hpp b/include/IKFoM/IKFoM_toolkit/mtk/types/S2.hpp new file mode 100755 index 0000000..b19f9b0 --- /dev/null +++ b/include/IKFoM/IKFoM_toolkit/mtk/types/S2.hpp @@ -0,0 +1,327 @@ +// This is a NEW implementation of the algorithm described in the +// following paper: +// C. Hertzberg, R. Wagner, U. Frese, and L. Schroder. Integratinggeneric sensor fusion algorithms with sound state representationsthrough encapsulation of manifolds. +// CoRR, vol. abs/1107.1119, 2011.[Online]. Available: http://arxiv.org/abs/1107.1119 + +/* + * Copyright (c) 2019--2023, The University of Hong Kong + * All rights reserved. + * + * Modifier: Dongjiao HE + * + * 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 Universitaet Bremen 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 OWNER 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. + */ + +/* + * Copyright (c) 2008--2011, Universitaet Bremen + * All rights reserved. + * + * Author: Christoph Hertzberg + * + * 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 Universitaet Bremen 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 OWNER 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. + */ +/** + * @file mtk/types/S2.hpp + * @brief Unit vectors on the sphere, or directions in 3D. + */ +#ifndef S2_H_ +#define S2_H_ + + +#include "vect.hpp" + +#include "SOn.hpp" +#include "../src/mtkmath.hpp" + + + + +namespace MTK { + +/** + * Manifold representation of @f$ S^2 @f$. + * Used for unit vectors on the sphere or directions in 3D. + * + * @todo add conversions from/to polar angles? + */ +template +struct S2 { + + typedef _scalar scalar; + typedef vect<3, scalar> vect_type; + typedef SO3 SO3_type; + typedef typename vect_type::base vec3; + scalar length = scalar(den)/scalar(num); + enum {DOF=2, TYP = 1, DIM = 3}; + +//private: + /** + * Unit vector on the sphere, or vector pointing in a direction + */ + vect_type vec; + +public: + S2() { + if(S2_typ == 3) vec=length * vec3(0, 0, std::sqrt(1)); + if(S2_typ == 2) vec=length * vec3(0, std::sqrt(1), 0); + if(S2_typ == 1) vec=length * vec3(std::sqrt(1), 0, 0); + } + S2(const scalar &x, const scalar &y, const scalar &z) : vec(vec3(x, y, z)) { + vec.normalize(); + vec = vec * length; + } + + S2(const vect_type &_vec) : vec(_vec) { + vec.normalize(); + vec = vec * length; + } + + void oplus(MTK::vectview delta, scalar scale = 1) + { + // SO3_type res; + // res.w() = MTK::exp(res.vec(), delta, scalar(scale/2)); + vec = SO3_type::exp(delta) * vec; // res.normalized().toRotationMatrix() * vec; + } + + void boxplus(MTK::vectview delta, scalar scale=1) { + Eigen::Matrix Bx; + S2_Bx(Bx); + vect_type Bu = Bx*delta; + // SO3_type res; + // res.w() = MTK::exp(res.vec(), Bu, scalar(scale/2)); + vec = SO3_type::exp(delta) * vec; // res.normalized().toRotationMatrix() * vec; + } + + void boxminus(MTK::vectview res, const S2& other) const { + scalar v_sin = (MTK::hat(vec)*other.vec).norm(); + scalar v_cos = vec.transpose() * other.vec; + scalar theta = std::atan2(v_sin, v_cos); + if(v_sin < MTK::tolerance()) + { + if(std::fabs(theta) > MTK::tolerance() ) + { + res[0] = 3.1415926; + res[1] = 0; + } + else{ + res[0] = 0; + res[1] = 0; + } + } + else + { + S2 other_copy = other; + Eigen::MatrixBx; + other_copy.S2_Bx(Bx); + res = theta/v_sin * Bx.transpose() * MTK::hat(other.vec)*vec; + } + } + + void hat(Eigen::VectorXd& v, Eigen::MatrixXd &res) { + std::cout << "wrong idx" << std::endl; + } + void Jacob_right_inv(Eigen::VectorXd& v, Eigen::MatrixXd &res) { + std::cout << "wrong idx" << std::endl; + } + void Jacob_right(Eigen::VectorXd& v, Eigen::MatrixXd &res) { + std::cout << "wrong idx" << std::endl; + } + + void S2_hat(Eigen::Matrix &res) + { + Eigen::Matrix skew_vec; + skew_vec << scalar(0), -vec[2], vec[1], + vec[2], scalar(0), -vec[0], + -vec[1], vec[0], scalar(0); + res = skew_vec; + } + + + void S2_Bx(Eigen::Matrix &res) + { + if(S2_typ == 3) + { + if(vec[2] + length > tolerance()) + { + + res << length - vec[0]*vec[0]/(length+vec[2]), -vec[0]*vec[1]/(length+vec[2]), + -vec[0]*vec[1]/(length+vec[2]), length-vec[1]*vec[1]/(length+vec[2]), + -vec[0], -vec[1]; + res /= length; + } + else + { + res = Eigen::Matrix::Zero(); + res(1, 1) = -1; + res(2, 0) = 1; + } + } + else if(S2_typ == 2) + { + if(vec[1] + length > tolerance()) + { + + res << length - vec[0]*vec[0]/(length+vec[1]), -vec[0]*vec[2]/(length+vec[1]), + -vec[0], -vec[2], + -vec[0]*vec[2]/(length+vec[1]), length-vec[2]*vec[2]/(length+vec[1]); + res /= length; + } + else + { + res = Eigen::Matrix::Zero(); + res(1, 1) = -1; + res(2, 0) = 1; + } + } + else + { + if(vec[0] + length > tolerance()) + { + + res << -vec[1], -vec[2], + length - vec[1]*vec[1]/(length+vec[0]), -vec[2]*vec[1]/(length+vec[0]), + -vec[2]*vec[1]/(length+vec[0]), length-vec[2]*vec[2]/(length+vec[0]); + res /= length; + } + else + { + res = Eigen::Matrix::Zero(); + res(1, 1) = -1; + res(2, 0) = 1; + } + } + } + + void S2_Nx(Eigen::Matrix &res, S2& subtrahend) + { + if((vec+subtrahend.vec).norm() > tolerance()) + { + Eigen::Matrix Bx; + S2_Bx(Bx); + if((vec-subtrahend.vec).norm() > tolerance()) + { + scalar v_sin = (MTK::hat(vec)*subtrahend.vec).norm(); + scalar v_cos = vec.transpose() * subtrahend.vec; + + res = Bx.transpose() * (std::atan2(v_sin, v_cos)/v_sin*MTK::hat(vec)+MTK::hat(vec)*subtrahend.vec*((-v_cos/v_sin/v_sin/length/length/length/length+std::atan2(v_sin, v_cos)/v_sin/v_sin/v_sin)*subtrahend.vec.transpose()*MTK::hat(vec)*MTK::hat(vec)-vec.transpose()/length/length/length/length)); + } + else + { + res = 1/length/length*Bx.transpose()*MTK::hat(vec); + } + } + else + { + std::cerr << "No N(x, y) for x=-y" << std::endl; + std::exit(100); + } + } + + void S2_Nx_yy(Eigen::Matrix &res) + { + Eigen::Matrix Bx; + S2_Bx(Bx); + res = 1/length/length*Bx.transpose()*MTK::hat(vec); + } + + void S2_Mx(Eigen::Matrix &res, MTK::vectview delta) + { + Eigen::Matrix Bx; + S2_Bx(Bx); + if(delta.norm() < tolerance()) + { + res = -MTK::hat(vec)*Bx; + } + else{ + vect_type Bu = Bx*delta; + // SO3_type exp_delta; + // exp_delta.w() = MTK::exp(exp_delta.vec(), Bu, scalar(1/2)); + res = -SO3_type::exp(Bu)*MTK::hat(vec)*MTK::A_matrix(Bu).transpose()*Bx; // exp_delta.normalized().toRotationMatrix() + } + } + + operator const vect_type&() const{ + return vec; + } + + const vect_type& get_vect() const { + return vec; + } + + friend S2 operator*(const SO3& rot, const S2& dir) + { + S2 ret; + ret.vec = rot * dir.vec; + return ret; + } + + scalar operator[](int idx) const {return vec[idx]; } + + friend std::ostream& operator<<(std::ostream &os, const S2& vec){ + return os << vec.vec.transpose() << " "; + } + friend std::istream& operator>>(std::istream &is, S2& vec){ + for(int i=0; i<3; ++i) + is >> vec.vec[i]; + vec.vec.normalize(); + vec.vec = vec.vec * vec.length; + return is; + + } +}; + + +} // namespace MTK + + +#endif /*S2_H_*/ diff --git a/include/IKFoM/IKFoM_toolkit/mtk/types/SEn.hpp b/include/IKFoM/IKFoM_toolkit/mtk/types/SEn.hpp new file mode 100755 index 0000000..2270136 --- /dev/null +++ b/include/IKFoM/IKFoM_toolkit/mtk/types/SEn.hpp @@ -0,0 +1,334 @@ +// This is an advanced implementation of the algorithm described in the +// following paper: +// C. Hertzberg, R. Wagner, U. Frese, and L. Schroder. Integratinggeneric sensor fusion algorithms with sound state representationsthrough encapsulation of manifolds. +// CoRR, vol. abs/1107.1119, 2011.[Online]. Available: http://arxiv.org/abs/1107.1119 + +/* + * Copyright (c) 2019--2023, The University of Hong Kong + * All rights reserved. + * + * Modifier: Dongjiao HE + * + * 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 Universitaet Bremen 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 OWNER 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. + */ + +/* + * Copyright (c) 2008--2011, Universitaet Bremen + * All rights reserved. + * + * Author: Christoph Hertzberg + * + * 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 Universitaet Bremen 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 OWNER 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. + */ +/** + * @file mtk/types/SEn.hpp + * @brief Standard Orthogonal Groups i.e.\ rotatation groups. + */ +#ifndef SEN_H_ +#define SEN_H_ + +#include + +#include "SOn.hpp" +#include "vect.hpp" +#include "../src/mtkmath.hpp" + + +namespace MTK { + + +/** + * Three-dimensional orientations represented as Quaternion. + * It is assumed that the internal Quaternion always stays normalized, + * should this not be the case, call inherited member function @c normalize(). + */ +template +struct SEN { + enum {DOF = num_of_vec_plus1, DIM = num_of_vec_plus1, TYP = 4}; + typedef _scalar scalar; + typedef Eigen::Matrix base; + typedef SO3 SO3_type; + // typedef Eigen::Quaternion base; + // typedef Eigen::Quaternion Quaternion; + typedef vect vect_type; + SO3_type SO3_data; + base mat; + + /** + * Construct from real part and three imaginary parts. + * Quaternion is normalized after construction. + */ + // SEN(const base& src) : mat(src) { + // // base::normalize(); + // } + + /** + * Construct from Eigen::Quaternion. + * @note Non-normalized input may result result in spurious behavior. + */ + SEN(const base& src = base::Identity()) : mat(src) {} + + /** + * Construct from rotation matrix. + * @note Invalid rotation matrices may lead to spurious behavior. + */ + // template + // SO3(const Eigen::MatrixBase& matrix) : base(matrix) {} + + /** + * Construct from arbitrary rotation type. + * @note Invalid rotation matrices may lead to spurious behavior. + */ + // template + // SO3(const Eigen::RotationBase& rotation) : base(rotation.derived()) {} + + //! @name Manifold requirements + + void boxplus(MTK::vectview vec, scalar scale=1) { + SEN delta = exp(vec, scale); // ? + mat = mat * delta.mat; + } + void boxminus(MTK::vectview res, const SEN& other) const { + base error_mat = other.mat.inverse() * mat; + res = log(error_mat); + } + //} + + void oplus(MTK::vectview vec, scalar scale=1) { + SEN delta = exp(vec, scale); + mat = mat * delta.mat; + } + + // void hat(MTK::vectview& v, Eigen::Matrix &res) { + void hat(Eigen::VectorXd& v, Eigen::MatrixXd &res) { + res = Eigen::Matrix::Zero(); + Eigen::Matrix psi; + psi << 0, -v[2], v[1], + v[2], 0, -v[0], + -v[1], v[0], 0; + res.block<3, 3>(0, 0) = psi; + for(int i = 3; i < v.size() / 3 + 2; i++) + { + res.block<3, 1>(0, i) = v.segment<3>(i + (i-3)*3); + } + // return res; + } + + // void Jacob_right_inv(MTK::vectview vec, Eigen::Matrix & res){ + void Jacob_right_inv(Eigen::VectorXd& vec, Eigen::MatrixXd &res){ + res = Eigen::Matrix::Zero(); + Eigen::Matrix M_v; + Eigen::VectorXd vec_psi, vec_ro; + Eigen::MatrixXd jac_v; + Eigen::MatrixXd hat_v, hat_ro; + vec_psi = vec.segment<3>(0); + // Eigen::Matrix ; + SO3_data.hat(vec_psi, hat_v); + SO3_data.Jacob_right_inv(vec_psi, jac_v); + double norm = vec_psi.norm(); + for(int i = 0; i < vec.size() / 3; i++) + { + res.block<3, 3>(i*3, i*3) = jac_v; + } + for(int i = 1; i < vec.size() / 3; i++) + { + vec_ro = vec.segment<3>(i * 3); + SO3_data.hat(vec_ro, hat_ro); + if(norm > MTK::tolerance()) + { + res.block<3,3>(i*3, 0) = 0.5 * hat_ro + (1 - norm * std::cos(norm / 2) / 2 / std::sin(norm / 2))/norm/norm * (hat_ro * hat_v + hat_v * hat_ro) + ((2 - norm * std::cos(norm / 2) / 2 / std::sin(norm / 2)) / 2 / norm / norm / norm / norm - 1 / 8 / norm / norm / std::sin(norm / 2) / std::sin(norm / 2)) * hat_v * (hat_ro * hat_v + hat_v * hat_ro) * hat_v; + } + else + { + res.block<3,3>(i*3, 0) = 0.5 * hat_ro; + } + + } + // return res; + } + + // void Jacob_right(MTK::vectview & vec, Eigen::Matrix &res){ + void Jacob_right(Eigen::VectorXd& vec, Eigen::MatrixXd &res){ + res = Eigen::Matrix::Zero(); + Eigen::MatrixXd hat_v, hat_ro; + Eigen::VectorXd vec_psi, vec_ro; + Eigen::MatrixXd jac_v; + vec_psi = vec.segment<3>(0); + // Eigen::Matrix ; + SO3_data.hat(vec_psi, hat_v); + SO3_data.Jacob_right(vec_psi, jac_v); + // double squaredNorm = v[0] * v[0] + v[1] * v[1] + v[2] * v[2]; + // double norm = std::sqrt(squaredNorm); + double norm = vec_psi.norm(); + for(int i = 0; i < vec.size() / 3; i++) + { + res.block<3, 3>(i*3, i*3) = jac_v; + } + for(int i = 1; i < vec.size() / 3; i++) + { + vec_ro = vec.segment<3>(i * 3); + SO3_data.hat(vec_ro, hat_ro); + if(norm > MTK::tolerance()) + { + res.block<3,3>(i*3, 0) = -1 * jac_v * (0.5 * hat_ro + (1 - norm * std::cos(norm / 2) / 2 / std::sin(norm / 2))/norm/norm * (hat_ro * hat_v + hat_v * hat_ro) + ((2 - norm * std::cos(norm / 2) / 2 / std::sin(norm / 2)) / 2 / norm / norm / norm / norm - 1 / 8 / norm / norm / std::sin(norm / 2) / std::sin(norm / 2)) * hat_v * (hat_ro * hat_v + hat_v * hat_ro) * hat_v) * jac_v; + } + else + { + res.block<3,3>(i*3, 0) = -0.5 * jac_v * hat_ro * jac_v; + } + + } + // return res; + } + + void S2_hat(Eigen::Matrix &res) + { + std::cerr << "wrong idx for S2" << std::endl; + res = Eigen::Matrix::Zero(); + } + void S2_Nx_yy(Eigen::Matrix &res) + { + std::cerr << "wrong idx for S2" << std::endl; + std::exit(100); + res = Eigen::Matrix::Zero(); + } + + void S2_Mx(Eigen::Matrix &res, MTK::vectview delta) + { + std::cerr << "wrong idx for S2" << std::endl; + std::exit(100); + res = Eigen::Matrix::Zero(); + } + + friend std::ostream& operator<<(std::ostream &os, const SEN& q){ + for(int i=0; i>(std::istream &is, SEN& q){ + // vect coeffs; + for(int i=0; i> q.mat(i, j); + } + } + // is >> q.mat; + // coeffs; + // q.coeffs() = coeffs.normalized(); + return is; + } + + //! @name Helper functions + //{ + /** + * Calculate the exponential map. In matrix terms this would correspond + * to the Rodrigues formula. + */ + // FIXME vectview<> can't be constructed from every MatrixBase<>, use const Vector3x& as workaround +// static SO3 exp(MTK::vectview dvec, scalar scale = 1){ + static SEN exp(const Eigen::Matrix& dvec, scalar scale = 1){ + SEN res; + res.mat = Eigen::Matrix::Identity(); + Eigen::Matrix exp_; //, jac; + Eigen::MatrixXd jac; + Eigen::Matrix psi; + Eigen::VectorXd minus_psi; + psi = dvec.template block<3,1>(0, 0); + minus_psi = -psi; + SO3_type SO3_temp; + exp_ = SO3_type::exp(psi); + SO3_temp.Jacob_right(minus_psi, jac); + res.mat.template block<3,3>(0, 0) = exp_; + for(int i = 3; i < DOF / 3 + 2; i++) + { + res.mat.template block<3, 1>(0, i) = jac * dvec.template block<3,1>(i + (i-3)*3,0); + } + return res; + } + /** + * Calculate the inverse of @c exp. + * Only guarantees that exp(log(x)) == x + */ + static Eigen::Matrix log(base &orient){ + Eigen::Matrix res; + Eigen::Matrix psi; + Eigen::VectorXd minus_psi; + Eigen::Matrix mat_psi; + Eigen::MatrixXd jac; + mat_psi = orient.template block<3, 3>(0, 0); + SO3_type SO3_temp; + SO3_type exp_psi(mat_psi); + psi = SO3_type::log(exp_psi); + minus_psi = -psi; + SO3_temp.Jacob_right_inv(minus_psi, jac); + for(int i = 3; i < dim_of_mat; i++) + { + res.template block<3,1>(i + (i-3)*3,0) = jac * orient.template block<3, 1>(0, i); + } + return res; + } +}; + + +} // namespace MTK + +#endif /*SON_H_*/ + diff --git a/include/IKFoM/IKFoM_toolkit/mtk/types/SOn.hpp b/include/IKFoM/IKFoM_toolkit/mtk/types/SOn.hpp new file mode 100755 index 0000000..155ecf7 --- /dev/null +++ b/include/IKFoM/IKFoM_toolkit/mtk/types/SOn.hpp @@ -0,0 +1,361 @@ +// This is an advanced implementation of the algorithm described in the +// following paper: +// C. Hertzberg, R. Wagner, U. Frese, and L. Schroder. Integratinggeneric sensor fusion algorithms with sound state representationsthrough encapsulation of manifolds. +// CoRR, vol. abs/1107.1119, 2011.[Online]. Available: http://arxiv.org/abs/1107.1119 + +/* + * Copyright (c) 2019--2023, The University of Hong Kong + * All rights reserved. + * + * Modifier: Dongjiao HE + * + * 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 Universitaet Bremen 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 OWNER 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. + */ + +/* + * Copyright (c) 2008--2011, Universitaet Bremen + * All rights reserved. + * + * Author: Christoph Hertzberg + * + * 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 Universitaet Bremen 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 OWNER 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. + */ +/** + * @file mtk/types/SOn.hpp + * @brief Standard Orthogonal Groups i.e.\ rotatation groups. + */ +#ifndef SON_H_ +#define SON_H_ + +#include + +#include "vect.hpp" +#include "../src/mtkmath.hpp" + + +namespace MTK { + + +/** + * Two-dimensional orientations represented as scalar. + * There is no guarantee that the representing scalar is within any interval, + * but the result of boxminus will always have magnitude @f$\le\pi @f$. + */ +template +struct SO2 : public Eigen::Rotation2D<_scalar> { + enum {DOF = 1, DIM = 2, TYP = 3}; + + typedef _scalar scalar; + typedef Eigen::Rotation2D base; + typedef vect vect_type; + + //! Construct from angle + SO2(const scalar& angle = 0) : base(angle) { } + + //! Construct from Eigen::Rotation2D + SO2(const base& src) : base(src) {} + + /** + * Construct from 2D vector. + * Resulting orientation will rotate the first unit vector to point to vec. + */ + SO2(const vect_type &vec) : base(atan2(vec[1], vec[0])) {}; + + + //! Calculate @c this->inverse() * @c r + SO2 operator%(const base &r) const { + return base::inverse() * r; + } + + //! Calculate @c this->inverse() * @c r + template + vect_type operator%(const Eigen::MatrixBase &vec) const { + return base::inverse() * vec; + } + + //! Calculate @c *this * @c r.inverse() + SO2 operator/(const SO2 &r) const { + return *this * r.inverse(); + } + + //! Gets the angle as scalar. + operator scalar() const { + return base::angle(); + } + void S2_hat(Eigen::Matrix &res) + { + res = Eigen::Matrix::Zero(); + } + //! @name Manifold requirements + void S2_Nx_yy(Eigen::Matrix &res) + { + std::cerr << "wrong idx for S2" << std::endl; + std::exit(100); + res = Eigen::Matrix::Zero(); + } + + void S2_Mx(Eigen::Matrix &res, MTK::vectview delta) + { + std::cerr << "wrong idx for S2" << std::endl; + std::exit(100); + res = Eigen::Matrix::Zero(); + } + + void oplus(MTK::vectview vec, scalar scale = 1) { + base::angle() += scale * vec[0]; + } + + void boxplus(MTK::vectview vec, scalar scale = 1) { + base::angle() += scale * vec[0]; + } + void boxminus(MTK::vectview res, const SO2& other) const { + res[0] = MTK::normalize(base::angle() - other.angle(), scalar(MTK::pi)); + } + + friend std::istream& operator>>(std::istream &is, SO2& ang){ + return is >> ang.angle(); + } + void hat(Eigen::VectorXd& v, Eigen::MatrixXd &res) { + std::cout << "wrong idx" << std::endl; + } + void Jacob_right_inv(Eigen::VectorXd& v, Eigen::MatrixXd &res) { + std::cout << "wrong idx" << std::endl; + } + void Jacob_right(Eigen::VectorXd& v, Eigen::MatrixXd &res) { + std::cout << "wrong idx" << std::endl; + } +}; + + +/** + * Three-dimensional orientations represented as Quaternion. + * It is assumed that the internal Quaternion always stays normalized, + * should this not be the case, call inherited member function @c normalize(). + */ +template //, int Options = Eigen::AutoAlign> +struct SO3 : public Eigen::Matrix<_scalar, 3, 3> { + enum {DOF = 3, DIM = 3, TYP = 2}; + typedef _scalar scalar; + typedef Eigen::Matrix base; + typedef Eigen::Matrix Matrix; + typedef vect vect_type; + + /** + * Construct from Eigen::Quaternion. + * @note Non-normalized input may result result in spurious behavior. + */ + SO3(const base& src = base::Identity()) : base(src) {} + + /** + * Construct from rotation matrix. + * @note Invalid rotation matrices may lead to spurious behavior. + */ + template + SO3(const Eigen::MatrixBase& matrix) : base(matrix) {} + + /** + * Construct from arbitrary rotation type. + * @note Invalid rotation matrices may lead to spurious behavior. + */ + // template + // SO3(const Eigen::RotationBase& rotation) : base(rotation.derived()) {} + + //! @name Manifold requirements + + // SO3 operator=(const base &r) const { + // return r; + // } + + // //! Calculate @c *this * @c r.inverse() + // SO3 operator*(const SO3 &r) const { + // return *this * r; + // } + + void boxplus(MTK::vectview vec, scalar scale=1) { + SO3 delta = exp(vec, scale); + *this = *this * delta; + } + void boxminus(MTK::vectview res, const SO3& other) const { + res = SO3::log(other.transpose() * *this); + } + //} + + void oplus(MTK::vectview vec, scalar scale=1) { + SO3 delta = exp(vec, scale); + *this = *this * delta; + } + + // void hat(MTK::vectview& v, Eigen::Matrix &res) { + void hat(Eigen::VectorXd& v, Eigen::MatrixXd &res) { + // Eigen::Matrix res; + res << 0, -v[2], v[1], + v[2], 0, -v[0], + -v[1], v[0], 0; + // return res; + } + + // void Jacob_right_inv(MTK::vectview vec, Eigen::Matrix & res){ + void Jacob_right_inv(Eigen::VectorXd& vec, Eigen::MatrixXd &res){ + Eigen::MatrixXd hat_v; + hat(vec, hat_v); + if(vec.norm() > MTK::tolerance()) + { + res = Eigen::Matrix::Identity() + 0.5 * hat_v + (1 - vec.norm() * std::cos(vec.norm() / 2) / 2 / std::sin(vec.norm() / 2)) * hat_v * hat_v / vec.squaredNorm(); + } + else + { + res = Eigen::Matrix::Identity(); + } + // return res; + } + + // void Jacob_right(MTK::vectview & v, Eigen::Matrix &res){ + void Jacob_right(Eigen::VectorXd& v, Eigen::MatrixXd &res){ + Eigen::MatrixXd hat_v; + hat(v, hat_v); + double squaredNorm = v[0] * v[0] + v[1] * v[1] + v[2] * v[2]; + double norm = std::sqrt(squaredNorm); + if(norm < MTK::tolerance()){ + res = Eigen::Matrix::Identity(); + } + else{ + res = Eigen::Matrix::Identity() - (1 - std::cos(norm)) / squaredNorm * hat_v + (1 - std::sin(norm) / norm) / squaredNorm * hat_v * hat_v; + } + // return res; + } + + void S2_hat(Eigen::Matrix &res) + { + res = Eigen::Matrix::Zero(); + } + void S2_Nx_yy(Eigen::Matrix &res) + { + std::cerr << "wrong idx for S2" << std::endl; + std::exit(100); + res = Eigen::Matrix::Zero(); + } + + void S2_Mx(Eigen::Matrix &res, MTK::vectview delta) + { + std::cerr << "wrong idx for S2" << std::endl; + std::exit(100); + res = Eigen::Matrix::Zero(); + } + + friend std::ostream& operator<<(std::ostream &os, const SO3& q){ // wrong! + return os << q.data() << " "; + } + + friend std::istream& operator>>(std::istream &is, SO3& q){ // wrong! + SO3 coeffs; + is >> coeffs; + q = coeffs; + return is; + } + + //! @name Helper functions + //{ + /** + * Calculate the exponential map. In matrix terms this would correspond + * to the Rodrigues formula. + */ + // FIXME vectview<> can't be constructed from every MatrixBase<>, use const Vector3x& as workaround +// static SO3 exp(MTK::vectview dvec, scalar scale = 1){ + static SO3 exp(const Eigen::Matrix& dvec, scalar scale = 1){ + Eigen::Matrix ang = dvec * scale; + double ang_norm = ang.norm(); + Eigen::Matrix Eye3 = Eigen::Matrix::Identity(); + if (ang_norm > 0.0000001) + { + Eigen::Matrix r_axis = ang / ang_norm; + Eigen::Matrix K; + K << 0.0, -r_axis(2), r_axis(1), + r_axis(2), 0.0, -r_axis(0), + -r_axis(1), r_axis(0), 0.0; // SKEW_SYM_MATRX(r_axis); + /// Roderigous Tranformation + return Eye3 + std::sin(ang_norm) * K + (1.0 - std::cos(ang_norm)) * K * K; + } + else + { + return Eye3; + } + } + /** + * Calculate the inverse of @c exp. + * Only guarantees that exp(log(x)) == x + */ + static Eigen::Vector3d log(const SO3 &orient){ + double theta = (orient.trace() > 3.0 - 1e-6) ? 0.0 : std::acos(0.5 * (orient.trace() - 1)); + Eigen::Matrix K(orient(2,1) - orient(1,2), orient(0,2) - orient(2,0), orient(1,0) - orient(0,1)); + return (std::abs(theta) < 0.001) ? (0.5 * K) : (0.5 * theta / std::sin(theta) * K); + } +}; + +namespace internal { +template +struct UnalignedType >{ + typedef SO2 type; +}; + +template +struct UnalignedType >{ + typedef SO3 type; +}; + +} // namespace internal + + +} // namespace MTK + +#endif /*SON_H_*/ + diff --git a/include/IKFoM/IKFoM_toolkit/mtk/types/vect.hpp b/include/IKFoM/IKFoM_toolkit/mtk/types/vect.hpp new file mode 100755 index 0000000..d75e6d7 --- /dev/null +++ b/include/IKFoM/IKFoM_toolkit/mtk/types/vect.hpp @@ -0,0 +1,511 @@ +// This is an advanced implementation of the algorithm described in the +// following paper: +// C. Hertzberg, R. Wagner, U. Frese, and L. Schroder. Integratinggeneric sensor fusion algorithms with sound state representationsthrough encapsulation of manifolds. +// CoRR, vol. abs/1107.1119, 2011.[Online]. Available: http://arxiv.org/abs/1107.1119 + +/* + * Copyright (c) 2019--2023, The University of Hong Kong + * All rights reserved. + * + * Modifier: Dongjiao HE + * + * 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 Universitaet Bremen 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 OWNER 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. + */ + +/* + * Copyright (c) 2008--2011, Universitaet Bremen + * All rights reserved. + * + * Author: Christoph Hertzberg + * + * 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 Universitaet Bremen 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 OWNER 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. + */ +/** + * @file mtk/types/vect.hpp + * @brief Basic vectors interpreted as manifolds. + * + * This file also implements a simple wrapper for matrices, for arbitrary scalars + * and for positive scalars. + */ +#ifndef VECT_H_ +#define VECT_H_ + +#include +#include +#include + +#include "../src/vectview.hpp" + +namespace MTK { + +static const Eigen::IOFormat IO_no_spaces(Eigen::StreamPrecision, Eigen::DontAlignCols, ",", ",", "", "", "[", "]"); + + +/** + * A simple vector class. + * Implementation is basically a wrapper around Eigen::Matrix with manifold + * requirements added. + */ +template +struct vect : public Eigen::Matrix<_scalar, D, 1, _Options> { + typedef Eigen::Matrix<_scalar, D, 1, _Options> base; + enum {DOF = D, DIM = D, TYP = 0}; + typedef _scalar scalar; + + //using base::operator=; + + /** Standard constructor. Sets all values to zero. */ + vect(const base &src = base::Zero()) : base(src) {} + + /** Constructor copying the value of the expression \a other */ + template + EIGEN_STRONG_INLINE vect(const Eigen::DenseBase& other) : base(other) {} + + /** Construct from memory. */ + vect(const scalar* src, int size = DOF) : base(base::Map(src, size)) { } + + void boxplus(MTK::vectview vec, scalar scale=1) { + *this += scale * vec; + } + void boxminus(MTK::vectview res, const vect& other) const { + res = *this - other; + } + + void oplus(MTK::vectview vec, scalar scale=1) { + *this += scale * vec; + } + + void hat(Eigen::VectorXd& v, Eigen::MatrixXd &res) { + std::cout << "wrong idx" << std::endl; + } + void Jacob_right_inv(Eigen::VectorXd& v, Eigen::MatrixXd &res) { + std::cout << "wrong idx" << std::endl; + } + void Jacob_right(Eigen::VectorXd& v, Eigen::MatrixXd &res) { + std::cout << "wrong idx" << std::endl; + } + + void S2_hat(Eigen::Matrix &res) + { + res = Eigen::Matrix::Zero(); + } + + void S2_Nx_yy(Eigen::Matrix &res) + { + std::cerr << "wrong idx for S2" << std::endl; + std::exit(100); + res = Eigen::Matrix::Zero(); + } + + void S2_Mx(Eigen::Matrix &res, MTK::vectview delta) + { + std::cerr << "wrong idx for S2" << std::endl; + std::exit(100); + res = Eigen::Matrix::Zero(); + } + + friend std::ostream& operator<<(std::ostream &os, const vect& v){ + // Eigen sometimes messes with the streams flags, so output manually: + for(int i=0; i>(std::istream &is, vect& v){ + char term=0; + is >> std::ws; // skip whitespace + switch(is.peek()) { + case '(': term=')'; is.ignore(1); break; + case '[': term=']'; is.ignore(1); break; + case '{': term='}'; is.ignore(1); break; + default: break; + } + if(D==Eigen::Dynamic) { + assert(term !=0 && "Dynamic vectors must be embraced"); + std::vector temp; + while(is.good() && is.peek() != term) { + scalar x; + is >> x; + temp.push_back(x); + if(is.peek()==',') is.ignore(1); + } + v = vect::Map(temp.data(), temp.size()); + } else + for(int i=0; i> v[i]; + if(is.peek()==',') { // ignore commas between values + is.ignore(1); + } + } + if(term!=0) { + char x; + is >> x; + if(x!=term) { + is.setstate(is.badbit); +// assert(x==term && "start and end bracket do not match!"); + } + } + return is; + } + + template + vectview tail(){ + BOOST_STATIC_ASSERT(0< dim && dim <= DOF); + return base::template tail(); + } + template + vectview tail() const{ + BOOST_STATIC_ASSERT(0< dim && dim <= DOF); + return base::template tail(); + } + template + vectview head(){ + BOOST_STATIC_ASSERT(0< dim && dim <= DOF); + return base::template head(); + } + template + vectview head() const{ + BOOST_STATIC_ASSERT(0< dim && dim <= DOF); + return base::template head(); + } +}; + + +/** + * A simple matrix class. + * Implementation is basically a wrapper around Eigen::Matrix with manifold + * requirements added, i.e., matrix is viewed as a plain vector for that. + */ +template::Options> +struct matrix : public Eigen::Matrix<_scalar, M, N, _Options> { + typedef Eigen::Matrix<_scalar, M, N, _Options> base; + enum {DOF = M * N, TYP = 4, DIM=0}; + typedef _scalar scalar; + + using base::operator=; + + /** Standard constructor. Sets all values to zero. */ + matrix() { + base::setZero(); + } + + /** Constructor copying the value of the expression \a other */ + template + EIGEN_STRONG_INLINE matrix(const Eigen::MatrixBase& other) : base(other) {} + + /** Construct from memory. */ + matrix(const scalar* src) : base(src) { } + + void boxplus(MTK::vectview vec, scalar scale = 1) { + *this += scale * base::Map(vec.data()); + } + void boxminus(MTK::vectview res, const matrix& other) const { + base::Map(res.data()) = *this - other; + } + + void hat(Eigen::VectorXd& v, Eigen::MatrixXd &res) { + std::cout << "wrong idx" << std::endl; + } + void Jacob_right_inv(Eigen::VectorXd& v, Eigen::MatrixXd &res) { + std::cout << "wrong idx" << std::endl; + } + void Jacob_right(Eigen::VectorXd& v, Eigen::MatrixXd &res) { + std::cout << "wrong idx" << std::endl; + } + + void S2_hat(Eigen::Matrix &res) + { + res = Eigen::Matrix::Zero(); + } + + void oplus(MTK::vectview vec, scalar scale = 1) { + *this += scale * base::Map(vec.data()); + } + + void S2_Nx_yy(Eigen::Matrix &res) + { + std::cerr << "wrong idx for S2" << std::endl; + std::exit(100); + res = Eigen::Matrix::Zero(); + } + + void S2_Mx(Eigen::Matrix &res, MTK::vectview delta) + { + std::cerr << "wrong idx for S2" << std::endl; + std::exit(100); + res = Eigen::Matrix::Zero(); + } + + friend std::ostream& operator<<(std::ostream &os, const matrix& mat){ + for(int i=0; i>(std::istream &is, matrix& mat){ + for(int i=0; i> mat.data()[i]; + } + return is; + } +};// @todo What if M / N = Eigen::Dynamic? + + + +/** + * A simple scalar type. + */ +template +struct Scalar { + enum {DOF = 1, TYP = 5, DIM=0}; + typedef _scalar scalar; + + scalar value; + + Scalar(const scalar& value = scalar(0)) : value(value) {} + operator const scalar&() const { return value; } + operator scalar&() { return value; } + Scalar& operator=(const scalar& val) { value = val; return *this; } + + void S2_hat(Eigen::Matrix &res) + { + res = Eigen::Matrix::Zero(); + } + + void S2_Nx_yy(Eigen::Matrix &res) + { + std::cerr << "wrong idx for S2" << std::endl; + std::exit(100); + res = Eigen::Matrix::Zero(); + } + + void S2_Mx(Eigen::Matrix &res, MTK::vectview delta) + { + std::cerr << "wrong idx for S2" << std::endl; + std::exit(100); + res = Eigen::Matrix::Zero(); + } + + void oplus(MTK::vectview vec, scalar scale=1) { + value += scale * vec[0]; + } + + void boxplus(MTK::vectview vec, scalar scale=1) { + value += scale * vec[0]; + } + void boxminus(MTK::vectview res, const Scalar& other) const { + res[0] = *this - other; + } + + void hat(Eigen::VectorXd& v, Eigen::MatrixXd &res) { + std::cout << "wrong idx" << std::endl; + } + void Jacob_right_inv(Eigen::VectorXd& v, Eigen::MatrixXd &res) { + std::cout << "wrong idx" << std::endl; + } + void Jacob_right(Eigen::VectorXd& v, Eigen::MatrixXd &res) { + std::cout << "wrong idx" << std::endl; + } +}; + +/** + * Positive scalars. + * Boxplus is implemented using multiplication by @f$x\boxplus\delta = x\cdot\exp(\delta) @f$. + */ +template +struct PositiveScalar { + enum {DOF = 1, TYP = 6, DIM=0}; + typedef _scalar scalar; + + scalar value; + + PositiveScalar(const scalar& value = scalar(1)) : value(value) { + assert(value > scalar(0)); + } + operator const scalar&() const { return value; } + PositiveScalar& operator=(const scalar& val) { assert(val>0); value = val; return *this; } + + void boxplus(MTK::vectview vec, scalar scale = 1) { + value *= std::exp(scale * vec[0]); + } + void boxminus(MTK::vectview res, const PositiveScalar& other) const { + res[0] = std::log(*this / other); + } + + void oplus(MTK::vectview vec, scalar scale = 1) { + value *= std::exp(scale * vec[0]); + } + + void hat(Eigen::VectorXd& v, Eigen::MatrixXd &res) { + std::cout << "wrong idx" << std::endl; + } + void Jacob_right_inv(Eigen::VectorXd& v, Eigen::MatrixXd &res) { + std::cout << "wrong idx" << std::endl; + } + void Jacob_right(Eigen::VectorXd& v, Eigen::MatrixXd &res) { + std::cout << "wrong idx" << std::endl; + } + + void S2_hat(Eigen::Matrix &res) + { + res = Eigen::Matrix::Zero(); + } + + void S2_Nx_yy(Eigen::Matrix &res) + { + std::cerr << "wrong idx for S2" << std::endl; + std::exit(100); + res = Eigen::Matrix::Zero(); + } + + void S2_Mx(Eigen::Matrix &res, MTK::vectview delta) + { + std::cerr << "wrong idx for S2" << std::endl; + std::exit(100); + res = Eigen::Matrix::Zero(); + } + + + friend std::istream& operator>>(std::istream &is, PositiveScalar& s){ + is >> s.value; + assert(s.value > 0); + return is; + } +}; + +template +struct Complex : public std::complex<_scalar>{ + enum {DOF = 2, TYP = 7, DIM=0}; + typedef _scalar scalar; + + typedef std::complex Base; + + Complex(const Base& value) : Base(value) {} + Complex(const scalar& re = 0.0, const scalar& im = 0.0) : Base(re, im) {} + Complex(const MTK::vectview &in) : Base(in[0], in[1]) {} + template + Complex(const Eigen::DenseBase &in) : Base(in[0], in[1]) {} + + void boxplus(MTK::vectview vec, scalar scale = 1) { + Base::real() += scale * vec[0]; + Base::imag() += scale * vec[1]; + }; + void boxminus(MTK::vectview res, const Complex& other) const { + Complex diff = *this - other; + res << diff.real(), diff.imag(); + } + + void S2_hat(Eigen::Matrix &res) + { + res = Eigen::Matrix::Zero(); + } + + void hat(Eigen::VectorXd& v, Eigen::MatrixXd &res) { + std::cout << "wrong idx" << std::endl; + } + void Jacob_right_inv(Eigen::VectorXd& v, Eigen::MatrixXd &res) { + std::cout << "wrong idx" << std::endl; + } + void Jacob_right(Eigen::VectorXd& v, Eigen::MatrixXd &res) { + std::cout << "wrong idx" << std::endl; + } + + void oplus(MTK::vectview vec, scalar scale = 1) { + Base::real() += scale * vec[0]; + Base::imag() += scale * vec[1]; + }; + + void S2_Nx_yy(Eigen::Matrix &res) + { + std::cerr << "wrong idx for S2" << std::endl; + std::exit(100); + res = Eigen::Matrix::Zero(); + } + + void S2_Mx(Eigen::Matrix &res, MTK::vectview delta) + { + std::cerr << "wrong idx for S2" << std::endl; + std::exit(100); + res = Eigen::Matrix::Zero(); + } + + scalar squaredNorm() const { + return std::pow(Base::real(),2) + std::pow(Base::imag(),2); + } + + const scalar& operator()(int i) const { + assert(0<=i && i<2 && "Index out of range"); + return i==0 ? Base::real() : Base::imag(); + } + scalar& operator()(int i){ + assert(0<=i && i<2 && "Index out of range"); + return i==0 ? Base::real() : Base::imag(); + } +}; + + +namespace internal { + +template +struct UnalignedType >{ + typedef vect type; +}; + +} // namespace internal + + +} // namespace MTK + + + + +#endif /*VECT_H_*/ diff --git a/include/IKFoM/IKFoM_toolkit/mtk/types/wrapped_cv_mat.hpp b/include/IKFoM/IKFoM_toolkit/mtk/types/wrapped_cv_mat.hpp new file mode 100755 index 0000000..b6643f1 --- /dev/null +++ b/include/IKFoM/IKFoM_toolkit/mtk/types/wrapped_cv_mat.hpp @@ -0,0 +1,113 @@ +/* + * Copyright (c) 2010--2011, Universitaet Bremen and DFKI GmbH + * All rights reserved. + * + * Author: Rene Wagner + * Christoph Hertzberg + * + * 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 Universitaet Bremen nor the DFKI GmbH + * 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 OWNER 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. + */ + +#ifndef WRAPPED_CV_MAT_HPP_ +#define WRAPPED_CV_MAT_HPP_ + +#include +#include + +namespace MTK { + +template +struct cv_f_type; + +template<> +struct cv_f_type +{ + enum {value = CV_64F}; +}; + +template<> +struct cv_f_type +{ + enum {value = CV_32F}; +}; + +/** + * cv_mat wraps a CvMat around an Eigen Matrix + */ +template +class cv_mat : public matrix +{ + typedef matrix base_type; + enum {type_ = cv_f_type::value}; + CvMat cv_mat_; + +public: + cv_mat() + { + cv_mat_ = cvMat(rows, cols, type_, base_type::data()); + } + + cv_mat(const cv_mat& oth) : base_type(oth) + { + cv_mat_ = cvMat(rows, cols, type_, base_type::data()); + } + + template + cv_mat(const Eigen::MatrixBase &value) : base_type(value) + { + cv_mat_ = cvMat(rows, cols, type_, base_type::data()); + } + + template + cv_mat& operator=(const Eigen::MatrixBase &value) + { + base_type::operator=(value); + return *this; + } + + cv_mat& operator=(const cv_mat& value) + { + base_type::operator=(value); + return *this; + } + + // FIXME: Maybe overloading operator& is not a good idea ... + CvMat* operator&() + { + return &cv_mat_; + } + const CvMat* operator&() const + { + return &cv_mat_; + } +}; + +} // namespace MTK + +#endif /* WRAPPED_CV_MAT_HPP_ */ diff --git a/include/IKFoM/LICENSE b/include/IKFoM/LICENSE new file mode 100644 index 0000000..d159169 --- /dev/null +++ b/include/IKFoM/LICENSE @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/include/IKFoM/README.md b/include/IKFoM/README.md new file mode 100644 index 0000000..53a7dc5 --- /dev/null +++ b/include/IKFoM/README.md @@ -0,0 +1,489 @@ +## IKFoM +**IKFoM** (Iterated Kalman Filters on Manifolds) is a computationally efficient and convenient toolkit for deploying iterated Kalman filters on various robotic systems, especially systems operating on high-dimension manifold. It implements a manifold-embedding Kalman filter which separates the manifold structures from system descriptions and is able to be used by only defining the system in a canonical form and calling the respective steps accordingly. The current implementation supports the full iterated Kalman filtering for systems on manifold and any of its sub-manifolds, and it is extendable to other types of manifold when necessary. + + +**Developers** + +[Dongjiao He](https://github.com/Joanna-HE) + +**Our related video**: https://youtu.be/sz_ZlDkl6fA + +## 1. Prerequisites + +### 1.1. **Eigen && Boost** +Eigen >= 3.3.4, Follow [Eigen Installation](http://eigen.tuxfamily.org/index.php?title=Main_Page). + +Boost >= 1.65. + +## 2. Usage when the measurement is of constant dimension and type. +Clone the repository: + +``` + git clone https://github.com/hku-mars/IKFoM.git +``` + +1. include the necessary head file: +``` +#include +``` +2. Select and instantiate the primitive manifolds: +``` + typedef MTK::SO3 SO3; // scalar type of variable: double + typedef MTK::vect<3, double> vect3; // dimension of the defined Euclidean variable: 3 + typedef MTK::S2 S2; // length of the S2 variable: 98/10; choose e1 as the original point of rotation: 1 +``` +3. Build system state, input and measurement as compound manifolds which are composed of the primitive manifolds: +``` +MTK_BUILD_MANIFOLD(state, // name of compound manifold: state +((vect3, pos)) // ((primitive manifold type, name of variable)) +((vect3, vel)) +((SO3, rot)) +((vect3, bg)) +((vect3, ba)) +((S2, grav)) +((SO3, offset_R_L_I)) +((vect3, offset_T_L_I)) +); +``` +4. Implement the vector field that is defined as , and its differentiation , , where w=0 could be left out: +``` +Eigen::Matrix f(state &s, const input &i) { + Eigen::Matrix res = Eigen::Matrix::Zero(); + res(0) = s.vel[0]; + res(1) = s.vel[1]; + res(2) = s.vel[2]; + return res; +} +Eigen::Matrix df_dx(state &s, const input &i) //notice S2 has length of 3 and dimension of 2 { + Eigen::Matrix cov = Eigen::Matrix::Zero(); + cov.template block<3, 3>(0, 12) = Eigen::Matrix3d::Identity(); + return cov; +} +Eigen::Matrix df_dw(state &s, const input &i) { + Eigen::Matrix cov = Eigen::Matrix::Zero(); + cov.template block<3, 3>(12, 3) = -s.rot.toRotationMatrix(); + return cov; +} +``` +Those functions would be called during the ekf state predict + +5. Implement the output equation and its differentiation , : +``` +measurement h(state &s, bool &valid) // the iteration stops before convergence whenever the user set valid as false +{ + if (condition){ valid = false; + } // other conditions could be used to stop the ekf update iteration before convergence, otherwise the iteration will not stop until the condition of convergence is satisfied. + measurement h_; + h_.position = s.pos; + return h_; +} +Eigen::Matrix dh_dx(state &s) {} +Eigen::Matrix dh_dv(state &s) {} +``` +Those functions would be called during the ekf state update + +6. Instantiate an **esekf** object **kf** and initialize it with initial or default state and covariance. + +(1) initial state and covariance: +``` +state init_state; +esekfom::esekf::cov init_P; +esekfom::esekf kf(init_state,init_P); +``` +(2) default state and covariance: +``` +esekfom::esekf kf; +``` +where **process_noise_dof** is the dimension of process noise, with the type of std int, and so for **measurement_noise_dof**. + +7. Deliver the defined models, std int maximum iteration numbers **Maximum_iter**, and the std array for testing convergence **epsi** into the **esekf** object: +``` +double epsi[state_dof] = {0.001}; +fill(epsi, epsi+state_dof, 0.001); // if the absolute of innovation of ekf update is smaller than epso, the update iteration is converged +kf.init(f, df_dx, df_dw, h, dh_dx, dh_dv, Maximum_iter, epsi); +``` +8. In the running time, once an input **in** is received with time interval **dt**, a propagation is executed: +``` +kf.predict(dt, Q, in); // process noise covariance: Q, an Eigen matrix +``` +9. Once a measurement **z** is received, an iterated update is executed: +``` +kf.update_iterated(z, R); // measurement noise covariance: R, an Eigen matrix +``` +*Remarks(1):* +- We also combine the output equation and its differentiation into an union function, whose usage is the same as the above steps 1-4, and steps 5-9 are shown as follows. + +5. Implement the output equation and its differentiation , : +``` +measurement h_share(state &s, esekfom::share_datastruct &share_data) +{ + if(share_data.converge) {} // this value is true means iteration is converged + if(condition) share_data.valid = false; // the iteration stops before convergence when this value is false if other conditions are satified + share_data.h_x = H_x; // H_x is the result matrix of the first differentiation + share_data.h_v = H_v; // H_v is the result matrix of the second differentiation + share_data.R = R; // R is the measurement noise covariance + share_data.z = z; // z is the obtained measurement + + measurement h_; + h_.position = s.pos; + return h_; +} +``` +This function would be called during ekf state update, and the output function and its derivatives, the measurement and the measurement noise would be obtained from this one union function + +6. Instantiate an **esekf** object **kf** and initialize it with initial or default state and covariance. + +(1) initial state and covariance: +``` +state init_state; +esekfom::esekf::cov init_P; +esekfom::esekf kf(init_state,init_P); +``` +(2) default state and covariance: +``` +esekfom::esekf kf; +``` +7. Deliver the defined models, std int maximum iteration numbers **Maximum_iter**, and the std array for testing convergence **epsi** into the **esekf** object: +``` +double epsi[state_dof] = {0.001}; +fill(epsi, epsi+state_dof, 0.001); // if the absolute of innovation of ekf update is smaller than epso, the update iteration is converged +kf.init_share(f, df_dx, df_dw, h_share, Maximum_iter, epsi); +``` +8. In the running time, once an input **in** is received with time interval **dt**, a propagation is executed: +``` +kf.predict(dt, Q, in); // process noise covariance: Q +``` +9. Once a measurement **z** is received, an iterated update is executed: +``` +kf.update_iterated_share(); +``` + +*Remarks(2):* +- The value of the state **x** and the covariance **P** are able to be changed by functions **change_x()** and **change_P()**: +``` +state set_x; +kf.change_x(set_x); +esekfom::esekf::cov set_P; +kf.change_P(set_P); +``` + +## 3. Usage when the measurement is an Eigen vector of changing dimension. + +Clone the repository: + +``` + git clone https://github.com/hku-mars/IKFoM.git +``` + +1. include the necessary head file: +``` +#include +``` +2. Select and instantiate the primitive manifolds: +``` + typedef MTK::SO3 SO3; // scalar type of variable: double + typedef MTK::vect<3, double> vect3; // dimension of the defined Euclidean variable: 3 + typedef MTK::S2 S2; // length of the S2 variable: 98/10; choose e1 as the original point of rotation: 1 +``` +3. Build system state and input as compound manifolds which are composed of the primitive manifolds: +``` +MTK_BUILD_MANIFOLD(state, // name of compound manifold: state +((vect3, pos)) // ((primitive manifold type, name of variable)) +((vect3, vel)) +((SO3, rot)) +((vect3, bg)) +((vect3, ba)) +((S2, grav)) +((SO3, offset_R_L_I)) +((vect3, offset_T_L_I)) +); +``` +4. Implement the vector field that is defined as , and its differentiation , , where w=0 could be left out: +``` +Eigen::Matrix f(state &s, const input &i) { + Eigen::Matrix res = Eigen::Matrix::Zero(); + res(0) = s.vel[0]; + res(1) = s.vel[1]; + res(2) = s.vel[2]; + return res; +} +Eigen::Matrix df_dx(state &s, const input &i) //notice S2 has length of 3 and dimension of 2 { + Eigen::Matrix cov = Eigen::Matrix::Zero(); + cov.template block<3, 3>(0, 12) = Eigen::Matrix3d::Identity(); + return cov; +} +Eigen::Matrix df_dw(state &s, const input &i) { + Eigen::Matrix cov = Eigen::Matrix::Zero(); + cov.template block<3, 3>(12, 3) = -s.rot.toRotationMatrix(); + return cov; +} +``` +Those functions would be called during ekf state predict + +5. Implement the output equation and its differentiation , : +``` +Eigen::Matrix h(state &s, bool &valid) //the iteration stops before convergence when valid is false { + if (condition){ valid = false; + } // other conditions could be used to stop the ekf update iteration before convergence, otherwise the iteration will not stop until the condition of convergence is satisfied. + Eigen::Matrix h_; + h_(0) = s.pos[0]; + return h_; +} +Eigen::Matrix dh_dx(state &s) {} +Eigen::Matrix dh_dv(state &s) {} +``` +Those functions would be called during ekf state update + +6. Instantiate an **esekf** object **kf** and initialize it with initial or default state and covariance. + +(1) initial state and covariance: +``` +state init_state; +esekfom::esekf::cov init_P; +esekfom::esekf kf(init_state,init_P); +``` +(2) default state and covariance: +``` +esekfom::esekf kf; +``` +where **process_noise_dof** is the dimension of process noise, with the type of std int, and so for **measurement_noise_dof** + +7. Deliver the defined models, std int maximum iteration numbers **Maximum_iter**, and the std array for testing convergence **epsi** into the **esekf** object: +``` +double epsi[state_dof] = {0.001}; +fill(epsi, epsi+state_dof, 0.001); // if the absolute of innovation of ekf update is smaller than epso, the update iteration is converged +kf.init_dyn(f, df_dx, df_dw, h, dh_dx, dh_dv, Maximum_iter, epsi); +``` +8. In the running time, once an input **in** is received with time interval **dt**, a propagation is executed: +``` +kf.predict(dt, Q, in); // process noise covariance: Q, an Eigen matrix +``` +9. Once a measurement **z** is received, an iterated update is executed: +``` +kf.update_iterated_dyn(z, R); // measurement noise covariance: R, an Eigen matrix +``` +*Remarks(1):* +- We also combine the output equation and its differentiation into an union function, whose usage is the same as the above steps 1-4, and steps 5-9 are shown as follows. +5. Implement the output equation and its differentiation , : +``` +Eigen::Matrix h_dyn_share(state &s, esekfom::dyn_share_datastruct &dyn_share_data) +{ + if(dyn_share_data.converge) {} // this value is true means iteration is converged + if(condition) share_data.valid = false; // the iteration stops before convergence when this value is false if other conditions are satified + dyn_share_data.h_x = H_x; // H_x is the result matrix of the first differentiation + dyn_share_data.h_v = H_v; // H_v is the result matrix of the second differentiation + dyn_share_data.R = R; // R is the measurement noise covariance + dyn_share_data.z = z; // z is the obtained measurement + + Eigen::Matrix h_; + h_(0) = s.pos[0]; + return h_; +} +This function would be called during ekf state update, and the output function and its derivatives, the measurement and the measurement noise would be obtained from this one union function +``` +6. Instantiate an **esekf** object **kf** and initialize it with initial or default state and covariance. +(1) initial state and covariance: +``` +state init_state; +esekfom::esekf::cov init_P; +esekfom::esekf kf(init_state,init_P); +``` +(2) default state and covariance: +``` +esekfom::esekf kf; +``` +7. Deliver the defined models, std int maximum iteration numbers **Maximum_iter**, and the std array for testing convergence **epsi** into the **esekf** object: +``` +double epsi[state_dof] = {0.001}; +fill(epsi, epsi+state_dof, 0.001); // if the absolute of innovation of ekf update is smaller than epso, the update iteration is converged +kf.init_dyn_share(f, df_dx, df_dw, h_dyn_share, Maximum_iter, epsi); +``` +8. In the running time, once an input **in** is received with time interval **dt**, a propagation is executed: +``` +kf.predict(dt, Q, in); // process noise covariance: Q, an Eigen matrix +``` +9. Once a measurement **z** is received, an iterated update is executed: +``` +kf.update_iterated_dyn_share(); +``` + +*Remarks(2):* +- The value of the state **x** and the covariance **P** are able to be changed by functions **change_x()** and **change_P()**: +``` +state set_x; +kf.change_x(set_x); +esekfom::esekf::cov set_P; +kf.change_P(set_P); +``` + +## 4. Usage when the measurement is a changing manifold during the run time. + +Clone the repository: + +``` + git clone https://github.com/hku-mars/IKFoM.git +``` + +1. include the necessary head file: +``` +#include +``` +2. Select and instantiate the primitive manifolds: +``` + typedef MTK::SO3 SO3; // scalar type of variable: double + typedef MTK::vect<3, double> vect3; // dimension of the defined Euclidean variable: 3 + typedef MTK::S2 S2; // length of the S2 variable: 98/10; choose e1 as the original point of rotation: 1 +``` +3. Build system state and input as compound manifolds which are composed of the primitive manifolds: +``` +MTK_BUILD_MANIFOLD(state, // name of compound manifold: state +((vect3, pos)) // ((primitive manifold type, name of variable)) +((vect3, vel)) +((SO3, rot)) +((vect3, bg)) +((vect3, ba)) +((S2, grav)) +((SO3, offset_R_L_I)) +((vect3, offset_T_L_I)) +); +``` +4. Implement the vector field that is defined as , and its differentiation , , where w=0 could be left out: +``` +Eigen::Matrix f(state &s, const input &i) { + Eigen::Matrix res = Eigen::Matrix::Zero(); + res(0) = s.vel[0]; + res(1) = s.vel[1]; + res(2) = s.vel[2]; + return res; +} +Eigen::Matrix df_dx(state &s, const input &i) //notice S2 has length of 3 and dimension of 2 { + Eigen::Matrix cov = Eigen::Matrix::Zero(); + cov.template block<3, 3>(0, 12) = Eigen::Matrix3d::Identity(); + return cov; +} +Eigen::Matrix df_dw(state &s, const input &i) { + Eigen::Matrix cov = Eigen::Matrix::Zero(); + cov.template block<3, 3>(12, 3) = -s.rot.toRotationMatrix(); + return cov; +} +``` +Those functions would be called during ekf state predict + +5. Implement the differentiation of the output equation , : +``` +Eigen::Matrix dh_dx(state &s, bool &valid) {} //the iteration stops before convergence when valid is false +Eigen::Matrix dh_dv(state &s, bool &valid) {} +``` +Those functions would be called during ekf state update + +6. Instantiate an **esekf** object **kf** and initialize it with initial or default state and covariance. + +(1) initial state and covariance: +``` +state init_state; +esekfom::esekf::cov init_P; +esekfom::esekf kf(init_state,init_P); +``` +(2) +``` +esekfom::esekf kf; +``` +Where **process_noise_dof** is the dimension of process noise, of type of std int + +7. Deliver the defined models, std int maximum iteration numbers **Maximum_iter**, and the std array for testing convergence **epsi** into the **esekf** object: +``` +double epsi[state_dof] = {0.001}; +fill(epsi, epsi+state_dof, 0.001); // if the absolute of innovation of ekf update is smaller than epso, the update iteration is converged +kf.init_dyn_runtime(f, df_dx, df_dw, dh_dx, dh_dv, Maximum_iter, epsi); +``` +8. In the running time, once an input **in** is received with time interval **dt**, a propagation is executed: +``` +kf.predict(dt, Q, in); // process noise covariance: Q +``` +9. Once a measurement **z** is received, build system measurement as compound manifolds following step 3 and implement the output equation : +``` +measurement h(state &s, bool &valid) //the iteration stops before convergence when valid is false +{ + if (condition) valid = false; // the update iteration could be stopped when the condition other than convergence is satisfied + measurement h_; + h_.pos = s.pos; + return h_; +} +``` +then an iterated update is executed: +``` +kf.update_iterated_dyn_runtime(z, R, h); // measurement noise covariance: R, an Eigen matrix +``` +*Remarks(1):* +- We also combine the output equation and its differentiation into an union function, whose usage is the same as the above steps 1-4, and steps 5-9 are shown as follows. +5. Instantiate an **esekf** object **kf** and initialize it with initial or default state and covariance. + +(1) initial state and covariance: +``` +state init_state; +esekfom::esekf::cov init_P; +esekfom::esekf kf(init_state,init_P); +``` +(2) default state and covariance: +``` +esekfom::esekf kf; +``` +6. Deliver the defined models, std int maximum iteration numbers **Maximum_iter**, and the std array for testing convergence **epsi** into the **esekf** object: +``` +double epsi[state_dof] = {0.001}; +fill(epsi, epsi+state_dof, 0.001); // if the absolute of innovation of ekf update is smaller than epso, the update iteration is converged +kf.init_dyn_runtime_share(f, df_dx, df_dw, Maximum_iter, epsi); +``` +7. In the running time, once an input **in** is received with time interval **dt**, a propagation is executed: +``` +kf.predict(dt, Q, in); // process noise covariance: Q. an Eigen matrix +``` +8. Once a measurement **z** is received, build system measurement as compound manifolds following step 3 and implement the output equation and its differentiation , : +``` +measurement h_dyn_runtime_share(state &s, esekfom::dyn_runtime_share_datastruct &dyn_runtime_share_data) +{ + if(dyn_runtime_share_data.converge) {} // this value is true means iteration is converged + if(condition) dyn_runtime_share_data.valid = false; // the iteration stops before convergence when this value is false, if conditions other than convergence is satisfied + dyn_runtime_share_data.h_x = H_x; // H_x is the result matrix of the first differentiation + dyn_runtime_share_data.h_v = H_v; // H_v is the result matrix of the second differentiation + dyn_runtime_share_data.R = R; // R is the measurement noise covariance + + measurement h_; + h_.pos = s.pos; + return h_; +} +``` +This function would be called during ekf state update, and the output function and its derivatives, the measurement and the measurement noise would be obtained from this one union function + +then an iterated update is executed: +``` +kf.update_iterated_dyn_runtime_share(z, h_dyn_runtime_share); +``` + +*Remarks(2):* +- The value of the state **x** and the covariance **P** are able to be changed by functions **change_x()** and **change_P()**: +``` +state set_x; +kf.change_x(set_x); +esekfom::esekf::cov set_P; +kf.change_P(set_P); +``` + +## 5. Run the sample +Clone the repository: + +``` + git clone https://github.com/hku-mars/IKFoM.git +``` +In the **Samples** file folder, there is the scource code that applys the **IKFoM** on the original source code from [FAST LIO](https://github.com/hku-mars/FAST_LIO). Please follow the README.md shown in that repository excepting the step **2. Build**, which is modified as: +``` +cd ~/catkin_ws/src +cp -r ~/IKFoM/Samples/FAST_LIO-stable FAST_LIO-stable +cd .. +catkin_make +source devel/setup.bash +``` + +## 6.Acknowledgments +Thanks for C. Hertzberg, R. Wagner, U. Frese, and L. Schroder. Integratinggeneric sensor fusion algorithms with sound state representationsthrough encapsulation of manifolds. + diff --git a/include/common_lib.h b/include/common_lib.h new file mode 100755 index 0000000..c323859 --- /dev/null +++ b/include/common_lib.h @@ -0,0 +1,239 @@ +#ifndef COMMON_LIB_H +#define COMMON_LIB_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include <../include/IKFoM/IKFoM_toolkit/esekfom/esekfom.hpp> +#include + +using namespace std; +using namespace Eigen; + + +typedef MTK::vect<3, double> vect3; +typedef MTK::SO3 SO3; +typedef MTK::S2 S2; +typedef MTK::vect<1, double> vect1; +typedef MTK::vect<2, double> vect2; + +MTK_BUILD_MANIFOLD(state_input, +((vect3, pos)) +((SO3, rot)) +((SO3, offset_R_L_I)) +((vect3, offset_T_L_I)) +((vect3, vel)) +((vect3, bg)) +((vect3, ba)) +((vect3, gravity)) +); + +MTK_BUILD_MANIFOLD(state_output, +((vect3, pos)) +((SO3, rot)) +((SO3, offset_R_L_I)) +((vect3, offset_T_L_I)) +((vect3, vel)) +((vect3, omg)) +((vect3, acc)) +((vect3, gravity)) +((vect3, bg)) +((vect3, ba)) +); + +MTK_BUILD_MANIFOLD(input_ikfom, +((vect3, acc)) +((vect3, gyro)) +); + +MTK_BUILD_MANIFOLD(process_noise_input, +((vect3, ng)) +((vect3, na)) +((vect3, nbg)) +((vect3, nba)) +); + +MTK_BUILD_MANIFOLD(process_noise_output, +((vect3, vel)) +((vect3, ng)) +((vect3, na)) +((vect3, nbg)) +((vect3, nba)) +); + +extern esekfom::esekf kf_input; +extern esekfom::esekf kf_output; + +#define PBWIDTH 30 +#define PBSTR "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||" + +#define PI_M (3.14159265358) +#define G_m_s2 (9.81) // Gravaty const in GuangDong/China +#define DIM_STATE (24) // Dimension of states (Let Dim(SO(3)) = 3) +#define DIM_PROC_N (12) // Dimension of process noise (Let Dim(SO(3)) = 3) +#define CUBE_LEN (6.0) +#define LIDAR_SP_LEN (2) +#define INIT_COV (0.0001) +#define NUM_MATCH_POINTS (5) +#define MAX_MEAS_DIM (10000) + +#define VEC_FROM_ARRAY(v) v[0],v[1],v[2] +#define VEC_FROM_ARRAY_SIX(v) v[0],v[1],v[2],v[3],v[4],v[5] +#define MAT_FROM_ARRAY(v) v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7],v[8] +#define CONSTRAIN(v,min,max) ((v>min)?((v (mat.data(), mat.data() + mat.rows() * mat.cols()) +#define DEBUG_FILE_DIR(name) (string(string(ROOT_DIR) + "Log/"+ name)) + +typedef pcl::PointXYZINormal PointType; +typedef pcl::PointXYZRGB PointTypeRGB; +typedef pcl::PointCloud PointCloudXYZI; +typedef pcl::PointCloud PointCloudXYZRGB; +typedef vector> PointVector; +typedef Vector3d V3D; +typedef Matrix3d M3D; +typedef Vector3f V3F; +typedef Matrix3f M3F; + +#define MD(a,b) Matrix +#define VD(a) Matrix +#define MF(a,b) Matrix +#define VF(a) Matrix + +const M3D Eye3d(M3D::Identity()); +const M3F Eye3f(M3F::Identity()); +const V3D Zero3d(0, 0, 0); +const V3F Zero3f(0, 0, 0); + +struct MeasureGroup // Lidar data and imu dates for the curent process +{ + MeasureGroup() + { + lidar_beg_time = 0.0; + lidar_last_time = 0.0; + this->lidar.reset(new PointCloudXYZI()); + }; + double lidar_beg_time; + double lidar_last_time; + PointCloudXYZI::Ptr lidar; + deque imu; +}; + +template +T calc_dist(PointType p1, PointType p2){ + T d = (p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y) + (p1.z - p2.z) * (p1.z - p2.z); + return d; +} + +template +T calc_dist(Eigen::Vector3d p1, PointType p2){ + T d = (p1(0) - p2.x) * (p1(0) - p2.x) + (p1(1) - p2.y) * (p1(1) - p2.y) + (p1(2) - p2.z) * (p1(2) - p2.z); + return d; +} + +template +std::vector time_compressing(const PointCloudXYZI::Ptr &point_cloud) +{ + int points_size = point_cloud->points.size(); + int j = 0; + std::vector time_seq; + // time_seq.clear(); + time_seq.reserve(points_size); + for(int i = 0; i < points_size - 1; i++) + { + j++; + if (point_cloud->points[i+1].curvature > point_cloud->points[i].curvature) + { + time_seq.emplace_back(j); + j = 0; + } + } +// if (j == 0) +// { +// time_seq.emplace_back(1); +// } +// else + { + time_seq.emplace_back(j+1); + } + return time_seq; +} + +/* comment +plane equation: Ax + By + Cz + D = 0 +convert to: A/D*x + B/D*y + C/D*z = -1 +solve: A0*x0 = b0 +where A0_i = [x_i, y_i, z_i], x0 = [A/D, B/D, C/D]^T, b0 = [-1, ..., -1]^T +normvec: normalized x0 +*/ +template +bool esti_normvector(Matrix &normvec, const PointVector &point, const T &threshold, const int &point_num) +{ + MatrixXf A(point_num, 3); + MatrixXf b(point_num, 1); + b.setOnes(); + b *= -1.0f; + + for (int j = 0; j < point_num; j++) + { + A(j,0) = point[j].x; + A(j,1) = point[j].y; + A(j,2) = point[j].z; + } + normvec = A.colPivHouseholderQr().solve(b); + + for (int j = 0; j < point_num; j++) + { + if (fabs(normvec(0) * point[j].x + normvec(1) * point[j].y + normvec(2) * point[j].z + 1.0f) > threshold) + { + return false; + } + } + + normvec.normalize(); + return true; +} + +template +bool esti_plane(Matrix &pca_result, const PointVector &point, const T &threshold) +{ + Matrix A; + Matrix b; + A.setZero(); + b.setOnes(); + b *= -1.0f; + + for (int j = 0; j < NUM_MATCH_POINTS; j++) + { + A(j,0) = point[j].x; + A(j,1) = point[j].y; + A(j,2) = point[j].z; + } + + Matrix normvec = A.colPivHouseholderQr().solve(b); + + T n = normvec.norm(); + pca_result(0) = normvec(0) / n; + pca_result(1) = normvec(1) / n; + pca_result(2) = normvec(2) / n; + pca_result(3) = 1.0 / n; + + for (int j = 0; j < NUM_MATCH_POINTS; j++) + { + if (fabs(pca_result(0) * point[j].x + pca_result(1) * point[j].y + pca_result(2) * point[j].z + pca_result(3)) > threshold) + { + return false; + } + } + return true; +} +// const bool time_list(PointType &x, PointType &y); // {return (x.curvature < y.curvature);}; +// template +// const bool time_list(PointType &x, PointType &y) {return (x.curvature < y.curvature);}; + +#endif \ No newline at end of file diff --git a/include/ivox/eigen_types.h b/include/ivox/eigen_types.h new file mode 100644 index 0000000..51aa389 --- /dev/null +++ b/include/ivox/eigen_types.h @@ -0,0 +1,84 @@ +// +// Created by xiang on 2021/7/16. +// + +#ifndef FASTER_LIO_EIGEN_TYPES_H +#define FASTER_LIO_EIGEN_TYPES_H + +#include +#include +#include + +/// alias for eigen +using Vec2i = Eigen::Vector2i; +using Vec3i = Eigen::Vector3i; + +using Vec2d = Eigen::Vector2d; +using Vec2f = Eigen::Vector2f; +using Vec3d = Eigen::Vector3d; +using Vec3f = Eigen::Vector3f; +using Vec5d = Eigen::Matrix; +using Vec5f = Eigen::Matrix; +using Vec6d = Eigen::Matrix; +using Vec6f = Eigen::Matrix; +using Vec15d = Eigen::Matrix; + +using Mat1d = Eigen::Matrix; +using Mat3d = Eigen::Matrix3d; +using Mat3f = Eigen::Matrix3f; +using Mat4d = Eigen::Matrix4d; +using Mat4f = Eigen::Matrix4f; +using Mat5d = Eigen::Matrix; +using Mat5f = Eigen::Matrix; +using Mat6d = Eigen::Matrix; +using Mat6f = Eigen::Matrix; +using Mat15d = Eigen::Matrix; + +using Quatd = Eigen::Quaterniond; +using Quatf = Eigen::Quaternionf; + +namespace faster_lio { + +/// less of vector +template +struct less_vec { + inline bool operator()(const Eigen::Matrix& v1, const Eigen::Matrix& v2) const; +}; + +/// hash of vector +template +struct hash_vec { + inline size_t operator()(const Eigen::Matrix& v) const; +}; + +/// implementation +template <> +inline bool less_vec<2>::operator()(const Eigen::Matrix& v1, const Eigen::Matrix& v2) const { + return v1[0] < v2[0] || (v1[0] == v2[0] && v1[1] < v2[1]); +} + +template <> +inline bool less_vec<3>::operator()(const Eigen::Matrix& v1, const Eigen::Matrix& v2) const { + return v1[0] < v2[0] || (v1[0] == v2[0] && v1[1] < v2[1]) && (v1[0] == v2[0] && v1[1] == v2[1] && v1[2] < v2[2]); +} + +/// vec 2 hash +/// @see Optimized Spatial Hashing for Collision Detection of Deformable Objects, Matthias Teschner et. al., VMV 2003 +template <> +inline size_t hash_vec<2>::operator()(const Eigen::Matrix& v) const { + return size_t(((v[0]) * 73856093) ^ ((v[1]) * 471943)) % 10000000; +} + +/// vec 3 hash +template <> +inline size_t hash_vec<3>::operator()(const Eigen::Matrix& v) const { + return size_t(((v[0]) * 73856093) ^ ((v[1]) * 471943) ^ ((v[2]) * 83492791)) % 10000000; +} + +// constexpr auto less_vec2i = [](const Vec2i& v1, const Vec2i& v2) { +// return v1[0] < v2[0] || (v1[0] == v2[0] && v1[1] < v2[1]); +// }; + +} // namespace faster_lio + +#endif diff --git a/include/ivox/hilbert.hpp b/include/ivox/hilbert.hpp new file mode 100644 index 0000000..f785965 --- /dev/null +++ b/include/ivox/hilbert.hpp @@ -0,0 +1,830 @@ +// 2021-09-18, https://github.com/spectral3d/hilbert_hpp is under MIT license. + +//Copyright (c) 2019 David Beynon +// +//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. + +#ifndef INCLUDED_HILBERT_HPP +#define INCLUDED_HILBERT_HPP +#pragma once + +#include +#include +#include +#include +#include + +// Version 1.1 - 29 August 2019 + +// +// N dimensional hilbert curve encoding & decoding based on the paper +// "Programming the Hilbert Curve" by John Skilling. +// +// The interface assumes an std::array of some unsigned integer type. This +// contains an index in lexographic order, or a set of coordinates on the +// hilbert curve. +// +// Two implementations are included. +// +// hilbert::v1 contains a fairly straightforward implementation of the paper, +// with standard looping constructs. +// +// hilbert::v2 performs uses template metaprogramming to unroll loops and +// theoretically improve performance on some systems. +// +// v1 produces smaller code, which may be more performant on machines with +// small caches. v2 produces relatively large code that seems more efficient +// on modern systems for dimension up to about 100. +// +// v2 should be built with -O3 for best results. -O0 is extremely slow +// on most systems. +// + + +// Interface is as follows: +// +// Find the position of a point on an N dimensional Hilbert Curve. +// +// Based on the paper "Programming the Hilbert Curve" by John Skilling. +// +// Index is encoded with most significant objects first. Lexographic +// sort order. +//template +//std::array +//IndexToPosition(std::array const &in); + +// Find the index of a point on an N dimensional Hilbert Curve. +// +// Based on the paper "Programming the Hilbert Curve" by John Skilling. +// +// Index is encoded with most significant objects first. Lexographic +// sort order. +//template +//std::array +//PositionToIndex(std::array const &in); +// + + +namespace hilbert +{ + // Fairly straightforward implementation. Loops are loops and code mostly + // does what one would expect. + namespace v1 + { + namespace internal + { + // Extract bits from transposed form. + // + // e.g. + // + // a d g j a b c d + // b e h k -> e f g h + // c f i l i j k l + // + template + std::array + UntransposeBits(std::array const &in) + { + const size_t bits = std::numeric_limits::digits; + const T high_bit(T(1) << (bits - 1)); + const size_t bit_count(bits * N); + + std::array out; + + std::fill(out.begin(), out.end(), 0); + + // go through all bits in input, msb first. Shift distances are + // from msb. + for(size_t b=0;b> dst_bit); + } + + return out; + } + + // Pack bits into transposed form. + // + // e.g. + // + // a b c d a d g j + // e f g h -> b e h k + // i j k l c f i l + // + template + std::array + TransposeBits(std::array const &in) + { + const size_t bits = std::numeric_limits::digits; + const T high_bit(T(1) << (bits - 1)); + const size_t bit_count(bits * N); + + std::array out; + + std::fill(out.begin(), out.end(), 0); + + // go through all bits in input, msb first. Shift distances + // are from msb. + for(size_t b=0;b> dst_bit); + } + + return out; + } + } + + // + // Public interfaces. + // + + // Find the position of a point on an N dimensional Hilbert Curve. + // + // Based on the paper "Programming the Hilbert Curve" by John Skilling. + // + // Index is encoded with most significant objects first. Lexographic + // sort order. + template + std::array + IndexToPosition( + std::array const &in) + { + // First convert index to transpose. + std::array out(internal::TransposeBits(in)); + + // Initial gray encoding of transposed vector. + { + T tmp = out[N-1] >> 1; + + for(size_t n=N-1;n;n--) + { + out[n]^= out[n-1]; + } + + out[0]^= tmp; + } + + // Apply transforms to gray code. + { + T cur_bit(2), + low_bits; + + while(cur_bit) + { + low_bits = cur_bit - 1; + + size_t n(N); + + do + { + n--; + if(out[n] & cur_bit) + { + // flip low bits of X + out[0]^= low_bits; + } + else + { + // swap low bits with X + T t((out[n] ^ out[0]) & low_bits); + out[n]^= t; + out[0]^= t; + } + } + while(n); + + cur_bit<<= 1; + } + } + + return out; + } + + // Find the index of a point on an N dimensional Hilbert Curve. + // + // Based on the paper "Programming the Hilbert Curve" by John Skilling. + // + // Index is encoded with most significant objects first. Lexographic + // sort order. + template + std::array + PositionToIndex(std::array const &in) + { + const size_t bits = std::numeric_limits::digits; + + std::array out(in); + + // reverse transforms to convert into transposed gray code. + { + T cur_bit(T(1) << (bits - 1)), + low_bits; + + do + { + low_bits = cur_bit - 1; + + for(size_t n=0;n>= 1; + } while(low_bits > 1); + } + + // Remove gray code from transposed vector. + { + T cur_bit(T(1) << (bits - 1)), + t(0); + + for(size_t n=1;n>= 1; + } while(cur_bit > 1); + + for(auto &v : out) + { + v^= t; + } + } + + return internal::UntransposeBits(out); + } + } // namespace v1 + + // Implementation using metaprogramming to unroll most loops. + // Optimised performance should be superior to v1 provided all code remains + // in cache etc. + // + // At some value of N v1 should overtake v2. + namespace v2 + { + namespace internal + { + // Metaprogramming guts. Unrolled loops, abandon all hope etc. + namespace tmp + { + template + T + TransposeBits2( + std::array const &, + std::integral_constant, + std::integral_constant) + { + return T(0); + } + + template + T + TransposeBits2( + std::array const &in, + std::integral_constant, + std::integral_constant) + { + const size_t size = std::numeric_limits::digits; + const size_t src = ((D + ((size - B) * N)) / size); + const size_t src_bit = + size - (1+((D + ((size - B) * N)) % size)); + const T src_bit_val = T(1) << src_bit; + const size_t dst_bit = (B - 1); + const T dst_bit_val = T(1) << dst_bit; + + // Multiply rather than shift to avoid clang implicit + // conversion warning. + T bit = ((in[src] & src_bit_val) >> src_bit) * dst_bit_val; + + return bit + TransposeBits2( + in, + std::integral_constant(), + std::integral_constant()); + } + + template + void + TransposeBits( + std::array const &, + std::array &, + std::integral_constant) + { + } + + template + void + TransposeBits( + std::array const &in, + std::array &out, + std::integral_constant) + { + out[D-1] = TransposeBits2( + in, + std::integral_constant(), + std::integral_constant< + size_t, + std::numeric_limits::digits>()); + + TransposeBits( + in, + out, + std::integral_constant()); + } + + + template + T + UntransposeBits2( + std::array const &, + std::integral_constant, + std::integral_constant) + { + return T(0); + } + + template + T + UntransposeBits2( + std::array const &in, + std::integral_constant, + std::integral_constant) + { + const size_t size = std::numeric_limits::digits; + const size_t src = ((D * size) + (size - B)) % N; + const size_t src_bit = + size - (((((D * size) + (size - B))) / N) + 1); + const T src_bit_val = T(1) << src_bit; + const size_t dst_bit(B - 1); + const T dst_bit_val = T(1) << dst_bit; + + // Multiply rather than shift to avoid clang implicit + // conversion warning. + T bit = ((in[src] & src_bit_val) >> src_bit) * dst_bit_val; + + return bit + UntransposeBits2( + in, + std::integral_constant(), + std::integral_constant()); + } + + template + void + UntransposeBits( + std::array const &, + std::array &, + std::integral_constant) + { + } + + template + void + UntransposeBits( + std::array const &in, + std::array &out, + std::integral_constant) + { + out[D-1] = UntransposeBits2( + in, + std::integral_constant(), + std::integral_constant< + size_t, + std::numeric_limits::digits>()); + + UntransposeBits( + in, + out, + std::integral_constant()); + } + + template + void + ApplyGrayCode1( + std::array const &in, + std::array &out, + std::integral_constant) + { + out[0]^= in[N-1] >> 1; + } + + template + void + ApplyGrayCode1( + std::array const &in, + std::array &out, + std::integral_constant) + { + out[I]^= out[I-1]; + + ApplyGrayCode1( + in, + out, + std::integral_constant()); + } + + // Remove a gray code from a transposed vector + template + void + RemoveGrayCode1( + std::array &, + std::integral_constant) + { + } + + // xor array values with previous values. + template + void + RemoveGrayCode1( + std::array &in, + std::integral_constant) + { + const size_t src_idx = N - (D + 1); + const size_t dst_idx = N - D; + + in[dst_idx]^= in[src_idx]; + + RemoveGrayCode1(in, std::integral_constant()); + } + + template + T RemoveGrayCode2(T, std::integral_constant) + { + return T(0); + } + + template + T RemoveGrayCode2(T v, std::integral_constant) + { + const T cur_bit(T(1) << (B-1)); + const T low_bits(cur_bit - 1); + + if(v & cur_bit) + { + return low_bits ^ RemoveGrayCode2( + v, + std::integral_constant()); + } + else + { + return RemoveGrayCode2( + v, + std::integral_constant()); + } + } + + template + void + GrayToHilbert2( + std::array &, + std::integral_constant, + std::integral_constant) + { + } + + template + void + GrayToHilbert2( + std::array &out, + std::integral_constant, + std::integral_constant) + { + const size_t n(I-1); + const T cur_bit(T(1) << (std::numeric_limits::digits - B)); + const T low_bits(cur_bit - 1); + + if(out[n] & cur_bit) + { + // flip low bits of X + out[0]^= low_bits; + } + else + { + // swap low bits with X + T t((out[n] ^ out[0]) & low_bits); + out[n]^= t; + out[0]^= t; + } + + GrayToHilbert2( + out, + std::integral_constant(), + std::integral_constant()); + } + + template + void + GrayToHilbert( + std::array &, + std::integral_constant) + { + } + + template + void + GrayToHilbert( + std::array &out, + std::integral_constant) + { + GrayToHilbert2( + out, + std::integral_constant(), + std::integral_constant()); + + GrayToHilbert(out, std::integral_constant()); + } + + template + void + HilbertToGray2( + std::array &, + std::integral_constant, + std::integral_constant) + { + } + + template + void + HilbertToGray2( + std::array &out, + std::integral_constant, + std::integral_constant) + { + const size_t cur_bit(T(1) << B); + const size_t low_bits(cur_bit-1); + const size_t n(N-I); + + if(out[n] & cur_bit) + { + // flip low bits of X + out[0]^= low_bits; + } + else + { + // swap low bits with X + T t((out[n] ^ out[0]) & low_bits); + out[n]^= t; + out[0]^= t; + } + + HilbertToGray2( + out, + std::integral_constant(), + std::integral_constant()); + } + + template + void + HilbertToGray( + std::array &, + std::integral_constant) + { + } + + template + void + HilbertToGray( + std::array &out, + std::integral_constant) + { + HilbertToGray2( + out, + std::integral_constant(), + std::integral_constant()); + + HilbertToGray(out, std::integral_constant()); + } + + template + void + ApplyMaskToArray( + std::array &, + T, + std::integral_constant) + { + } + + template + void + ApplyMaskToArray( + std::array &a, + T mask, std::integral_constant) + { + a[I-1]^= mask; + + ApplyMaskToArray( + a, + mask, + std::integral_constant()); + } + } // namespace tmp + + + // Pack bits into transposed form. + // + // e.g. + // + // a b c d a d g j + // e f g h -> b e h k + // i j k l c f i l + // + template + std::array + TransposeBits(std::array const &in) + { + std::array out; + + std::fill(out.begin(), out.end(), 0); + + tmp::TransposeBits( + in, + out, + std::integral_constant()); + + return out; + } + + // Extract bits from transposed form. + // e.g. + // + // a d g j a b c d + // b e h k -> e f g h + // c f i l i j k l + // + template + std::array + UntransposeBits(std::array const &in) + { + std::array out; + + std::fill(out.begin(), out.end(), 0); + + tmp::UntransposeBits( + in, + out, + std::integral_constant()); + + return out; + } + + + // Apply a gray code to a transformed vector. + template + std::array + ApplyGrayCode(std::array const &in) + { + std::array out(in); + + tmp::ApplyGrayCode1( + in, + out, + std::integral_constant()); + + return out; + } + + template + std::array + RemoveGrayCode(std::array const &in) + { + const size_t bits = std::numeric_limits::digits; + std::array out(in); + + // Remove gray code from transposed vector. + { + // xor values with prev values. + tmp::RemoveGrayCode1( + out, + std::integral_constant()); + + // create a mask. + T t = tmp::RemoveGrayCode2( + out[N-1], + std::integral_constant()); + + // Apply mask to output. + tmp::ApplyMaskToArray( + out, + t, + std::integral_constant()); + } + + return out; + } + + // Generate code to convert from a transposed gray code to a hilbert + // code. + template + std::array + GrayToHilbert(std::array const &in) + { + std::array out(in); + + tmp::GrayToHilbert( + out, + std::integral_constant< + size_t, + std::numeric_limits::digits - 1>()); + + return out; + } + + // Generate code to convert from a hilbert code to a transposed gray + // code. + template + std::array + HilbertToGray(std::array const &in) + { + std::array out(in); + + tmp::HilbertToGray( + out, + std::integral_constant< + size_t, + std::numeric_limits::digits-1>()); + + return out; + } + } + + // + // Public interfaces. + // + + // Find the position of a point on an N dimensional Hilbert Curve. + // + // Based on the paper "Programming the Hilbert Curve" by John Skilling. + // + // Index is encoded with most significant objects first. Lexographic + // sort order. + template + std::array + IndexToPosition(std::array const &in) + { + // First convert index to transpose. + return internal::GrayToHilbert( + internal::ApplyGrayCode( + internal::TransposeBits(in))); + } + + // Find the index of a point on an N dimensional Hilbert Curve. + // + // Based on the paper "Programming the Hilbert Curve" by John Skilling. + // + // Index is encoded with most significant objects first. Lexographic + // sort order. + template + std::array + PositionToIndex(std::array const &in) + { + return internal::UntransposeBits( + internal::RemoveGrayCode( + internal::HilbertToGray(in))); + } + } // namespace v2 +} // namespace hilbert + +#endif diff --git a/include/ivox/ivox3d.h b/include/ivox/ivox3d.h new file mode 100644 index 0000000..6f37014 --- /dev/null +++ b/include/ivox/ivox3d.h @@ -0,0 +1,315 @@ +// +// Created by xiang on 2021/9/16. +// + +#ifndef FASTER_LIO_IVOX3D_H +#define FASTER_LIO_IVOX3D_H + +#include +// #include +#include +#include +#include + +#include "eigen_types.h" +#include "ivox3d_node.hpp" + +namespace faster_lio { + +enum class IVoxNodeType { + DEFAULT, // linear ivox + PHC, // phc ivox +}; + +/// traits for NodeType +template +struct IVoxNodeTypeTraits {}; + +template +struct IVoxNodeTypeTraits { + using NodeType = IVoxNode; +}; + +template +struct IVoxNodeTypeTraits { + using NodeType = IVoxNodePhc; +}; + +template +class IVox { + public: + using KeyType = Eigen::Matrix; + using PtType = Eigen::Matrix; + using NodeType = typename IVoxNodeTypeTraits::NodeType; + using PointVector = std::vector>; + using DistPoint = typename NodeType::DistPoint; + + enum class NearbyType { + CENTER, // center only + NEARBY6, + NEARBY18, + NEARBY26, + }; + + struct Options { + float resolution_ = 0.2; // ivox resolution + float inv_resolution_ = 10.0; // inverse resolution + NearbyType nearby_type_ = NearbyType::NEARBY6; // nearby range + std::size_t capacity_ = 1000000; // capacity + }; + + /** + * constructor + * @param options ivox options + */ + explicit IVox(Options options) : options_(options) { + options_.inv_resolution_ = 1.0 / options_.resolution_; + GenerateNearbyGrids(); + } + + /** + * add points + * @param points_to_add + */ + void AddPoints(const PointVector& points_to_add); + + /// get nn + bool GetClosestPoint(const PointType& pt, PointType& closest_pt); + + /// get nn with condition + bool GetClosestPoint(const PointType& pt, PointVector& closest_pt, int max_num = 5, double max_range = 5.0); + + /// get nn in cloud + bool GetClosestPoint(const PointVector& cloud, PointVector& closest_cloud); + + /// get number of points + size_t NumPoints() const; + + /// get number of valid grids + size_t NumValidGrids() const; + + /// get statistics of the points + std::vector StatGridPoints() const; + + std::unordered_map>::iterator, hash_vec> + grids_map_; + KeyType Pos2Grid(const PtType& pt) const; + KeyType Pos2Grid_(const PtType& pt, const double &defined_res) const; + + private: + /// generate the nearby grids according to the given options + void GenerateNearbyGrids(); + + /// position to grid + // KeyType Pos2Grid(const PtType& pt) const; + + Options options_; + // std::unordered_map>::iterator, hash_vec> + // grids_map_; // voxel hash map + std::list> grids_cache_; // voxel cache + std::vector nearby_grids_; // nearbys +}; + +template +bool IVox::GetClosestPoint(const PointType& pt, PointType& closest_pt) { + std::vector candidates; + auto key = Pos2Grid(ToEigen(pt)); + std::for_each(nearby_grids_.begin(), nearby_grids_.end(), [&key, &candidates, &pt, this](const KeyType& delta) { + auto dkey = key + delta; + auto iter = grids_map_.find(dkey); + if (iter != grids_map_.end()) { + DistPoint dist_point; + bool found = iter->second->second.NNPoint(pt, dist_point); + if (found) { + candidates.emplace_back(dist_point); + } + } + }); + + if (candidates.empty()) { + return false; + } + + auto iter = std::min_element(candidates.begin(), candidates.end()); + closest_pt = iter->Get(); + return true; +} + +template +bool IVox::GetClosestPoint(const PointType& pt, PointVector& closest_pt, int max_num, + double max_range) { + std::vector candidates; + candidates.reserve(max_num * nearby_grids_.size()); + + auto key = Pos2Grid(ToEigen(pt)); + +// #define INNER_TIMER +#ifdef INNER_TIMER + static std::unordered_map> stats; + if (stats.empty()) { + stats["knn"] = std::vector(); + stats["nth"] = std::vector(); + } +#endif + + for (const KeyType& delta : nearby_grids_) { + auto dkey = key + delta; + auto iter = grids_map_.find(dkey); + if (iter != grids_map_.end()) { +#ifdef INNER_TIMER + auto t1 = std::chrono::high_resolution_clock::now(); +#endif + auto tmp = iter->second->second.KNNPointByCondition(candidates, pt, max_num, max_range); +#ifdef INNER_TIMER + auto t2 = std::chrono::high_resolution_clock::now(); + auto knn = std::chrono::duration_cast(t2 - t1).count(); + stats["knn"].emplace_back(knn); +#endif + } + } + + if (candidates.empty()) { + return false; + } + +#ifdef INNER_TIMER + auto t1 = std::chrono::high_resolution_clock::now(); +#endif + + if (candidates.size() <= max_num) { + } else { + std::nth_element(candidates.begin(), candidates.begin() + max_num - 1, candidates.end()); + candidates.resize(max_num); + } + std::nth_element(candidates.begin(), candidates.begin(), candidates.end()); + +#ifdef INNER_TIMER + auto t2 = std::chrono::high_resolution_clock::now(); + auto nth = std::chrono::duration_cast(t2 - t1).count(); + stats["nth"].emplace_back(nth); + + constexpr int STAT_PERIOD = 100000; + if (!stats["nth"].empty() && stats["nth"].size() % STAT_PERIOD == 0) { + for (auto& it : stats) { + const std::string& key = it.first; + std::vector& stat = it.second; + int64_t sum_ = std::accumulate(stat.begin(), stat.end(), 0); + int64_t num_ = stat.size(); + stat.clear(); + std::cout << "inner_" << key << "(ns): sum=" << sum_ << " num=" << num_ << " ave=" << 1.0 * sum_ / num_ + << " ave*n=" << 1.0 * sum_ / STAT_PERIOD << std::endl; + } + } +#endif + + closest_pt.clear(); + for (auto& it : candidates) { + closest_pt.emplace_back(it.Get()); + } + return closest_pt.empty() == false; +} + +template +size_t IVox::NumValidGrids() const { + return grids_map_.size(); +} + +template +void IVox::GenerateNearbyGrids() { + if (options_.nearby_type_ == NearbyType::CENTER) { + nearby_grids_.emplace_back(KeyType::Zero()); + } else if (options_.nearby_type_ == NearbyType::NEARBY6) { + nearby_grids_ = {KeyType(0, 0, 0), KeyType(-1, 0, 0), KeyType(1, 0, 0), KeyType(0, 1, 0), + KeyType(0, -1, 0), KeyType(0, 0, -1), KeyType(0, 0, 1)}; + } else if (options_.nearby_type_ == NearbyType::NEARBY18) { + nearby_grids_ = {KeyType(0, 0, 0), KeyType(-1, 0, 0), KeyType(1, 0, 0), KeyType(0, 1, 0), + KeyType(0, -1, 0), KeyType(0, 0, -1), KeyType(0, 0, 1), KeyType(1, 1, 0), + KeyType(-1, 1, 0), KeyType(1, -1, 0), KeyType(-1, -1, 0), KeyType(1, 0, 1), + KeyType(-1, 0, 1), KeyType(1, 0, -1), KeyType(-1, 0, -1), KeyType(0, 1, 1), + KeyType(0, -1, 1), KeyType(0, 1, -1), KeyType(0, -1, -1)}; + } else if (options_.nearby_type_ == NearbyType::NEARBY26) { + nearby_grids_ = {KeyType(0, 0, 0), KeyType(-1, 0, 0), KeyType(1, 0, 0), KeyType(0, 1, 0), + KeyType(0, -1, 0), KeyType(0, 0, -1), KeyType(0, 0, 1), KeyType(1, 1, 0), + KeyType(-1, 1, 0), KeyType(1, -1, 0), KeyType(-1, -1, 0), KeyType(1, 0, 1), + KeyType(-1, 0, 1), KeyType(1, 0, -1), KeyType(-1, 0, -1), KeyType(0, 1, 1), + KeyType(0, -1, 1), KeyType(0, 1, -1), KeyType(0, -1, -1), KeyType(1, 1, 1), + KeyType(-1, 1, 1), KeyType(1, -1, 1), KeyType(1, 1, -1), KeyType(-1, -1, 1), + KeyType(-1, 1, -1), KeyType(1, -1, -1), KeyType(-1, -1, -1)}; + } else { + // LOG(ERROR) << "Unknown nearby_type!"; + } +} + +template +bool IVox::GetClosestPoint(const PointVector& cloud, PointVector& closest_cloud) { + std::vector index(cloud.size()); + + closest_cloud.resize(cloud.size()); + + for (int i = 0; i < cloud.size(); ++i) { + PointType pt; + if (GetClosestPoint(cloud[i], pt)) { + closest_cloud[i] = pt; + } else { + closest_cloud[i] = PointType(); + } + }; + return true; +} + +template +void IVox::AddPoints(const PointVector& points_to_add) { + for(size_t i = 0; i(points_to_add[i].x, points_to_add[i].y, points_to_add[i].z)); + auto iter = grids_map_.find(key); + if (iter == grids_map_.end()) { + PointType center; + center.getVector3fMap() = key.template cast() * options_.resolution_; + + grids_cache_.push_front({key, NodeType(center, options_.resolution_)}); + grids_map_.insert({key, grids_cache_.begin()}); + + grids_cache_.front().second.InsertPoint(points_to_add[i]); + + if (grids_map_.size() >= options_.capacity_) { + grids_map_.erase(grids_cache_.back().first); + grids_cache_.pop_back(); + } + } else { + iter->second->second.InsertPoint(points_to_add[i]); + grids_cache_.splice(grids_cache_.begin(), grids_cache_, iter->second); + grids_map_[key] = grids_cache_.begin(); + } + } +} + +template +Eigen::Matrix IVox::Pos2Grid(const IVox::PtType& pt) const { + return (pt * options_.inv_resolution_).array().floor().template cast(); +} + +template +Eigen::Matrix IVox::Pos2Grid_(const IVox::PtType& pt, const double &defined_res) const { + return (pt / defined_res).array().floor().template cast(); +} + +template +std::vector IVox::StatGridPoints() const { + int num = grids_cache_.size(), valid_num = 0, max = 0, min = 100000000; + int sum = 0, sum_square = 0; + for (auto& it : grids_cache_) { + int s = it.second.Size(); + valid_num += s > 0; + max = s > max ? s : max; + min = s < min ? s : min; + sum += s; + sum_square += s * s; + } + float ave = float(sum) / num; + float stddev = num > 1 ? sqrt((float(sum_square) - num * ave * ave) / (num - 1)) : 0; + return std::vector{valid_num, ave, max, min, stddev}; +} + +} // namespace faster_lio + +#endif diff --git a/include/ivox/ivox3d_node.hpp b/include/ivox/ivox3d_node.hpp new file mode 100644 index 0000000..d2a9e0b --- /dev/null +++ b/include/ivox/ivox3d_node.hpp @@ -0,0 +1,413 @@ +#include +#include +#include +#include +#include + +#include "hilbert.hpp" + +namespace faster_lio { + +// squared distance of two pcl points +template +inline double distance2(const PointT& pt1, const PointT& pt2) { + Eigen::Vector3f d = pt1.getVector3fMap() - pt2.getVector3fMap(); + return d.squaredNorm(); +} + +// convert from pcl point to eigen +template +inline Eigen::Matrix ToEigen(const PointType& pt) { + cout << "line 21" << endl; + return Eigen::Matrix(pt.x, pt.y, pt.z); + cout << "line 23" << endl; +} + +template <> +inline Eigen::Matrix ToEigen(const pcl::PointXYZ& pt) { + return pt.getVector3fMap(); +} + +template <> +inline Eigen::Matrix ToEigen(const pcl::PointXYZI& pt) { + return pt.getVector3fMap(); +} + +template <> +inline Eigen::Matrix ToEigen(const pcl::PointXYZINormal& pt) { + return pt.getVector3fMap(); +} + +template +class IVoxNode { + public: + EIGEN_MAKE_ALIGNED_OPERATOR_NEW; + + struct DistPoint; + + IVoxNode() = default; + IVoxNode(const PointT& center, const float& side_length) {} /// same with phc + + void InsertPoint(const PointT& pt); + + inline bool Empty() const; + + inline std::size_t Size() const; + + inline PointT GetPoint(const std::size_t idx) const; + + int KNNPointByCondition(std::vector& dis_points, const PointT& point, const int& K, + const double& max_range); + + private: + std::vector points_; +}; + +template +class IVoxNodePhc { + public: + EIGEN_MAKE_ALIGNED_OPERATOR_NEW; + + struct DistPoint; + struct PhcCube; + + IVoxNodePhc() = default; + IVoxNodePhc(const PointT& center, const float& side_length, const int& phc_order = 6); + + void InsertPoint(const PointT& pt); + + void ErasePoint(const PointT& pt, const double erase_distance_th_); + + inline bool Empty() const; + + inline std::size_t Size() const; + + PointT GetPoint(const std::size_t idx) const; + + bool NNPoint(const PointT& cur_pt, DistPoint& dist_point) const; + + int KNNPointByCondition(std::vector& dis_points, const PointT& cur_pt, const int& K = 5, + const double& max_range = 5.0); + + private: + uint32_t CalculatePhcIndex(const PointT& pt) const; + + private: + std::vector phc_cubes_; + + PointT center_; + float side_length_ = 0; + int phc_order_ = 6; + float phc_side_length_ = 0; + float phc_side_length_inv_ = 0; + Eigen::Matrix min_cube_; +}; + +template +struct IVoxNode::DistPoint { + double dist = 0; + IVoxNode* node = nullptr; + int idx = 0; + + DistPoint() = default; + DistPoint(const double d, IVoxNode* n, const int i) : dist(d), node(n), idx(i) {} + + PointT Get() { return node->GetPoint(idx); } + + inline bool operator()(const DistPoint& p1, const DistPoint& p2) { return p1.dist < p2.dist; } + + inline bool operator<(const DistPoint& rhs) { return dist < rhs.dist; } +}; + +template +void IVoxNode::InsertPoint(const PointT& pt) { + points_.template emplace_back(pt); +} + +template +bool IVoxNode::Empty() const { + return points_.empty(); +} + +template +std::size_t IVoxNode::Size() const { + return points_.size(); +} + +template +PointT IVoxNode::GetPoint(const std::size_t idx) const { + return points_[idx]; +} + +template +int IVoxNode::KNNPointByCondition(std::vector& dis_points, const PointT& point, const int& K, + const double& max_range) { + std::size_t old_size = dis_points.size(); +// #define INNER_TIMER +#ifdef INNER_TIMER + static std::unordered_map> stats; + if (stats.empty()) { + stats["dis"] = std::vector(); + stats["put"] = std::vector(); + stats["nth"] = std::vector(); + } +#endif + + for (const auto& pt : points_) { +#ifdef INNER_TIMER + auto t0 = std::chrono::high_resolution_clock::now(); +#endif + double d = distance2(pt, point); +#ifdef INNER_TIMER + auto t1 = std::chrono::high_resolution_clock::now(); +#endif + if (d < max_range * max_range) { + dis_points.template emplace_back(DistPoint(d, this, &pt - points_.data())); + } +#ifdef INNER_TIMER + auto t2 = std::chrono::high_resolution_clock::now(); + + auto dis = std::chrono::duration_cast(t1 - t0).count(); + stats["dis"].emplace_back(dis); + auto put = std::chrono::duration_cast(t2 - t1).count(); + stats["put"].emplace_back(put); +#endif + } + +#ifdef INNER_TIMER + auto t1 = std::chrono::high_resolution_clock::now(); +#endif + // sort by distance + if (old_size + K >= dis_points.size()) { + } else { + std::nth_element(dis_points.begin() + old_size, dis_points.begin() + old_size + K - 1, dis_points.end()); + dis_points.resize(old_size + K); + } + +#ifdef INNER_TIMER + auto t2 = std::chrono::high_resolution_clock::now(); + auto nth = std::chrono::duration_cast(t2 - t1).count(); + stats["nth"].emplace_back(nth); + + constexpr int STAT_PERIOD = 100000; + if (!stats["nth"].empty() && stats["nth"].size() % STAT_PERIOD == 0) { + for (auto& it : stats) { + const std::string& key = it.first; + std::vector& stat = it.second; + int64_t sum_ = std::accumulate(stat.begin(), stat.end(), 0); + int64_t num_ = stat.size(); + stat.clear(); + std::cout << "inner_" << key << "(ns): sum=" << sum_ << " num=" << num_ << " ave=" << 1.0 * sum_ / num_ + << " ave*n=" << 1.0 * sum_ / STAT_PERIOD << std::endl; + } + } +#endif + + return dis_points.size(); +} + +template +struct IVoxNodePhc::DistPoint { + double dist = 0; + IVoxNodePhc* node = nullptr; + int idx = 0; + + DistPoint() {} + DistPoint(const double d, IVoxNodePhc* n, const int i) : dist(d), node(n), idx(i) {} + + PointT Get() { return node->GetPoint(idx); } + + inline bool operator()(const DistPoint& p1, const DistPoint& p2) { return p1.dist < p2.dist; } + + inline bool operator<(const DistPoint& rhs) { return dist < rhs.dist; } +}; + +template +struct IVoxNodePhc::PhcCube { + uint32_t idx = 0; + pcl::CentroidPoint mean; + + PhcCube(uint32_t index, const PointT& pt) { mean.add(pt); } + + void AddPoint(PointT& pt) { mean.add(pt); } + + PointT GetPoint() const { + PointT pt; + mean.get(pt); + return std::move(pt); + } +}; + +template +IVoxNodePhc::IVoxNodePhc(const PointT& center, const float& side_length, const int& phc_order) + : center_(center), side_length_(side_length), phc_order_(phc_order) { + assert(phc_order <= 8); + phc_side_length_ = side_length_ / (std::pow(2, phc_order_)); + phc_side_length_inv_ = (std::pow(2, phc_order_)) / side_length_; + min_cube_ = center_.getArray3fMap() - side_length / 2.0; + phc_cubes_.reserve(64); +} + +template +void IVoxNodePhc::InsertPoint(const PointT& pt) { + uint32_t idx = CalculatePhcIndex(pt); + + PhcCube cube{idx, pt}; + auto it = std::lower_bound(phc_cubes_.begin(), phc_cubes_.end(), cube, + [](const PhcCube& a, const PhcCube& b) { return a.idx < b.idx; }); + + if (it == phc_cubes_.end()) { + phc_cubes_.emplace_back(cube); + } else { + if (it->idx == idx) { + it->AddPoint(pt); + } else { + phc_cubes_.insert(it, cube); + } + } +} + +template +void IVoxNodePhc::ErasePoint(const PointT& pt, const double erase_distance_th_) { + uint32_t idx = CalculatePhcIndex(pt); + + PhcCube cube{idx, pt}; + auto it = std::lower_bound(phc_cubes_.begin(), phc_cubes_.end(), cube, + [](const PhcCube& a, const PhcCube& b) { return a.idx < b.idx; }); + + if (erase_distance_th_ > 0) { + } + if (it != phc_cubes_.end() && it->idx == idx) { + phc_cubes_.erase(it); + } +} + +template +bool IVoxNodePhc::Empty() const { + return phc_cubes_.empty(); +} + +template +std::size_t IVoxNodePhc::Size() const { + return phc_cubes_.size(); +} + +template +PointT IVoxNodePhc::GetPoint(const std::size_t idx) const { + return phc_cubes_[idx].GetPoint(); +} + +template +bool IVoxNodePhc::NNPoint(const PointT& cur_pt, DistPoint& dist_point) const { + if (phc_cubes_.empty()) { + return false; + } + uint32_t cur_idx = CalculatePhcIndex(cur_pt); + PhcCube cube{cur_idx, cur_pt}; + auto it = std::lower_bound(phc_cubes_.begin(), phc_cubes_.end(), cube, + [](const PhcCube& a, const PhcCube& b) { return a.idx < b.idx; }); + + if (it == phc_cubes_.end()) { + it--; + dist_point = DistPoint(distance2(cur_pt, it->GetPoint()), this, it - phc_cubes_.begin()); + } else if (it == phc_cubes_.begin()) { + dist_point = DistPoint(distance2(cur_pt, it->GetPoint()), this, it - phc_cubes_.begin()); + } else { + auto last_it = it; + last_it--; + double d1 = distance2(cur_pt, it->GetPoint()); + double d2 = distance2(cur_pt, last_it->GetPoint()); + if (d1 > d2) { + dist_point = DistPoint(d2, this, it - phc_cubes_.begin()); + } else { + dist_point = DistPoint(d1, this, it - phc_cubes_.begin()); + } + } + + return true; +} + +template +int IVoxNodePhc::KNNPointByCondition(std::vector& dis_points, const PointT& cur_pt, + const int& K, const double& max_range) { + uint32_t cur_idx = CalculatePhcIndex(cur_pt); + PhcCube cube{cur_idx, cur_pt}; + auto it = std::lower_bound(phc_cubes_.begin(), phc_cubes_.end(), cube, + [](const PhcCube& a, const PhcCube& b) { return a.idx < b.idx; }); + + const int max_search_cube_side_length = std::pow(2, std::ceil(std::log2(max_range * phc_side_length_inv_))); + const int max_search_idx_th = + 8 * max_search_cube_side_length * max_search_cube_side_length * max_search_cube_side_length; + + auto create_dist_point = [&cur_pt, this](typename std::vector::const_iterator forward_it) { + double d = distance2(forward_it->GetPoint(), cur_pt); + return DistPoint(d, this, forward_it - phc_cubes_.begin()); + }; + + typename std::vector::const_iterator forward_it(it); + typename std::vector::const_reverse_iterator backward_it(it); + if (it != phc_cubes_.end()) { + dis_points.emplace_back(create_dist_point(it)); + forward_it++; + } + if (backward_it != phc_cubes_.rend()) { + backward_it++; + } + + auto forward_reach_boundary = [&]() { + return forward_it == phc_cubes_.end() || forward_it->idx - cur_idx > max_search_idx_th; + }; + auto backward_reach_boundary = [&]() { + return backward_it == phc_cubes_.rend() || cur_idx - backward_it->idx > max_search_idx_th; + }; + + while (!forward_reach_boundary() && !backward_reach_boundary()) { + if (forward_it->idx - cur_idx > cur_idx - backward_it->idx) { + dis_points.emplace_back(create_dist_point(forward_it)); + forward_it++; + } else { + dis_points.emplace_back(create_dist_point(backward_it.base())); + backward_it++; + } + if (dis_points.size() > K) { + break; + } + } + + if (forward_reach_boundary()) { + while (!backward_reach_boundary() && dis_points.size() < K) { + dis_points.emplace_back(create_dist_point(backward_it.base())); + backward_it++; + } + } + + if (backward_reach_boundary()) { + while (!forward_reach_boundary() && dis_points.size() < K) { + dis_points.emplace_back(create_dist_point(forward_it)); + forward_it++; + } + } + + return dis_points.size(); +} + +template +uint32_t IVoxNodePhc::CalculatePhcIndex(const PointT& pt) const { + Eigen::Matrix eposf = (pt.getVector3fMap() - min_cube_) * phc_side_length_inv_; + Eigen::Matrix eposi = eposf.template cast(); + for (int i = 0; i < dim; ++i) { + if (eposi(i, 0) < 0) { + eposi(i, 0) = 0; + } + if (eposi(i, 0) > std::pow(2, phc_order_)) { + eposi(i, 0) = std::pow(2, phc_order_) - 1; + } + } + std::array apos{eposi(0), eposi(1), eposi(2)}; + std::array tmp = hilbert::v2::PositionToIndex(apos); + + uint32_t idx = (uint32_t(tmp[0]) << 16) + (uint32_t(tmp[1]) << 8) + (uint32_t(tmp[2])); + return idx; +} + +} // namespace faster_lio diff --git a/include/matplotlibcpp.h b/include/matplotlibcpp.h new file mode 100644 index 0000000..a6afa34 --- /dev/null +++ b/include/matplotlibcpp.h @@ -0,0 +1,2500 @@ +#pragma once + +// Python headers must be included before any system headers, since +// they define _POSIX_C_SOURCE +#include + +#include +#include +#include +#include +#include +#include +#include +#include // requires c++11 support +#include + +#ifndef WITHOUT_NUMPY +# define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION +# include + +# ifdef WITH_OPENCV +# include +# include +# endif // WITH_OPENCV + +/* + * A bunch of constants were removed in OpenCV 4 in favour of enum classes, so + * define the ones we need here. + */ +# if CV_MAJOR_VERSION > 3 +# define CV_BGR2RGB cv::COLOR_BGR2RGB +# define CV_BGRA2RGBA cv::COLOR_BGRA2RGBA +# endif +#endif // WITHOUT_NUMPY + +#if PY_MAJOR_VERSION >= 3 +# define PyString_FromString PyUnicode_FromString +# define PyInt_FromLong PyLong_FromLong +# define PyString_FromString PyUnicode_FromString +#endif + + +namespace matplotlibcpp { +namespace detail { + +static std::string s_backend; + +struct _interpreter { + PyObject* s_python_function_arrow; + PyObject *s_python_function_show; + PyObject *s_python_function_close; + PyObject *s_python_function_draw; + PyObject *s_python_function_pause; + PyObject *s_python_function_save; + PyObject *s_python_function_figure; + PyObject *s_python_function_fignum_exists; + PyObject *s_python_function_plot; + PyObject *s_python_function_quiver; + PyObject* s_python_function_contour; + PyObject *s_python_function_semilogx; + PyObject *s_python_function_semilogy; + PyObject *s_python_function_loglog; + PyObject *s_python_function_fill; + PyObject *s_python_function_fill_between; + PyObject *s_python_function_hist; + PyObject *s_python_function_imshow; + PyObject *s_python_function_scatter; + PyObject *s_python_function_boxplot; + PyObject *s_python_function_subplot; + PyObject *s_python_function_subplot2grid; + PyObject *s_python_function_legend; + PyObject *s_python_function_xlim; + PyObject *s_python_function_ion; + PyObject *s_python_function_ginput; + PyObject *s_python_function_ylim; + PyObject *s_python_function_title; + PyObject *s_python_function_axis; + PyObject *s_python_function_axvline; + PyObject *s_python_function_axvspan; + PyObject *s_python_function_xlabel; + PyObject *s_python_function_ylabel; + PyObject *s_python_function_gca; + PyObject *s_python_function_xticks; + PyObject *s_python_function_yticks; + PyObject* s_python_function_margins; + PyObject *s_python_function_tick_params; + PyObject *s_python_function_grid; + PyObject* s_python_function_cla; + PyObject *s_python_function_clf; + PyObject *s_python_function_errorbar; + PyObject *s_python_function_annotate; + PyObject *s_python_function_tight_layout; + PyObject *s_python_colormap; + PyObject *s_python_empty_tuple; + PyObject *s_python_function_stem; + PyObject *s_python_function_xkcd; + PyObject *s_python_function_text; + PyObject *s_python_function_suptitle; + PyObject *s_python_function_bar; + PyObject *s_python_function_colorbar; + PyObject *s_python_function_subplots_adjust; + + + /* For now, _interpreter is implemented as a singleton since its currently not possible to have + multiple independent embedded python interpreters without patching the python source code + or starting a separate process for each. + http://bytes.com/topic/python/answers/793370-multiple-independent-python-interpreters-c-c-program + */ + + static _interpreter& get() { + static _interpreter ctx; + return ctx; + } + + PyObject* safe_import(PyObject* module, std::string fname) { + PyObject* fn = PyObject_GetAttrString(module, fname.c_str()); + + if (!fn) + throw std::runtime_error(std::string("Couldn't find required function: ") + fname); + + if (!PyFunction_Check(fn)) + throw std::runtime_error(fname + std::string(" is unexpectedly not a PyFunction.")); + + return fn; + } + +private: + +#ifndef WITHOUT_NUMPY +# if PY_MAJOR_VERSION >= 3 + + void *import_numpy() { + import_array(); // initialize C-API + return NULL; + } + +# else + + void import_numpy() { + import_array(); // initialize C-API + } + +# endif +#endif + + _interpreter() { + + // optional but recommended +#if PY_MAJOR_VERSION >= 3 + wchar_t name[] = L"plotting"; +#else + char name[] = "plotting"; +#endif + Py_SetProgramName(name); + Py_Initialize(); + +#ifndef WITHOUT_NUMPY + import_numpy(); // initialize numpy C-API +#endif + + PyObject* matplotlibname = PyString_FromString("matplotlib"); + PyObject* pyplotname = PyString_FromString("matplotlib.pyplot"); + PyObject* cmname = PyString_FromString("matplotlib.cm"); + PyObject* pylabname = PyString_FromString("pylab"); + if (!pyplotname || !pylabname || !matplotlibname || !cmname) { + throw std::runtime_error("couldnt create string"); + } + + PyObject* matplotlib = PyImport_Import(matplotlibname); + Py_DECREF(matplotlibname); + if (!matplotlib) { + PyErr_Print(); + throw std::runtime_error("Error loading module matplotlib!"); + } + + // matplotlib.use() must be called *before* pylab, matplotlib.pyplot, + // or matplotlib.backends is imported for the first time + if (!s_backend.empty()) { + PyObject_CallMethod(matplotlib, const_cast("use"), const_cast("s"), s_backend.c_str()); + } + + PyObject* pymod = PyImport_Import(pyplotname); + Py_DECREF(pyplotname); + if (!pymod) { throw std::runtime_error("Error loading module matplotlib.pyplot!"); } + + s_python_colormap = PyImport_Import(cmname); + Py_DECREF(cmname); + if (!s_python_colormap) { throw std::runtime_error("Error loading module matplotlib.cm!"); } + + PyObject* pylabmod = PyImport_Import(pylabname); + Py_DECREF(pylabname); + if (!pylabmod) { throw std::runtime_error("Error loading module pylab!"); } + + s_python_function_arrow = safe_import(pymod, "arrow"); + s_python_function_show = safe_import(pymod, "show"); + s_python_function_close = safe_import(pymod, "close"); + s_python_function_draw = safe_import(pymod, "draw"); + s_python_function_pause = safe_import(pymod, "pause"); + s_python_function_figure = safe_import(pymod, "figure"); + s_python_function_fignum_exists = safe_import(pymod, "fignum_exists"); + s_python_function_plot = safe_import(pymod, "plot"); + s_python_function_quiver = safe_import(pymod, "quiver"); + s_python_function_contour = safe_import(pymod, "contour"); + s_python_function_semilogx = safe_import(pymod, "semilogx"); + s_python_function_semilogy = safe_import(pymod, "semilogy"); + s_python_function_loglog = safe_import(pymod, "loglog"); + s_python_function_fill = safe_import(pymod, "fill"); + s_python_function_fill_between = safe_import(pymod, "fill_between"); + s_python_function_hist = safe_import(pymod,"hist"); + s_python_function_scatter = safe_import(pymod,"scatter"); + s_python_function_boxplot = safe_import(pymod,"boxplot"); + s_python_function_subplot = safe_import(pymod, "subplot"); + s_python_function_subplot2grid = safe_import(pymod, "subplot2grid"); + s_python_function_legend = safe_import(pymod, "legend"); + s_python_function_ylim = safe_import(pymod, "ylim"); + s_python_function_title = safe_import(pymod, "title"); + s_python_function_axis = safe_import(pymod, "axis"); + s_python_function_axvline = safe_import(pymod, "axvline"); + s_python_function_axvspan = safe_import(pymod, "axvspan"); + s_python_function_xlabel = safe_import(pymod, "xlabel"); + s_python_function_ylabel = safe_import(pymod, "ylabel"); + s_python_function_gca = safe_import(pymod, "gca"); + s_python_function_xticks = safe_import(pymod, "xticks"); + s_python_function_yticks = safe_import(pymod, "yticks"); + s_python_function_margins = safe_import(pymod, "margins"); + s_python_function_tick_params = safe_import(pymod, "tick_params"); + s_python_function_grid = safe_import(pymod, "grid"); + s_python_function_xlim = safe_import(pymod, "xlim"); + s_python_function_ion = safe_import(pymod, "ion"); + s_python_function_ginput = safe_import(pymod, "ginput"); + s_python_function_save = safe_import(pylabmod, "savefig"); + s_python_function_annotate = safe_import(pymod,"annotate"); + s_python_function_cla = safe_import(pymod, "cla"); + s_python_function_clf = safe_import(pymod, "clf"); + s_python_function_errorbar = safe_import(pymod, "errorbar"); + s_python_function_tight_layout = safe_import(pymod, "tight_layout"); + s_python_function_stem = safe_import(pymod, "stem"); + s_python_function_xkcd = safe_import(pymod, "xkcd"); + s_python_function_text = safe_import(pymod, "text"); + s_python_function_suptitle = safe_import(pymod, "suptitle"); + s_python_function_bar = safe_import(pymod,"bar"); + s_python_function_colorbar = PyObject_GetAttrString(pymod, "colorbar"); + s_python_function_subplots_adjust = safe_import(pymod,"subplots_adjust"); +#ifndef WITHOUT_NUMPY + s_python_function_imshow = safe_import(pymod, "imshow"); +#endif + s_python_empty_tuple = PyTuple_New(0); + } + + ~_interpreter() { + Py_Finalize(); + } +}; + +} // end namespace detail + +/// Select the backend +/// +/// **NOTE:** This must be called before the first plot command to have +/// any effect. +/// +/// Mainly useful to select the non-interactive 'Agg' backend when running +/// matplotlibcpp in headless mode, for example on a machine with no display. +/// +/// See also: https://matplotlib.org/2.0.2/api/matplotlib_configuration_api.html#matplotlib.use +inline void backend(const std::string& name) +{ + detail::s_backend = name; +} + +inline bool annotate(std::string annotation, double x, double y) +{ + detail::_interpreter::get(); + + PyObject * xy = PyTuple_New(2); + PyObject * str = PyString_FromString(annotation.c_str()); + + PyTuple_SetItem(xy,0,PyFloat_FromDouble(x)); + PyTuple_SetItem(xy,1,PyFloat_FromDouble(y)); + + PyObject* kwargs = PyDict_New(); + PyDict_SetItemString(kwargs, "xy", xy); + + PyObject* args = PyTuple_New(1); + PyTuple_SetItem(args, 0, str); + + PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_annotate, args, kwargs); + + Py_DECREF(args); + Py_DECREF(kwargs); + + if(res) Py_DECREF(res); + + return res; +} + +namespace detail { + +#ifndef WITHOUT_NUMPY +// Type selector for numpy array conversion +template struct select_npy_type { const static NPY_TYPES type = NPY_NOTYPE; }; //Default +template <> struct select_npy_type { const static NPY_TYPES type = NPY_DOUBLE; }; +template <> struct select_npy_type { const static NPY_TYPES type = NPY_FLOAT; }; +template <> struct select_npy_type { const static NPY_TYPES type = NPY_BOOL; }; +template <> struct select_npy_type { const static NPY_TYPES type = NPY_INT8; }; +template <> struct select_npy_type { const static NPY_TYPES type = NPY_SHORT; }; +template <> struct select_npy_type { const static NPY_TYPES type = NPY_INT; }; +template <> struct select_npy_type { const static NPY_TYPES type = NPY_INT64; }; +template <> struct select_npy_type { const static NPY_TYPES type = NPY_UINT8; }; +template <> struct select_npy_type { const static NPY_TYPES type = NPY_USHORT; }; +template <> struct select_npy_type { const static NPY_TYPES type = NPY_ULONG; }; +template <> struct select_npy_type { const static NPY_TYPES type = NPY_UINT64; }; + +// Sanity checks; comment them out or change the numpy type below if you're compiling on +// a platform where they don't apply +static_assert(sizeof(long long) == 8); +template <> struct select_npy_type { const static NPY_TYPES type = NPY_INT64; }; +static_assert(sizeof(unsigned long long) == 8); +template <> struct select_npy_type { const static NPY_TYPES type = NPY_UINT64; }; +// TODO: add int, long, etc. + +template +PyObject* get_array(const std::vector& v) +{ + npy_intp vsize = v.size(); + NPY_TYPES type = select_npy_type::type; + if (type == NPY_NOTYPE) { + size_t memsize = v.size()*sizeof(double); + double* dp = static_cast(::malloc(memsize)); + for (size_t i=0; i(varray), NPY_ARRAY_OWNDATA); + return varray; + } + + PyObject* varray = PyArray_SimpleNewFromData(1, &vsize, type, (void*)(v.data())); + return varray; +} + + +template +PyObject* get_2darray(const std::vector<::std::vector>& v) +{ + if (v.size() < 1) throw std::runtime_error("get_2d_array v too small"); + + npy_intp vsize[2] = {static_cast(v.size()), + static_cast(v[0].size())}; + + PyArrayObject *varray = + (PyArrayObject *)PyArray_SimpleNew(2, vsize, NPY_DOUBLE); + + double *vd_begin = static_cast(PyArray_DATA(varray)); + + for (const ::std::vector &v_row : v) { + if (v_row.size() != static_cast(vsize[1])) + throw std::runtime_error("Missmatched array size"); + std::copy(v_row.begin(), v_row.end(), vd_begin); + vd_begin += vsize[1]; + } + + return reinterpret_cast(varray); +} + +#else // fallback if we don't have numpy: copy every element of the given vector + +template +PyObject* get_array(const std::vector& v) +{ + PyObject* list = PyList_New(v.size()); + for(size_t i = 0; i < v.size(); ++i) { + PyList_SetItem(list, i, PyFloat_FromDouble(v.at(i))); + } + return list; +} + +#endif // WITHOUT_NUMPY + +// sometimes, for labels and such, we need string arrays +inline PyObject * get_array(const std::vector& strings) +{ + PyObject* list = PyList_New(strings.size()); + for (std::size_t i = 0; i < strings.size(); ++i) { + PyList_SetItem(list, i, PyString_FromString(strings[i].c_str())); + } + return list; +} + +// not all matplotlib need 2d arrays, some prefer lists of lists +template +PyObject* get_listlist(const std::vector>& ll) +{ + PyObject* listlist = PyList_New(ll.size()); + for (std::size_t i = 0; i < ll.size(); ++i) { + PyList_SetItem(listlist, i, get_array(ll[i])); + } + return listlist; +} + +} // namespace detail + +/// Plot a line through the given x and y data points.. +/// +/// See: https://matplotlib.org/3.2.1/api/_as_gen/matplotlib.pyplot.plot.html +template +bool plot(const std::vector &x, const std::vector &y, const std::map& keywords) +{ + assert(x.size() == y.size()); + + detail::_interpreter::get(); + + // using numpy arrays + PyObject* xarray = detail::get_array(x); + PyObject* yarray = detail::get_array(y); + + // construct positional args + PyObject* args = PyTuple_New(2); + PyTuple_SetItem(args, 0, xarray); + PyTuple_SetItem(args, 1, yarray); + + // construct keyword args + PyObject* kwargs = PyDict_New(); + for(std::map::const_iterator it = keywords.begin(); it != keywords.end(); ++it) + { + PyDict_SetItemString(kwargs, it->first.c_str(), PyString_FromString(it->second.c_str())); + } + + PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_plot, args, kwargs); + + Py_DECREF(args); + Py_DECREF(kwargs); + if(res) Py_DECREF(res); + + return res; +} + +// TODO - it should be possible to make this work by implementing +// a non-numpy alternative for `detail::get_2darray()`. +#ifndef WITHOUT_NUMPY +template +void plot_surface(const std::vector<::std::vector> &x, + const std::vector<::std::vector> &y, + const std::vector<::std::vector> &z, + const std::map &keywords = + std::map()) +{ + detail::_interpreter::get(); + + // We lazily load the modules here the first time this function is called + // because I'm not sure that we can assume "matplotlib installed" implies + // "mpl_toolkits installed" on all platforms, and we don't want to require + // it for people who don't need 3d plots. + static PyObject *mpl_toolkitsmod = nullptr, *axis3dmod = nullptr; + if (!mpl_toolkitsmod) { + detail::_interpreter::get(); + + PyObject* mpl_toolkits = PyString_FromString("mpl_toolkits"); + PyObject* axis3d = PyString_FromString("mpl_toolkits.mplot3d"); + if (!mpl_toolkits || !axis3d) { throw std::runtime_error("couldnt create string"); } + + mpl_toolkitsmod = PyImport_Import(mpl_toolkits); + Py_DECREF(mpl_toolkits); + if (!mpl_toolkitsmod) { throw std::runtime_error("Error loading module mpl_toolkits!"); } + + axis3dmod = PyImport_Import(axis3d); + Py_DECREF(axis3d); + if (!axis3dmod) { throw std::runtime_error("Error loading module mpl_toolkits.mplot3d!"); } + } + + assert(x.size() == y.size()); + assert(y.size() == z.size()); + + // using numpy arrays + PyObject *xarray = detail::get_2darray(x); + PyObject *yarray = detail::get_2darray(y); + PyObject *zarray = detail::get_2darray(z); + + // construct positional args + PyObject *args = PyTuple_New(3); + PyTuple_SetItem(args, 0, xarray); + PyTuple_SetItem(args, 1, yarray); + PyTuple_SetItem(args, 2, zarray); + + // Build up the kw args. + PyObject *kwargs = PyDict_New(); + PyDict_SetItemString(kwargs, "rstride", PyInt_FromLong(1)); + PyDict_SetItemString(kwargs, "cstride", PyInt_FromLong(1)); + + PyObject *python_colormap_coolwarm = PyObject_GetAttrString( + detail::_interpreter::get().s_python_colormap, "coolwarm"); + + PyDict_SetItemString(kwargs, "cmap", python_colormap_coolwarm); + + for (std::map::const_iterator it = keywords.begin(); + it != keywords.end(); ++it) { + PyDict_SetItemString(kwargs, it->first.c_str(), + PyString_FromString(it->second.c_str())); + } + + + PyObject *fig = + PyObject_CallObject(detail::_interpreter::get().s_python_function_figure, + detail::_interpreter::get().s_python_empty_tuple); + if (!fig) throw std::runtime_error("Call to figure() failed."); + + PyObject *gca_kwargs = PyDict_New(); + PyDict_SetItemString(gca_kwargs, "projection", PyString_FromString("3d")); + + PyObject *gca = PyObject_GetAttrString(fig, "gca"); + if (!gca) throw std::runtime_error("No gca"); + Py_INCREF(gca); + PyObject *axis = PyObject_Call( + gca, detail::_interpreter::get().s_python_empty_tuple, gca_kwargs); + + if (!axis) throw std::runtime_error("No axis"); + Py_INCREF(axis); + + Py_DECREF(gca); + Py_DECREF(gca_kwargs); + + PyObject *plot_surface = PyObject_GetAttrString(axis, "plot_surface"); + if (!plot_surface) throw std::runtime_error("No surface"); + Py_INCREF(plot_surface); + PyObject *res = PyObject_Call(plot_surface, args, kwargs); + if (!res) throw std::runtime_error("failed surface"); + Py_DECREF(plot_surface); + + Py_DECREF(axis); + Py_DECREF(args); + Py_DECREF(kwargs); + if (res) Py_DECREF(res); +} +#endif // WITHOUT_NUMPY + +template +void plot3(const std::vector &x, + const std::vector &y, + const std::vector &z, + const std::map &keywords = + std::map()) +{ + detail::_interpreter::get(); + + // Same as with plot_surface: We lazily load the modules here the first time + // this function is called because I'm not sure that we can assume "matplotlib + // installed" implies "mpl_toolkits installed" on all platforms, and we don't + // want to require it for people who don't need 3d plots. + static PyObject *mpl_toolkitsmod = nullptr, *axis3dmod = nullptr; + if (!mpl_toolkitsmod) { + detail::_interpreter::get(); + + PyObject* mpl_toolkits = PyString_FromString("mpl_toolkits"); + PyObject* axis3d = PyString_FromString("mpl_toolkits.mplot3d"); + if (!mpl_toolkits || !axis3d) { throw std::runtime_error("couldnt create string"); } + + mpl_toolkitsmod = PyImport_Import(mpl_toolkits); + Py_DECREF(mpl_toolkits); + if (!mpl_toolkitsmod) { throw std::runtime_error("Error loading module mpl_toolkits!"); } + + axis3dmod = PyImport_Import(axis3d); + Py_DECREF(axis3d); + if (!axis3dmod) { throw std::runtime_error("Error loading module mpl_toolkits.mplot3d!"); } + } + + assert(x.size() == y.size()); + assert(y.size() == z.size()); + + PyObject *xarray = detail::get_array(x); + PyObject *yarray = detail::get_array(y); + PyObject *zarray = detail::get_array(z); + + // construct positional args + PyObject *args = PyTuple_New(3); + PyTuple_SetItem(args, 0, xarray); + PyTuple_SetItem(args, 1, yarray); + PyTuple_SetItem(args, 2, zarray); + + // Build up the kw args. + PyObject *kwargs = PyDict_New(); + + for (std::map::const_iterator it = keywords.begin(); + it != keywords.end(); ++it) { + PyDict_SetItemString(kwargs, it->first.c_str(), + PyString_FromString(it->second.c_str())); + } + + PyObject *fig = + PyObject_CallObject(detail::_interpreter::get().s_python_function_figure, + detail::_interpreter::get().s_python_empty_tuple); + if (!fig) throw std::runtime_error("Call to figure() failed."); + + PyObject *gca_kwargs = PyDict_New(); + PyDict_SetItemString(gca_kwargs, "projection", PyString_FromString("3d")); + + PyObject *gca = PyObject_GetAttrString(fig, "gca"); + if (!gca) throw std::runtime_error("No gca"); + Py_INCREF(gca); + PyObject *axis = PyObject_Call( + gca, detail::_interpreter::get().s_python_empty_tuple, gca_kwargs); + + if (!axis) throw std::runtime_error("No axis"); + Py_INCREF(axis); + + Py_DECREF(gca); + Py_DECREF(gca_kwargs); + + PyObject *plot3 = PyObject_GetAttrString(axis, "plot"); + if (!plot3) throw std::runtime_error("No 3D line plot"); + Py_INCREF(plot3); + PyObject *res = PyObject_Call(plot3, args, kwargs); + if (!res) throw std::runtime_error("Failed 3D line plot"); + Py_DECREF(plot3); + + Py_DECREF(axis); + Py_DECREF(args); + Py_DECREF(kwargs); + if (res) Py_DECREF(res); +} + +template +bool stem(const std::vector &x, const std::vector &y, const std::map& keywords) +{ + assert(x.size() == y.size()); + + detail::_interpreter::get(); + + // using numpy arrays + PyObject* xarray = detail::get_array(x); + PyObject* yarray = detail::get_array(y); + + // construct positional args + PyObject* args = PyTuple_New(2); + PyTuple_SetItem(args, 0, xarray); + PyTuple_SetItem(args, 1, yarray); + + // construct keyword args + PyObject* kwargs = PyDict_New(); + for (std::map::const_iterator it = + keywords.begin(); it != keywords.end(); ++it) { + PyDict_SetItemString(kwargs, it->first.c_str(), + PyString_FromString(it->second.c_str())); + } + + PyObject* res = PyObject_Call( + detail::_interpreter::get().s_python_function_stem, args, kwargs); + + Py_DECREF(args); + Py_DECREF(kwargs); + if (res) + Py_DECREF(res); + + return res; +} + +template< typename Numeric > +bool fill(const std::vector& x, const std::vector& y, const std::map& keywords) +{ + assert(x.size() == y.size()); + + detail::_interpreter::get(); + + // using numpy arrays + PyObject* xarray = detail::get_array(x); + PyObject* yarray = detail::get_array(y); + + // construct positional args + PyObject* args = PyTuple_New(2); + PyTuple_SetItem(args, 0, xarray); + PyTuple_SetItem(args, 1, yarray); + + // construct keyword args + PyObject* kwargs = PyDict_New(); + for (auto it = keywords.begin(); it != keywords.end(); ++it) { + PyDict_SetItemString(kwargs, it->first.c_str(), PyUnicode_FromString(it->second.c_str())); + } + + PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_fill, args, kwargs); + + Py_DECREF(args); + Py_DECREF(kwargs); + + if (res) Py_DECREF(res); + + return res; +} + +template< typename Numeric > +bool fill_between(const std::vector& x, const std::vector& y1, const std::vector& y2, const std::map& keywords) +{ + assert(x.size() == y1.size()); + assert(x.size() == y2.size()); + + detail::_interpreter::get(); + + // using numpy arrays + PyObject* xarray = detail::get_array(x); + PyObject* y1array = detail::get_array(y1); + PyObject* y2array = detail::get_array(y2); + + // construct positional args + PyObject* args = PyTuple_New(3); + PyTuple_SetItem(args, 0, xarray); + PyTuple_SetItem(args, 1, y1array); + PyTuple_SetItem(args, 2, y2array); + + // construct keyword args + PyObject* kwargs = PyDict_New(); + for(std::map::const_iterator it = keywords.begin(); it != keywords.end(); ++it) { + PyDict_SetItemString(kwargs, it->first.c_str(), PyUnicode_FromString(it->second.c_str())); + } + + PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_fill_between, args, kwargs); + + Py_DECREF(args); + Py_DECREF(kwargs); + if(res) Py_DECREF(res); + + return res; +} + +template +bool arrow(Numeric x, Numeric y, Numeric end_x, Numeric end_y, const std::string& fc = "r", + const std::string ec = "k", Numeric head_length = 0.25, Numeric head_width = 0.1625) { + PyObject* obj_x = PyFloat_FromDouble(x); + PyObject* obj_y = PyFloat_FromDouble(y); + PyObject* obj_end_x = PyFloat_FromDouble(end_x); + PyObject* obj_end_y = PyFloat_FromDouble(end_y); + + PyObject* kwargs = PyDict_New(); + PyDict_SetItemString(kwargs, "fc", PyString_FromString(fc.c_str())); + PyDict_SetItemString(kwargs, "ec", PyString_FromString(ec.c_str())); + PyDict_SetItemString(kwargs, "head_width", PyFloat_FromDouble(head_width)); + PyDict_SetItemString(kwargs, "head_length", PyFloat_FromDouble(head_length)); + + PyObject* plot_args = PyTuple_New(4); + PyTuple_SetItem(plot_args, 0, obj_x); + PyTuple_SetItem(plot_args, 1, obj_y); + PyTuple_SetItem(plot_args, 2, obj_end_x); + PyTuple_SetItem(plot_args, 3, obj_end_y); + + PyObject* res = + PyObject_Call(detail::_interpreter::get().s_python_function_arrow, plot_args, kwargs); + + Py_DECREF(plot_args); + Py_DECREF(kwargs); + if (res) + Py_DECREF(res); + + return res; +} + +template< typename Numeric> +bool hist(const std::vector& y, long bins=10,std::string color="b", + double alpha=1.0, bool cumulative=false) +{ + detail::_interpreter::get(); + + PyObject* yarray = detail::get_array(y); + + PyObject* kwargs = PyDict_New(); + PyDict_SetItemString(kwargs, "bins", PyLong_FromLong(bins)); + PyDict_SetItemString(kwargs, "color", PyString_FromString(color.c_str())); + PyDict_SetItemString(kwargs, "alpha", PyFloat_FromDouble(alpha)); + PyDict_SetItemString(kwargs, "cumulative", cumulative ? Py_True : Py_False); + + PyObject* plot_args = PyTuple_New(1); + + PyTuple_SetItem(plot_args, 0, yarray); + + + PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_hist, plot_args, kwargs); + + + Py_DECREF(plot_args); + Py_DECREF(kwargs); + if(res) Py_DECREF(res); + + return res; +} + +#ifndef WITHOUT_NUMPY +namespace detail { + +inline void imshow(void *ptr, const NPY_TYPES type, const int rows, const int columns, const int colors, const std::map &keywords, PyObject** out) +{ + assert(type == NPY_UINT8 || type == NPY_FLOAT); + assert(colors == 1 || colors == 3 || colors == 4); + + detail::_interpreter::get(); + + // construct args + npy_intp dims[3] = { rows, columns, colors }; + PyObject *args = PyTuple_New(1); + PyTuple_SetItem(args, 0, PyArray_SimpleNewFromData(colors == 1 ? 2 : 3, dims, type, ptr)); + + // construct keyword args + PyObject* kwargs = PyDict_New(); + for(std::map::const_iterator it = keywords.begin(); it != keywords.end(); ++it) + { + PyDict_SetItemString(kwargs, it->first.c_str(), PyUnicode_FromString(it->second.c_str())); + } + + PyObject *res = PyObject_Call(detail::_interpreter::get().s_python_function_imshow, args, kwargs); + Py_DECREF(args); + Py_DECREF(kwargs); + if (!res) + throw std::runtime_error("Call to imshow() failed"); + if (out) + *out = res; + else + Py_DECREF(res); +} + +} // namespace detail + +inline void imshow(const unsigned char *ptr, const int rows, const int columns, const int colors, const std::map &keywords = {}, PyObject** out = nullptr) +{ + detail::imshow((void *) ptr, NPY_UINT8, rows, columns, colors, keywords, out); +} + +inline void imshow(const float *ptr, const int rows, const int columns, const int colors, const std::map &keywords = {}, PyObject** out = nullptr) +{ + detail::imshow((void *) ptr, NPY_FLOAT, rows, columns, colors, keywords, out); +} + +#ifdef WITH_OPENCV +void imshow(const cv::Mat &image, const std::map &keywords = {}) +{ + // Convert underlying type of matrix, if needed + cv::Mat image2; + NPY_TYPES npy_type = NPY_UINT8; + switch (image.type() & CV_MAT_DEPTH_MASK) { + case CV_8U: + image2 = image; + break; + case CV_32F: + image2 = image; + npy_type = NPY_FLOAT; + break; + default: + image.convertTo(image2, CV_MAKETYPE(CV_8U, image.channels())); + } + + // If color image, convert from BGR to RGB + switch (image2.channels()) { + case 3: + cv::cvtColor(image2, image2, CV_BGR2RGB); + break; + case 4: + cv::cvtColor(image2, image2, CV_BGRA2RGBA); + } + + detail::imshow(image2.data, npy_type, image2.rows, image2.cols, image2.channels(), keywords); +} +#endif // WITH_OPENCV +#endif // WITHOUT_NUMPY + +template +bool scatter(const std::vector& x, + const std::vector& y, + const double s=1.0, // The marker size in points**2 + const std::map & keywords = {}) +{ + detail::_interpreter::get(); + + assert(x.size() == y.size()); + + PyObject* xarray = detail::get_array(x); + PyObject* yarray = detail::get_array(y); + + PyObject* kwargs = PyDict_New(); + PyDict_SetItemString(kwargs, "s", PyLong_FromLong(s)); + for (const auto& it : keywords) + { + PyDict_SetItemString(kwargs, it.first.c_str(), PyString_FromString(it.second.c_str())); + } + + PyObject* plot_args = PyTuple_New(2); + PyTuple_SetItem(plot_args, 0, xarray); + PyTuple_SetItem(plot_args, 1, yarray); + + PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_scatter, plot_args, kwargs); + + Py_DECREF(plot_args); + Py_DECREF(kwargs); + if(res) Py_DECREF(res); + + return res; +} + +template +bool boxplot(const std::vector>& data, + const std::vector& labels = {}, + const std::map & keywords = {}) +{ + detail::_interpreter::get(); + + PyObject* listlist = detail::get_listlist(data); + PyObject* args = PyTuple_New(1); + PyTuple_SetItem(args, 0, listlist); + + PyObject* kwargs = PyDict_New(); + + // kwargs needs the labels, if there are (the correct number of) labels + if (!labels.empty() && labels.size() == data.size()) { + PyDict_SetItemString(kwargs, "labels", detail::get_array(labels)); + } + + // take care of the remaining keywords + for (const auto& it : keywords) + { + PyDict_SetItemString(kwargs, it.first.c_str(), PyString_FromString(it.second.c_str())); + } + + PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_boxplot, args, kwargs); + + Py_DECREF(args); + Py_DECREF(kwargs); + + if(res) Py_DECREF(res); + + return res; +} + +template +bool boxplot(const std::vector& data, + const std::map & keywords = {}) +{ + detail::_interpreter::get(); + + PyObject* vector = detail::get_array(data); + PyObject* args = PyTuple_New(1); + PyTuple_SetItem(args, 0, vector); + + PyObject* kwargs = PyDict_New(); + for (const auto& it : keywords) + { + PyDict_SetItemString(kwargs, it.first.c_str(), PyString_FromString(it.second.c_str())); + } + + PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_boxplot, args, kwargs); + + Py_DECREF(args); + Py_DECREF(kwargs); + + if(res) Py_DECREF(res); + + return res; +} + +template +bool bar(const std::vector & x, + const std::vector & y, + std::string ec = "black", + std::string ls = "-", + double lw = 1.0, + const std::map & keywords = {}) +{ + detail::_interpreter::get(); + + PyObject * xarray = detail::get_array(x); + PyObject * yarray = detail::get_array(y); + + PyObject * kwargs = PyDict_New(); + + PyDict_SetItemString(kwargs, "ec", PyString_FromString(ec.c_str())); + PyDict_SetItemString(kwargs, "ls", PyString_FromString(ls.c_str())); + PyDict_SetItemString(kwargs, "lw", PyFloat_FromDouble(lw)); + + for (std::map::const_iterator it = + keywords.begin(); + it != keywords.end(); + ++it) { + PyDict_SetItemString( + kwargs, it->first.c_str(), PyUnicode_FromString(it->second.c_str())); + } + + PyObject * plot_args = PyTuple_New(2); + PyTuple_SetItem(plot_args, 0, xarray); + PyTuple_SetItem(plot_args, 1, yarray); + + PyObject * res = PyObject_Call( + detail::_interpreter::get().s_python_function_bar, plot_args, kwargs); + + Py_DECREF(plot_args); + Py_DECREF(kwargs); + if (res) Py_DECREF(res); + + return res; +} + +template +bool bar(const std::vector & y, + std::string ec = "black", + std::string ls = "-", + double lw = 1.0, + const std::map & keywords = {}) +{ + using T = typename std::remove_reference::type::value_type; + + detail::_interpreter::get(); + + std::vector x; + for (std::size_t i = 0; i < y.size(); i++) { x.push_back(i); } + + return bar(x, y, ec, ls, lw, keywords); +} + +inline bool subplots_adjust(const std::map& keywords = {}) +{ + detail::_interpreter::get(); + + PyObject* kwargs = PyDict_New(); + for (std::map::const_iterator it = + keywords.begin(); it != keywords.end(); ++it) { + PyDict_SetItemString(kwargs, it->first.c_str(), + PyFloat_FromDouble(it->second)); + } + + + PyObject* plot_args = PyTuple_New(0); + + PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_subplots_adjust, plot_args, kwargs); + + Py_DECREF(plot_args); + Py_DECREF(kwargs); + if(res) Py_DECREF(res); + + return res; +} + +template< typename Numeric> +bool named_hist(std::string label,const std::vector& y, long bins=10, std::string color="b", double alpha=1.0) +{ + detail::_interpreter::get(); + + PyObject* yarray = detail::get_array(y); + + PyObject* kwargs = PyDict_New(); + PyDict_SetItemString(kwargs, "label", PyString_FromString(label.c_str())); + PyDict_SetItemString(kwargs, "bins", PyLong_FromLong(bins)); + PyDict_SetItemString(kwargs, "color", PyString_FromString(color.c_str())); + PyDict_SetItemString(kwargs, "alpha", PyFloat_FromDouble(alpha)); + + + PyObject* plot_args = PyTuple_New(1); + PyTuple_SetItem(plot_args, 0, yarray); + + PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_hist, plot_args, kwargs); + + Py_DECREF(plot_args); + Py_DECREF(kwargs); + if(res) Py_DECREF(res); + + return res; +} + +template +bool plot(const std::vector& x, const std::vector& y, const std::string& s = "") +{ + assert(x.size() == y.size()); + + detail::_interpreter::get(); + + PyObject* xarray = detail::get_array(x); + PyObject* yarray = detail::get_array(y); + + PyObject* pystring = PyString_FromString(s.c_str()); + + PyObject* plot_args = PyTuple_New(3); + PyTuple_SetItem(plot_args, 0, xarray); + PyTuple_SetItem(plot_args, 1, yarray); + PyTuple_SetItem(plot_args, 2, pystring); + + PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_plot, plot_args); + + Py_DECREF(plot_args); + if(res) Py_DECREF(res); + + return res; +} + +template +bool contour(const std::vector& x, const std::vector& y, + const std::vector& z, + const std::map& keywords = {}) { + assert(x.size() == y.size() && x.size() == z.size()); + + PyObject* xarray = get_array(x); + PyObject* yarray = get_array(y); + PyObject* zarray = get_array(z); + + PyObject* plot_args = PyTuple_New(3); + PyTuple_SetItem(plot_args, 0, xarray); + PyTuple_SetItem(plot_args, 1, yarray); + PyTuple_SetItem(plot_args, 2, zarray); + + // construct keyword args + PyObject* kwargs = PyDict_New(); + for (std::map::const_iterator it = keywords.begin(); + it != keywords.end(); ++it) { + PyDict_SetItemString(kwargs, it->first.c_str(), PyUnicode_FromString(it->second.c_str())); + } + + PyObject* res = + PyObject_Call(detail::_interpreter::get().s_python_function_contour, plot_args, kwargs); + + Py_DECREF(kwargs); + Py_DECREF(plot_args); + if (res) + Py_DECREF(res); + + return res; +} + +template +bool quiver(const std::vector& x, const std::vector& y, const std::vector& u, const std::vector& w, const std::map& keywords = {}) +{ + assert(x.size() == y.size() && x.size() == u.size() && u.size() == w.size()); + + detail::_interpreter::get(); + + PyObject* xarray = detail::get_array(x); + PyObject* yarray = detail::get_array(y); + PyObject* uarray = detail::get_array(u); + PyObject* warray = detail::get_array(w); + + PyObject* plot_args = PyTuple_New(4); + PyTuple_SetItem(plot_args, 0, xarray); + PyTuple_SetItem(plot_args, 1, yarray); + PyTuple_SetItem(plot_args, 2, uarray); + PyTuple_SetItem(plot_args, 3, warray); + + // construct keyword args + PyObject* kwargs = PyDict_New(); + for(std::map::const_iterator it = keywords.begin(); it != keywords.end(); ++it) + { + PyDict_SetItemString(kwargs, it->first.c_str(), PyUnicode_FromString(it->second.c_str())); + } + + PyObject* res = PyObject_Call( + detail::_interpreter::get().s_python_function_quiver, plot_args, kwargs); + + Py_DECREF(kwargs); + Py_DECREF(plot_args); + if (res) + Py_DECREF(res); + + return res; +} + +template +bool stem(const std::vector& x, const std::vector& y, const std::string& s = "") +{ + assert(x.size() == y.size()); + + detail::_interpreter::get(); + + PyObject* xarray = detail::get_array(x); + PyObject* yarray = detail::get_array(y); + + PyObject* pystring = PyString_FromString(s.c_str()); + + PyObject* plot_args = PyTuple_New(3); + PyTuple_SetItem(plot_args, 0, xarray); + PyTuple_SetItem(plot_args, 1, yarray); + PyTuple_SetItem(plot_args, 2, pystring); + + PyObject* res = PyObject_CallObject( + detail::_interpreter::get().s_python_function_stem, plot_args); + + Py_DECREF(plot_args); + if (res) + Py_DECREF(res); + + return res; +} + +template +bool semilogx(const std::vector& x, const std::vector& y, const std::string& s = "") +{ + assert(x.size() == y.size()); + + detail::_interpreter::get(); + + PyObject* xarray = detail::get_array(x); + PyObject* yarray = detail::get_array(y); + + PyObject* pystring = PyString_FromString(s.c_str()); + + PyObject* plot_args = PyTuple_New(3); + PyTuple_SetItem(plot_args, 0, xarray); + PyTuple_SetItem(plot_args, 1, yarray); + PyTuple_SetItem(plot_args, 2, pystring); + + PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_semilogx, plot_args); + + Py_DECREF(plot_args); + if(res) Py_DECREF(res); + + return res; +} + +template +bool semilogy(const std::vector& x, const std::vector& y, const std::string& s = "") +{ + assert(x.size() == y.size()); + + detail::_interpreter::get(); + + PyObject* xarray = detail::get_array(x); + PyObject* yarray = detail::get_array(y); + + PyObject* pystring = PyString_FromString(s.c_str()); + + PyObject* plot_args = PyTuple_New(3); + PyTuple_SetItem(plot_args, 0, xarray); + PyTuple_SetItem(plot_args, 1, yarray); + PyTuple_SetItem(plot_args, 2, pystring); + + PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_semilogy, plot_args); + + Py_DECREF(plot_args); + if(res) Py_DECREF(res); + + return res; +} + +template +bool loglog(const std::vector& x, const std::vector& y, const std::string& s = "") +{ + assert(x.size() == y.size()); + + detail::_interpreter::get(); + + PyObject* xarray = detail::get_array(x); + PyObject* yarray = detail::get_array(y); + + PyObject* pystring = PyString_FromString(s.c_str()); + + PyObject* plot_args = PyTuple_New(3); + PyTuple_SetItem(plot_args, 0, xarray); + PyTuple_SetItem(plot_args, 1, yarray); + PyTuple_SetItem(plot_args, 2, pystring); + + PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_loglog, plot_args); + + Py_DECREF(plot_args); + if(res) Py_DECREF(res); + + return res; +} + +template +bool errorbar(const std::vector &x, const std::vector &y, const std::vector &yerr, const std::map &keywords = {}) +{ + assert(x.size() == y.size()); + + detail::_interpreter::get(); + + PyObject* xarray = detail::get_array(x); + PyObject* yarray = detail::get_array(y); + PyObject* yerrarray = detail::get_array(yerr); + + // construct keyword args + PyObject* kwargs = PyDict_New(); + for(std::map::const_iterator it = keywords.begin(); it != keywords.end(); ++it) + { + PyDict_SetItemString(kwargs, it->first.c_str(), PyString_FromString(it->second.c_str())); + } + + PyDict_SetItemString(kwargs, "yerr", yerrarray); + + PyObject *plot_args = PyTuple_New(2); + PyTuple_SetItem(plot_args, 0, xarray); + PyTuple_SetItem(plot_args, 1, yarray); + + PyObject *res = PyObject_Call(detail::_interpreter::get().s_python_function_errorbar, plot_args, kwargs); + + Py_DECREF(kwargs); + Py_DECREF(plot_args); + + if (res) + Py_DECREF(res); + else + throw std::runtime_error("Call to errorbar() failed."); + + return res; +} + +template +bool named_plot(const std::string& name, const std::vector& y, const std::string& format = "") +{ + detail::_interpreter::get(); + + PyObject* kwargs = PyDict_New(); + PyDict_SetItemString(kwargs, "label", PyString_FromString(name.c_str())); + + PyObject* yarray = detail::get_array(y); + + PyObject* pystring = PyString_FromString(format.c_str()); + + PyObject* plot_args = PyTuple_New(2); + + PyTuple_SetItem(plot_args, 0, yarray); + PyTuple_SetItem(plot_args, 1, pystring); + + PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_plot, plot_args, kwargs); + + Py_DECREF(kwargs); + Py_DECREF(plot_args); + if (res) Py_DECREF(res); + + return res; +} + +template +bool named_plot(const std::string& name, const std::vector& x, const std::vector& y, const std::string& format = "") +{ + detail::_interpreter::get(); + + PyObject* kwargs = PyDict_New(); + PyDict_SetItemString(kwargs, "label", PyString_FromString(name.c_str())); + + PyObject* xarray = detail::get_array(x); + PyObject* yarray = detail::get_array(y); + + PyObject* pystring = PyString_FromString(format.c_str()); + + PyObject* plot_args = PyTuple_New(3); + PyTuple_SetItem(plot_args, 0, xarray); + PyTuple_SetItem(plot_args, 1, yarray); + PyTuple_SetItem(plot_args, 2, pystring); + + PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_plot, plot_args, kwargs); + + Py_DECREF(kwargs); + Py_DECREF(plot_args); + if (res) Py_DECREF(res); + + return res; +} + +template +bool named_semilogx(const std::string& name, const std::vector& x, const std::vector& y, const std::string& format = "") +{ + detail::_interpreter::get(); + + PyObject* kwargs = PyDict_New(); + PyDict_SetItemString(kwargs, "label", PyString_FromString(name.c_str())); + + PyObject* xarray = detail::get_array(x); + PyObject* yarray = detail::get_array(y); + + PyObject* pystring = PyString_FromString(format.c_str()); + + PyObject* plot_args = PyTuple_New(3); + PyTuple_SetItem(plot_args, 0, xarray); + PyTuple_SetItem(plot_args, 1, yarray); + PyTuple_SetItem(plot_args, 2, pystring); + + PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_semilogx, plot_args, kwargs); + + Py_DECREF(kwargs); + Py_DECREF(plot_args); + if (res) Py_DECREF(res); + + return res; +} + +template +bool named_semilogy(const std::string& name, const std::vector& x, const std::vector& y, const std::string& format = "") +{ + detail::_interpreter::get(); + + PyObject* kwargs = PyDict_New(); + PyDict_SetItemString(kwargs, "label", PyString_FromString(name.c_str())); + + PyObject* xarray = detail::get_array(x); + PyObject* yarray = detail::get_array(y); + + PyObject* pystring = PyString_FromString(format.c_str()); + + PyObject* plot_args = PyTuple_New(3); + PyTuple_SetItem(plot_args, 0, xarray); + PyTuple_SetItem(plot_args, 1, yarray); + PyTuple_SetItem(plot_args, 2, pystring); + + PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_semilogy, plot_args, kwargs); + + Py_DECREF(kwargs); + Py_DECREF(plot_args); + if (res) Py_DECREF(res); + + return res; +} + +template +bool named_loglog(const std::string& name, const std::vector& x, const std::vector& y, const std::string& format = "") +{ + detail::_interpreter::get(); + + PyObject* kwargs = PyDict_New(); + PyDict_SetItemString(kwargs, "label", PyString_FromString(name.c_str())); + + PyObject* xarray = detail::get_array(x); + PyObject* yarray = detail::get_array(y); + + PyObject* pystring = PyString_FromString(format.c_str()); + + PyObject* plot_args = PyTuple_New(3); + PyTuple_SetItem(plot_args, 0, xarray); + PyTuple_SetItem(plot_args, 1, yarray); + PyTuple_SetItem(plot_args, 2, pystring); + PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_loglog, plot_args, kwargs); + + Py_DECREF(kwargs); + Py_DECREF(plot_args); + if (res) Py_DECREF(res); + + return res; +} + +template +bool plot(const std::vector& y, const std::string& format = "") +{ + std::vector x(y.size()); + for(size_t i=0; i +bool plot(const std::vector& y, const std::map& keywords) +{ + std::vector x(y.size()); + for(size_t i=0; i +bool stem(const std::vector& y, const std::string& format = "") +{ + std::vector x(y.size()); + for (size_t i = 0; i < x.size(); ++i) x.at(i) = i; + return stem(x, y, format); +} + +template +void text(Numeric x, Numeric y, const std::string& s = "") +{ + detail::_interpreter::get(); + + PyObject* args = PyTuple_New(3); + PyTuple_SetItem(args, 0, PyFloat_FromDouble(x)); + PyTuple_SetItem(args, 1, PyFloat_FromDouble(y)); + PyTuple_SetItem(args, 2, PyString_FromString(s.c_str())); + + PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_text, args); + if(!res) throw std::runtime_error("Call to text() failed."); + + Py_DECREF(args); + Py_DECREF(res); +} + +inline void colorbar(PyObject* mappable = NULL, const std::map& keywords = {}) +{ + if (mappable == NULL) + throw std::runtime_error("Must call colorbar with PyObject* returned from an image, contour, surface, etc."); + + detail::_interpreter::get(); + + PyObject* args = PyTuple_New(1); + PyTuple_SetItem(args, 0, mappable); + + PyObject* kwargs = PyDict_New(); + for(std::map::const_iterator it = keywords.begin(); it != keywords.end(); ++it) + { + PyDict_SetItemString(kwargs, it->first.c_str(), PyFloat_FromDouble(it->second)); + } + + PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_colorbar, args, kwargs); + if(!res) throw std::runtime_error("Call to colorbar() failed."); + + Py_DECREF(args); + Py_DECREF(kwargs); + Py_DECREF(res); +} + + +inline long figure(long number = -1) +{ + detail::_interpreter::get(); + + PyObject *res; + if (number == -1) + res = PyObject_CallObject(detail::_interpreter::get().s_python_function_figure, detail::_interpreter::get().s_python_empty_tuple); + else { + assert(number > 0); + + // Make sure interpreter is initialised + detail::_interpreter::get(); + + PyObject *args = PyTuple_New(1); + PyTuple_SetItem(args, 0, PyLong_FromLong(number)); + res = PyObject_CallObject(detail::_interpreter::get().s_python_function_figure, args); + Py_DECREF(args); + } + + if(!res) throw std::runtime_error("Call to figure() failed."); + + PyObject* num = PyObject_GetAttrString(res, "number"); + if (!num) throw std::runtime_error("Could not get number attribute of figure object"); + const long figureNumber = PyLong_AsLong(num); + + Py_DECREF(num); + Py_DECREF(res); + + return figureNumber; +} + +inline bool fignum_exists(long number) +{ + detail::_interpreter::get(); + + PyObject *args = PyTuple_New(1); + PyTuple_SetItem(args, 0, PyLong_FromLong(number)); + PyObject *res = PyObject_CallObject(detail::_interpreter::get().s_python_function_fignum_exists, args); + if(!res) throw std::runtime_error("Call to fignum_exists() failed."); + + bool ret = PyObject_IsTrue(res); + Py_DECREF(res); + Py_DECREF(args); + + return ret; +} + +inline void figure_size(size_t w, size_t h) +{ + detail::_interpreter::get(); + + const size_t dpi = 100; + PyObject* size = PyTuple_New(2); + PyTuple_SetItem(size, 0, PyFloat_FromDouble((double)w / dpi)); + PyTuple_SetItem(size, 1, PyFloat_FromDouble((double)h / dpi)); + + PyObject* kwargs = PyDict_New(); + PyDict_SetItemString(kwargs, "figsize", size); + PyDict_SetItemString(kwargs, "dpi", PyLong_FromSize_t(dpi)); + + PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_figure, + detail::_interpreter::get().s_python_empty_tuple, kwargs); + + Py_DECREF(kwargs); + + if(!res) throw std::runtime_error("Call to figure_size() failed."); + Py_DECREF(res); +} + +inline void legend() +{ + detail::_interpreter::get(); + + PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_legend, detail::_interpreter::get().s_python_empty_tuple); + if(!res) throw std::runtime_error("Call to legend() failed."); + + Py_DECREF(res); +} + +inline void legend(const std::map& keywords) +{ + detail::_interpreter::get(); + + // construct keyword args + PyObject* kwargs = PyDict_New(); + for(std::map::const_iterator it = keywords.begin(); it != keywords.end(); ++it) + { + PyDict_SetItemString(kwargs, it->first.c_str(), PyString_FromString(it->second.c_str())); + } + + PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_legend, detail::_interpreter::get().s_python_empty_tuple, kwargs); + if(!res) throw std::runtime_error("Call to legend() failed."); + + Py_DECREF(kwargs); + Py_DECREF(res); +} + +template +void ylim(Numeric left, Numeric right) +{ + detail::_interpreter::get(); + + PyObject* list = PyList_New(2); + PyList_SetItem(list, 0, PyFloat_FromDouble(left)); + PyList_SetItem(list, 1, PyFloat_FromDouble(right)); + + PyObject* args = PyTuple_New(1); + PyTuple_SetItem(args, 0, list); + + PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_ylim, args); + if(!res) throw std::runtime_error("Call to ylim() failed."); + + Py_DECREF(args); + Py_DECREF(res); +} + +template +void xlim(Numeric left, Numeric right) +{ + detail::_interpreter::get(); + + PyObject* list = PyList_New(2); + PyList_SetItem(list, 0, PyFloat_FromDouble(left)); + PyList_SetItem(list, 1, PyFloat_FromDouble(right)); + + PyObject* args = PyTuple_New(1); + PyTuple_SetItem(args, 0, list); + + PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_xlim, args); + if(!res) throw std::runtime_error("Call to xlim() failed."); + + Py_DECREF(args); + Py_DECREF(res); +} + + +inline double* xlim() +{ + detail::_interpreter::get(); + + PyObject* args = PyTuple_New(0); + PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_xlim, args); + PyObject* left = PyTuple_GetItem(res,0); + PyObject* right = PyTuple_GetItem(res,1); + + double* arr = new double[2]; + arr[0] = PyFloat_AsDouble(left); + arr[1] = PyFloat_AsDouble(right); + + if(!res) throw std::runtime_error("Call to xlim() failed."); + + Py_DECREF(res); + return arr; +} + + +inline double* ylim() +{ + detail::_interpreter::get(); + + PyObject* args = PyTuple_New(0); + PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_ylim, args); + PyObject* left = PyTuple_GetItem(res,0); + PyObject* right = PyTuple_GetItem(res,1); + + double* arr = new double[2]; + arr[0] = PyFloat_AsDouble(left); + arr[1] = PyFloat_AsDouble(right); + + if(!res) throw std::runtime_error("Call to ylim() failed."); + + Py_DECREF(res); + return arr; +} + +template +inline void xticks(const std::vector &ticks, const std::vector &labels = {}, const std::map& keywords = {}) +{ + assert(labels.size() == 0 || ticks.size() == labels.size()); + + detail::_interpreter::get(); + + // using numpy array + PyObject* ticksarray = detail::get_array(ticks); + + PyObject* args; + if(labels.size() == 0) { + // construct positional args + args = PyTuple_New(1); + PyTuple_SetItem(args, 0, ticksarray); + } else { + // make tuple of tick labels + PyObject* labelstuple = PyTuple_New(labels.size()); + for (size_t i = 0; i < labels.size(); i++) + PyTuple_SetItem(labelstuple, i, PyUnicode_FromString(labels[i].c_str())); + + // construct positional args + args = PyTuple_New(2); + PyTuple_SetItem(args, 0, ticksarray); + PyTuple_SetItem(args, 1, labelstuple); + } + + // construct keyword args + PyObject* kwargs = PyDict_New(); + for(std::map::const_iterator it = keywords.begin(); it != keywords.end(); ++it) + { + PyDict_SetItemString(kwargs, it->first.c_str(), PyString_FromString(it->second.c_str())); + } + + PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_xticks, args, kwargs); + + Py_DECREF(args); + Py_DECREF(kwargs); + if(!res) throw std::runtime_error("Call to xticks() failed"); + + Py_DECREF(res); +} + +template +inline void xticks(const std::vector &ticks, const std::map& keywords) +{ + xticks(ticks, {}, keywords); +} + +template +inline void yticks(const std::vector &ticks, const std::vector &labels = {}, const std::map& keywords = {}) +{ + assert(labels.size() == 0 || ticks.size() == labels.size()); + + detail::_interpreter::get(); + + // using numpy array + PyObject* ticksarray = detail::get_array(ticks); + + PyObject* args; + if(labels.size() == 0) { + // construct positional args + args = PyTuple_New(1); + PyTuple_SetItem(args, 0, ticksarray); + } else { + // make tuple of tick labels + PyObject* labelstuple = PyTuple_New(labels.size()); + for (size_t i = 0; i < labels.size(); i++) + PyTuple_SetItem(labelstuple, i, PyUnicode_FromString(labels[i].c_str())); + + // construct positional args + args = PyTuple_New(2); + PyTuple_SetItem(args, 0, ticksarray); + PyTuple_SetItem(args, 1, labelstuple); + } + + // construct keyword args + PyObject* kwargs = PyDict_New(); + for(std::map::const_iterator it = keywords.begin(); it != keywords.end(); ++it) + { + PyDict_SetItemString(kwargs, it->first.c_str(), PyString_FromString(it->second.c_str())); + } + + PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_yticks, args, kwargs); + + Py_DECREF(args); + Py_DECREF(kwargs); + if(!res) throw std::runtime_error("Call to yticks() failed"); + + Py_DECREF(res); +} + +template +inline void yticks(const std::vector &ticks, const std::map& keywords) +{ + yticks(ticks, {}, keywords); +} + +template inline void margins(Numeric margin) +{ + // construct positional args + PyObject* args = PyTuple_New(1); + PyTuple_SetItem(args, 0, PyFloat_FromDouble(margin)); + + PyObject* res = + PyObject_CallObject(detail::_interpreter::get().s_python_function_margins, args); + if (!res) + throw std::runtime_error("Call to margins() failed."); + + Py_DECREF(args); + Py_DECREF(res); +} + +template inline void margins(Numeric margin_x, Numeric margin_y) +{ + // construct positional args + PyObject* args = PyTuple_New(2); + PyTuple_SetItem(args, 0, PyFloat_FromDouble(margin_x)); + PyTuple_SetItem(args, 1, PyFloat_FromDouble(margin_y)); + + PyObject* res = + PyObject_CallObject(detail::_interpreter::get().s_python_function_margins, args); + if (!res) + throw std::runtime_error("Call to margins() failed."); + + Py_DECREF(args); + Py_DECREF(res); +} + + +inline void tick_params(const std::map& keywords, const std::string axis = "both") +{ + detail::_interpreter::get(); + + // construct positional args + PyObject* args; + args = PyTuple_New(1); + PyTuple_SetItem(args, 0, PyString_FromString(axis.c_str())); + + // construct keyword args + PyObject* kwargs = PyDict_New(); + for (std::map::const_iterator it = keywords.begin(); it != keywords.end(); ++it) + { + PyDict_SetItemString(kwargs, it->first.c_str(), PyString_FromString(it->second.c_str())); + } + + + PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_tick_params, args, kwargs); + + Py_DECREF(args); + Py_DECREF(kwargs); + if (!res) throw std::runtime_error("Call to tick_params() failed"); + + Py_DECREF(res); +} + +inline void subplot(long nrows, long ncols, long plot_number) +{ + detail::_interpreter::get(); + + // construct positional args + PyObject* args = PyTuple_New(3); + PyTuple_SetItem(args, 0, PyFloat_FromDouble(nrows)); + PyTuple_SetItem(args, 1, PyFloat_FromDouble(ncols)); + PyTuple_SetItem(args, 2, PyFloat_FromDouble(plot_number)); + + PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_subplot, args); + if(!res) throw std::runtime_error("Call to subplot() failed."); + + Py_DECREF(args); + Py_DECREF(res); +} + +inline void subplot2grid(long nrows, long ncols, long rowid=0, long colid=0, long rowspan=1, long colspan=1) +{ + detail::_interpreter::get(); + + PyObject* shape = PyTuple_New(2); + PyTuple_SetItem(shape, 0, PyLong_FromLong(nrows)); + PyTuple_SetItem(shape, 1, PyLong_FromLong(ncols)); + + PyObject* loc = PyTuple_New(2); + PyTuple_SetItem(loc, 0, PyLong_FromLong(rowid)); + PyTuple_SetItem(loc, 1, PyLong_FromLong(colid)); + + PyObject* args = PyTuple_New(4); + PyTuple_SetItem(args, 0, shape); + PyTuple_SetItem(args, 1, loc); + PyTuple_SetItem(args, 2, PyLong_FromLong(rowspan)); + PyTuple_SetItem(args, 3, PyLong_FromLong(colspan)); + + PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_subplot2grid, args); + if(!res) throw std::runtime_error("Call to subplot2grid() failed."); + + Py_DECREF(shape); + Py_DECREF(loc); + Py_DECREF(args); + Py_DECREF(res); +} + +inline void title(const std::string &titlestr, const std::map &keywords = {}) +{ + detail::_interpreter::get(); + + PyObject* pytitlestr = PyString_FromString(titlestr.c_str()); + PyObject* args = PyTuple_New(1); + PyTuple_SetItem(args, 0, pytitlestr); + + PyObject* kwargs = PyDict_New(); + for (auto it = keywords.begin(); it != keywords.end(); ++it) { + PyDict_SetItemString(kwargs, it->first.c_str(), PyUnicode_FromString(it->second.c_str())); + } + + PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_title, args, kwargs); + if(!res) throw std::runtime_error("Call to title() failed."); + + Py_DECREF(args); + Py_DECREF(kwargs); + Py_DECREF(res); +} + +inline void suptitle(const std::string &suptitlestr, const std::map &keywords = {}) +{ + detail::_interpreter::get(); + + PyObject* pysuptitlestr = PyString_FromString(suptitlestr.c_str()); + PyObject* args = PyTuple_New(1); + PyTuple_SetItem(args, 0, pysuptitlestr); + + PyObject* kwargs = PyDict_New(); + for (auto it = keywords.begin(); it != keywords.end(); ++it) { + PyDict_SetItemString(kwargs, it->first.c_str(), PyUnicode_FromString(it->second.c_str())); + } + + PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_suptitle, args, kwargs); + if(!res) throw std::runtime_error("Call to suptitle() failed."); + + Py_DECREF(args); + Py_DECREF(kwargs); + Py_DECREF(res); +} + +inline void axis(const std::string &axisstr) +{ + detail::_interpreter::get(); + + PyObject* str = PyString_FromString(axisstr.c_str()); + PyObject* args = PyTuple_New(1); + PyTuple_SetItem(args, 0, str); + + PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_axis, args); + if(!res) throw std::runtime_error("Call to title() failed."); + + Py_DECREF(args); + Py_DECREF(res); +} + +inline void axvline(double x, double ymin = 0., double ymax = 1., const std::map& keywords = std::map()) +{ + detail::_interpreter::get(); + + // construct positional args + PyObject* args = PyTuple_New(3); + PyTuple_SetItem(args, 0, PyFloat_FromDouble(x)); + PyTuple_SetItem(args, 1, PyFloat_FromDouble(ymin)); + PyTuple_SetItem(args, 2, PyFloat_FromDouble(ymax)); + + // construct keyword args + PyObject* kwargs = PyDict_New(); + for(std::map::const_iterator it = keywords.begin(); it != keywords.end(); ++it) + { + PyDict_SetItemString(kwargs, it->first.c_str(), PyString_FromString(it->second.c_str())); + } + + PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_axvline, args, kwargs); + + Py_DECREF(args); + Py_DECREF(kwargs); + + if(res) Py_DECREF(res); +} + +inline void axvspan(double xmin, double xmax, double ymin = 0., double ymax = 1., const std::map& keywords = std::map()) +{ + // construct positional args + PyObject* args = PyTuple_New(4); + PyTuple_SetItem(args, 0, PyFloat_FromDouble(xmin)); + PyTuple_SetItem(args, 1, PyFloat_FromDouble(xmax)); + PyTuple_SetItem(args, 2, PyFloat_FromDouble(ymin)); + PyTuple_SetItem(args, 3, PyFloat_FromDouble(ymax)); + + // construct keyword args + PyObject* kwargs = PyDict_New(); + for(std::map::const_iterator it = keywords.begin(); it != keywords.end(); ++it) + { + if (it->first == "linewidth" || it->first == "alpha") + PyDict_SetItemString(kwargs, it->first.c_str(), PyFloat_FromDouble(std::stod(it->second))); + else + PyDict_SetItemString(kwargs, it->first.c_str(), PyString_FromString(it->second.c_str())); + } + + PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_axvspan, args, kwargs); + Py_DECREF(args); + Py_DECREF(kwargs); + + if(res) Py_DECREF(res); +} + +inline void xlabel(const std::string &str, const std::map &keywords = {}) +{ + detail::_interpreter::get(); + + PyObject* pystr = PyString_FromString(str.c_str()); + PyObject* args = PyTuple_New(1); + PyTuple_SetItem(args, 0, pystr); + + PyObject* kwargs = PyDict_New(); + for (auto it = keywords.begin(); it != keywords.end(); ++it) { + PyDict_SetItemString(kwargs, it->first.c_str(), PyUnicode_FromString(it->second.c_str())); + } + + PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_xlabel, args, kwargs); + if(!res) throw std::runtime_error("Call to xlabel() failed."); + + Py_DECREF(args); + Py_DECREF(kwargs); + Py_DECREF(res); +} + +inline void ylabel(const std::string &str, const std::map& keywords = {}) +{ + detail::_interpreter::get(); + + PyObject* pystr = PyString_FromString(str.c_str()); + PyObject* args = PyTuple_New(1); + PyTuple_SetItem(args, 0, pystr); + + PyObject* kwargs = PyDict_New(); + for (auto it = keywords.begin(); it != keywords.end(); ++it) { + PyDict_SetItemString(kwargs, it->first.c_str(), PyUnicode_FromString(it->second.c_str())); + } + + PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_ylabel, args, kwargs); + if(!res) throw std::runtime_error("Call to ylabel() failed."); + + Py_DECREF(args); + Py_DECREF(kwargs); + Py_DECREF(res); +} + +inline void set_zlabel(const std::string &str, const std::map& keywords = {}) +{ + detail::_interpreter::get(); + + // Same as with plot_surface: We lazily load the modules here the first time + // this function is called because I'm not sure that we can assume "matplotlib + // installed" implies "mpl_toolkits installed" on all platforms, and we don't + // want to require it for people who don't need 3d plots. + static PyObject *mpl_toolkitsmod = nullptr, *axis3dmod = nullptr; + if (!mpl_toolkitsmod) { + PyObject* mpl_toolkits = PyString_FromString("mpl_toolkits"); + PyObject* axis3d = PyString_FromString("mpl_toolkits.mplot3d"); + if (!mpl_toolkits || !axis3d) { throw std::runtime_error("couldnt create string"); } + + mpl_toolkitsmod = PyImport_Import(mpl_toolkits); + Py_DECREF(mpl_toolkits); + if (!mpl_toolkitsmod) { throw std::runtime_error("Error loading module mpl_toolkits!"); } + + axis3dmod = PyImport_Import(axis3d); + Py_DECREF(axis3d); + if (!axis3dmod) { throw std::runtime_error("Error loading module mpl_toolkits.mplot3d!"); } + } + + PyObject* pystr = PyString_FromString(str.c_str()); + PyObject* args = PyTuple_New(1); + PyTuple_SetItem(args, 0, pystr); + + PyObject* kwargs = PyDict_New(); + for (auto it = keywords.begin(); it != keywords.end(); ++it) { + PyDict_SetItemString(kwargs, it->first.c_str(), PyUnicode_FromString(it->second.c_str())); + } + + PyObject *ax = + PyObject_CallObject(detail::_interpreter::get().s_python_function_gca, + detail::_interpreter::get().s_python_empty_tuple); + if (!ax) throw std::runtime_error("Call to gca() failed."); + Py_INCREF(ax); + + PyObject *zlabel = PyObject_GetAttrString(ax, "set_zlabel"); + if (!zlabel) throw std::runtime_error("Attribute set_zlabel not found."); + Py_INCREF(zlabel); + + PyObject *res = PyObject_Call(zlabel, args, kwargs); + if (!res) throw std::runtime_error("Call to set_zlabel() failed."); + Py_DECREF(zlabel); + + Py_DECREF(ax); + Py_DECREF(args); + Py_DECREF(kwargs); + if (res) Py_DECREF(res); +} + +inline void grid(bool flag) +{ + detail::_interpreter::get(); + + PyObject* pyflag = flag ? Py_True : Py_False; + Py_INCREF(pyflag); + + PyObject* args = PyTuple_New(1); + PyTuple_SetItem(args, 0, pyflag); + + PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_grid, args); + if(!res) throw std::runtime_error("Call to grid() failed."); + + Py_DECREF(args); + Py_DECREF(res); +} + +inline void show(const bool block = true) +{ + detail::_interpreter::get(); + + PyObject* res; + if(block) + { + res = PyObject_CallObject( + detail::_interpreter::get().s_python_function_show, + detail::_interpreter::get().s_python_empty_tuple); + } + else + { + PyObject *kwargs = PyDict_New(); + PyDict_SetItemString(kwargs, "block", Py_False); + res = PyObject_Call( detail::_interpreter::get().s_python_function_show, detail::_interpreter::get().s_python_empty_tuple, kwargs); + Py_DECREF(kwargs); + } + + + if (!res) throw std::runtime_error("Call to show() failed."); + + Py_DECREF(res); +} + +inline void close() +{ + detail::_interpreter::get(); + + PyObject* res = PyObject_CallObject( + detail::_interpreter::get().s_python_function_close, + detail::_interpreter::get().s_python_empty_tuple); + + if (!res) throw std::runtime_error("Call to close() failed."); + + Py_DECREF(res); +} + +inline void xkcd() { + detail::_interpreter::get(); + + PyObject* res; + PyObject *kwargs = PyDict_New(); + + res = PyObject_Call(detail::_interpreter::get().s_python_function_xkcd, + detail::_interpreter::get().s_python_empty_tuple, kwargs); + + Py_DECREF(kwargs); + + if (!res) + throw std::runtime_error("Call to show() failed."); + + Py_DECREF(res); +} + +inline void draw() +{ + detail::_interpreter::get(); + + PyObject* res = PyObject_CallObject( + detail::_interpreter::get().s_python_function_draw, + detail::_interpreter::get().s_python_empty_tuple); + + if (!res) throw std::runtime_error("Call to draw() failed."); + + Py_DECREF(res); +} + +template +inline void pause(Numeric interval) +{ + detail::_interpreter::get(); + + PyObject* args = PyTuple_New(1); + PyTuple_SetItem(args, 0, PyFloat_FromDouble(interval)); + + PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_pause, args); + if(!res) throw std::runtime_error("Call to pause() failed."); + + Py_DECREF(args); + Py_DECREF(res); +} + +inline void save(const std::string& filename) +{ + detail::_interpreter::get(); + + PyObject* pyfilename = PyString_FromString(filename.c_str()); + + PyObject* args = PyTuple_New(1); + PyTuple_SetItem(args, 0, pyfilename); + std::cout<<"args:"<> ginput(const int numClicks = 1, const std::map& keywords = {}) +{ + detail::_interpreter::get(); + + PyObject *args = PyTuple_New(1); + PyTuple_SetItem(args, 0, PyLong_FromLong(numClicks)); + + // construct keyword args + PyObject* kwargs = PyDict_New(); + for(std::map::const_iterator it = keywords.begin(); it != keywords.end(); ++it) + { + PyDict_SetItemString(kwargs, it->first.c_str(), PyUnicode_FromString(it->second.c_str())); + } + + PyObject* res = PyObject_Call( + detail::_interpreter::get().s_python_function_ginput, args, kwargs); + + Py_DECREF(kwargs); + Py_DECREF(args); + if (!res) throw std::runtime_error("Call to ginput() failed."); + + const size_t len = PyList_Size(res); + std::vector> out; + out.reserve(len); + for (size_t i = 0; i < len; i++) { + PyObject *current = PyList_GetItem(res, i); + std::array position; + position[0] = PyFloat_AsDouble(PyTuple_GetItem(current, 0)); + position[1] = PyFloat_AsDouble(PyTuple_GetItem(current, 1)); + out.push_back(position); + } + Py_DECREF(res); + + return out; +} + +// Actually, is there any reason not to call this automatically for every plot? +inline void tight_layout() { + detail::_interpreter::get(); + + PyObject *res = PyObject_CallObject( + detail::_interpreter::get().s_python_function_tight_layout, + detail::_interpreter::get().s_python_empty_tuple); + + if (!res) throw std::runtime_error("Call to tight_layout() failed."); + + Py_DECREF(res); +} + +// Support for variadic plot() and initializer lists: + +namespace detail { + +template +using is_function = typename std::is_function>>::type; + +template +struct is_callable_impl; + +template +struct is_callable_impl +{ + typedef is_function type; +}; // a non-object is callable iff it is a function + +template +struct is_callable_impl +{ + struct Fallback { void operator()(); }; + struct Derived : T, Fallback { }; + + template struct Check; + + template + static std::true_type test( ... ); // use a variadic function to make sure (1) it accepts everything and (2) its always the worst match + + template + static std::false_type test( Check* ); + +public: + typedef decltype(test(nullptr)) type; + typedef decltype(&Fallback::operator()) dtype; + static constexpr bool value = type::value; +}; // an object is callable iff it defines operator() + +template +struct is_callable +{ + // dispatch to is_callable_impl or is_callable_impl depending on whether T is of class type or not + typedef typename is_callable_impl::value, T>::type type; +}; + +template +struct plot_impl { }; + +template<> +struct plot_impl +{ + template + bool operator()(const IterableX& x, const IterableY& y, const std::string& format) + { + // 2-phase lookup for distance, begin, end + using std::distance; + using std::begin; + using std::end; + + auto xs = distance(begin(x), end(x)); + auto ys = distance(begin(y), end(y)); + assert(xs == ys && "x and y data must have the same number of elements!"); + + PyObject* xlist = PyList_New(xs); + PyObject* ylist = PyList_New(ys); + PyObject* pystring = PyString_FromString(format.c_str()); + + auto itx = begin(x), ity = begin(y); + for(size_t i = 0; i < xs; ++i) { + PyList_SetItem(xlist, i, PyFloat_FromDouble(*itx++)); + PyList_SetItem(ylist, i, PyFloat_FromDouble(*ity++)); + } + + PyObject* plot_args = PyTuple_New(3); + PyTuple_SetItem(plot_args, 0, xlist); + PyTuple_SetItem(plot_args, 1, ylist); + PyTuple_SetItem(plot_args, 2, pystring); + + PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_plot, plot_args); + + Py_DECREF(plot_args); + if(res) Py_DECREF(res); + + return res; + } +}; + +template<> +struct plot_impl +{ + template + bool operator()(const Iterable& ticks, const Callable& f, const std::string& format) + { + if(begin(ticks) == end(ticks)) return true; + + // We could use additional meta-programming to deduce the correct element type of y, + // but all values have to be convertible to double anyways + std::vector y; + for(auto x : ticks) y.push_back(f(x)); + return plot_impl()(ticks,y,format); + } +}; + +} // end namespace detail + +// recursion stop for the above +template +bool plot() { return true; } + +template +bool plot(const A& a, const B& b, const std::string& format, Args... args) +{ + return detail::plot_impl::type>()(a,b,format) && plot(args...); +} + +/* + * This group of plot() functions is needed to support initializer lists, i.e. calling + * plot( {1,2,3,4} ) + */ +inline bool plot(const std::vector& x, const std::vector& y, const std::string& format = "") { + return plot(x,y,format); +} + +inline bool plot(const std::vector& y, const std::string& format = "") { + return plot(y,format); +} + +inline bool plot(const std::vector& x, const std::vector& y, const std::map& keywords) { + return plot(x,y,keywords); +} + +/* + * This class allows dynamic plots, ie changing the plotted data without clearing and re-plotting + */ +class Plot +{ +public: + // default initialization with plot label, some data and format + template + Plot(const std::string& name, const std::vector& x, const std::vector& y, const std::string& format = "") { + detail::_interpreter::get(); + + assert(x.size() == y.size()); + + PyObject* kwargs = PyDict_New(); + if(name != "") + PyDict_SetItemString(kwargs, "label", PyString_FromString(name.c_str())); + + PyObject* xarray = detail::get_array(x); + PyObject* yarray = detail::get_array(y); + + PyObject* pystring = PyString_FromString(format.c_str()); + + PyObject* plot_args = PyTuple_New(3); + PyTuple_SetItem(plot_args, 0, xarray); + PyTuple_SetItem(plot_args, 1, yarray); + PyTuple_SetItem(plot_args, 2, pystring); + + PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_plot, plot_args, kwargs); + + Py_DECREF(kwargs); + Py_DECREF(plot_args); + + if(res) + { + line= PyList_GetItem(res, 0); + + if(line) + set_data_fct = PyObject_GetAttrString(line,"set_data"); + else + Py_DECREF(line); + Py_DECREF(res); + } + } + + // shorter initialization with name or format only + // basically calls line, = plot([], []) + Plot(const std::string& name = "", const std::string& format = "") + : Plot(name, std::vector(), std::vector(), format) {} + + template + bool update(const std::vector& x, const std::vector& y) { + assert(x.size() == y.size()); + if(set_data_fct) + { + PyObject* xarray = detail::get_array(x); + PyObject* yarray = detail::get_array(y); + + PyObject* plot_args = PyTuple_New(2); + PyTuple_SetItem(plot_args, 0, xarray); + PyTuple_SetItem(plot_args, 1, yarray); + + PyObject* res = PyObject_CallObject(set_data_fct, plot_args); + if (res) Py_DECREF(res); + return res; + } + return false; + } + + // clears the plot but keep it available + bool clear() { + return update(std::vector(), std::vector()); + } + + // definitely remove this line + void remove() { + if(line) + { + auto remove_fct = PyObject_GetAttrString(line,"remove"); + PyObject* args = PyTuple_New(0); + PyObject* res = PyObject_CallObject(remove_fct, args); + if (res) Py_DECREF(res); + } + decref(); + } + + ~Plot() { + decref(); + } +private: + + void decref() { + if(line) + Py_DECREF(line); + if(set_data_fct) + Py_DECREF(set_data_fct); + } + + + PyObject* line = nullptr; + PyObject* set_data_fct = nullptr; +}; + +} // end namespace matplotlibcpp diff --git a/include/so3_math.h b/include/so3_math.h new file mode 100755 index 0000000..f91d8a6 --- /dev/null +++ b/include/so3_math.h @@ -0,0 +1,128 @@ +#ifndef SO3_MATH_H +#define SO3_MATH_H + +#include +#include + +// #include + +#define SKEW_SYM_MATRX(v) 0.0,-v[2],v[1],v[2],0.0,-v[0],-v[1],v[0],0.0 + +template +Eigen::Matrix skew_sym_mat(const Eigen::Matrix &v) +{ + Eigen::Matrix skew_sym_mat; + skew_sym_mat<<0.0,-v[2],v[1],v[2],0.0,-v[0],-v[1],v[0],0.0; + return skew_sym_mat; +} + +template +Eigen::Matrix Exp(const Eigen::Matrix &ang) +{ + T ang_norm = ang.norm(); + Eigen::Matrix Eye3 = Eigen::Matrix::Identity(); + if (ang_norm > 0.0000001) + { + Eigen::Matrix r_axis = ang / ang_norm; + Eigen::Matrix K; + K << SKEW_SYM_MATRX(r_axis); + /// Roderigous Tranformation + return Eye3 + std::sin(ang_norm) * K + (1.0 - std::cos(ang_norm)) * K * K; + } + else + { + return Eye3; + } +} + +template +Eigen::Matrix Exp(const Eigen::Matrix &ang_vel, const Ts &dt) +{ + T ang_vel_norm = ang_vel.norm(); + Eigen::Matrix Eye3 = Eigen::Matrix::Identity(); + + if (ang_vel_norm > 0.0000001) + { + Eigen::Matrix r_axis = ang_vel / ang_vel_norm; + Eigen::Matrix K; + + K << SKEW_SYM_MATRX(r_axis); + + T r_ang = ang_vel_norm * dt; + + /// Roderigous Tranformation + return Eye3 + std::sin(r_ang) * K + (1.0 - std::cos(r_ang)) * K * K; + } + else + { + return Eye3; + } +} + +template +Eigen::Matrix Exp(const T &v1, const T &v2, const T &v3) +{ + T &&norm = sqrt(v1 * v1 + v2 * v2 + v3 * v3); + Eigen::Matrix Eye3 = Eigen::Matrix::Identity(); + if (norm > 0.00001) + { + T r_ang[3] = {v1 / norm, v2 / norm, v3 / norm}; + Eigen::Matrix K; + K << SKEW_SYM_MATRX(r_ang); + + /// Roderigous Tranformation + return Eye3 + std::sin(norm) * K + (1.0 - std::cos(norm)) * K * K; + } + else + { + return Eye3; + } +} + +/* Logrithm of a Rotation Matrix */ +template +Eigen::Matrix Log(const Eigen::Matrix R) +{ + T theta = (R.trace() > 3.0 - 1e-6) ? 0.0 : std::acos(0.5 * (R.trace() - 1)); + Eigen::Matrix K(R(2,1) - R(1,2), R(0,2) - R(2,0), R(1,0) - R(0,1)); + return (std::abs(theta) < 0.001) ? (0.5 * K) : (0.5 * theta / std::sin(theta) * K); +} + +template +Eigen::Matrix RotMtoEuler(const Eigen::Matrix &rot) +{ + T sy = sqrt(rot(0,0)*rot(0,0) + rot(1,0)*rot(1,0)); + bool singular = sy < 1e-6; + T x, y, z; + if(!singular) + { + x = atan2(rot(2, 1), rot(2, 2)); + y = atan2(-rot(2, 0), sy); + z = atan2(rot(1, 0), rot(0, 0)); + } + else + { + x = atan2(-rot(1, 2), rot(1, 1)); + y = atan2(-rot(2, 0), sy); + z = 0; + } + Eigen::Matrix ang(x, y, z); + return ang; +} + +template +Eigen::Matrix3d Jacob_right_inv(Eigen::Vector3d &vec){ + Eigen::Matrix3d hat_v, res; + hat_v << SKEW_SYM_MATRX(vec); + if(vec.norm() > 1e-6) + { + res = Eigen::Matrix::Identity() + 0.5 * hat_v + (1 - vec.norm() * std::cos(vec.norm() / 2) / 2 / std::sin(vec.norm() / 2)) * hat_v * hat_v / vec.squaredNorm(); + } + else + { + res = Eigen::Matrix::Identity(); + } + return res; +} + +#endif diff --git a/launch/gdb_debug_example.launch b/launch/gdb_debug_example.launch new file mode 100755 index 0000000..38a5724 --- /dev/null +++ b/launch/gdb_debug_example.launch @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + launch-prefix="gdb -ex run --args" + + \ No newline at end of file diff --git a/launch/mapping_avia.launch b/launch/mapping_avia.launch new file mode 100755 index 0000000..da647d0 --- /dev/null +++ b/launch/mapping_avia.launch @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + launch-prefix="valgrind" + + \ No newline at end of file diff --git a/launch/mapping_horizon.launch b/launch/mapping_horizon.launch new file mode 100755 index 0000000..5f7091f --- /dev/null +++ b/launch/mapping_horizon.launch @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + launch-prefix="gdb -ex run --args" + + \ No newline at end of file diff --git a/launch/mapping_ouster64.launch b/launch/mapping_ouster64.launch new file mode 100755 index 0000000..c2d6d18 --- /dev/null +++ b/launch/mapping_ouster64.launch @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + launch-prefix="gdb -ex run --args" + + diff --git a/launch/mapping_velody16.launch b/launch/mapping_velody16.launch new file mode 100755 index 0000000..f9caa53 --- /dev/null +++ b/launch/mapping_velody16.launch @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + launch-prefix="gdb -ex run --args" + + \ No newline at end of file diff --git a/msg/LocalSensorExternalTrigger.msg b/msg/LocalSensorExternalTrigger.msg new file mode 100644 index 0000000..d70dabe --- /dev/null +++ b/msg/LocalSensorExternalTrigger.msg @@ -0,0 +1,6 @@ +# This message contains essential time information of the +# local sensor (lidar/inertial sensor) when get triggered +Header header # local timestamp of the trigger +uint32 trigger_id +uint32 event_id +time timestamp_host # corresponding timestamp of the Host PC, not used \ No newline at end of file diff --git a/package.xml b/package.xml new file mode 100755 index 0000000..15ba3fd --- /dev/null +++ b/package.xml @@ -0,0 +1,47 @@ + + + point_lio + 0.0.0 + + + This is a modified version of LOAM which is original algorithm + is described in the following paper: + J. Zhang and S. Singh. LOAM: Lidar Odometry and Mapping in Real-time. + Robotics: Science and Systems Conference (RSS). Berkeley, CA, July 2014. + + + claydergc + + BSD + + Dongjiao He + + catkin + geometry_msgs + nav_msgs + roscpp + rospy + std_msgs + sensor_msgs + tf + pcl_ros + livox_ros_driver + message_generation + + geometry_msgs + nav_msgs + sensor_msgs + roscpp + rospy + std_msgs + tf + pcl_ros + livox_ros_driver + message_runtime + + rostest + rosbag + + + + diff --git a/rviz_cfg/.gitignore b/rviz_cfg/.gitignore new file mode 100755 index 0000000..e69de29 diff --git a/rviz_cfg/loam_livox.rviz b/rviz_cfg/loam_livox.rviz new file mode 100755 index 0000000..c99ca7e --- /dev/null +++ b/rviz_cfg/loam_livox.rviz @@ -0,0 +1,365 @@ +Panels: + - Class: rviz/Displays + Help Height: 0 + Name: Displays + Property Tree Widget: + Expanded: + - /Global Options1 + - /Axes1 + - /mapping1 + - /mapping1/surround1 + - /mapping1/currPoints1 + - /mapping1/currPoints1/Autocompute Value Bounds1 + - /Odometry1/Odometry1 + - /Odometry1/Odometry1/Shape1 + - /Odometry1/Odometry1/Covariance1 + - /Odometry1/Odometry1/Covariance1/Position1 + - /Odometry1/Odometry1/Covariance1/Orientation1 + - /MarkerArray1/Namespaces1 + Splitter Ratio: 0.6432291865348816 + Tree Height: 777 + - Class: rviz/Selection + Name: Selection + - Class: rviz/Tool Properties + Expanded: + - /2D Pose Estimate1 + - /2D Nav Goal1 + - /Publish Point1 + Name: Tool Properties + Splitter Ratio: 0.5886790156364441 + - Class: rviz/Views + Expanded: + - /Current View1 + Name: Views + Splitter Ratio: 0.5 + - Class: rviz/Time + Experimental: false + Name: Time + SyncMode: 0 + SyncSource: surround +Preferences: + PromptSaveOnExit: true +Toolbars: + toolButtonStyle: 2 +Visualization Manager: + Class: "" + Displays: + - Alpha: 1 + Cell Size: 1000 + Class: rviz/Grid + Color: 160; 160; 164 + Enabled: false + 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: 40 + Reference Frame: + Value: false + - Alpha: 1 + Class: rviz/Axes + Enabled: true + Length: 0.699999988079071 + Name: Axes + Radius: 0.05999999865889549 + Reference Frame: aft_mapped + Show Trail: false + Value: true + - Class: rviz/Group + Displays: + - Alpha: 1 + Autocompute Intensity Bounds: true + Autocompute Value Bounds: + Max Value: 10 + Min Value: -10 + Value: true + Axis: Z + Channel Name: intensity + Class: rviz/PointCloud2 + Color: 238; 238; 236 + Color Transformer: Intensity + Decay Time: 0 + Enabled: true + Invert Rainbow: false + Max Color: 255; 255; 255 + Min Color: 238; 238; 236 + Name: surround + Position Transformer: XYZ + Queue Size: 1 + Selectable: false + Size (Pixels): 3 + Size (m): 0.05000000074505806 + Style: Points + Topic: /cloud_registered + Unreliable: false + Use Fixed Frame: true + Use rainbow: true + Value: true + - Alpha: 0.10000000149011612 + Autocompute Intensity Bounds: true + Autocompute Value Bounds: + Max Value: 15 + Min Value: -5 + Value: false + Axis: Z + Channel Name: intensity + Class: rviz/PointCloud2 + Color: 255; 255; 255 + Color Transformer: Intensity + Decay Time: 1000 + Enabled: true + Invert Rainbow: true + Max Color: 255; 255; 255 + Min Color: 0; 0; 0 + Name: currPoints + Position Transformer: XYZ + Queue Size: 100000 + Selectable: true + Size (Pixels): 1 + Size (m): 0.009999999776482582 + Style: Points + Topic: /cloud_registered + Unreliable: false + Use Fixed Frame: true + Use rainbow: true + Value: true + - Alpha: 1 + Autocompute Intensity Bounds: true + Autocompute Value Bounds: + Max Value: 10 + Min Value: -10 + Value: true + Axis: Z + Channel Name: intensity + Class: rviz/PointCloud2 + Color: 255; 0; 0 + Color Transformer: FlatColor + Decay Time: 0 + Enabled: false + Invert Rainbow: false + Max Color: 255; 255; 255 + Min Color: 0; 0; 0 + Name: PointCloud2 + Position Transformer: XYZ + Queue Size: 10 + Selectable: true + Size (Pixels): 3 + Size (m): 0.10000000149011612 + Style: Flat Squares + Topic: /Laser_map + Unreliable: false + Use Fixed Frame: true + Use rainbow: true + Value: false + Enabled: true + Name: mapping + - Class: rviz/Group + Displays: + - Angle Tolerance: 0.009999999776482582 + Class: rviz/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.0010000000474974513 + Queue Size: 10 + Shape: + Alpha: 1 + Axes Length: 1 + Axes Radius: 0.20000000298023224 + Color: 255; 85; 0 + Head Length: 0 + Head Radius: 0 + Shaft Length: 0.05000000074505806 + Shaft Radius: 0.05000000074505806 + Value: Axes + Topic: /Odometry + Unreliable: false + Value: true + Enabled: true + Name: Odometry + - Alpha: 1 + Class: rviz/Axes + Enabled: true + Length: 0.699999988079071 + Name: Axes + Radius: 0.10000000149011612 + Reference Frame: + Show Trail: false + Value: true + - Alpha: 0 + Buffer Length: 2 + Class: rviz/Path + Color: 25; 255; 255 + Enabled: true + Head Diameter: 0 + Head Length: 0 + Length: 0.30000001192092896 + Line Style: Billboards + Line Width: 0.20000000298023224 + Name: Path + Offset: + X: 0 + Y: 0 + Z: 0 + Pose Color: 25; 255; 255 + Pose Style: None + Queue Size: 10 + Radius: 0.029999999329447746 + Shaft Diameter: 0.4000000059604645 + Shaft Length: 0.4000000059604645 + Topic: /path + Unreliable: false + Value: true + - Alpha: 1 + Autocompute Intensity Bounds: false + Autocompute Value Bounds: + Max Value: 10 + Min Value: -10 + Value: true + Axis: Z + Channel Name: intensity + Class: rviz/PointCloud2 + Color: 255; 255; 255 + Color Transformer: Intensity + Decay Time: 0 + Enabled: false + Invert Rainbow: false + Max Color: 239; 41; 41 + Max Intensity: 0 + Min Color: 239; 41; 41 + Min Intensity: 0 + Name: PointCloud2 + Position Transformer: XYZ + Queue Size: 10 + Selectable: true + Size (Pixels): 4 + Size (m): 0.30000001192092896 + Style: Spheres + Topic: /cloud_effected + Unreliable: false + Use Fixed Frame: true + Use rainbow: true + Value: false + - Alpha: 1 + Autocompute Intensity Bounds: true + Autocompute Value Bounds: + Max Value: 13.139549255371094 + Min Value: -32.08251953125 + Value: true + Axis: Z + Channel Name: intensity + Class: rviz/PointCloud2 + Color: 138; 226; 52 + Color Transformer: FlatColor + Decay Time: 0 + Enabled: false + Invert Rainbow: false + Max Color: 138; 226; 52 + Min Color: 138; 226; 52 + Name: PointCloud2 + Position Transformer: XYZ + Queue Size: 10 + Selectable: true + Size (Pixels): 3 + Size (m): 0.10000000149011612 + Style: Flat Squares + Topic: /Laser_map + Unreliable: false + Use Fixed Frame: true + Use rainbow: true + Value: false + - Class: rviz/MarkerArray + Enabled: false + Marker Topic: /MarkerArray + Name: MarkerArray + Namespaces: + {} + Queue Size: 100 + Value: false + Enabled: true + Global Options: + Background Color: 0; 0; 0 + Default Light: true + Fixed Frame: camera_init + Frame Rate: 10 + Name: root + Tools: + - Class: rviz/Interact + Hide Inactive Objects: true + - Class: rviz/MoveCamera + - Class: rviz/Select + - Class: rviz/FocusCamera + - Class: rviz/Measure + - Class: rviz/SetInitialPose + Theta std deviation: 0.2617993950843811 + Topic: /initialpose + X std deviation: 0.5 + Y std deviation: 0.5 + - Class: rviz/SetGoal + Topic: /move_base_simple/goal + - Class: rviz/PublishPoint + Single click: true + Topic: /clicked_point + Value: true + Views: + Current: + Class: rviz/Orbit + Distance: 100.72154235839844 + Enable Stereo Rendering: + Stereo Eye Separation: 0.05999999865889549 + Stereo Focal Distance: 1 + Swap Stereo Eyes: false + Value: false + Field of View: 0.7853981852531433 + Focal Point: + X: 34.07209014892578 + Y: -2.53304386138916 + Z: -8.43538761138916 + Focal Shape Fixed Size: true + Focal Shape Size: 0.05000000074505806 + Invert Z Axis: false + Name: Current View + Near Clip Distance: 0.009999999776482582 + Pitch: 0.06979652494192123 + Target Frame: global + Yaw: 4.245370388031006 + Saved: ~ +Window Geometry: + Displays: + collapsed: true + Height: 1016 + Hide Left Dock: true + Hide Right Dock: true + QMainWindow State: 000000ff00000000fd0000000400000000000001c800000346fc020000000dfb0000001200530065006c0065006300740069006f006e00000001e10000009b0000005c00fffffffb0000001e0054006f006f006c002000500072006f007000650072007400690065007302000001ed000001df00000185000000a3fb000000120056006900650077007300200054006f006f02000001df000002110000018500000122fb000000200054006f006f006c002000500072006f0070006500720074006900650073003203000002880000011d000002210000017afb000000100044006900730070006c006100790073000000003d00000346000000c900fffffffb0000002000730065006c0065006300740069006f006e00200062007500660066006500720200000138000000aa0000023a00000294fb00000014005700690064006500530074006500720065006f02000000e6000000d2000003ee0000030bfb0000000c004b0069006e0065006300740200000186000001060000030c00000261fb0000000a0049006d0061006700650000000297000001dc0000000000000000fb0000000a0049006d0061006700650000000394000001600000000000000000fb0000000a0049006d00610067006501000002c5000000c70000000000000000fb0000000a0049006d00610067006501000002c5000000c70000000000000000fb0000000a0049006d00610067006501000002c5000000c700000000000000000000000100000152000004b7fc0200000003fb0000001e0054006f006f006c002000500072006f00700065007200740069006500730100000041000000780000000000000000fb0000000a00560069006500770073000000003d000004b7000000a400fffffffb0000001200530065006c0065006300740069006f006e010000025a000000b200000000000000000000000200000490000000a9fc0100000001fb0000000a00560069006500770073030000004e00000080000002e100000197000000030000073800000052fc0100000002fb0000000800540069006d0065010000000000000738000002eb00fffffffb0000000800540069006d00650100000000000004500000000000000000000007380000034600000004000000040000000800000008fc0000000100000002000000010000000a0054006f006f006c00730100000000ffffffff0000000000000000 + Selection: + collapsed: false + Time: + collapsed: false + Tool Properties: + collapsed: false + Views: + collapsed: true + Width: 1848 + X: 72 + Y: 27 diff --git a/src/Estimator.cpp b/src/Estimator.cpp new file mode 100755 index 0000000..cda4f19 --- /dev/null +++ b/src/Estimator.cpp @@ -0,0 +1,401 @@ +// #include <../include/IKFoM/IKFoM_toolkit/esekfom/esekfom.hpp> +#include "Estimator.h" + +PointCloudXYZI::Ptr normvec(new PointCloudXYZI(100000, 1)); +std::vector time_seq; +PointCloudXYZI::Ptr feats_down_body(new PointCloudXYZI(10000, 1)); +PointCloudXYZI::Ptr feats_down_world(new PointCloudXYZI(10000, 1)); +std::vector pbody_list; +std::vector Nearest_Points; +std::shared_ptr ivox_ = nullptr; // localmap in ivox +std::vector pointSearchSqDis(NUM_MATCH_POINTS); +bool point_selected_surf[100000] = {0}; +std::vector crossmat_list; +int effct_feat_num = 0; +int k = 0; +int idx = -1; +esekfom::esekf kf_input; +esekfom::esekf kf_output; +input_ikfom input_in; +V3D angvel_avr, acc_avr, acc_avr_norm; +int feats_down_size = 0; +V3D Lidar_T_wrt_IMU(Zero3d); +M3D Lidar_R_wrt_IMU(Eye3d); + +Eigen::Matrix process_noise_cov_input() +{ + Eigen::Matrix cov; + cov.setZero(); + cov.block<3, 3>(3, 3).diagonal() << gyr_cov_input, gyr_cov_input, gyr_cov_input; + cov.block<3, 3>(12, 12).diagonal() << acc_cov_input, acc_cov_input, acc_cov_input; + cov.block<3, 3>(15, 15).diagonal() << b_gyr_cov, b_gyr_cov, b_gyr_cov; + cov.block<3, 3>(18, 18).diagonal() << b_acc_cov, b_acc_cov, b_acc_cov; + // MTK::get_cov::type cov = MTK::get_cov::type::Zero(); + // MTK::setDiagonal(cov, &process_noise_input::ng, gyr_cov_input);// 0.03 + // MTK::setDiagonal(cov, &process_noise_input::na, acc_cov_input); // *dt 0.01 0.01 * dt * dt 0.05 + // MTK::setDiagonal(cov, &process_noise_input::nbg, b_gyr_cov); // *dt 0.00001 0.00001 * dt *dt 0.3 //0.001 0.0001 0.01 + // MTK::setDiagonal(cov, &process_noise_input::nba, b_acc_cov); //0.001 0.05 0.0001/out 0.01 + return cov; +} + +Eigen::Matrix process_noise_cov_output() +{ + Eigen::Matrix cov; + cov.setZero(); + cov.block<3, 3>(12, 12).diagonal() << vel_cov, vel_cov, vel_cov; + cov.block<3, 3>(15, 15).diagonal() << gyr_cov_output, gyr_cov_output, gyr_cov_output; + cov.block<3, 3>(18, 18).diagonal() << acc_cov_output, acc_cov_output, acc_cov_output; + cov.block<3, 3>(24, 24).diagonal() << b_gyr_cov, b_gyr_cov, b_gyr_cov; + cov.block<3, 3>(27, 27).diagonal() << b_acc_cov, b_acc_cov, b_acc_cov; + return cov; +} + +Eigen::Matrix get_f_input(state_input &s, const input_ikfom &in) +{ + Eigen::Matrix res = Eigen::Matrix::Zero(); + vect3 omega; + in.gyro.boxminus(omega, s.bg); + vect3 a_inertial = s.rot * (in.acc-s.ba); // .normalized() + for(int i = 0; i < 3; i++ ){ + res(i) = s.vel[i]; + res(i + 3) = omega[i]; + res(i + 12) = a_inertial[i] + s.gravity[i]; + } + return res; +} + +Eigen::Matrix get_f_output(state_output &s, const input_ikfom &in) +{ + Eigen::Matrix res = Eigen::Matrix::Zero(); + vect3 a_inertial = s.rot * s.acc; // .normalized() + for(int i = 0; i < 3; i++ ){ + res(i) = s.vel[i]; + res(i + 3) = s.omg[i]; + res(i + 12) = a_inertial[i] + s.gravity[i]; + } + return res; +} + +Eigen::Matrix df_dx_input(state_input &s, const input_ikfom &in) +{ + Eigen::Matrix cov = Eigen::Matrix::Zero(); + cov.template block<3, 3>(0, 12) = Eigen::Matrix3d::Identity(); + vect3 acc_; + in.acc.boxminus(acc_, s.ba); + vect3 omega; + in.gyro.boxminus(omega, s.bg); + cov.template block<3, 3>(12, 3) = -s.rot*MTK::hat(acc_); // .normalized().toRotationMatrix() + cov.template block<3, 3>(12, 18) = -s.rot; //.normalized().toRotationMatrix(); + // Eigen::Matrix vec = Eigen::Matrix::Zero(); + // Eigen::Matrix grav_matrix; + // s.S2_Mx(grav_matrix, vec, 21); + cov.template block<3, 3>(12, 21) = Eigen::Matrix3d::Identity(); // grav_matrix; + cov.template block<3, 3>(3, 15) = -Eigen::Matrix3d::Identity(); + return cov; +} + +Eigen::Matrix df_dx_output(state_output &s, const input_ikfom &in) +{ + Eigen::Matrix cov = Eigen::Matrix::Zero(); + cov.template block<3, 3>(0, 12) = Eigen::Matrix3d::Identity(); + cov.template block<3, 3>(12, 3) = -s.rot*MTK::hat(s.acc); // .normalized().toRotationMatrix() + cov.template block<3, 3>(12, 18) = s.rot; //.normalized().toRotationMatrix(); + // Eigen::Matrix vec = Eigen::Matrix::Zero(); + // Eigen::Matrix grav_matrix; + // s.S2_Mx(grav_matrix, vec, 21); + cov.template block<3, 3>(12, 21) = Eigen::Matrix3d::Identity(); // grav_matrix; + cov.template block<3, 3>(3, 15) = Eigen::Matrix3d::Identity(); + return cov; +} + +void h_model_input(state_input &s, Eigen::Matrix3d cov_p, Eigen::Matrix3d cov_R, esekfom::dyn_share_modified &ekfom_data) +{ + bool match_in_map = false; + VF(4) pabcd; + pabcd.setZero(); + normvec->resize(time_seq[k]); + int effect_num_k = 0; + for (int j = 0; j < time_seq[k]; j++) + { + PointType &point_body_j = feats_down_body->points[idx+j+1]; + PointType &point_world_j = feats_down_world->points[idx+j+1]; + pointBodyToWorld(&point_body_j, &point_world_j); + V3D p_body = pbody_list[idx+j+1]; + double p_norm = p_body.norm(); + V3D p_world; + p_world << point_world_j.x, point_world_j.y, point_world_j.z; + { + auto &points_near = Nearest_Points[idx+j+1]; + ivox_->GetClosestPoint(point_world_j, points_near, NUM_MATCH_POINTS); // + if ((points_near.size() < NUM_MATCH_POINTS)) // || pointSearchSqDis[NUM_MATCH_POINTS - 1] > 5) // 5) + { + point_selected_surf[idx+j+1] = false; + } + else + { + point_selected_surf[idx+j+1] = false; + if (esti_plane(pabcd, points_near, plane_thr)) //(planeValid) + { + float pd2 = fabs(pabcd(0) * point_world_j.x + pabcd(1) * point_world_j.y + pabcd(2) * point_world_j.z + pabcd(3)); + // V3D norm_vec; + // M3D Rpf, pf; + // pf = crossmat_list[idx+j+1]; + // // pf << SKEW_SYM_MATRX(p_body); + // Rpf = s.rot * pf; + // norm_vec << pabcd(0), pabcd(1), pabcd(2); + // double noise_state = norm_vec.transpose() * (cov_p+Rpf*cov_R*Rpf.transpose()) * norm_vec + sqrt(p_norm) * 0.001; + // // if (p_norm > match_s * pd2 * pd2) + // double epsilon = pd2 / sqrt(noise_state); + // // cout << "check epsilon:" << epsilon << endl; + // double weight = 1.0; // epsilon / sqrt(epsilon * epsilon+1); + // if (epsilon > 1.0) + // { + // weight = sqrt(2 * epsilon - 1) / epsilon; + // pabcd(0) = weight * pabcd(0); + // pabcd(1) = weight * pabcd(1); + // pabcd(2) = weight * pabcd(2); + // pabcd(3) = weight * pabcd(3); + // } + if (p_norm > match_s * pd2 * pd2) + { + point_selected_surf[idx+j+1] = true; + normvec->points[j].x = pabcd(0); + normvec->points[j].y = pabcd(1); + normvec->points[j].z = pabcd(2); + normvec->points[j].intensity = pabcd(3); + effect_num_k ++; + } + } + } + } + } + if (effect_num_k == 0) + { + ekfom_data.valid = false; + return; + } + ekfom_data.M_Noise = laser_point_cov; + ekfom_data.h_x.resize(effect_num_k, 12); + ekfom_data.h_x = Eigen::MatrixXd::Zero(effect_num_k, 12); + ekfom_data.z.resize(effect_num_k); + int m = 0; + + for (int j = 0; j < time_seq[k]; j++) + { + // ekfom_data.converge = false; + if(point_selected_surf[idx+j+1]) + { + V3D norm_vec(normvec->points[j].x, normvec->points[j].y, normvec->points[j].z); + + if (extrinsic_est_en) + { + V3D p_body = pbody_list[idx+j+1]; + M3D p_crossmat, p_imu_crossmat; + p_crossmat << SKEW_SYM_MATRX(p_body); + V3D point_imu = s.offset_R_L_I * p_body + s.offset_T_L_I; + p_imu_crossmat << SKEW_SYM_MATRX(point_imu); + V3D C(s.rot.transpose() * norm_vec); + V3D A(p_imu_crossmat * C); + V3D B(p_crossmat * s.offset_R_L_I.transpose() * C); + ekfom_data.h_x.block<1, 12>(m, 0) << norm_vec(0), norm_vec(1), norm_vec(2), VEC_FROM_ARRAY(A), VEC_FROM_ARRAY(B), VEC_FROM_ARRAY(C); + } + else + { + M3D point_crossmat = crossmat_list[idx+j+1]; + V3D C(s.rot.transpose() * norm_vec); // conjugate().normalized() + V3D A(point_crossmat * C); + ekfom_data.h_x.block<1, 6>(m, 0) << norm_vec(0), norm_vec(1), norm_vec(2), VEC_FROM_ARRAY(A), 0.0, 0.0, 0.0, 0.0, 0.0, 0.0; + } + ekfom_data.z(m) = -norm_vec(0) * feats_down_world->points[idx+j+1].x -norm_vec(1) * feats_down_world->points[idx+j+1].y -norm_vec(2) * feats_down_world->points[idx+j+1].z-normvec->points[j].intensity; + + m++; + } + } + effct_feat_num += effect_num_k; +} + +void h_model_output(state_output &s, Eigen::Matrix3d cov_p, Eigen::Matrix3d cov_R, esekfom::dyn_share_modified &ekfom_data) +{ + bool match_in_map = false; + VF(4) pabcd; + pabcd.setZero(); + normvec->resize(time_seq[k]); + int effect_num_k = 0; + for (int j = 0; j < time_seq[k]; j++) + { + PointType &point_body_j = feats_down_body->points[idx+j+1]; + PointType &point_world_j = feats_down_world->points[idx+j+1]; + pointBodyToWorld(&point_body_j, &point_world_j); + V3D p_body = pbody_list[idx+j+1]; + double p_norm = p_body.norm(); + V3D p_world; + p_world << point_world_j.x, point_world_j.y, point_world_j.z; + { + auto &points_near = Nearest_Points[idx+j+1]; + + ivox_->GetClosestPoint(point_world_j, points_near, NUM_MATCH_POINTS); // + + if ((points_near.size() < NUM_MATCH_POINTS)) // || pointSearchSqDis[NUM_MATCH_POINTS - 1] > 5) + { + point_selected_surf[idx+j+1] = false; + } + else + { + point_selected_surf[idx+j+1] = false; + if (esti_plane(pabcd, points_near, plane_thr)) //(planeValid) + { + float pd2 = fabs(pabcd(0) * point_world_j.x + pabcd(1) * point_world_j.y + pabcd(2) * point_world_j.z + pabcd(3)); + // V3D norm_vec; + // M3D Rpf, pf; + // pf = crossmat_list[idx+j+1]; + // // pf << SKEW_SYM_MATRX(p_body); + // Rpf = s.rot * pf; + // norm_vec << pabcd(0), pabcd(1), pabcd(2); + // double noise_state = norm_vec.transpose() * (cov_p+Rpf*cov_R*Rpf.transpose()) * norm_vec + sqrt(p_norm) * 0.001; + // // if (p_norm > match_s * pd2 * pd2) + // double epsilon = pd2 / sqrt(noise_state); + // double weight = 1.0; // epsilon / sqrt(epsilon * epsilon+1); + // if (epsilon > 1.0) + // { + // weight = sqrt(2 * epsilon - 1) / epsilon; + // pabcd(0) = weight * pabcd(0); + // pabcd(1) = weight * pabcd(1); + // pabcd(2) = weight * pabcd(2); + // pabcd(3) = weight * pabcd(3); + // } + if (p_norm > match_s * pd2 * pd2) + { + // point_selected_surf[i] = true; + point_selected_surf[idx+j+1] = true; + normvec->points[j].x = pabcd(0); + normvec->points[j].y = pabcd(1); + normvec->points[j].z = pabcd(2); + normvec->points[j].intensity = pabcd(3); + effect_num_k ++; + } + } + } + } + } + if (effect_num_k == 0) + { + ekfom_data.valid = false; + return; + } + ekfom_data.M_Noise = laser_point_cov; + ekfom_data.h_x.resize(effect_num_k, 12); + ekfom_data.h_x = Eigen::MatrixXd::Zero(effect_num_k, 12); + ekfom_data.z.resize(effect_num_k); + int m = 0; + for (int j = 0; j < time_seq[k]; j++) + { + // ekfom_data.converge = false; + if(point_selected_surf[idx+j+1]) + { + V3D norm_vec(normvec->points[j].x, normvec->points[j].y, normvec->points[j].z); + if (extrinsic_est_en) + { + V3D p_body = pbody_list[idx+j+1]; + M3D p_crossmat, p_imu_crossmat; + p_crossmat << SKEW_SYM_MATRX(p_body); + V3D point_imu = s.offset_R_L_I * p_body + s.offset_T_L_I; + p_imu_crossmat << SKEW_SYM_MATRX(point_imu); + V3D C(s.rot.transpose() * norm_vec); + V3D A(p_imu_crossmat * C); + V3D B(p_crossmat * s.offset_R_L_I.transpose() * C); + ekfom_data.h_x.block<1, 12>(m, 0) << norm_vec(0), norm_vec(1), norm_vec(2), VEC_FROM_ARRAY(A), VEC_FROM_ARRAY(B), VEC_FROM_ARRAY(C); + } + else + { + M3D point_crossmat = crossmat_list[idx+j+1]; + V3D C(s.rot.transpose() * norm_vec); // conjugate().normalized() + V3D A(point_crossmat * C); + ekfom_data.h_x.block<1, 6>(m, 0) << norm_vec(0), norm_vec(1), norm_vec(2), VEC_FROM_ARRAY(A), 0.0, 0.0, 0.0, 0.0, 0.0, 0.0; + } + ekfom_data.z(m) = -norm_vec(0) * feats_down_world->points[idx+j+1].x -norm_vec(1) * feats_down_world->points[idx+j+1].y -norm_vec(2) * feats_down_world->points[idx+j+1].z-normvec->points[j].intensity; + + m++; + } + } + effct_feat_num += effect_num_k; +} + +void h_model_IMU_output(state_output &s, esekfom::dyn_share_modified &ekfom_data) +{ + std::memset(ekfom_data.satu_check, false, 6); + ekfom_data.z_IMU.block<3,1>(0, 0) = angvel_avr - s.omg - s.bg; + ekfom_data.z_IMU.block<3,1>(3, 0) = acc_avr * G_m_s2 / acc_norm - s.acc - s.ba; + ekfom_data.R_IMU << imu_meas_omg_cov, imu_meas_omg_cov, imu_meas_omg_cov, imu_meas_acc_cov, imu_meas_acc_cov, imu_meas_acc_cov; + if(check_satu) + { + if(fabs(angvel_avr(0)) >= 0.99 * satu_gyro) + { + ekfom_data.satu_check[0] = true; + ekfom_data.z_IMU(0) = 0.0; + } + + if(fabs(angvel_avr(1)) >= 0.99 * satu_gyro) + { + ekfom_data.satu_check[1] = true; + ekfom_data.z_IMU(1) = 0.0; + } + + if(fabs(angvel_avr(2)) >= 0.99 * satu_gyro) + { + ekfom_data.satu_check[2] = true; + ekfom_data.z_IMU(2) = 0.0; + } + + if(fabs(acc_avr(0)) >= 0.99 * satu_acc) + { + ekfom_data.satu_check[3] = true; + ekfom_data.z_IMU(3) = 0.0; + } + + if(fabs(acc_avr(1)) >= 0.99 * satu_acc) + { + ekfom_data.satu_check[4] = true; + ekfom_data.z_IMU(4) = 0.0; + } + + if(fabs(acc_avr(2)) >= 0.99 * satu_acc) + { + ekfom_data.satu_check[5] = true; + ekfom_data.z_IMU(5) = 0.0; + } + } +} + +void pointBodyToWorld(PointType const * const pi, PointType * const po) +{ + V3D p_body(pi->x, pi->y, pi->z); + + V3D p_global; + if (extrinsic_est_en) + { + if (!use_imu_as_input) + { + p_global = kf_output.x_.rot * (kf_output.x_.offset_R_L_I * p_body + kf_output.x_.offset_T_L_I) + kf_output.x_.pos; + } + else + { + p_global = kf_input.x_.rot * (kf_input.x_.offset_R_L_I * p_body + kf_input.x_.offset_T_L_I) + kf_input.x_.pos; + } + } + else + { + if (!use_imu_as_input) + { + p_global = kf_output.x_.rot * (Lidar_R_wrt_IMU * p_body + Lidar_T_wrt_IMU) + kf_output.x_.pos; // .normalized() + } + else + { + p_global = kf_input.x_.rot * (Lidar_R_wrt_IMU * p_body + Lidar_T_wrt_IMU) + kf_input.x_.pos; // .normalized() + } + } + + po->x = p_global(0); + po->y = p_global(1); + po->z = p_global(2); + po->intensity = pi->intensity; +} \ No newline at end of file diff --git a/src/Estimator.h b/src/Estimator.h new file mode 100755 index 0000000..9dc8ce6 --- /dev/null +++ b/src/Estimator.h @@ -0,0 +1,61 @@ +#ifndef Estimator_H +#define Estimator_H + +#include "common_lib.h" +#include "parameters.h" +#include +#include +#include +#include +// #include +#include +#include + +extern PointCloudXYZI::Ptr normvec; //(new PointCloudXYZI(100000, 1)); +extern std::vector time_seq; +extern PointCloudXYZI::Ptr feats_down_body; //(new PointCloudXYZI()); +extern PointCloudXYZI::Ptr feats_down_world; //(new PointCloudXYZI()); +extern std::vector pbody_list; +extern std::vector Nearest_Points; +extern std::shared_ptr ivox_; // localmap in ivox +extern std::vector pointSearchSqDis; +extern bool point_selected_surf[100000]; // = {0}; +extern std::vector crossmat_list; +extern int effct_feat_num; +extern int k; +extern int idx; +extern V3D angvel_avr, acc_avr, acc_avr_norm; +extern int feats_down_size; +// extern std::vector normvec_holder; +extern V3D Lidar_T_wrt_IMU; //(Zero3d); +extern M3D Lidar_R_wrt_IMU; //(Eye3d); + +extern input_ikfom input_in; + +Eigen::Matrix process_noise_cov_input(); + +Eigen::Matrix process_noise_cov_output(); + +//double L_offset_to_I[3] = {0.04165, 0.02326, -0.0284}; // Avia +//vect3 Lidar_offset_to_IMU(L_offset_to_I, 3); +Eigen::Matrix get_f_input(state_input &s, const input_ikfom &in); + +Eigen::Matrix get_f_output(state_output &s, const input_ikfom &in); + +Eigen::Matrix df_dx_input(state_input &s, const input_ikfom &in); + +// Eigen::Matrix df_dw_input(state_input &s, const input_ikfom &in); + +Eigen::Matrix df_dx_output(state_output &s, const input_ikfom &in); + +// Eigen::Matrix df_dw_output(state_output &s); + +void h_model_input(state_input &s, Eigen::Matrix3d cov_p, Eigen::Matrix3d cov_R, esekfom::dyn_share_modified &ekfom_data); + +void h_model_output(state_output &s, Eigen::Matrix3d cov_p, Eigen::Matrix3d cov_R, esekfom::dyn_share_modified &ekfom_data); + +void h_model_IMU_output(state_output &s, esekfom::dyn_share_modified &ekfom_data); + +void pointBodyToWorld(PointType const * const pi, PointType * const po); + +#endif \ No newline at end of file diff --git a/src/IMU_Processing.cpp b/src/IMU_Processing.cpp new file mode 100755 index 0000000..0f51d2e --- /dev/null +++ b/src/IMU_Processing.cpp @@ -0,0 +1,136 @@ +#include "IMU_Processing.h" + +const bool time_list(PointType &x, PointType &y) {return (x.curvature < y.curvature);}; + +void ImuProcess::set_gyr_cov(const V3D &scaler) +{ + cov_gyr_scale = scaler; +} + +void ImuProcess::set_acc_cov(const V3D &scaler) +{ + cov_vel_scale = scaler; +} + +ImuProcess::ImuProcess() + : b_first_frame_(true), imu_need_init_(true) +{ + imu_en = true; + init_iter_num = 1; + mean_acc = V3D(0, 0, 0.0); + mean_gyr = V3D(0, 0, 0); + after_imu_init_ = false; + state_cov.setIdentity(); +} + +ImuProcess::~ImuProcess() {} + +void ImuProcess::Reset() +{ + ROS_WARN("Reset ImuProcess"); + mean_acc = V3D(0, 0, 0.0); + mean_gyr = V3D(0, 0, 0); + imu_need_init_ = true; + init_iter_num = 1; + after_imu_init_ = false; + + time_last_scan = 0.0; +} + +void ImuProcess::Set_init(Eigen::Vector3d &tmp_gravity, Eigen::Matrix3d &rot) +{ + /** 1. initializing the gravity, gyro bias, acc and gyro covariance + ** 2. normalize the acceleration measurenments to unit gravity **/ + // V3D tmp_gravity = - mean_acc / mean_acc.norm() * G_m_s2; // state_gravity; + M3D hat_grav; + hat_grav << 0.0, gravity_(2), -gravity_(1), + -gravity_(2), 0.0, gravity_(0), + gravity_(1), -gravity_(0), 0.0; + double align_norm = (hat_grav * tmp_gravity).norm() / gravity_.norm() / tmp_gravity.norm(); + double align_cos = gravity_.transpose() * tmp_gravity; + align_cos = align_cos / gravity_.norm() / tmp_gravity.norm(); + if (align_norm < 1e-6) + { + if (align_cos > 1e-6) + { + rot = Eye3d; + } + else + { + rot = -Eye3d; + } + } + else + { + V3D align_angle = hat_grav * tmp_gravity / (hat_grav * tmp_gravity).norm() * acos(align_cos); + rot = Exp(align_angle(0), align_angle(1), align_angle(2)); + } +} + +void ImuProcess::IMU_init(const MeasureGroup &meas, int &N) +{ + /** 1. initializing the gravity, gyro bias, acc and gyro covariance + ** 2. normalize the acceleration measurenments to unit gravity **/ + ROS_INFO("IMU Initializing: %.1f %%", double(N) / MAX_INI_COUNT * 100); + V3D cur_acc, cur_gyr; + + if (b_first_frame_) + { + Reset(); + N = 1; + b_first_frame_ = false; + const auto &imu_acc = meas.imu.front()->linear_acceleration; + const auto &gyr_acc = meas.imu.front()->angular_velocity; + mean_acc << imu_acc.x, imu_acc.y, imu_acc.z; + mean_gyr << gyr_acc.x, gyr_acc.y, gyr_acc.z; + } + + for (const auto &imu : meas.imu) + { + const auto &imu_acc = imu->linear_acceleration; + const auto &gyr_acc = imu->angular_velocity; + cur_acc << imu_acc.x, imu_acc.y, imu_acc.z; + cur_gyr << gyr_acc.x, gyr_acc.y, gyr_acc.z; + + mean_acc += (cur_acc - mean_acc) / N; + mean_gyr += (cur_gyr - mean_gyr) / N; + + N ++; + } +} + +void ImuProcess::Process(const MeasureGroup &meas, PointCloudXYZI::Ptr cur_pcl_un_) +{ + if (imu_en) + { + if(meas.imu.empty()) return; + + if (imu_need_init_) + { + + { + /// The very first lidar frame + IMU_init(meas, init_iter_num); + + imu_need_init_ = true; + + if (init_iter_num > MAX_INI_COUNT) + { + ROS_INFO("IMU Initializing: %.1f %%", 100.0); + imu_need_init_ = false; + *cur_pcl_un_ = *(meas.lidar); + } + // *cur_pcl_un_ = *(meas.lidar); + } + return; + } + if (!after_imu_init_) after_imu_init_ = true; + *cur_pcl_un_ = *(meas.lidar); + return; + } + else + { + *cur_pcl_un_ = *(meas.lidar); + return; + } +} \ No newline at end of file diff --git a/src/IMU_Processing.h b/src/IMU_Processing.h new file mode 100755 index 0000000..a7f888e --- /dev/null +++ b/src/IMU_Processing.h @@ -0,0 +1,59 @@ +#pragma once +#include +#include +// #include +// #include +// #include +#include +#include +// #include +#include +// #include "Estimator.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/// *************Preconfiguration + +#define MAX_INI_COUNT (100) +const bool time_list(PointType &x, PointType &y); // {return (x.curvature < y.curvature);}; + +/// *************IMU Process and undistortion +class ImuProcess +{ + public: + EIGEN_MAKE_ALIGNED_OPERATOR_NEW + + ImuProcess(); + ~ImuProcess(); + + void Reset(); + void Process(const MeasureGroup &meas, PointCloudXYZI::Ptr pcl_un_); + void set_gyr_cov(const V3D &scaler); + void set_acc_cov(const V3D &scaler); + void Set_init(Eigen::Vector3d &tmp_gravity, Eigen::Matrix3d &rot); + + MD(12, 12) state_cov = MD(12, 12)::Identity(); + int lidar_type; + V3D gravity_; + bool imu_en; + V3D mean_acc; + bool imu_need_init_ = true; + bool after_imu_init_ = false; + bool b_first_frame_ = true; + double time_last_scan = 0.0; + V3D cov_gyr_scale = V3D(0.0001, 0.0001, 0.0001); + V3D cov_vel_scale = V3D(0.0001, 0.0001, 0.0001); + + private: + void IMU_init(const MeasureGroup &meas, int &N); + V3D mean_gyr; + int init_iter_num = 1; +}; diff --git a/src/laserMapping.cpp b/src/laserMapping.cpp new file mode 100755 index 0000000..c966403 --- /dev/null +++ b/src/laserMapping.cpp @@ -0,0 +1,1070 @@ +// #include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "li_initialization.h" +#include +// #include +// #include "matplotlibcpp.h" +// #include + +using namespace std; + +#define PUBFRAME_PERIOD (20) + +const float MOV_THRESHOLD = 1.5f; + +string root_dir = ROOT_DIR; + +int time_log_counter = 0; //, publish_count = 0; + +bool init_map = false, flg_first_scan = true; + +// Time Log Variables +double match_time = 0, solve_time = 0, propag_time = 0, update_time = 0; + +bool flg_reset = false, flg_exit = false; + +//surf feature in map +PointCloudXYZI::Ptr feats_undistort(new PointCloudXYZI()); +PointCloudXYZI::Ptr feats_down_body_space(new PointCloudXYZI()); +PointCloudXYZI::Ptr init_feats_world(new PointCloudXYZI()); +std::deque depth_feats_world; +pcl::VoxelGrid downSizeFilterSurf; +pcl::VoxelGrid downSizeFilterMap; + +V3D euler_cur; + +nav_msgs::Path path; +nav_msgs::Odometry odomAftMapped; +geometry_msgs::PoseStamped msg_body_pose; + +void SigHandle(int sig) +{ + flg_exit = true; + ROS_WARN("catch sig %d", sig); + sig_buffer.notify_all(); +} + +inline void dump_lio_state_to_log(FILE *fp) +{ + V3D rot_ang; + if (!use_imu_as_input) + { + rot_ang = SO3ToEuler(kf_output.x_.rot); + } + else + { + rot_ang = SO3ToEuler(kf_input.x_.rot); + } + + fprintf(fp, "%lf ", Measures.lidar_beg_time - first_lidar_time); + fprintf(fp, "%lf %lf %lf ", rot_ang(0), rot_ang(1), rot_ang(2)); // Angle + if (use_imu_as_input) + { + fprintf(fp, "%lf %lf %lf ", kf_input.x_.pos(0), kf_input.x_.pos(1), kf_input.x_.pos(2)); // Pos + fprintf(fp, "%lf %lf %lf ", 0.0, 0.0, 0.0); // omega + fprintf(fp, "%lf %lf %lf ", kf_input.x_.vel(0), kf_input.x_.vel(1), kf_input.x_.vel(2)); // Vel + fprintf(fp, "%lf %lf %lf ", 0.0, 0.0, 0.0); // Acc + fprintf(fp, "%lf %lf %lf ", kf_input.x_.bg(0), kf_input.x_.bg(1), kf_input.x_.bg(2)); // Bias_g + fprintf(fp, "%lf %lf %lf ", kf_input.x_.ba(0), kf_input.x_.ba(1), kf_input.x_.ba(2)); // Bias_a + fprintf(fp, "%lf %lf %lf ", kf_input.x_.gravity(0), kf_input.x_.gravity(1), kf_input.x_.gravity(2)); // Bias_a + } + else + { + fprintf(fp, "%lf %lf %lf ", kf_output.x_.pos(0), kf_output.x_.pos(1), kf_output.x_.pos(2)); // Pos + fprintf(fp, "%lf %lf %lf ", 0.0, 0.0, 0.0); // omega + fprintf(fp, "%lf %lf %lf ", kf_output.x_.vel(0), kf_output.x_.vel(1), kf_output.x_.vel(2)); // Vel + fprintf(fp, "%lf %lf %lf ", 0.0, 0.0, 0.0); // Acc + fprintf(fp, "%lf %lf %lf ", kf_output.x_.bg(0), kf_output.x_.bg(1), kf_output.x_.bg(2)); // Bias_g + fprintf(fp, "%lf %lf %lf ", kf_output.x_.ba(0), kf_output.x_.ba(1), kf_output.x_.ba(2)); // Bias_a + fprintf(fp, "%lf %lf %lf ", kf_output.x_.gravity(0), kf_output.x_.gravity(1), kf_output.x_.gravity(2)); // Bias_a + } + fprintf(fp, "\r\n"); + fflush(fp); +} + +void pointBodyLidarToIMU(PointType const * const pi, PointType * const po) +{ + V3D p_body_lidar(pi->x, pi->y, pi->z); + V3D p_body_imu; + if (extrinsic_est_en) + { + if (!use_imu_as_input) + { + p_body_imu = kf_output.x_.offset_R_L_I * p_body_lidar + kf_output.x_.offset_T_L_I; + } + else + { + p_body_imu = kf_input.x_.offset_R_L_I * p_body_lidar + kf_input.x_.offset_T_L_I; + } + } + else + { + p_body_imu = Lidar_R_wrt_IMU * p_body_lidar + Lidar_T_wrt_IMU; + } + po->x = p_body_imu(0); + po->y = p_body_imu(1); + po->z = p_body_imu(2); + po->intensity = pi->intensity; +} + +void MapIncremental() { + PointVector points_to_add; + int cur_pts = feats_down_world->size(); + points_to_add.reserve(cur_pts); + + for (size_t i = 0; i < cur_pts; ++i) { + /* decide if need add to map */ + PointType &point_world = feats_down_world->points[i]; + if (!Nearest_Points[i].empty()) { + const PointVector &points_near = Nearest_Points[i]; + + Eigen::Vector3f center = + ((point_world.getVector3fMap() / filter_size_map_min).array().floor() + 0.5) * filter_size_map_min; + bool need_add = true; + for (int readd_i = 0; readd_i < points_near.size(); readd_i++) { + Eigen::Vector3f dis_2_center = points_near[readd_i].getVector3fMap() - center; + if (fabs(dis_2_center.x()) < 0.5 * filter_size_map_min && + fabs(dis_2_center.y()) < 0.5 * filter_size_map_min && + fabs(dis_2_center.z()) < 0.5 * filter_size_map_min) { + need_add = false; + break; + } + } + if (need_add) { + points_to_add.emplace_back(point_world); + } + } else { + points_to_add.emplace_back(point_world); + } + } + ivox_->AddPoints(points_to_add); +} + +void publish_init_map(const ros::Publisher & pubLaserCloudFullRes) +{ + int size_init_map = init_feats_world->size(); + + sensor_msgs::PointCloud2 laserCloudmsg; + + pcl::toROSMsg(*init_feats_world, laserCloudmsg); + + laserCloudmsg.header.stamp = ros::Time().fromSec(lidar_end_time); + laserCloudmsg.header.frame_id = "camera_init"; + pubLaserCloudFullRes.publish(laserCloudmsg); +} + +PointCloudXYZI::Ptr pcl_wait_pub(new PointCloudXYZI(500000, 1)); +PointCloudXYZI::Ptr pcl_wait_save(new PointCloudXYZI()); +void publish_frame_world(const ros::Publisher & pubLaserCloudFullRes) +{ + if (scan_pub_en) + { + PointCloudXYZI::Ptr laserCloudFullRes(feats_down_body); + int size = laserCloudFullRes->points.size(); + + PointCloudXYZI::Ptr laserCloudWorld(new PointCloudXYZI(size, 1)); + + for (int i = 0; i < size; i++) + { + laserCloudWorld->points[i].x = feats_down_world->points[i].x; + laserCloudWorld->points[i].y = feats_down_world->points[i].y; + laserCloudWorld->points[i].z = feats_down_world->points[i].z; + laserCloudWorld->points[i].intensity = feats_down_world->points[i].intensity; // feats_down_world->points[i].y; // + } + sensor_msgs::PointCloud2 laserCloudmsg; + pcl::toROSMsg(*laserCloudWorld, laserCloudmsg); + + laserCloudmsg.header.stamp = ros::Time().fromSec(lidar_end_time); + laserCloudmsg.header.frame_id = "camera_init"; + pubLaserCloudFullRes.publish(laserCloudmsg); + // publish_count -= PUBFRAME_PERIOD; + } + + /**************** save map ****************/ + /* 1. make sure you have enough memories + /* 2. noted that pcd save will influence the real-time performences **/ + if (pcd_save_en) + { + int size = feats_down_world->points.size(); + PointCloudXYZI::Ptr laserCloudWorld(new PointCloudXYZI(size, 1)); + + for (int i = 0; i < size; i++) + { + laserCloudWorld->points[i].x = feats_down_world->points[i].x; + laserCloudWorld->points[i].y = feats_down_world->points[i].y; + laserCloudWorld->points[i].z = feats_down_world->points[i].z; + laserCloudWorld->points[i].intensity = feats_down_world->points[i].intensity; + } + + *pcl_wait_save += *laserCloudWorld; + + static int scan_wait_num = 0; + scan_wait_num ++; + if (pcl_wait_save->size() > 0 && pcd_save_interval > 0 && scan_wait_num >= pcd_save_interval) + { + pcd_index ++; + string all_points_dir(string(string(ROOT_DIR) + "PCD/scans_") + to_string(pcd_index) + string(".pcd")); + pcl::PCDWriter pcd_writer; + cout << "current scan saved to /PCD/" << all_points_dir << endl; + pcd_writer.writeBinary(all_points_dir, *pcl_wait_save); + pcl_wait_save->clear(); + scan_wait_num = 0; + } + } +} + +void publish_frame_body(const ros::Publisher & pubLaserCloudFull_body) +{ + int size = feats_undistort->points.size(); + PointCloudXYZI::Ptr laserCloudIMUBody(new PointCloudXYZI(size, 1)); + + for (int i = 0; i < size; i++) + { + pointBodyLidarToIMU(&feats_undistort->points[i], \ + &laserCloudIMUBody->points[i]); + } + + sensor_msgs::PointCloud2 laserCloudmsg; + pcl::toROSMsg(*laserCloudIMUBody, laserCloudmsg); + laserCloudmsg.header.stamp = ros::Time().fromSec(lidar_end_time); + laserCloudmsg.header.frame_id = "body"; + pubLaserCloudFull_body.publish(laserCloudmsg); + // publish_count -= PUBFRAME_PERIOD; +} + +template +void set_posestamp(T & out) +{ + if (!use_imu_as_input) + { + out.position.x = kf_output.x_.pos(0); + out.position.y = kf_output.x_.pos(1); + out.position.z = kf_output.x_.pos(2); + Eigen::Quaterniond q(kf_output.x_.rot); + out.orientation.x = q.coeffs()[0]; + out.orientation.y = q.coeffs()[1]; + out.orientation.z = q.coeffs()[2]; + out.orientation.w = q.coeffs()[3]; + } + else + { + out.position.x = kf_input.x_.pos(0); + out.position.y = kf_input.x_.pos(1); + out.position.z = kf_input.x_.pos(2); + Eigen::Quaterniond q(kf_input.x_.rot); + out.orientation.x = q.coeffs()[0]; + out.orientation.y = q.coeffs()[1]; + out.orientation.z = q.coeffs()[2]; + out.orientation.w = q.coeffs()[3]; + } +} + +void publish_odometry(const ros::Publisher & pubOdomAftMapped) +{ + odomAftMapped.header.frame_id = "camera_init"; + odomAftMapped.child_frame_id = "aft_mapped"; + if (publish_odometry_without_downsample) + { + odomAftMapped.header.stamp = ros::Time().fromSec(time_current); + } + else + { + odomAftMapped.header.stamp = ros::Time().fromSec(lidar_end_time); + } + set_posestamp(odomAftMapped.pose.pose); + + pubOdomAftMapped.publish(odomAftMapped); + + static tf::TransformBroadcaster br; + tf::Transform transform; + tf::Quaternion q; + transform.setOrigin(tf::Vector3(odomAftMapped.pose.pose.position.x, \ + odomAftMapped.pose.pose.position.y, \ + odomAftMapped.pose.pose.position.z)); + q.setW(odomAftMapped.pose.pose.orientation.w); + q.setX(odomAftMapped.pose.pose.orientation.x); + q.setY(odomAftMapped.pose.pose.orientation.y); + q.setZ(odomAftMapped.pose.pose.orientation.z); + transform.setRotation( q ); + br.sendTransform( tf::StampedTransform( transform, odomAftMapped.header.stamp, "camera_init", "aft_mapped" ) ); +} + +void publish_path(const ros::Publisher pubPath) +{ + set_posestamp(msg_body_pose.pose); + // msg_body_pose.header.stamp = ros::Time::now(); + msg_body_pose.header.stamp = ros::Time().fromSec(lidar_end_time); + msg_body_pose.header.frame_id = "camera_init"; + static int jjj = 0; + jjj++; + // if (jjj % 2 == 0) // if path is too large, the rvis will crash + { + path.poses.emplace_back(msg_body_pose); + pubPath.publish(path); + } +} + +int main(int argc, char** argv) +{ + ros::init(argc, argv, "laserMapping"); + ros::NodeHandle nh("~"); + ros::AsyncSpinner spinner(0); + spinner.start(); + readParameters(nh); + cout<<"lidar_type: "<(ivox_options_); + + path.header.stamp = ros::Time().fromSec(lidar_end_time); + path.header.frame_id ="camera_init"; + + /*** variables definition for counting ***/ + int frame_num = 0; + double aver_time_consu = 0, aver_time_icp = 0, aver_time_match = 0, aver_time_incre = 0, aver_time_solve = 0, aver_time_propag = 0; + + memset(point_selected_surf, true, sizeof(point_selected_surf)); + downSizeFilterSurf.setLeafSize(filter_size_surf_min, filter_size_surf_min, filter_size_surf_min); + downSizeFilterMap.setLeafSize(filter_size_map_min, filter_size_map_min, filter_size_map_min); + + Lidar_T_wrt_IMU<lidar_type = p_pre->lidar_type = lidar_type; + p_imu->imu_en = imu_en; + + kf_input.init_dyn_share_modified_2h(get_f_input, df_dx_input, h_model_input); + kf_output.init_dyn_share_modified_3h(get_f_output, df_dx_output, h_model_output, h_model_IMU_output); + Eigen::Matrix P_init; // = MD(18, 18)::Identity() * 0.1; + reset_cov(P_init); + kf_input.change_P(P_init); + Eigen::Matrix P_init_output; // = MD(24, 24)::Identity() * 0.01; + reset_cov_output(P_init_output); + kf_output.change_P(P_init_output); + Eigen::Matrix Q_input = process_noise_cov_input(); + Eigen::Matrix Q_output = process_noise_cov_output(); + /*** debug record ***/ + FILE *fp; + string pos_log_dir = root_dir + "/Log/pos_log.txt"; + fp = fopen(pos_log_dir.c_str(),"w"); + open_file(); + + /*** ROS subscribe initialization ***/ + ros::Subscriber sub_pcl = p_pre->lidar_type == AVIA ? \ + nh.subscribe(lid_topic, 200000, livox_pcl_cbk) : \ + nh.subscribe(lid_topic, 200000, standard_pcl_cbk); + ros::Subscriber sub_imu = nh.subscribe(imu_topic, 200000, imu_cbk); + + ros::Publisher pubLaserCloudFullRes = nh.advertise + ("/cloud_registered", 1000); + ros::Publisher pubLaserCloudFullRes_body = nh.advertise + ("/cloud_registered_body", 1000); + ros::Publisher pubLaserCloudEffect = nh.advertise + ("/cloud_effected", 1000); + ros::Publisher pubLaserCloudMap = nh.advertise + ("/Laser_map", 1000); + ros::Publisher pubOdomAftMapped = nh.advertise + ("/aft_mapped_to_init", 1000); + ros::Publisher pubPath = nh.advertise + ("/path", 1000); + ros::Publisher plane_pub = nh.advertise + ("/planner_normal", 1000); +//------------------------------------------------------------------------------------------------------ + signal(SIGINT, SigHandle); + ros::Rate loop_rate(500); + bool status = ros::ok(); + while (status) + { + if (flg_exit) break; + ros::spinOnce(); + if(sync_packages(Measures)) + { + if (flg_reset) + { + ROS_WARN("reset when rosbag play back"); + p_imu->Reset(); + feats_undistort.reset(new PointCloudXYZI()); + if (use_imu_as_input) + { + // state_in = kf_input.get_x(); + state_in = state_input(); + kf_input.change_P(P_init); + } + else + { + // state_out = kf_output.get_x(); + state_out = state_output(); + kf_output.change_P(P_init_output); + } + flg_first_scan = true; + is_first_frame = true; + flg_reset = false; + init_map = false; + + { + ivox_.reset(new IVoxType(ivox_options_)); + } + } + + if (flg_first_scan) + { + first_lidar_time = Measures.lidar_beg_time; + flg_first_scan = false; + if (first_imu_time < 1) + { + first_imu_time = imu_next.header.stamp.toSec(); + printf("first imu time: %f\n", first_imu_time); + } + time_current = 0.0; + if(imu_en) + { + // imu_next = *(imu_deque.front()); + kf_input.x_.gravity << VEC_FROM_ARRAY(gravity); + kf_output.x_.gravity << VEC_FROM_ARRAY(gravity); + // kf_output.x_.acc << VEC_FROM_ARRAY(gravity); + // kf_output.x_.acc *= -1; + + { + while (Measures.lidar_beg_time > imu_next.header.stamp.toSec()) // if it is needed for the new map? + { + imu_deque.pop_front(); + if (imu_deque.empty()) + { + break; + } + imu_last = imu_next; + imu_next = *(imu_deque.front()); + // imu_deque.pop(); + } + } + } + else + { + kf_input.x_.gravity << VEC_FROM_ARRAY(gravity_init); + kf_output.x_.gravity << VEC_FROM_ARRAY(gravity_init); + kf_output.x_.acc << VEC_FROM_ARRAY(gravity_init); + kf_output.x_.acc *= -1; + p_imu->imu_need_init_ = false; + // p_imu->after_imu_init_ = true; + } + } + + double t0,t1,t2,t3,t4,t5,match_start, solve_start; + match_time = 0; + solve_time = 0; + propag_time = 0; + update_time = 0; + t0 = omp_get_wtime(); + + /*** downsample the feature points in a scan ***/ + t1 = omp_get_wtime(); + p_imu->Process(Measures, feats_undistort); + if(space_down_sample) + { + downSizeFilterSurf.setInputCloud(feats_undistort); + downSizeFilterSurf.filter(*feats_down_body); + sort(feats_down_body->points.begin(), feats_down_body->points.end(), time_list); + } + else + { + feats_down_body = Measures.lidar; + sort(feats_down_body->points.begin(), feats_down_body->points.end(), time_list); + } + { + time_seq = time_compressing(feats_down_body); + feats_down_size = feats_down_body->points.size(); + } + + if (!p_imu->after_imu_init_) + { + if (!p_imu->imu_need_init_) + { + V3D tmp_gravity; + if (imu_en) + {tmp_gravity = - p_imu->mean_acc / acc_norm * G_m_s2;} + else + {tmp_gravity << VEC_FROM_ARRAY(gravity_init); + p_imu->after_imu_init_ = true; + } + // V3D tmp_gravity << VEC_FROM_ARRAY(gravity_init); + M3D rot_init; + p_imu->Set_init(tmp_gravity, rot_init); + kf_input.x_.rot = rot_init; + kf_output.x_.rot = rot_init; + // kf_input.x_.rot; //.normalize(); + // kf_output.x_.rot; //.normalize(); + kf_output.x_.acc = - rot_init.transpose() * kf_output.x_.gravity; + } + else{ + continue;} + } + /*** initialize the map ***/ + if(!init_map) + { + feats_down_world->resize(feats_undistort->size()); + for(int i = 0; i < feats_undistort->size(); i++) + { + { + pointBodyToWorld(&(feats_undistort->points[i]), &(feats_down_world->points[i])); + } + } + for (size_t i = 0; i < feats_down_world->size(); i++) + { + init_feats_world->points.emplace_back(feats_down_world->points[i]); + } + if(init_feats_world->size() < init_map_size) + {init_map = false;} + else + { + ivox_->AddPoints(init_feats_world->points); + publish_init_map(pubLaserCloudMap); //(pubLaserCloudFullRes); + + init_feats_world.reset(new PointCloudXYZI()); + init_map = true; + } + continue; + } + + /*** ICP and Kalman filter update ***/ + normvec->resize(feats_down_size); + feats_down_world->resize(feats_down_size); + + Nearest_Points.resize(feats_down_size); + + t2 = omp_get_wtime(); + + /*** iterated state estimation ***/ + crossmat_list.reserve(feats_down_size); + pbody_list.reserve(feats_down_size); + // pbody_ext_list.reserve(feats_down_size); + + for (size_t i = 0; i < feats_down_body->size(); i++) + { + V3D point_this(feats_down_body->points[i].x, + feats_down_body->points[i].y, + feats_down_body->points[i].z); + pbody_list[i]=point_this; + if (!extrinsic_est_en) + // { + // if (!use_imu_as_input) + // { + // point_this = kf_output.x_.offset_R_L_I * point_this + kf_output.x_.offset_T_L_I; + // } + // else + // { + // point_this = kf_input.x_.offset_R_L_I * point_this + kf_input.x_.offset_T_L_I; + // } + // } + // else + { + point_this = Lidar_R_wrt_IMU * point_this + Lidar_T_wrt_IMU; + M3D point_crossmat; + point_crossmat << SKEW_SYM_MATRX(point_this); + crossmat_list[i]=point_crossmat; + } + } + if (!use_imu_as_input) + { + bool imu_upda_cov = false; + effct_feat_num = 0; + /**** point by point update ****/ + if (time_seq.size() > 0) + { + double pcl_beg_time = Measures.lidar_beg_time; + idx = -1; + for (k = 0; k < time_seq.size(); k++) + { + PointType &point_body = feats_down_body->points[idx+time_seq[k]]; + + time_current = point_body.curvature / 1000.0 + pcl_beg_time; + + if (is_first_frame) + { + if(imu_en) + { + while (time_current > imu_next.header.stamp.toSec()) + { + imu_deque.pop_front(); + if (imu_deque.empty()) break; + imu_last = imu_next; + imu_next = *(imu_deque.front()); + } + angvel_avr<header.stamp.toSec(); + while (imu_next.header.stamp.toSec() < time_predict_last_const && !imu_deque.empty()) + { + if (!last_imu) + { + imu_last = imu_next; + imu_next = *(imu_deque.front()); + break; + } + else + { + imu_deque.pop_front(); + if (imu_deque.empty()) break; + imu_last = imu_next; + imu_next = *(imu_deque.front()); + } + } + bool imu_comes = time_current > imu_next.header.stamp.toSec(); + while (imu_comes) + { + imu_upda_cov = true; + angvel_avr< 0.0) + { + time_update_last = imu_next.header.stamp.toSec(); + double propag_imu_start = omp_get_wtime(); + + kf_output.predict(dt_cov, Q_output, input_in, false, true); + + propag_time += omp_get_wtime() - propag_imu_start; + double solve_imu_start = omp_get_wtime(); + kf_output.update_iterated_dyn_share_IMU(); + solve_time += omp_get_wtime() - solve_imu_start; + } + } + imu_deque.pop_front(); + if (imu_deque.empty()) break; + imu_last = imu_next; + imu_next = *(imu_deque.front()); + imu_comes = time_current > imu_next.header.stamp.toSec(); + } + } + if (flg_reset) + { + break; + } + + double dt = time_current - time_predict_last_const; + double propag_state_start = omp_get_wtime(); + if(!prop_at_freq_of_imu) + { + double dt_cov = time_current - time_update_last; + if (dt_cov > 0.0) + { + kf_output.predict(dt_cov, Q_output, input_in, false, true); + time_update_last = time_current; + } + } + kf_output.predict(dt, Q_output, input_in, true, false); + propag_time += omp_get_wtime() - propag_state_start; + time_predict_last_const = time_current; + double t_update_start = omp_get_wtime(); + + if (feats_down_size < 1) + { + ROS_WARN("No point, skip this scan!\n"); + idx += time_seq[k]; + continue; + } + if (!kf_output.update_iterated_dyn_share_modified()) + { + idx = idx+time_seq[k]; + continue; + } + solve_start = omp_get_wtime(); + + if (publish_odometry_without_downsample) + { + /******* Publish odometry *******/ + + publish_odometry(pubOdomAftMapped); + if (runtime_pos_log) + { + euler_cur = SO3ToEuler(kf_output.x_.rot); + fout_out << setw(20) << Measures.lidar_beg_time - first_lidar_time << " " << euler_cur.transpose() << " " << kf_output.x_.pos.transpose() << " " << kf_output.x_.vel.transpose() \ + <<" "<points.size()<points[idx+j+1]; + PointType &point_world_j = feats_down_world->points[idx+j+1]; + pointBodyToWorld(&point_body_j, &point_world_j); + } + + solve_time += omp_get_wtime() - solve_start; + + update_time += omp_get_wtime() - t_update_start; + idx += time_seq[k]; + // cout << "pbp output effect feat num:" << effct_feat_num << endl; + } + } + else + { + if (!imu_deque.empty()) + { + imu_last = imu_next; + imu_next = *(imu_deque.front()); + + while (imu_next.header.stamp.toSec() > time_current && ((imu_next.header.stamp.toSec() < Measures.lidar_beg_time + lidar_time_inte ))) + { // >= ? + if (is_first_frame) + { + { + { + while (imu_next.header.stamp.toSec() < Measures.lidar_beg_time + lidar_time_inte) + { + // meas.imu.emplace_back(imu_deque.front()); should add to initialization + imu_deque.pop_front(); + if(imu_deque.empty()) break; + imu_last = imu_next; + imu_next = *(imu_deque.front()); + } + } + break; + } + angvel_avr< 0.0) + { + kf_output.predict(dt_cov, Q_output, input_in, false, true); + time_update_last = time_current; + } + kf_output.predict(dt, Q_output, input_in, true, false); + } + + time_predict_last_const = time_current; + + angvel_avr< 0) + { + double pcl_beg_time = Measures.lidar_beg_time; + idx = -1; + for (k = 0; k < time_seq.size(); k++) + { + PointType &point_body = feats_down_body->points[idx+time_seq[k]]; + time_current = point_body.curvature / 1000.0 + pcl_beg_time; + if (is_first_frame) + { + while (time_current > imu_next.header.stamp.toSec()) + { + imu_deque.pop_front(); + if (imu_deque.empty()) break; + imu_last = imu_next; + imu_next = *(imu_deque.front()); + } + imu_prop_cov = true; + + is_first_frame = false; + t_last = time_current; + time_update_last = time_current; + { + input_in.gyro< imu_next.header.stamp.toSec()) // && !imu_deque.empty()) + { + imu_deque.pop_front(); + + input_in.gyro< 0.0) + { + kf_input.predict(dt_cov, Q_input, input_in, false, true); + time_update_last = imu_last.header.stamp.toSec(); //time_current; + } + kf_input.predict(dt, Q_input, input_in, true, false); + t_last = imu_last.header.stamp.toSec(); + imu_prop_cov = true; + + if (imu_deque.empty()) break; + imu_last = imu_next; + imu_next = *(imu_deque.front()); + // imu_upda_cov = true; + } + if (flg_reset) + { + break; + } + double dt = time_current - t_last; + t_last = time_current; + double propag_start = omp_get_wtime(); + + if(!prop_at_freq_of_imu) + { + double dt_cov = time_current - time_update_last; + if (dt_cov > 0.0) + { + kf_input.predict(dt_cov, Q_input, input_in, false, true); + time_update_last = time_current; + } + } + kf_input.predict(dt, Q_input, input_in, true, false); + + propag_time += omp_get_wtime() - propag_start; + + double t_update_start = omp_get_wtime(); + + if (feats_down_size < 1) + { + ROS_WARN("No point, skip this scan!\n"); + + idx += time_seq[k]; + continue; + } + if (!kf_input.update_iterated_dyn_share_modified()) + { + idx = idx+time_seq[k]; + continue; + } + + solve_start = omp_get_wtime(); + + if (publish_odometry_without_downsample) + { + /******* Publish odometry *******/ + + publish_odometry(pubOdomAftMapped); + if (runtime_pos_log) + { + euler_cur = SO3ToEuler(kf_input.x_.rot); + fout_out << setw(20) << Measures.lidar_beg_time - first_lidar_time << " " << euler_cur.transpose() << " " << kf_input.x_.pos.transpose() << " " << kf_input.x_.vel.transpose() \ + <<" "<points.size()<points[idx+j+1]; + PointType &point_world_j = feats_down_world->points[idx+j+1]; + pointBodyToWorld(&point_body_j, &point_world_j); + } + solve_time += omp_get_wtime() - solve_start; + + update_time += omp_get_wtime() - t_update_start; + idx = idx + time_seq[k]; + } + } + else + { + if (!imu_deque.empty()) + { + imu_last = imu_next; + imu_next = *(imu_deque.front()); + while (imu_next.header.stamp.toSec() > time_current && ((imu_next.header.stamp.toSec() < Measures.lidar_beg_time + lidar_time_inte))) + { // >= ? + if (is_first_frame) + { + { + { + while (imu_next.header.stamp.toSec() < Measures.lidar_beg_time + lidar_time_inte) + { + imu_deque.pop_front(); + if(imu_deque.empty()) break; + imu_last = imu_next; + imu_next = *(imu_deque.front()); + } + } + + break; + } + imu_prop_cov = true; + + t_last = time_current; + time_update_last = time_current; + input_in.gyro< 0.0) + { + // kf_input.predict(dt_cov, Q_input, input_in, false, true); + time_update_last = imu_next.header.stamp.toSec(); //time_current; + } + // kf_input.predict(dt, Q_input, input_in, true, false); + + t_last = imu_next.header.stamp.toSec(); + + input_in.gyro< 4) + { + MapIncremental(); + } + + t5 = omp_get_wtime(); + /******* Publish points *******/ + if (path_en) publish_path(pubPath); + if (scan_pub_en || pcd_save_en) publish_frame_world(pubLaserCloudFullRes); + if (scan_pub_en && scan_body_pub_en) publish_frame_body(pubLaserCloudFullRes_body); + + /*** Debug variables Logging ***/ + if (runtime_pos_log) + { + frame_num ++; + aver_time_consu = aver_time_consu * (frame_num - 1) / frame_num + (t5 - t0) / frame_num; + {aver_time_icp = aver_time_icp * (frame_num - 1)/frame_num + update_time/frame_num;} + aver_time_match = aver_time_match * (frame_num - 1)/frame_num + (match_time)/frame_num; + aver_time_solve = aver_time_solve * (frame_num - 1)/frame_num + solve_time/frame_num; + aver_time_propag = aver_time_propag * (frame_num - 1)/frame_num + propag_time / frame_num; + T1[time_log_counter] = Measures.lidar_beg_time; + s_plot[time_log_counter] = t5 - t0; + s_plot2[time_log_counter] = feats_undistort->points.size(); + s_plot3[time_log_counter] = aver_time_consu; + time_log_counter ++; + printf("[ mapping ]: time: IMU + Map + Input Downsample: %0.6f ave match: %0.6f ave solve: %0.6f ave ICP: %0.6f map incre: %0.6f ave total: %0.6f icp: %0.6f propogate: %0.6f \n",t1-t0,aver_time_match,aver_time_solve,t3-t1,t5-t3,aver_time_consu, aver_time_icp, aver_time_propag); + if (!publish_odometry_without_downsample) + { + if (!use_imu_as_input) + { + fout_out << setw(20) << Measures.lidar_beg_time - first_lidar_time << " " << euler_cur.transpose() << " " << kf_output.x_.pos.transpose() << " " << kf_output.x_.vel.transpose() \ + <<" "<points.size()<points.size()<size() > 0 && pcd_save_en) + { + string file_name = string("scans.pcd"); + string all_points_dir(string(string(ROOT_DIR) + "PCD/") + file_name); + pcl::PCDWriter pcd_writer; + pcd_writer.writeBinary(all_points_dir, *pcl_wait_save); + } + fout_out.close(); + fout_imu_pbp.close(); + return 0; +} diff --git a/src/li_initialization.cpp b/src/li_initialization.cpp new file mode 100755 index 0000000..1152bec --- /dev/null +++ b/src/li_initialization.cpp @@ -0,0 +1,348 @@ +#include "li_initialization.h" +bool data_accum_finished = false, data_accum_start = false, online_calib_finish = false, refine_print = false; +int frame_num_init = 0; +double time_lag_IMU_wtr_lidar = 0.0, move_start_time = 0.0, online_calib_starts_time = 0.0; //, mean_acc_norm = 9.81; +double imu_first_time = 0.0; +bool lose_lid = false; +double timediff_imu_wrt_lidar = 0.0; +bool timediff_set_flg = false; +V3D gravity_lio = V3D::Zero(); +mutex mtx_buffer; +sensor_msgs::Imu imu_last, imu_next; +// sensor_msgs::Imu::ConstPtr imu_last_ptr; +PointCloudXYZI::Ptr ptr_con(new PointCloudXYZI()); +double T1[MAXN], s_plot[MAXN], s_plot2[MAXN], s_plot3[MAXN], s_plot11[MAXN]; + +condition_variable sig_buffer; +int scan_count = 0; +int frame_ct = 0, wait_num = 0; +std::mutex m_time; +bool lidar_pushed = false, imu_pushed = false; +std::deque lidar_buffer; +std::deque time_buffer; +std::deque imu_deque; + +void standard_pcl_cbk(const sensor_msgs::PointCloud2::ConstPtr &msg) +{ + // mtx_buffer.lock(); + scan_count ++; + double preprocess_start_time = omp_get_wtime(); + if (msg->header.stamp.toSec() < last_timestamp_lidar) + { + ROS_ERROR("lidar loop back, clear buffer"); + // lidar_buffer.shrink_to_fit(); + + // mtx_buffer.unlock(); + // sig_buffer.notify_all(); + return; + } + + last_timestamp_lidar = msg->header.stamp.toSec(); + // printf("check lidar time %f\n", last_timestamp_lidar); + // if (abs(last_timestamp_imu - last_timestamp_lidar) > 1.0 && !timediff_set_flg && !imu_deque.empty()) { + // timediff_set_flg = true; + // timediff_imu_wrt_lidar = last_timestamp_imu - last_timestamp_lidar; + // printf("Self sync IMU and LiDAR, HARD time lag is %.10lf \n \n", timediff_imu_wrt_lidar); + // } + + if ((lidar_type == VELO16 || lidar_type == OUST64 || lidar_type == HESAIxt32) && cut_frame_init) { + deque ptr; + deque timestamp_lidar; + p_pre->process_cut_frame_pcl2(msg, ptr, timestamp_lidar, cut_frame_num, scan_count); + while (!ptr.empty() && !timestamp_lidar.empty()) { + lidar_buffer.push_back(ptr.front()); + ptr.pop_front(); + time_buffer.push_back(timestamp_lidar.front() / double(1000));//unit:s + timestamp_lidar.pop_front(); + } + } + else + { + PointCloudXYZI::Ptr ptr(new PointCloudXYZI(20000,1)); + p_pre->process(msg, ptr); + if (con_frame) + { + if (frame_ct == 0) + { + time_con = last_timestamp_lidar; //msg->header.stamp.toSec(); + } + if (frame_ct < 10) + { + for (int i = 0; i < ptr->size(); i++) + { + ptr->points[i].curvature += (last_timestamp_lidar - time_con) * 1000; + ptr_con->push_back(ptr->points[i]); + } + frame_ct ++; + } + else + { + PointCloudXYZI::Ptr ptr_con_i(new PointCloudXYZI(10000,1)); + // cout << "ptr div num:" << ptr_div->size() << endl; + *ptr_con_i = *ptr_con; + lidar_buffer.push_back(ptr_con_i); + double time_con_i = time_con; + time_buffer.push_back(time_con_i); + ptr_con->clear(); + frame_ct = 0; + } + } + else + { + lidar_buffer.emplace_back(ptr); + time_buffer.emplace_back(msg->header.stamp.toSec()); + } + } + s_plot11[scan_count] = omp_get_wtime() - preprocess_start_time; + // mtx_buffer.unlock(); + // sig_buffer.notify_all(); +} + +void livox_pcl_cbk(const livox_ros_driver::CustomMsg::ConstPtr &msg) +{ + // mtx_buffer.lock(); + double preprocess_start_time = omp_get_wtime(); + scan_count ++; + if (msg->header.stamp.toSec() < last_timestamp_lidar) + { + ROS_ERROR("lidar loop back, clear buffer"); + + // mtx_buffer.unlock(); + // sig_buffer.notify_all(); + return; + // lidar_buffer.shrink_to_fit(); + } + + last_timestamp_lidar = msg->header.stamp.toSec(); + // if (abs(last_timestamp_imu - last_timestamp_lidar) > 1.0 && !timediff_set_flg && !imu_deque.empty()) { + // timediff_set_flg = true; + // timediff_imu_wrt_lidar = last_timestamp_imu - last_timestamp_lidar; + // printf("Self sync IMU and LiDAR, HARD time lag is %.10lf \n \n", timediff_imu_wrt_lidar); + // } + + if (cut_frame_init) { + deque ptr; + deque timestamp_lidar; + p_pre->process_cut_frame_livox(msg, ptr, timestamp_lidar, cut_frame_num, scan_count); + + while (!ptr.empty() && !timestamp_lidar.empty()) { + lidar_buffer.push_back(ptr.front()); + ptr.pop_front(); + time_buffer.push_back(timestamp_lidar.front() / double(1000));//unit:s + timestamp_lidar.pop_front(); + } + } + else + { + PointCloudXYZI::Ptr ptr(new PointCloudXYZI(10000,1)); + p_pre->process(msg, ptr); + if (con_frame) + { + if (frame_ct == 0) + { + time_con = last_timestamp_lidar; //msg->header.stamp.toSec(); + } + if (frame_ct < 10) + { + for (int i = 0; i < ptr->size(); i++) + { + ptr->points[i].curvature += (last_timestamp_lidar - time_con) * 1000; + ptr_con->push_back(ptr->points[i]); + } + frame_ct ++; + } + else + { + PointCloudXYZI::Ptr ptr_con_i(new PointCloudXYZI(10000,1)); + // cout << "ptr div num:" << ptr_div->size() << endl; + *ptr_con_i = *ptr_con; + double time_con_i = time_con; + lidar_buffer.push_back(ptr_con_i); + time_buffer.push_back(time_con_i); + ptr_con->clear(); + frame_ct = 0; + } + } + else + { + lidar_buffer.emplace_back(ptr); + time_buffer.emplace_back(msg->header.stamp.toSec()); + } + } + s_plot11[scan_count] = omp_get_wtime() - preprocess_start_time; + // mtx_buffer.unlock(); + // sig_buffer.notify_all(); +} + +void imu_cbk(const sensor_msgs::Imu::ConstPtr &msg_in) +{ + // mtx_buffer.lock(); + + // publish_count ++; + sensor_msgs::Imu::Ptr msg(new sensor_msgs::Imu(*msg_in)); + + msg->header.stamp = ros::Time().fromSec(msg->header.stamp.toSec() - timediff_imu_wrt_lidar - time_lag_IMU_wtr_lidar); + + double timestamp = msg->header.stamp.toSec(); + // printf("time_diff%f, %f, %f\n", last_timestamp_imu - timestamp, last_timestamp_imu, timestamp); + + if (timestamp < last_timestamp_imu) + { + ROS_ERROR("imu loop back, clear deque"); + // imu_deque.shrink_to_fit(); + // cout << "check time:" << timestamp << ";" << last_timestamp_imu << endl; + // printf("time_diff%f, %f, %f\n", last_timestamp_imu - timestamp, last_timestamp_imu, timestamp); + + // mtx_buffer.unlock(); + // sig_buffer.notify_all(); + return; + } + imu_deque.emplace_back(msg); + last_timestamp_imu = timestamp; + // mtx_buffer.unlock(); + // sig_buffer.notify_all(); +} + +bool sync_packages(MeasureGroup &meas) +{ + { + if (!imu_en) + { + if (!lidar_buffer.empty()) + { + if (!lidar_pushed) + { + meas.lidar = lidar_buffer.front(); + meas.lidar_beg_time = time_buffer.front(); + lose_lid = false; + if(meas.lidar->points.size() < 1) + { + cout << "lose lidar" << std::endl; + // return false; + lose_lid = true; + } + else + { + double end_time = meas.lidar->points.back().curvature; + for (auto pt: meas.lidar->points) + { + if (pt.curvature > end_time) + { + end_time = pt.curvature; + } + } + lidar_end_time = meas.lidar_beg_time + end_time / double(1000); + meas.lidar_last_time = lidar_end_time; + } + lidar_pushed = true; + } + + time_buffer.pop_front(); + lidar_buffer.pop_front(); + lidar_pushed = false; + if (!lose_lid) + { + return true; + } + else + { + return false; + } + } + return false; + } + + if (lidar_buffer.empty() || imu_deque.empty()) + { + return false; + } + /*** push a lidar scan ***/ + if(!lidar_pushed) + { + lose_lid = false; + meas.lidar = lidar_buffer.front(); + meas.lidar_beg_time = time_buffer.front(); + if(meas.lidar->points.size() < 1) + { + cout << "lose lidar" << endl; + lose_lid = true; + // lidar_buffer.pop_front(); + // time_buffer.pop_front(); + // return false; + } + else + { + double end_time = meas.lidar->points.back().curvature; + for (auto pt: meas.lidar->points) + { + if (pt.curvature > end_time) + { + end_time = pt.curvature; + } + } + lidar_end_time = meas.lidar_beg_time + end_time / double(1000); + // cout << "check time lidar:" << end_time << endl; + meas.lidar_last_time = lidar_end_time; + } + lidar_pushed = true; + } + + if (!lose_lid && (last_timestamp_imu < lidar_end_time)) + { + return false; + } + if (lose_lid && last_timestamp_imu < meas.lidar_beg_time + lidar_time_inte) + { + return false; + } + + if (!lose_lid && !imu_pushed) + { + /*** push imu data, and pop from imu buffer ***/ + if (p_imu->imu_need_init_) + { + double imu_time = imu_deque.front()->header.stamp.toSec(); + imu_next = *(imu_deque.front()); + meas.imu.shrink_to_fit(); + while (imu_time < lidar_end_time) + { + meas.imu.emplace_back(imu_deque.front()); + imu_last = imu_next; + imu_deque.pop_front(); + if(imu_deque.empty()) break; + imu_time = imu_deque.front()->header.stamp.toSec(); // can be changed + imu_next = *(imu_deque.front()); + } + } + imu_pushed = true; + } + + if (lose_lid && !imu_pushed) + { + /*** push imu data, and pop from imu buffer ***/ + if (p_imu->imu_need_init_) + { + double imu_time = imu_deque.front()->header.stamp.toSec(); + meas.imu.shrink_to_fit(); + + imu_next = *(imu_deque.front()); + while (imu_time < meas.lidar_beg_time + lidar_time_inte) + { + meas.imu.emplace_back(imu_deque.front()); + imu_last = imu_next; + imu_deque.pop_front(); + if(imu_deque.empty()) break; + imu_time = imu_deque.front()->header.stamp.toSec(); // can be changed + imu_next = *(imu_deque.front()); + } + } + imu_pushed = true; + } + + lidar_buffer.pop_front(); + time_buffer.pop_front(); + lidar_pushed = false; + imu_pushed = false; + return true; + } +} diff --git a/src/li_initialization.h b/src/li_initialization.h new file mode 100755 index 0000000..555773c --- /dev/null +++ b/src/li_initialization.h @@ -0,0 +1,36 @@ +#pragma once + +#include +#include "Estimator.h" +#define MAXN (720000) + +extern bool data_accum_finished, data_accum_start, online_calib_finish, refine_print; +extern int frame_num_init; +extern double time_lag_IMU_wtr_lidar, move_start_time, online_calib_starts_time; //, mean_acc_norm = 9.81; + +extern double timediff_imu_wrt_lidar; +extern bool timediff_set_flg; +extern V3D gravity_lio; +extern mutex mtx_buffer; +extern condition_variable sig_buffer; +extern int scan_count; +extern int frame_ct, wait_num; +extern std::deque lidar_buffer; +extern std::deque time_buffer; +extern std::deque imu_deque; +extern std::mutex m_time; +extern bool lidar_pushed, imu_pushed; +extern double imu_first_time; +extern bool lose_lid; +extern sensor_msgs::Imu imu_last, imu_next; +extern PointCloudXYZI::Ptr ptr_con; +extern double T1[MAXN], s_plot[MAXN], s_plot2[MAXN], s_plot3[MAXN], s_plot11[MAXN]; + +// extern sensor_msgs::Imu::ConstPtr imu_last_ptr; + +void standard_pcl_cbk(const sensor_msgs::PointCloud2::ConstPtr &msg); +void livox_pcl_cbk(const livox_ros_driver::CustomMsg::ConstPtr &msg); +void imu_cbk(const sensor_msgs::Imu::ConstPtr &msg_in); +bool sync_packages(MeasureGroup &meas); + +// #endif \ No newline at end of file diff --git a/src/parameters.cpp b/src/parameters.cpp new file mode 100755 index 0000000..067ff4c --- /dev/null +++ b/src/parameters.cpp @@ -0,0 +1,170 @@ +#include "parameters.h" + +bool is_first_frame = true; +double lidar_end_time = 0.0, first_lidar_time = 0.0, time_con = 0.0; +double last_timestamp_lidar = -1.0, last_timestamp_imu = -1.0; +int pcd_index = 0; +IVoxType::Options ivox_options_; +int ivox_nearby_type = 6; + +std::vector extrinT(3, 0.0); +std::vector extrinR(9, 0.0); +state_input state_in; +state_output state_out; +std::string lid_topic, imu_topic; +bool prop_at_freq_of_imu = true, check_satu = true, con_frame = false, cut_frame = false; +bool use_imu_as_input = false, space_down_sample = true, publish_odometry_without_downsample = false; +int init_map_size = 10, con_frame_num = 1; +double match_s = 81, satu_acc, satu_gyro, cut_frame_time_interval = 0.1; +float plane_thr = 0.1f; +double filter_size_surf_min = 0.5, filter_size_map_min = 0.5, fov_deg = 180; +// double cube_len = 2000; +float DET_RANGE = 450; +bool imu_en = true; +double imu_time_inte = 0.005; +double laser_point_cov = 0.01, acc_norm; +double vel_cov, acc_cov_input, gyr_cov_input; +double gyr_cov_output, acc_cov_output, b_gyr_cov, b_acc_cov; +double imu_meas_acc_cov, imu_meas_omg_cov; +int lidar_type, pcd_save_interval; +std::vector gravity_init, gravity; +bool runtime_pos_log, pcd_save_en, path_en, extrinsic_est_en = true; +bool scan_pub_en, scan_body_pub_en; +shared_ptr p_pre; +shared_ptr p_imu; +double time_update_last = 0.0, time_current = 0.0, time_predict_last_const = 0.0, t_last = 0.0; +double time_diff_lidar_to_imu = 0.0; + +double lidar_time_inte = 0.1, first_imu_time = 0.0; +int cut_frame_num = 1, orig_odom_freq = 10; +double online_refine_time = 20.0; //unit: s +bool cut_frame_init = true; + +MeasureGroup Measures; + +ofstream fout_out, fout_imu_pbp, fout_rtk; + +void readParameters(ros::NodeHandle &nh) +{ + p_pre.reset(new Preprocess()); + p_imu.reset(new ImuProcess()); + nh.param("prop_at_freq_of_imu", prop_at_freq_of_imu, 1); + nh.param("use_imu_as_input", use_imu_as_input, 0); + nh.param("check_satu", check_satu, 1); + nh.param("init_map_size", init_map_size, 100); + nh.param("space_down_sample", space_down_sample, 1); + nh.param("mapping/satu_acc",satu_acc,3.0); + nh.param("mapping/satu_gyro",satu_gyro,35.0); + nh.param("mapping/acc_norm",acc_norm,1.0); + nh.param("mapping/plane_thr", plane_thr, 0.05f); + nh.param("point_filter_num", p_pre->point_filter_num, 2); + nh.param("common/lid_topic",lid_topic,"/livox/lidar"); + nh.param("common/imu_topic", imu_topic,"/livox/imu"); + nh.param("common/con_frame",con_frame,false); + nh.param("common/con_frame_num",con_frame_num,1); + nh.param("common/cut_frame",cut_frame,false); + nh.param("common/cut_frame_time_interval",cut_frame_time_interval,0.1); + nh.param("common/time_diff_lidar_to_imu",time_diff_lidar_to_imu,0.0); + nh.param("filter_size_surf",filter_size_surf_min,0.5); + nh.param("filter_size_map",filter_size_map_min,0.5); + // nh.param("cube_side_length",cube_len,2000); + nh.param("mapping/det_range",DET_RANGE,300.f); + nh.param("mapping/fov_degree",fov_deg,180); + nh.param("mapping/imu_en",imu_en,true); + nh.param("mapping/extrinsic_est_en",extrinsic_est_en,true); + nh.param("mapping/imu_time_inte",imu_time_inte,0.005); + nh.param("mapping/lidar_meas_cov",laser_point_cov,0.1); + nh.param("mapping/acc_cov_input",acc_cov_input,0.1); + nh.param("mapping/vel_cov",vel_cov,20); + nh.param("mapping/gyr_cov_input",gyr_cov_input,0.1); + nh.param("mapping/gyr_cov_output",gyr_cov_output,0.1); + nh.param("mapping/acc_cov_output",acc_cov_output,0.1); + nh.param("mapping/b_gyr_cov",b_gyr_cov,0.0001); + nh.param("mapping/b_acc_cov",b_acc_cov,0.0001); + nh.param("mapping/imu_meas_acc_cov",imu_meas_acc_cov,0.1); + nh.param("mapping/imu_meas_omg_cov",imu_meas_omg_cov,0.1); + nh.param("preprocess/blind", p_pre->blind, 1.0); + nh.param("preprocess/lidar_type", lidar_type, 1); + nh.param("preprocess/scan_line", p_pre->N_SCANS, 16); + nh.param("preprocess/scan_rate", p_pre->SCAN_RATE, 10); + nh.param("preprocess/timestamp_unit", p_pre->time_unit, 1); + nh.param("mapping/match_s", match_s, 81); + nh.param>("mapping/gravity", gravity, std::vector()); + nh.param>("mapping/gravity_init", gravity_init, std::vector()); + nh.param>("mapping/extrinsic_T", extrinT, std::vector()); + nh.param>("mapping/extrinsic_R", extrinR, std::vector()); + nh.param("odometry/publish_odometry_without_downsample", publish_odometry_without_downsample, false); + nh.param("publish/path_en",path_en, true); + nh.param("publish/scan_publish_en",scan_pub_en,1); + nh.param("publish/scan_bodyframe_pub_en",scan_body_pub_en,1); + nh.param("runtime_pos_log_enable", runtime_pos_log, 0); + nh.param("pcd_save/pcd_save_en", pcd_save_en, false); + nh.param("pcd_save/interval", pcd_save_interval, -1); + + nh.param("mapping/lidar_time_inte",lidar_time_inte,0.1); + nh.param("mapping/lidar_meas_cov",laser_point_cov,0.1); + + nh.param("mapping/ivox_grid_resolution", ivox_options_.resolution_, 0.2); + nh.param("ivox_nearby_type", ivox_nearby_type, 18); + if (ivox_nearby_type == 0) { + ivox_options_.nearby_type_ = IVoxType::NearbyType::CENTER; + } else if (ivox_nearby_type == 6) { + ivox_options_.nearby_type_ = IVoxType::NearbyType::NEARBY6; + } else if (ivox_nearby_type == 18) { + ivox_options_.nearby_type_ = IVoxType::NearbyType::NEARBY18; + } else if (ivox_nearby_type == 26) { + ivox_options_.nearby_type_ = IVoxType::NearbyType::NEARBY26; + } else { + // LOG(WARNING) << "unknown ivox_nearby_type, use NEARBY18"; + ivox_options_.nearby_type_ = IVoxType::NearbyType::NEARBY18; + } + p_imu->gravity_ << VEC_FROM_ARRAY(gravity); +} + +Eigen::Matrix SO3ToEuler(const SO3 &rot) +{ + double sy = sqrt(rot(0,0)*rot(0,0) + rot(1,0)*rot(1,0)); + bool singular = sy < 1e-6; + double x, y, z; + if(!singular) + { + x = atan2(rot(2, 1), rot(2, 2)); + y = atan2(-rot(2, 0), sy); + z = atan2(rot(1, 0), rot(0, 0)); + } + else + { + x = atan2(-rot(1, 2), rot(1, 1)); + y = atan2(-rot(2, 0), sy); + z = 0; + } + Eigen::Matrix ang(x, y, z); + return ang; +} + +void open_file() +{ + + fout_out.open(DEBUG_FILE_DIR("mat_out.txt"),ios::out); + fout_imu_pbp.open(DEBUG_FILE_DIR("imu_pbp.txt"),ios::out); + if (fout_out && fout_imu_pbp) + cout << "~~~~"< & P_init) +{ + P_init = MD(24, 24)::Identity() * 0.1; + P_init.block<3, 3>(21, 21) = MD(3,3)::Identity() * 0.0001; + P_init.block<6, 6>(15, 15) = MD(6,6)::Identity() * 0.001; +} + +void reset_cov_output(Eigen::Matrix & P_init_output) +{ + P_init_output = MD(30, 30)::Identity() * 0.01; + P_init_output.block<3, 3>(21, 21) = MD(3,3)::Identity() * 0.0001; + // P_init_output.block<6, 6>(6, 6) = MD(6,6)::Identity() * 0.0001; + P_init_output.block<6, 6>(24, 24) = MD(6,6)::Identity() * 0.001; +} \ No newline at end of file diff --git a/src/parameters.h b/src/parameters.h new file mode 100755 index 0000000..e41acfd --- /dev/null +++ b/src/parameters.h @@ -0,0 +1,83 @@ +// #ifndef PARAM_H +// #define PARAM_H +#pragma once +#include +#include +#include +#include +#include "preprocess.h" +#include "IMU_Processing.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// #define IVOX_NODE_TYPE_PHC + +#ifdef IVOX_NODE_TYPE_PHC + using IVoxType = faster_lio::IVox<3, faster_lio::IVoxNodeType::PHC, PointType>; +#else + using IVoxType = faster_lio::IVox<3, faster_lio::IVoxNodeType::DEFAULT, PointType>; +#endif + +extern bool is_first_frame; +extern double lidar_end_time, first_lidar_time, time_con; +extern double last_timestamp_lidar, last_timestamp_imu; +extern int pcd_index; +extern IVoxType::Options ivox_options_; +extern int ivox_nearby_type; +extern state_input state_in; +extern state_output state_out; +extern std::string lid_topic, imu_topic; +extern bool prop_at_freq_of_imu, check_satu, con_frame, cut_frame; +extern bool use_imu_as_input, space_down_sample; +extern bool extrinsic_est_en, publish_odometry_without_downsample; +extern int init_map_size, con_frame_num; +extern double match_s, satu_acc, satu_gyro, cut_frame_time_interval; +extern float plane_thr; +extern double filter_size_surf_min, filter_size_map_min, fov_deg; +// extern double cube_len; +extern float DET_RANGE; +extern bool imu_en; +extern double imu_time_inte; +extern double laser_point_cov, acc_norm; +extern double acc_cov_input, gyr_cov_input, vel_cov; +extern double gyr_cov_output, acc_cov_output, b_gyr_cov, b_acc_cov; +extern double imu_meas_acc_cov, imu_meas_omg_cov; +extern int lidar_type, pcd_save_interval; +extern std::vector gravity_init, gravity; +extern bool runtime_pos_log, pcd_save_en, path_en; +extern bool scan_pub_en, scan_body_pub_en; +extern shared_ptr p_pre; +extern shared_ptr p_imu; +extern bool is_first_frame; + +extern std::vector extrinT; +extern std::vector extrinR; +extern double time_diff_lidar_to_imu; +extern double lidar_time_inte, first_imu_time; +extern int cut_frame_num, orig_odom_freq; +extern double online_refine_time; //unit: s +extern bool cut_frame_init; +extern double time_update_last, time_current, time_predict_last_const, t_last; + +extern MeasureGroup Measures; + +extern ofstream fout_out, fout_imu_pbp, fout_rtk; +void readParameters(ros::NodeHandle &n); +void open_file(); +Eigen::Matrix SO3ToEuler(const SO3 &orient); +void reset_cov(Eigen::Matrix & P_init); +void reset_cov_output(Eigen::Matrix & P_init_output); \ No newline at end of file diff --git a/src/preprocess.cpp b/src/preprocess.cpp new file mode 100755 index 0000000..f53ecb8 --- /dev/null +++ b/src/preprocess.cpp @@ -0,0 +1,1026 @@ +#include "preprocess.h" + +#define RETURN0 0x00 +#define RETURN0AND1 0x10 + +const bool time_list_cut_frame(PointType &x, PointType &y) { + return (x.curvature < y.curvature); +} + +Preprocess::Preprocess() + :lidar_type(AVIA), blind(0.01), point_filter_num(1) +{ + inf_bound = 10; + N_SCANS = 6; + SCAN_RATE = 10; + group_size = 8; + disA = 0.01; + disA = 0.1; // B? + p2l_ratio = 225; + limit_maxmid =6.25; + limit_midmin =6.25; + limit_maxmin = 3.24; + jump_up_limit = 170.0; + jump_down_limit = 8.0; + cos160 = 160.0; + edgea = 2; + edgeb = 0.1; + smallp_intersect = 172.5; + smallp_ratio = 1.2; + given_offset_time = false; + + jump_up_limit = cos(jump_up_limit/180*M_PI); + jump_down_limit = cos(jump_down_limit/180*M_PI); + cos160 = cos(cos160/180*M_PI); + smallp_intersect = cos(smallp_intersect/180*M_PI); +} + +Preprocess::~Preprocess() {} + +void Preprocess::set(bool feat_en, int lid_type, double bld, int pfilt_num) +{ + lidar_type = lid_type; + blind = bld; + point_filter_num = pfilt_num; +} + +void Preprocess::process(const livox_ros_driver::CustomMsg::ConstPtr &msg, PointCloudXYZI::Ptr &pcl_out) +{ + avia_handler(msg); + *pcl_out = pl_surf; +} + +void Preprocess::process(const sensor_msgs::PointCloud2::ConstPtr &msg, PointCloudXYZI::Ptr &pcl_out) +{ + switch (time_unit) + { + case SEC: + time_unit_scale = 1.e3f; + break; + case MS: + time_unit_scale = 1.f; + break; + case US: + time_unit_scale = 1.e-3f; + break; + case NS: + time_unit_scale = 1.e-6f; + break; + default: + time_unit_scale = 1.f; + break; + } + + switch (lidar_type) + { + case OUST64: + oust64_handler(msg); + break; + + case VELO16: + velodyne_handler(msg); + break; + + case HESAIxt32: + hesai_handler(msg); + break; + + default: + printf("Error LiDAR Type"); + break; + } + *pcl_out = pl_surf; +} + + +void Preprocess::process_cut_frame_livox(const livox_ros_driver::CustomMsg::ConstPtr &msg, + deque &pcl_out, deque &time_lidar, + const int required_frame_num, int scan_count) { + int plsize = msg->point_num; + pl_surf.clear(); + pl_surf.reserve(plsize); + pl_full.clear(); + pl_full.resize(plsize); + int valid_point_num = 0; + + for (uint i = 1; i < plsize; i++) { + if ((msg->points[i].line < N_SCANS) && + ((msg->points[i].tag & 0x30) == 0x10 || (msg->points[i].tag & 0x30) == 0x00)) + { + valid_point_num++; + if (valid_point_num % point_filter_num == 0) { + pl_full[i].x = msg->points[i].x; + pl_full[i].y = msg->points[i].y; + pl_full[i].z = msg->points[i].z; + pl_full[i].intensity = msg->points[i].reflectivity; + //use curvature as time of each laser points,unit: ms + pl_full[i].curvature = msg->points[i].offset_time / float(1000000); + + double dist = pl_full[i].x * pl_full[i].x + pl_full[i].y * pl_full[i].y + pl_full[i].z * pl_full[i].z; + if (dist < blind * blind) continue; + + if ((abs(pl_full[i].x - pl_full[i - 1].x) > 1e-7) + || (abs(pl_full[i].y - pl_full[i - 1].y) > 1e-7) + || (abs(pl_full[i].z - pl_full[i - 1].z) > 1e-7)) { + pl_surf.push_back(pl_full[i]); + } + } + } + } + sort(pl_surf.points.begin(), pl_surf.points.end(), time_list_cut_frame); + //end time of last frame,单位ms + double last_frame_end_time = msg->header.stamp.toSec() * 1000; + uint valid_num = 0; + uint cut_num = 0; + uint valid_pcl_size = pl_surf.points.size(); + + int required_cut_num = required_frame_num; + if (scan_count < 5) + required_cut_num = 1; + + PointCloudXYZI pcl_cut; + for (uint i = 1; i < valid_pcl_size; i++) { + valid_num++; + //Compute new opffset time of each point:ms + pl_surf[i].curvature += msg->header.stamp.toSec() * 1000 - last_frame_end_time; + pcl_cut.push_back(pl_surf[i]); + if (valid_num == (int((cut_num + 1) * valid_pcl_size / required_cut_num) - 1)) { + cut_num++; + time_lidar.push_back(last_frame_end_time); + PointCloudXYZI::Ptr pcl_temp(new PointCloudXYZI()); //Initialize shared_ptr + *pcl_temp = pcl_cut; + pcl_out.push_back(pcl_temp); + //Update frame head + last_frame_end_time += pl_surf[i].curvature; + pcl_cut.clear(); + pcl_cut.reserve(valid_pcl_size * 2 / required_frame_num); + } + } +} +#define MAX_LINE_NUM 128 +void +Preprocess::process_cut_frame_pcl2(const sensor_msgs::PointCloud2::ConstPtr &msg, deque &pcl_out, + deque &time_lidar, const int required_frame_num, int scan_count) { + pl_surf.clear(); + pl_corn.clear(); + pl_full.clear(); + if (lidar_type == VELO16) { + pcl::PointCloud pl_orig; + pcl::fromROSMsg(*msg, pl_orig); + int plsize = pl_orig.points.size(); + pl_surf.reserve(plsize); + + bool is_first[MAX_LINE_NUM]; + double yaw_fp[MAX_LINE_NUM] = {0}; // yaw of first scan point + double omega_l = 3.61; // scan angular velocity (deg/ms) + float yaw_last[MAX_LINE_NUM] = {0.0}; // yaw of last scan point + float time_last[MAX_LINE_NUM] = {0.0}; // last offset time + + if (pl_orig.points[plsize - 1].time > 0) { + given_offset_time = true; + } else { + cout << "Compute offset time using constant rotation model." << endl; + given_offset_time = false; + memset(is_first, true, sizeof(is_first)); + } + + for (int i = 0; i < plsize; i++) { + PointType added_pt; + added_pt.normal_x = 0; + added_pt.normal_y = 0; + added_pt.normal_z = 0; + added_pt.x = pl_orig.points[i].x; + added_pt.y = pl_orig.points[i].y; + added_pt.z = pl_orig.points[i].z; + added_pt.intensity = pl_orig.points[i].intensity; + added_pt.curvature = pl_orig.points[i].time * 1000.0; //ms + + double dist = added_pt.x * added_pt.x + added_pt.y * added_pt.y + added_pt.z * added_pt.z; + if ( dist < blind * blind || isnan(added_pt.x) || isnan(added_pt.y) || isnan(added_pt.z)) + continue; + + if (!given_offset_time) { + int layer = pl_orig.points[i].ring; + double yaw_angle = atan2(added_pt.y, added_pt.x) * 57.2957; + + if (is_first[layer]) { + yaw_fp[layer] = yaw_angle; + is_first[layer] = false; + added_pt.curvature = 0.0; + yaw_last[layer] = yaw_angle; + time_last[layer] = added_pt.curvature; + continue; + } + // compute offset time + if (yaw_angle <= yaw_fp[layer]) { + added_pt.curvature = (yaw_fp[layer] - yaw_angle) / omega_l; + } else { + added_pt.curvature = (yaw_fp[layer] - yaw_angle + 360.0) / omega_l; + } + if (added_pt.curvature < time_last[layer]) added_pt.curvature += 360.0 / omega_l; + + yaw_last[layer] = yaw_angle; + time_last[layer] = added_pt.curvature; + } + + + if (i % point_filter_num == 0 && pl_orig.points[i].ring < N_SCANS) { + pl_surf.points.push_back(added_pt); + } + } + } else if (lidar_type == OUST64) { + pcl::PointCloud pl_orig; + pcl::fromROSMsg(*msg, pl_orig); + int plsize = pl_orig.points.size(); + pl_surf.reserve(plsize); + for (int i = 0; i < plsize; i++) { + PointType added_pt; + added_pt.normal_x = 0; + added_pt.normal_y = 0; + added_pt.normal_z = 0; + added_pt.x = pl_orig.points[i].x; + added_pt.y = pl_orig.points[i].y; + added_pt.z = pl_orig.points[i].z; + added_pt.intensity = pl_orig.points[i].intensity; + added_pt.curvature = pl_orig.points[i].t / 1e6; //ns to ms + + double dist = added_pt.x * added_pt.x + added_pt.y * added_pt.y + added_pt.z * added_pt.z; + if ( dist < blind * blind || isnan(added_pt.x) || isnan(added_pt.y) || isnan(added_pt.z)) + continue; + + if (i % point_filter_num == 0 && pl_orig.points[i].ring < N_SCANS) { + pl_surf.points.push_back(added_pt); + } + } + } else if(lidar_type == HESAIxt32) { + pcl::PointCloud pl_orig; + pcl::fromROSMsg(*msg, pl_orig); + int plsize = pl_orig.points.size(); + pl_surf.reserve(plsize); + for (int i = 0; i < plsize; i++) { + PointType added_pt; + added_pt.normal_x = 0; + added_pt.normal_y = 0; + added_pt.normal_z = 0; + added_pt.x = pl_orig.points[i].x; + added_pt.y = pl_orig.points[i].y; + added_pt.z = pl_orig.points[i].z; + added_pt.intensity = pl_orig.points[i].intensity; + added_pt.curvature = (pl_orig.points[i].timestamp - msg->header.stamp.toSec()) * 1000; //s to ms + + double dist = added_pt.x * added_pt.x + added_pt.y * added_pt.y + added_pt.z * added_pt.z; + if ( dist < blind * blind || isnan(added_pt.x) || isnan(added_pt.y) || isnan(added_pt.z)) + continue; + + if (i % point_filter_num == 0 && pl_orig.points[i].ring < N_SCANS) { + pl_surf.points.push_back(added_pt); + } + } + }else{ + cout << "Wrong LiDAR Type!!!" << endl; + return; + } + + sort(pl_surf.points.begin(), pl_surf.points.end(), time_list_cut_frame); + + //ms + double last_frame_end_time = msg->header.stamp.toSec() * 1000; + uint valid_num = 0; + uint cut_num = 0; + uint valid_pcl_size = pl_surf.points.size(); + + int required_cut_num = required_frame_num; + + if (scan_count < 20) + required_cut_num = 1; + + + PointCloudXYZI pcl_cut; + for (uint i = 1; i < valid_pcl_size; i++) { + valid_num++; + pl_surf[i].curvature += msg->header.stamp.toSec() * 1000 - last_frame_end_time; + pcl_cut.push_back(pl_surf[i]); + + if (valid_num == (int((cut_num + 1) * valid_pcl_size / required_cut_num) - 1)) { + cut_num++; + time_lidar.push_back(last_frame_end_time); + PointCloudXYZI::Ptr pcl_temp(new PointCloudXYZI()); + *pcl_temp = pcl_cut; + pcl_out.push_back(pcl_temp); + last_frame_end_time += pl_surf[i].curvature; + pcl_cut.clear(); + pcl_cut.reserve(valid_pcl_size * 2 / required_frame_num); + } + } +} + +void Preprocess::avia_handler(const livox_ros_driver::CustomMsg::ConstPtr &msg) +{ + pl_surf.clear(); + pl_corn.clear(); + pl_full.clear(); + double t1 = omp_get_wtime(); + int plsize = msg->point_num; + + pl_corn.reserve(plsize); + pl_surf.reserve(plsize); + pl_full.resize(plsize); + + for(int i=0; ipoints[i].line < N_SCANS) && ((msg->points[i].tag & 0x30) == 0x10 || (msg->points[i].tag & 0x30) == 0x00)) + { + valid_num ++; + if (valid_num % point_filter_num == 0) + { + pl_full[i].x = msg->points[i].x; + pl_full[i].y = msg->points[i].y; + pl_full[i].z = msg->points[i].z; + pl_full[i].intensity = msg->points[i].reflectivity; + pl_full[i].curvature = msg->points[i].offset_time / float(1000000); // use curvature as time of each laser points, curvature unit: ms + + if(((abs(pl_full[i].x - pl_full[i-1].x) > 1e-7) + || (abs(pl_full[i].y - pl_full[i-1].y) > 1e-7) + || (abs(pl_full[i].z - pl_full[i-1].z) > 1e-7)) + && (pl_full[i].x * pl_full[i].x + pl_full[i].y * pl_full[i].y + pl_full[i].z * pl_full[i].z > (blind * blind))) + { + pl_surf.push_back(pl_full[i]); + } + } + } + } + +} + +void Preprocess::oust64_handler(const sensor_msgs::PointCloud2::ConstPtr &msg) +{ + pl_surf.clear(); + pl_corn.clear(); + pl_full.clear(); + pcl::PointCloud pl_orig; + pcl::fromROSMsg(*msg, pl_orig); + int plsize = pl_orig.size(); + pl_corn.reserve(plsize); + pl_surf.reserve(plsize); + + + double time_stamp = msg->header.stamp.toSec(); + // cout << "===================================" << endl; + // printf("Pt size = %d, N_SCANS = %d\r\n", plsize, N_SCANS); + for (int i = 0; i < pl_orig.points.size(); i++) + { + if (i % point_filter_num != 0) continue; + + double range = pl_orig.points[i].x * pl_orig.points[i].x + pl_orig.points[i].y * pl_orig.points[i].y + pl_orig.points[i].z * pl_orig.points[i].z; + + if (range < (blind * blind)) continue; + + Eigen::Vector3d pt_vec; + PointType added_pt; + added_pt.x = pl_orig.points[i].x; + added_pt.y = pl_orig.points[i].y; + added_pt.z = pl_orig.points[i].z; + added_pt.intensity = pl_orig.points[i].intensity; + added_pt.normal_x = 0; + added_pt.normal_y = 0; + added_pt.normal_z = 0; + added_pt.curvature = pl_orig.points[i].t * time_unit_scale; // curvature unit: ms + + pl_surf.points.push_back(added_pt); + } + + // pub_func(pl_surf, pub_full, msg->header.stamp); + // pub_func(pl_surf, pub_corn, msg->header.stamp); +} + +void Preprocess::velodyne_handler(const sensor_msgs::PointCloud2::ConstPtr &msg) +{ + pl_surf.clear(); + pl_corn.clear(); + pl_full.clear(); + + pcl::PointCloud pl_orig; + pcl::fromROSMsg(*msg, pl_orig); + int plsize = pl_orig.points.size(); + if (plsize == 0) return; + pl_surf.reserve(plsize); + + /*** These variables only works when no point timestamps given ***/ + double omega_l = 0.361 * SCAN_RATE; // scan angular velocity + std::vector is_first(N_SCANS,true); + std::vector yaw_fp(N_SCANS, 0.0); // yaw of first scan point + std::vector yaw_last(N_SCANS, 0.0); // yaw of last scan point + std::vector time_last(N_SCANS, 0.0); // last offset time + /*****************************************************************/ + + if (pl_orig.points[plsize - 1].time > 0) + { + given_offset_time = true; + } + else + { + given_offset_time = false; + double yaw_first = atan2(pl_orig.points[0].y, pl_orig.points[0].x) * 57.29578; + double yaw_end = yaw_first; + int layer_first = pl_orig.points[0].ring; + for (uint i = plsize - 1; i > 0; i--) + { + if (pl_orig.points[i].ring == layer_first) + { + yaw_end = atan2(pl_orig.points[i].y, pl_orig.points[i].x) * 57.29578; + break; + } + } + } + + for (int i = 0; i < plsize; i++) + { + PointType added_pt; + // cout<<"!!!!!!"< (blind * blind)) + { + pl_surf.points.push_back(added_pt); + } + } + } + +} + +void Preprocess::hesai_handler(const sensor_msgs::PointCloud2::ConstPtr &msg) +{ + pl_surf.clear(); + pl_corn.clear(); + pl_full.clear(); + + pcl::PointCloud pl_orig; + pcl::fromROSMsg(*msg, pl_orig); + int plsize = pl_orig.points.size(); + if (plsize == 0) return; + pl_surf.reserve(plsize); + + /*** These variables only works when no point timestamps given ***/ + double omega_l = 0.361 * SCAN_RATE; // scan angular velocity + std::vector is_first(N_SCANS,true); + std::vector yaw_fp(N_SCANS, 0.0); // yaw of first scan point + std::vector yaw_last(N_SCANS, 0.0); // yaw of last scan point + std::vector time_last(N_SCANS, 0.0); // last offset time + /*****************************************************************/ + + if (pl_orig.points[plsize - 1].timestamp > 0) + { + given_offset_time = true; + } + else + { + given_offset_time = false; + double yaw_first = atan2(pl_orig.points[0].y, pl_orig.points[0].x) * 57.29578; + double yaw_end = yaw_first; + int layer_first = pl_orig.points[0].ring; + for (uint i = plsize - 1; i > 0; i--) + { + if (pl_orig.points[i].ring == layer_first) + { + yaw_end = atan2(pl_orig.points[i].y, pl_orig.points[i].x) * 57.29578; + break; + } + } + } + + double time_head = pl_orig.points[0].timestamp; + + for (int i = 0; i < plsize; i++) + { + PointType added_pt; + // cout<<"!!!!!!"< (blind * blind)) + { + pl_surf.points.push_back(added_pt); + } + } + } + +} + +void Preprocess::give_feature(pcl::PointCloud &pl, vector &types) +{ + int plsize = pl.size(); + int plsize2; + if(plsize == 0) + { + printf("something wrong\n"); + return; + } + uint head = 0; + + while(types[head].range < blind) + { + head++; + } + + // Surf + plsize2 = (plsize > group_size) ? (plsize - group_size) : 0; + + Eigen::Vector3d curr_direct(Eigen::Vector3d::Zero()); + Eigen::Vector3d last_direct(Eigen::Vector3d::Zero()); + + uint i_nex = 0, i2; + uint last_i = 0; uint last_i_nex = 0; + int last_state = 0; + int plane_type; + + for(uint i=head; i0.5) + if(last_state==1 && last_direct.norm()>0.1) + { + double mod = last_direct.transpose() * curr_direct; + if(mod>-0.707 && mod<0.707) + { + types[i].ftype = Edge_Plane; + } + else + { + types[i].ftype = Real_Plane; + } + } + + i = i_nex - 1; + last_state = 1; + } + else // if(plane_type == 2) + { + i = i_nex; + last_state = 0; + } + + last_i = i2; + last_i_nex = i_nex; + last_direct = curr_direct; + } + + plsize2 = plsize > 3 ? plsize - 3 : 0; + for(uint i=head+3; i=Real_Plane) + { + continue; + } + + if(types[i-1].dista<1e-16 || types[i].dista<1e-16) + { + continue; + } + + Eigen::Vector3d vec_a(pl[i].x, pl[i].y, pl[i].z); + Eigen::Vector3d vecs[2]; + + for(int j=0; j<2; j++) + { + int m = -1; + if(j == 1) + { + m = 1; + } + + if(types[i+m].range < blind) + { + if(types[i].range > inf_bound) + { + types[i].edj[j] = Nr_inf; + } + else + { + types[i].edj[j] = Nr_blind; + } + continue; + } + + vecs[j] = Eigen::Vector3d(pl[i+m].x, pl[i+m].y, pl[i+m].z); + vecs[j] = vecs[j] - vec_a; + + types[i].angle[j] = vec_a.dot(vecs[j]) / vec_a.norm() / vecs[j].norm(); + if(types[i].angle[j] < jump_up_limit) + { + types[i].edj[j] = Nr_180; + } + else if(types[i].angle[j] > jump_down_limit) + { + types[i].edj[j] = Nr_zero; + } + } + + types[i].intersect = vecs[Prev].dot(vecs[Next]) / vecs[Prev].norm() / vecs[Next].norm(); + if(types[i].edj[Prev]==Nr_nor && types[i].edj[Next]==Nr_zero && types[i].dista>0.0225 && types[i].dista>4*types[i-1].dista) + { + if(types[i].intersect > cos160) + { + if(edge_jump_judge(pl, types, i, Prev)) + { + types[i].ftype = Edge_Jump; + } + } + } + else if(types[i].edj[Prev]==Nr_zero && types[i].edj[Next]== Nr_nor && types[i-1].dista>0.0225 && types[i-1].dista>4*types[i].dista) + { + if(types[i].intersect > cos160) + { + if(edge_jump_judge(pl, types, i, Next)) + { + types[i].ftype = Edge_Jump; + } + } + } + else if(types[i].edj[Prev]==Nr_nor && types[i].edj[Next]==Nr_inf) + { + if(edge_jump_judge(pl, types, i, Prev)) + { + types[i].ftype = Edge_Jump; + } + } + else if(types[i].edj[Prev]==Nr_inf && types[i].edj[Next]==Nr_nor) + { + if(edge_jump_judge(pl, types, i, Next)) + { + types[i].ftype = Edge_Jump; + } + + } + else if(types[i].edj[Prev]>Nr_nor && types[i].edj[Next]>Nr_nor) + { + if(types[i].ftype == Nor) + { + types[i].ftype = Wire; + } + } + } + + plsize2 = plsize-1; + double ratio; + for(uint i=head+1; i types[i].dista) + { + ratio = types[i-1].dista / types[i].dista; + } + else + { + ratio = types[i].dista / types[i-1].dista; + } + + if(types[i].intersect &types, uint i_cur, uint &i_nex, Eigen::Vector3d &curr_direct) +{ + double group_dis = disA*types[i_cur].range + disB; + group_dis = group_dis * group_dis; + // i_nex = i_cur; + + double two_dis; + vector disarr; + disarr.reserve(20); + + for(i_nex=i_cur; i_nex= pl.size()) || (i_nex >= pl.size())) break; + + if(types[i_nex].range < blind) + { + curr_direct.setZero(); + return 2; + } + vx = pl[i_nex].x - pl[i_cur].x; + vy = pl[i_nex].y - pl[i_cur].y; + vz = pl[i_nex].z - pl[i_cur].z; + two_dis = vx*vx + vy*vy + vz*vz; + if(two_dis >= group_dis) + { + break; + } + disarr.push_back(types[i_nex].dista); + i_nex++; + } + + double leng_wid = 0; + double v1[3], v2[3]; + for(uint j=i_cur+1; j= pl.size()) || (i_cur >= pl.size())) break; + v1[0] = pl[j].x - pl[i_cur].x; + v1[1] = pl[j].y - pl[i_cur].y; + v1[2] = pl[j].z - pl[i_cur].z; + + v2[0] = v1[1]*vz - vy*v1[2]; + v2[1] = v1[2]*vx - v1[0]*vz; + v2[2] = v1[0]*vy - vx*v1[1]; + + double lw = v2[0]*v2[0] + v2[1]*v2[1] + v2[2]*v2[2]; + if(lw > leng_wid) + { + leng_wid = lw; + } + } + + + if((two_dis*two_dis/leng_wid) < p2l_ratio) + { + curr_direct.setZero(); + return 0; + } + + uint disarrsize = disarr.size(); + for(uint j=0; j=limit_maxmid || dismid_min>=limit_midmin) + { + curr_direct.setZero(); + return 0; + } + } + else + { + double dismax_min = disarr[0] / disarr[disarrsize-2]; + if(dismax_min >= limit_maxmin) + { + curr_direct.setZero(); + return 0; + } + } + + curr_direct << vx, vy, vz; + curr_direct.normalize(); + return 1; +} + +bool Preprocess::edge_jump_judge(const PointCloudXYZI &pl, vector &types, uint i, Surround nor_dir) +{ + if(nor_dir == 0) + { + if(types[i-1].rangeedgea*d2 || (d1-d2)>edgeb) + { + return false; + } + + return true; +} diff --git a/src/preprocess.h b/src/preprocess.h new file mode 100755 index 0000000..ba1630b --- /dev/null +++ b/src/preprocess.h @@ -0,0 +1,149 @@ +#include +#include +#include +#include + +using namespace std; + +#define IS_VALID(a) ((abs(a)>1e8) ? true : false) + +typedef pcl::PointXYZINormal PointType; +typedef pcl::PointCloud PointCloudXYZI; + +enum LID_TYPE{AVIA = 1, VELO16, OUST64, HESAIxt32}; //{1, 2, 3, 4} +enum TIME_UNIT{SEC = 0, MS = 1, US = 2, NS = 3}; +enum Feature{Nor, Poss_Plane, Real_Plane, Edge_Jump, Edge_Plane, Wire, ZeroPoint}; +enum Surround{Prev, Next}; +enum E_jump{Nr_nor, Nr_zero, Nr_180, Nr_inf, Nr_blind}; + +const bool time_list_cut_frame(PointType &x, PointType &y); + +struct orgtype +{ + double range; + double dista; + double angle[2]; + double intersect; + E_jump edj[2]; + Feature ftype; + orgtype() + { + range = 0; + edj[Prev] = Nr_nor; + edj[Next] = Nr_nor; + ftype = Nor; + intersect = 2; + } +}; + +namespace velodyne_ros { + struct EIGEN_ALIGN16 Point { + PCL_ADD_POINT4D; + float intensity; + float time; + uint16_t ring; + EIGEN_MAKE_ALIGNED_OPERATOR_NEW + }; +} // namespace velodyne_ros +POINT_CLOUD_REGISTER_POINT_STRUCT(velodyne_ros::Point, + (float, x, x) + (float, y, y) + (float, z, z) + (float, intensity, intensity) + (float, time, time) + (std::uint16_t, ring, ring) +) + +namespace hesai_ros { + struct EIGEN_ALIGN16 Point { + PCL_ADD_POINT4D; + float intensity; + double timestamp; + uint16_t ring; + EIGEN_MAKE_ALIGNED_OPERATOR_NEW + }; +} // namespace velodyne_ros +POINT_CLOUD_REGISTER_POINT_STRUCT(hesai_ros::Point, + (float, x, x) + (float, y, y) + (float, z, z) + (float, intensity, intensity) + (double, timestamp, timestamp) + (std::uint16_t, ring, ring) +) + +namespace ouster_ros { + struct EIGEN_ALIGN16 Point { + PCL_ADD_POINT4D; + float intensity; + uint32_t t; + uint16_t reflectivity; + uint8_t ring; + uint16_t ambient; + uint32_t range; + EIGEN_MAKE_ALIGNED_OPERATOR_NEW + }; +} // namespace ouster_ros + +// clang-format off +POINT_CLOUD_REGISTER_POINT_STRUCT(ouster_ros::Point, + (float, x, x) + (float, y, y) + (float, z, z) + (float, intensity, intensity) + // use std::uint32_t to avoid conflicting with pcl::uint32_t + (std::uint32_t, t, t) + (std::uint16_t, reflectivity, reflectivity) + (std::uint8_t, ring, ring) + (std::uint16_t, ambient, ambient) + (std::uint32_t, range, range) +) + +class Preprocess +{ + public: +// EIGEN_MAKE_ALIGNED_OPERATOR_NEW + + Preprocess(); + ~Preprocess(); + + void process_cut_frame_livox(const livox_ros_driver::CustomMsg::ConstPtr &msg, deque &pcl_out, deque &time_lidar, const int required_frame_num, int scan_count); + + void process_cut_frame_pcl2(const sensor_msgs::PointCloud2::ConstPtr &msg, deque &pcl_out, deque &time_lidar, const int required_frame_num, int scan_count); + + void process(const livox_ros_driver::CustomMsg::ConstPtr &msg, PointCloudXYZI::Ptr &pcl_out); + void process(const sensor_msgs::PointCloud2::ConstPtr &msg, PointCloudXYZI::Ptr &pcl_out); + void set(bool feat_en, int lid_type, double bld, int pfilt_num); + + // sensor_msgs::PointCloud2::ConstPtr pointcloud; + PointCloudXYZI pl_full, pl_corn, pl_surf; + PointCloudXYZI pl_buff[128]; //maximum 128 line lidar + vector typess[128]; //maximum 128 line lidar + float time_unit_scale; + int lidar_type, point_filter_num, N_SCANS, SCAN_RATE, time_unit; + double blind; + bool given_offset_time; + ros::Publisher pub_full, pub_surf, pub_corn; + + + private: + void avia_handler(const livox_ros_driver::CustomMsg::ConstPtr &msg); + void oust64_handler(const sensor_msgs::PointCloud2::ConstPtr &msg); + void velodyne_handler(const sensor_msgs::PointCloud2::ConstPtr &msg); + void hesai_handler(const sensor_msgs::PointCloud2::ConstPtr &msg); + void give_feature(PointCloudXYZI &pl, vector &types); + void pub_func(PointCloudXYZI &pl, const ros::Time &ct); + int plane_judge(const PointCloudXYZI &pl, vector &types, uint i, uint &i_nex, Eigen::Vector3d &curr_direct); + bool small_plane(const PointCloudXYZI &pl, vector &types, uint i_cur, uint &i_nex, Eigen::Vector3d &curr_direct); + bool edge_jump_judge(const PointCloudXYZI &pl, vector &types, uint i, Surround nor_dir); + + int group_size; + double disA, disB, inf_bound; + double limit_maxmid, limit_midmin, limit_maxmin; + double p2l_ratio; + double jump_up_limit, jump_down_limit; + double cos160; + double edgea, edgeb; + double smallp_intersect, smallp_ratio; + double vx, vy, vz; +};