diff --git a/xdl/CMakeLists.txt b/xdl/CMakeLists.txt index 639a207c..7d4df997 100644 --- a/xdl/CMakeLists.txt +++ b/xdl/CMakeLists.txt @@ -1,10 +1,12 @@ project(xdl) -cmake_minimum_required(VERSION 2.8) +cmake_minimum_required(VERSION 3.0.0 FATAL_ERROR) +SET(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake") include(${PROJECT_SOURCE_DIR}/cmake/Utils.cmake) xdl_option(test "Build all tests." ON) xdl_option(USE_GPU "use gpu" off) +xdl_option(USE_PS_PLUS "use ps-plus" ON) xdl_option(coverage "Generate coverage analysis" off) enable_testing() @@ -46,12 +48,21 @@ include_directories( include(cmake/Dependencies.cmake) +set(TBB_ROOT "${PROJECT_SOURCE_DIR}/third_party/tbb/") +include(${TBB_ROOT}/cmake/TBBBuild.cmake) +set(CMAKE_CXX_FLAGS "-std=c++1y ${CMAKE_CXX_FLAGS}") +tbb_build(TBB_ROOT ${TBB_ROOT} CONFIG_DIR TBB_DIR MAKE_ARGS) +find_package(TBB REQUIRED) +include_directories("${TBB_ROOT}/include") + IF (USE_GPU) + set(CUDA_PATH "/usr/local/cuda-9.0/") set(CUDA_TOOLKIT_ROOT_DIR ${CUDA_PATH}) find_package(CUDA REQUIRED) message("-- CUDA_PATH = ${CUDA_PATH} ") include(${PROJECT_SOURCE_DIR}/cmake/Cuda.cmake) include_directories( + ${CUDA_PATH}/targets/x86_64-linux/include/ ${CUDA_PATH}/include/ ) link_directories( @@ -62,7 +73,7 @@ ENDIF () # PS_PLUS set(SEASTAR_LIBRARYS -Wl,--whole-archive seastar_service ps_network_static seastar -Wl,--no-whole-archive -L/usr/local/lib64/boost -lboost_timer -lboost_chrono -laio -lboost_program_options -lboost_system -lboost_filesystem -lm -lboost_thread -lcryptopp -lrt -lgnutls -lgnutlsxx -llz4 -ldl -lgcc_s -lunwind -lhwloc -lnuma -lpciaccess -lxml2 -lz -lcares-seastar libstdc++.a) -set(PS_LIBRARYS -Wl,--whole-archive libzookeeper.a libhashtable.a ps_common ps_client ps_server ps_model_server ps_plugin_hdfs libevent_core.a glog -Wl,--no-whole-archive ${SEASTAR_LIBRARYS}) +set(PS_LIBRARYS -Wl,--whole-archive libzookeeper.a libhashtable.a ps_common ps_client ps_server ps_scheduler ps_model_server ps_plugin_hdfs libevent_core.a -Wl,--no-whole-archive ${SEASTAR_LIBRARYS}) include_directories(${PROJECT_SOURCE_DIR}/ps-plus/) include_directories(${PROJECT_SOURCE_DIR}/third_party/zookeeper-client/include) include_directories(${PROJECT_SOURCE_DIR}/third_party/zookeeper-client/generated) @@ -96,11 +107,12 @@ IF (MXNET_BACKEND) ENDIF() IF (USE_GPU) - set(XDL_CORE_DEPEND_LIB libprotobuf ${PS_LIBRARYS} ${BACKEND_LIB} python2.7 cudart dl) + set(XDL_CORE_DEPEND_LIB libprotobuf ${PS_LIBRARYS} ${BACKEND_LIB} python2.7 cudart dl ${TBB_IMPORTED_TARGETS}) ELSE () - set(XDL_CORE_DEPEND_LIB libprotobuf ${PS_LIBRARYS} ${BACKEND_LIB} python2.7 dl) + set(XDL_CORE_DEPEND_LIB libprotobuf ${PS_LIBRARYS} ${BACKEND_LIB} python2.7 dl ${TBB_IMPORTED_TARGETS}) ENDIF () +set(XDL_IO_DEPEND_LIB dl rdkafka++ jsoncpp) set(XDL_CORE_LIB -Wl,--whole-archive xdl_core -Wl,--no-whole-archive ${XDL_CORE_DEPEND_LIB}) set(XDL_IO_LIB -Wl,--whole-archive xdl_io -Wl,--no-whole-archive) diff --git a/xdl/cmake/FindNumPy.cmake b/xdl/cmake/FindNumPy.cmake new file mode 100644 index 00000000..229ff63c --- /dev/null +++ b/xdl/cmake/FindNumPy.cmake @@ -0,0 +1,42 @@ +# Find the Python NumPy package +# PYTHON_NUMPY_INCLUDE_DIR +# PYTHON_NUMPY_FOUND +# will be set by this script + +cmake_minimum_required(VERSION 2.6) + +if(NOT PYTHON_EXECUTABLE) + if(NumPy_FIND_QUIETLY) + find_package(PythonInterp QUIET) + else() + find_package(PythonInterp) + set(__numpy_out 1) + endif() +endif() + +if (PYTHON_EXECUTABLE) + # Find out the include path + execute_process( + COMMAND "${PYTHON_EXECUTABLE}" -c + "from __future__ import print_function\ntry: import numpy; print(numpy.get_include(), end='')\nexcept:pass\n" + OUTPUT_VARIABLE __numpy_path) + # And the version + execute_process( + COMMAND "${PYTHON_EXECUTABLE}" -c + "from __future__ import print_function\ntry: import numpy; print(numpy.__version__, end='')\nexcept:pass\n" + OUTPUT_VARIABLE __numpy_version) +elseif(__numpy_out) + message(STATUS "Python executable not found.") +endif(PYTHON_EXECUTABLE) + +find_path(PYTHON_NUMPY_INCLUDE_DIR numpy/arrayobject.h + HINTS "${__numpy_path}" "${PYTHON_INCLUDE_PATH}" NO_DEFAULT_PATH) + +if(PYTHON_NUMPY_INCLUDE_DIR) + set(PYTHON_NUMPY_FOUND 1 CACHE INTERNAL "Python numpy found") +endif(PYTHON_NUMPY_INCLUDE_DIR) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(NumPy REQUIRED_VARS PYTHON_NUMPY_INCLUDE_DIR + VERSION_VAR __numpy_version) + diff --git a/xdl/cmake/Utils.cmake b/xdl/cmake/Utils.cmake index 2f410602..d04165a6 100644 --- a/xdl/cmake/Utils.cmake +++ b/xdl/cmake/Utils.cmake @@ -414,6 +414,26 @@ function(xdl_add_test dir extension) endforeach() endfunction() +function(xdl_add_test_exclude dir extension exclude) + file(GLOB TEST_SOURCE "${dir}/*${extension}") + foreach(file ${TEST_SOURCE}) + get_filename_component(file_name ${file} NAME) + get_filename_component(file_exe ${file} NAME_WE) + if ("${file_name}" STREQUAL "${exclude}" OR "${file_exe}" STREQUAL "${exclude}") + message(STATUS "Skip " ${exclude}) + continue() + endif() + #message(${extension}) + #message(${file}) + #message(${file_exe}) + #message(${exclude}) + add_executable(${file_exe} ${file}) + target_link_libraries(${file_exe} ${ARGN} gcov) + set_target_properties(${file_exe} PROPERTIES COMPILE_FLAGS "-g -O0 --coverage") + add_test(${file_exe} ${file_exe} COMMAND ${file_exe}) + endforeach() +endfunction() + function(xdl_add_cuda_test dir extension) file(GLOB TEST_SOURCE "${dir}/*${extension}") foreach(file ${TEST_SOURCE}) diff --git a/xdl/distributed/install_xdl_submit.sh b/xdl/distributed/install_xdl_submit.sh index b8c03ab1..739fa44e 100644 --- a/xdl/distributed/install_xdl_submit.sh +++ b/xdl/distributed/install_xdl_submit.sh @@ -22,4 +22,6 @@ fi cd $(dirname ${BASH_SOURCE[0]}) cp ./xdl_submit/xdl_submit.py /usr/bin/xdl_submit.py +chmod 777 /usr/bin/xdl_submit.py cp ./xdl_yarn_scheduler/bin/xdl-yarn-scheduler-1.0.0-SNAPSHOT-jar-with-dependencies.jar /usr/bin/xdl-yarn-scheduler-1.0.0-SNAPSHOT-jar-with-dependencies.jar +chmod 777 /usr/bin/xdl-yarn-scheduler-1.0.0-SNAPSHOT-jar-with-dependencies.jar diff --git a/xdl/distributed/xdl_yarn_scheduler/bin/xdl-yarn-scheduler-1.0.0-SNAPSHOT-jar-with-dependencies.jar b/xdl/distributed/xdl_yarn_scheduler/bin/xdl-yarn-scheduler-1.0.0-SNAPSHOT-jar-with-dependencies.jar index 4ae183e0..b106e363 100644 Binary files a/xdl/distributed/xdl_yarn_scheduler/bin/xdl-yarn-scheduler-1.0.0-SNAPSHOT-jar-with-dependencies.jar and b/xdl/distributed/xdl_yarn_scheduler/bin/xdl-yarn-scheduler-1.0.0-SNAPSHOT-jar-with-dependencies.jar differ diff --git a/xdl/distributed/xdl_yarn_scheduler/pom.xml b/xdl/distributed/xdl_yarn_scheduler/pom.xml index 0b007d8b..43ce157a 100644 --- a/xdl/distributed/xdl_yarn_scheduler/pom.xml +++ b/xdl/distributed/xdl_yarn_scheduler/pom.xml @@ -76,7 +76,7 @@ com.alibaba fastjson - 1.2.28 + 1.2.58 diff --git a/xdl/examples/mnist/mnist.py b/xdl/examples/mnist/mnist.py index c14f4a34..bef5484f 100644 --- a/xdl/examples/mnist/mnist.py +++ b/xdl/examples/mnist/mnist.py @@ -80,7 +80,7 @@ def model(images, labels): @xdl.tf_wrapper(is_training=False) def eval_model(images, labels): - with tf.variable_scope("train", reuse=True): + with tf.variable_scope("train", reuse=tf.AUTO_REUSE): eval_y = fc(images, [784, 10], [10]) labels_test = tf.cast(labels, tf.int64) correct_prediction = tf.equal(tf.argmax(eval_y, 1), labels_test) diff --git a/xdl/ps-plus/CMakeLists.txt b/xdl/ps-plus/CMakeLists.txt index cb896f6b..4761d25a 100755 --- a/xdl/ps-plus/CMakeLists.txt +++ b/xdl/ps-plus/CMakeLists.txt @@ -1,28 +1,90 @@ -cmake_minimum_required(VERSION 2.8) +cmake_minimum_required(VERSION 3.0.0 FATAL_ERROR) project(ps-plus) if (DEBUG) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -fPIC -std=c++1y -D_GLIBCXX_USE_CXX11_ABI=0") else () - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -fPIC -std=c++1y -g -DNDEBUG -D_GLIBCXX_USE_CXX11_ABI=0") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -fPIC -std=c++1y -g -DNDEBUG -D_GLIBCXX_USE_CXX11_ABI=0") endif () if (APPLE) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") elseif (UNIX) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread") -endif() +endif () + +include_directories(.) + +set(CMAKE_SKIP_BUILD_RPATH FALSE) +set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) +set(CMAKE_INSTALL_RPATH "/usr/local/lib:/usr/local/lib64/boost:/usr/local/gcc-5.3.0/lib64") +set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) + +# build third_party libraries using cmake +function (third_party_library_builder_cmake arg) +list(LENGTH ARGV argv_len) + set(i 0) + while( i LESS ${argv_len}) + list(GET ARGV ${i} argv_value) + message(STATUS "start build third_party library:${argv_value}") + execute_process(COMMAND bash -c "cd ${PROJECT_SOURCE_DIR}/third_party/${argv_value}; mkdir -p build; cd build; cmake .. -DCMAKE_INSTALL_PREFIX=. -DCMAKE_CXX_FLAGS=-D_GLIBCXX_USE_CXX11_ABI=0; make; make install; cd ${PROJECT_SOURCE_DIR}") + IF(EXISTS "${PROJECT_SOURCE_DIR}/third_party/${argv_value}/build/include") + include_directories("${PROJECT_SOURCE_DIR}/third_party/${argv_value}/build/include") + ENDIF() + IF(EXISTS "${PROJECT_SOURCE_DIR}/third_party/${argv_value}/build/lib") + link_directories("${PROJECT_SOURCE_DIR}/third_party/${argv_value}/build/lib") + ENDIF() + IF(EXISTS "${PROJECT_SOURCE_DIR}/third_party/${argv_value}/build/lib64") + link_directories("${PROJECT_SOURCE_DIR}/third_party/${argv_value}/build/lib64") + ENDIF() + math(EXPR i "${i} + 1") + endwhile() +endfunction () + +# build third_party libraries using autotools +function (third_party_library_builder_autotools arg) + list(LENGTH ARGV argv_len) + set(i 0) + while (i LESS ${argv_len}) + list(GET ARGV ${i} argv_value) + message(STATUS "Start to build third_party library: ${argv_value}") + execute_process(COMMAND bash -c " + cd ${PROJECT_SOURCE_DIR}/third_party/${argv_value}; + mkdir -p build; + ./configure --prefix=$(pwd)/build CXXFLAGS='-D_GLIBCXX_USE_CXX11_ABI=0' LDFLAGS='-D_GLIBCXX_USE_CXX11_ABI=0'; + make; + make install; + cd ${PROJECT_SOURCE_DIR}") + if (EXISTS "${PROJECT_SOURCE_DIR}/third_party/${argv_value}/build/include") + include_directories("${PROJECT_SOURCE_DIR}/third_party/${argv_value}/build/include") + endif () + if (EXISTS "${PROJECT_SOURCE_DIR}/third_party/${argv_value}/build/lib") + link_directories("${PROJECT_SOURCE_DIR}/third_party/${argv_value}/build/lib") + endif () + if (EXISTS "${PROJECT_SOURCE_DIR}/third_party/${argv_value}/build/lib64") + link_directories("${PROJECT_SOURCE_DIR}/third_party/${argv_value}/build/lib64") + endif () + math(EXPR i "${i} + 1") + endwhile () +endfunction () set(CMAKE_SHARED_LIBRARY_SUFFIX ".so") +function (compile_protobuf dir) + file(GLOB pbs ${PROJECT_SOURCE_DIR}/${dir}/*.proto) + execute_process(COMMAND ${PROTOBUF_PROTOC_EXECUTABLE} ${pbs} --cpp_out=${PROJECT_SOURCE_DIR} --proto_path=${PROJECT_SOURCE_DIR}) +endfunction() -include_directories(.) +find_package(NumPy REQUIRED) +find_package(PythonLibs REQUIRED) link_directories(${PROJECT_BINARY_DIR}/third_party/googletest/) link_directories(${PROJECT_BINARY_DIR}/third_party/zookeeper-client/) -link_directories(${PROJECT_BINARY_DIR}/third_party/glog/) +include_directories("${PYTHON_NUMPY_INCLUDE_DIR}") +include_directories("${PYTHON_INCLUDE_DIRS}") -include_directories(${PROJECT_SOURCE_DIR}/third_party/glog/) include_directories(${PROJECT_SOURCE_DIR}/third_party/hdfs/) +include_directories(${PROJECT_SOURCE_DIR}/third_party/seastar/ ${PROJECT_SOURCE_DIR}/third_party/seastar/fmt ${PROJECT_SOURCE_DIR}/third_party/seastar/c-ares) +link_directories("${PROJECT_SOURCE_DIR}/third_party/seastar/lib") aux_source_directory(ps-plus/service/seastar/lib SEASTAR_LIB) add_library(seastar_service STATIC ${SEASTAR_LIB}) @@ -35,7 +97,7 @@ if (USE_HDFS OR NOT DEFINED USE_HDFS) SET(PLUGINS ${PLUGINS} ps_plugin_hdfs) endif() -set(LIBRARYS -Wl,--whole-archive ps_common ps_server ps_model_server ps_client ps_scheduler libhashtable.a libzookeeper.a libevent_core.a ${PLUGINS} glog -Wl,--no-whole-archive ${PLUGINS_DEPENDENCY} ${SEASTAR_LIBRARYS}) +set(LIBRARYS -Wl,--whole-archive ps_common ps_server ps_model_server ps_client ps_scheduler libhashtable.a libzookeeper.a libevent_core.a ${PLUGINS} -Wl,--no-whole-archive ${PLUGINS_DEPENDENCY} ${SEASTAR_LIBRARYS} ${PYTHON_LIBRARIES}) aux_source_directory(ps-plus/common COMMON) aux_source_directory(ps-plus/common/initializer COMMON_INITIALIZER) @@ -52,7 +114,6 @@ aux_source_directory(ps-plus/scheduler/test SCHEDULER_TEST) aux_source_directory(ps-plus/main MAIN) aux_source_directory(ps-plus/model_server MODEL_SERVER) aux_source_directory(ps-plus/model_server/test MODEL_SERVER_TEST) -aux_source_directory(ps-plus/tool CLIENT_TOOL) aux_source_directory(ps-plus/profiler PROFILER) aux_source_directory(ps-plus/common/test COMMON_TEST) aux_source_directory(ps-plus/common/initializer/test COMMON_INITIALIZER_TEST) @@ -72,7 +133,7 @@ add_library(ps_client STATIC ${CLIENT} ${CLIENT_PARTITIONER}) add_library(ps_plugin_hdfs STATIC ${PLUGINS_HDFS}) add_executable(ps ${MAIN}) -add_executable(tool ${CLIENT_TOOL}) +add_executable(tool ps-plus/tool/client_tool.cpp) # tests add_executable(ps_common_test ${COMMON_TEST} ${COMMON_INITIALIZER_TEST} ${SRC_TEST_UTIL}) @@ -85,15 +146,15 @@ add_executable(ps_scheduler_test ${SCHEDULER_TEST}) # profiler add_executable(ps_profiler ${PROFILER}) -target_link_libraries(ps ${LIBRARYS} libjemalloc.a) -target_link_libraries(tool ${LIBRARYS} libjemalloc.a) -target_link_libraries(ps_common_test ${LIBRARYS} gtest gtest_main libjemalloc.a) -target_link_libraries(ps_message_test ${LIBRARYS} gtest gtest_main libjemalloc.a) -target_link_libraries(ps_model_server_test ${LIBRARYS} gtest gtest_main libjemalloc.a) -target_link_libraries(ps_server_test ${LIBRARYS} gtest gtest_main libjemalloc.a) -target_link_libraries(ps_client_test ${LIBRARYS} gtest gtest_main libjemalloc.a) -target_link_libraries(ps_scheduler_test ${LIBRARYS} gtest gtest_main libjemalloc.a) -target_link_libraries(ps_profiler ${LIBRARYS} libjemalloc.a) +target_link_libraries(ps ${LIBRARYS} libjemalloc.a ${TBB_IMPORTED_TARGETS}) +target_link_libraries(tool ${LIBRARYS} libjemalloc.a ${TBB_IMPORTED_TARGETS}) +target_link_libraries(ps_common_test ${LIBRARYS} gtest gtest_main libjemalloc.a ${TBB_IMPORTED_TARGETS}) +target_link_libraries(ps_message_test ${LIBRARYS} gtest gtest_main libjemalloc.a ${TBB_IMPORTED_TARGETS}) +target_link_libraries(ps_model_server_test ${LIBRARYS} gtest gtest_main libjemalloc.a ${TBB_IMPORTED_TARGETS}) +target_link_libraries(ps_server_test ${LIBRARYS} gtest gtest_main libjemalloc.a ${TBB_IMPORTED_TARGETS}) +target_link_libraries(ps_client_test ${LIBRARYS} gtest gtest_main libjemalloc.a ${TBB_IMPORTED_TARGETS}) +target_link_libraries(ps_scheduler_test ${LIBRARYS} gtest gtest_main libjemalloc.a ${TBB_IMPORTED_TARGETS}) +target_link_libraries(ps_profiler ${LIBRARYS} libjemalloc.a ${TBB_IMPORTED_TARGETS}) enable_testing() add_test(NAME ps_common_test COMMAND ps_common_test) diff --git a/xdl/ps-plus/README.md b/xdl/ps-plus/README.md index 8461cf40..14861b37 100644 --- a/xdl/ps-plus/README.md +++ b/xdl/ps-plus/README.md @@ -1,3 +1,18 @@ +/* Copyright (C) 2016-2018 Alibaba Group Holding Limited + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + #ps-plus使用 ps-plus是底层的ps组件,可单独介入到其他的业务系统中。简单实用如下: diff --git a/xdl/ps-plus/ps-plus/client/base_client.h b/xdl/ps-plus/ps-plus/client/base_client.h index edb96a98..92ab3cd6 100644 --- a/xdl/ps-plus/ps-plus/client/base_client.h +++ b/xdl/ps-plus/ps-plus/client/base_client.h @@ -22,9 +22,11 @@ limitations under the License. #include "ps-plus/common/status.h" #include "ps-plus/common/tensor.h" #include "ps-plus/message/variable_info.h" +#include "ps-plus/message/worker_state.h" #include "ps-plus/client/udf.h" #include "ps-plus/client/partitioner.h" +#include "ps-plus/client/merged_partitioner.h" namespace ps { namespace client { @@ -37,17 +39,35 @@ class BaseClient { virtual Status Init() = 0; virtual void Save(const std::string& name, const Callback& cb) = 0; virtual void Restore(const std::string& name, const Callback& cb) = 0; - virtual void TriggerStreamingModelDense(const Callback& cb) = 0; - virtual void TriggerStreamingModelSparse(const Callback& cb) = 0; - virtual void TriggerStreamingModelHash(const Callback& cb) = 0; - + virtual void TriggerStreamingModelDense(const std::string& stream_ver, const Callback& cb) = 0; + virtual void TriggerStreamingModelSparse(const std::string& stream_ver, const Callback& cb) = 0; + virtual void TriggerStreamingModelHash(const std::string& stream_ver, const Callback& cb) = 0; + virtual Status InitGlobalQueue( + const std::string& name, + const std::vector& paths, + size_t epochs, + bool epoch_isolate = false) = 0; + virtual Status GetNextFile( + const std::string& name, + size_t worker_id, + std::string* path, + size_t* begin, + size_t* epoch) = 0; + virtual Status ReportWorkerState( + const std::string& name, + size_t worker_id, + const std::vector& worker_states) = 0; + virtual Status RestoreWorkerState( + const std::string& name, + size_t worker_id) = 0; virtual Status RegisterVariable(const std::string& name, const VariableInfo& info) = 0; - virtual void AsynchronizeEnter(int id, int staleness, int worker_count, const Callback& cb) = 0; virtual void SynchronizeEnter(int id, int worker_count, const Callback& cb) = 0; virtual void SynchronizeLeave(int id, const Callback& cb) = 0; virtual void WorkerReportFinish(int id, const Callback& cb) = 0; + virtual void GetWorkerFinishCount(int64_t* count, const Callback& cb) = 0; virtual void WorkerBarrier(int id, int worker_count, const Callback& cb) = 0; + virtual void WorkerBarrierV2(int barrier_id, int task_id, int task_num, int token, const Callback& cb) = 0; virtual void ModelServerForward(int type, const Tensor& ids, Tensor* rst, const Callback& cb) = 0; virtual void ModelServerBackward(int type, const Tensor& ids, const Tensor& grads, const Callback& cb) = 0; @@ -58,7 +78,7 @@ class BaseClient { const Tensor& init, const Callback& cb) = 0; virtual void HashInitializer(const std::string& variable_name, - Initializer* init, + Initializer* init, const Callback& cb) = 0; virtual void IsInitialized(const std::string& variable_name, bool* inited, @@ -80,23 +100,54 @@ class BaseClient { const std::vector& data, const Callback& cb) = 0; virtual void HashPull(const std::string& variable_name, - const Tensor& ids, - double add_probability, + const Tensor& ids, + const float& save_ratio, Tensor* result, const Callback& cb) = 0; + virtual void MergedHashPull(const std::vector& var_names, + const std::vector& ids, + const std::vector& save_ratios, + std::vector* result, + const Callback& cb) = 0; virtual void HashPush(const std::string& variable_name, - const Tensor& ids, - const std::string& updater, + const Tensor& ids, + const float& save_ratio, + const bool& insertable, + const std::string& updater, const std::vector& data, const Callback& cb) = 0; + virtual void MergedHashPush(const std::vector& var_names, + const std::vector& ids, + const std::vector& save_ratios, + const std::string& updater, + const std::vector& data, + const Callback& cb) = 0; + virtual void MergedHashStatis(const std::vector& var_names, + const std::vector& ids, + const std::vector& save_ratios, + const std::vector& clicks, + const Tensor& global_step, + const Tensor& statis_decay, + const Tensor& statis_decay_period, + const std::string& statis_type, + std::vector* result, + const Callback& cb) = 0; + + virtual void Process(const UdfChain& udf, + const std::string& var_name, + const std::vector& datas, + const std::vector& splitter, + const std::vector& combiner, + std::vector>* results, + const Callback& cb) = 0; virtual void Process(const UdfChain& udf, - const std::string& var_name, - const std::vector& datas, - const std::vector& splitter, - const std::vector& combiner, - std::vector>* results, - const Callback& cb) = 0; + const std::vector& var_names, + const std::vector& datas, + const std::vector& splitter, + const std::vector& combiner, + std::vector>>* results, + const Callback& cb) = 0; template std::vector Args(Targs&&... args) { diff --git a/xdl/ps-plus/ps-plus/client/client.cc b/xdl/ps-plus/ps-plus/client/client.cc index 736add32..bdcff71a 100644 --- a/xdl/ps-plus/ps-plus/client/client.cc +++ b/xdl/ps-plus/ps-plus/client/client.cc @@ -18,8 +18,10 @@ limitations under the License. #include "ps-plus/client/partitioner/logic.h" #include "ps-plus/client/partitioner/sparse.h" #include "ps-plus/client/partitioner/broadcast.h" +#include "ps-plus/client/partitioner/merged_broadcast.h" #include "ps-plus/client/partitioner/index.h" #include "ps-plus/client/partitioner/hash.h" +#include "ps-plus/client/partitioner/merged_hash.h" #include #include @@ -91,18 +93,26 @@ void Client::IdentityInitializer(const std::string& variable_name, } void Client::HashInitializer(const std::string& variable_name, - Initializer* init, + Initializer* init, const Client::Callback& cb) { - std::vector inputs = Args(0, 0, std::unique_ptr(init)); + VariableInfo info; + CHECK_ASYNC(GetVariableInfo(variable_name, &info)); + std::string extra_info; + for (auto& arg : info.args) { + extra_info += arg.first + "=" + arg.second + "&"; + } + if (!extra_info.empty()) { extra_info.pop_back(); } + std::vector inputs = Args(0, 0, extra_info, std::unique_ptr(init)); std::vector>* outputs = new std::vector>; std::vector splitter = { new partitioner::HashDataType, new partitioner::HashShape, + new partitioner::Broadcast, new partitioner::Broadcast }; std::vector combiner = {}; - UdfData udf("HashVariableInitializer", UdfData(0), UdfData(1), UdfData(2)); + UdfData udf("HashVariableInitializer", UdfData(0), UdfData(1), UdfData(2), UdfData(3)); Callback realcb = [cb, outputs](const Status& st) { std::unique_ptr>> deleter(outputs); cb(st); @@ -150,7 +160,7 @@ void Client::DensePull(const std::string& variable_name, std::vector combiner = { new partitioner::Dense }; UdfData udf("BuildDenseSlice", UdfData(0)); UdfData udf_chain("TransSlice", udf); - Callback realcb = [this, cb, result, outputs, &variable_name](const Status& st) { + Callback realcb = [this, cb, result, outputs](const Status& st) { std::unique_ptr>> deleter(outputs); if (!st.IsOk()) { cb(st); @@ -217,7 +227,8 @@ void Client::DensePush(const std::string& variable_name, inputs.insert(inputs.end(), data.begin(), data.end()); for (size_t i = start_index; i < inputs.size(); i++) { - if (dynamic_cast*>(inputs[i]) != nullptr) { + if (dynamic_cast*>(inputs[i]) != nullptr + || dynamic_cast>*>(inputs[i]) != nullptr) { splitter.push_back(new partitioner::Dense); } else { splitter.push_back(new partitioner::Broadcast); @@ -323,7 +334,8 @@ void Client::SparsePush(const std::string& variable_name, inputs.insert(inputs.end(), data.begin(), data.end()); for (size_t i = start_index; i < inputs.size(); i++) { - if (dynamic_cast*>(inputs[i]) != nullptr) { + if (dynamic_cast*>(inputs[i]) != nullptr + || dynamic_cast>*>(inputs[i]) != nullptr) { splitter.push_back(new partitioner::SparseData); } else { splitter.push_back(new partitioner::Broadcast); @@ -342,22 +354,27 @@ void Client::SparsePush(const std::string& variable_name, } void Client::HashPull(const std::string& variable_name, - const Tensor& ids, - double add_probability, - Tensor* result, + const Tensor& ids, + const float& save_ratio, + Tensor* result, const Client::Callback& cb) { - std::vector inputs = Args(ids, false, add_probability); + std::vector ids_vec = {ids}; + std::vector name_vec = {variable_name}; + std::vector save_ratio_vec = {save_ratio}; + std::vector inputs = Args(ids_vec, name_vec, save_ratio_vec, false, true); std::vector>* outputs = new std::vector>; std::vector splitter = { new partitioner::HashId, new partitioner::Broadcast, - new partitioner::Broadcast + new partitioner::Broadcast, + new partitioner::Broadcast, + new partitioner::Broadcast }; std::vector combiner = { new partitioner::HashData }; - UdfData udf("BuildHashSlice", UdfData(0), UdfData(1), UdfData(2)); + UdfData udf("BuildHashSlice", UdfData(0), UdfData(1), UdfData(2), UdfData(3), UdfData(4)); UdfData udf_chain("TransSlice", udf); Callback realcb = [cb, result, outputs](const Status& st) { std::unique_ptr>> deleter(outputs); @@ -393,23 +410,81 @@ void Client::HashPull(const std::string& variable_name, } } +void Client::MergedHashPull(const std::vector& var_names, + const std::vector& ids, + const std::vector& save_ratios, + std::vector* result, + const Client::Callback& cb) { + std::vector inputs = Args(ids, var_names, save_ratios, false, true); + std::vector>>* outputs = + new std::vector>>; + std::vector splitter = { + new partitioner::MergedHashId, + new partitioner::MergedBroadcast, + new partitioner::MergedBroadcast, + new partitioner::MergedBroadcast, + new partitioner::MergedBroadcast + }; + std::vector combiner = { + new partitioner::MergedHashData + }; + UdfData udf("BuildHashSlice", UdfData(0), UdfData(1), UdfData(2), UdfData(3), UdfData(4)); + Callback realcb = [cb, result, outputs, var_names](const Status& st) { + std::unique_ptr>>> deleter(outputs); + if (!st.IsOk()) { + cb(st); + return; + } + + if (outputs->size() != 1) { + cb(Status::ArgumentError("Output Size Should be 1 on MergedHashPull")); + return; + } + + std::vector>& output_vec = (*outputs)[0]; + if (output_vec.size() != var_names.size()) { + cb(Status::ArgumentError("Output[0] Size Should be the Same with Variable Number")); + return; + } + for (auto& output : output_vec) { + WrapperData* output_ptr = dynamic_cast*>(output.get()); + if (output_ptr == nullptr) { + cb(Status::ArgumentError("Output[0] should be tensor vector")); + return; + } + (*result).push_back(output_ptr->Internal()); + } + cb(Status::Ok()); + }; + + Process(udf, var_names, inputs, splitter, + combiner, outputs, realcb); +} + void Client::HashPush(const std::string& variable_name, - const Tensor& ids, - const std::string& updater, + const Tensor& ids, + const float& save_ratio, + const bool& insertable, + const std::string& updater, const std::vector& data, const Client::Callback& cb) { - std::vector inputs = Args(ids, true, 0.0); - size_t start_index = 3; + std::vector ids_vec = {ids}; + std::vector name_vec = {variable_name}; + std::vector save_ratio_vec = {save_ratio}; + std::vector inputs = Args(ids_vec, name_vec, save_ratio_vec, true, insertable); + size_t start_index = 5; std::vector>* outputs = new std::vector>; std::vector splitter = { new partitioner::HashId, - new partitioner::Broadcast, - new partitioner::Broadcast + new partitioner::Broadcast, + new partitioner::Broadcast, + new partitioner::Broadcast, + new partitioner::Broadcast }; std::vector combiner = {}; std::vector next_udf_inputs = { - UdfData("BuildHashSlice", UdfData(0), UdfData(1), UdfData(2)) + UdfData("BuildHashSlice", UdfData(0), UdfData(1), UdfData(2), UdfData(3), UdfData(4)) }; if (sync_mode_ && @@ -419,20 +494,21 @@ void Client::HashPush(const std::string& variable_name, updater != "MovingAverageUpdater") { inputs.push_back(Args(token_)[0]); inputs.push_back(Args(worker_count_)[0]); - next_udf_inputs.push_back(UdfData(3)); - next_udf_inputs.push_back(UdfData(4)); - next_udf_inputs.push_back(UdfData(5)); + next_udf_inputs.push_back(UdfData(5)); + next_udf_inputs.push_back(UdfData(6)); + next_udf_inputs.push_back(UdfData(7)); splitter.push_back(new partitioner::Broadcast); splitter.push_back(new partitioner::Broadcast); splitter.push_back(new partitioner::HashData); UdfData aggregate("AggregateSlice", next_udf_inputs); next_udf_inputs = {aggregate}; - start_index = 6; + start_index = 8; } inputs.insert(inputs.end(), data.begin(), data.end()); for (size_t i = start_index; i < inputs.size(); i++) { - if (dynamic_cast*>(inputs[i]) != nullptr) { + if (dynamic_cast*>(inputs[i]) != nullptr + || dynamic_cast>*>(inputs[i]) != nullptr) { splitter.push_back(new partitioner::HashData); } else { splitter.push_back(new partitioner::Broadcast); @@ -450,5 +526,128 @@ void Client::HashPush(const std::string& variable_name, combiner, outputs, realcb); } +void Client::MergedHashPush(const std::vector& var_names, + const std::vector& ids, + const std::vector& save_ratios, + const std::string& updater, + const std::vector& data, + const Client::Callback& cb) { + std::vector inputs = Args(ids, var_names, save_ratios, true, false); + size_t start_index = 5; + std::vector>>* outputs = + new std::vector>>; + std::vector splitter = { + new partitioner::MergedHashId, + new partitioner::MergedBroadcast, + new partitioner::MergedBroadcast, + new partitioner::MergedBroadcast, + new partitioner::MergedBroadcast + }; + std::vector combiner = {}; + std::vector next_udf_inputs = { + UdfData("BuildHashSlice", UdfData(0), UdfData(1), UdfData(2), UdfData(3), UdfData(4)) + }; + + if (sync_mode_ && + updater != "AssignUpdater" && + updater != "AssignAddUpdater" && + updater != "AssignSubUpdater" && + updater != "MovingAverageUpdater") { + inputs.push_back(Args(token_)[0]); + inputs.push_back(Args(worker_count_)[0]); + next_udf_inputs.push_back(UdfData(5)); + next_udf_inputs.push_back(UdfData(6)); + next_udf_inputs.push_back(UdfData(7)); + splitter.push_back(new partitioner::MergedBroadcast); + splitter.push_back(new partitioner::MergedBroadcast); + splitter.push_back(new partitioner::MergedHashData); + UdfData aggregate("AggregateSlice", next_udf_inputs); + next_udf_inputs = {aggregate}; + start_index = 8; + } + + inputs.insert(inputs.end(), data.begin(), data.end()); + for (size_t i = start_index; i < inputs.size(); i++) { + if (dynamic_cast*>(inputs[i]) != nullptr + || dynamic_cast>*>(inputs[i]) != nullptr) { + splitter.push_back(new partitioner::MergedHashData); + } else { + splitter.push_back(new partitioner::MergedBroadcast); + } + next_udf_inputs.push_back(UdfData(i)); + } + + UdfData udf(updater, next_udf_inputs); + Callback realcb = [cb, outputs](const Status& st) { + std::unique_ptr>>> deleter(outputs); + cb(st); + }; + + Process(udf, var_names, inputs, splitter, + combiner, outputs, realcb); +} + +void Client::MergedHashStatis(const std::vector& var_names, + const std::vector& ids, + const std::vector& save_ratios, + const std::vector& clicks, + const Tensor& global_step, + const Tensor& statis_decay, + const Tensor& statis_decay_period, + const std::string& statis_type, + std::vector* result, + const Client::Callback& cb) { + std::vector inputs = Args(ids, var_names, save_ratios, clicks, global_step, statis_decay, statis_decay_period, statis_type, false, true); + std::vector>>* outputs = + new std::vector>>; + std::vector splitter = { + new partitioner::MergedHashId, + new partitioner::MergedBroadcast, + new partitioner::MergedBroadcast, + new partitioner::MergedHashData, + new partitioner::MergedBroadcast, + new partitioner::MergedBroadcast, + new partitioner::MergedBroadcast, + new partitioner::MergedBroadcast, + new partitioner::MergedBroadcast, + new partitioner::MergedBroadcast + }; + std::vector combiner = { + new partitioner::MergedHashData + }; + UdfData udf("BuildHashSlice", UdfData(0), UdfData(1), UdfData(2), UdfData(8), UdfData(9)); + UdfData udf_chain("StatisSlice", udf, UdfData(3), UdfData(4), UdfData(5), UdfData(6), UdfData(7)); + Callback realcb = [cb, result, outputs, var_names](const Status& st) { + std::unique_ptr>>> deleter(outputs); + if (!st.IsOk()) { + cb(st); + return; + } + + if (outputs->size() != 1) { + cb(Status::ArgumentError("Output Size Should be 1 on MergedHashStatis")); + return; + } + + std::vector>& output_vec = (*outputs)[0]; + if (output_vec.size() != var_names.size()) { + cb(Status::ArgumentError("Output[0] Size Should be the Same with Variable Number")); + return; + } + for (auto& output : output_vec) { + WrapperData* output_ptr = dynamic_cast*>(output.get()); + if (output_ptr == nullptr) { + cb(Status::ArgumentError("Output[0] should be tensor vector")); + return; + } + result->push_back(output_ptr->Internal()); + } + cb(Status::Ok()); + }; + + Process(udf_chain, var_names, inputs, splitter, + combiner, outputs, realcb); +} + } //namespace client } //namespace ps diff --git a/xdl/ps-plus/ps-plus/client/client.h b/xdl/ps-plus/ps-plus/client/client.h index 1579106d..57660e7f 100644 --- a/xdl/ps-plus/ps-plus/client/client.h +++ b/xdl/ps-plus/ps-plus/client/client.h @@ -19,6 +19,7 @@ limitations under the License. #include #include +#include "ps-plus/common/logging.h" #include "ps-plus/client/raw_client.h" #include "ps-plus/client/base_client.h" #include "ps-plus/common/tensor.h" @@ -44,11 +45,22 @@ class Client: public BaseClient { const std::vector& datas, const std::vector& splitter, const std::vector& combiner, - std::vector>* results, + std::vector >* results, const Callback& cb) override { return raw_->Process(udf, var_name, datas, splitter, combiner, results, cb); } + void Process( + const UdfChain& udf, + const std::vector& var_names, + const std::vector& datas, + const std::vector& splitter, + const std::vector& combiner, + std::vector > >* results, + const Callback& cb) override { + return raw_->Process(udf, var_names, datas, splitter, combiner, results, cb); + } + void Save(const std::string& name, const Callback& cb) override { return raw_->Save(name, cb); } @@ -57,16 +69,46 @@ class Client: public BaseClient { return raw_->Restore(name, cb); } - void TriggerStreamingModelDense(const Callback& cb) override { - return raw_->TriggerStreamingModelDense(cb); + void TriggerStreamingModelDense(const std::string& stream_ver, const Callback& cb) override { + return raw_->TriggerStreamingModelDense(stream_ver, cb); + } + + Status InitGlobalQueue( + const std::string& name, + const std::vector& paths, + size_t epochs, + bool epoch_isolate = false) override { + return raw_->InitGlobalQueue(name, paths, epochs, epoch_isolate); + } + + Status GetNextFile( + const std::string& name, + size_t worker_id, + std::string* path, + size_t* begin, + size_t* epoch) override { + return raw_->GetNextFile(name, worker_id, path, begin, epoch); + } + + Status ReportWorkerState( + const std::string& name, + size_t worker_id, + const std::vector& worker_states) override { + return raw_->ReportWorkerState(name, worker_id, worker_states); } - void TriggerStreamingModelSparse(const Callback& cb) override { - return raw_->TriggerStreamingModelSparse(cb); + Status RestoreWorkerState( + const std::string& name, + size_t worker_id) override { + return raw_->RestoreWorkerState(name, worker_id); } - void TriggerStreamingModelHash(const Callback& cb) override { - return raw_->TriggerStreamingModelHash(cb); + void TriggerStreamingModelSparse(const std::string& stream_ver, const Callback& cb) override { + return raw_->TriggerStreamingModelSparse(stream_ver, cb); + } + + void TriggerStreamingModelHash(const std::string& stream_ver, const Callback& cb) override { + return raw_->TriggerStreamingModelHash(stream_ver, cb); } Status RegisterVariable(const std::string& name, const VariableInfo& info) override { @@ -91,9 +133,17 @@ class Client: public BaseClient { raw_->WorkerReportFinish(id, cb); } + void GetWorkerFinishCount(int64_t* count, const Callback& cb) { + raw_->GetWorkerFinishCount(count, cb); + } + void WorkerBarrier(int id, int worker_count, const Callback& cb) override { raw_->WorkerBarrier(id, worker_count, cb); - } + } + + void WorkerBarrierV2(int barrier_id, int task_id, int task_num, int token, const Callback& cb) override { + raw_->WorkerBarrierV2(barrier_id, task_id, task_num, token, cb); + } Status UpdateVariableVisitInfo(const std::string& name, int64_t id_num) { return raw_->UpdateVariableVisitInfo(name, id_num); @@ -119,7 +169,7 @@ class Client: public BaseClient { const Tensor& init, const Callback& cb) override; void HashInitializer(const std::string& variable_name, - Initializer* init, + Initializer* init, const Callback& cb) override; void IsInitialized(const std::string& variable_name, bool* inited, @@ -141,15 +191,43 @@ class Client: public BaseClient { const std::vector& data, const Callback& cb) override; void HashPull(const std::string& variable_name, - const Tensor& ids, - double add_probability, + const Tensor& ids, + const float& save_ratio, Tensor* result, const Callback& cb) override; + void MergedHashPull(const std::vector& var_names, + const std::vector& ids, + const std::vector& save_ratios, + std::vector* result, + const Callback& cb) override; void HashPush(const std::string& variable_name, - const Tensor& ids, - const std::string& updater, + const Tensor& ids, + const float& save_ratio, + const bool& insertable, + const std::string& updater, const std::vector& data, const Callback& cb) override; + void MergedHashPush(const std::vector& var_names, + const std::vector& ids, + const std::vector& save_ratios, + const std::string& updater, + const std::vector& data, + const Callback& cb) override; + void MergedHashStatis(const std::vector& var_names, + const std::vector& ids, + const std::vector& save_ratios, + const std::vector& clicks, + const Tensor& global_step, + const Tensor& statis_decay, + const Tensor& statis_decay_period, + const std::string& statis_type, + std::vector* result, + const Callback& cb) override; + + private: + Status GetVariableInfo(const std::string& name, VariableInfo* info) { + return raw_->GetVariableInfo(name, info); + } private: std::unique_ptr raw_; diff --git a/xdl/ps-plus/ps-plus/client/client_wrapper.h b/xdl/ps-plus/ps-plus/client/client_wrapper.h index f8b50f74..166c1d80 100644 --- a/xdl/ps-plus/ps-plus/client/client_wrapper.h +++ b/xdl/ps-plus/ps-plus/client/client_wrapper.h @@ -20,7 +20,9 @@ limitations under the License. #include "ps-plus/common/status.h" #include "ps-plus/client/udf.h" #include "ps-plus/client/partitioner.h" +#include "ps-plus/client/merged_partitioner.h" #include "ps-plus/common/tensor.h" +#include "ps-plus/message/worker_state.h" #include #include @@ -43,16 +45,22 @@ class ClientWrapper { virtual void RegisterUdf(size_t server_id, const UdfChain& def, const Callback& cb) = 0; virtual void Save(const std::string& version, const Callback& cb) = 0; virtual void Restore(const std::string& version, const Callback& cb) = 0; + virtual Status InitGlobalQueue(const std::string& name, const std::vector& paths, size_t epochs, bool epoch_isolate = false) = 0; + virtual Status GetNextFile(const std::string& name, size_t worker_id, std::string* path, size_t* begin, size_t* epoch) = 0; + virtual Status ReportWorkerState(const std::string& name, size_t worker_id, const std::vector& worker_states) = 0; + virtual Status RestoreWorkerState(const std::string& name, size_t worker_id) = 0; virtual void ModelServerForward(int server_type, int server_id, const Tensor& ids, std::unique_ptr* rst, const Callback& cb) = 0; virtual void ModelServerBackward(int server_type, int server_id, const Tensor& ids, const Tensor& grads, const Callback& cb) = 0; - virtual void TriggerStreamingModelDense(const Callback& cb) = 0; - virtual void TriggerStreamingModelSparse(const Callback& cb) = 0; - virtual void TriggerStreamingModelHash(const Callback& cb) = 0; + virtual void TriggerStreamingModelDense(const std::string& stream_ver, const Callback& cb) = 0; + virtual void TriggerStreamingModelSparse(const std::string& stream_ver, const Callback& cb) = 0; + virtual void TriggerStreamingModelHash(const std::string& stream_ver, const Callback& cb) = 0; virtual void AsynchronizeEnter(int id, int staleness, int worker_count, const Callback& cb) = 0; virtual void SynchronizeEnter(int id, int worker_count, int64_t* token, const Callback& cb) = 0; virtual void SynchronizeLeave(int id, int64_t token, const Callback& cb) = 0; virtual void WorkerReportFinish(int id, const Callback& cb) = 0; + virtual void GetWorkerFinishCount(int64_t* count, const Callback& cb) = 0; virtual void WorkerBarrier(int id, int worker_count, const Callback& cb) = 0; + virtual void WorkerBarrierV2(int barrier_id, int task_id, int task_num, int token, const Callback& cb) = 0; virtual int ServerSize(int id) = 0; virtual int ServerTypeSize() = 0; }; diff --git a/xdl/ps-plus/ps-plus/client/client_wrapper_impl.cc b/xdl/ps-plus/ps-plus/client/client_wrapper_impl.cc index 51a8ba06..115fed50 100644 --- a/xdl/ps-plus/ps-plus/client/client_wrapper_impl.cc +++ b/xdl/ps-plus/ps-plus/client/client_wrapper_impl.cc @@ -21,6 +21,7 @@ limitations under the License. using ps::service::seastar::CallBackClosure; using ps::service::seastar::SeastarClientLib; +using ps::service::seastar::EventClientLib; using ps::service::seastar::SeastarStatus; namespace ps { @@ -227,6 +228,125 @@ void ClientWrapperImpl::Restore(const std::string& version, const Callback& cb) client_lib_->Request(0, func_ids::kSchedulerRestore, request_datas, cb_closure); } +Status ClientWrapperImpl::InitGlobalQueue( + const std::string& name, + const std::vector& paths, + size_t epochs, + bool epoch_isolate) { + std::vector request_datas = { + new WrapperData(scheduler_version_), + new WrapperData(name), + new WrapperData >(paths), + new WrapperData(epochs), + new WrapperData(epoch_isolate) + }; + + std::promise p; + CallBackClosure* cb_closure = + new CallBackClosure([&p](const SeastarStatus& sst, + const std::vector& response) { + Status st = GetNetworkStatus(sst, response); + p.set_value(st); + }); + + client_lib_->Request(0, func_ids::kSchedulerInitGlobalFileQueue, + request_datas, cb_closure); + return p.get_future().get(); +} + +Status ClientWrapperImpl::GetNextFile( + const std::string& name, + size_t worker_id, + std::string* path, + size_t* begin, + size_t* epoch) { + std::vector request_datas = { + new WrapperData(scheduler_version_), + new WrapperData(name), + new WrapperData(worker_id) + }; + + std::promise p; + CallBackClosure* cb_closure = + new CallBackClosure([&p, path, begin, epoch, this]( + const SeastarStatus& sst, + const std::vector& response) { + Status st = GetNetworkStatus(sst, response); + if (!st.IsOk()) { + p.set_value(st); + return; + } + + if (response.size() != 4) { + p.set_value(Status::Unknown("response data not match")); + return; + } + + WrapperData* path_data = dynamic_cast* >(response[1]); + WrapperData* begin_data = dynamic_cast* >(response[2]); + WrapperData* epoch_data = dynamic_cast* >(response[3]); + if (path_data == nullptr || begin_data == nullptr || epoch_data == nullptr) { + p.set_value(Status::Unknown("reponse data type not match")); + return; + } + + *path = path_data->Internal(); + *begin = begin_data->Internal(); + *epoch = epoch_data->Internal(); + p.set_value(Status::Ok()); + }); + + client_lib_->Request(0, func_ids::kSchedulerGetNextFile, + request_datas, cb_closure); + return p.get_future().get(); +} + +Status ClientWrapperImpl::ReportWorkerState( + const std::string& name, + size_t worker_id, + const std::vector& worker_states) { + std::vector request_datas = { + new WrapperData(scheduler_version_), + new WrapperData(name), + new WrapperData(worker_id), + new WrapperData >(worker_states) + }; + + std::promise p; + CallBackClosure* cb_closure = + new CallBackClosure([&p](const SeastarStatus& sst, + const std::vector& response) { + Status st = GetNetworkStatus(sst, response); + p.set_value(st); + }); + + client_lib_->Request(0, func_ids::kSchedulerReportWorkerState, + request_datas, cb_closure); + return p.get_future().get(); +} + +Status ClientWrapperImpl::RestoreWorkerState( + const std::string& name, + size_t worker_id) { + std::vector request_datas = { + new WrapperData(scheduler_version_), + new WrapperData(name), + new WrapperData(worker_id) + }; + + std::promise p; + CallBackClosure* cb_closure = + new CallBackClosure([&p](const SeastarStatus& sst, + const std::vector& response) { + Status st = GetNetworkStatus(sst, response); + p.set_value(st); + }); + + client_lib_->Request(0, func_ids::kSchedulerRestoreWorkerState, + request_datas, cb_closure); + return p.get_future().get(); +} + void ClientWrapperImpl::ModelServerForward(int server_type, int server_id, const Tensor& ids, std::unique_ptr* rst, const Callback& cb) { std::vector request_datas = { new WrapperData(scheduler_version_), @@ -268,9 +388,10 @@ void ClientWrapperImpl::ModelServerBackward(int server_type, int server_id, cons request_datas, cb_closure); } -void ClientWrapperImpl::TriggerStreamingModelDense(const Callback& cb) { +void ClientWrapperImpl::TriggerStreamingModelDense(const std::string& stream_ver, const Callback& cb) { std::vector request_datas = { - new WrapperData(scheduler_version_) + new WrapperData(scheduler_version_), + new WrapperData(stream_ver) }; CallBackClosure* cb_closure = new CallBackClosure([cb](const SeastarStatus& sst, const std::vector& response) { @@ -280,9 +401,10 @@ void ClientWrapperImpl::TriggerStreamingModelDense(const Callback& cb) { client_lib_->Request(0, func_ids::kSchedulerTriggerStreamingDense, request_datas, cb_closure); } -void ClientWrapperImpl::TriggerStreamingModelSparse(const Callback& cb) { +void ClientWrapperImpl::TriggerStreamingModelSparse(const std::string& stream_ver, const Callback& cb) { std::vector request_datas = { - new WrapperData(scheduler_version_) + new WrapperData(scheduler_version_), + new WrapperData(stream_ver) }; CallBackClosure* cb_closure = new CallBackClosure([cb](const SeastarStatus& sst, const std::vector& response) { @@ -292,9 +414,10 @@ void ClientWrapperImpl::TriggerStreamingModelSparse(const Callback& cb) { client_lib_->Request(0, func_ids::kSchedulerTriggerStreamingSparse, request_datas, cb_closure); } -void ClientWrapperImpl::TriggerStreamingModelHash(const Callback& cb) { +void ClientWrapperImpl::TriggerStreamingModelHash(const std::string& stream_ver, const Callback& cb) { std::vector request_datas = { - new WrapperData(scheduler_version_) + new WrapperData(scheduler_version_), + new WrapperData(stream_ver) }; CallBackClosure* cb_closure = new CallBackClosure([cb](const SeastarStatus& sst, const std::vector& response) { @@ -376,6 +499,28 @@ void ClientWrapperImpl::WorkerReportFinish(int id, const Callback& cb) { request_datas, cb_closure); } +void ClientWrapperImpl::GetWorkerFinishCount(int64_t* count, const Callback& cb) { + std::vector request_datas = { + new WrapperData(scheduler_version_) + }; + CallBackClosure* cb_closure = + new CallBackClosure([count, cb](const SeastarStatus& sst, + const std::vector& response) { + Status st = GetNetworkStatus(sst, response); + if (!st.IsOk()) { + cb(st); + return; + } + if (count) { + WrapperData* res = dynamic_cast*>(response[1]); + *count = res->Internal(); + } + cb(Status::Ok()); + }); + client_lib_->Request(0, func_ids::kSchedulerGetWorkerFinishCount, + request_datas, cb_closure); +} + void ClientWrapperImpl::WorkerBarrier(int id, int worker_count, const Callback& cb) { std::vector request_datas = { new WrapperData(scheduler_version_), @@ -391,10 +536,32 @@ void ClientWrapperImpl::WorkerBarrier(int id, int worker_count, const Callback& request_datas, cb_closure); } +void ClientWrapperImpl::WorkerBarrierV2( + int barrier_id, + int task_id, + int task_num, + int token, + const Callback& cb) { + std::vector request_datas = { + new WrapperData(scheduler_version_), + new WrapperData(barrier_id), + new WrapperData(task_id), + new WrapperData(task_num), + new WrapperData(token) + }; + CallBackClosure* cb_closure = + new CallBackClosure([cb](const SeastarStatus& sst, + const std::vector& response) { + cb(GetNetworkStatus(sst, response)); + }); + client_lib_->Request(0, func_ids::kSchedulerWorkerBarrierV2, + request_datas, cb_closure); +} + Status ClientWrapperImpl::CreateServerLib() { if (client_lib_singleton_ == nullptr) { std::vector> server_addrs = {}; - client_lib_singleton_ = new ClientLib(server_addrs, 100, 1); + client_lib_singleton_ = new ClientLib(server_addrs, 100, std::thread::hardware_concurrency()); client_lib_ = client_lib_singleton_; client_lib_->Start(); } else { diff --git a/xdl/ps-plus/ps-plus/client/client_wrapper_impl.h b/xdl/ps-plus/ps-plus/client/client_wrapper_impl.h index 7ee8cecd..fbe9251b 100644 --- a/xdl/ps-plus/ps-plus/client/client_wrapper_impl.h +++ b/xdl/ps-plus/ps-plus/client/client_wrapper_impl.h @@ -37,19 +37,26 @@ class ClientWrapperImpl : public ClientWrapper { void RegisterUdf(size_t server_id, const UdfChain& def, const Callback& cb) override; void Save(const std::string& version, const Callback& cb) override; void Restore(const std::string& version, const Callback& cb) override; + Status InitGlobalQueue(const std::string& name, const std::vector& paths, size_t epochs, bool epoch_isolate = false) override; + Status GetNextFile(const std::string& name, size_t worker_id, std::string* path, size_t* begin, size_t* epoch) override; + Status ReportWorkerState(const std::string& name, size_t worker_id, const std::vector& worker_states) override; + Status RestoreWorkerState(const std::string& name, size_t worker_id) override; void ModelServerForward(int server_type, int server_id, const Tensor& ids, std::unique_ptr* rst, const Callback& cb) override; void ModelServerBackward(int server_type, int server_id, const Tensor& ids, const Tensor& grads, const Callback& cb) override; - void TriggerStreamingModelDense(const Callback& cb) override; - void TriggerStreamingModelSparse(const Callback& cb) override; - void TriggerStreamingModelHash(const Callback& cb) override; + void TriggerStreamingModelDense(const std::string& stream_ver, const Callback& cb) override; + void TriggerStreamingModelSparse(const std::string& stream_ver, const Callback& cb) override; + void TriggerStreamingModelHash(const std::string& stream_ver, const Callback& cb) override; void AsynchronizeEnter(int id, int staleness, int worker_count, const Callback& cb) override; void SynchronizeEnter(int id, int worker_count, int64_t* token, const Callback& cb) override; void SynchronizeLeave(int id, int64_t token, const Callback& cb) override; void WorkerReportFinish(int id, const Callback& cb) override; + void GetWorkerFinishCount(int64_t* count, const Callback& cb); void WorkerBarrier(int id, int worker_count, const Callback& cb) override; + void WorkerBarrierV2(int barrier_id, int task_id, int task_num, int token, const Callback& cb) override; int ServerSize(int id) override; int ServerTypeSize() override; + //using ClientLib = ps::service::seastar::SeastarClientLib; using ClientLib = ps::service::seastar::EventClientLib; private: Status CreateServerLib(); diff --git a/xdl/ps-plus/ps-plus/client/local_client.cc b/xdl/ps-plus/ps-plus/client/local_client.cc index 28b8d16e..a1778c51 100644 --- a/xdl/ps-plus/ps-plus/client/local_client.cc +++ b/xdl/ps-plus/ps-plus/client/local_client.cc @@ -87,20 +87,26 @@ void LocalClient::IdentityInitializer(const std::string& variable_name, } void LocalClient::HashInitializer(const std::string& variable_name, - Initializer* init, + Initializer* init, const LocalClient::Callback& cb) { VariableInfo info; CHECK_ASYNC(local_server_->GetVariableInfo(variable_name, &info)); std::vector dims(info.shape.begin(), info.shape.end()); size_t k = info.shape[0]; dims[0] = k + 10 * sqrt(k) + 10; + std::string extra_info; + for (auto& arg : info.args) { + extra_info += arg.first + "=" + arg.second + "&"; + } + if (!extra_info.empty()) { extra_info.pop_back(); } std::vector inputs = Args( info.datatype, TensorShape(dims), + extra_info, std::unique_ptr(init)); std::vector>* outputs = new std::vector>; - UdfData udf("HashVariableInitializer", UdfData(0), UdfData(1), UdfData(2)); + UdfData udf("HashVariableInitializer", UdfData(0), UdfData(1), UdfData(2), UdfData(3)); Callback realcb = [cb, outputs](const Status& st) { std::unique_ptr>> deleter(outputs); cb(st); @@ -143,8 +149,8 @@ void LocalClient::DensePull(const std::string& variable_name, std::vector>* outputs = new std::vector>; UdfData udf("BuildDenseSlice", UdfData(0)); - UdfData udf_chain("SliceToTensor", UdfData("TransSlice", udf)); - Callback realcb = [this, cb, result, outputs, &variable_name](const Status& st) { + UdfData udf_chain("SliceToTensor", udf); + Callback realcb = [this, cb, result, outputs](const Status& st) { std::unique_ptr>> deleter(outputs); if (!st.IsOk()) { cb(st); @@ -156,13 +162,19 @@ void LocalClient::DensePull(const std::string& variable_name, return; } - WrapperData* output_ptr = dynamic_cast*>((*outputs)[0].get()); + WrapperData>* output_ptr = + dynamic_cast>*>((*outputs)[0].get()); if (output_ptr == nullptr) { - cb(Status::ArgumentError("Output[0] should be tensor")); + cb(Status::ArgumentError("Output[0] should be tensor vector")); return; } - *result = output_ptr->Internal(); + if (output_ptr->Internal().size() != 1) { + cb(Status::ArgumentError("Output[0] size should be 1")); + return; + } + + *result = output_ptr->Internal()[0]; cb(Status::Ok()); }; @@ -199,8 +211,8 @@ void LocalClient::SparsePull(const std::string& variable_name, std::vector>* outputs = new std::vector>; UdfData udf("BuildSparseSlice", UdfData(0), UdfData(1)); - UdfData udf_chain("SliceToTensor", UdfData("TransSlice", udf)); - Callback realcb = [cb, result, outputs](const Status& st) { + UdfData udf_chain("SliceToTensor", udf); + Callback realcb = [this, cb, result, outputs](const Status& st) { std::unique_ptr>> deleter(outputs); if (!st.IsOk()) { cb(st); @@ -212,14 +224,19 @@ void LocalClient::SparsePull(const std::string& variable_name, return; } - WrapperData* output_ptr = - dynamic_cast*>((*outputs)[0].get()); + WrapperData>* output_ptr = + dynamic_cast>*>((*outputs)[0].get()); if (output_ptr == nullptr) { - cb(Status::ArgumentError("Output[0] should be tensor")); + cb(Status::ArgumentError("Output[0] should be tensor vector")); return; } - *result = output_ptr->Internal(); + if (output_ptr->Internal().size() != 1) { + cb(Status::ArgumentError("Output[0] size should be 1")); + return; + } + + *result = output_ptr->Internal()[0]; cb(Status::Ok()); }; @@ -252,16 +269,19 @@ void LocalClient::SparsePush(const std::string& variable_name, } void LocalClient::HashPull(const std::string& variable_name, - const Tensor& ids, - double filter_ratio, + const Tensor& ids, + const float& save_ratio, Tensor* result, const LocalClient::Callback& cb) { - std::vector inputs = Args(ids, false, 1.0); + std::vector ids_vec = {ids}; + std::vector name_vec = {variable_name}; + std::vector save_ratio_vec = {save_ratio}; + std::vector inputs = Args(ids_vec, name_vec, save_ratio_vec, false, true); std::vector>* outputs = new std::vector>; - UdfData udf("BuildHashSlice", UdfData(0), UdfData(1), UdfData(2)); - UdfData udf_chain("SliceToTensor", UdfData("TransSlice", udf)); - Callback realcb = [cb, result, outputs](const Status& st) { + UdfData udf("BuildHashSlice", UdfData(0), UdfData(1), UdfData(2), UdfData(3), UdfData(4)); + UdfData udf_chain("SliceToTensor", udf); + Callback realcb = [this, cb, result, outputs](const Status& st) { std::unique_ptr>> deleter(outputs); if (!st.IsOk()) { cb(st); @@ -273,33 +293,84 @@ void LocalClient::HashPull(const std::string& variable_name, return; } - WrapperData* output_ptr = - dynamic_cast*>((*outputs)[0].get()); + WrapperData>* output_ptr = + dynamic_cast>*>((*outputs)[0].get()); if (output_ptr == nullptr) { - cb(Status::ArgumentError("Output[0] should be tensor")); + cb(Status::ArgumentError("Output[0] should be tensor vector")); return; } - *result = output_ptr->Internal(); + if (output_ptr->Internal().size() != 1) { + cb(Status::ArgumentError("Output[0] size should be 1")); + return; + } + + *result = output_ptr->Internal()[0]; cb(Status::Ok()); }; Process(udf_chain, variable_name, inputs, outputs, realcb); } +void LocalClient::MergedHashPull(const std::vector& var_names, + const std::vector& ids, + const std::vector& save_ratios, + std::vector* result, + const Callback& cb) { + std::vector inputs = Args(ids, var_names, save_ratios, false, true); + std::vector>* outputs = + new std::vector>; + UdfData udf("BuildHashSlice", UdfData(0), UdfData(1), UdfData(2), UdfData(3), UdfData(4)); + UdfData udf_chain("SliceToTensor", udf); + Callback realcb = [this, cb, result, outputs, var_names](const Status& st) { + std::unique_ptr>> deleter(outputs); + if (!st.IsOk()) { + cb(st); + return; + } + + if (outputs->size() != 1) { + cb(Status::ArgumentError("Output Size Should be 1 on HashPull")); + return; + } + + WrapperData>* output_ptr = + dynamic_cast>*>((*outputs)[0].get()); + if (output_ptr == nullptr) { + cb(Status::ArgumentError("Output[0] should be tensor vector")); + return; + } + + if (output_ptr->Internal().size() != var_names.size()) { + cb(Status::ArgumentError("Output[0] Size Should be the Same with Variable Number")); + return; + } + + *result = output_ptr->Internal(); + cb(Status::Ok()); + }; + + Process(udf_chain, "^hash_variable", inputs, outputs, realcb); +} + void LocalClient::HashPush(const std::string& variable_name, - const Tensor& ids, - const std::string& updater, + const Tensor& ids, + const float& save_ratio, + const bool& insertable, + const std::string& updater, const std::vector& data, const LocalClient::Callback& cb) { - std::vector inputs = Args(ids, true, 0.0); + std::vector ids_vec = {ids}; + std::vector name_vec = {variable_name}; + std::vector save_ratio_vec = {save_ratio}; + std::vector inputs = Args(ids_vec, name_vec, save_ratio_vec, true, insertable); inputs.insert(inputs.end(), data.begin(), data.end()); std::vector>* outputs = new std::vector>; std::vector updater_inputs = { - UdfData("BuildHashSlice", UdfData(0), UdfData(1), UdfData(2)) + UdfData("BuildHashSlice", UdfData(0), UdfData(1), UdfData(2), UdfData(3), UdfData(4)) }; - for (size_t i = 3; i < inputs.size(); i++) { + for (size_t i = 5; i < inputs.size(); i++) { updater_inputs.push_back(UdfData(i)); } @@ -312,6 +383,78 @@ void LocalClient::HashPush(const std::string& variable_name, Process(udf, variable_name, inputs, outputs, realcb); } +void LocalClient::MergedHashPush(const std::vector& var_names, + const std::vector& ids, + const std::vector& save_ratios, + const std::string& updater, + const std::vector& data, + const Callback& cb) { + std::vector inputs = Args(ids, var_names, save_ratios, true, false); + inputs.insert(inputs.end(), data.begin(), data.end()); + std::vector>* outputs = + new std::vector>; + std::vector updater_inputs = { + UdfData("BuildHashSlice", UdfData(0), UdfData(1), UdfData(2), UdfData(3), UdfData(4)) + }; + for (size_t i = 5; i < inputs.size(); i++) { + updater_inputs.push_back(UdfData(i)); + } + + UdfData udf(updater, updater_inputs); + Callback realcb = [cb, outputs](const Status& st) { + std::unique_ptr>> deleter(outputs); + cb(st); + }; + + Process(udf, "^hash_variable", inputs, outputs, realcb); +} + +void LocalClient::MergedHashStatis(const std::vector& var_names, + const std::vector& ids, + const std::vector& save_ratios, + const std::vector& clicks, + const Tensor& global_step, + const Tensor& statis_decay, + const Tensor& statis_decay_period, + const std::string& statis_type, + std::vector* result, + const Callback& cb) { + std::vector inputs = Args(ids, var_names, save_ratios, false, true); + std::vector>* outputs = + new std::vector>; + UdfData udf("BuildHashSlice", UdfData(0), UdfData(1), UdfData(2), UdfData(3), UdfData(4)); + UdfData udf_chain("SliceToTensor", udf); + Callback realcb = [this, cb, result, outputs, var_names](const Status& st) { + std::unique_ptr>> deleter(outputs); + if (!st.IsOk()) { + cb(st); + return; + } + + if (outputs->size() != 1) { + cb(Status::ArgumentError("Output Size Should be 1 on MergedHashStatis")); + return; + } + + WrapperData>* output_ptr = + dynamic_cast>*>((*outputs)[0].get()); + if (output_ptr == nullptr) { + cb(Status::ArgumentError("Output[0] should be tensor vector")); + return; + } + + if (output_ptr->Internal().size() != var_names.size()) { + cb(Status::ArgumentError("Output[0] Size Should be the Same with Variable Number")); + return; + } + + *result = output_ptr->Internal(); + cb(Status::Ok()); + }; + + Process(udf_chain, "^hash_variable", inputs, outputs, realcb); +} + void LocalClient::Process(const UdfChain& udf, const std::string& var_name, const std::vector& datas, @@ -337,3 +480,4 @@ void LocalClient::Process(const UdfChain& udf, } //namespace client } //namespace ps + diff --git a/xdl/ps-plus/ps-plus/client/local_client.h b/xdl/ps-plus/ps-plus/client/local_client.h index e7503547..9a177b13 100644 --- a/xdl/ps-plus/ps-plus/client/local_client.h +++ b/xdl/ps-plus/ps-plus/client/local_client.h @@ -17,9 +17,12 @@ limitations under the License. #define PS_PLUS_CLIENT_LOCAL_CLIENT_H_ #include +#include +#include #include "ps-plus/server/local_server.h" #include "ps-plus/client/base_client.h" +#include "ps-plus/common/global_file_queue.h" namespace ps { namespace client { @@ -43,17 +46,28 @@ class LocalClient: public BaseClient { const std::vector& datas, const std::vector& splitter, const std::vector& combiner, - std::vector>* results, + std::vector >* results, const Callback& cb) override { return Process(udf, var_name, datas, results, cb); } + + void Process(const UdfChain& udf, + const std::vector& var_names, + const std::vector& datas, + const std::vector& splitter, + const std::vector& combiner, + std::vector > >* results, + const Callback& cb) override { + results->emplace_back(); + Process(udf, "^hash_variable", datas, &((*results)[0]), cb); + } void Process(const UdfChain& udf, const std::string& var_name, const std::vector& datas, - std::vector>* results, + std::vector >* results, const Callback& cb); - + void Save(const std::string& name, const Callback& cb) override { Status st = local_server_->Save(name); cb(st); @@ -64,6 +78,53 @@ class LocalClient: public BaseClient { cb(st); } + Status InitGlobalQueue( + const std::string& name, + const std::vector& paths, + size_t epochs, + bool epoch_isolate = false) override { + std::unique_lock lock(mu_); + auto it = global_file_queues_.find(name); + if (it == global_file_queues_.end()) { + global_file_queues_[name].reset(new GlobalFileQueue()); + } + + return global_file_queues_[name]->Init( + paths, epochs, epoch_isolate); + } + + Status GetNextFile( + const std::string& name, + size_t worker_id, + std::string* path, + size_t* begin, + size_t* epoch) override { + std::unique_lock lock(mu_); + WorkerState file; + Status st = global_file_queues_[name]->GetNextFile( + worker_id, & file); + *path = file.path_; + *begin = file.begin_; + *epoch = file.epoch_; + return st; + } + + Status ReportWorkerState( + const std::string& name, + size_t worker_id, + const std::vector& worker_states) override { + std::unique_lock lock(mu_); + return global_file_queues_[name]->ReportWorkerState( + worker_id, worker_states); + } + + Status RestoreWorkerState( + const std::string& name, + size_t worker_id) override { + std::unique_lock lock(mu_); + return global_file_queues_[name]->RestoreWorkerState(worker_id); + } + Status RegisterVariable(const std::string& name, const VariableInfo& info) override { return local_server_->RegisterVariable(name, info); @@ -106,17 +167,43 @@ class LocalClient: public BaseClient { const Callback& cb) override; void HashPull(const std::string& variable_name, - const Tensor& ids, - double add_probability, + const Tensor& ids, + const float& save_ratio, Tensor* result, const Callback& cb) override; + void MergedHashPull(const std::vector& var_names, + const std::vector& ids, + const std::vector& save_ratio, + std::vector* result, + const Callback& cb) override; + void HashPush(const std::string& variable_name, - const Tensor& ids, - const std::string& updater, + const Tensor& ids, + const float& save_ratio, + const bool& insertable, + const std::string& updater, const std::vector& data, const Callback& cb) override; + void MergedHashPush(const std::vector& var_names, + const std::vector& ids, + const std::vector& save_ratio, + const std::string& updater, + const std::vector& data, + const Callback& cb) override; + + void MergedHashStatis(const std::vector& var_names, + const std::vector& ids, + const std::vector& save_ratio, + const std::vector& clicks, + const Tensor& global_step, + const Tensor& statis_decay, + const Tensor& statis_decay_period, + const std::string& statis_type, + std::vector* result, + const Callback& cb) override; + void ModelServerForward(int type, const Tensor& ids, Tensor* rst, const Callback& cb) override { cb(Status::ArgumentError("Not Supported in Local")); } @@ -125,18 +212,17 @@ class LocalClient: public BaseClient { } /* not used in inference and local train */ - void TriggerStreamingModelDense(const Callback& cb) override { + void TriggerStreamingModelDense(const std::string& stream_ver, const Callback& cb) override { cb(Status::Ok()); } - void TriggerStreamingModelSparse(const Callback& cb) override { + void TriggerStreamingModelSparse(const std::string& stream_ver, const Callback& cb) override { cb(Status::Ok()); } - void TriggerStreamingModelHash(const Callback& cb) override { + void TriggerStreamingModelHash(const std::string& stream_ver, const Callback& cb) override { cb(Status::Ok()); } - void AsynchronizeEnter(int id, int staleness, int worker_count, @@ -158,10 +244,18 @@ class LocalClient: public BaseClient { cb(Status::Ok()); } + void GetWorkerFinishCount(int64_t* id, const Callback& cb) override { + cb(Status::Ok()); + } + void WorkerBarrier(int id, int worker_count, const Callback& cb) override { cb(Status::Ok()); } + void WorkerBarrierV2(int barrier_id, int task_id, int task_num, int token, const Callback& cb) override { + cb(Status::Ok()); + } + private: Status GetVariableInfo(const std::string& name, VariableInfo* info) { return local_server_->GetVariableInfo(name, info); @@ -171,6 +265,8 @@ class LocalClient: public BaseClient { // a local server holds all variables in memory std::unique_ptr local_server_; std::string ckpt_path_; + std::mutex mu_; + std::unordered_map > global_file_queues_; }; } //namespace client diff --git a/xdl/ps-plus/ps-plus/client/merged_partitioner.cc b/xdl/ps-plus/ps-plus/client/merged_partitioner.cc new file mode 100644 index 00000000..831c3e0e --- /dev/null +++ b/xdl/ps-plus/ps-plus/client/merged_partitioner.cc @@ -0,0 +1,79 @@ +/* Copyright (C) 2016-2018 Alibaba Group Holding Limited + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "ps-plus/client/merged_partitioner.h" + +namespace ps { +namespace client { + +MergedPartitionerContext::MergedPartitionerContext() {} + +Data* MergedPartitionerContext::GetData(std::size_t id) { + if (id >= datas_.size()) { + return nullptr; + } else { + return datas_[id].get(); + } +} + +void MergedPartitionerContext::SetData(std::size_t id, Data* data) { + datas_.resize(std::max(id + 1, datas_.size())); + datas_[id].reset(data); +} + +void MergedPartitionerContext::AddDeleter(Data* data) { + deleter_.emplace_back(data); +} + +void MergedPartitionerContext::SetContext(std::size_t id, PartitionerContext* context) { + context_.resize(std::max(id + 1, context_.size())); + context_[id].reset(context); +} + +PartitionerContext* MergedPartitionerContext::GetContext(std::size_t id) { + if (id >= context_.size()) { + return nullptr; + } else { + return context_[id].get(); + } +} + +void MergedPartitionerContext::AddContext(PartitionerContext* context) { + context_.emplace_back(context); +} + +size_t MergedPartitionerContext::ContextSize() { + return context_.size(); +} + +Status MergedPartitioner::Split(MergedPartitionerContext* ctx, Data* src, std::vector* dst) { + return Status::NotImplemented("MergedPartitioner do not implement default Split"); +} + +Status MergedPartitioner::Combine(MergedPartitionerContext* ctx, Data* src, size_t server_id, std::vector>* output) { + return Status::NotImplemented("MergedPartitioner do not implement default Combine"); +} + +Status MergedPartitioner::Init(MergedPartitionerContext* ctx, Data* src) { + return Status::Ok(); +} + +Status MergedPartitioner::CombineInit(MergedPartitionerContext* ctx, std::vector>* output) { + return Status::Ok(); +} + +} +} + diff --git a/xdl/ps-plus/ps-plus/client/merged_partitioner.h b/xdl/ps-plus/ps-plus/client/merged_partitioner.h new file mode 100644 index 00000000..2ff77a8b --- /dev/null +++ b/xdl/ps-plus/ps-plus/client/merged_partitioner.h @@ -0,0 +1,60 @@ +/* Copyright (C) 2016-2018 Alibaba Group Holding Limited + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef PS_PLUS_CLIENT_MERGED_PARTITIONER_H_ +#define PS_PLUS_CLIENT_MERGED_PARTITIONER_H_ + +#include "ps-plus/common/status.h" +#include "ps-plus/common/data.h" +#include "ps-plus/message/variable_info.h" +#include "ps-plus/client/partitioner.h" + +#include +#include + +namespace ps { +namespace client { + +class MergedPartitionerContext { + public: + MergedPartitionerContext(); + Data* GetData(std::size_t id); + void SetData(std::size_t id, Data* data); + void AddDeleter(Data* data); + void SetContext(std::size_t id, PartitionerContext* context); + PartitionerContext* GetContext(std::size_t id); + void AddContext(PartitionerContext* context); + size_t ContextSize(); + private: + std::vector> datas_; + std::vector> deleter_; + std::vector> context_; +}; + +class MergedPartitioner { + public: + virtual ~MergedPartitioner() {} + virtual Status Init(MergedPartitionerContext* ctx, Data* src); + virtual Status CombineInit(MergedPartitionerContext* ctx, std::vector>* output); + virtual Status Split(MergedPartitionerContext* ctx, Data* src, std::vector* dst); + virtual Status Combine(MergedPartitionerContext* ctx, Data* src, size_t server_id, std::vector>* output); +}; + +} +} + +#define CHECK_COUNTER(COUNTER, OK) do { if (--COUNTER == 0) {OK.set_value(true);} return;} while(0); + +#endif diff --git a/xdl/ps-plus/ps-plus/client/merged_process_context.h b/xdl/ps-plus/ps-plus/client/merged_process_context.h new file mode 100644 index 00000000..24dac199 --- /dev/null +++ b/xdl/ps-plus/ps-plus/client/merged_process_context.h @@ -0,0 +1,74 @@ +/* Copyright (C) 2016-2018 Alibaba Group Holding Limited + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef PS_PLUS_CLIENT_MERGED_PROCESS_CONTEXT_H +#define PS_PLUS_CLIENT_MERGED_PROCESS_CONTEXT_H + +#include +#include + +namespace ps { +namespace client { + +class MergedProcessContext { + public: + using Callback = std::function; + MergedProcessContext(size_t count) : count_(count), st_(Status::Ok()) {} + void Collect(const std::vector& combiner, + MergedPartitionerContext* ctx, + std::vector* server_results, + std::vector > >* results, + size_t server_id, + const Status& resp_st, + const Callback& cb) { + if (!resp_st.IsOk()) { + st_ = resp_st; + } else { + if ((*server_results).size() != combiner.size()) { + st_ = Status::ArgumentError("Combiner Size Error"); + } else { + for (size_t i = 0; i < combiner.size(); ++i) { + Status st = combiner[i]->Combine(ctx, (*server_results)[i], server_id, &(*results)[i]); + if (!st.IsOk()) { + st_ = st; + } + } + } + } + delete server_results; + if (--count_ == 0) { + cb(st_); + delete this; + } + } + Callback CollectResults(const std::vector& combiner, + MergedPartitionerContext* ctx, + std::vector* server_results, + std::vector > >* results, + size_t server_id, + const Callback& cb) { + return [combiner, ctx, server_results, results, server_id, cb, this](Status resp_st){ + this->Collect(combiner, ctx, server_results, results, server_id, resp_st, cb); + }; + } + private: + std::atomic count_; + Status st_; +}; + +} +} + +#endif diff --git a/xdl/ps-plus/ps-plus/client/partitioner.cc b/xdl/ps-plus/ps-plus/client/partitioner.cc index 780dd797..2c3e0f4f 100644 --- a/xdl/ps-plus/ps-plus/client/partitioner.cc +++ b/xdl/ps-plus/ps-plus/client/partitioner.cc @@ -21,9 +21,11 @@ namespace client { PartitionerContext::PartitionerContext() {} PartitionerContext::PartitionerContext(const VariableInfo& variable_info) - : variable_info_(variable_info) {} + : variable_info_(variable_info) { + deleter_.resize(variable_info_.parts.size()); +} -Data* PartitionerContext::GetData(std::size_t id) { +Data* PartitionerContext::GetData(size_t id) { if (id >= datas_.size()) { return nullptr; } else { @@ -31,17 +33,22 @@ Data* PartitionerContext::GetData(std::size_t id) { } } -void PartitionerContext::SetData(std::size_t id, Data* data) { +void PartitionerContext::SetData(size_t id, Data* data) { datas_.resize(std::max(id + 1, datas_.size())); datas_[id].reset(data); } void PartitionerContext::AddDeleter(Data* data) { - deleter_.emplace_back(data); + deleter_[0].emplace_back(data); +} + +void PartitionerContext::AddDeleter(Data* data, size_t index) { + deleter_[index].emplace_back(data); } void PartitionerContext::SetVariableInfo(const VariableInfo& info) { variable_info_ = info; + deleter_.resize(variable_info_.parts.size()); } VariableInfo* PartitionerContext::GetVariableInfo() { @@ -60,6 +67,10 @@ Status Partitioner::Init(PartitionerContext* ctx, Data* src) { return Status::Ok(); } +Status Partitioner::CombineInit(PartitionerContext* ctx, std::unique_ptr* output) { + return Status::Ok(); +} + } } diff --git a/xdl/ps-plus/ps-plus/client/partitioner.h b/xdl/ps-plus/ps-plus/client/partitioner.h index cba1e9b7..d5236afc 100644 --- a/xdl/ps-plus/ps-plus/client/partitioner.h +++ b/xdl/ps-plus/ps-plus/client/partitioner.h @@ -30,14 +30,15 @@ class PartitionerContext { public: PartitionerContext(); PartitionerContext(const VariableInfo& variable_info); - Data* GetData(std::size_t id); - void SetData(std::size_t id, Data* data); + Data* GetData(size_t id); + void SetData(size_t id, Data* data); void AddDeleter(Data* data); + void AddDeleter(Data* data, size_t index); void SetVariableInfo(const VariableInfo& info); VariableInfo* GetVariableInfo(); private: std::vector> datas_; - std::vector> deleter_; + std::vector>> deleter_; VariableInfo variable_info_; }; @@ -45,6 +46,7 @@ class Partitioner { public: virtual ~Partitioner() {} virtual Status Init(PartitionerContext* ctx, Data* src); + virtual Status CombineInit(PartitionerContext* ctx, std::unique_ptr* output); virtual Status Split(PartitionerContext* ctx, Data* src, std::vector* dst); virtual Status Combine(PartitionerContext* ctx, Data* src, size_t server_id, std::unique_ptr* output); }; diff --git a/xdl/ps-plus/ps-plus/client/partitioner/dense.cc b/xdl/ps-plus/ps-plus/client/partitioner/dense.cc index 939b0fef..ebe44185 100644 --- a/xdl/ps-plus/ps-plus/client/partitioner/dense.cc +++ b/xdl/ps-plus/ps-plus/client/partitioner/dense.cc @@ -17,25 +17,21 @@ limitations under the License. #include "ps-plus/common/tensor.h" #include "ps-plus/common/initializer/none_initializer.h" #include "ps-plus/common/thread_pool.h" +#include "xdl/core/utils/logging.h" #include namespace ps { namespace client { namespace partitioner { -Status Dense::Split(PartitionerContext* ctx, Data* src, std::vector* dst) { - VariableInfo* info = ctx->GetVariableInfo(); - if (info->type != VariableInfo::kIndex) { - return Status::ArgumentError("Dense Partitioner Only Allow by kIndex"); - } - WrapperData* data_wrapper = dynamic_cast*>(src); - if (data_wrapper == nullptr) { - return Status::ArgumentError("Dense Partitioner Only Allow the Tensor Data"); - } - Tensor& data = data_wrapper->Internal(); +namespace { +Status SplitSingleTensor(PartitionerContext* ctx, const Tensor& data, std::vector* dst) { + VariableInfo* info = ctx->GetVariableInfo(); if (info->parts.size() == 1 && info->shape.empty()) { dst->clear(); + WrapperData* src = new WrapperData(data); + ctx->AddDeleter(src); dst->push_back(src); return Status::Ok(); } @@ -67,6 +63,40 @@ Status Dense::Split(PartitionerContext* ctx, Data* src, std::vector* dst) return Status::Ok(); } +} + +Status Dense::Split(PartitionerContext* ctx, Data* src, std::vector* dst) { + VariableInfo* info = ctx->GetVariableInfo(); + if (info->type != VariableInfo::kIndex) { + return Status::ArgumentError("Dense Partitioner Only Allow by kIndex"); + } + if (dynamic_cast*>(src) != nullptr) { + Tensor& data = dynamic_cast*>(src)->Internal(); + return SplitSingleTensor(ctx, data, dst); + } else if (dynamic_cast>*>(src) != nullptr) { + std::vector& data_vec = dynamic_cast>*>(src)->Internal(); + dst->clear(); + for (size_t i = 0; i < info->parts.size(); ++i) { + WrapperData>* result = new WrapperData>(); + dst->emplace_back(result); + ctx->AddDeleter(result); + } + for (size_t i = 0; i < data_vec.size(); ++i) { + std::vector one_dst; + Status one_status = SplitSingleTensor(ctx, data_vec[i], &one_dst); + if (!one_status.IsOk()) { + return one_status; + } + for(size_t j = 0; j < one_dst.size(); ++j) { + dynamic_cast>*>((*dst)[j])->Internal().push_back(dynamic_cast*>(one_dst[j])->Internal()); + } + } + return Status::Ok(); + } else { + return Status::ArgumentError("Dense Partitioner Only Allow the Tensor Data or Tensor Data Vector"); + } +} + Status Dense::Combine(PartitionerContext* ctx, Data* src, size_t server_id, std::unique_ptr* output) { VariableInfo* info = ctx->GetVariableInfo(); if (info->type != VariableInfo::kIndex) { @@ -95,6 +125,7 @@ Status Dense::Combine(PartitionerContext* ctx, Data* src, size_t server_id, std: shape.Set(0, combined_size); } Tensor* result; + /* if (output->get() == nullptr) { output->reset(new WrapperData(type, shape, new initializer::NoneInitializer)); WrapperData* raw_output = dynamic_cast*>(output->get()); @@ -106,6 +137,12 @@ Status Dense::Combine(PartitionerContext* ctx, Data* src, size_t server_id, std: } result = &(raw_output->Internal()); } + */ + WrapperData* raw_output = dynamic_cast*>(output->get()); + if (raw_output == nullptr) { + return Status::ArgumentError("Dense Partitioner Combiner output is not Tensor"); + } + result = &(raw_output->Internal()); size_t offset = 0; for (size_t i = 0; i < server_id; i++) { offset += info->parts[i].size; @@ -119,6 +156,26 @@ Status Dense::Combine(PartitionerContext* ctx, Data* src, size_t server_id, std: return Status::Ok(); } +Status Dense::CombineInit(PartitionerContext* ctx, std::unique_ptr* output) { + VariableInfo* info = ctx->GetVariableInfo(); + size_t combined_size = 0; + for (auto part : info->parts) { + combined_size += part.size; + } + std::vector dims; + if (!info->shape.empty()) { + dims.push_back(combined_size); + for (size_t i = 1; i < info->shape.size(); ++i) { + dims.push_back(info->shape[i]); + } + } + + TensorShape shape(dims); + DataType type = info->datatype; + output->reset(new WrapperData(type, shape, new initializer::NoneInitializer)); + return Status::Ok(); +} + } } } diff --git a/xdl/ps-plus/ps-plus/client/partitioner/dense.h b/xdl/ps-plus/ps-plus/client/partitioner/dense.h index 93add65f..d3f64477 100644 --- a/xdl/ps-plus/ps-plus/client/partitioner/dense.h +++ b/xdl/ps-plus/ps-plus/client/partitioner/dense.h @@ -26,6 +26,7 @@ class Dense : public Partitioner { public: virtual Status Split(PartitionerContext* ctx, Data* src, std::vector* dst) override; virtual Status Combine(PartitionerContext* ctx, Data* src, size_t server_id, std::unique_ptr* output) override; + virtual Status CombineInit(PartitionerContext* ctx, std::unique_ptr* output) override; }; } diff --git a/xdl/ps-plus/ps-plus/client/partitioner/merged_broadcast.cc b/xdl/ps-plus/ps-plus/client/partitioner/merged_broadcast.cc new file mode 100644 index 00000000..cdd75193 --- /dev/null +++ b/xdl/ps-plus/ps-plus/client/partitioner/merged_broadcast.cc @@ -0,0 +1,39 @@ +/* Copyright (C) 2016-2018 Alibaba Group Holding Limited + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "ps-plus/client/partitioner/merged_broadcast.h" + +namespace ps { +namespace client { +namespace partitioner { + +Status MergedBroadcast::Split(MergedPartitionerContext* ctx, Data* src, std::vector* dst) { + size_t part_size = ctx->GetContext(0)->GetVariableInfo()->parts.size(); + for (size_t i = 0; i < ctx->ContextSize(); ++i) { + if (ctx->GetContext(i)->GetVariableInfo()->parts.size() != part_size) { + return Status::ArgumentError("Merged Hash Variable Should Have the Same Parts Size"); + } + } + dst->clear(); + for (size_t i = 0; i < part_size; ++i) { + dst->push_back(src); + } + return Status::Ok(); +} + +} +} +} + diff --git a/xdl/ps-plus/ps-plus/client/partitioner/merged_broadcast.h b/xdl/ps-plus/ps-plus/client/partitioner/merged_broadcast.h new file mode 100644 index 00000000..33ce832c --- /dev/null +++ b/xdl/ps-plus/ps-plus/client/partitioner/merged_broadcast.h @@ -0,0 +1,35 @@ +/* Copyright (C) 2016-2018 Alibaba Group Holding Limited + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef PS_PLUS_CLIENT_PARTITIONER_MERGED_BROADCAST_H_ +#define PS_PLUS_CLIENT_PARTITIONER_MERGED_BROADCAST_H_ + +#include "ps-plus/client/merged_partitioner.h" + +namespace ps { +namespace client { +namespace partitioner { + +class MergedBroadcast : public MergedPartitioner { + public: + virtual Status Split(MergedPartitionerContext* ctx, Data* src, std::vector* dst) override; +}; + +} +} +} + +#endif + diff --git a/xdl/ps-plus/ps-plus/client/partitioner/merged_hash.cc b/xdl/ps-plus/ps-plus/client/partitioner/merged_hash.cc new file mode 100644 index 00000000..318a1fa8 --- /dev/null +++ b/xdl/ps-plus/ps-plus/client/partitioner/merged_hash.cc @@ -0,0 +1,126 @@ +/* Copyright (C) 2016-2018 Alibaba Group Holding Limited + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "ps-plus/client/partitioner/merged_hash.h" +#include "ps-plus/common/thread_pool.h" +#include "ps-plus/common/hasher.h" +#include "ps-plus/common/logging.h" +#include +#include +#include + +namespace ps { +namespace client { +namespace partitioner { + +Status MergedHashData::Split(MergedPartitionerContext* ctx, Data* src, std::vector* dst) { + WrapperData>* data_wrapper = dynamic_cast>*>(src); + if (data_wrapper == nullptr) { + return Status::ArgumentError("MergedHashData Partitioner Only Allow the Tensor Data Vector"); + } + std::vector& data_vec = data_wrapper->Internal(); + if (data_vec.size() != ctx->ContextSize()) { + return Status::ArgumentError("Merged Variable Number Should be the Same With Data Number"); + } + size_t part_size = ctx->GetContext(0)->GetVariableInfo()->parts.size(); + dst->clear(); + for (size_t i = 0; i < part_size; ++i) { + WrapperData>* result = new WrapperData>(); + dynamic_cast>*>(result)->Internal().resize(ctx->ContextSize()); + dst->emplace_back(result); + ctx->AddDeleter(result); + } + Status status = Status::Ok(); + std::vector> dst_arr(ctx->ContextSize()); + for (size_t i = 0; i < ctx->ContextSize(); ++i) { + WrapperData* one_src = new WrapperData(data_vec[i]); + ctx->GetContext(i)->AddDeleter(one_src); + Status one_status = data_partitioner_.Split(ctx->GetContext(i), one_src, &dst_arr[i]); + if (!one_status.IsOk()) { + status = one_status; + } + for(size_t j = 0; j < dst_arr[i].size(); ++j) { + dynamic_cast>*>((*dst)[j])->Internal()[i] = dynamic_cast*>(dst_arr[i][j])->Internal(); + } + } + return status; +} + +Status MergedHashData::Combine(MergedPartitionerContext* ctx, Data* src, size_t server_id, std::vector>* output) { + WrapperData>* data_wrapper = dynamic_cast>*>(src); + if (data_wrapper == nullptr) { + return Status::ArgumentError("MergedHashData Partitioner Combine src Only Allow the Tensor Data Vector"); + } + std::vector& data_vec = data_wrapper->Internal(); + if (data_vec.size() != ctx->ContextSize() || data_vec.size() != output->size()) { + return Status::ArgumentError("Merged Variable Number Should be the Same With Data Number"); + } + Status status = Status::Ok(); + for (size_t i = 0; i < ctx->ContextSize(); ++i) { + WrapperData* one_src = new WrapperData(data_vec[i]); + ctx->GetContext(i)->AddDeleter(one_src, server_id); + Status one_status = data_partitioner_.Combine(ctx->GetContext(i), one_src, server_id, &(*output)[i]); + if (!one_status.IsOk()) { + status = one_status; + } + } + return status; +} + +Status MergedHashId::Init(MergedPartitionerContext* ctx, Data* src) { + WrapperData>* data_wrapper = dynamic_cast>*>(src); + if (data_wrapper == nullptr) { + return Status::ArgumentError("MergedHashId Partitioner Only Allow the Tensor Data Vector"); + } + std::vector& id_vec = data_wrapper->Internal(); + if (id_vec.size() != ctx->ContextSize()) { + return Status::ArgumentError("Merged Variable Number Should be the Same With Id Number"); + } + size_t part_size = ctx->GetContext(0)->GetVariableInfo()->parts.size(); + return MultiThreadDo(ctx->ContextSize(), [&](const Range& r) { + for (size_t i = r.begin; i < r.end; i++) { + if (ctx->GetContext(i)->GetVariableInfo()->parts.size() != part_size) { + return Status::ArgumentError("Merged Hash Variable Should Have the Same Parts Size"); + } + if (ctx->GetContext(i)->GetVariableInfo()->type != VariableInfo::kHash128 && + ctx->GetContext(i)->GetVariableInfo()->type != VariableInfo::kHash64) { + return Status::ArgumentError("HashId Partitioner Only Allow by kHash"); + } + WrapperData* one_src = new WrapperData(id_vec[i]); + ctx->GetContext(i)->AddDeleter(one_src); + Status st = id_partitioner_.Init(ctx->GetContext(i), one_src); + if (!st.IsOk()) { + return st; + } + } + return Status::Ok(); + }, 1); +} + +Status MergedHashData::CombineInit(MergedPartitionerContext* ctx, std::vector>* output) { + Status status = Status::Ok(); + for (size_t i = 0; i < ctx->ContextSize(); ++i) { + Status one_status = data_partitioner_.CombineInit(ctx->GetContext(i), &(*output)[i]); + if (!one_status.IsOk()) { + status = one_status; + } + } + return status; +} + +} +} +} + diff --git a/xdl/ps-plus/ps-plus/client/partitioner/merged_hash.h b/xdl/ps-plus/ps-plus/client/partitioner/merged_hash.h new file mode 100644 index 00000000..29b098e1 --- /dev/null +++ b/xdl/ps-plus/ps-plus/client/partitioner/merged_hash.h @@ -0,0 +1,51 @@ +/* Copyright (C) 2016-2018 Alibaba Group Holding Limited + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef PS_PLUS_CLIENT_PARTITIONER_MERGED_HASH_H_ +#define PS_PLUS_CLIENT_PARTITIONER_MERGED_HASH_H_ + +#include "ps-plus/client/merged_partitioner.h" +#include "ps-plus/client/partitioner/sparse.h" +#include "ps-plus/common/tensor.h" +#include "ps-plus/common/tensor_shape.h" + +namespace ps { +namespace client { +namespace partitioner { + +class MergedHashData : public MergedPartitioner { + public: + MergedHashData(size_t id = 0) : id_(id) {} + virtual Status Split(MergedPartitionerContext* ctx, Data* src, std::vector* dst) override; + virtual Status Combine(MergedPartitionerContext* ctx, Data* src, size_t server_id, std::vector>* output) override; + virtual Status CombineInit(MergedPartitionerContext* ctx, std::vector>* output) override; + protected: + size_t id_; + HashId id_partitioner_; + HashData data_partitioner_; +}; + +class MergedHashId : public MergedHashData { + public: + MergedHashId(size_t id = 0) : MergedHashData(id) {} + virtual Status Init(MergedPartitionerContext* ctx, Data* src) override; +}; + +} +} +} + +#endif + diff --git a/xdl/ps-plus/ps-plus/client/partitioner/merged_slice.h b/xdl/ps-plus/ps-plus/client/partitioner/merged_slice.h new file mode 100644 index 00000000..dc7ec754 --- /dev/null +++ b/xdl/ps-plus/ps-plus/client/partitioner/merged_slice.h @@ -0,0 +1,99 @@ +/* Copyright (C) 2016-2018 Alibaba Group Holding Limited + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef PS_PLUS_CLIENT_PARTITIONER_MERGED_SLICE_H_ +#define PS_PLUS_CLIENT_PARTITIONER_MERGED_SLICE_H_ + +#include "ps-plus/client/merged_partitioner.h" +#include "ps-plus/client/partitioner/sparse.h" +#include "ps-plus/common/tensor.h" +#include "ps-plus/common/tensor_shape.h" + +namespace ps { +namespace client { +namespace partitioner { + +class MergedSliceBegin : public MergedPartitioner { + public: + MergedSliceBegin() {} + virtual Status Split(MergedPartitionerContext* ctx, Data* src, std::vector* dst) override { + WrapperData>* data_wrapper = dynamic_cast>*>(src); + if (data_wrapper == nullptr) { + return Status::ArgumentError("MergedSliceBegin Partitioner Only Allow the IntVector"); + } + auto& data = data_wrapper->Internal(); + if (data.size() != ctx->ContextSize()) { + return Status::ArgumentError("MergedSliceBegin Partitioner IntVector Size should be equal to variable size"); + } + std::vector> raw_result(ctx->GetContext(0)->GetVariableInfo()->parts.size()); + for (size_t i = 0; i < ctx->ContextSize(); i++) { + VariableInfo* info = ctx->GetContext(0)->GetVariableInfo(); + if (info->parts.size() != raw_result.size()) { + return Status::ArgumentError("Merged Variable Number Should be the Same With Data Number"); + } + int k = 0; + for (size_t j = 0; j < info->parts.size(); j++) { + raw_result[j].push_back(k); + k += info->parts[j].size; + } + } + for (auto&& item : raw_result) { + auto rst = new WrapperData>(item); + dst->push_back(rst); + ctx->AddDeleter(rst); + } + return Status::Ok(); + } +}; + +class MergedSliceEnd : public MergedPartitioner { + public: + MergedSliceEnd() {} + virtual Status Split(MergedPartitionerContext* ctx, Data* src, std::vector* dst) override { + WrapperData>* data_wrapper = dynamic_cast>*>(src); + if (data_wrapper == nullptr) { + return Status::ArgumentError("MergedSliceBegin Partitioner Only Allow the IntVector"); + } + auto& data = data_wrapper->Internal(); + if (data.size() != ctx->ContextSize()) { + return Status::ArgumentError("MergedSliceBegin Partitioner IntVector Size should be equal to variable size"); + } + std::vector> raw_result(ctx->GetContext(0)->GetVariableInfo()->parts.size()); + for (size_t i = 0; i < ctx->ContextSize(); i++) { + VariableInfo* info = ctx->GetContext(0)->GetVariableInfo(); + if (info->parts.size() != raw_result.size()) { + return Status::ArgumentError("Merged Variable Number Should be the Same With Data Number"); + } + int k = 0; + for (size_t j = 0; j < info->parts.size(); j++) { + k += info->parts[j].size; + raw_result[j].push_back(k); + } + } + for (auto&& item : raw_result) { + auto rst = new WrapperData>(item); + dst->push_back(rst); + ctx->AddDeleter(rst); + } + return Status::Ok(); + } +}; + +} +} +} + +#endif + diff --git a/xdl/ps-plus/ps-plus/client/partitioner/reduce.cc b/xdl/ps-plus/ps-plus/client/partitioner/reduce.cc new file mode 100644 index 00000000..dd9241d7 --- /dev/null +++ b/xdl/ps-plus/ps-plus/client/partitioner/reduce.cc @@ -0,0 +1,31 @@ +/* Copyright (C) 2016-2018 Alibaba Group Holding Limited + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "ps-plus/client/partitioner/reduce.h" + +namespace ps { +namespace client { +namespace partitioner { +namespace reduce_impl { + +constexpr int AddFunctor::default_value; +constexpr int MulFunctor::default_value; +constexpr bool AndFunctor::default_value; +constexpr bool OrFunctor::default_value; + +} +} +} +} diff --git a/xdl/ps-plus/ps-plus/client/partitioner/reduce.h b/xdl/ps-plus/ps-plus/client/partitioner/reduce.h new file mode 100644 index 00000000..b8a7de83 --- /dev/null +++ b/xdl/ps-plus/ps-plus/client/partitioner/reduce.h @@ -0,0 +1,100 @@ +/* Copyright (C) 2016-2018 Alibaba Group Holding Limited + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef PS_PLUS_CLIENT_PARTITIONER_REDUCE_H_ +#define PS_PLUS_CLIENT_PARTITIONER_REDUCE_H_ + +#include "ps-plus/client/partitioner.h" + +namespace ps { +namespace client { +namespace partitioner { +namespace reduce_impl { + +template +class Reduce : public Partitioner { + public: + virtual Status Combine(PartitionerContext* ctx, Data* src, size_t server_id, std::unique_ptr* output) override { + WrapperData* raw_src = dynamic_cast*>(src); + if (raw_src == nullptr) { + return Status::ArgumentError("Logic Partitioner Combine src should be bool"); + } + + if (output->get() == nullptr) { + output->reset(new WrapperData(Functor::default_value)); + } + + WrapperData* dst = dynamic_cast*>(output->get()); + Functor::Run(raw_src->Internal(), &dst->Internal()); + + return Status::Ok(); + } +}; + +struct AddFunctor { + static constexpr int default_value = 0; + template + static void Run(T x, T* y) { + *y += x; + } +}; + +struct MulFunctor { + static constexpr int default_value = 1; + template + static void Run(T x, T* y) { + *y *= x; + } +}; + +struct AndFunctor { + static constexpr bool default_value = true; + template + static void Run(T x, T* y) { + *y &= x; + } +}; + +struct OrFunctor { + static constexpr bool default_value = false; + template + static void Run(T x, T* y) { + *y |= x; + } +}; + +template +class ReduceSum : public Reduce {}; + +template +class ReduceMul : public Reduce {}; + +class ReduceAnd : public Reduce {}; + +class ReduceOr : public Reduce {}; + +} + +using reduce_impl::ReduceSum; +using reduce_impl::ReduceMul; +using reduce_impl::ReduceAnd; +using reduce_impl::ReduceOr; + +} +} +} + +#endif + diff --git a/xdl/ps-plus/ps-plus/client/partitioner/sparse.cc b/xdl/ps-plus/ps-plus/client/partitioner/sparse.cc index d88121b8..952568e1 100644 --- a/xdl/ps-plus/ps-plus/client/partitioner/sparse.cc +++ b/xdl/ps-plus/ps-plus/client/partitioner/sparse.cc @@ -30,20 +30,58 @@ struct SparseSlices { size_t id_size; }; -} +Status SplitOneHashId(PartitionerContext* ctx, const Tensor& id, size_t index) { + VariableInfo* info = ctx->GetVariableInfo(); + if (info->type == VariableInfo::kHash128) { + if (id.Shape().Size() != 2 || id.Shape()[1] != 2) { + return Status::ArgumentError("HashId Parttioner: Hash128 ID Should be 2-D, ID Shape should be [?, 2], variable[" + info->name + "]"); + } + } else { + if (id.Shape().Size() != 1) { + return Status::ArgumentError("HashId Parttioner: Hash64 ID Should be 1-D, variable[" + info->name + "]"); + } + } -Status SparseData::Split(PartitionerContext* ctx, Data* src, std::vector* dst) { - WrapperData* data_wrapper = dynamic_cast*>(src); - if (data_wrapper == nullptr) { - return Status::ArgumentError("Sparse Partitioner Only Allow the Tensor Data"); + size_t limit = 0; + // We need to use lower_bound(splits, id) to find server about id + std::vector splits; + for (auto& item : info->parts) { + limit += item.size; + splits.push_back(limit - 1); } - Tensor& data = data_wrapper->Internal(); + if (limit != Hasher::kTargetRange) { + return Status::ArgumentError("HashId Parttioner: Variable Info Error, Check the Placementer"); + } + + SparseSlices slices; + slices.ids.resize(info->parts.size()); + slices.id_size = id.Shape()[0]; + + CASES(id.Type(), do { + T* raw_ids = id.Raw(); + for (size_t i = 0; i < id.Shape()[0]; i++) { + size_t x; + if (info->type == VariableInfo::kHash128) { + x = Hasher::Hash128(raw_ids[i * 2], raw_ids[i * 2 + 1]); + } else { + x = Hasher::Hash64(raw_ids[i]); + } + int split_id = std::lower_bound(splits.begin(), splits.end(), x) - splits.begin(); + slices.ids[split_id].push_back(i); + } + } while(0)); + + ctx->SetData(index, new WrapperData(std::move(slices))); + return Status::Ok(); +} + +Status SplitOneSparseData(PartitionerContext* ctx, const Tensor& data, std::vector* dst, size_t id) { if (data.Shape().IsScalar()) { return Status::ArgumentError("Sparse Partitioner Doesn't Accept Scalar Type"); } - WrapperData* id_wrapper = dynamic_cast*>(ctx->GetData(id_)); + WrapperData* id_wrapper = dynamic_cast*>(ctx->GetData(id)); if (id_wrapper == nullptr) { return Status::ArgumentError("Sparse Partitioner Init Error"); } @@ -53,25 +91,61 @@ Status SparseData::Split(PartitionerContext* ctx, Data* src, std::vector* return Status::ArgumentError("Data's Shape Does Not Match the ID Size"); } - dst->clear(); - + dst->resize(slices.ids.size()); + TensorShape shape = data.Shape(); DataType type = data.Type(); shape.Set(0, 1); size_t single_size = shape.NumElements() * SizeOfType(type); - for (auto item : slices.ids) { - shape.Set(0, item.size()); - WrapperData* result = new WrapperData(type, shape, new initializer::NoneInitializer); - char* res_ptr = result->Internal().Raw(); - char* src_ptr = data.Raw(); - for (auto id : item) { - memcpy(res_ptr, src_ptr + id * single_size, single_size); - res_ptr += single_size; + MultiThreadDoTBB(slices.ids.size(), [&](const Range& r) { + for (size_t i = r.begin; i < r.end; i++) { + auto& item = slices.ids[i]; + TensorShape shape = data.Shape(); + shape.Set(0, item.size()); + WrapperData* result = new WrapperData(data.Type(), shape, new initializer::NoneInitializer); + char* res_ptr = result->Internal().Raw(); + char* src_ptr = data.Raw(); + for (auto id : item) { + memcpy(res_ptr, src_ptr + id * single_size, single_size); + res_ptr += single_size; + } + ctx->AddDeleter(result, i); + (*dst)[i] = result; + } + return Status::Ok(); + }); + return Status::Ok(); +} + +} + +Status SparseData::Split(PartitionerContext* ctx, Data* src, std::vector* dst) { + if (dynamic_cast*>(src) != nullptr) { + Tensor& data = dynamic_cast*>(src)->Internal(); + return SplitOneSparseData(ctx, data, dst, id_); + } else if (dynamic_cast>*>(src) != nullptr) { + VariableInfo* info = ctx->GetVariableInfo(); + std::vector& data_vec = dynamic_cast>*>(src)->Internal(); + dst->clear(); + for (size_t i = 0; i < info->parts.size(); ++i) { + WrapperData>* result = new WrapperData>(); + dst->emplace_back(result); + ctx->AddDeleter(result); + } + for (size_t i = 0; i < data_vec.size(); ++i) { + std::vector one_dst; + Status one_status = SplitOneSparseData(ctx, data_vec[i], &one_dst, i); + if (!one_status.IsOk()) { + return one_status; + } + for(size_t j = 0; j < one_dst.size(); ++j) { + dynamic_cast>*>((*dst)[j])->Internal().push_back(dynamic_cast*>(one_dst[j])->Internal()); + } } - ctx->AddDeleter(result); - dst->push_back(result); + return Status::Ok(); + } else { + return Status::ArgumentError("SparseData Partitioner Only Allow the Tensor Data or Tensor Data Vector"); } - return Status::Ok(); } Status SparseData::Combine(PartitionerContext* ctx, Data* src, size_t server_id, std::unique_ptr* output) { @@ -95,29 +169,43 @@ Status SparseData::Combine(PartitionerContext* ctx, Data* src, size_t server_id, return Status::ArgumentError("Sparse Partitioner Combiner src shape error"); } - shape.Set(0, slices.id_size); - Tensor* result; - if (output->get() == nullptr) { - output->reset(new WrapperData(type, shape, new initializer::NoneInitializer)); - WrapperData* raw_output = dynamic_cast*>(output->get()); - result = &(raw_output->Internal()); - } else { - WrapperData* raw_output = dynamic_cast*>(output->get()); - if (raw_output == nullptr) { - return Status::ArgumentError("Sparse Partitioner Combiner output is not Tensor"); + shape.Set(0, slices.id_size); + + /* + { + QRWLocker lock(lock_, QRWLocker::kWrite); + if (output->get() == nullptr) { + output->reset(new WrapperData(type, shape, new initializer::NoneInitializer)); + WrapperData* raw_output = dynamic_cast*>(output->get()); + result = &(raw_output->Internal()); + } else { + WrapperData* raw_output = dynamic_cast*>(output->get()); + if (raw_output == nullptr) { + return Status::ArgumentError("Sparse Partitioner Combiner output is not Tensor"); + } + result = &(raw_output->Internal()); } - result = &(raw_output->Internal()); } + */ + WrapperData* raw_output = dynamic_cast*>(output->get()); + if (raw_output == nullptr) { + return Status::ArgumentError("Sparse Partitioner Combiner output is not Tensor"); + } + result = &(raw_output->Internal()); - char* src_ptr = data.Raw(); char* res_ptr = result->Raw(); shape.Set(0, 1); size_t single_size = shape.NumElements() * SizeOfType(type); - for (auto item : slices.ids[server_id]) { - memcpy(res_ptr + item * single_size, src_ptr, single_size); - src_ptr += single_size; - } + MultiThreadDo(slices.ids[server_id].size(), [&](const Range& r) { + char* src_ptr = data.Raw() + r.begin * single_size; + for (size_t i = r.begin; i < r.end; ++i) { + size_t item = slices.ids[server_id][i]; + memcpy(res_ptr + item * single_size, src_ptr, single_size); + src_ptr += single_size; + } + return Status::Ok(); + }, 1000); return Status::Ok(); } @@ -169,45 +257,44 @@ Status SparseId::Init(PartitionerContext* ctx, Data* src) { Status HashId::Init(PartitionerContext* ctx, Data* src) { VariableInfo* info = ctx->GetVariableInfo(); - if (info->type != VariableInfo::kHash) { + if (info->type != VariableInfo::kHash128 && info->type != VariableInfo::kHash64) { return Status::ArgumentError("HashId Partitioner Only Allow by kHash"); } - WrapperData* data_wrapper = dynamic_cast*>(src); - if (data_wrapper == nullptr) { - return Status::ArgumentError("Sparse Partitioner Only Allow the Tensor Data"); + if (dynamic_cast*>(src) != nullptr) { + Tensor& id = dynamic_cast*>(src)->Internal(); + return SplitOneHashId(ctx, id, id_); + } else if (dynamic_cast>*>(src) != nullptr) { + std::vector& id_vec = dynamic_cast>*>(src)->Internal(); + for (size_t i = 0; i < id_vec.size(); ++i) { + Status one_status = SplitOneHashId(ctx, id_vec[i], i); + if (!one_status.IsOk()) { + return one_status; + } + } + return Status::Ok(); + } else { + return Status::ArgumentError("HashId Partitioner Only Allow the Tensor Data or Tensor Data Vector"); } - Tensor& id = data_wrapper->Internal(); +} - if (id.Shape().Size() != 2 || id.Shape()[1] != 2) { - return Status::ArgumentError("Sparse Parttioner: ID Should be 2-D, ID Shape should be [?, 2]"); +Status SparseData::CombineInit(PartitionerContext* ctx, std::unique_ptr* output) { + WrapperData* id_wrapper = dynamic_cast*>(ctx->GetData(id_)); + if (id_wrapper == nullptr) { + return Status::ArgumentError("Sparse Partitioner Init Error"); } + SparseSlices& slices = id_wrapper->Internal(); - size_t limit = 0; - // We need to use lower_bound(splits, id) to find server about id - std::vector splits; - for (auto item : info->parts) { - limit += item.size; - splits.push_back(limit - 1); - } + VariableInfo* info = ctx->GetVariableInfo(); - if (limit != Hasher::kTargetRange) { - return Status::ArgumentError("HashId Parttioner: Variable Info Error, Check the Placementer"); + std::vector dims; + dims.push_back(slices.id_size); + for (size_t i = 1; i < info->shape.size(); ++i) { + dims.push_back(info->shape[i]); } + TensorShape shape(dims); + DataType type = info->datatype; + output->reset(new WrapperData(type, shape, new initializer::NoneInitializer)); - SparseSlices slices; - slices.ids.resize(info->parts.size()); - slices.id_size = id.Shape()[0]; - - CASES(id.Type(), do { - T* raw_ids = id.Raw(); - for (size_t i = 0; i < id.Shape()[0]; i++) { - size_t x = Hasher::Hash128(raw_ids[i * 2], raw_ids[i * 2 + 1]); - int split_id = std::lower_bound(splits.begin(), splits.end(), x) - splits.begin(); - slices.ids[split_id].push_back(i); - } - } while(0)); - - ctx->SetData(id_, new WrapperData(std::move(slices))); return Status::Ok(); } diff --git a/xdl/ps-plus/ps-plus/client/partitioner/sparse.h b/xdl/ps-plus/ps-plus/client/partitioner/sparse.h index 07d39df6..76e7b1e2 100644 --- a/xdl/ps-plus/ps-plus/client/partitioner/sparse.h +++ b/xdl/ps-plus/ps-plus/client/partitioner/sparse.h @@ -19,6 +19,7 @@ limitations under the License. #include "ps-plus/client/partitioner.h" #include "ps-plus/common/tensor.h" #include "ps-plus/common/tensor_shape.h" +#include "ps-plus/common/qrw_lock.h" namespace ps { namespace client { @@ -29,8 +30,10 @@ class SparseData : public Partitioner { SparseData(size_t id = 0) : id_(id) {} virtual Status Split(PartitionerContext* ctx, Data* src, std::vector* dst) override; virtual Status Combine(PartitionerContext* ctx, Data* src, size_t server_id, std::unique_ptr* output) override; + virtual Status CombineInit(PartitionerContext* ctx, std::unique_ptr* output) override; protected: size_t id_; + QRWLock lock_; }; class SparseId : public SparseData { diff --git a/xdl/ps-plus/ps-plus/client/partitioner/test/dense_test.cc b/xdl/ps-plus/ps-plus/client/partitioner/test/dense_test.cc index 374cc538..982d7a24 100644 --- a/xdl/ps-plus/ps-plus/client/partitioner/test/dense_test.cc +++ b/xdl/ps-plus/ps-plus/client/partitioner/test/dense_test.cc @@ -34,8 +34,10 @@ TEST(DensePartitionerTest, SimpleSplitAndCombine) { info.parts.push_back(VariableInfo::Part{.server = 1, .size = 2}); info.parts.push_back(VariableInfo::Part{.server = 2, .size = 4}); info.parts.push_back(VariableInfo::Part{.server = 3, .size = 3}); - info.shape.push_back(0); + info.shape.push_back(10); + info.shape.push_back(2); info.type = VariableInfo::kIndex; + info.datatype = DataType::kInt64; PartitionerContext ctx(info); std::unique_ptr> data(new WrapperData(DataType::kInt64, TensorShape({10, 2}), new NoneInitializer)); for (int i = 0; i < 20; i++) { data->Internal().Raw()[i] = i; @@ -67,6 +69,7 @@ TEST(DensePartitionerTest, SimpleSplitAndCombine) { } std::unique_ptr data2; + EXPECT_TRUE(partitioner.CombineInit(&ctx, &data2).IsOk()); EXPECT_TRUE(partitioner.Combine(&ctx, result[1], 1, &data2).IsOk()); EXPECT_TRUE(partitioner.Combine(&ctx, result[3], 3, &data2).IsOk()); EXPECT_TRUE(partitioner.Combine(&ctx, result[0], 0, &data2).IsOk()); @@ -80,8 +83,11 @@ TEST(DensePartitionerTest, SimpleSplitAndCombine) { TEST(DensePartitionerTest, ScalarSplitAndCombine) { VariableInfo info; - info.parts.push_back(VariableInfo::Part{.server = 0, .size = 1}); + info.parts.push_back(VariableInfo::Part{.server = 0, .size = 10}); info.type = VariableInfo::kIndex; + info.shape.push_back(10); + info.shape.push_back(2); + info.datatype = DataType::kInt64; PartitionerContext ctx(info); std::unique_ptr> data(new WrapperData(DataType::kInt64, TensorShape({10, 2}), new NoneInitializer)); for (int i = 0; i < 20; i++) { @@ -98,6 +104,7 @@ TEST(DensePartitionerTest, ScalarSplitAndCombine) { EXPECT_EQ(i, dynamic_cast*>(result[0])->Internal().Raw()[i]); } std::unique_ptr data2; + EXPECT_TRUE(partitioner.CombineInit(&ctx, &data2).IsOk()); EXPECT_TRUE(partitioner.Combine(&ctx, result[0], 0, &data2).IsOk()); EXPECT_EQ(TensorShape({10, 2}), dynamic_cast*>(data2.get())->Internal().Shape()); EXPECT_EQ(DataType::kInt64, dynamic_cast*>(data2.get())->Internal().Type()); diff --git a/xdl/ps-plus/ps-plus/client/partitioner/test/merged_broadcast_test.cc b/xdl/ps-plus/ps-plus/client/partitioner/test/merged_broadcast_test.cc new file mode 100644 index 00000000..def4cec5 --- /dev/null +++ b/xdl/ps-plus/ps-plus/client/partitioner/test/merged_broadcast_test.cc @@ -0,0 +1,54 @@ +/* Copyright (C) 2016-2018 Alibaba Group Holding Limited + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "gtest/gtest.h" +#include "ps-plus/client/partitioner/merged_broadcast.h" + +using ps::client::PartitionerContext; +using ps::client::MergedPartitionerContext; +using ps::client::partitioner::MergedBroadcast; +using ps::VariableInfo; +using ps::Data; +using ps::WrapperData; + +TEST(MergedBroadcastPartitionerTest, MergedBroadcastPartitionerTest) { + VariableInfo info1; + info1.parts.push_back(VariableInfo::Part{.server = 0, .size = 1}); + info1.parts.push_back(VariableInfo::Part{.server = 1, .size = 1}); + info1.parts.push_back(VariableInfo::Part{.server = 2, .size = 1}); + info1.parts.push_back(VariableInfo::Part{.server = 3, .size = 1}); + PartitionerContext* ctx1 = new PartitionerContext(info1); + VariableInfo info2; + info2.parts.push_back(VariableInfo::Part{.server = 0, .size = 1}); + info2.parts.push_back(VariableInfo::Part{.server = 1, .size = 1}); + info2.parts.push_back(VariableInfo::Part{.server = 2, .size = 1}); + info2.parts.push_back(VariableInfo::Part{.server = 3, .size = 1}); + PartitionerContext* ctx2 = new PartitionerContext(info2); + WrapperData* data = new WrapperData(10); + std::vector result; + MergedBroadcast splitter; + MergedPartitionerContext ctx; + ctx.AddContext(ctx1); + ctx.AddContext(ctx2); + EXPECT_TRUE(splitter.Init(&ctx, data).IsOk()); + EXPECT_TRUE(splitter.Split(&ctx, data, &result).IsOk()); + EXPECT_EQ(4u, result.size()); + EXPECT_EQ(10, dynamic_cast*>(result[0])->Internal()); + EXPECT_EQ(10, dynamic_cast*>(result[1])->Internal()); + EXPECT_EQ(10, dynamic_cast*>(result[2])->Internal()); + EXPECT_EQ(10, dynamic_cast*>(result[3])->Internal()); + delete data; +} + diff --git a/xdl/ps-plus/ps-plus/client/partitioner/test/sparse_test.cc b/xdl/ps-plus/ps-plus/client/partitioner/test/sparse_test.cc index 3be3b81d..ded9a9b0 100644 --- a/xdl/ps-plus/ps-plus/client/partitioner/test/sparse_test.cc +++ b/xdl/ps-plus/ps-plus/client/partitioner/test/sparse_test.cc @@ -35,8 +35,9 @@ TEST(SparsePartitionerTest, SplitAndCombine) { info.parts.push_back(VariableInfo::Part{.server = 2, .size = 4}); info.parts.push_back(VariableInfo::Part{.server = 3, .size = 3}); info.parts.push_back(VariableInfo::Part{.server = 4, .size = 5}); - info.shape.push_back(0); + info.shape.push_back(15); info.type = VariableInfo::kIndex; + info.datatype = DataType::kInt64; PartitionerContext ctx(info); std::unique_ptr> data(new WrapperData(DataType::kInt64, TensorShape({5, 2}), new NoneInitializer)); @@ -78,6 +79,7 @@ TEST(SparsePartitionerTest, SplitAndCombine) { EXPECT_EQ(11, dynamic_cast*>(id_result[4])->Internal().Raw()[1]); std::unique_ptr ids2; + EXPECT_TRUE(id_partitioner.CombineInit(&ctx, &ids2).IsOk()); EXPECT_TRUE(id_partitioner.Combine(&ctx, id_result[1], 1, &ids2).IsOk()); EXPECT_TRUE(id_partitioner.Combine(&ctx, id_result[4], 4, &ids2).IsOk()); EXPECT_TRUE(id_partitioner.Combine(&ctx, id_result[2], 2, &ids2).IsOk()); @@ -114,6 +116,9 @@ TEST(SparsePartitionerTest, SplitAndCombine) { } std::unique_ptr data2; + info.shape.push_back(2); + ctx.SetVariableInfo(info); + EXPECT_TRUE(data_partitioner.CombineInit(&ctx, &data2).IsOk()); EXPECT_TRUE(data_partitioner.Combine(&ctx, result[1], 1, &data2).IsOk()); EXPECT_TRUE(data_partitioner.Combine(&ctx, result[4], 4, &data2).IsOk()); EXPECT_TRUE(data_partitioner.Combine(&ctx, result[2], 2, &data2).IsOk()); diff --git a/xdl/ps-plus/ps-plus/client/process_context.h b/xdl/ps-plus/ps-plus/client/process_context.h index ca0ef2be..d712b72c 100644 --- a/xdl/ps-plus/ps-plus/client/process_context.h +++ b/xdl/ps-plus/ps-plus/client/process_context.h @@ -24,38 +24,30 @@ namespace client { class ProcessContext { public: using Callback = std::function; - ProcessContext(int count) : count_(count), st_(Status::Ok()) {} + ProcessContext(size_t count) : count_(count), st_(Status::Ok()) {} void Collect(const std::vector& combiner, - PartitionerContext* ctx, - std::vector* server_results, - std::vector>* results, - size_t server_id, - Status resp_st, - Callback cb) { - bool run_done = false; - { - std::lock_guard lock(mu_); - if (!resp_st.IsOk()) { - st_ = resp_st; + PartitionerContext* ctx, + std::vector* server_results, + std::vector>* results, + size_t server_id, + const Status& resp_st, + const Callback& cb) { + if (!resp_st.IsOk()) { + st_ = resp_st; + } else { + if ((*server_results).size() != combiner.size()) { + st_ = Status::ArgumentError("Combiner Size Error"); } else { - if ((*server_results).size() != combiner.size()) { - st_ = Status::ArgumentError("Combiner Size Error"); - } else { - for (size_t i = 0; i < combiner.size(); ++i) { - Status st = combiner[i]->Combine(ctx, (*server_results)[i], server_id, &(*results)[i]); - if (!st.IsOk()) { - st_ = st; - } + for (size_t i = 0; i < combiner.size(); ++i) { + Status st = combiner[i]->Combine(ctx, (*server_results)[i], server_id, &(*results)[i]); + if (!st.IsOk()) { + st_ = st; } } } - delete server_results; - count_--; - if (count_ == 0) { - run_done = true; - } } - if (run_done == true) { + delete server_results; + if (--count_ == 0) { cb(st_); delete this; } @@ -65,14 +57,13 @@ class ProcessContext { std::vector* server_results, std::vector>* results, size_t server_id, - Callback cb) { + const Callback& cb) { return [combiner, ctx, server_results, results, server_id, cb, this](Status resp_st){ this->Collect(combiner, ctx, server_results, results, server_id, resp_st, cb); }; } private: - int count_; - std::mutex mu_; + std::atomic count_; Status st_; }; diff --git a/xdl/ps-plus/ps-plus/client/raw_client.cc b/xdl/ps-plus/ps-plus/client/raw_client.cc index b4162ca6..f3020a92 100644 --- a/xdl/ps-plus/ps-plus/client/raw_client.cc +++ b/xdl/ps-plus/ps-plus/client/raw_client.cc @@ -15,12 +15,14 @@ limitations under the License. #include "ps-plus/client/raw_client.h" #include "ps-plus/client/process_context.h" +#include "ps-plus/client/merged_process_context.h" #include "ps-plus/client/model_server_splitter.h" +#include "ps-plus/common/logging.h" + #include #include #include -#include #define RETURN_ASYNC(STATUS) do { cb(STATUS); return; } while (0) @@ -48,6 +50,81 @@ Status RawClient::Init() { return client_wrapper_->ConnectToCluster(args_.scheduler_addr); } +void RawClient::Process( + const UdfChain& udf, + const std::vector& var_names, + const std::vector& datas, + const std::vector& splitter, + const std::vector& combiner, + std::vector>>* results, + const Callback& cb_internal) { + + MergedPartitionerContext* ctx = new MergedPartitionerContext; + Callback cb = [this, ctx, splitter, combiner, datas, cb_internal](Status s){ + cb_internal(s); + delete ctx; + for (auto item : splitter) { + delete item; + } + for (auto item : combiner) { + delete item; + } + for (auto item : datas) { + delete item; + } + }; + for (size_t i = 0; i < var_names.size(); ++i) { + PartitionerContext* one_ctx = new PartitionerContext; + VariableInfo info; + CHECK_ASYNC(GetVariableInfo(var_names[i], &info)); + one_ctx->SetVariableInfo(info); + ctx->AddContext(one_ctx); + } + const std::vector& server_to_send = ctx->GetContext(0)->GetVariableInfo()->parts; + size_t servers = server_to_send.size(); + + if (splitter.size() != datas.size()) { + RETURN_ASYNC(Status::ArgumentError("Splitter has the wrong size.")); + } + + std::vector> split_results; + for (size_t i = 0; i < datas.size(); ++i) { + CHECK_ASYNC(splitter[i]->Init(ctx, datas[i])); + } + for (size_t i = 0; i < datas.size(); ++i) { + split_results.emplace_back(); + CHECK_ASYNC(splitter[i]->Split(ctx, datas[i], &split_results.back())); + } + + std::vector> request(servers); + for (size_t i = 0; i < split_results.size(); ++i) { + if (split_results[i].size() != servers) { + RETURN_ASYNC(Status::ArgumentError("Splitter result size error")); + } + for (size_t j = 0; j < split_results[i].size(); ++j) { + request[j].push_back(split_results[i][j]); + } + } + + MergedProcessContext* pctx = new MergedProcessContext(servers); + (*results).clear(); + (*results).resize(combiner.size()); + for (auto& result_vec : (*results)) { + result_vec.resize(var_names.size()); + } + + for (size_t i = 0; i < combiner.size(); ++i) { + combiner[i]->CombineInit(ctx, &(*results)[i]); + } + + for (size_t i = 0; i < servers; ++i) { + size_t server_id = server_to_send[i].server; + std::vector* server_results = new std::vector(); + Process("^hash_variable", server_id, udf, request[i], server_results, + pctx->CollectResults(combiner, ctx, server_results, results, i, cb)); + } +} + void RawClient::Process( const UdfChain& udf, const std::string& var_name, @@ -106,6 +183,10 @@ void RawClient::Process( (*results).clear(); (*results).resize(combiner.size()); + for (size_t i = 0; i < combiner.size(); ++i) { + combiner[i]->CombineInit(ctx, &(*results)[i]); + } + for (size_t i = 0; i < servers; ++i) { size_t server_id = server_to_send[i].server; std::vector* server_results = new std::vector(); @@ -201,16 +282,16 @@ void RawClient::ModelServerBackward(int type, const Tensor& ids, const Tensor& g } } -void RawClient::TriggerStreamingModelDense(const Callback& cb) { - client_wrapper_->TriggerStreamingModelDense(cb); +void RawClient::TriggerStreamingModelDense(const std::string& stream_ver, const Callback& cb) { + client_wrapper_->TriggerStreamingModelDense(stream_ver, cb); } -void RawClient::TriggerStreamingModelSparse(const Callback& cb) { - client_wrapper_->TriggerStreamingModelSparse(cb); +void RawClient::TriggerStreamingModelSparse(const std::string& stream_ver, const Callback& cb) { + client_wrapper_->TriggerStreamingModelSparse(stream_ver, cb); } -void RawClient::TriggerStreamingModelHash(const Callback& cb) { - client_wrapper_->TriggerStreamingModelHash(cb); +void RawClient::TriggerStreamingModelHash(const std::string& stream_ver, const Callback& cb) { + client_wrapper_->TriggerStreamingModelHash(stream_ver, cb); } void RawClient::AsynchronizeEnter(int id, int staleness, int worker_count, const Callback& cb) { @@ -229,10 +310,19 @@ void RawClient::WorkerReportFinish(int id, const Callback& cb) { client_wrapper_->WorkerReportFinish(id, cb); } +void RawClient::GetWorkerFinishCount(int64_t* count, const Callback& cb) { + client_wrapper_->GetWorkerFinishCount(count, cb); +} + void RawClient::WorkerBarrier(int id, int worker_count, const Callback& cb) { client_wrapper_->WorkerBarrier(id, worker_count, cb); } + +void RawClient::WorkerBarrierV2(int barrier_id, int task_id, int task_num, int token, const Callback& cb) { + client_wrapper_->WorkerBarrierV2(barrier_id, task_id, task_num, token, cb); +} + void RawClient::Process(const std::string& var_name, size_t server_id, const UdfChain& udf, const std::vector& input, std::vector* output, const Callback& cb) { client_wrapper_->Process(var_name, server_id, udf.hash(), input, output, [var_name, server_id, udf, input, output, cb, this](Status st) { if (st.Code() == Status::kUdfNotRegistered) { diff --git a/xdl/ps-plus/ps-plus/client/raw_client.h b/xdl/ps-plus/ps-plus/client/raw_client.h index d45e66b0..9170a14d 100644 --- a/xdl/ps-plus/ps-plus/client/raw_client.h +++ b/xdl/ps-plus/ps-plus/client/raw_client.h @@ -52,7 +52,16 @@ class RawClient { const std::vector& datas, const std::vector& splitter, const std::vector& combiner, - std::vector>* results, + std::vector >* results, + const Callback& cb); + + void Process( + const UdfChain& udf, + const std::vector& var_names, + const std::vector& datas, + const std::vector& splitter, + const std::vector& combiner, + std::vector > >* results, const Callback& cb); void ModelServerForward(int type, const Tensor& ids, Tensor* rst, const Callback& cb); @@ -62,19 +71,55 @@ class RawClient { void Save(const std::string& name, const Callback& cb); void Restore(const std::string& name, const Callback& cb); - void TriggerStreamingModelDense(const Callback& cb); - void TriggerStreamingModelSparse(const Callback& cb); - void TriggerStreamingModelHash(const Callback& cb); + void TriggerStreamingModelDense(const std::string& stream_ver, const Callback& cb); + void TriggerStreamingModelSparse(const std::string& stream_ver, const Callback& cb); + void TriggerStreamingModelHash(const std::string& stream_ver, const Callback& cb); + + Status InitGlobalQueue( + const std::string& name, + const std::vector& paths, + size_t epochs, + bool epoch_isolate = false) { + return client_wrapper_->InitGlobalQueue( + name, paths, epochs, epoch_isolate); + } + + Status GetNextFile( + const std::string& name, + size_t worker_id, + std::string* path, + size_t* begin, + size_t* epoch) { + return client_wrapper_->GetNextFile( + name, worker_id, path, begin, epoch); + } + + Status ReportWorkerState( + const std::string& name, + size_t worker_id, + const std::vector& worker_states) { + return client_wrapper_->ReportWorkerState( + name, worker_id, worker_states); + } + + Status RestoreWorkerState( + const std::string& name, + size_t worker_id) { + return client_wrapper_->RestoreWorkerState( + name, worker_id); + } void AsynchronizeEnter(int id, int staleness, int worker_count, const Callback& cb); void SynchronizeEnter(int id, int worker_count, int64_t* token, const Callback& cb); void SynchronizeLeave(int id, int64_t token, const Callback& cb); - void WorkerReportFinish(int id, const Callback& cb); + void WorkerReportFinish(int id, const Callback& cb); + void GetWorkerFinishCount(int64_t* count, const Callback& cb); void WorkerBarrier(int id, int worker_count, const Callback& cb); + void WorkerBarrierV2(int barrier_id, int task_id, int task_num, int token, const Callback& cb); Status UpdateVariableVisitInfo(const std::string& name, int64_t id_num); + Status GetVariableInfo(const std::string& name, VariableInfo* info); private: - Status GetVariableInfo(const std::string& name, VariableInfo* info); void Process(const std::string& var_name, size_t server_id, const UdfChain& udf, const std::vector& input, std::vector* output, const Callback& cb); ClientArgs args_; diff --git a/xdl/ps-plus/ps-plus/client/test/client_test.cc b/xdl/ps-plus/ps-plus/client/test/client_test.cc index c3390cc7..4de7989f 100644 --- a/xdl/ps-plus/ps-plus/client/test/client_test.cc +++ b/xdl/ps-plus/ps-plus/client/test/client_test.cc @@ -21,6 +21,7 @@ limitations under the License. #include "ps-plus/common/initializer.h" #include "ps-plus/common/initializer/constant_initializer.h" #include "ps-plus/common/initializer/none_initializer.h" +#include "ps-plus/message/worker_state.h" #include using ps::Data; @@ -37,6 +38,7 @@ using ps::client::PartitionerContext; using ps::client::UdfData; using ps::client::UdfChain; using ps::VariableInfo; +using ps::WorkerState; using ps::initializer::ConstantInitializer; using ps::initializer::NoneInitializer; @@ -159,15 +161,42 @@ class MockClientWrapper : public ClientWrapper { ReturnAsync(Status::Ok(), cb); return; }; - void TriggerStreamingModelDense(const Callback& cb) { + void TriggerStreamingModelDense(const std::string& stream_ver, const Callback& cb) { ReturnAsync(Status::Ok(), cb); return; - }; - void TriggerStreamingModelSparse(const Callback& cb) { + } + + Status InitGlobalQueue( + const std::string& name, + const std::vector& paths, + size_t epochs, + bool epoch_isolate = false) { + return Status::Ok(); + } + Status GetNextFile( + const std::string& name, + size_t worker_id, + std::string* path, + size_t* begin, + size_t* epoch) { + return Status::Ok(); + } + Status ReportWorkerState( + const std::string& name, + size_t worker_id, + const std::vector& worker_states) { + return Status::Ok(); + } + Status RestoreWorkerState( + const std::string& name, + size_t worker_id) { + return Status::Ok(); + } + void TriggerStreamingModelSparse(const std::string& stream_ver, const Callback& cb) { ReturnAsync(Status::Ok(), cb); return; }; - void TriggerStreamingModelHash(const Callback& cb) { + void TriggerStreamingModelHash(const std::string& stream_ver, const Callback& cb) { ReturnAsync(Status::Ok(), cb); return; }; @@ -187,10 +216,19 @@ class MockClientWrapper : public ClientWrapper { ReturnAsync(Status::Ok(), cb); return; } + void GetWorkerFinishCount(int64_t* count, const Callback& cb) { + *count = 0; + ReturnAsync(Status::Ok(), cb); + return; + } void WorkerBarrier(int id, int worker_count, const Callback& cb) { ReturnAsync(Status::Ok(), cb); return; } + void WorkerBarrierV2(int barrier_id, int task_id, int task_num, int token, const Callback& cb) { + ReturnAsync(Status::Ok(), cb); + return; + } virtual void ModelServerForward(int server_type, int server_id, const Tensor& ids, std::unique_ptr* rst, const Callback& cb) {} virtual void ModelServerBackward(int server_type, int server_id, const Tensor& ids, const Tensor& grads, const Callback& cb) {} virtual int ServerSize(int id) { return 0; } @@ -215,6 +253,7 @@ class MockPartitioner : public Partitioner { return Status::Ok(); } Status Combine(PartitionerContext* ctx, Data* src, size_t id, std::unique_ptr* dst) { + std::lock_guard lock(mu_); MockData data = dynamic_cast*>(src)->Internal(); if ((*dst) == nullptr) { int dim = data.GetDim(); @@ -228,6 +267,7 @@ class MockPartitioner : public Partitioner { } return Status::Ok(); } + std::mutex mu_; }; void MockArgument(std::vector& remote_info, @@ -532,22 +572,23 @@ TEST(ClientTest, OtherTest) { st = st_promise1.get_future().get(); EXPECT_EQ(Status::Ok(), st); + std::string ver("inc-test99"); std::promise st_promise2; - client->TriggerStreamingModelDense([&st_promise2](Status st){ + client->TriggerStreamingModelDense(ver, [&st_promise2](Status st){ st_promise2.set_value(st); }); st = st_promise2.get_future().get(); EXPECT_EQ(Status::Ok(), st); std::promise st_promise3; - client->TriggerStreamingModelSparse([&st_promise3](Status st){ + client->TriggerStreamingModelSparse(ver, [&st_promise3](Status st){ st_promise3.set_value(st); }); st = st_promise3.get_future().get(); EXPECT_EQ(Status::Ok(), st); std::promise st_promise4; - client->TriggerStreamingModelHash([&st_promise4](Status st){ + client->TriggerStreamingModelHash(ver, [&st_promise4](Status st){ st_promise4.set_value(st); }); st = st_promise4.get_future().get(); @@ -665,7 +706,7 @@ TEST(ClientTest, OtherRemoteTest) { EXPECT_EQ(Status::kArgumentError, st.Code()); std::promise st_promise9; - client->HashPull("var4", id, 0.02, &tensor, [&st_promise9](Status st){ + client->HashPull("var4", id, 1.0, &tensor, [&st_promise9](Status st){ st_promise9.set_value(st); }); st = st_promise9.get_future().get(); @@ -673,7 +714,7 @@ TEST(ClientTest, OtherRemoteTest) { std::vector datas2; std::promise st_promise10; - client->HashPush("var4", id, "update", datas2, [&st_promise10](Status st){ + client->HashPush("var4", id, 0.0, false, "update", datas2, [&st_promise10](Status st){ st_promise10.set_value(st); }); st = st_promise10.get_future().get(); @@ -713,22 +754,23 @@ TEST(LocalClientTest, LocalTest) { st = st_promise3.get_future().get(); EXPECT_NE(Status::Ok(), st); + std::string ver("inc-test99"); std::promise st_promise4; - client->TriggerStreamingModelDense([&st_promise4](Status st) { + client->TriggerStreamingModelDense(ver, [&st_promise4](Status st) { st_promise4.set_value(st); }); st = st_promise4.get_future().get(); EXPECT_EQ(Status::Ok(), st); std::promise st_promise5; - client->TriggerStreamingModelSparse([&st_promise5](Status st) { + client->TriggerStreamingModelSparse(ver, [&st_promise5](Status st) { st_promise5.set_value(st); }); st = st_promise5.get_future().get(); EXPECT_EQ(Status::Ok(), st); std::promise st_promise6; - client->TriggerStreamingModelHash([&st_promise6](Status st) { + client->TriggerStreamingModelHash(ver, [&st_promise6](Status st) { st_promise6.set_value(st); }); st = st_promise6.get_future().get(); @@ -769,7 +811,7 @@ TEST(LocalClientTest, LocalTest) { Tensor ids1; std::promise st_promise12; - client->HashPull("hello", ids1, 0.1, &ids1, [&st_promise12](Status st) { + client->HashPull("hello", ids1, 1.0, &ids1, [&st_promise12](Status st) { st_promise12.set_value(st); }); st = st_promise12.get_future().get(); @@ -778,7 +820,7 @@ TEST(LocalClientTest, LocalTest) { Tensor ids2; std::promise st_promise13; - client->HashPull("hello", ids2, 0.1, &ids2, [&st_promise13](Status st) { + client->HashPull("hello", ids2, 1.0, &ids2, [&st_promise13](Status st) { st_promise13.set_value(st); }); st = st_promise13.get_future().get(); diff --git a/xdl/ps-plus/ps-plus/client/test/model_server_splitter_test.cc b/xdl/ps-plus/ps-plus/client/test/model_server_splitter_test.cc index 04c8b009..466a0072 100644 --- a/xdl/ps-plus/ps-plus/client/test/model_server_splitter_test.cc +++ b/xdl/ps-plus/ps-plus/client/test/model_server_splitter_test.cc @@ -30,23 +30,23 @@ TEST(ModelServerSplitterTest, ModelServerSplitter) { EXPECT_NE(mss, nullptr); { - Tensor tensor(DataType::kInt16, TensorShape({32, 1024}), new ConstantInitializer(0), true); + Tensor tensor(DataType::kInt16, TensorShape({32, 1024}), new ConstantInitializer(0)); Status st = mss->Init(1, tensor); EXPECT_NE(st, Status::Ok()); } { - Tensor tensor(DataType::kInt16, TensorShape({1024}), new ConstantInitializer(0), true); + Tensor tensor(DataType::kInt16, TensorShape({1024}), new ConstantInitializer(0)); Status st = mss->Init(1, tensor); EXPECT_NE(st, Status::Ok()); } { - Tensor tensor(DataType::kInt64, TensorShape({1024}), new ConstantInitializer(0), true); + Tensor tensor(DataType::kInt64, TensorShape({1024}), new ConstantInitializer(0)); Status st = mss->Init(2, tensor); EXPECT_EQ(st, Status::Ok()); - Tensor tensor2(DataType::kInt64, TensorShape({1024, 512}), new ConstantInitializer(0), true); + Tensor tensor2(DataType::kInt64, TensorShape({1024, 512}), new ConstantInitializer(0)); std::vector vec; st = mss->Split(tensor2, &vec); EXPECT_EQ(st, Status::Ok()); @@ -54,12 +54,12 @@ TEST(ModelServerSplitterTest, ModelServerSplitter) { } { - Tensor tensor(DataType::kInt64, TensorShape({1024}), new ConstantInitializer(0), true); + Tensor tensor(DataType::kInt64, TensorShape({1024}), new ConstantInitializer(0)); Status st = mss->Init(2, tensor); EXPECT_EQ(st, Status::Ok()); - Tensor tensor2(DataType::kInt64, TensorShape({1024, 512}), new ConstantInitializer(0), true); - Tensor rst(DataType::kInt64, TensorShape({1024, 512}), new ConstantInitializer(0), false);; + Tensor tensor2(DataType::kInt64, TensorShape({1024, 512}), new ConstantInitializer(0)); + Tensor rst(DataType::kInt64, TensorShape({1024, 512}), new ConstantInitializer(0), Tensor::TType::kSegment, false);; st = mss->Combine(0, tensor2, &rst); EXPECT_EQ(st, Status::Ok()); } diff --git a/xdl/ps-plus/ps-plus/common/bloom_filter.cpp b/xdl/ps-plus/ps-plus/common/bloom_filter.cpp new file mode 100644 index 00000000..23ca18f1 --- /dev/null +++ b/xdl/ps-plus/ps-plus/common/bloom_filter.cpp @@ -0,0 +1,115 @@ +/* Copyright (C) 2016-2018 Alibaba Group Holding Limited + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "bloom_filter.h" + +#include +#include +#include +#include + +#include "murmurhash.h" +#include "ps-plus/common/logging.h" + +namespace ps { + +template +CountingBloomFilter::CountingBloomFilter(double fpp, + uint64_t element_size) + : false_positive_probability_(fpp), + element_size_(element_size) { + bucket_size_ = static_cast(std::ceil( + std::abs(std::log(fpp) / std::pow(std::log(2.0), 2)) * element_size)); + hash_function_number_ = static_cast(std::ceil( + std::abs(std::log2(fpp)))); + std::set seeds; + std::random_device rd; + std::mt19937 gen(rd()); + std::uniform_int_distribution dist(0, std::numeric_limits::max()); + while (seeds.size() != hash_function_number_) { + seeds.insert(dist(gen)); + } + for (const auto& seed : seeds) { + hash_functions_.push_back(MurmurHash(seed)); + } + buf_.resize(bucket_size_, CType{}); + LOG(INFO) << "optimal bloom filter parameters: false_positive_probability=" << false_positive_probability_ \ + << " element_size=" << element_size_ << ", bucket_size=" << bucket_size_ << " hash_function_number=" << hash_function_number_; +} + +template +void CountingBloomFilter::Insert(const void* key, int len) { + if (key == nullptr) return; + uint64_t mur_res[2]; + for (auto&& fn : hash_functions_) { + fn(key, len, mur_res); + uint64_t index = mur_res[1] % bucket_size_; + if (buf_[index] != std::numeric_limits::max()) { + buf_[index] += 1; + } + } +} + +template +bool CountingBloomFilter::Exists(const void* key, int len, + uint32_t max_count) const { + if (max_count == 0) return true; + if (key == nullptr) return false; + uint64_t mur_res[2]; + for (auto&& fn : hash_functions_) { + fn(key, len, mur_res); + uint64_t index = mur_res[1] % bucket_size_; + if (buf_[index] < max_count) return false; + } + return true; +} + +template +bool CountingBloomFilter::InsertedLookup(const void* key, int len, + uint32_t max_count) { + Insert(key, len); + return Exists(key, len, max_count); +} + +BloomFilterBase* GlobalBloomFilter::Instance() { + if (filter == nullptr) { + lock.lock(); + if (filter == nullptr) { + if (max_threthold < 240) { + filter = new CountingBloomFilter(); + } else { + filter = new CountingBloomFilter(); + } + } + lock.unlock(); + } + return filter; +} + +void GlobalBloomFilter::SetThrethold(int32_t threthold) { + if (threthold > max_threthold) { + lock.lock(); + if (threthold > max_threthold) { + max_threthold = threthold; + } + lock.unlock(); + } +} + +BloomFilterBase* GlobalBloomFilter::filter = nullptr; +int32_t GlobalBloomFilter::max_threthold = 0; +std::mutex GlobalBloomFilter::lock; + +} // namespace ps diff --git a/xdl/ps-plus/ps-plus/common/bloom_filter.h b/xdl/ps-plus/ps-plus/common/bloom_filter.h new file mode 100644 index 00000000..fa1a311f --- /dev/null +++ b/xdl/ps-plus/ps-plus/common/bloom_filter.h @@ -0,0 +1,84 @@ +/* Copyright (C) 2016-2018 Alibaba Group Holding Limited + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef PS_PLUS_COMMON_BLOOM_FILTER_H_ +#define PS_PLUS_COMMON_BLOOM_FILTER_H_ + +#include +#include +#include +#include + +namespace ps { + +class BloomFilterBase { + public: + virtual void Insert(const void* key, int len) = 0; + virtual bool Exists(const void* key, int len, uint32_t max_count=1u) const = 0; + virtual bool InsertedLookup(const void* key, int len, uint32_t max_count=1u) = 0; +}; + +template +class CountingBloomFilter : public BloomFilterBase { + public: + using Hasher = std::function; + CountingBloomFilter(double fpp=0.01, uint64_t element_size=1000000000); + ~CountingBloomFilter() {} + virtual void Insert(const void* key, int len); + virtual bool Exists(const void* key, int len, uint32_t max_count=1u) const; + virtual bool InsertedLookup(const void* key, int len, uint32_t max_count=1u); + double false_positive_probability() const { + return false_positive_probability_; + } + uint64_t element_size() const { + return element_size_; + } + uint64_t bucket_size() const { + return bucket_size_; + } + uint32_t hash_function_number() const { + return hash_function_number_; + } + private: + CountingBloomFilter(const CountingBloomFilter&) = delete; + CountingBloomFilter& operator=(const CountingBloomFilter&) = delete; + + double false_positive_probability_; + uint64_t element_size_; + uint64_t bucket_size_; + uint32_t hash_function_number_; + std::vector hash_functions_; + + std::vector buf_; +}; + +class GlobalBloomFilter { + public: + static void SetThrethold(int32_t threthold); + static BloomFilterBase* Instance(); + private: + GlobalBloomFilter(const GlobalBloomFilter&) = delete; + GlobalBloomFilter& operator=(const GlobalBloomFilter&) = delete; + static int32_t max_threthold; + static BloomFilterBase* filter; + static std::mutex lock; +}; + +template class CountingBloomFilter; +template class CountingBloomFilter; + +} // namespace ps + +#endif // PS_PLUS_COMMON_BLOOM_FILTER_H_ diff --git a/xdl/ps-plus/ps-plus/common/file_system.cc b/xdl/ps-plus/ps-plus/common/file_system.cc index 7f93fe6a..676fdfe7 100644 --- a/xdl/ps-plus/ps-plus/common/file_system.cc +++ b/xdl/ps-plus/ps-plus/common/file_system.cc @@ -17,14 +17,35 @@ limitations under the License. namespace ps { -constexpr size_t FileSystem::MAX_READ_WRITE; +constexpr size_t FileSystem::BUFFER_SIZE; Status FileSystem::ReadStream::Read(void* buf, size_t size) { char* raw_buf = (char*)buf; size_t remain = size; + while (remain > 0) { + if (buffer_size_ == buffer_ptr_) { + PS_CHECK_STATUS(ReadBuffer()); + } + + int64_t read = std::min((int64_t)remain, (int64_t)(buffer_size_ - buffer_ptr_)); + memcpy(raw_buf, buffer_ + buffer_ptr_, read); + buffer_ptr_ += read; + remain -= read; + raw_buf += read; + } + return Status::Ok(); +} + +Status FileSystem::ReadStream::ReadBuffer() { + if (buffer_size_ >= 0 && buffer_size_ < BUFFER_SIZE) { + return Status::DataLoss("File exhausted"); + } + char* raw_buf = buffer_; + size_t remain = BUFFER_SIZE; size_t last = 0; + int64_t read = 0; while (remain > 0) { - int64_t read = ReadSimple(raw_buf, std::min(remain, MAX_READ_WRITE)); + int64_t read = ReadSimple(raw_buf, remain); if (read < 0 || (last == 0 && read == 0)) { break; } @@ -32,9 +53,26 @@ Status FileSystem::ReadStream::Read(void* buf, size_t size) { raw_buf += read; last = read; } - if (remain > 0) { - return Status::DataLoss("File exhausted"); + if (read < 0) { + return Status::DataLoss("File Read Error"); } + buffer_size_ = raw_buf - buffer_; + buffer_ptr_ = 0; + return Status::Ok(); +} + +Status FileSystem::ReadStream::Eof(bool* eof) { + if (buffer_size_ == buffer_ptr_) { + if (buffer_size_ >= 0 && buffer_size_ < BUFFER_SIZE) { + *eof = true; + return Status::Ok(); + } else { + PS_CHECK_STATUS(ReadBuffer()); + *eof = buffer_size_ == 0; + return Status::Ok(); + } + } + *eof = false; return Status::Ok(); } @@ -50,7 +88,7 @@ Status FileSystem::WriteStream::Write(const void* buf, size_t size) { size_t remain = size; size_t last = 0; while (remain > 0) { - int64_t write = WriteSimple(raw_buf, std::min(remain, MAX_READ_WRITE)); + int64_t write = WriteSimple(raw_buf, std::min(remain, BUFFER_SIZE)); if (write < 0 || (last == 0 && write == 0)) { break; } @@ -147,5 +185,18 @@ Status FileSystem::WriteStream::WriteStr(const std::string& data) { return Write((&data[0]), sizeof(char) * size); } +Status FileSystem::ReadStream::ReadShortStr(std::string* data) { + int size; + PS_CHECK_STATUS(ReadRaw(&size)); + data->resize(size); + return Read((&(*data)[0]), sizeof(char) * size); +} + +Status FileSystem::WriteStream::WriteShortStr(const std::string& data) { + int size = data.size(); + PS_CHECK_STATUS(WriteRaw(size)); + return Write((&data[0]), sizeof(char) * size); +} + } diff --git a/xdl/ps-plus/ps-plus/common/file_system.h b/xdl/ps-plus/ps-plus/common/file_system.h index 748dd1cf..ce59707f 100644 --- a/xdl/ps-plus/ps-plus/common/file_system.h +++ b/xdl/ps-plus/ps-plus/common/file_system.h @@ -18,6 +18,7 @@ limitations under the License. #include "ps-plus/common/status.h" #include "ps-plus/common/plugin.h" +#include "tbb/concurrent_vector.h" #include #include @@ -25,24 +26,34 @@ limitations under the License. namespace ps { class FileSystem { + private: + static constexpr size_t BUFFER_SIZE = 1048576; public: class ReadStream { public: - ReadStream() : close_(false) {} + ReadStream() : close_(false), buffer_ptr_(-1), buffer_size_(-1) {} virtual ~ReadStream() {Close();} Status Read(void* buf, size_t size); + Status ReadBuffer(); virtual int64_t ReadSimple(void* buf, size_t size) = 0; void Close(); + Status Eof(bool* eof); template Status ReadRaw(T* data); template Status ReadVec(std::vector* data); + template + Status ReadTBBVec(tbb::concurrent_vector* data); Status ReadStr(std::string* data); + Status ReadShortStr(std::string* data); protected: virtual void CloseInternal() = 0; private: bool close_; + char buffer_[BUFFER_SIZE]; + int buffer_ptr_; + int buffer_size_; }; class WriteStream { @@ -50,6 +61,7 @@ class FileSystem { WriteStream() : close_(false) {} virtual ~WriteStream() {Close();} Status Write(const void* buf, size_t size); + Status WriteBuffer(); virtual int64_t WriteSimple(const void* buf, size_t size) = 0; virtual void Flush() = 0; void Close(); @@ -58,7 +70,10 @@ class FileSystem { Status WriteRaw(T data); template Status WriteVec(const std::vector& data); + template + Status WriteTBBVec(const tbb::concurrent_vector& data); Status WriteStr(const std::string& data); + Status WriteShortStr(const std::string& data); protected: virtual void CloseInternal() = 0; private: @@ -97,8 +112,6 @@ class FileSystem { static Status ListDirectoryAny(const std::string& dir, std::vector* files); static Status RemoveAny(const std::string& name); static Status RenameAny(const std::string& src_name, const std::string& dst_name); - private: - static constexpr size_t MAX_READ_WRITE = 1048576; }; template @@ -114,6 +127,17 @@ Status FileSystem::ReadStream::ReadVec(std::vector* data) { return Read((&(*data)[0]), sizeof(T) * size); } +template +Status FileSystem::ReadStream::ReadTBBVec(tbb::concurrent_vector* data) { + size_t size; + PS_CHECK_STATUS(ReadRaw(&size)); + data->resize(size); + for (size_t i = 0; i < data->size(); i++) { + PS_CHECK_STATUS(Read((&(*data)[i]), sizeof(T))); + } + return Status::Ok(); +} + template Status FileSystem::WriteStream::WriteRaw(T data) { return Write(&data, sizeof(T)); @@ -126,6 +150,15 @@ Status FileSystem::WriteStream::WriteVec(const std::vector& data) { return Write((&data[0]), sizeof(T) * size); } +template +Status FileSystem::WriteStream::WriteTBBVec(const tbb::concurrent_vector& data) { + size_t size = data.size(); + PS_CHECK_STATUS(WriteRaw(size)); + for (size_t i = 0; i < data.size(); i++) { + PS_CHECK_STATUS(Write((&data[i]), sizeof(T))); + } + return Status::Ok(); +} } #endif diff --git a/xdl/ps-plus/ps-plus/common/file_system/file_file_system.cc b/xdl/ps-plus/ps-plus/common/file_system/file_file_system.cc index a8baf5bf..045186ec 100644 --- a/xdl/ps-plus/ps-plus/common/file_system/file_file_system.cc +++ b/xdl/ps-plus/ps-plus/common/file_system/file_file_system.cc @@ -92,7 +92,9 @@ class FileFileSystem : public FileSystem { std::string current_dir = real_dir.substr(0, i); if(access(current_dir.c_str(), F_OK) != 0) { if(mkdir(current_dir.c_str(), 0755) != 0) { - return Status::Unknown("Mkdir Error " + current_dir); + if(access(current_dir.c_str(), F_OK) != 0) { + return Status::Unknown("Mkdir Error " + current_dir); + } } } } diff --git a/xdl/ps-plus/ps-plus/common/global_file_queue.cc b/xdl/ps-plus/ps-plus/common/global_file_queue.cc new file mode 100644 index 00000000..328befc5 --- /dev/null +++ b/xdl/ps-plus/ps-plus/common/global_file_queue.cc @@ -0,0 +1,232 @@ +/* Copyright (C) 2016-2018 Alibaba Group Holding Limited + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "global_file_queue.h" + +#include "ps-plus/common/logging.h" +#include "ps-plus/common/status.h" + +#include +#include + +using namespace std; +using namespace std::chrono; +using namespace ps; + +namespace ps { + +const int GlobalFileQueue::MAX_WORKER_COUNT = 10000; + +GlobalFileQueue::GlobalFileQueue() + : epochs_(1) + , cur_epoch_(0) + , cur_file_index_(0) + , epoch_isolate_(false) + , initialized_(false) { +} + +GlobalFileQueue::~GlobalFileQueue() { +} + +Status GlobalFileQueue::Init( + const std::vector& paths, + int epochs, + bool epoch_isolate) { + std::unique_lock lock(mu_); + if (!initialized_) { + epochs_ = epochs; + epoch_isolate_ = epoch_isolate; + files_ = paths; + used_files_.resize(MAX_WORKER_COUNT); + restored_files_.resize(MAX_WORKER_COUNT); + last_report_.resize(MAX_WORKER_COUNT); + for (size_t i = 0; i < files_.size(); ++i) { + file_index_[files_[i]] = i; + } + + initialized_ = true; + } + + return Status::Ok(); +} + +Status GlobalFileQueue::GetNextFile( + int worker_id , + WorkerState* file) { + std::unique_lock lock(mu_); + if (!initialized_) { + return Status::FileQueueNeedWait("not initialized"); + } + + std::deque& restored_files = restored_files_[worker_id]; + if (!restored_files.empty()) { + *file = restored_files.front(); + restored_files.pop_front(); + used_files_[worker_id].push_back( + FileInfo{.index_ = file_index_[file->path_], + .epoch_ = file->epoch_}); + } else { + if (cur_file_index_ >= files_.size()) { + if (cur_epoch_ + 1 == epochs_) { + file->path_ = ""; + return Status::Ok(); + } + + if (epoch_isolate_ && !IsAllWorkerFinishCurEpoch()) { + return Status::FileQueueNeedWait("not all worker finish current epoch"); + } + + ++cur_epoch_; + cur_file_index_ = 0; + } + + file->path_ = files_[cur_file_index_]; + file->begin_ = 0; + file->end_ = 0; + file->epoch_ = cur_epoch_; + used_files_[worker_id].push_back( + FileInfo{.index_ = cur_file_index_, + .epoch_ = cur_epoch_}); + ++cur_file_index_; + } + + return Status::Ok(); +} + +bool GlobalFileQueue::IsAllWorkerFinishCurEpoch() { + return true; +} + +Status GlobalFileQueue::ReportWorkerState( + int worker_id, + const std::vector& worker_states) { + if (worker_id >= MAX_WORKER_COUNT) { + return Status::ArgumentError("worker_id exceed MAX_WORKER_COUNT:10000"); + } + + std::unique_lock lock(mu_); + last_report_[worker_id] = worker_states; + return Status::Ok(); +} + +Status GlobalFileQueue::RestoreWorkerState( + int worker_id) { + std::set > last_report; + for (auto& worker_state: last_report_[worker_id]) { + last_report.insert({file_index_[worker_state.path_], + worker_state.epoch_}); + } + + std::unique_lock lock(mu_); + std::deque& restored_files = + restored_files_[worker_id]; + restored_files.clear(); + restored_files.insert( + restored_files.end(), + last_report_[worker_id].begin(), + last_report_[worker_id].end()); + for (auto it = used_files_[worker_id].rbegin(); + it != used_files_[worker_id].rend(); + ++it) { + if (last_report.find({it->index_, it->epoch_}) == + last_report.end()) { + WorkerState ws; + ws.path_ = files_[it->index_]; + ws.begin_ = 0; + ws.end_ = 0; + ws.epoch_ = it->epoch_; + restored_files.push_back(ws); + } else { + break; + } + } + + used_files_[worker_id].clear(); + return Status::Ok(); +} + +Status GlobalFileQueue::Serialize(std::string* buf) { + unique_lock lock(mu_); + buf->append((char*)&cur_epoch_, sizeof(size_t)); + buf->append((char*)&cur_file_index_, sizeof(size_t)); + SerializeFileInfos(used_files_, buf); + SerializeWorkerStates >( + last_report_, buf); + SerializeWorkerStates >( + restored_files_, buf); + return Status::Ok(); +} + +void GlobalFileQueue::SerializeFileInfos( + const std::vector >& file_infos, + std::string* buf) { + size_t len = file_infos.size(); + buf->append((char*)&len, sizeof(size_t)); + for (size_t i = 0; i < len; ++i) { + auto& it = file_infos[i]; + size_t sub_len = it.size(); + buf->append((char*)&sub_len, sizeof(size_t)); + for (size_t j = 0; j < sub_len; ++j) { + auto& sub_it = it[j]; + buf->append((char*)&sub_it.index_, sizeof(size_t)); + buf->append((char*)&sub_it.epoch_, sizeof(size_t)); + } + } +} + +Status GlobalFileQueue::Deserialize(const std::string& buf) { + unique_lock lock(mu_); + char* ptr = const_cast(buf.data()); + cur_epoch_ = *(reinterpret_cast(ptr)); + ptr += sizeof(size_t); + cur_file_index_ = *(reinterpret_cast(ptr)); + ptr += sizeof(size_t); + ptr += DeserializeFileInfos(ptr, &used_files_); + ptr += DeserializeWorkerStates >( + ptr, &last_report_); + ptr += DeserializeWorkerStates >( + ptr, &restored_files_); + if (ptr - buf.data() == buf.size()) { + return Status::Ok(); + } + + return Status::DataLoss("global_file_queue deserialize error"); +} + +size_t GlobalFileQueue::DeserializeFileInfos( + char* base, + std::vector >* file_infos) { + file_infos->clear(); + char* ptr = base; + size_t len = *(reinterpret_cast(ptr)); + ptr += sizeof(size_t); + for (size_t i = 0; i < len; ++i) { + file_infos->emplace_back(); + size_t sub_len = *(reinterpret_cast(ptr)); + ptr += sizeof(size_t); + for (size_t j = 0; j < sub_len; ++j) { + FileInfo file_info; + file_info.index_ = *(reinterpret_cast(ptr)); + ptr += sizeof(size_t); + file_info.epoch_ = *(reinterpret_cast(ptr)); + ptr += sizeof(size_t); + (*file_infos)[i].push_back(file_info); + } + } + + return ptr - base; +} + +} // namespace ps diff --git a/xdl/ps-plus/ps-plus/common/global_file_queue.h b/xdl/ps-plus/ps-plus/common/global_file_queue.h new file mode 100644 index 00000000..f7e5880d --- /dev/null +++ b/xdl/ps-plus/ps-plus/common/global_file_queue.h @@ -0,0 +1,146 @@ +/* Copyright (C) 2016-2018 Alibaba Group Holding Limited + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef PS_SCHEDULER_GLOBAL_FILE_QUEUE_H_ +#define PS_SCHEDULER_GLOBAL_FILE_QUEUE_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "ps-plus/common/status.h" +#include "ps-plus/message/worker_state.h" + +namespace ps { + +class GlobalFileQueue { +public: + GlobalFileQueue(); + ~GlobalFileQueue(); + Status Init(const std::vector& paths, + int epochs = 1, + bool epoch_isolate = false); + Status GetNextFile(int worker_id, WorkerState* file); + Status ReportWorkerState( + int worker_id, + const std::vector& worker_states); + Status RestoreWorkerState(int worker_id); + Status Serialize(std::string* buf); + Status Deserialize(const std::string& buf); + bool IsInitialized() const { + std::unique_lock lock(mu_); + return initialized_; + } + + private: + bool IsAllWorkerFinishCurEpoch(); + struct FileInfo { + size_t index_; + size_t epoch_; + }; + + void SerializeFileInfos( + const std::vector >& file_infos, + std::string* buf); + template + void SerializeWorkerStates( + const std::vector& worker_states, + std::string* buf); + size_t DeserializeFileInfos( + char* buf, + std::vector >* file_infos); + template + size_t DeserializeWorkerStates( + char* buf, + std::vector* file_infos); + + private: + static const int MAX_WORKER_COUNT; + mutable std::mutex mu_; + std::vector files_; + std::unordered_map file_index_; + int epochs_; + size_t cur_epoch_; + size_t cur_file_index_; + bool epoch_isolate_; + bool initialized_; + std::vector > used_files_; + std::vector > last_report_; + std::vector > restored_files_; +}; + +template +void GlobalFileQueue::SerializeWorkerStates( + const std::vector& worker_states, + std::string* buf) { + size_t len = worker_states.size(); + buf->append((char*)&len, sizeof(size_t)); + for (size_t i = 0; i < len; ++i) { + auto& it = worker_states[i]; + size_t sub_len = it.size(); + buf->append((char*)&sub_len, sizeof(size_t)); + for (auto& sub_it: it) { + buf->append((char*)&sub_it.begin_, sizeof(size_t)); + buf->append((char*)&sub_it.end_, sizeof(size_t)); + buf->append((char*)&sub_it.epoch_, sizeof(size_t)); + size_t path_len = sub_it.path_.size(); + buf->append((char*)&path_len, sizeof(size_t)); + buf->append(sub_it.path_.data(), sub_it.path_.size()); + } + } +} + +template +size_t GlobalFileQueue::DeserializeWorkerStates( + char* base, + std::vector* worker_states) { + worker_states->clear(); + char* ptr = base; + size_t len = *(reinterpret_cast(ptr)); + ptr += sizeof(size_t); + for (size_t i = 0; i < len; ++i) { + worker_states->emplace_back(); + size_t sub_len = *(reinterpret_cast(ptr)); + ptr += sizeof(size_t); + for (size_t j = 0; j < sub_len; ++j) { + WorkerState worker_state; + worker_state.begin_ = *(reinterpret_cast(ptr)); + ptr += sizeof(size_t); + worker_state.end_ = *(reinterpret_cast(ptr)); + ptr += sizeof(size_t); + worker_state.epoch_ = *(reinterpret_cast(ptr)); + ptr += sizeof(size_t); + size_t path_len = *(reinterpret_cast(ptr)); + ptr += sizeof(size_t); + worker_state.path_.assign(ptr, path_len); + ptr += path_len; + (*worker_states)[i].push_back(worker_state); + } + } + + return ptr - base; +} + + +} // namespace ps + +#endif // PS_SCHEDULER_GLOBAL_FILE_QUEUE_H_ diff --git a/xdl/ps-plus/ps-plus/common/hasher.h b/xdl/ps-plus/ps-plus/common/hasher.h index 43500c11..a1857236 100644 --- a/xdl/ps-plus/ps-plus/common/hasher.h +++ b/xdl/ps-plus/ps-plus/common/hasher.h @@ -47,6 +47,10 @@ class Hasher { p = ((p ^ s) * kP) & 0xFFFF; return p; } + static uint32_t Hash64(int64_t x_) { + int p = x_ % kTargetRange; + return p >= 0 ? p : p + kTargetRange; + } private: static const int kP = 397; // Prime }; diff --git a/xdl/ps-plus/ps-plus/common/hashmap.cc b/xdl/ps-plus/ps-plus/common/hashmap.cc index 3bf2e5ce..2d808126 100644 --- a/xdl/ps-plus/ps-plus/common/hashmap.cc +++ b/xdl/ps-plus/ps-plus/common/hashmap.cc @@ -20,326 +20,25 @@ limitations under the License. namespace ps { -int64_t qmul(int64_t a, int64_t n, int64_t m) { - int64_t ans = 0; - while (n > 0) { - if(n % 2 == 1) ans = (ans + a) % m; - a = (a + a) % m; - n /= 2; - } - return ans; -} - -int64_t qpow(int64_t a, int64_t n, int64_t m) { - int64_t ans = 1; - while (n > 0) { - if(n % 2 == 1) ans = qmul(ans, a, m); - a = qmul(a, a, m); - n /= 2; - } - return ans; -} - -bool Miller_Rabbin(int64_t n, int64_t a) { - int64_t r = 0, s = n - 1, j; - if(n % a == 0) { - return false; - } - while(s % 2 == 1) { - s /= 2; - r++; - } - int64_t k = qpow(a, s, n); - if (k == 1) { - return true; - } - for (j = 0; j < r; j++, k = qmul(k, k, n)) { - if (k == n - 1) { - return true; - } - } - return false; -} - -bool IsPrime(int n) { - static const int tab[] = {2, 3, 5, 7}; - for(int i = 0;i < 4; i++) { - if(n == tab[i]) - return true; - if(!Miller_Rabbin(n, tab[i])) - return false; - } - return true; -} - -HashMap::HashMap(int64_t hint) : - counter_(0), - hint_(hint), - update_counter_(0), - max_cache_(MAX_CACHED), - current_ver_(0) { - int64_t actual_size = GetHashSize(hint); - for (int i = 0; i < VERSIONS; i++) { - nodes_vec_[i].resize(actual_size); - data_pool_vec_[i] = new MemBlockPool( - actual_size * 0.5); - } +HashMap::HashMap() : offset_(0), urd(0.0, 1.0), max_count_(0) { } HashMap::~HashMap() { - for (int i = 0; i < VERSIONS; i++) { - nodes_vec_[i].clear(); - if (data_pool_vec_[i]) { - delete data_pool_vec_[i]; - } - } -} - -int64_t HashMap::GetHashSize(int64_t hint, bool scale) { - int64_t x = hint; - if (scale) { - x = hint * 2 + 1; - } else { - if ((x & 1) == 0) { - x += 1; - } - } - while (!IsPrime(x)) {x += 2;} - return x; -} - -int HashMap::ExpandSpace(int ver) { - int64_t new_size = GetHashSize(nodes_vec_[ver].size() * 2); - HashNode tmp_nodes(new_size); - int pool_size = data_pool_vec_[ver]->Size(); - MemBlockPool* new_data_pool = - new MemBlockPool(pool_size * 2); - // swap the space between origin space and new one - tmp_nodes.swap(nodes_vec_[ver]); - int64_t tmp_size = tmp_nodes.size(); - MemBlockPool* tmp_data_pool = data_pool_vec_[ver]; - data_pool_vec_[ver] = new_data_pool; - - // do rehash - bool id_reused; - std::cerr<<"ExpandSpace, old_size: "<Array(); - if (nullptr == item_array) { - return -1; - } - for (int i = 0; i < ITEM_SIZE; ++i) { - if (item_array[i].id < 0) { - continue; - } - int64_t id = AddOne(ver, item_array[i].x, item_array[i].y, item_array[i].id, &id_reused); - if (INVALID_ID == id) { - return -1; - } - } - cur_block = cur_block->Next(); - } - } - - // release old space - tmp_nodes.clear(); - delete tmp_data_pool; - return 0; } -int HashMap::ReplayLogs(int ver) { - bool id_reused; - for (int i = 0; i < VERSIONS; i++) { - if (i != ver) { - for (const LogNode& node : logs_[i]) { - if (ADD_OP == node.type) { - if (INVALID_ID == AddOne(ver, node.x, node.y, node.id, &id_reused)) { - return -1; - } - } else if (DEL_OP == node.type) { - DelOne(ver, node.x, node.y, node.id); - } - } - } - } - return 0; +bool HashMap::FloatEqual(float v1, float v2) { + return (v1 <= (v2 + FLOAT_EPSILON)) && (v1 >= (v2 - FLOAT_EPSILON)); } - -void HashMap::ResetVer(int ver) { - logs_[(ver + 1) % VERSIONS].clear(); - current_ver_.store(ver); - update_counter_ = 0; - ver = (current_ver_.load() + 1) % VERSIONS; - rwlock_[ver].wrlock(); - ReplayLogs(ver); - rwlock_[ver].unlock(); -} - -int HashMap::Get(int64_t* keys, int64_t size, int64_t jump, - std::vector* ids, std::vector* reused_ids) { - return GetWithAddProbability(keys, size, jump, 1, ids, reused_ids); -} - -int HashMap::GetWithAddProbability(int64_t* keys, int64_t size, int64_t jump, double add_probability, - std::vector* ids, std::vector* reused_ids) { - int ver = current_ver_.load(); - ids->resize(size); - reused_ids->clear(); - int64_t insert_list = -1; - rwlock_[ver].rdlock(); - for (int64_t i = 0; i < size; i++) { - int64_t x = keys[i * jump]; - int64_t y = keys[i * jump + 1]; - int64_t rst = TryGetOne(ver, x, y); - if (INVALID_ID == rst) { - (*ids)[i] = insert_list; - insert_list = i; - } else { - (*ids)[i] = rst; - } - } - rwlock_[ver].unlock(); - if (insert_list != -1) { - write_lock_.lock(); - ver = (current_ver_.load() + 1) % VERSIONS; - rwlock_[ver].wrlock(); - bool id_reused; - while (insert_list != -1) { - int64_t x = keys[insert_list * jump]; - int64_t y = keys[insert_list * jump + 1]; - int64_t next = (*ids)[insert_list]; - //need to search this ver too to make sure x,y not in hash list - int64_t rst = TryGetOne(ver, x, y); - if (rst < 0) { - if (urd(dre) <= add_probability) { - int64_t new_id = AddOne(ver, x, y, -1, &id_reused); - if (new_id < 0) { - return -1; - } - (*ids)[insert_list] = new_id; - if (id_reused) { - reused_ids->push_back(new_id); - } - } else { - (*ids)[insert_list] = NOT_ADD_ID; - } - } else { - (*ids)[insert_list] = rst; - } - insert_list = next; - update_counter_++; - } - rwlock_[ver].unlock(); - if (update_counter_ > max_cache_) { - ResetVer(ver); - } - write_lock_.unlock(); - } - return 0; -} - -int HashMap::GetWithoutAdd(int64_t* keys, int64_t size, int64_t jump, std::vector* ids) { - write_lock_.lock(); - int ver = (current_ver_.load() + 1) % VERSIONS; - ResetVer(ver); - write_lock_.unlock(); - - ids->resize(size); - rwlock_[ver].rdlock(); - for (int64_t i = 0; i < size; i++) { - int64_t x = keys[i * jump]; - int64_t y = keys[i * jump + 1]; - int64_t rst = TryGetOne(ver, x, y); - if (INVALID_ID == rst) { - (*ids)[i] = -1; - } else { - (*ids)[i] = rst; - } - } - rwlock_[ver].unlock(); - return 0; -} - -int HashMap::Del(int64_t* keys, int64_t size, int64_t jump) { - write_lock_.lock(); - int ver = (current_ver_.load() + 1) % VERSIONS; - rwlock_[ver].wrlock(); - for (int64_t i = 0; i < size; i++) { - int64_t x = keys[i * jump]; - int64_t y = keys[i * jump + 1]; - DelOne(ver, x, y); - update_counter_++; - } - rwlock_[ver].unlock(); - if (update_counter_ > max_cache_) { - ResetVer(ver); - } - write_lock_.unlock(); - return 0; -} - -int HashMap::GetHashKeys(HashMap::HashMapStruct* data) { - write_lock_.lock(); - int ver = (current_ver_.load() + 1) % VERSIONS; - ResetVer(ver); - data->counter = counter_; - write_lock_.unlock(); - - ver = current_ver_.load(); - rwlock_[ver].rdlock(); - for (auto&& item : nodes_vec_[ver]) { - for (auto iter = & item; iter != nullptr; iter = iter->Next()) { - auto items = iter->Array(); - for (size_t i = 0; i < ITEM_SIZE; i++) { - if (items[i].id != INVALID_ID) { - data->items.push_back(items[i]); - } - } - } - } - rwlock_[ver].unlock(); - return 0; + +void HashMap::SetBloomFilterThrethold(int32_t max_count) { + max_count_ = max_count; } -int HashMap::SetHashKeys(const HashMap::HashMapStruct& data) { - std::unordered_set ids; - for (auto item : data.items) { - ids.insert(item.id); - for (int ver = 0; ver < VERSIONS; ver++) { - SMemBlock* cur_block = GetHashBlockList(ver, item.x, item.y); - while (cur_block->Next()) { - cur_block = cur_block->Next(); - } - bool add_new_node = true; - for (int i = 0; i < ITEM_SIZE; i++) { - if (cur_block->Array()[i].id == INVALID_ID) { - cur_block->Array()[i] = item; - add_new_node = false; - break; - } - } - if (add_new_node) { - SMemBlock* tmp = data_pool_vec_[ver]->Borrow(); - if (tmp == nullptr) { - return -1; - } - cur_block->Next() = tmp; - tmp->Array()[0] = item; - } - } - } - for (size_t i = 0; i < data.counter; i++) { - if (ids.find(i) == ids.end()) { - reused_ids_list_.push_back(i); - } - } - counter_ = data.counter; - return 0; +std::ostream& operator<<(std::ostream& os, const Hash128Key& key) { + os << key.hash1 << "," << key.hash2; + return os; } -std::default_random_engine HashMap::dre; -std::uniform_real_distribution HashMap::urd(0.0, 1.0); -const int64_t HashMap::NOT_ADD_ID = -2; +const float HashMap::FLOAT_EPSILON = 1.192092896e-07f; +const size_t HashMap::NOT_ADD_ID = -2; } //ps diff --git a/xdl/ps-plus/ps-plus/common/hashmap.h b/xdl/ps-plus/ps-plus/common/hashmap.h index 4eb3ba58..21022395 100644 --- a/xdl/ps-plus/ps-plus/common/hashmap.h +++ b/xdl/ps-plus/ps-plus/common/hashmap.h @@ -21,227 +21,277 @@ limitations under the License. #include #include #include +#include +#include +#include #include "rd_lock.h" -#include "memblock.h" +#include "ps-plus/common/qrw_lock.h" +#include "ps-plus/common/bloom_filter.h" +#include "tbb/parallel_for_each.h" +#include "tbb/concurrent_unordered_map.h" +#include "tbb/concurrent_queue.h" +#include "tbb/concurrent_vector.h" +#include "ps-plus/common/thread_pool.h" +#include "ps-plus/common/logging.h" namespace ps { - -#define ITEM_SIZE 2 - -class HashMap { - public: - - HashMap(int64_t hint); - ~HashMap(); - void SetMaxCache(int max_cache) { - max_cache_ = max_cache; +struct Hash128Key { + int64_t hash1; + int64_t hash2; + bool operator ==(const Hash128Key& rhs) const { + return hash1 == rhs.hash1 && hash2 == rhs.hash2; } + friend std::ostream& operator<<(std::ostream& os, const Hash128Key& key); +}; - int Get(int64_t* keys, int64_t size, int64_t jump, - std::vector* ids, std::vector* reused_ids); - - int GetWithAddProbability(int64_t* keys, int64_t size, int64_t jump, double add_probability, - std::vector* ids, std::vector* reused_ids); - - int GetWithoutAdd(int64_t* keys, int64_t size, int64_t jump, std::vector* ids); +template +struct HashMapItem { + T key; + size_t id; +}; - int Del(int64_t* keys, int64_t size, int64_t jump); +template +struct HashMapStruct { + tbb::concurrent_vector > items; + std::atomic count; +}; +} - struct HashMapStruct { - std::vector items; - size_t counter; - }; - int GetHashKeys(HashMapStruct* result); - // Only be used in clear hashmap - int SetHashKeys(const HashMapStruct& result); - static const int64_t NOT_ADD_ID; - private: - inline int64_t GetHashKey(int64_t x, int64_t y) { +namespace tbb { +template <> struct tbb_hash_compare { + static size_t hash(const ps::Hash128Key& k) { + return GetHashKey(k.hash1, k.hash2); + } + static bool equal(const ps::Hash128Key& k1, const ps::Hash128Key& k2) { + return k1 == k2; + } + static inline int64_t GetHashKey(int64_t x, int64_t y) { + if (x == y) { + return x; + } x = ((x & 0xAAAAAAAAAAAAAAAAL) >> 1) + ((x & 0x5555555555555555L) << 1); - y = ((y & 0xFFFFFFFF00000000L) >> 32) + ((y & 0x00000000FFFFFFFFL) << 32); + y = ((y & 0xCCCCCCCCCCCCCCCCL) >> 2) + ((y & 0x3333333333333333L) << 2); int64_t h = x ^ y; return h == 0 ? -1 : h; } +}; - inline SMemBlock* GetHashBlockList(int ver, int64_t x, int64_t y) { - int64_t pos = GetHashKey(x, y) % nodes_vec_[ver].size(); - pos = pos >= 0 ? pos : pos + nodes_vec_[ver].size(); - return &(nodes_vec_[ver][pos]); +template <> struct tbb_hash { + size_t operator()(const ps::Hash128Key& k) const { + return tbb_hash_compare::GetHashKey(k.hash1, k.hash2); } +}; - inline int64_t TryGetOne(int ver, int64_t x, int64_t y); - inline int64_t AddOne(int ver, int64_t x, int64_t y, int64_t id, bool* id_reused); - inline void DelOne(int ver, int64_t x, int64_t y, int64_t id = -1); - inline int64_t GetId(bool* id_reused); - int ReplayLogs(int ver); - void ResetVer(int ver); - // expand space when there is not enough space to fill data - int ExpandSpace(int ver); - static int64_t GetHashSize(int64_t hint, bool scale = false); - - static const int VERSIONS = 2; - static const int MAX_CACHED = 10000; - static const int64_t INVALID_ID = -1; - static std::default_random_engine dre; - static std::uniform_real_distribution urd; - - using HashNode = std::vector>; - - enum OperateType { - ADD_OP = 0, - DEL_OP - }; - - struct LogNode { - LogNode() { - } +} - LogNode(int64_t x, int64_t y, int64_t id, OperateType type) { - this->x = x; - this->y = y; - this->id = id; - this->type = type; - } +namespace ps { - int64_t x; - int64_t y; - int64_t id; - OperateType type; - }; - - int64_t counter_; - int64_t hint_; - int update_counter_; - int max_cache_; - std::atomic current_ver_; - ReadWriteLock rwlock_[VERSIONS]; - std::mutex write_lock_; - // hash table node - HashNode nodes_vec_[VERSIONS]; - MemBlockPool* data_pool_vec_[VERSIONS]; - std::deque reused_ids_list_; - - // log for adding or removing - std::vector logs_[VERSIONS]; +class HashMap { + public: + HashMap(); + virtual ~HashMap(); + HashMap(const HashMap&) = delete; + HashMap& operator=(const HashMap&) = delete; + virtual int64_t Get(const int64_t* keys, size_t size, bool not_insert, float add_probability, std::vector* ids, tbb::concurrent_vector* reused_ids, size_t* filtered_keys, size_t block_size = 500) = 0; + virtual void Erase(const int64_t* keys, size_t size) = 0; + virtual size_t EraseById(const std::string& variable_name, const std::vector& ids, tbb::concurrent_vector* unfiltered_ids) = 0; + void SetBloomFilterThrethold(int32_t max_count); + static const size_t NOT_ADD_ID; + static const float FLOAT_EPSILON; + std::default_random_engine dre; + std::uniform_real_distribution urd; + size_t GetSize() {return offset_;} + virtual size_t GetBucketCount(const std::string& variable_name) = 0; + protected: + bool FloatEqual(float v1, float v2); + std::atomic offset_; + tbb::concurrent_queue free_list_; + int32_t max_count_; }; -int64_t HashMap::TryGetOne(int ver, int64_t x, int64_t y) { - SMemBlock* cur_block = GetHashBlockList(ver, x, y); - HashMapItem* item; - while (cur_block) { - item = cur_block->Get(x, y); - if (nullptr != item) { - // found - return item->id; - } - cur_block = cur_block->Next(); - } - return INVALID_ID; -} - -int64_t HashMap::GetId(bool* id_reused) { - // first, check reused_ids_list_ - *id_reused = false; - if (!reused_ids_list_.empty()) { - int64_t id = reused_ids_list_.front(); - reused_ids_list_.pop_front(); - *id_reused = true; - return id; +template class HashMapImpl : public HashMap { + public: + HashMapImpl(size_t hint): HashMap(), table_(hint) {} + typedef tbb::concurrent_unordered_map, std::equal_to > HashTable; + typedef std::unordered_set, std::equal_to > NonCocurrentHashTable; + virtual int64_t Get(const int64_t* keys, size_t size, bool not_insert, float add_probability, std::vector* ids, tbb::concurrent_vector* reused_ids, size_t* filtered_keys, size_t block_size = 500) { + ids->resize(size); + std::atomic total_filtered_count(0); + MultiThreadDo(size, [&](const Range& r) { + size_t filtered_count = 0; + for (size_t i = r.begin; i < r.end; i++) { + KeyType key; + GetKey(keys, i, &key); + auto iter = table_.find(key); + if (iter != table_.end()) { + (*ids)[i] = iter->second; + //only not_insert is false(pull request), we use add_probability or bloom filter; + } else if (!not_insert) { + if ((FloatEqual(add_probability, 1.0) || urd(dre) <= add_probability) + && (max_count_ == 0 || GlobalBloomFilter::Instance()->InsertedLookup(&key, sizeof(key), max_count_)) + && (black_list_ == nullptr || black_list_->find(key) == black_list_->end()) + && (white_list_ == nullptr || white_list_->find(key) != white_list_->end())) { + auto insert = table_.insert(std::make_pair(key, 0)); + if (insert.second) { + size_t id; + if (free_list_.try_pop(id)) { + (*ids)[i] = id; + insert.first->second = (*ids)[i]; + reused_ids->push_back(id); + } else { + (*ids)[i] = offset_++; + insert.first->second = (*ids)[i]; + } + } else { + (*ids)[i] = insert.first->second; + } + } else { + filtered_count++; + (*ids)[i] = NOT_ADD_ID; + } + } + } + total_filtered_count += filtered_count; + return Status::Ok(); + }, block_size); + *filtered_keys = total_filtered_count.load(); + return offset_.load(); } - // second, produce new id - return counter_++; -} -int64_t HashMap::AddOne(int ver, int64_t x, int64_t y, int64_t id, - bool* id_reused) { - *id_reused = false; - int64_t old_id = TryGetOne(ver, x, y); - if (INVALID_ID != old_id) { - return old_id; - } - int64_t new_id; - if (id < 0) { - new_id = GetId(id_reused); - } else { - new_id = id; - } - - SMemBlock* cur_block = GetHashBlockList(ver, x, y); - int ret = 0; - while (cur_block) { - ret = cur_block->Push(x, y, new_id); - if (0 == ret) { - if (id < 0) { - // will need replay log - logs_[ver].emplace_back(x, y, new_id, ADD_OP); + virtual void Erase(const int64_t* keys, size_t size) { + for (size_t i = 0; i < size; i++) { + KeyType key; + GetKey(keys, i, &key); + auto iter = table_.find(key); + if (iter != table_.end()) { + size_t wait_erase = iter->second; + if (table_.unsafe_erase(key)) { + free_list_.push(wait_erase); + } } - return new_id; } - if (nullptr == cur_block->Next()) { - SMemBlock* tmp = data_pool_vec_[ver]->Borrow(); - if (nullptr == tmp) { - // need expand space - if (0 != ExpandSpace(ver)) { - return INVALID_ID; - } - // NOTE: should get hash block list again - SMemBlock* new_head = GetHashBlockList(ver, x, y); - if (nullptr == new_head) { - return INVALID_ID; + } + + virtual size_t GetBucketCount(const std::string& variable_name) { + /* + LOG_INFO("%s, load_factor %f, max_load_factor %f", variable_name.c_str(), table_.load_factor(), table_.max_load_factor()); + size_t bucket_count = table_.unsafe_bucket_count(); + std::map count_map; + bool first = true; + for (size_t i = 0; i < bucket_count; i++) { + size_t size = table_.unsafe_bucket_size(i); + if (size != 0 && first) { + auto iter = table_.unsafe_begin(i); + first = false; + while (iter != table_.unsafe_end(i)) { + std::cout << iter->first << std::endl; + ++iter; } - cur_block = new_head; + } + if (count_map.find(size) == count_map.end()) { + count_map[size] = 1; } else { - cur_block->Next() = tmp; - cur_block = cur_block->Next(); + count_map[size] = count_map[size]+1; } - } else { - cur_block = cur_block->Next(); } + size_t total = 0; + for (auto& iter : count_map) { + total += iter.first * iter.second; + LOG_INFO("%s, %ld, %ld", variable_name.c_str(), iter.first, iter.second); + } + LOG_INFO("%s, total is %ld", variable_name.c_str(), total); + */ + return table_.unsafe_bucket_count(); } - return INVALID_ID; -} -void HashMap::DelOne(int ver, int64_t x, int64_t y, int64_t id) { - SMemBlock* head = GetHashBlockList(ver, x, y); - SMemBlock* cur_block = head; - int64_t old_id; - while (cur_block) { - if (0 == cur_block->Del(x, y, &old_id)) { - if (-1 == id) { - if (old_id >= 0) { - // release id - reused_ids_list_.push_back(old_id); - logs_[ver].emplace_back(x, y, old_id, DEL_OP); - } else { - // do nothing, because it has been logical deleted - } - } - break; - } - cur_block = cur_block->Next(); + inline void GetItems(HashMapStruct* result) { + tbb::parallel_for_each(begin(table_), end(table_), [=](const std::pair& pr) { + result->items.push_back(HashMapItem{.key=pr.first, .id=pr.second}); + }); + result->count = result->items.size(); + return; } - // return MemBlock to pool if it's empty - SMemBlock* tmp = head; - while (tmp && tmp->Next()) { - if (tmp->Next()->Empty()) { - SMemBlock* next = tmp->Next()->Next(); - data_pool_vec_[ver]->Return(tmp->Next()); - tmp->Next() = next; + + virtual size_t EraseById(const std::string& variable_name, const std::vector& ids, tbb::concurrent_vector* unfiltered_ids) { + std::atomic size(0); + tbb::concurrent_vector keys; + tbb::parallel_for_each(begin(table_), end(table_), [&](const std::pair& pr) { + auto iter = std::lower_bound(ids.begin(), ids.end(), pr.second); + if (iter != ids.end() && *iter == pr.second) { + keys.push_back(pr.first); + free_list_.push(pr.second); + size++; + } else { + unfiltered_ids->push_back(pr.second); + } + }); + for (auto&& key : keys) { + table_.unsafe_erase(key); } - tmp = tmp->Next(); + LOG(INFO) << "Filter for " << variable_name << ", clear=" << keys.size() << ", left=" << table_.size(); + return size; } - // do logical deletion to read buffer - int read_ver = current_ver_.load(); - SMemBlock* read_cur_block = GetHashBlockList(read_ver, x, y); - while (read_cur_block) { - HashMapItem* item = read_cur_block->Get(x, y); - if (nullptr != item) { - item->id = INVALID_ID; - break; - } - read_cur_block = read_cur_block->Next(); - } + //只应调用偏特化版本 + inline void GetKey(const int64_t* keys, int index, KeyType* result) { + throw std::invalid_argument("GetKey for HashMap base should not be called"); + } + + NonCocurrentHashTable* NewBlackList() { + black_list_.reset(new NonCocurrentHashTable); + return black_list_.get(); + } + + NonCocurrentHashTable* NewWhiteList() { + white_list_.reset(new NonCocurrentHashTable); + return white_list_.get(); + } + + NonCocurrentHashTable* GetBlackList() { + return black_list_.get(); + } + + NonCocurrentHashTable* GetWhiteList() { + return white_list_.get(); + } + + size_t FilterByBlackList() { + size_t size = 0; + for (auto key : *black_list_) { + size += table_.unsafe_erase(key); + } + return size; + } + + size_t FilterByWhiteList() { + HashTable new_table; + std::atomic size(0); + tbb::parallel_for_each(begin(table_), end(table_), [&](const std::pair& pr) { + if (white_list_->find(pr.first) != white_list_->end()) { + new_table.insert(pr); + } else { + size++; + } + }); + table_ = std::move(new_table); + return size; + } + + private: + HashTable table_; + std::unique_ptr black_list_, white_list_; + QRWLock lock_; +}; + +template<> +inline void HashMapImpl::GetKey(const int64_t* keys, int index, int64_t* result) { + *result = keys[index]; +} + +template<> +inline void HashMapImpl::GetKey(const int64_t* keys, int index, Hash128Key* result) { + result->hash1 = keys[2*index]; + result->hash2 = keys[2*index+1]; } } //ps diff --git a/xdl/ps-plus/ps-plus/common/hdfs_data_source.cc b/xdl/ps-plus/ps-plus/common/hdfs_data_source.cc index 762a46e4..fa402592 100644 --- a/xdl/ps-plus/ps-plus/common/hdfs_data_source.cc +++ b/xdl/ps-plus/ps-plus/common/hdfs_data_source.cc @@ -1,18 +1,3 @@ -/* Copyright (C) 2016-2018 Alibaba Group Holding Limited - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ - /* * Copyright 1999-2017 Alibaba Group. * @@ -32,7 +17,6 @@ limitations under the License. #include "ps-plus/common/hdfs_data_source.h" #include -#include #include #include #include @@ -42,6 +26,14 @@ limitations under the License. namespace ps { +namespace { +void LOG_TIME(std::string name) { + struct timeval tv; + gettimeofday(&tv,NULL); + std::cout << name + ":" + std::to_string(1000000 * tv.tv_sec + tv.tv_usec) + "\n"; +} +} + Status HdfsDataSource::Init(int rank, int worker_num, size_t default_value_length) { default_value_length_ = default_value_length; diff --git a/xdl/ps-plus/ps-plus/common/initializer.cc b/xdl/ps-plus/ps-plus/common/initializer.cc index b8f5587c..b5debac7 100644 --- a/xdl/ps-plus/ps-plus/common/initializer.cc +++ b/xdl/ps-plus/ps-plus/common/initializer.cc @@ -15,7 +15,7 @@ limitations under the License. #include "ps-plus/common/initializer.h" #include "ps-plus/common/thread_pool.h" - +#include "tbb/parallel_for.h" #include namespace ps { @@ -29,21 +29,11 @@ void Initializer::MultiThreadInit(void* data, DataType type, size_t size) { if (size < block_size * 2) { Init(data, type, size); } else { - char* ptr = (char*)data; - std::promise ok; - std::atomic counter(size / block_size); - while (size > 0) { - size_t s = size < block_size * 2 ? size : block_size; - ThreadPool::Global()->Schedule([=, &ok, &counter]{ - Init(ptr, type, s); - if (--counter == 0) { - ok.set_value(true); - } - }); - ptr += SizeOfType(type) * s; - size -= s; - } - ok.get_future().wait(); + parallel_for(tbb::blocked_range(0, size), [&](tbb::blocked_range& r) { + size_t start = r.begin(); + size_t end = r.end(); + Init(data + (start * SizeOfType(type)), type, end-start); + }); } } diff --git a/xdl/ps-plus/ps-plus/common/initializer/orthogonal_initializer.cpp b/xdl/ps-plus/ps-plus/common/initializer/orthogonal_initializer.cpp new file mode 100644 index 00000000..957587cc --- /dev/null +++ b/xdl/ps-plus/ps-plus/common/initializer/orthogonal_initializer.cpp @@ -0,0 +1,107 @@ +/* Copyright (C) 2016-2018 Alibaba Group Holding Limited + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "orthogonal_initializer.h" + +#include +#include +#include +#include +#include +#include + +#include "ps-plus/common/types.h" +#include "random/random.h" +#include "random/random_ops.h" +#include "normal_initializer.h" + +using namespace Eigen; +using namespace Eigen::internal; +using namespace Eigen::Architecture; + +namespace ps { +namespace initializer { + +OrthogonalInitializer::OrthogonalInitializer( + int64_t dim, int seed, float gain) + : dim_(dim) + , seed_(seed) + , gain_(gain) { + normal_initializer_.reset(new NormalInitializer(seed, 0.0, 1.0)); +} + +bool OrthogonalInitializer::Accept(DataType type) { + if (type == DataType::kFloat || + type == DataType::kDouble) { + return true; + } + + return false; +} + +void OrthogonalInitializer::Init(void* data, + DataType type, + size_t size) { + if (size % dim_ != 0) { + printf("error size\n"); + abort(); + } + + normal_initializer_->Init(data, type, size); + int64_t row = size / dim_; + int64_t col = dim_; + if (type == DataType::kFloat) { + Eigen::Map> m((float*)data, row, col); + Eigen::JacobiSVD svd(m, Eigen::ComputeThinV | Eigen::ComputeThinU); + Eigen::MatrixXf u = svd.matrixU() * gain_; + Eigen::MatrixXf v = svd.matrixV() * gain_; + if ((row == u.rows() && col == u.cols()) || + (row == u.cols() && col == u.rows())) { + Eigen::MatrixXf trans_u = u.transpose(); + memcpy(data, trans_u.data(), size * sizeof(float)); + } else if ((row == v.rows() && col == v.cols()) || + (row == v.cols() && col == v.rows())) { + memcpy(data, v.data(), size * sizeof(float)); + } else { + printf("svd result shape[%d,%d|%d,%d] not match\n", u.rows(), u.cols(), v.rows(), v.cols()); + abort(); + } + } else { + Eigen::Map> m((double*)data, row, col); + Eigen::JacobiSVD svd(m, Eigen::ComputeThinV | Eigen::ComputeThinU); + Eigen::MatrixXd u = svd.matrixU() * gain_; + Eigen::MatrixXd v = svd.matrixV() * gain_; + if ((row == u.rows() && col == u.cols()) || + (row == u.cols() && col == u.rows())) { + Eigen::MatrixXd trans_u = u.transpose(); + memcpy(data, trans_u.data(), size * sizeof(double)); + } else if ((row == v.rows() && col == v.cols()) || + (row == v.cols() && col == v.rows())) { + memcpy(data, v.data(), size * sizeof(double)); + } else { + printf("svd result shape[%d,%d|%d,%d] not match\n", u.rows(), u.cols(), v.rows(), v.cols()); + abort(); + } + } +} + +Initializer* OrthogonalInitializer::Clone() { + return new OrthogonalInitializer( + dim_, seed_, gain_); +} + +} //namespace initializer +} //ps + diff --git a/xdl/ps-plus/ps-plus/common/initializer/orthogonal_initializer.h b/xdl/ps-plus/ps-plus/common/initializer/orthogonal_initializer.h new file mode 100644 index 00000000..d4791cae --- /dev/null +++ b/xdl/ps-plus/ps-plus/common/initializer/orthogonal_initializer.h @@ -0,0 +1,45 @@ +/* Copyright (C) 2016-2018 Alibaba Group Holding Limited + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef PS_COMMON_INITIALIZER_ORTHOGONAL_INITIALIZER_H +#define PS_COMMON_INITIALIZER_ORTHOGONAL_INITIALIZER_H + +#include "ps-plus/common/initializer.h" +#include "ps-plus/common/tensor_shape.h" + +namespace ps { +namespace initializer { + +class NormalInitializer; + +class OrthogonalInitializer: public Initializer { + public: + OrthogonalInitializer(int64_t dim, int seed = 0, float gain = 1.0); + bool Accept(DataType type) override; + void Init(void* data, DataType type, size_t size) override; + Initializer* Clone() override; + + private: + int64_t dim_; + int seed_; + float gain_; + std::vector shape_; + std::unique_ptr normal_initializer_; +}; + +} //namespace initializer +} //ps + +#endif // PS_COMMON_INITIALIZER_TRUNCATED_ORTHOGONAL_INITIALIZER_H diff --git a/xdl/ps-plus/ps-plus/common/initializer/test/orthogonal_initializer_test.cc b/xdl/ps-plus/ps-plus/common/initializer/test/orthogonal_initializer_test.cc new file mode 100644 index 00000000..87ba2a1c --- /dev/null +++ b/xdl/ps-plus/ps-plus/common/initializer/test/orthogonal_initializer_test.cc @@ -0,0 +1,35 @@ +/* Copyright (C) 2016-2018 Alibaba Group Holding Limited + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "gtest/gtest.h" +#include "ps-plus/common/initializer/orthogonal_initializer.h" + +using ps::DataType; +using ps::Initializer; +using ps::initializer::OrthogonalInitializer; + +TEST(OrthogonalInitializer, OrthogonalInitializer) { + float data[6] = {0}; + Initializer* init = new OrthogonalInitializer(3); + init->Init(data, DataType::kFloat, 6); + float sum = 0.0; + for (size_t i = 0; i < 3; ++i) { + sum += data[i] * data[i+3]; + } + + static const float eps = 1e-6; + EXPECT_TRUE(abs(sum) < eps); +} + diff --git a/xdl/ps-plus/ps-plus/common/logging.cc b/xdl/ps-plus/ps-plus/common/logging.cc new file mode 100644 index 00000000..3c330e2c --- /dev/null +++ b/xdl/ps-plus/ps-plus/common/logging.cc @@ -0,0 +1,69 @@ +/* Copyright (C) 2016-2018 Alibaba Group Holding Limited + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "logging.h" + +#include +#include +#include +#include +#include + +#include "time_utils.h" + +namespace ps { + +LogMessage::LogMessage(const char* fname, int line, int severity) + : fname_(fname), line_(line), severity_(severity) {} + +void LogMessage::GenerateLogMessage() { + uint64_t now_micros = TimeUtils::NowMicros(); + time_t now_seconds = static_cast(now_micros / 1000000); + int32_t micros_remainder = static_cast(now_micros % 1000000); + const size_t time_buffer_size = 30; + char time_buffer[time_buffer_size]; + strftime(time_buffer, time_buffer_size, "%Y-%m-%d %H:%M:%S", + localtime(&now_seconds)); + fprintf(stderr, "%s.%06d: %c %s:%d] %s\n", time_buffer, micros_remainder, + "IWEF"[severity_], fname_, line_, str().c_str()); +} + +namespace { +int64_t GetLogLevelFromEnv() { + const char* log_level = getenv("XDL_CPP_LOG_LEVEL"); + if (log_level == nullptr) { + return INFO; + } + + return atoi(log_level); +} +} + +LogMessage::~LogMessage() { + static int64_t min_log_level = GetLogLevelFromEnv(); + if (likely(severity_ >= min_log_level)) { + GenerateLogMessage(); + } +} + +LogMessageFatal::LogMessageFatal(const char* file, int line) + : LogMessage(file, line, FATAL) {} + +LogMessageFatal::~LogMessageFatal() { + GenerateLogMessage(); + abort(); +} + +} // namespace xdl diff --git a/xdl/ps-plus/ps-plus/common/logging.h b/xdl/ps-plus/ps-plus/common/logging.h new file mode 100644 index 00000000..b5df8ebe --- /dev/null +++ b/xdl/ps-plus/ps-plus/common/logging.h @@ -0,0 +1,86 @@ +/* Copyright (C) 2016-2018 Alibaba Group Holding Limited + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef PS_COMMON_LOGGING_H_ +#define PS_COMMON_LOGGING_H_ + +#include +#include + +namespace ps { +const int DEBUG = 0; +const int INFO = 1; +const int WARNING = 2; +const int ERROR = 3; +const int FATAL = 4; +const int NUM_SEVERITIES = 5; + +class LogMessage : public std::basic_ostringstream { + public: + LogMessage(const char* fname, int line, int severity); + ~LogMessage(); + + protected: + void GenerateLogMessage(); + + private: + const char* fname_; + int line_; + int severity_; +}; + +class LogMessageFatal : public LogMessage { + public: + LogMessageFatal(const char* file, int line); + ~LogMessageFatal(); +}; + +#define _PS_LOG_INFO \ + ::ps::LogMessage(__FILE__, __LINE__, ::ps::INFO) +#define _PS_LOG_DEBUG \ + ::ps::LogMessage(__FILE__, __LINE__, ::ps::DEBUG) +#define _PS_LOG_WARNING \ + ::ps::LogMessage(__FILE__, __LINE__, ::ps::WARNING) +#define _PS_LOG_ERROR \ + ::ps::LogMessage(__FILE__, __LINE__, ::ps::ERROR) +#define _PS_LOG_FATAL \ + ::ps::LogMessageFatal(__FILE__, __LINE__) + +#define LOG(severity) _PS_LOG_##severity + +#define DLOG(severity) PS_LOG(severity) + +#ifndef likely +#define likely(x) __builtin_expect(!!(x), 1) +#endif + +#ifndef unlikely +#define unlikely(x) __builtin_expect(!!(x), 0) +#endif + +#define PS_CHECK(condition) \ + if (unlikely(!(condition))) \ + LOG(FATAL) << "Check failed: " #condition " " + +#define PS_CHECK_EQ(lhs, rhs) \ + if (unlikely(((lhs) != (rhs)))) \ + LOG(FATAL) << "Check failed: " #lhs " == " #rhs + + +#define DCHECK(condition) PS_CHECK(condition) + +} // ps + +#endif // PS_COMMON_LOGGING_H_ diff --git a/xdl/ps-plus/ps-plus/common/murmurhash.cpp b/xdl/ps-plus/ps-plus/common/murmurhash.cpp new file mode 100644 index 00000000..74d175e7 --- /dev/null +++ b/xdl/ps-plus/ps-plus/common/murmurhash.cpp @@ -0,0 +1,100 @@ +/* Copyright (C) 2016-2018 Alibaba Group Holding Limited + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "murmurhash.h" + +namespace ps { + +namespace { + +inline uint64_t rotl64(uint64_t x, int8_t r) { + return (x << r) | (x >> (64 - r)); +} + +inline uint64_t fmix64(uint64_t k) { + k ^= k >> 33; + k *= 0xff51afd7ed558ccdULL; + k ^= k >> 33; + k *= 0xc4ceb9fe1a85ec53ULL; + k ^= k >> 33; + + return k; +} + +} // namespace + +// smhasher implementation: +// https://github.com/aappleby/smhasher/blob/master/src/MurmurHash3.cpp +void MurmurHash::operator()(const void* key, const int len, void* out) { + const uint8_t* data = (const uint8_t*)(key); + const int nblocks = len / 16; + + uint64_t h1 = seed_, h2 = seed_; + + const uint64_t c1 = 0x87c37b91114253d5ULL; + const uint64_t c2 = 0x4cf5ad432745937fULL; + + const uint64_t* blocks = (const uint64_t*)(data); + for (int i = 0; i < nblocks; ++i) { + uint64_t k1 = blocks[i*2]; + uint64_t k2 = blocks[i*2+1]; + + k1 *= c1; k1 = rotl64(k1, 31); k1 *= c2; h1 ^= k1; + + h1 = rotl64(h1, 27); h1 += h2; h1 = h1*5+0x52dce729; + + k2 *= c2; k2 = rotl64(k2, 33); k2 *= c1; h2 ^= k2; + + h2 = rotl64(h2, 31); h2 += h1; h2 = h2*5+0x38495ab5; + } + + const uint8_t* tail = (const uint8_t*)(data + nblocks*16); + + uint64_t k1 = 0, k2 = 0; + switch(len & 15) { + case 15: k2 ^= ((uint64_t)tail[14]) << 48; + case 14: k2 ^= ((uint64_t)tail[13]) << 40; + case 13: k2 ^= ((uint64_t)tail[12]) << 32; + case 12: k2 ^= ((uint64_t)tail[11]) << 24; + case 11: k2 ^= ((uint64_t)tail[10]) << 16; + case 10: k2 ^= ((uint64_t)tail[9]) << 8; + case 9: k2 ^= ((uint64_t)tail[8]) << 0; + k2 *= c2; k2 = rotl64(k2, 33); k2 *= c1; h2 ^= k2; + case 8: k1 ^= ((uint64_t)tail[7]) << 56; + case 7: k1 ^= ((uint64_t)tail[6]) << 48; + case 6: k1 ^= ((uint64_t)tail[5]) << 40; + case 5: k1 ^= ((uint64_t)tail[4]) << 32; + case 4: k1 ^= ((uint64_t)tail[3]) << 24; + case 3: k1 ^= ((uint64_t)tail[2]) << 16; + case 2: k1 ^= ((uint64_t)tail[1]) << 8; + case 1: k1 ^= ((uint64_t)tail[0]) << 0; + k1 *= c1; k1 = rotl64(k1, 31); k1 *= c2; h1 ^= k1; + } + + h1 ^= len; h2 ^= len; + h1 += h2; + h2 += h1; + + h1 = fmix64(h1); + h2 = fmix64(h2); + + h1 += h2; + h2 += h1; + + ((uint64_t*)out)[0] = h1; + ((uint64_t*)out)[1] = h2; +} + +} // namespace ps diff --git a/xdl/ps-plus/ps-plus/common/murmurhash.h b/xdl/ps-plus/ps-plus/common/murmurhash.h new file mode 100644 index 00000000..fe9c2223 --- /dev/null +++ b/xdl/ps-plus/ps-plus/common/murmurhash.h @@ -0,0 +1,33 @@ +/* Copyright (C) 2016-2018 Alibaba Group Holding Limited + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef PS_PLUS_COMMON_MURMURHASH_H_ +#define PS_PLUS_COMMON_MURMURHASH_H_ + +#include + +namespace ps { + +class MurmurHash { + public: + MurmurHash(uint32_t seed) : seed_(seed) {} + void operator()(const void* key, int len, void* out); + private: + uint32_t seed_; +}; + +} // namespace ps + +#endif // PS_PLUS_COMMON_MURMURHASH_H_ diff --git a/xdl/ps-plus/ps-plus/common/net_utils.cc b/xdl/ps-plus/ps-plus/common/net_utils.cc index cbbee71e..8e1cd952 100644 --- a/xdl/ps-plus/ps-plus/common/net_utils.cc +++ b/xdl/ps-plus/ps-plus/common/net_utils.cc @@ -25,7 +25,7 @@ limitations under the License. #include #include #include -#include +#include "ps-plus/common/logging.h" namespace ps { diff --git a/xdl/ps-plus/ps-plus/common/serialize_helper.h b/xdl/ps-plus/ps-plus/common/serialize_helper.h index 55e1d121..414139c4 100644 --- a/xdl/ps-plus/ps-plus/common/serialize_helper.h +++ b/xdl/ps-plus/ps-plus/common/serialize_helper.h @@ -18,6 +18,7 @@ limitations under the License. #include #include +#include "ps-plus/common/logging.h" #define private public @@ -31,6 +32,7 @@ limitations under the License. #include "ps-plus/common/initializer/truncated_normal_initializer.h" #include "ps-plus/common/initializer/variance_scaling_initializer.h" #include "ps-plus/common/initializer/uniform_unit_scaling_initializer.h" +#include "ps-plus/common/initializer/orthogonal_initializer.h" #include "ps-plus/common/hashmap.h" #undef private @@ -48,15 +50,26 @@ class SerializeHelper { static ps::Status Serialize(const T* data, std::vector* bufs, MemGuard& mem_guard) { - T* buf = const_cast(data); - Fragment frag(reinterpret_cast(buf), sizeof(T)); + Fragment frag(reinterpret_cast(mem_guard.AllocateElement(*data)), sizeof(T)); bufs->push_back(frag); return ps::Status::Ok(); } + template + static ps::Status SerializeVec(const std::vector* data, + std::vector* bufs, + MemGuard& mem_guard) { + size_t size = data->size(); + PS_CHECK_STATUS(SerializeHelper::Serialize(&size, bufs, mem_guard)); + for (size_t i = 0; i < size; i++) { + PS_CHECK_STATUS(SerializeHelper::Serialize(&(*data)[i], bufs, mem_guard)); + } + return ps::Status::Ok(); + } + template static ps::Status Deserialize(const char* buf, - T* data, + T* data, size_t* len, MemGuard& mem_guard) { *data = *(reinterpret_cast(buf)); @@ -64,6 +77,24 @@ class SerializeHelper { return ps::Status::Ok(); } + template + static ps::Status DeserializeVec(const char* buf, + std::vector* data, + size_t* len, + MemGuard& mem_guard) { + size_t size; + size_t field_len; + PS_CHECK_STATUS(Deserialize(buf, &size, &field_len, mem_guard)); + size_t offset = 0; + for (size_t i = 0; i < size; i++) { + offset += field_len; + T t; + PS_CHECK_STATUS(Deserialize(buf + offset, &t, &field_len, mem_guard)); + data->push_back(std::move(t)); + } + *len = offset + field_len; + return ps::Status::Ok(); + } }; // specification for SerializeHelper @@ -91,6 +122,182 @@ ps::Status SerializeHelper::Deserialize(const char* buf, return ps::Status::Ok(); } +template <> +ps::Status SerializeHelper::Serialize >( + const std::vector* data, + std::vector* bufs, + MemGuard& mem_guard) { + size_t buffer_size = sizeof(size_t); + for (size_t i = 0; i < data->size(); i++) { + buffer_size += sizeof(size_t) + data->at(i).size(); + } + char* buffer = mem_guard.AllocateBuffer(buffer_size); + *(size_t*)buffer = data->size(); + size_t offset = sizeof(size_t); + for (size_t i = 0; i < data->size(); i++) { + *(size_t*)(buffer+offset) = data->at(i).size(); + offset += sizeof(size_t); + memcpy(buffer + offset, data->at(i).c_str(), data->at(i).size()); + offset += data->at(i).size(); + } + bufs->push_back(Fragment{.base=buffer, .size=buffer_size}); + return ps::Status::Ok(); +} + +template <> +ps::Status SerializeHelper::Deserialize >( + const char* buf, + std::vector* data, + size_t* len, + MemGuard& mem_guard) { + return SerializeHelper::DeserializeVec(buf, data, len, mem_guard); +} + +template <> +ps::Status SerializeHelper::Serialize >( + const std::vector* data, + std::vector* bufs, + MemGuard& mem_guard) { + size_t buffer_size = sizeof(size_t) + data->size(); + char* buffer = mem_guard.AllocateBuffer(buffer_size); + *(size_t*)buffer = data->size(); + size_t offset = sizeof(size_t); + for (size_t i = 0; i < data->size(); i++) { + buffer[offset++] = (*data)[i]; + } + Fragment buf(buffer, buffer_size); + bufs->push_back(std::move(buf)); + return ps::Status::Ok(); +} + +template <> +ps::Status SerializeHelper::Deserialize >( + const char* buf, + std::vector* data, + size_t* len, + MemGuard& mem_guard) { + size_t size; + size_t field_len; + PS_CHECK_STATUS(Deserialize(buf, &size, &field_len, mem_guard)); + size_t offset = 0; + for (size_t i = 0; i < size; i++) { + offset += field_len; + bool t; + PS_CHECK_STATUS(Deserialize(buf + offset, &t, &field_len, mem_guard)); + data->push_back(t); + } + *len = offset + field_len; + return ps::Status::Ok(); +} + +template <> +ps::Status SerializeHelper::Serialize >( + const std::vector* data, + std::vector* bufs, + MemGuard& mem_guard) { + size_t buffer_size = sizeof(size_t); + buffer_size += data->size() * sizeof(double); + char* buffer = mem_guard.AllocateBuffer(buffer_size); + *(size_t*)buffer = data->size(); + size_t offset = sizeof(size_t); + for (size_t i = 0; i < data->size(); i++) { + *(double*)(buffer + offset) = data->at(i); + offset += sizeof(double); + } + bufs->push_back(Fragment{.base=buffer, .size=buffer_size}); + return Status::Ok(); +} + +template <> +ps::Status SerializeHelper::Serialize >( + const std::vector* data, + std::vector* bufs, + MemGuard& mem_guard) { + size_t buffer_size = sizeof(size_t); + buffer_size += data->size() * sizeof(float); + char* buffer = mem_guard.AllocateBuffer(buffer_size); + *(size_t*)buffer = data->size(); + size_t offset = sizeof(size_t); + for (size_t i = 0; i < data->size(); i++) { + *(float*)(buffer + offset) = data->at(i); + offset += sizeof(float); + } + bufs->push_back(Fragment{.base=buffer, .size=buffer_size}); + return Status::Ok(); +} + +template <> +ps::Status SerializeHelper::Serialize >( + const std::vector* data, + std::vector* bufs, + MemGuard& mem_guard) { + size_t buffer_size = sizeof(size_t); + buffer_size += data->size() * sizeof(int64_t); + char* buffer = mem_guard.AllocateBuffer(buffer_size); + *(size_t*)buffer = data->size(); + size_t offset = sizeof(size_t); + for (size_t i = 0; i < data->size(); i++) { + *(int64_t*)(buffer + offset) = data->at(i); + offset += sizeof(int64_t); + } + bufs->push_back(Fragment{.base=buffer, .size=buffer_size}); + return Status::Ok(); +} + +template <> +ps::Status SerializeHelper::Deserialize >( + const char* buf, + std::vector* data, + size_t* len, + MemGuard& mem_guard) { + return SerializeHelper::DeserializeVec(buf, data, len, mem_guard); +} +template <> +ps::Status SerializeHelper::Serialize >( + const std::vector* data, + std::vector* bufs, + MemGuard& mem_guard) { + size_t buffer_size = sizeof(size_t); + buffer_size += data->size() * sizeof(int); + char* buffer = mem_guard.AllocateBuffer(buffer_size); + *(size_t*)buffer = data->size(); + size_t offset = sizeof(size_t); + for (size_t i = 0; i < data->size(); i++) { + *(int*)(buffer + offset) = data->at(i); + offset += sizeof(int); + } + bufs->push_back(Fragment{.base=buffer, .size=buffer_size}); + return Status::Ok(); +} + +template <> +ps::Status SerializeHelper::Deserialize >( + const char* buf, + std::vector* data, + size_t* len, + MemGuard& mem_guard) { + return SerializeHelper::DeserializeVec(buf, data, len, mem_guard); +} + + +template <> +ps::Status SerializeHelper::Deserialize >( + const char* buf, + std::vector* data, + size_t* len, + MemGuard& mem_guard) { + return SerializeHelper::DeserializeVec(buf, data, len, mem_guard); +} + +template <> +ps::Status SerializeHelper::Deserialize >( + const char* buf, + std::vector* data, + size_t* len, + MemGuard& mem_guard) { + return SerializeHelper::DeserializeVec(buf, data, len, mem_guard); +} + template <> ps::Status SerializeHelper::Serialize(const ps::Status* st, std::vector* bufs, @@ -123,7 +330,6 @@ ps::Status SerializeHelper::Deserialize(const char* buf, } else { *st = ps::Status(); } - return ps::Status::Ok(); } @@ -132,7 +338,7 @@ ps::Status SerializeHelper::Serialize( const ps::DataType* dt, std::vector* bufs, MemGuard& mem_guard) { - Serialize((int32_t*)dt, bufs, mem_guard); + Serialize((int32_t*)dt, bufs, mem_guard); return ps::Status::Ok(); } @@ -201,18 +407,104 @@ ps::Status SerializeHelper::Serialize( const ps::Tensor* t, std::vector* bufs, MemGuard& mem_guard) { - Serialize(&t->state_->type, bufs, mem_guard); - Serialize(&t->state_->shape, bufs, mem_guard); - size_t size = 0; - CASES(t->Type(), { - size = t->Shape().NumElements() * sizeof(T); - }); - Fragment frag(t->state_->buffer, size); - bufs->push_back(frag); + if (t->tensor_type_ != Tensor::TType::kContinuous) { + return Status::ArgumentError("SegmentTensor can't be serialized"); + } + size_t buffer_size = sizeof(ps::DataType) + (1 + t->state_->shape.Size()) * sizeof(size_t); + char* buffer = mem_guard.AllocateBuffer(buffer_size); + *(ps::DataType*)buffer = t->state_->type; + *(size_t*)(buffer + sizeof(ps::DataType)) = t->state_->shape.Size(); + memcpy(buffer + sizeof(ps::DataType) + sizeof(size_t), &(t->state_->shape.dims_[0]), t->state_->shape.Size() * sizeof(size_t)); + bufs->push_back(Fragment{.base=buffer, .size=buffer_size}); + ps::Tensor::ContinuousState* state = dynamic_cast(t->state_); + size_t size = t->Shape().NumElements() * SizeOfType(t->Type()); + bufs->push_back(Fragment{.base=state->buffer, .size=size}); Serialize >(&t->state_->initializer, - bufs, - mem_guard); - return ps::Status::Ok(); + bufs, + mem_guard); + return ps::Status::Ok(); +} + +template <> +ps::Status SerializeHelper::Serialize >( + const std::vector* tvec, + std::vector* bufs, + MemGuard& mem_guard) { + if (tvec->size() == 1) { + return SerializeHelper::SerializeVec(tvec, bufs, mem_guard); + } + size_t buffer_size = sizeof(size_t); + for (size_t i = 0; i < tvec->size(); i++) { + const ps::Tensor* t = &tvec->at(i); + buffer_size += sizeof(ps::DataType) + (1 + t->state_->shape.Size()) * sizeof(size_t); + buffer_size += t->Shape().NumElements() * SizeOfType(t->Type()); + } + char* buffer = mem_guard.AllocateBuffer(buffer_size); + *(size_t*)buffer = tvec->size(); + size_t offset = sizeof(size_t); + for (size_t i = 0; i < tvec->size(); i++) { + const ps::Tensor* t = &tvec->at(i); + if (t->tensor_type_ != Tensor::TType::kContinuous) { + return Status::ArgumentError("SegmentTensor can't be serialized"); + } + *(ps::DataType*)(buffer+offset) = t->state_->type; + offset += sizeof(ps::DataType); + *(size_t*)(buffer + offset) = t->state_->shape.Size(); + offset += sizeof(size_t); + memcpy(buffer + offset, &(t->state_->shape.dims_[0]), t->state_->shape.Size() * sizeof(size_t)); + offset += t->state_->shape.Size() * sizeof(size_t); + ps::Tensor::ContinuousState* state = dynamic_cast(t->state_); + size_t size = t->Shape().NumElements() * SizeOfType(t->Type()); + memcpy(buffer + offset, state->buffer, size); + offset += size; + } + bufs->push_back(Fragment{.base=buffer, .size=buffer_size}); + return Status::Ok(); +} + +template <> +ps::Status SerializeHelper::Serialize ( + const ps::server::TensorSlices* data, + std::vector* bufs, + MemGuard& mem_guard) { + const ps::server::TensorSlices& s = *data; + const ps::Tensor* t = &s.tensor; + size_t buffer_size = sizeof(ps::DataType) + sizeof(size_t); + if (s.dim_part < 0) { + buffer_size += s.tensor.Shape().Size() * sizeof(size_t); + } else { + buffer_size += (s.tensor.Shape().Size() - s.dim_part + 1) * sizeof(size_t); + } + buffer_size += s.slice_id.size() * s.slice_size * SizeOfType(t->Type()); + char* buffer = mem_guard.AllocateBuffer(buffer_size); + *(ps::DataType*)(buffer) = t->state_->type; + size_t offset = sizeof(ps::DataType); + ps::TensorShape new_shape; + if (s.dim_part < 0) { + new_shape = t->state_->shape; + } else { + std::vector dims(1, s.slice_id.size()); + if ((size_t)s.dim_part >= t->state_->shape.Size()) { + return Status::ArgumentError("Slice dim_part Error"); + } + dims.insert(dims.end(), t->state_->shape.Dims().begin() + s.dim_part, t->state_->shape.Dims().end()); + new_shape = TensorShape(dims); + } + *(size_t*)(buffer + offset) = new_shape.Size(); + offset += sizeof(size_t); + memcpy(buffer + offset, &(new_shape.dims_[0]), new_shape.Size() * sizeof(size_t)); + offset += new_shape.Size() * sizeof(size_t); + + size_t chunk_size = s.slice_size * SizeOfType(t->Type()); + for (size_t j = 0; j < s.slice_id.size(); ++j) { + if ((int64_t)s.slice_id[j] == ps::HashMap::NOT_ADD_ID) { + memset(buffer + offset + j * chunk_size, 0, chunk_size); + } else { + memcpy(buffer + offset + j * chunk_size, t->Raw(s.slice_id[j]), chunk_size); + } + } + bufs->push_back(Fragment({.base=buffer, .size=buffer_size})); + return ps::Status::Ok(); } template <> @@ -225,7 +517,7 @@ ps::Status SerializeHelper::Deserialize(const char* buf, PS_CHECK_STATUS(Deserialize(buf, &type, &field_len, mem_guard)); *len = field_len; ps::TensorShape shape({0}); - PS_CHECK_STATUS(Deserialize(buf + *len, &shape, &field_len, mem_guard)); + PS_CHECK_STATUS(Deserialize(buf + *len, &shape, &field_len, mem_guard)); *len += field_len; const char* tensor_buffer = buf + *len; size_t buffer_len = 0; @@ -238,12 +530,25 @@ ps::Status SerializeHelper::Deserialize(const char* buf, *len += field_len; ps::Initializer* iz = nullptr; Fragment frag({.base=(char*)buf, .size=*len}); - DeserializeAny(serialize_id, &frag, *len, &iz, &field_len, mem_guard); - *len += field_len; + //Allow no initializer(for Slices & TensorSlices) + Status st = DeserializeAny(serialize_id, &frag, *len, &iz, &field_len, mem_guard); + if (st.IsOk()) { + *len += field_len; + } else { + *len -= sizeof(size_t); + } *t = Tensor(type, std::move(shape), const_cast(tensor_buffer), iz); return ps::Status::Ok(); } +template <> +ps::Status SerializeHelper::Deserialize >(const char* buf, + std::vector* t, + size_t* len, + MemGuard& mem_guard) { + return SerializeHelper::DeserializeVec(buf, t, len, mem_guard); +} + // Serialzier for ps::Initializer using Initializer = ps::Initializer; using NoneInitializer = ps::initializer::NoneInitializer; @@ -252,6 +557,7 @@ using TruncatedNormalInitializer = ps::initializer::TruncatedNormalInitializer; using NormalInitializer = ps::initializer::NormalInitializer; using VarianceScalingInitializer = ps::initializer::VarianceScalingInitializer; using UniformUnitScalingInitializer = ps::initializer::UniformUnitScalingInitializer; +using OrthogonalInitializer = ps::initializer::OrthogonalInitializer; class NoneInitializerSerializer: public Serializer { @@ -413,6 +719,58 @@ class NormalInitializerDeserializer: } }; +class OrthogonalInitializerSerializer: + public Serializer { + public: + virtual ps::Status Serialize(OrthogonalInitializer* data, + std::vector* bufs, + MemGuard& mem_guard) { + SerializeHelper::Serialize(&data->seed_, + bufs, + mem_guard); + SerializeHelper::Serialize(&data->gain_, + bufs, + mem_guard); + SerializeHelper::Serialize(&data->dim_, + bufs, + mem_guard); + return ps::Status::Ok(); + } +}; + +class OrthogonalInitializerDeserializer: + public Deserializer { + public: + virtual ps::Status Deserialize(Fragment* buf, + size_t offset, + OrthogonalInitializer** result, + size_t* len, + MemGuard& mem_guard) { + size_t field_len; + int seed; + char* base = buf->base + offset; + SerializeHelper::Deserialize(base, + &seed, + &field_len, + mem_guard); + *len = field_len; + float gain; + SerializeHelper::Deserialize(base + *len, + &gain, + &field_len, + mem_guard); + *len += field_len; + int64_t dim; + SerializeHelper::Deserialize(base + *len, + &dim, + &field_len, + mem_guard); + *len += field_len; + *result = new OrthogonalInitializer(dim, seed, gain); + return ps::Status::Ok(); + } +}; + class UniformUnitScalingInitializerSerializer: public Serializer { public: @@ -474,7 +832,7 @@ class VarianceScalingInitializerSerializer: std::vector* bufs, MemGuard& mem_guard) { SerializeHelper::Serialize(&data->seed_, - bufs, + bufs, mem_guard); SerializeHelper::Serialize(&data->scale_, bufs, @@ -598,111 +956,129 @@ class WrapperDataDerializer: }; template <> -class WrapperDataSerializer: - public Serializer, ps::WrapperData > { +class WrapperDataSerializer: + public Serializer, ps::WrapperData > { public: - virtual ps::Status Serialize(ps::WrapperData* data, + virtual ps::Status Serialize(ps::WrapperData* data, std::vector* bufs, MemGuard& mem_guard) { - ps::server::Slices& s = data->Internal(); - ps::Tensor* t = s.variable->data_.get(); - SerializeHelper::Serialize( - &t->state_->type, bufs, mem_guard); - ps::TensorShape new_shape; - if (s.dim_part < 0) { - new_shape = t->state_->shape; - } else { - std::vector dims(1, s.slice_size); - if ((size_t)s.dim_part > t->state_->shape.Size()) { - return Status::ArgumentError("Slice dim_part Error"); + return SerializeHelper::Serialize(&data->Internal(), bufs, mem_guard); + } +}; + +template <> +class WrapperDataSerializer >: + public Serializer >, ps::WrapperData > > { +public: + virtual ps::Status Serialize(ps::WrapperData >* data, + std::vector* bufs, + MemGuard& mem_guard) { + size_t buffer_size = sizeof(size_t); + for (size_t i = 0; i < data->Internal().size(); i++) { + buffer_size += sizeof(ps::DataType) + sizeof(size_t); + const ps::server::TensorSlices& s = data->Internal()[i]; + if (s.dim_part < 0) { + buffer_size += s.tensor.Shape().Size() * sizeof(size_t); + } else { + buffer_size += (s.tensor.Shape().Size() - s.dim_part + 1) * sizeof(size_t); } - dims.insert(dims.end(), t->state_->shape.Dims().begin() + s.dim_part, t->state_->shape.Dims().end()); - new_shape = TensorShape(dims); - new_shape.Set(0, s.slice_id.size()); + buffer_size += s.slice_id.size() * s.slice_size * SizeOfType(s.tensor.Type()); } - SerializeHelper::Serialize( - mem_guard.AllocateElement(new_shape.Size()), - bufs, mem_guard); - size_t buf_size = t->Shape().Size() * sizeof(size_t); - char* shape_buf = mem_guard.AllocateBuffer(buf_size); - memcpy(shape_buf, &(new_shape.dims_[0]), buf_size); - bufs->push_back(Fragment({.base=shape_buf, .size=buf_size})); - char* base = t->Raw(); - for (size_t i = 0; i < s.slice_id.size(); ++i) { - CASES(t->Type(), { - bufs->push_back(Fragment({.base=base + s.slice_id[i] * s.slice_size * sizeof(T), - .size=sizeof(T) * s.slice_size})); - }); + char* buffer = mem_guard.AllocateBuffer(buffer_size); + *((size_t*)buffer) = data->Internal().size(); + size_t offset = sizeof(size_t); + for (size_t i = 0; i < data->Internal().size(); i++) { + const ps::server::TensorSlices& s = data->Internal()[i]; + const ps::Tensor* t = &s.tensor; + *(ps::DataType*)(buffer + offset) = t->state_->type; + offset += sizeof(ps::DataType); + ps::TensorShape new_shape; + if (s.dim_part < 0) { + new_shape = t->state_->shape; + } else { + std::vector dims(1, s.slice_id.size()); + if ((size_t)s.dim_part >= t->state_->shape.Size()) { + return Status::ArgumentError("Slice dim_part Error"); + } + dims.insert(dims.end(), t->state_->shape.Dims().begin() + s.dim_part, t->state_->shape.Dims().end()); + new_shape = TensorShape(dims); + } + *(size_t*)(buffer + offset) = new_shape.Size(); + offset += sizeof(size_t); + memcpy(buffer + offset, &(new_shape.dims_[0]), new_shape.Size() * sizeof(size_t)); + offset += new_shape.Size() * sizeof(size_t); + + size_t chunk_size = s.slice_size * SizeOfType(t->Type()); + for (size_t j = 0; j < s.slice_id.size(); ++j) { + if ((int64_t)s.slice_id[j] == ps::HashMap::NOT_ADD_ID) { + memset(buffer + offset + j * chunk_size, 0, chunk_size); + } else { + memcpy(buffer + offset + j * chunk_size, t->Raw(s.slice_id[j]), chunk_size); + } + } + offset += s.slice_id.size() * chunk_size; } - + Fragment buf(buffer, buffer_size); + bufs->push_back(std::move(buf)); return ps::Status::Ok(); } }; template <> -class WrapperDataSerializer: - public Serializer, ps::WrapperData > { - public: - virtual ps::Status Serialize(ps::WrapperData* data, +class WrapperDataSerializer >: + public Serializer >, ps::WrapperData > > { +public: + virtual ps::Status Serialize(ps::WrapperData >* data, std::vector* bufs, MemGuard& mem_guard) { - static char zero_buffer[1<<16] = {0}; - ps::server::TensorSlices& s = data->Internal(); - ps::Tensor* t = &s.tensor; - SerializeHelper::Serialize( - &t->state_->type, bufs, mem_guard); - ps::TensorShape new_shape; - if (s.dim_part < 0) { - new_shape = t->state_->shape; - } else { - std::vector dims(1, s.slice_size); - if ((size_t)s.dim_part > t->state_->shape.Size()) { - return Status::ArgumentError("Slice dim_part Error"); + size_t buffer_size = sizeof(size_t); + for (size_t i = 0; i < data->Internal().size(); i++) { + buffer_size += sizeof(ps::DataType) + sizeof(size_t); + const ps::server::Slices& s = data->Internal()[i]; + ps::Tensor* tensor = s.variable->GetData(); + if (s.dim_part < 0) { + buffer_size += tensor->Shape().Size() * sizeof(size_t); + } else { + buffer_size += (tensor->Shape().Size() - s.dim_part + 1) * sizeof(size_t); } - dims.insert(dims.end(), t->state_->shape.Dims().begin() + s.dim_part, t->state_->shape.Dims().end()); - new_shape = TensorShape(dims); - new_shape.Set(0, s.slice_id.size()); + buffer_size += s.slice_id.size() * s.slice_size * SizeOfType(tensor->Type()); } - SerializeHelper::Serialize( - mem_guard.AllocateElement(new_shape.Size()), - bufs, mem_guard); - size_t buf_size = t->Shape().Size() * sizeof(size_t); - char* shape_buf = mem_guard.AllocateBuffer(buf_size); - memcpy(shape_buf, &(new_shape.dims_[0]), buf_size); - bufs->push_back(Fragment({.base=shape_buf, .size=buf_size})); - - if (s.slice_id.size() <= 16) { - char* base = t->Raw(); - CASES(t->Type(), { - for (size_t i = 0; i < s.slice_id.size(); ++i) { - if ((int64_t)s.slice_id[i] == ps::HashMap::NOT_ADD_ID) { - bufs->push_back(Fragment({.base=zero_buffer, .size=sizeof(T) * s.slice_size})); - } else { - bufs->push_back(Fragment({.base=base + s.slice_id[i] * s.slice_size * sizeof(T), - .size=sizeof(T) * s.slice_size})); + char* buffer = mem_guard.AllocateBuffer(buffer_size); + *((size_t*)buffer) = data->Internal().size(); + size_t offset = sizeof(size_t); + for (size_t i = 0; i < data->Internal().size(); i++) { + const ps::server::Slices& s = data->Internal()[i]; + const ps::Tensor* t = s.variable->GetData(); + *(ps::DataType*)(buffer + offset) = t->state_->type; + offset += sizeof(ps::DataType); + ps::TensorShape new_shape; + if (s.dim_part < 0) { + new_shape = t->state_->shape; + } else { + std::vector dims(1, s.slice_id.size()); + if ((size_t)s.dim_part >= t->state_->shape.Size()) { + return Status::ArgumentError("Slice dim_part Error"); } - } - }); - } else { - size_t buf_size = 0; - CASES(t->Type(), { - buf_size = s.slice_id.size() * s.slice_size * sizeof(T); - }); - char* slice_buf = mem_guard.AllocateBuffer(buf_size); - char* base = t->Raw(); - CASES(t->Type(), { - size_t chunk_size = s.slice_size * sizeof(T); - for (size_t i = 0; i < s.slice_id.size(); ++i) { - if ((int64_t)s.slice_id[i] == ps::HashMap::NOT_ADD_ID) { - memset(slice_buf + i * chunk_size, 0, chunk_size); + dims.insert(dims.end(), t->state_->shape.Dims().begin() + s.dim_part, t->state_->shape.Dims().end()); + new_shape = TensorShape(dims); + } + *(size_t*)(buffer + offset) = new_shape.Size(); + offset += sizeof(size_t); + memcpy(buffer + offset, &(new_shape.dims_[0]), new_shape.Size() * sizeof(size_t)); + offset += new_shape.Size() * sizeof(size_t); + + size_t chunk_size = s.slice_size * SizeOfType(t->Type()); + for (size_t j = 0; j < s.slice_id.size(); ++j) { + if ((int64_t)s.slice_id[j] == ps::HashMap::NOT_ADD_ID) { + memset(buffer + offset + j * chunk_size, 0, chunk_size); } else { - memcpy(slice_buf + i * chunk_size, base + s.slice_id[i] * chunk_size, chunk_size); + memcpy(buffer + offset + j * chunk_size, t->Raw(s.slice_id[j]), chunk_size); } } - }); - bufs->push_back(Fragment({.base=slice_buf, .size=buf_size})); + offset += s.slice_id.size() * chunk_size; } - + Fragment buf(buffer, buffer_size); + bufs->push_back(std::move(buf)); return ps::Status::Ok(); } }; @@ -760,9 +1136,23 @@ DESERIALIZER_REGISTER(ps::serializer::WrapperDataDerializer); SERIALIZER_REGISTER(ps::serializer::WrapperDataSerializer); DESERIALIZER_REGISTER(ps::serializer::WrapperDataDerializer); +SERIALIZER_REGISTER(ps::serializer::WrapperDataSerializer >); +DESERIALIZER_REGISTER(ps::serializer::WrapperDataDerializer >); +SERIALIZER_REGISTER(ps::serializer::WrapperDataSerializer >); +DESERIALIZER_REGISTER(ps::serializer::WrapperDataDerializer >); +SERIALIZER_REGISTER(ps::serializer::WrapperDataSerializer >); +DESERIALIZER_REGISTER(ps::serializer::WrapperDataDerializer >); +SERIALIZER_REGISTER(ps::serializer::WrapperDataSerializer >); +DESERIALIZER_REGISTER(ps::serializer::WrapperDataDerializer >); +SERIALIZER_REGISTER(ps::serializer::WrapperDataSerializer >); +DESERIALIZER_REGISTER(ps::serializer::WrapperDataDerializer >); + SERIALIZER_REGISTER(ps::serializer::WrapperDataSerializer); DESERIALIZER_REGISTER(ps::serializer::WrapperDataDerializer); +SERIALIZER_REGISTER(ps::serializer::WrapperDataSerializer >); +DESERIALIZER_REGISTER(ps::serializer::WrapperDataDerializer >); + SERIALIZER_REGISTER(ps::serializer::WrapperDataSerializer); DESERIALIZER_REGISTER(ps::serializer::WrapperDataDerializer); @@ -775,11 +1165,16 @@ DESERIALIZER_REGISTER(ps::serializer::WrapperDataDerializer); SERIALIZER_REGISTER(ps::serializer::WrapperDataSerializer); DESERIALIZER_REGISTER(ps::serializer::WrapperDataDerializer); +SERIALIZER_REGISTER(ps::serializer::WrapperDataSerializer >); +DESERIALIZER_REGISTER(ps::serializer::WrapperDataDerializer >); + SERIALIZER_REGISTER(ps::serializer::WrapperDataSerializer >); DESERIALIZER_REGISTER(ps::serializer::WrapperDataDerializer >); -SERIALIZER_REGISTER(ps::serializer::WrapperDataSerializer); SERIALIZER_REGISTER(ps::serializer::WrapperDataSerializer); +SERIALIZER_REGISTER(ps::serializer::WrapperDataSerializer >); + +SERIALIZER_REGISTER(ps::serializer::WrapperDataSerializer >); SERIALIZER_REGISTER(ps::serializer::NoneInitializerSerializer); DESERIALIZER_REGISTER(ps::serializer::NoneInitializerDeserializer); @@ -793,6 +1188,9 @@ DESERIALIZER_REGISTER(ps::serializer::TruncatedNormalInitializerDeserializer); SERIALIZER_REGISTER(ps::serializer::NormalInitializerSerializer); DESERIALIZER_REGISTER(ps::serializer::NormalInitializerDeserializer); +SERIALIZER_REGISTER(ps::serializer::OrthogonalInitializerSerializer); +DESERIALIZER_REGISTER(ps::serializer::OrthogonalInitializerDeserializer); + SERIALIZER_REGISTER(ps::serializer::UniformUnitScalingInitializerSerializer); DESERIALIZER_REGISTER(ps::serializer::UniformUnitScalingInitializerDeserializer); diff --git a/xdl/ps-plus/ps-plus/common/status.h b/xdl/ps-plus/ps-plus/common/status.h index dbff1508..ccaceaa7 100644 --- a/xdl/ps-plus/ps-plus/common/status.h +++ b/xdl/ps-plus/ps-plus/common/status.h @@ -47,6 +47,7 @@ class Status { kServerDeserializeFailed, kClientSerializeFailed, kClientDeserializeFailed, + kFileQueueNeedWait, kUnknown }; @@ -109,7 +110,9 @@ class Status { static Status ServerDeserializeFailed(const std::string& msg) { return Status(kServerDeserializeFailed, msg);} static Status ClientSerializeFailed(const std::string& msg) { return Status(kClientSerializeFailed, msg);} static Status ClientDeserializeFailed(const std::string& msg) { return Status(kClientDeserializeFailed, msg);} + static Status FileQueueNeedWait(const std::string& msg) { return Status(kFileQueueNeedWait, msg);} static Status Unknown(const std::string& msg) { return Status(kUnknown, msg); } + private: friend class ps::serializer::SerializeHelper; diff --git a/xdl/ps-plus/ps-plus/common/tensor.cc b/xdl/ps-plus/ps-plus/common/tensor.cc index 824a2531..acf4faba 100644 --- a/xdl/ps-plus/ps-plus/common/tensor.cc +++ b/xdl/ps-plus/ps-plus/common/tensor.cc @@ -14,41 +14,33 @@ limitations under the License. ==============================================================================*/ #include "ps-plus/common/tensor.h" +#include "ps-plus/common/logging.h" #include namespace ps { -Tensor::Tensor() : state_(nullptr) {} +Tensor::Tensor(TType tensor_type) : state_(nullptr), tensor_type_(tensor_type) {} -Tensor::Tensor(DataType type, const TensorShape& shape, Initializer* initializer, bool init) - : state_(new State( - new char[SizeOfType(type) * shape.NumElements()], - type, shape, initializer, true)) { - if (init) { - state_->initializer->MultiThreadInit(state_->buffer, state_->type, state_->shape.NumElements()); - } -} - -Tensor::Tensor(DataType type, TensorShape&& shape, Initializer* initializer, bool init) - : state_(new State( - new char[SizeOfType(type) * shape.NumElements()], - type, std::move(shape), initializer, true)) { - if (init) { - state_->initializer->MultiThreadInit(state_->buffer, state_->type, state_->shape.NumElements()); +Tensor::Tensor(DataType type, const TensorShape& shape, Initializer* initializer, TType tensor_type, bool init) { + tensor_type_ = tensor_type; + if (tensor_type == TType::kContinuous) { + state_ = new ContinuousState(new char[SizeOfType(type) * shape.NumElements()], type, shape, initializer, true, init); + } else { + state_ = new SegmentState(type, shape, initializer, init, DEFAULT_SEGMENT_SIZE); } } Tensor::Tensor(DataType type, const TensorShape& shape, char* buffer, Initializer* initializer) - : state_(new State(buffer, type, shape, initializer, false)) {} + : state_(new ContinuousState(buffer, type, shape, initializer, false, false)), tensor_type_(TType::kContinuous) {} -Tensor::Tensor(DataType type, TensorShape&& shape, char* buffer, Initializer* initializer) - : state_(new State(buffer, type, std::move(shape), initializer, false)) {} +Tensor::Tensor(DataType type, const TensorShape& shape, Initializer* initializer, bool init, size_t segment_size) + : state_(new SegmentState(type, shape, initializer, init, segment_size)), tensor_type_(TType::kSegment) {} -Tensor::Tensor(const Tensor& rhs) : state_(rhs.state_) { +Tensor::Tensor(const Tensor& rhs) : state_(rhs.state_), tensor_type_(rhs.tensor_type_) { Ref(); } -Tensor::Tensor(Tensor&& rhs) : state_(rhs.state_) { +Tensor::Tensor(Tensor&& rhs) : state_(rhs.state_), tensor_type_(rhs.tensor_type_) { rhs.state_ = nullptr; } @@ -59,46 +51,113 @@ Tensor::~Tensor() { Tensor& Tensor::operator=(const Tensor& rhs) { UnRef(); state_ = rhs.state_; + tensor_type_ = rhs.tensor_type_; Ref(); return *this; } Tensor& Tensor::operator=(Tensor&& rhs) { std::swap(state_, rhs.state_); + std::swap(tensor_type_, rhs.tensor_type_); return *this; } -void Tensor::ReShape(const TensorShape& shape) { - size_t old_size = state_->shape.NumElements() * SizeOfType(state_->type); - size_t new_size = shape.NumElements() * SizeOfType(state_->type); +Status Tensor::InitChunkFrom(const size_t& start_index) { + if (tensor_type_ == TType::kContinuous) { + return Status::NotImplemented("ContinuousTensor can't support InitChunkFrom function"); + } + SegmentState* state = dynamic_cast(state_); + size_t trunk_start = start_index % state->segment_size; + if (trunk_start == 0) { + return Status::Ok(); + } + void* ptr = state->Raw(start_index); + state->initializer->MultiThreadInit(ptr, state->type, (state->segment_size - trunk_start) * state->slice_size); + //LOG_INFO("Call InitChunkFrom in tensor, start %ld, trunk_start %ld, size %ld", start_index, trunk_start, (state->segment_size - trunk_start) * state->slice_size); + return Status::Ok(); +} - State* new_state = new State(new char[new_size], state_->type, shape, state_->initializer->Clone(), true); - if (new_size <= old_size) { - QuickMemcpy(new_state->buffer, state_->buffer, new_size); +void Tensor::ReShape(const TensorShape& shape) { + if (tensor_type_ == TType::kContinuous) { + size_t old_size = state_->shape.NumElements() * SizeOfType(state_->type); + size_t new_size = shape.NumElements() * SizeOfType(state_->type); + ContinuousState* new_state = new ContinuousState(new char[new_size], state_->type, shape, state_->initializer->Clone(), true, false); + ContinuousState* old_state = dynamic_cast(state_); + if (new_size <= old_size) { + QuickMemcpy(new_state->buffer, old_state->buffer, new_size); + } else { + QuickMemcpy(new_state->buffer, old_state->buffer, old_size); + new_state->initializer->MultiThreadInit(new_state->buffer + old_size, new_state->type, new_state->shape.NumElements() - state_->shape.NumElements()); + } + UnRef(); + state_ = new_state; } else { - QuickMemcpy(new_state->buffer, state_->buffer, old_size); - new_state->initializer->MultiThreadInit(new_state->buffer + old_size, new_state->type, new_state->shape.NumElements() - state_->shape.NumElements()); + SegmentState* state = dynamic_cast(state_); + if (state == nullptr) { + std::cerr << "state_ for segment tensor is nullptr\n"; + abort(); + } + size_t index = shape[0]/state->segment_size; + if (state->buffers.size() > index && state->buffers[index] != nullptr) { + return; + } + while (state->buffers.size() <= index) { + char* ptr = new char[state->chunk_size]; + state->initializer->MultiThreadInit(ptr, state->type, state->slice_size * state->segment_size); + state->buffers.push_back(ptr); + } + while (state->buffers[index] == nullptr) { + } + state->shape.Set(0, state->buffers.size() * state->segment_size); } - UnRef(); - state_ = new_state; } -void Tensor::Clear(size_t beg, size_t size) { - state_->initializer->MultiThreadInit(state_->buffer + beg * SizeOfType(state_->type), state_->type, size); +void Tensor::ClearId(size_t id) { + SegmentState* state = dynamic_cast(state_); + state_->initializer->MultiThreadInit(state->Raw(id), state->type, state->slice_size); } -void Tensor::ClearId(size_t id) { - size_t size = state_->shape.NumElements() / state_->shape[0]; - Clear(id * size, size); +size_t Tensor::SegmentSize() const { + SegmentState* state = dynamic_cast(state_); + if (state == nullptr) { + std::cerr << "Only Segment tensor can call SegmentSize\n"; + abort(); + } + return state->segment_size; +} + +void Tensor::SetOwnBuffer(bool own) { + ContinuousState* state = dynamic_cast(state_); + if (state == nullptr) { + std::cerr << "Only Continuous tensor can call SetOwnBuffer\n"; + abort(); + } + state->own_buffer = own; } -Tensor Tensor::Clone() { +Tensor Tensor::Clone() const { if (state_ == nullptr) { return Tensor(); } - Tensor ret(state_->type, state_->shape, state_->initializer->Clone(), false); - memcpy(ret.state_->buffer, state_->buffer, state_->shape.NumElements() * SizeOfType(state_->type)); - return ret; + Initializer* init = nullptr; + if (state_->initializer != nullptr) { + init = state_->initializer->Clone(); + } + if (tensor_type_ == TType::kContinuous) { + Tensor ret(state_->type, state_->shape, init, TType::kContinuous, false); + ContinuousState* this_state = dynamic_cast(state_); + ContinuousState* ret_state = dynamic_cast(ret.state_); + memcpy(ret_state->buffer, this_state->buffer, state_->shape.NumElements() * SizeOfType(state_->type)); + return ret; + } else { + Tensor ret(state_->type, state_->shape, init, TType::kSegment, false); + SegmentState* this_state = dynamic_cast(state_); + SegmentState* ret_state = dynamic_cast(ret.state_); + for (size_t i = 0; i < this_state->buffers.size(); i++) { + memcpy(ret_state->buffers[i], this_state->buffers[i], this_state->chunk_size); + } + return ret; + } } void Tensor::UnRef() { @@ -106,9 +165,6 @@ void Tensor::UnRef() { return; } if (--state_->ref == 0) { - if (state_->own_buffer) { - delete [] state_->buffer; - } delete state_; state_ = nullptr; } @@ -121,5 +177,7 @@ void Tensor::Ref() { state_->ref++; } +const int64_t Tensor::DEFAULT_SEGMENT_SIZE = 1 << 12; + } diff --git a/xdl/ps-plus/ps-plus/common/tensor.h b/xdl/ps-plus/ps-plus/common/tensor.h index 597e4655..87c18c1f 100644 --- a/xdl/ps-plus/ps-plus/common/tensor.h +++ b/xdl/ps-plus/ps-plus/common/tensor.h @@ -16,76 +16,150 @@ limitations under the License. #ifndef PS_PLUS_COMMON_TENSOR_H_ #define PS_PLUS_COMMON_TENSOR_H_ +#include +#include +#include +#include "tbb/parallel_for.h" +#include "tbb/concurrent_vector.h" + #include "ps-plus/common/types.h" #include "ps-plus/common/tensor_shape.h" #include "ps-plus/common/initializer.h" #include "ps-plus/common/thread_pool.h" -#include -#include - namespace ps { class Tensor { public: - Tensor(); - - Tensor(DataType type, const TensorShape& shape, Initializer* initializer, bool init = true); - - Tensor(DataType type, TensorShape&& shape, Initializer* initializer, bool init = true); - + enum TType { + kContinuous, + kSegment, + }; + Tensor(TType tensor_type = TType::kContinuous); + Tensor(DataType type, const TensorShape& shape, Initializer* initializer, TType tensor_type = TType::kContinuous, bool init = true); + // used for only kContinuous tensor Tensor(DataType type, const TensorShape& shape, char* buffer, Initializer* initializer); - - Tensor(DataType type, TensorShape&& shape, char* buffer, Initializer* initializer); - + // used for only kSegment tensor + Tensor(DataType type, const TensorShape& shape, Initializer* initializer, bool init, size_t segment_size); + Tensor(const Tensor& rhs); - Tensor(Tensor&& rhs); - ~Tensor(); Tensor& operator=(const Tensor& rhs); - Tensor& operator=(Tensor&& rhs); - bool Initialized() { return state_ != nullptr; } + bool Initialized() const { return state_ != nullptr; } DataType Type() const { return state_->type; } - const TensorShape& Shape() const { return state_->shape; } Initializer* GetInitializer() const { return state_->initializer.get(); } + const TensorShape& Shape() const { return state_->shape; } + TType TensorType() const {return tensor_type_;} + void SetInititalizer(Initializer* init) {state_->initializer.reset(init);} + Status InitChunkFrom(const size_t& start_index); // Note: We don't check the type_. Everyone who call following method // should use CASES or just check the type_; + // Not safe to use for Segment Tensor; template T* Raw() const { - return reinterpret_cast(state_->buffer); + return reinterpret_cast(state_->Raw(0)); } - void ReShape(const TensorShape& shape); - - // Note: We don't check the beg and size - void Clear(size_t beg, size_t size); + template + T* Raw(size_t id) const { + return reinterpret_cast(state_->Raw(id)); + } + void ReShape(const TensorShape& shape); // Note: We don't check id void ClearId(size_t id); + Tensor Clone() const; - Tensor Clone(); + size_t SegmentSize() const; + void SetOwnBuffer(bool own); + const static int64_t DEFAULT_SEGMENT_SIZE; private: void UnRef(); void Ref(); struct State { - State(char* buffer_, DataType type_, const TensorShape& shape_, Initializer* initializer_, bool own_buffer_) - : buffer(buffer_), type(type_), shape(shape_), initializer(initializer_), own_buffer(own_buffer_), ref(1) {} - State(char* buffer_, DataType type_, TensorShape&& shape_, Initializer* initializer_, bool own_buffer_) - : buffer(buffer_), type(type_), shape(std::move(shape_)), initializer(initializer_), own_buffer(own_buffer_), ref(1) {} - char* buffer; + State(DataType type_, const TensorShape& shape_, Initializer* initializer_) + : type(type_), shape(shape_), initializer(initializer_), ref(1) { + } + virtual void* Raw(size_t id) = 0; DataType type; TensorShape shape; std::unique_ptr initializer; - bool own_buffer; std::atomic ref; + virtual ~State() {} + }; + + struct ContinuousState: public State { + ContinuousState(char* buffer_, DataType type_, const TensorShape& shape_, Initializer* initializer_, bool own_buffer_, bool init_) + : State(type_, shape_, initializer_), buffer(buffer_), own_buffer(own_buffer_) { + if (init_) { + initializer->MultiThreadInit(buffer, type, shape.NumElements()); + } + } + virtual void* Raw(size_t id) { + if (id == 0) { + return buffer; + } + if (shape.IsScalar()) { + return nullptr; + } + return buffer + id * shape.NumElements() / shape[0] * SizeOfType(type); + } + virtual ~ContinuousState() { + if (own_buffer) { + delete [] buffer; + buffer = nullptr; + } + } + bool own_buffer; + char* buffer; + }; + + struct SegmentState: public State { + SegmentState(DataType type_, const TensorShape& shape_, Initializer* initializer_, bool init_, size_t segment_size_) + : State(type_, shape_, initializer_), segment_size(segment_size_) { + if (shape_.IsScalar()) { + throw std::invalid_argument("SegmentState don't allow scalar variable"); + } + slice_size = shape_.NumElements() / shape_[0]; + chunk_size = segment_size_ * SizeOfType(type_) * slice_size; + buffers.grow_to_at_least(shape_[0]/segment_size + (shape_[0] % segment_size == 0 ? 0 : 1), nullptr); + for (size_t i = 0; i < buffers.size(); i++) { + buffers[i] = new char[chunk_size]; + } + if (init_) { + tbb::parallel_for(tbb::blocked_range(0, buffers.size() - 1), [&](tbb::blocked_range& r) { + for (size_t i = r.begin(); i < r.end(); i++) { + initializer_->MultiThreadInit(buffers[i], type_, segment_size * slice_size); + } + }); + } + // 因为我们有预留的空间,所以最后一个buffer必须初始化 + if (initializer_ != nullptr) { + initializer_->MultiThreadInit(buffers[buffers.size()-1], type_, segment_size * slice_size); + } + shape.Set(0, buffers.size() * segment_size); + } + virtual ~SegmentState() { + for (size_t i = 0; i < buffers.size(); i++) { + delete [] buffers[i]; + } + } + virtual void* Raw(size_t id) { + return buffers[id/segment_size] + (id%segment_size) * slice_size * SizeOfType(type); + } + size_t segment_size; + size_t chunk_size; + size_t slice_size; + tbb::concurrent_vector buffers; }; State* state_; + TType tensor_type_; }; } diff --git a/xdl/ps-plus/ps-plus/common/tensor_shape.h b/xdl/ps-plus/ps-plus/common/tensor_shape.h index a171119e..ebb565c3 100644 --- a/xdl/ps-plus/ps-plus/common/tensor_shape.h +++ b/xdl/ps-plus/ps-plus/common/tensor_shape.h @@ -40,6 +40,11 @@ class TensorShape { ComputeNumElements(); } + TensorShape(const TensorShape& rhs) + : dims_(rhs.dims_) { + ComputeNumElements(); + } + const std::vector& Dims() const { return dims_; } @@ -81,6 +86,15 @@ class TensorShape { return !(*this == rhs); } + std::string ToString() const { + std::string s; + for (auto& item : dims_) { + s += std::to_string(item) + ","; + } + if (!s.empty()) { s.pop_back(); } + return s; + } + private: void ComputeNumElements() { num_elements_ = 1; diff --git a/xdl/ps-plus/ps-plus/common/test/INIParser_test.cc b/xdl/ps-plus/ps-plus/common/test/INIParser_test.cc index 35c15b27..8fddb0c7 100644 --- a/xdl/ps-plus/ps-plus/common/test/INIParser_test.cc +++ b/xdl/ps-plus/ps-plus/common/test/INIParser_test.cc @@ -1,18 +1,3 @@ -/* Copyright (C) 2016-2018 Alibaba Group Holding Limited - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ - #include #include "gtest/gtest.h" diff --git a/xdl/ps-plus/ps-plus/common/test/bloom_filter_test.cc b/xdl/ps-plus/ps-plus/common/test/bloom_filter_test.cc new file mode 100644 index 00000000..b27458df --- /dev/null +++ b/xdl/ps-plus/ps-plus/common/test/bloom_filter_test.cc @@ -0,0 +1,62 @@ +/* Copyright (C) 2016-2018 Alibaba Group Holding Limited + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "gtest/gtest.h" +#include "ps-plus/common/bloom_filter.h" +#include + +TEST(BloomFilter, CountingBloomFilter) { + double fpp = 0.001; + uint64_t elem_size = 1000; + ps::CountingBloomFilter cbf(fpp, elem_size); + ASSERT_EQ(cbf.hash_function_number(), 10); + ASSERT_GE(cbf.bucket_size(), 14378); + + std::vector keys = { 1ul, 2ul, 3ul, 4ul, 1ul, 2ul, 2ul }; + int sz1 = sizeof(uint64_t); + int sz2 = sz1 * 2; + ASSERT_TRUE(cbf.Exists(nullptr, 0, 0)); + ASSERT_FALSE(cbf.Exists(nullptr, 0, 1)); + ASSERT_TRUE(cbf.Exists(&keys[0], sz1, 0)); + cbf.Insert(&keys[0], sz1); + ASSERT_TRUE(cbf.Exists(&keys[0], sz1, 1)); + // must be false + ASSERT_FALSE(cbf.Exists(&keys[0], sz1, 2)); + // may be false + EXPECT_FALSE(cbf.Exists(&keys[1], sz1, 1)); + // may be false + EXPECT_FALSE(cbf.Exists(&keys[0], sz2, 1)); + cbf.Insert(&keys[1], sz1); + cbf.Insert(&keys[2], sz1); + cbf.Insert(&keys[3], sz1); + cbf.Insert(&keys[4], sz1); + ASSERT_TRUE(cbf.Exists(&keys[4], sz1, 2)); + cbf.Insert(&keys[5], sz1); + cbf.Insert(&keys[6], sz1); + ASSERT_TRUE(cbf.Exists(&keys[1], sz1, 3)); +} + +TEST(BloomFilter, InsertedLookup) { + double fpp = 0.001; + uint64_t elem_size = 1000; + ps::CountingBloomFilter cbf(fpp, elem_size); + uint64_t key = 123; + for (int i = 0; i < 300; ++i) { + bool res = cbf.InsertedLookup(&key, sizeof(key), 255); + if (i >= 255) ASSERT_TRUE(res); + } + ASSERT_FALSE(cbf.InsertedLookup(&key, sizeof(key), 256)); +} + diff --git a/xdl/ps-plus/ps-plus/common/test/data_test.cc b/xdl/ps-plus/ps-plus/common/test/data_test.cc index ee722c26..136a390c 100644 --- a/xdl/ps-plus/ps-plus/common/test/data_test.cc +++ b/xdl/ps-plus/ps-plus/common/test/data_test.cc @@ -1,18 +1,3 @@ -/* Copyright (C) 2016-2018 Alibaba Group Holding Limited - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ - #include "gtest/gtest.h" #include "ps-plus/common/data.h" diff --git a/xdl/ps-plus/ps-plus/common/test/filesystem_test.cc b/xdl/ps-plus/ps-plus/common/test/filesystem_test.cc deleted file mode 100644 index cc1fdb6b..00000000 --- a/xdl/ps-plus/ps-plus/common/test/filesystem_test.cc +++ /dev/null @@ -1,181 +0,0 @@ -/* Copyright (C) 2016-2018 Alibaba Group Holding Limited - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ - -#include "gtest/gtest.h" -#include "test/util/hdfs_launcher.h" -#include "ps-plus/common/file_system.h" - -using ps::FileSystem; -using ps::Status; - -class FileSystemTest : public testing::Test { - public: - void SetUp() override { - if (false == ps::HDFSLauncher::Start()) { - skip_ = true; - } - if (skip_) { - GTEST_SKIP(); - } - } - - void TearDown() override { - if (!skip_) { - ps::HDFSLauncher::Stop(); - } - } - - private: - bool skip_ = false; -}; - -TEST_F(FileSystemTest, FileSystem) { - { - FileSystem::WriteStream *stream = nullptr; - FileSystem::OpenWriteStreamAny("./ows.txt", &stream, false); - ASSERT_NE(stream, nullptr); - } - - { - FileSystem::ReadStream *stream = nullptr; - FileSystem::OpenReadStreamAny("./ows.txt", &stream); - ASSERT_NE(stream, nullptr); - } - - { - Status st = FileSystem::MkdirAny("./any"); - ASSERT_TRUE(st.IsOk()); - - std::vector files; - st = FileSystem::ListDirectoryAny("./any", &files); - ASSERT_TRUE(st.IsOk()); - ASSERT_EQ(files.size(), 0); - } - - { - FileSystem::WriteStream *stream = nullptr; - FileSystem::OpenWriteStreamAny("./os.txt", &stream, false); - ASSERT_NE(stream, nullptr); - delete stream; - - Status st = FileSystem::RenameAny("./os.txt", "./so.txt"); - ASSERT_TRUE(st.IsOk()); - - st = FileSystem::RemoveAny("./so.txt"); - ASSERT_TRUE(st.IsOk()); - } - - { /* Test MemoryFileSystem */ - auto fs = ps::GetPlugin("memory"); - ASSERT_NE(fs, nullptr); - Status st = fs->Mkdir("./Wednesday"); - ASSERT_EQ(st, Status::Ok()); - - std::vector files; - st = fs->ListDirectory("./Wednesday", &files); - ASSERT_EQ(st, Status::Ok()); - ASSERT_EQ(files.size(), 0); - - FileSystem::WriteStream *stream = nullptr; - FileSystem::OpenWriteStreamAny("./Wed.txt", &stream, false); - ASSERT_NE(stream, nullptr); - delete stream; - - st = fs->Remove("./Wed.txt"); - ASSERT_EQ(st, Status::Ok()); - - st = fs->Rename("./Wed.txt", "./Thurs.txt"); - ASSERT_EQ(st, Status::Ok()); - } - - { /* Test FileFileSystem */ - auto fs = ps::GetPlugin("file"); - FileSystem::WriteStream *ws = nullptr; - Status st = fs->OpenWriteStream("ffs.txt", &ws); - ASSERT_EQ(st, Status::Ok()); - ASSERT_NE(ws, nullptr); - - int64_t sz = ws->WriteSimple("hello", 5); - ASSERT_EQ(sz, 5); - ws->Flush(); - - FileSystem::ReadStream *rs = nullptr; - st = fs->OpenReadStream("ffs.txt", &rs); - ASSERT_EQ(st, Status::Ok()); - ASSERT_NE(rs, nullptr); - char buf[32]; - sz = rs->ReadSimple(buf, sizeof(buf)); - ASSERT_EQ(sz, 5); - delete rs; - } - - { /* Test NoneFileSystem */ - auto fs = ps::GetPlugin("none"); - FileSystem::WriteStream *ws = nullptr; - Status st = fs->OpenWriteStream("nfs.txt", &ws); - ASSERT_EQ(st, Status::Ok()); - ASSERT_NE(ws, nullptr); - - FileSystem::ReadStream *rs = nullptr; - st = fs->OpenReadStream("ffs.txt", &rs); - ASSERT_NE(st, Status::Ok()); - ASSERT_EQ(rs, nullptr); - - st = fs->Mkdir("hello"); - ASSERT_EQ(st, Status::Ok()); - st = fs->ListDirectory("hello", nullptr); - ASSERT_EQ(st, Status::Ok()); - st = fs->Remove("hello"); - ASSERT_EQ(st, Status::Ok()); - st = fs->Rename("hello", "world"); - ASSERT_EQ(st, Status::Ok()); - } - - { /* Test HdfsFileSystem */ - auto fs = ps::GetPlugin("hdfs"); - FileSystem::WriteStream *ws = nullptr; - Status st = fs->OpenWriteStream("hdfs://127.0.0.1:9090/hfs.txt", &ws); - ASSERT_EQ(st, Status::Ok()); - ASSERT_NE(ws, nullptr); - - int64_t sz = ws->WriteSimple("hello", 5); - ASSERT_EQ(sz, 5); - ws->Flush(); - delete ws; - - FileSystem::ReadStream *rs = nullptr; - st = fs->OpenReadStream("hdfs://127.0.0.1:9090/hfs.txt", &rs); - ASSERT_EQ(st, Status::Ok()); - ASSERT_NE(rs, nullptr); - char buf[32]; - sz = rs->ReadSimple(buf, sizeof(buf)); - ASSERT_EQ(sz, 5); - delete rs; - - st = fs->Mkdir("test_dir"); - ASSERT_NE(st, Status::Ok()); - - std::vector files; - fs->ListDirectory("test_dir", &files); - ASSERT_EQ(files.size(), 0); - - st = fs->Remove("not_exist"); - ASSERT_NE(st, Status::Ok()); - - st = fs->Rename("left", "right"); - ASSERT_NE(st, Status::Ok()); - } - -} diff --git a/xdl/ps-plus/ps-plus/common/test/global_file_queue_test.cc b/xdl/ps-plus/ps-plus/common/test/global_file_queue_test.cc new file mode 100644 index 00000000..5d3790df --- /dev/null +++ b/xdl/ps-plus/ps-plus/common/test/global_file_queue_test.cc @@ -0,0 +1,280 @@ +/* Copyright (C) 2016-2018 Alibaba Group Holding Limited + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "gtest/gtest.h" +#include "ps-plus/common/global_file_queue.h" + +TEST(GlobalFileQueueTest, TestNotInit) { + ps::GlobalFileQueue queue; + ps::WorkerState file; + ps::Status st = queue.GetNextFile(0, &file); + ASSERT_EQ(ps::Status::kFileQueueNeedWait, st.Code()); +} + +TEST(GlobalFileQueueTest, TestSimple) { + ps::GlobalFileQueue queue; + std::vector paths = {"1.txt", "2.txt"}; + queue.Init(paths, 2, false); + ps::WorkerState file; + queue.GetNextFile(0, &file); + ASSERT_EQ("1.txt", file.path_); + ASSERT_EQ(0, file.begin_); + ASSERT_EQ(0, file.end_); + ASSERT_EQ(0, file.epoch_); + queue.GetNextFile(0, &file); + ASSERT_EQ("2.txt", file.path_); + ASSERT_EQ(0, file.begin_); + ASSERT_EQ(0, file.end_); + ASSERT_EQ(0, file.epoch_); + queue.GetNextFile(0, &file); + ASSERT_EQ("1.txt", file.path_); + ASSERT_EQ(0, file.begin_); + ASSERT_EQ(0, file.end_); + ASSERT_EQ(1, file.epoch_); + queue.GetNextFile(0, &file); + ASSERT_EQ("2.txt", file.path_); + ASSERT_EQ(0, file.begin_); + ASSERT_EQ(0, file.end_); + ASSERT_EQ(1, file.epoch_); + queue.GetNextFile(0, &file); + ASSERT_EQ("", file.path_); +} + +TEST(GlobalFileQueueTest, TestRestore) { + { + ps::GlobalFileQueue queue; + std::vector paths = {"1.txt", "2.txt", "3.txt", "4.txt"}; + ASSERT_TRUE(queue.Init(paths, 2, false).IsOk()); + ps::WorkerState file; + queue.GetNextFile(0, &file); + queue.GetNextFile(1, &file); + queue.GetNextFile(0, &file); + queue.GetNextFile(1, &file); + std::vector worker_states; + worker_states.push_back(ps::WorkerState(1, 11, 0, "1.txt")); + worker_states.push_back(ps::WorkerState(3, 13, 0, "3.txt")); + ASSERT_TRUE(queue.ReportWorkerState(0, worker_states).IsOk()); + worker_states.clear(); + worker_states.push_back(ps::WorkerState(2, 12, 0, "2.txt")); + worker_states.push_back(ps::WorkerState(4, 14, 0, "4.txt")); + ASSERT_TRUE(queue.ReportWorkerState(1, worker_states).IsOk()); + ASSERT_TRUE(queue.RestoreWorkerState(0).IsOk()); + ASSERT_TRUE(queue.RestoreWorkerState(1).IsOk()); + queue.GetNextFile(0, &file); + ASSERT_EQ("1.txt", file.path_); + ASSERT_EQ(1, file.begin_); + ASSERT_EQ(11, file.end_); + ASSERT_EQ(0, file.epoch_); + queue.GetNextFile(0, &file); + ASSERT_EQ("3.txt", file.path_); + ASSERT_EQ(3, file.begin_); + ASSERT_EQ(13, file.end_); + ASSERT_EQ(0, file.epoch_); + queue.GetNextFile(1, &file); + ASSERT_EQ("2.txt", file.path_); + ASSERT_EQ(2, file.begin_); + ASSERT_EQ(12, file.end_); + ASSERT_EQ(0, file.epoch_); + queue.GetNextFile(1, &file); + ASSERT_EQ("4.txt", file.path_); + ASSERT_EQ(4, file.begin_); + ASSERT_EQ(14, file.end_); + ASSERT_EQ(0, file.epoch_); + queue.GetNextFile(0, &file); + ASSERT_EQ("1.txt", file.path_); + ASSERT_EQ(0, file.begin_); + ASSERT_EQ(0, file.end_); + ASSERT_EQ(1, file.epoch_); + queue.GetNextFile(1, &file); + ASSERT_EQ("2.txt", file.path_); + ASSERT_EQ(0, file.begin_); + ASSERT_EQ(0, file.end_); + ASSERT_EQ(1, file.epoch_); + queue.GetNextFile(0, &file); + ASSERT_EQ("3.txt", file.path_); + ASSERT_EQ(0, file.begin_); + ASSERT_EQ(0, file.end_); + ASSERT_EQ(1, file.epoch_); + queue.GetNextFile(1, &file); + ASSERT_EQ("4.txt", file.path_); + ASSERT_EQ(0, file.begin_); + ASSERT_EQ(0, file.end_); + ASSERT_EQ(1, file.epoch_); + queue.GetNextFile(0, &file); + ASSERT_EQ("", file.path_); + queue.GetNextFile(1, &file); + ASSERT_EQ("", file.path_); + } + + { + ps::GlobalFileQueue queue; + std::vector paths = {"1.txt", "2.txt", "3.txt", "4.txt"}; + ASSERT_TRUE(queue.Init(paths, 2, false).IsOk()); + ps::WorkerState file; + queue.GetNextFile(0, &file); + queue.GetNextFile(1, &file); + queue.GetNextFile(0, &file); + queue.GetNextFile(1, &file); + std::vector worker_states; + worker_states.push_back(ps::WorkerState(1, 11, 0, "1.txt")); + ASSERT_TRUE(queue.ReportWorkerState(0, worker_states).IsOk()); + worker_states.clear(); + worker_states.push_back(ps::WorkerState(2, 12, 0, "2.txt")); + ASSERT_TRUE(queue.ReportWorkerState(1, worker_states).IsOk()); + ASSERT_TRUE(queue.RestoreWorkerState(0).IsOk()); + ASSERT_TRUE(queue.RestoreWorkerState(1).IsOk()); + queue.GetNextFile(0, &file); + ASSERT_EQ("1.txt", file.path_); + ASSERT_EQ(1, file.begin_); + ASSERT_EQ(11, file.end_); + ASSERT_EQ(0, file.epoch_); + queue.GetNextFile(0, &file); + ASSERT_EQ("3.txt", file.path_); + ASSERT_EQ(0, file.begin_); + ASSERT_EQ(0, file.end_); + ASSERT_EQ(0, file.epoch_); + queue.GetNextFile(1, &file); + ASSERT_EQ("2.txt", file.path_); + ASSERT_EQ(2, file.begin_); + ASSERT_EQ(12, file.end_); + ASSERT_EQ(0, file.epoch_); + queue.GetNextFile(1, &file); + ASSERT_EQ("4.txt", file.path_); + ASSERT_EQ(0, file.begin_); + ASSERT_EQ(0, file.end_); + ASSERT_EQ(0, file.epoch_); + queue.GetNextFile(0, &file); + ASSERT_EQ("1.txt", file.path_); + ASSERT_EQ(0, file.begin_); + ASSERT_EQ(0, file.end_); + ASSERT_EQ(1, file.epoch_); + queue.GetNextFile(1, &file); + ASSERT_EQ("2.txt", file.path_); + ASSERT_EQ(0, file.begin_); + ASSERT_EQ(0, file.end_); + ASSERT_EQ(1, file.epoch_); + queue.GetNextFile(0, &file); + ASSERT_EQ("3.txt", file.path_); + ASSERT_EQ(0, file.begin_); + ASSERT_EQ(0, file.end_); + ASSERT_EQ(1, file.epoch_); + queue.GetNextFile(1, &file); + ASSERT_EQ("4.txt", file.path_); + ASSERT_EQ(0, file.begin_); + ASSERT_EQ(0, file.end_); + ASSERT_EQ(1, file.epoch_); + queue.GetNextFile(0, &file); + ASSERT_EQ("", file.path_); + queue.GetNextFile(1, &file); + ASSERT_EQ("", file.path_); + } +} + +TEST(GlobalFileQueueTest, TestSerialize) { + { + ps::GlobalFileQueue queue; + std::vector paths = {"1.txt", "2.txt", "3.txt", "4.txt"}; + ASSERT_TRUE(queue.Init(paths, 2, false).IsOk()); + ps::WorkerState file; + queue.GetNextFile(0, &file); + queue.GetNextFile(1, &file); + queue.GetNextFile(0, &file); + queue.GetNextFile(1, &file); + std::string buf; + ASSERT_TRUE(queue.Serialize(&buf).IsOk()); + queue.GetNextFile(0, &file); + ASSERT_EQ("1.txt", file.path_); + ASSERT_EQ(0, file.begin_); + ASSERT_EQ(0, file.end_); + ASSERT_EQ(1, file.epoch_); + queue.GetNextFile(1, &file); + ASSERT_EQ("2.txt", file.path_); + ASSERT_EQ(0, file.begin_); + ASSERT_EQ(0, file.end_); + ASSERT_EQ(1, file.epoch_); + ASSERT_TRUE(queue.Deserialize(buf).IsOk()); + queue.GetNextFile(0, &file); + ASSERT_EQ("1.txt", file.path_); + ASSERT_EQ(0, file.begin_); + ASSERT_EQ(0, file.end_); + ASSERT_EQ(1, file.epoch_); + queue.GetNextFile(1, &file); + ASSERT_EQ("2.txt", file.path_); + ASSERT_EQ(0, file.begin_); + ASSERT_EQ(0, file.end_); + ASSERT_EQ(1, file.epoch_); + } + + { + ps::GlobalFileQueue queue; + std::vector paths = {"1.txt", "2.txt", "3.txt", "4.txt"}; + ASSERT_TRUE(queue.Init(paths, 2, false).IsOk()); + ps::WorkerState file; + queue.GetNextFile(0, &file); + queue.GetNextFile(1, &file); + queue.GetNextFile(0, &file); + queue.GetNextFile(1, &file); + std::vector worker_states; + worker_states.push_back(ps::WorkerState(1, 11, 0, "1.txt")); + ASSERT_TRUE(queue.ReportWorkerState(0, worker_states).IsOk()); + worker_states.clear(); + worker_states.push_back(ps::WorkerState(2, 12, 0, "2.txt")); + ASSERT_TRUE(queue.ReportWorkerState(1, worker_states).IsOk()); + std::string buf; + ASSERT_TRUE(queue.Serialize(&buf).IsOk()); + + worker_states.clear(); + worker_states.push_back(ps::WorkerState(3, 13, 0, "3.txt")); + ASSERT_TRUE(queue.ReportWorkerState(0, worker_states).IsOk()); + worker_states.clear(); + worker_states.push_back(ps::WorkerState(4, 14, 0, "4.txt")); + ASSERT_TRUE(queue.ReportWorkerState(1, worker_states).IsOk()); + + ASSERT_TRUE(queue.Deserialize(buf).IsOk()); + ASSERT_TRUE(queue.RestoreWorkerState(0).IsOk()); + ASSERT_TRUE(queue.RestoreWorkerState(1).IsOk()); + + queue.GetNextFile(0, &file); + ASSERT_EQ("1.txt", file.path_); + ASSERT_EQ(1, file.begin_); + ASSERT_EQ(11, file.end_); + ASSERT_EQ(0, file.epoch_); + queue.GetNextFile(1, &file); + ASSERT_EQ("2.txt", file.path_); + ASSERT_EQ(2, file.begin_); + ASSERT_EQ(12, file.end_); + ASSERT_EQ(0, file.epoch_); + queue.GetNextFile(0, &file); + ASSERT_EQ("3.txt", file.path_); + ASSERT_EQ(0, file.begin_); + ASSERT_EQ(0, file.end_); + ASSERT_EQ(0, file.epoch_); + queue.GetNextFile(1, &file); + EXPECT_EQ("4.txt", file.path_); + EXPECT_EQ(0, file.begin_); + EXPECT_EQ(0, file.end_); + EXPECT_EQ(0, file.epoch_); + queue.GetNextFile(0, &file); + ASSERT_EQ("1.txt", file.path_); + ASSERT_EQ(0, file.begin_); + ASSERT_EQ(0, file.end_); + ASSERT_EQ(1, file.epoch_); + queue.GetNextFile(0, &file); + ASSERT_EQ("2.txt", file.path_); + ASSERT_EQ(0, file.begin_); + ASSERT_EQ(0, file.end_); + ASSERT_EQ(1, file.epoch_); + } +} diff --git a/xdl/ps-plus/ps-plus/common/test/hasher_test.cc b/xdl/ps-plus/ps-plus/common/test/hasher_test.cc index 6a50aaa3..237fbc92 100644 --- a/xdl/ps-plus/ps-plus/common/test/hasher_test.cc +++ b/xdl/ps-plus/ps-plus/common/test/hasher_test.cc @@ -1,18 +1,3 @@ -/* Copyright (C) 2016-2018 Alibaba Group Holding Limited - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ - #include "gtest/gtest.h" #include "ps-plus/common/hasher.h" @@ -22,4 +7,13 @@ TEST(HasherTest, Hasher) { int value = Hasher::Hash128(123456789, 987654321); ASSERT_NE(value, 0); ASSERT_NE(value, 1); + + value = Hasher::Hash64(123456789); + ASSERT_EQ(value, 52501); + value = Hasher::Hash64(-123456789); + ASSERT_EQ(value, 13035); + value = Hasher::Hash64(0); + ASSERT_EQ(value, 0); + value = Hasher::Hash64(65536); + ASSERT_EQ(value, 0); } diff --git a/xdl/ps-plus/ps-plus/common/test/hashmap_test.cc b/xdl/ps-plus/ps-plus/common/test/hashmap_test.cc index 2767c396..74593912 100644 --- a/xdl/ps-plus/ps-plus/common/test/hashmap_test.cc +++ b/xdl/ps-plus/ps-plus/common/test/hashmap_test.cc @@ -1,269 +1,162 @@ -/* Copyright (C) 2016-2018 Alibaba Group Holding Limited - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ - #include #include "gtest/gtest.h" #include "ps-plus/common/hashmap.h" +#include "ps-plus/common/thread_pool.h" +using ps::Hash128Key; using ps::HashMap; -using ps::HashMapItem; +using ps::Range; +using ps::Status; using std::vector; -TEST(HashMapTest, Get) { - HashMap hashmap(1280); - int64_t keys[] = {1, 2, 3, 4}; - vector ids; - vector reused_ids; - int ret = hashmap.Get(keys, 2, 2, &ids, &reused_ids); - ASSERT_EQ(0, ret); - EXPECT_EQ(2u, ids.size()); +TEST(HashMap64Test, Get) { + std::unique_ptr hashmap(new ps::HashMapImpl(1)); + int64_t keys[] = {1, 2, 3, 4}; + vector ids; + tbb::concurrent_vector reused_ids; + size_t filtered; + int64_t max = hashmap->Get((const int64_t*)keys, 4ul, false, 1.0, &ids, &reused_ids, &filtered); + EXPECT_EQ(4, max); + EXPECT_EQ(4u, ids.size()); // NOTE: the latter part of keys would get id first - EXPECT_EQ(0, ids[1]); - EXPECT_EQ(1, ids[0]); - EXPECT_EQ(0u, reused_ids.size()); - - int64_t keys1[] = {1, 2, 3, 4, 13, 14}; - ret = hashmap.Get(keys1, 3, 2, &ids, &reused_ids); - ASSERT_EQ(0, ret); - EXPECT_EQ(3u, ids.size()); - // alloc new id - EXPECT_EQ(2, ids[2]); - // old id - EXPECT_EQ(0, ids[1]); - EXPECT_EQ(1, ids[0]); + size_t total = 0; + for (size_t i = 0; i < 4; i++) { + total += ids[i]; + } + EXPECT_EQ(6ul, total); + EXPECT_EQ(0ul, reused_ids.size()); + + int64_t keys1[] = {4, 3, 2, 1, 13, 14}; + max = hashmap->Get((const int64_t*)keys1, 6ul, false, 1.0, &ids, &reused_ids, &filtered); + EXPECT_EQ(6, max); + EXPECT_EQ(6u, ids.size()); + total = 0; + for (size_t i = 0; i < 4; i++) { + total += ids[i]; + } + EXPECT_EQ(6ul, total); + total = 0; + for (size_t i = 4; i < 6; i++) { + total += ids[i]; + } + EXPECT_EQ(9u, total); EXPECT_EQ(0u, reused_ids.size()); } -TEST(HashMapTest, GetWithVerChange) { - HashMap hashmap(1280); - hashmap.SetMaxCache(2); - int64_t keys[] = {1, 2, 3, 4, 5, 6}; - vector ids; - vector reused_ids; - int ret = hashmap.Get(keys, 3, 2, &ids, &reused_ids); - ASSERT_EQ(0, ret); - EXPECT_EQ(3u, ids.size()); +TEST(HashMap128Test, Get) { + std::unique_ptr hashmap(new ps::HashMapImpl(1)); + int64_t keys[] = {1, 2, 3, 4}; + vector ids; + tbb::concurrent_vector reused_ids; + size_t filtered; + int64_t max = hashmap->Get((const int64_t*)keys, 2ul, false, 1.0, &ids, &reused_ids, &filtered); + EXPECT_EQ(2, max); + EXPECT_EQ(2u, ids.size()); // NOTE: the latter part of keys would get id first - EXPECT_EQ(0, ids[2]); - EXPECT_EQ(1, ids[1]); - EXPECT_EQ(2, ids[0]); + size_t total = 0; + for (size_t i = 0; i < 2; i++) { + total += ids[i]; + } + EXPECT_EQ(1, total); EXPECT_EQ(0u, reused_ids.size()); - int64_t keys1[] = {1, 2, 3, 4, 7, 8}; - ret = hashmap.Get(keys1, 3, 2, &ids, &reused_ids); - ASSERT_EQ(0, ret); + int64_t keys1[] = {4, 3, 2, 1, 13, 14}; + max = hashmap->Get((const int64_t*)keys1, 3ul, false, 1.0, &ids, &reused_ids, &filtered); + EXPECT_EQ(5, max); EXPECT_EQ(3u, ids.size()); - // <7, 8> new id:3 - EXPECT_EQ(3, ids[2]); - EXPECT_EQ(1, ids[1]); - EXPECT_EQ(2, ids[0]); + total = 0; + for (size_t i = 0; i < 3; i++) { + total += ids[i]; + } + EXPECT_EQ(9, total); EXPECT_EQ(0u, reused_ids.size()); -} +} -TEST(HashMapTest, Del) { - HashMap hashmap(1280); +TEST(HashMap128Test, BloomFilter) { + std::unique_ptr hashmap(new ps::HashMapImpl(1)); + hashmap->SetBloomFilterThrethold(2); int64_t keys[] = {1, 2, 3, 4}; - vector ids; - vector reused_ids; - int ret = hashmap.Get(keys, 2, 2, &ids, &reused_ids); - ASSERT_EQ(0, ret); + vector ids; + tbb::concurrent_vector reused_ids; + size_t filtered; + int64_t max = hashmap->Get((const int64_t*)keys, 2ul, false, 1.0, &ids, &reused_ids, &filtered); + EXPECT_EQ(max, 0); + max = hashmap->Get((const int64_t*)keys, 2ul, false, 1.0, &ids, &reused_ids, &filtered); + EXPECT_EQ(max, 2); +} + + +TEST(HashMap128Test, Erase) { + std::unique_ptr hashmap(new ps::HashMapImpl(1)); + int64_t keys[] = {1, 2}; + vector ids; + tbb::concurrent_vector reused_ids; + size_t filtered; + int64_t max = hashmap->Get(keys, 1ul, false, 1.0, &ids, &reused_ids, &filtered); + ASSERT_EQ(1, max); + ASSERT_EQ(1, ids.size()); + ASSERT_EQ(0, ids[0]); + ASSERT_EQ(0, reused_ids.size()); + int64_t keys2[] = {3, 4}; + max = hashmap->Get(keys2, 1ul, false, 1.0, &ids, &reused_ids, &filtered); + ASSERT_EQ(2, max); + ASSERT_EQ(1, ids.size()); + ASSERT_EQ(1, ids[0]); + ASSERT_EQ(0, reused_ids.size()); int64_t del_keys[] = {3, 4}; - ret = hashmap.Del(del_keys, 1, 2); - ASSERT_EQ(0, ret); - int64_t keys1[] = {1, 2, 5, 6}; - ret = hashmap.Get(keys1, 2, 2, &ids, &reused_ids); + hashmap->Erase(del_keys, 1); + int64_t keys3[] = {1, 2, 5, 6}; + max = hashmap->Get(keys3, 2, false, 1.0, &ids, &reused_ids, &filtered); + ASSERT_EQ(2, max); EXPECT_EQ(2u, ids.size()); - EXPECT_EQ(1, ids[0]); + EXPECT_EQ(0, ids[0]); // reuse id:0 - EXPECT_EQ(0, ids[1]); - EXPECT_EQ(1u, reused_ids.size()); - EXPECT_EQ(0, reused_ids[0]); - - int64_t del_keys1[] = {1, 2}; - ret = hashmap.Del(del_keys1, 1, 2); - ASSERT_EQ(0, ret); - int64_t keys2[] = {1, 2, 3, 4, 5, 6, 7, 8}; - ret = hashmap.Get(keys2, 4, 2, &ids, &reused_ids); - EXPECT_EQ(4u, ids.size()); - // <7, 8> reuse id:1 - EXPECT_EQ(1, ids[3]); - // <5, 6> old id:0 - EXPECT_EQ(0, ids[2]); - // <3, 4> new id:2 - EXPECT_EQ(2, ids[1]); - // <1, 2> new id:3 - EXPECT_EQ(3, ids[0]); + EXPECT_EQ(1, ids[1]); EXPECT_EQ(1u, reused_ids.size()); EXPECT_EQ(1, reused_ids[0]); - int64_t del_keys2[] = {3, 4, 5, 6}; - ret = hashmap.Del(del_keys2, 2, 2); - ASSERT_EQ(0, ret); - int64_t keys3[] = {7, 8, 9, 10, 11, 12}; - ret = hashmap.Get(keys3, 3, 2, &ids, &reused_ids); - EXPECT_EQ(3u, ids.size()); - // <11, 12> reuse id:2 - EXPECT_EQ(2, ids[2]); - // <9, 10> reuse id:0 - EXPECT_EQ(0, ids[1]); - // <7, 8> old id:1 - EXPECT_EQ(1, ids[0]); - EXPECT_EQ(2u, reused_ids.size()); - EXPECT_EQ(2, reused_ids[0]); - EXPECT_EQ(0, reused_ids[1]); -} - -TEST(HashMapTest, DelWithVerChange) { - HashMap hashmap(1280); - hashmap.SetMaxCache(2); - int64_t keys[] = {1, 2, 3, 4, 5, 6, 7, 8}; - vector ids; - vector reused_ids; - // alloc id: 3->2->1->0 - int ret = hashmap.Get(keys, 4, 2, &ids, &reused_ids); - ASSERT_EQ(0, ret); - - int64_t del_keys[] = {1, 2, 3, 4, 7, 8}; - // release id: 3->2->0 - ret = hashmap.Del(del_keys, 3, 2); - ASSERT_EQ(0, ret); - - int64_t keys1[] = {5, 6, 3, 4, 9, 10}; - ret = hashmap.Get(keys1, 3, 2, &ids, &reused_ids); - ASSERT_EQ(0, ret); - EXPECT_EQ(3u, ids.size()); - // <9, 10> reuse id: 3 - EXPECT_EQ(3, ids[2]); - // <3, 4> reuse id: 2 - EXPECT_EQ(2, ids[1]); - // <5, 6> old id: 1 - EXPECT_EQ(1, ids[0]); -} - -TEST(HashMapTest, ExpandSpace) { - HashMap hashmap(1); - hashmap.SetMaxCache(100); - int test_cnt = 140; - int64_t keys[test_cnt*2]; - for (int i = 0; i < test_cnt; i++) { - keys[i*2] = i*2; - keys[i*2+1] = i*2+1; - } - vector ids; - vector reused_ids; - int ret = hashmap.Get(keys, test_cnt, 2, &ids, &reused_ids); - ASSERT_EQ(0, ret); - EXPECT_EQ(test_cnt*1u, ids.size()); - for (int i = 0; i < test_cnt; i++) { - EXPECT_EQ(i, ids[test_cnt - 1 - i]); - } - - int64_t keys1[] = {0, 1, 2, 3, 278, 279, 300, 301}; - ret = hashmap.Get(keys1, 4, 2, &ids, &reused_ids); - ASSERT_EQ(0, ret); + int64_t del_keys1[] = {1, 2}; + hashmap->Erase(del_keys1, 1); + int64_t keys4[] = {5, 6, 1, 2, 3, 4, 7, 8}; + max = hashmap->Get(keys4, 4, false, 1.0, &ids, &reused_ids, &filtered); + EXPECT_EQ(4u, max); EXPECT_EQ(4u, ids.size()); - EXPECT_EQ(139, ids[0]); - EXPECT_EQ(138, ids[1]); - EXPECT_EQ(0, ids[2]); - EXPECT_EQ(140, ids[3]); -} - -TEST(HashMapTest, GetKeysAndSetKeys) { - HashMap hashmap(1280); - int64_t keys[] = {1, 2, 3, 4}; - vector ids; - vector reused_ids; - int ret = hashmap.Get(keys, 2, 2, &ids, &reused_ids); - ASSERT_EQ(0, ret); - EXPECT_EQ(2u, ids.size()); - // NOTE: the latter part of keys would get id first - EXPECT_EQ(0, ids[1]); + // <5, 6> old id:1 EXPECT_EQ(1, ids[0]); - EXPECT_EQ(0u, reused_ids.size()); - - HashMap::HashMapStruct items; - EXPECT_EQ(0, hashmap.GetHashKeys(&items)); - - EXPECT_EQ(2u, items.items.size()); - EXPECT_EQ(2u, items.counter); - if (items.items[0].x == 1) { - EXPECT_EQ(1, items.items[0].x); - EXPECT_EQ(2, items.items[0].y); - EXPECT_EQ(1, items.items[0].id); - EXPECT_EQ(3, items.items[1].x); - EXPECT_EQ(4, items.items[1].y); - EXPECT_EQ(0, items.items[1].id); - } else { - EXPECT_EQ(1, items.items[1].x); - EXPECT_EQ(2, items.items[1].y); - EXPECT_EQ(1, items.items[1].id); - EXPECT_EQ(3, items.items[0].x); - EXPECT_EQ(4, items.items[0].y); - EXPECT_EQ(0, items.items[0].id); + size_t total = 0; + for (size_t i = 0; i < 3; i++) { + total += ids[i+1]; } - - HashMap hashmap1(2); - EXPECT_EQ(0, hashmap1.SetHashKeys(items)); - - int64_t keys1[] = {1, 2, 3, 4, 13, 14}; - ret = hashmap1.Get(keys1, 3, 2, &ids, &reused_ids); - ASSERT_EQ(0, ret); - EXPECT_EQ(3u, ids.size()); - // alloc new id - EXPECT_EQ(2, ids[2]); - // old id - EXPECT_EQ(0, ids[1]); - EXPECT_EQ(1, ids[0]); - EXPECT_EQ(0u, reused_ids.size()); + EXPECT_EQ(5, total); } -TEST(HashMapTest, GetKeysAndSetKeysWithDel) { - HashMap hashmap(1280); - int64_t keys[] = {1, 2, 3, 4}; - vector ids; - vector reused_ids; - int ret = hashmap.Get(keys, 2, 2, &ids, &reused_ids); - ASSERT_EQ(0, ret); - EXPECT_EQ(2u, ids.size()); - // NOTE: the latter part of keys would get id first - EXPECT_EQ(0, ids[1]); - EXPECT_EQ(1, ids[0]); - EXPECT_EQ(0u, reused_ids.size()); - - int64_t del_keys1[] = {1, 2}; - EXPECT_EQ(0, hashmap.Del(del_keys1, 1, 2)); - - HashMap::HashMapStruct items; - EXPECT_EQ(0, hashmap.GetHashKeys(&items)); - - EXPECT_EQ(1u, items.items.size()); - EXPECT_EQ(2u, items.counter); - EXPECT_EQ(3, items.items[0].x); - EXPECT_EQ(4, items.items[0].y); - EXPECT_EQ(0, items.items[0].id); - - HashMap hashmap1(2); - EXPECT_EQ(0, hashmap1.SetHashKeys(items)); - - int64_t keys1[] = {1, 2, 3, 4, 13, 14}; - ret = hashmap1.Get(keys1, 3, 2, &ids, &reused_ids); - ASSERT_EQ(0, ret); - EXPECT_EQ(3u, ids.size()); - EXPECT_EQ(1, ids[2]); - EXPECT_EQ(0, ids[1]); - EXPECT_EQ(2, ids[0]); - EXPECT_EQ(1u, reused_ids.size()); - EXPECT_EQ(1, reused_ids[0]); +TEST(HashMap128Test, MultiThread) { + int thread_count = 10; + size_t key_count = 20000l; + std::unique_ptr hashmap(new ps::HashMapImpl(key_count)); + int64_t* keys = new int64_t[key_count]; + for (size_t i = 0; i < key_count; i++) { + keys[i] = i; + } + std::atomic total(0); + auto start = std::chrono::system_clock::now(); + ps::MultiThreadDoTBB(thread_count, [&](const Range& r) { + for (size_t i = r.begin; i < r.end; i++) { + vector ids; + tbb::concurrent_vector reused_ids; + size_t filtered; + hashmap->Get(keys + i* key_count/thread_count, key_count/2/thread_count, false, 1.0, &ids, &reused_ids, &filtered); + EXPECT_EQ(key_count/2/thread_count, ids.size()); + size_t sub_total = 0; + for (size_t j = 0; j < ids.size(); j++) { + sub_total += ids[j]; + } + total.fetch_add(sub_total); + } + return Status::Ok(); + }); + EXPECT_EQ(49995000, total); + auto end = std::chrono::system_clock::now(); + std::cout << "insert " << key_count/2 << " keys, takes " << (end-start).count()/1000000 << "ms" <GetPort(); + std::string hdfs_prefix = "hdfs://127.0.0.1:" + std::to_string(hdfs_port); + std::string dir = hdfs_prefix + "/test_data/data_io/"; { - std::unique_ptr hds(new HdfsDataSource("hdfs://127.0.0.1:9090/test_data/data_io/", 1)); + std::unique_ptr hds(new HdfsDataSource(dir, 1)); ASSERT_NE(hds, nullptr); Status st = hds->Init(1, 1, 100); @@ -76,8 +49,8 @@ TEST_F(HdfsDataSourceTest, HdfsDataSource) { } { - auto ds = new MockHdfsDS("hdfs://127.0.0.1:9090/test_data/data_io/", 1); - Status st = ds->Call("hdfs://127.0.0.1:9090/test_data/data_io/"); + auto ds = new MockHdfsDS(dir, 1); + Status st = ds->Call(dir); ASSERT_NE(st, Status::Ok()); delete ds; } diff --git a/xdl/ps-plus/ps-plus/common/test/kv_test.cc b/xdl/ps-plus/ps-plus/common/test/kv_test.cc index 9ae07149..b33c025a 100644 --- a/xdl/ps-plus/ps-plus/common/test/kv_test.cc +++ b/xdl/ps-plus/ps-plus/common/test/kv_test.cc @@ -1,50 +1,46 @@ -/* Copyright (C) 2016-2018 Alibaba Group Holding Limited - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ - #include "gtest/gtest.h" #include "ps-plus/common/reliable_kv.h" +#include "test/util/zookeeper_launcher.h" using ps::ReliableKV; using ps::Status; -TEST(ReliableKVTest, Reliable) { - // { - // auto kv = ps::GetPlugin("zfs"); - // ASSERT_NE(kv, nullptr); +class ReliableKVTest : public testing::Test { + public: + static void SetUpTestCase() {} + static void TearDownTestCase() {} +}; + +TEST_F(ReliableKVTest, Reliable) { + int zk_port = xdl::ZookeeperLauncher::Instance()->GetPort(); + std::string zk_prefix = "zfs://127.0.0.1:" + std::to_string(zk_port); + std::string dir = zk_prefix + "/"; + std::cout << dir + "kva.test" << "\n"; + { + auto kv = ps::GetPlugin("zfs"); + ASSERT_NE(kv, nullptr); - // Status st = kv->WriteAny("zfs://127.0.0.1:2181/kva.test", "waterfall", 1); - // ASSERT_EQ(st, Status::Ok()); + Status st = kv->WriteAny(dir + "kva.test", "waterfall", 1); + ASSERT_EQ(st, Status::Ok()); - // std::string value; - // st = kv->ReadAny("zfs://127.0.0.1:2181/kva.test", &value, 1); - // ASSERT_EQ(st, Status::Ok()); - // ASSERT_EQ(value, "waterfall"); - // } + std::string value; + st = kv->ReadAny(dir + "kva.test", &value, 1); + ASSERT_EQ(st, Status::Ok()); + ASSERT_EQ(value, "waterfall"); + } - // { - // auto kv = ps::GetPlugin("zfs"); - // ASSERT_NE(kv, nullptr); + { + auto kv = ps::GetPlugin("zfs"); + ASSERT_NE(kv, nullptr); - // Status st = kv->Write("zfs://127.0.0.1:2181/kv.test", "waterfall", 1); - // ASSERT_EQ(st, Status::Ok()); + Status st = kv->Write(dir + "kv.test", "waterfall", 1); + ASSERT_EQ(st, Status::Ok()); - // std::string value; - // st = kv->Read("zfs://127.0.0.1:2181/kv.test", &value, 1); - // ASSERT_EQ(st, Status::Ok()); - // ASSERT_EQ(value, "waterfall"); - // } + std::string value; + st = kv->Read(dir + "kv.test", &value, 1); + ASSERT_EQ(st, Status::Ok()); + ASSERT_EQ(value, "waterfall"); + } } diff --git a/xdl/ps-plus/ps-plus/common/test/memguard_test.cc b/xdl/ps-plus/ps-plus/common/test/memguard_test.cc index 7e21e290..05be94ac 100644 --- a/xdl/ps-plus/ps-plus/common/test/memguard_test.cc +++ b/xdl/ps-plus/ps-plus/common/test/memguard_test.cc @@ -1,18 +1,3 @@ -/* Copyright (C) 2016-2018 Alibaba Group Holding Limited - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ - #include "gtest/gtest.h" #include "ps-plus/common/memguard.h" diff --git a/xdl/ps-plus/ps-plus/common/test/murmurhash_test.cc b/xdl/ps-plus/ps-plus/common/test/murmurhash_test.cc new file mode 100644 index 00000000..0f02899b --- /dev/null +++ b/xdl/ps-plus/ps-plus/common/test/murmurhash_test.cc @@ -0,0 +1,57 @@ +/* Copyright (C) 2016-2018 Alibaba Group Holding Limited + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "gtest/gtest.h" +#include "ps-plus/common/murmurhash.h" +#include +#include + +using ps::MurmurHash; + +std::string uint128_2_string(uint64_t res[2]) { + std::ostringstream oss; + oss << std::setw(16) << std::setfill('0') << std::hex << res[0]; + oss << std::setw(16) << std::setfill('0') << std::hex << res[1]; + return oss.str(); +} + +TEST(MurmurHashTest, MurmurHash) { + uint64_t res[2]; + // default seed + { + MurmurHash hash_fn(0); + std::string key0(""); + std::string val0("00000000000000000000000000000000"); + std::string key1("this is a test line"); + std::string val1("097eec3aaefa7332e0d14cf2d59d26c3"); + hash_fn(key0.c_str(), key0.size(), res); + ASSERT_EQ(uint128_2_string(res), val0); + hash_fn(key1.c_str(), key1.size(), res); + ASSERT_EQ(uint128_2_string(res), val1); + } + + // use seed + { + MurmurHash hash_fn(7621U); + std::string key0(""); + std::string val0("2087cc3f33e14ed78d8fdd6d054f1c2c"); + std::string key1("this is a test line"); + std::string val1("b3c8e4d2b3806183bc117d2cd9cf9a3e"); + hash_fn(key0.c_str(), key0.size(), res); + ASSERT_EQ(uint128_2_string(res), val0); + hash_fn(key1.c_str(), key1.size(), res); + ASSERT_EQ(uint128_2_string(res), val1); + } +} diff --git a/xdl/ps-plus/ps-plus/common/test/netutils_test.cc b/xdl/ps-plus/ps-plus/common/test/netutils_test.cc index dc66c0f0..53f04f71 100644 --- a/xdl/ps-plus/ps-plus/common/test/netutils_test.cc +++ b/xdl/ps-plus/ps-plus/common/test/netutils_test.cc @@ -1,18 +1,3 @@ -/* Copyright (C) 2016-2018 Alibaba Group Holding Limited - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ - #include "gtest/gtest.h" #include "ps-plus/common/net_utils.h" diff --git a/xdl/ps-plus/ps-plus/common/test/option_parser_test.cc b/xdl/ps-plus/ps-plus/common/test/option_parser_test.cc index 27abcec9..90608b21 100644 --- a/xdl/ps-plus/ps-plus/common/test/option_parser_test.cc +++ b/xdl/ps-plus/ps-plus/common/test/option_parser_test.cc @@ -1,18 +1,3 @@ -/* Copyright (C) 2016-2018 Alibaba Group Holding Limited - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ - #include "gtest/gtest.h" #include "ps-plus/common/option_parser.h" diff --git a/xdl/ps-plus/ps-plus/common/test/plugin_test.cc b/xdl/ps-plus/ps-plus/common/test/plugin_test.cc index 8f8ac899..8dbaf76d 100644 --- a/xdl/ps-plus/ps-plus/common/test/plugin_test.cc +++ b/xdl/ps-plus/ps-plus/common/test/plugin_test.cc @@ -1,18 +1,3 @@ -/* Copyright (C) 2016-2018 Alibaba Group Holding Limited - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ - #include "gtest/gtest.h" #include "ps-plus/common/plugin.h" diff --git a/xdl/ps-plus/ps-plus/common/test/qrw_lock_test.cc b/xdl/ps-plus/ps-plus/common/test/qrw_lock_test.cc index 981ea324..d1a0d21b 100644 --- a/xdl/ps-plus/ps-plus/common/test/qrw_lock_test.cc +++ b/xdl/ps-plus/ps-plus/common/test/qrw_lock_test.cc @@ -1,18 +1,3 @@ -/* Copyright (C) 2016-2018 Alibaba Group Holding Limited - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ - #include "gtest/gtest.h" #include "ps-plus/common/qrw_lock.h" diff --git a/xdl/ps-plus/ps-plus/common/test/serializer_test.cc b/xdl/ps-plus/ps-plus/common/test/serializer_test.cc index e0934c0d..4eb44895 100644 --- a/xdl/ps-plus/ps-plus/common/test/serializer_test.cc +++ b/xdl/ps-plus/ps-plus/common/test/serializer_test.cc @@ -1,18 +1,3 @@ -/* Copyright (C) 2016-2018 Alibaba Group Holding Limited - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ - #include #include "gtest/gtest.h" @@ -62,7 +47,6 @@ void FragmentConcat(const std::vector& bufs, Fragment* merge) { std::memcpy(merge->base + offset, item.base, item.size); offset += item.size; } - merge->size = total_size; } @@ -73,8 +57,7 @@ TEST(SerializerTest, Serializer) { size_t id; std::vector bufs; EXPECT_TRUE(SerializeAny(data, &id, &bufs, mem_guard).IsOk()); - - ps::Data* result = nullptr; + ps::Data* result = nullptr; size_t len; Status s = DeserializeAny(id, &bufs[0], 0, &result, &len, mem_guard); EXPECT_TRUE(s.IsOk()); @@ -410,6 +393,7 @@ TEST(SerializerTest, Serializer) { } { + //vector to vector MemGuard mem_guard; Slices slice; slice.slice_size = 2; @@ -418,19 +402,68 @@ TEST(SerializerTest, Serializer) { slice.slice_id.push_back(2); slice.slice_id.push_back(3); int32_t buf[] = {1, 2, 3, 4, 5, 6, 7, 8}; - ps::Tensor t(DataType::kInt32, ps::TensorShape({4,2}), (char*)&buf, nullptr); - slice.variable = new ps::server::Variable(&t, nullptr); + ps::Tensor t(DataType::kInt32, ps::TensorShape({4,2}), nullptr, false, ps::Tensor::DEFAULT_SEGMENT_SIZE); + for (size_t i = 0; i < 4; i++) { + int32_t* p = t.Raw(i); + p[0] = buf[i*2]; + p[1] = buf[i*2+1]; + } + slice.variable = new ps::server::Variable(&t, nullptr, ""); - WrapperData* data = new WrapperData(slice); + WrapperData >* data = new WrapperData >(std::vector{slice}); size_t id; std::vector bufs; - EXPECT_TRUE(SerializeAny(data, &id, &bufs, mem_guard).IsOk()); + Status st = SerializeAny(data, &id, &bufs, mem_guard); + EXPECT_TRUE(st.IsOk()); - ps::Data* result = nullptr; + ps::Data* result = nullptr; size_t len; Fragment deserialize_buf; FragmentConcat(bufs, &deserialize_buf); - ps::Status st = DeserializeAny(id, &deserialize_buf, 0, &result, &len, mem_guard); + st = DeserializeAny(id, &deserialize_buf, 0, &result, &len, mem_guard); + EXPECT_TRUE(st.IsOk()); + WrapperData >* r = dynamic_cast >*>(result); + EXPECT_EQ(1, r->Internal().size()); + ps::Tensor& rt = r->Internal()[0]; + EXPECT_EQ(DataType::kInt32, rt.Type()); + EXPECT_EQ(ps::TensorShape({3,2}), rt.Shape()); + int32_t expected[] = {1, 2, 5, 6, 7, 8}; + for (size_t i = 0; i < 6; ++i) { + EXPECT_EQ(expected[i], *(rt.Raw() + i)); + } + delete data; + delete result; + delete[] deserialize_buf.base; + } + + { + //TensorSlices to Tensor + MemGuard mem_guard; + ps::server::TensorSlices slice; + slice.slice_size = 2; + slice.dim_part = 1; + slice.slice_id.push_back(0); + slice.slice_id.push_back(2); + slice.slice_id.push_back(3); + int32_t buf[] = {1, 2, 3, 4, 5, 6, 7, 8}; + ps::Tensor t(DataType::kInt32, ps::TensorShape({4,2}), nullptr, false, ps::Tensor::DEFAULT_SEGMENT_SIZE); + for (size_t i = 0; i < 4; i++) { + int32_t* p = t.Raw(i); + p[0] = buf[i*2]; + p[1] = buf[i*2+1]; + } + slice.tensor = t; + WrapperData* data = new WrapperData(slice); + size_t id; + std::vector bufs; + Status st = SerializeAny(data, &id, &bufs, mem_guard); + EXPECT_TRUE(st.IsOk()); + + ps::Data* result = nullptr; + size_t len; + Fragment deserialize_buf; + FragmentConcat(bufs, &deserialize_buf); + st = DeserializeAny(id, &deserialize_buf, 0, &result, &len, mem_guard); EXPECT_TRUE(st.IsOk()); WrapperData* r = dynamic_cast*>(result); EXPECT_EQ(DataType::kInt32, r->Internal().Type()); @@ -439,7 +472,71 @@ TEST(SerializerTest, Serializer) { for (size_t i = 0; i < 6; ++i) { EXPECT_EQ(expected[i], *(r->Internal().Raw() + i)); } - + delete data; + delete result; + delete[] deserialize_buf.base; + } + + { + //vector to vector + MemGuard mem_guard; + ps::server::TensorSlices slice; + slice.slice_size = 2; + slice.dim_part = 1; + slice.slice_id.push_back(0); + slice.slice_id.push_back(2); + slice.slice_id.push_back(3); + int32_t buf[] = {1, 2, 3, 4, 5, 6, 7, 8}; + ps::Tensor t(DataType::kInt32, ps::TensorShape({4,2}), nullptr, false, ps::Tensor::DEFAULT_SEGMENT_SIZE); + for (size_t i = 0; i < 4; i++) { + int32_t* p = t.Raw(i); + p[0] = buf[i*2]; + p[1] = buf[i*2+1]; + } + slice.tensor = t; + + ps::server::TensorSlices slice2; + slice2.slice_size = 2; + slice2.dim_part = 1; + slice2.slice_id.push_back(0); + slice2.slice_id.push_back(3); + int32_t buf2[] = {9, 10, 11, 12, 13, 14, 15, 16}; + ps::Tensor t2(DataType::kInt32, ps::TensorShape({4,2}), nullptr, false, ps::Tensor::DEFAULT_SEGMENT_SIZE); + for (size_t i = 0; i < 4; i++) { + int32_t* p = t2.Raw(i); + p[0] = buf2[i*2]; + p[1] = buf2[i*2+1]; + } + slice2.tensor = t2; + WrapperData >* data = new WrapperData >(std::vector{slice, slice2}); + size_t id; + std::vector bufs; + Status st = SerializeAny(data, &id, &bufs, mem_guard); + EXPECT_TRUE(st.IsOk()); + + ps::Data* result = nullptr; + size_t len; + Fragment deserialize_buf; + FragmentConcat(bufs, &deserialize_buf); + st = DeserializeAny(id, &deserialize_buf, 0, &result, &len, mem_guard); + EXPECT_TRUE(st.IsOk()); + WrapperData >* r = dynamic_cast >*>(result); + EXPECT_EQ(2, r->Internal().size()); + ps::Tensor& rt = r->Internal()[0]; + EXPECT_EQ(DataType::kInt32, rt.Type()); + EXPECT_EQ(ps::TensorShape({3,2}), rt.Shape()); + int32_t expected[] = {1, 2, 5, 6, 7, 8}; + for (size_t i = 0; i < 6; ++i) { + EXPECT_EQ(expected[i], *(rt.Raw() + i)); + } + + ps::Tensor& rt2 = r->Internal()[1]; + EXPECT_EQ(DataType::kInt32, rt2.Type()); + EXPECT_EQ(ps::TensorShape({2,2}), rt2.Shape()); + int32_t expected2[] = {9, 10, 15, 16}; + for (size_t i = 0; i < 4; ++i) { + EXPECT_EQ(expected2[i], *(rt2.Raw() + i)); + } delete data; delete result; delete[] deserialize_buf.base; @@ -676,3 +773,106 @@ TEST(MessageSerializerTest, UdfChainRegisterTest) { delete[] deserialize_buf.base; } } + +TEST(MessageSerializerTest, VecStringTest) { + { + MemGuard mem_guard; + using StringVec = std::vector; + WrapperData* data = new WrapperData(); + data->Internal().push_back("this"); + data->Internal().push_back("is"); + data->Internal().push_back("a"); + data->Internal().push_back("test"); + size_t id; + std::vector bufs; + EXPECT_TRUE(SerializeAny(data, &id, &bufs, mem_guard).IsOk()); + + Fragment deserialize_buf; + FragmentConcat(bufs, &deserialize_buf); + + ps::Data* result = nullptr; + size_t len; + Status s = DeserializeAny(id, &deserialize_buf, 0, &result, &len, mem_guard); + EXPECT_TRUE(s.IsOk()); + WrapperData* r = dynamic_cast*>(result); + EXPECT_TRUE(r != nullptr); + const StringVec& ret = r->Internal(); + EXPECT_EQ(4, ret.size()); + EXPECT_EQ("this", ret[0]); + EXPECT_EQ("is", ret[1]); + EXPECT_EQ("a", ret[2]); + EXPECT_EQ("test", ret[3]); + delete data; + delete result; + } +} + +TEST(MessageSerializerTest, VecDoubleTest) { + { + MemGuard mem_guard; + using DoubleVec = std::vector; + WrapperData* data = new WrapperData(); + data->Internal().push_back(1.67); + data->Internal().push_back(-2.31); + data->Internal().push_back(0); + data->Internal().push_back(-0.0000001); + size_t id; + std::vector bufs; + EXPECT_TRUE(SerializeAny(data, &id, &bufs, mem_guard).IsOk()); + + Fragment deserialize_buf; + FragmentConcat(bufs, &deserialize_buf); + + ps::Data* result = nullptr; + size_t len; + Status s = DeserializeAny(id, &deserialize_buf, 0, &result, &len, mem_guard); + EXPECT_TRUE(s.IsOk()); + WrapperData* r = dynamic_cast*>(result); + EXPECT_TRUE(r != nullptr); + const DoubleVec& ret = r->Internal(); + EXPECT_EQ(4, ret.size()); + EXPECT_EQ(1.67, ret[0]); + EXPECT_EQ(-2.31, ret[1]); + EXPECT_EQ(0, ret[2]); + EXPECT_FLOAT_EQ(-0.0000001, ret[3]); + delete data; + delete result; + } +} + +TEST(MessageSerializerTest, VecBoolTest) { + { + MemGuard mem_guard; + using BoolVec = std::vector; + WrapperData* data = new WrapperData(); + data->Internal().push_back(true); + data->Internal().push_back(false); + data->Internal().push_back(false); + data->Internal().push_back(true); + data->Internal().push_back(true); + data->Internal().push_back(true); + size_t id; + std::vector bufs; + EXPECT_TRUE(SerializeAny(data, &id, &bufs, mem_guard).IsOk()); + + Fragment deserialize_buf; + FragmentConcat(bufs, &deserialize_buf); + + ps::Data* result = nullptr; + size_t len; + Status s = DeserializeAny(id, &deserialize_buf, 0, &result, &len, mem_guard); + EXPECT_TRUE(s.IsOk()); + WrapperData* r = dynamic_cast*>(result); + EXPECT_TRUE(r != nullptr); + const BoolVec& ret = r->Internal(); + EXPECT_EQ(6, ret.size()); + EXPECT_EQ(true, ret[0]); + EXPECT_EQ(false, ret[1]); + EXPECT_EQ(false, ret[2]); + EXPECT_EQ(true, ret[3]); + EXPECT_EQ(true, ret[4]); + EXPECT_EQ(true, ret[5]); + delete data; + delete result; + } +} diff --git a/xdl/ps-plus/ps-plus/common/test/status_test.cc b/xdl/ps-plus/ps-plus/common/test/status_test.cc index ab1e8a9d..42aafe74 100644 --- a/xdl/ps-plus/ps-plus/common/test/status_test.cc +++ b/xdl/ps-plus/ps-plus/common/test/status_test.cc @@ -1,18 +1,3 @@ -/* Copyright (C) 2016-2018 Alibaba Group Holding Limited - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ - #include "gtest/gtest.h" #include "ps-plus/common/status.h" diff --git a/xdl/ps-plus/ps-plus/common/test/string_test.cc b/xdl/ps-plus/ps-plus/common/test/string_test.cc index 3465a172..8a148076 100644 --- a/xdl/ps-plus/ps-plus/common/test/string_test.cc +++ b/xdl/ps-plus/ps-plus/common/test/string_test.cc @@ -1,18 +1,3 @@ -/* Copyright (C) 2016-2018 Alibaba Group Holding Limited - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ - #include "gtest/gtest.h" #include "ps-plus/common/string_utils.h" diff --git a/xdl/ps-plus/ps-plus/common/test/tensor_test.cc b/xdl/ps-plus/ps-plus/common/test/tensor_test.cc index f1d830f6..a02382c8 100644 --- a/xdl/ps-plus/ps-plus/common/test/tensor_test.cc +++ b/xdl/ps-plus/ps-plus/common/test/tensor_test.cc @@ -1,18 +1,3 @@ -/* Copyright (C) 2016-2018 Alibaba Group Holding Limited - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ - #include "gtest/gtest.h" #include "ps-plus/common/tensor.h" #include "ps-plus/common/initializer/constant_initializer.h" @@ -27,7 +12,7 @@ using ps::initializer::ConstantInitializer; TEST(TensorTest, Contructor) { TensorShape shape({10, 5}); Tensor x(DataType::kInt8, shape, new ConstantInitializer(1)); - Tensor y(DataType::kInt8, std::move(shape), new ConstantInitializer(1)); + Tensor y(DataType::kInt8, shape, new ConstantInitializer(1)); for (int i = 0; i < 50; i++) { x.Raw()[i] = i; y.Raw()[i] = i + 10; @@ -46,7 +31,7 @@ TEST(TensorTest, Contructor) { TEST(TensorTest, Initializer) { TensorShape shape({4, 8}); - Tensor x(DataType::kInt8, shape, new ConstantInitializer(1)); + Tensor x(DataType::kInt8, shape, new ConstantInitializer(1), Tensor::TType::kSegment, true); EXPECT_EQ(0x0101010101010101, x.Raw()[0]); EXPECT_EQ(0x0101010101010101, x.Raw()[1]); EXPECT_EQ(0x0101010101010101, x.Raw()[2]); @@ -67,8 +52,8 @@ TEST(TensorTest, Initializer) { x.ReShape(TensorShape({4, 8})); EXPECT_EQ(0x0706050403020100, x.Raw()[0]); EXPECT_EQ(0x0F0E0D0C0B0A0908, x.Raw()[1]); - EXPECT_EQ(0x0101010101010101, x.Raw()[2]); - EXPECT_EQ(0x0101010101010101, x.Raw()[3]); + EXPECT_EQ(0x1716151413121110, x.Raw()[2]); + EXPECT_EQ(0x1F1E1D1C1B1A1918, x.Raw()[3]); for (size_t i = 0; i < 32; i++) { x.Raw()[i] = i; @@ -78,14 +63,8 @@ TEST(TensorTest, Initializer) { EXPECT_EQ(0x1716151413121110, x.Raw()[2]); EXPECT_EQ(0x1F1E1D1C1B1A1918, x.Raw()[3]); - x.Clear(4, 4); - EXPECT_EQ(0x0101010103020100, x.Raw()[0]); - EXPECT_EQ(0x0F0E0D0C0B0A0908, x.Raw()[1]); - EXPECT_EQ(0x1716151413121110, x.Raw()[2]); - EXPECT_EQ(0x1F1E1D1C1B1A1918, x.Raw()[3]); - x.ClearId(2); - EXPECT_EQ(0x0101010103020100, x.Raw()[0]); + EXPECT_EQ(0x0706050403020100, x.Raw()[0]); EXPECT_EQ(0x0F0E0D0C0B0A0908, x.Raw()[1]); EXPECT_EQ(0x0101010101010101, x.Raw()[2]); EXPECT_EQ(0x1F1E1D1C1B1A1918, x.Raw()[3]); diff --git a/xdl/ps-plus/ps-plus/common/test/threadpool_test.cc b/xdl/ps-plus/ps-plus/common/test/threadpool_test.cc index 6e04b60b..21614ccc 100644 --- a/xdl/ps-plus/ps-plus/common/test/threadpool_test.cc +++ b/xdl/ps-plus/ps-plus/common/test/threadpool_test.cc @@ -1,18 +1,3 @@ -/* Copyright (C) 2016-2018 Alibaba Group Holding Limited - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ - #include "gtest/gtest.h" #include "ps-plus/common/thread_pool.h" diff --git a/xdl/ps-plus/ps-plus/common/test/types_test.cc b/xdl/ps-plus/ps-plus/common/test/types_test.cc index 3b993d11..81a90db4 100644 --- a/xdl/ps-plus/ps-plus/common/test/types_test.cc +++ b/xdl/ps-plus/ps-plus/common/test/types_test.cc @@ -1,18 +1,3 @@ -/* Copyright (C) 2016-2018 Alibaba Group Holding Limited - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ - #include "gtest/gtest.h" #include "ps-plus/common/types.h" diff --git a/xdl/ps-plus/ps-plus/common/test/zk_wrapper_test.cc b/xdl/ps-plus/ps-plus/common/test/zk_wrapper_test.cc index 1e71d2ba..25b92400 100644 --- a/xdl/ps-plus/ps-plus/common/test/zk_wrapper_test.cc +++ b/xdl/ps-plus/ps-plus/common/test/zk_wrapper_test.cc @@ -1,18 +1,3 @@ -/* Copyright (C) 2016-2018 Alibaba Group Holding Limited - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ - #include "gtest/gtest.h" #include "ps-plus/common/zk_wrapper.h" #include "test/util/zookeeper_launcher.h" @@ -21,13 +6,8 @@ using ps::ZkWrapper; class ZkWrapperTest : public testing::Test { public: - static void SetUpTestCase() { - ps::ZookeeperLauncher::Start(); - } - - static void TearDownTestCase() { - ps::ZookeeperLauncher::Stop(); - } + static void SetUpTestCase() {} + static void TearDownTestCase() {} }; void call_back(ZkWrapper *zw, const std::string & msg, ZkWrapper::ZkStatus) { @@ -35,8 +15,10 @@ void call_back(ZkWrapper *zw, const std::string & msg, ZkWrapper::ZkStatus) { } TEST_F(ZkWrapperTest, ZkWrapper) { + int zk_port = xdl::ZookeeperLauncher::Instance()->GetPort(); + std::string dir = "127.0.0.1:" + std::to_string(zk_port); { - auto zk = new ZkWrapper("127.0.0.1:2181", 1000); + auto zk = new ZkWrapper(dir, 1000); ASSERT_NE(zk, nullptr); zk->SetConnCallback(call_back); diff --git a/xdl/ps-plus/ps-plus/common/thread_pool.h b/xdl/ps-plus/ps-plus/common/thread_pool.h index 48e5c522..5a3727da 100644 --- a/xdl/ps-plus/ps-plus/common/thread_pool.h +++ b/xdl/ps-plus/ps-plus/common/thread_pool.h @@ -24,6 +24,8 @@ limitations under the License. #include #include #include +#include "ps-plus/common/status.h" +#include "tbb/parallel_for.h" namespace ps { @@ -70,6 +72,71 @@ inline void QuickMemcpy(void* dest, const void* src, size_t count) { } } +struct Range { + size_t begin; + size_t end; +}; + +inline Status MultiThreadDo(size_t size, const std::function& func, size_t block_size = 500) { + static size_t thread_nums = std::thread::hardware_concurrency(); + if (size == 0) { + return Status::Ok(); + } + if (size < block_size) { + Range range{.begin=0, .end=size}; + return func(range); + } else { + std::promise ok; + if (size / block_size > thread_nums) { + block_size = size / thread_nums; + } + size_t round = size / block_size; + if (size % block_size != 0) { + ++round; + } + std::atomic counter(round); + block_size = size / round; + if (size % round != 0) { + ++block_size; + } + Status st = Status::Ok(); + for (size_t i = 0; i < round; i++) { + ThreadPool::Global()->Schedule([&, i]{ + Range range{.begin=i*block_size, .end=std::min(size, (i+1)*block_size)}; + Status ret = func(range); + if (!ret.IsOk()) { + st = ret; + } + if (--counter == 0) { + ok.set_value(true); + }}); + } + ok.get_future().wait(); + return st; + } +} + +inline Status MultiThreadDoTBB(size_t size, const std::function& func, size_t block_size = 1) { + static size_t thread_nums = std::thread::hardware_concurrency(); + if (size == 0) { + return Status::Ok(); + } + if (size < block_size) { + Range range{.begin=0, .end=size}; + return func(range); + } else { + Status st = Status::Ok(); + parallel_for(tbb::blocked_range(0, size), [&](tbb::blocked_range& r) { + Range range{.begin=r.begin(), .end=r.end()}; + Status ret = func(range); + if (!ret.IsOk()) { + st = ret; + } + }); + return st; + } +} + } #endif diff --git a/xdl/ps-plus/ps-plus/common/time_utils.h b/xdl/ps-plus/ps-plus/common/time_utils.h new file mode 100644 index 00000000..11653966 --- /dev/null +++ b/xdl/ps-plus/ps-plus/common/time_utils.h @@ -0,0 +1,36 @@ +/* Copyright (C) 2016-2018 Alibaba Group Holding Limited + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef PS_COMMON_TIME_UTILS_H +#define PS_COMMON_TIME_UTILS_H + +#include +#include +#include + +namespace ps { + +class TimeUtils { + public: + static uint64_t NowMicros() { + struct timeval tv; + gettimeofday(&tv, NULL); + return static_cast(tv.tv_sec) * 1000000 + tv.tv_usec; + } +}; + +} //ps + +#endif // PS_COMMON_TIME_UTILS_H diff --git a/xdl/ps-plus/ps-plus/common/zk_wrapper.cpp b/xdl/ps-plus/ps-plus/common/zk_wrapper.cpp index 06680f29..f72257ed 100644 --- a/xdl/ps-plus/ps-plus/common/zk_wrapper.cpp +++ b/xdl/ps-plus/ps-plus/common/zk_wrapper.cpp @@ -18,7 +18,7 @@ limitations under the License. #include "ps-plus/common/string_utils.h" #include -#include +#include "ps-plus/common/logging.h" #define SEQIDLENGTH 128 diff --git a/xdl/ps-plus/ps-plus/main/main.cc b/xdl/ps-plus/ps-plus/main/main.cc index 798ba917..9ef4bdd8 100644 --- a/xdl/ps-plus/ps-plus/main/main.cc +++ b/xdl/ps-plus/ps-plus/main/main.cc @@ -13,6 +13,7 @@ See the License for the specific language governing permissions and limitations under the License. ==============================================================================*/ +#include "ps-plus/common/logging.h" #include "ps-plus/common/option_parser.h" #include "ps-plus/server/server_service.h" #include "ps-plus/scheduler/scheduler_impl.h" @@ -20,11 +21,8 @@ limitations under the License. #include #include -#include int ServerRun(int argc, char** argv) { - google::InitGoogleLogging("ps-plus"); -// FLAGS_logtostderr = 1; ps::OptionParser optParser; optParser.addOption("-sp", "--scheduler_kv_path", "scheduler_kv_path", ps::OptionParser::OPT_STRING, true); optParser.addOption("-si", "--server_id", "server_id", ps::OptionParser::OPT_INT32, true); @@ -43,20 +41,20 @@ int ServerRun(int argc, char** argv) { std::string streaming_model_sparse; std::string streaming_model_hash; std::string bind_cores; - + optParser.getOptionValue("scheduler_kv_path", scheduler_kv_path); optParser.getOptionValue("server_id", server_id); optParser.getOptionValue("streaming_model_dense", streaming_model_dense); optParser.getOptionValue("streaming_model_sparse", streaming_model_sparse); optParser.getOptionValue("streaming_model_hash", streaming_model_hash); optParser.getOptionValue("bind_cores", bind_cores); - ps::server::ServerService service( - scheduler_kv_path, server_id, - streaming_model_dense, streaming_model_sparse, - streaming_model_hash, bind_cores == "True" ? true : false); + + ps::server::ServerService service(scheduler_kv_path, server_id, + streaming_model_dense, streaming_model_sparse, streaming_model_hash, + bind_cores == "True" ? true : false); ps::Status st = service.Init(); if (!st.IsOk()) { - LOG(ERROR) << "ERROR ON Server Init:" << st.ToString(); + LOG(ERROR) << "ERROR ON Server Init: " << st.ToString(); return -1; } while (true) { @@ -113,11 +111,10 @@ int SchedulerRun(int argc, char** argv) { ps::scheduler::SchedulerImpl service( server_num, scheduler_kv_path, checkpoint_path, placement_arg, - streaming_model_dense, streaming_model_sparse, - streaming_model_hash, bind_cores == "True" ? true : false); + streaming_model_dense, streaming_model_sparse, streaming_model_hash, bind_cores == "True" ? true : false); ps::Status st = service.Start(); if (!st.IsOk()) { - LOG(ERROR) << "ERROR ON Server Init:" << st.ToString(); + LOG(ERROR) << "ERROR ON Server Init: " << st.ToString(); return -1; } while (true) { diff --git a/xdl/ps-plus/ps-plus/message/func_ids.h b/xdl/ps-plus/ps-plus/message/func_ids.h index f75f6f95..fbc532a3 100644 --- a/xdl/ps-plus/ps-plus/message/func_ids.h +++ b/xdl/ps-plus/ps-plus/message/func_ids.h @@ -33,7 +33,13 @@ static const int kSchedulerWorkerReportFinish = 0x0001000b; static const int kSchedulerSynchronizeEnter = 0x0001000c; static const int kSchedulerSynchronizeLeave = 0x0001000d; static const int kSchedulerUpdateVariableVisitInfo = 0x0001000e; -static const int kSchedulerWorkerBarrier = 0x0001000f; +static const int kSchedulerGetWorkerFinishCount = 0x0001000f; +static const int kSchedulerWorkerBarrier = 0x00010010; +static const int kSchedulerInitGlobalFileQueue = 0x00010011; +static const int kSchedulerGetNextFile = 0x00010012; +static const int kSchedulerReportWorkerState = 0x00010013; +static const int kSchedulerRestoreWorkerState = 0x00010014; +static const int kSchedulerWorkerBarrierV2 = 0x00010015; static const int kServerRegisterUdfChain = 0x00020001; static const int kServerProcess = 0x00020002; diff --git a/xdl/ps-plus/ps-plus/message/message_serializer.cpp b/xdl/ps-plus/ps-plus/message/message_serializer.cpp index 5d7477a7..f665d283 100644 --- a/xdl/ps-plus/ps-plus/message/message_serializer.cpp +++ b/xdl/ps-plus/ps-plus/message/message_serializer.cpp @@ -39,3 +39,9 @@ DESERIALIZER_REGISTER(ps::serializer::WrapperDataDerializer); SERIALIZER_REGISTER(ps::serializer::WrapperDataSerializer); DESERIALIZER_REGISTER(ps::serializer::WrapperDataDerializer); +SERIALIZER_REGISTER(ps::serializer::WrapperDataSerializer); +DESERIALIZER_REGISTER(ps::serializer::WrapperDataDerializer); + +SERIALIZER_REGISTER(ps::serializer::WrapperDataSerializer >); +DESERIALIZER_REGISTER(ps::serializer::WrapperDataDerializer >); + diff --git a/xdl/ps-plus/ps-plus/message/message_serializer.h b/xdl/ps-plus/ps-plus/message/message_serializer.h index 7044a976..b70ff441 100644 --- a/xdl/ps-plus/ps-plus/message/message_serializer.h +++ b/xdl/ps-plus/ps-plus/message/message_serializer.h @@ -23,6 +23,7 @@ limitations under the License. #include "variable_info.h" #include "udf_chain_register.h" #include "streaming_model_infos.h" +#include "worker_state.h" namespace ps { namespace serializer { @@ -402,6 +403,79 @@ ps::Status SerializeHelper::Deserialize( return ps::Status::Ok(); } +template <> +ps::Status SerializeHelper::Serialize( + const ps::WorkerState* ws, + std::vector* bufs, + MemGuard& mem_guard) { + Serialize(&(ws->begin_), bufs, mem_guard); + Serialize(&(ws->end_), bufs, mem_guard); + Serialize(&(ws->epoch_), bufs, mem_guard); + Serialize(&(ws->path_), bufs, mem_guard); + return ps::Status::Ok(); +} + +template <> +ps::Status SerializeHelper::Deserialize( + const char* buf, + ps::WorkerState* ws, + size_t* len, + MemGuard& mem_guard) { + size_t field_len; + Deserialize(buf, &(ws->begin_), &field_len, mem_guard); + *len = field_len; + Deserialize(buf + *len, &(ws->end_), &field_len, mem_guard); + *len += field_len; + Deserialize(buf + *len, &(ws->epoch_), &field_len, mem_guard); + *len += field_len; + Deserialize(buf + *len, &(ws->path_), &field_len, mem_guard); + *len += field_len; + return ps::Status::Ok(); +} + +template <> +ps::Status SerializeHelper::Serialize >( + const std::vector* vws, + std::vector* bufs, + MemGuard& mem_guard) { + size_t vec_len = vws->size(); + Serialize(&vec_len, bufs, mem_guard); + for (auto& ws: *vws) { + Serialize(&(ws.begin_), bufs, mem_guard); + Serialize(&(ws.end_), bufs, mem_guard); + Serialize(&(ws.epoch_), bufs, mem_guard); + Serialize(&(ws.path_), bufs, mem_guard); + } + + return ps::Status::Ok(); +} + +template <> +ps::Status SerializeHelper::Deserialize >( + const char* buf, + std::vector* vws, + size_t* len, + MemGuard& mem_guard) { + size_t vec_len = 0; + size_t field_len; + Deserialize(buf, &(vec_len), &field_len, mem_guard); + *len = field_len; + for (size_t i = 0; i < vec_len; ++i) { + ps::WorkerState ws; + Deserialize(buf, &(ws.begin_), &field_len, mem_guard); + *len += field_len; + Deserialize(buf + *len, &(ws.end_), &field_len, mem_guard); + *len += field_len; + Deserialize(buf + *len, &(ws.epoch_), &field_len, mem_guard); + *len += field_len; + Deserialize(buf + *len, &(ws.path_), &field_len, mem_guard); + *len += field_len; + vws->push_back(ws); + } + + return ps::Status::Ok(); +} + } // namespace serializer } // namespace ps diff --git a/xdl/ps-plus/ps-plus/message/streaming_model_manager.h b/xdl/ps-plus/ps-plus/message/streaming_model_manager.h index acb3f4af..3879d670 100644 --- a/xdl/ps-plus/ps-plus/message/streaming_model_manager.h +++ b/xdl/ps-plus/ps-plus/message/streaming_model_manager.h @@ -42,9 +42,9 @@ class StreamingModelWriter { std::vector> del_ids; }; virtual ~StreamingModelWriter() {} - virtual Status WriteDenseModel(const std::vector& val) = 0; - virtual Status WriteSparseModel(const std::vector& val) = 0; - virtual Status WriteHashModel(const std::vector& val) = 0; + virtual Status WriteDenseModel(const std::vector& val, const std::string& stream_version) = 0; + virtual Status WriteSparseModel(const std::vector& val, const std::string& stream_version, const int& server_id) = 0; + virtual Status WriteHashModel(const std::vector& val, const std::string& stream_version, const int& server_id) = 0; }; class StreamingModelManager { diff --git a/xdl/ps-plus/ps-plus/message/test/streaming_test.cc b/xdl/ps-plus/ps-plus/message/test/streaming_test.cc new file mode 100644 index 00000000..4d1d2a29 --- /dev/null +++ b/xdl/ps-plus/ps-plus/message/test/streaming_test.cc @@ -0,0 +1,73 @@ +/* Copyright (C) 2016-2018 Alibaba Group Holding Limited + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "gtest/gtest.h" +#include "ps-plus/message/streaming_model_infos.h" +#include "ps-plus/message/streaming_model_manager.h" + +using ps::StreamingModelManager; +using ps::StreamingModelWriter; +using ps::DenseVarNames; +using ps::DenseVarValues; +using ps::Tensor; +using ps::Status; + +TEST(StreamingTest, Streaming) { + { + auto dvn = new DenseVarNames(); + dvn->names.push_back("hello"); + dvn->names.push_back("world"); + ASSERT_EQ(dvn->names.size(), 2); + delete dvn; + } + + { + auto dvv = new DenseVarValues(); + struct DenseVarValues::DenseVarValue vv; + vv.name = "robin"; + vv.offset = 0; + Tensor tensor; + vv.data = tensor; + dvv->values.push_back(vv); + ASSERT_EQ(dvv->values.size(), 1); + delete dvv; + } + + { + Tensor tensor; + + auto dm = new StreamingModelWriter::DenseModel(); + dm->name = "first"; + dm->data = tensor; + ASSERT_NE(dm, nullptr); + delete dm; + + auto sm = new StreamingModelWriter::SparseModel(); + sm->name = "second"; + sm->data = tensor; + sm->ids.push_back(1); + sm->ids.push_back(2); + sm->offsets.push_back(3); + sm->offsets.push_back(4); + ASSERT_EQ(sm->ids.size(), 2); + delete sm; + + auto hm = new StreamingModelWriter::HashModel(); + hm->ids.push_back(std::make_pair(3, 9)); + hm->ids.push_back(std::make_pair(9, 81)); + ASSERT_EQ(hm->ids.size(), 2); + delete hm; + } +} diff --git a/xdl/ps-plus/ps-plus/message/variable_info.cc b/xdl/ps-plus/ps-plus/message/variable_info.cc new file mode 100644 index 00000000..6d955644 --- /dev/null +++ b/xdl/ps-plus/ps-plus/message/variable_info.cc @@ -0,0 +1,23 @@ +/* Copyright (C) 2016-2018 Alibaba Group Holding Limited + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "variable_info.h" + +namespace ps { + +const std::string VariableInfo::ORIGIN_FILE_PATH = "origin_file_path"; +const std::string VariableInfo::ORIGIN_NAME = "oname"; + +} diff --git a/xdl/ps-plus/ps-plus/message/variable_info.h b/xdl/ps-plus/ps-plus/message/variable_info.h index e361c78a..8c109744 100644 --- a/xdl/ps-plus/ps-plus/message/variable_info.h +++ b/xdl/ps-plus/ps-plus/message/variable_info.h @@ -27,8 +27,9 @@ namespace ps { struct VariableInfo { enum Type { - kIndex, - kHash + kIndex = 0, + kHash128 = 1, + kHash64 = 2, }; struct Part { size_t server; @@ -43,6 +44,9 @@ struct VariableInfo { size_t visit_time; int64_t dense_visit_ids; int64_t sparse_visit_ids; + + static const std::string ORIGIN_FILE_PATH; + static const std::string ORIGIN_NAME; }; struct VariableInfoCollection { diff --git a/xdl/ps-plus/ps-plus/message/worker_state.cc b/xdl/ps-plus/ps-plus/message/worker_state.cc new file mode 100644 index 00000000..8fb57ad7 --- /dev/null +++ b/xdl/ps-plus/ps-plus/message/worker_state.cc @@ -0,0 +1,37 @@ +/* Copyright (C) 2016-2018 Alibaba Group Holding Limited + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "worker_state.h" + +namespace ps { + +WorkerState::WorkerState() + : begin_(0) + , end_(0) + , epoch_(0) { +} + +WorkerState::WorkerState( + size_t begin, + size_t end, + size_t epoch, + const std::string& path) + : begin_(begin) + , end_(end) + , epoch_(epoch) + , path_(path) { +} + +} diff --git a/xdl/ps-plus/ps-plus/message/worker_state.h b/xdl/ps-plus/ps-plus/message/worker_state.h new file mode 100644 index 00000000..a133d6b1 --- /dev/null +++ b/xdl/ps-plus/ps-plus/message/worker_state.h @@ -0,0 +1,40 @@ +/* Copyright (C) 2016-2018 Alibaba Group Holding Limited + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef PS_COMMON_WORKER_STATE_H_ +#define PS_COMMON_WORKER_STATE_H_ + +#include +#include +#include + +namespace ps { + +struct WorkerState { + size_t begin_; + size_t end_; + size_t epoch_; + std::string path_; + WorkerState(); + WorkerState( + size_t begin, + size_t end, + size_t epoch, + const std::string& path); +}; + +} + +#endif // PS_COMMON_WORKER_STATE_H_ diff --git a/xdl/ps-plus/ps-plus/model_server/model_server_service.cc b/xdl/ps-plus/ps-plus/model_server/model_server_service.cc index 9f81b258..ec419ce5 100644 --- a/xdl/ps-plus/ps-plus/model_server/model_server_service.cc +++ b/xdl/ps-plus/ps-plus/model_server/model_server_service.cc @@ -24,7 +24,7 @@ limitations under the License. #include #include #include -#include +#include "ps-plus/common/logging.h" namespace ps { namespace modelserver { diff --git a/xdl/ps-plus/ps-plus/model_server/test/forward_test.cc b/xdl/ps-plus/ps-plus/model_server/test/forward_test.cc index 90e9ffa2..8d95be44 100644 --- a/xdl/ps-plus/ps-plus/model_server/test/forward_test.cc +++ b/xdl/ps-plus/ps-plus/model_server/test/forward_test.cc @@ -53,7 +53,7 @@ TEST(ForwardSimpleCacheTest, ForwardSimpleCache) { auto factory = ps::GetPlugin("simple_cache"); ASSERT_NE(factory, nullptr); { - Tensor tensor(DataType::kInt64, TensorShape({1, 1024}), new ConstantInitializer(0), false); + Tensor tensor(DataType::kInt64, TensorShape({1, 1024}), new ConstantInitializer(0), Tensor::TType::kContinuous, false); ForwardCache::Callback callback = [&tensor](Status st, Tensor tensor) { st = Status::Ok(); }; diff --git a/xdl/ps-plus/ps-plus/plugins/hdfs/libhdfs.cc b/xdl/ps-plus/ps-plus/plugins/hdfs/libhdfs.cc index ec241480..e034c908 100644 --- a/xdl/ps-plus/ps-plus/plugins/hdfs/libhdfs.cc +++ b/xdl/ps-plus/ps-plus/plugins/hdfs/libhdfs.cc @@ -74,11 +74,11 @@ Status LibHDFS::LoadAndBind() { const char* hdfs_root = getenv("HADOOP_HDFS_HOME"); if (hdfs_root == nullptr) { return Status::NotFound("HADOOP_HDFS_HOME is not set"); - } + } const std::string& libhdfs = std::string(hdfs_root) + "/lib/native/libhdfs.so"; void* dl = dlopen(libhdfs.c_str(), RTLD_LAZY); if (dl == nullptr) { - return Status::NotFound(dlerror()); + return Status::NotFound("cannot find $HADOOP_HDFS_HOME/lib/native/libhdfs.so"); } return LoadSymbols(dl); } diff --git a/xdl/ps-plus/ps-plus/plugins/hdfs/libhdfs.h b/xdl/ps-plus/ps-plus/plugins/hdfs/libhdfs.h index 55ba2ee2..f6f70a0b 100644 --- a/xdl/ps-plus/ps-plus/plugins/hdfs/libhdfs.h +++ b/xdl/ps-plus/ps-plus/plugins/hdfs/libhdfs.h @@ -16,9 +16,9 @@ limitations under the License. #ifndef PLUGINS_HDFS_LIBHDFS_H_ #define PLUGINS_HDFS_LIBHDFS_H_ +#include "third_party/hdfs/hdfs.h" #include "ps-plus/common/status.h" #include -#include namespace ps { namespace hdfs { diff --git a/xdl/ps-plus/ps-plus/profiler/hashmap.cc b/xdl/ps-plus/ps-plus/profiler/hashmap.cc index 9f6d5d38..14dd479c 100644 --- a/xdl/ps-plus/ps-plus/profiler/hashmap.cc +++ b/xdl/ps-plus/ps-plus/profiler/hashmap.cc @@ -26,6 +26,7 @@ const int hint = 1 << 10; std::vector> rands; std::random_device rd; +#if 0 PROFILE(hashmap, 32, 100000).Init([](size_t threads){ rands.clear(); for (size_t i = 0; i < threads; i++) { @@ -55,3 +56,4 @@ PROFILE(hashmap, 32, 100000).Init([](size_t threads){ } } }); +#endif diff --git a/xdl/ps-plus/ps-plus/scheduler/anneal_placementer.cc b/xdl/ps-plus/ps-plus/scheduler/anneal_placementer.cc index 44fe64ea..665aab8f 100644 --- a/xdl/ps-plus/ps-plus/scheduler/anneal_placementer.cc +++ b/xdl/ps-plus/ps-plus/scheduler/anneal_placementer.cc @@ -301,7 +301,7 @@ class AnnealPlacementer : public Placementer { x.slice_mem = SizeOfType(info.datatype) * slice_size * mem_ratio; x.slice_net = SizeOfType(info.datatype) * slice_size * ratio; } - } else if (info.type == VariableInfo::kHash) { + } else if (info.type == VariableInfo::kHash128 || info.type == VariableInfo::kHash64) { if (info.shape.empty()) { return Status::ArgumentError("Hash Should at least 1 dim"); } diff --git a/xdl/ps-plus/ps-plus/scheduler/balance_placementer.cc b/xdl/ps-plus/ps-plus/scheduler/balance_placementer.cc index c21ad83f..aea64413 100644 --- a/xdl/ps-plus/ps-plus/scheduler/balance_placementer.cc +++ b/xdl/ps-plus/ps-plus/scheduler/balance_placementer.cc @@ -23,7 +23,7 @@ limitations under the License. #include #include #include -#include +#include "ps-plus/common/logging.h" namespace ps { namespace scheduler { @@ -46,6 +46,7 @@ struct VariableInfos { int64_t dense_visit_ids; int64_t sparse_visit_ids; bool no_split; + int64_t dimension; }; struct ServerInfo { @@ -184,7 +185,7 @@ class BalancePlacementer : public Placementer { std::string meta_addr = meta_var; std::unique_ptr s; PS_CHECK_STATUS(FileSystem::OpenReadStreamAny(meta_addr, &s)); - LOG(INFO) << "Load Placement Meta Info From:" << meta_addr; + LOG(INFO) << "Load Placement Meta Info From: " << meta_addr; size_t meta_size; size_t max_visit = 0; PS_CHECK_STATUS(s->ReadRaw(&meta_size)); @@ -193,9 +194,9 @@ class BalancePlacementer : public Placementer { std::string meta_data; PS_CHECK_STATUS(s->ReadStr(&meta_data)); std::istringstream is(meta_data); - is >> x.name >> x.visit_time >> x.dense_visit_ids >> x.sparse_visit_ids; + is >> x.name >> x.visit_time >> x.dense_visit_ids >> x.sparse_visit_ids >> x.dimension; if (x.visit_time > max_visit) { max_visit = x.visit_time; } - var_map[x.name] = x; + var_map[x.name] = x; } infos.mem = arg.mem; @@ -217,7 +218,7 @@ class BalancePlacementer : public Placementer { x.no_split = argiter == info.args.end() ? false : true; if (info.type == VariableInfo::kIndex) { if (info.shape.empty()) { - x.slice_num = 1; + x.slice_num = x.dimension; x.slice_mem = SizeOfType(info.datatype) * mem_ratio; if (x.visit_time == 0) { slice_ratio = 0; } else { slice_ratio = double(x.dense_visit_ids + x.sparse_visit_ids) / max_visit / x.slice_num; } @@ -228,14 +229,14 @@ class BalancePlacementer : public Placementer { for (size_t i = 1; i < info.shape.size(); i++) { slice_size *= info.shape[i]; } - x.slice_num = info.shape[0]; + x.slice_num = x.dimension; x.slice_mem = SizeOfType(info.datatype) * slice_size * mem_ratio; if (x.visit_time == 0) { slice_ratio = 0; } else { slice_ratio = double(x.dense_visit_ids + x.sparse_visit_ids) / max_visit / x.slice_num; } x.slice_net = SizeOfType(info.datatype) * slice_size * slice_ratio; x.slice_cpu = x.dense_visit_ids == 0 ? slice_size * slice_ratio : slice_size * kSparseCpuRatio * slice_ratio; } - } else if (info.type == VariableInfo::kHash) { + } else if (info.type == VariableInfo::kHash128 || info.type == VariableInfo::kHash64) { if (info.shape.empty()) { return Status::ArgumentError("Hash Should at least 1 dim"); } @@ -244,11 +245,11 @@ class BalancePlacementer : public Placementer { slice_size *= info.shape[i]; } x.slice_num = Hasher::kTargetRange; - x.slice_mem = double((SizeOfType(info.datatype) * slice_size * mem_ratio + kHashMem) * info.shape[0]) * 2 / Hasher::kTargetRange; + x.slice_mem = double((SizeOfType(info.datatype) * slice_size * mem_ratio + kHashMem) * x.dimension) * 2 / Hasher::kTargetRange; if (x.visit_time == 0) { slice_ratio = 0; } - else { slice_ratio = double(x.dense_visit_ids + x.sparse_visit_ids) / max_visit / info.shape[0]; } - x.slice_net = double(SizeOfType(info.datatype) * slice_size * info.shape[0] * slice_ratio) / Hasher::kTargetRange; - x.slice_cpu = double(kHashCpuRatio * slice_size * info.shape[0] * slice_ratio) / Hasher::kTargetRange; + else { slice_ratio = double(x.dense_visit_ids + x.sparse_visit_ids) / max_visit / x.dimension; } + x.slice_net = double(SizeOfType(info.datatype) * slice_size * x.dimension * slice_ratio) / Hasher::kTargetRange; + x.slice_cpu = double(kHashCpuRatio * slice_size * x.dimension * slice_ratio) / Hasher::kTargetRange; } else { return Status::NotImplemented("Balance Placementer not support type: " + std::to_string(info.type) + " @ " + info.name); } @@ -283,6 +284,10 @@ class BalancePlacementer : public Placementer { } ptr++; } + if (!info.shape.empty()) { + auto iter = var_map.find(info.name); + info.shape[0] = iter->second.dimension; + } outputs->push_back(info); } return Status::Ok(); diff --git a/xdl/ps-plus/ps-plus/scheduler/balance_placementer_v2.cc b/xdl/ps-plus/ps-plus/scheduler/balance_placementer_v2.cc new file mode 100644 index 00000000..28a4e84d --- /dev/null +++ b/xdl/ps-plus/ps-plus/scheduler/balance_placementer_v2.cc @@ -0,0 +1,321 @@ +/* Copyright (C) 2016-2018 Alibaba Group Holding Limited + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "ps-plus/scheduler/placementer.h" +#include "ps-plus/common/hasher.h" +#include "ps-plus/common/logging.h" + +#include +#include +#include + +namespace ps { +namespace scheduler { + +static const double kHashMem = 128; +static const double kDefaultMemRatio = 2; + +namespace { + +struct VariableInfos { + struct Variable { + enum Type { + kDense, + kSparse, + kHash + }; + Type type; + std::string name; + double slice_mem; + double slice_net; + size_t slice_num; + bool no_split; + }; + + struct ServerInfo { + double mem; + double net; + size_t socket; + }; + + std::vector dense_vars; + std::vector sparse_vars; + std::vector hash_vars; + std::vector servers; + size_t mem; + double avg_net; + double avg_sparse_mem; +}; + +struct Solution { + struct Part { + size_t server; + size_t size; + }; + struct Server { + double mem; + double net; + size_t socket; + }; + std::unordered_map> parts_map; + std::vector servers; +}; + +bool CreateBase(const VariableInfos& infos, Solution* solution) { + for (auto server : infos.servers) { + solution->servers.push_back(Solution::Server{.mem = server.mem, .net = server.net, .socket = server.socket}); + } + std::vector vars; + vars.insert(vars.end(), infos.dense_vars.begin(), infos.dense_vars.end()); + vars.insert(vars.end(), infos.sparse_vars.begin(), infos.sparse_vars.end()); + vars.insert(vars.end(), infos.hash_vars.begin(), infos.hash_vars.end()); + //solution->parts.resize(vars.size()); + size_t s = 0; + for (size_t i = 0; i < vars.size(); i++) { + size_t a = vars[i].slice_num; + while (a > 0 && s < solution->servers.size()) { + size_t size = std::min((size_t)((infos.mem - solution->servers[s].mem) / vars[i].slice_mem + 1), a); + solution->servers[s].mem += vars[i].slice_mem * size; + //solution->parts[i].push_back(Solution::Part{.server = s, .size = size}); + a -= size; + if (solution->servers[s].mem >= infos.mem) { + s++; + } + } + if (s >= solution->servers.size()) { + break; + } + } + if (s >= solution->servers.size()) { + return false; + } + return true; +} + +void CreateBalance(const VariableInfos& infos, Solution* solution) { + for (auto server : infos.servers) { + solution->servers.push_back(Solution::Server{.mem = server.mem, .net = server.net, .socket = server.socket}); + } + size_t s = 0; + size_t total_socket = infos.dense_vars.size() + infos.sparse_vars.size() + infos.hash_vars.size(); + double avg_net = infos.avg_net; + double avg_sparse_mem = infos.avg_sparse_mem; + for (size_t i = 0; i < infos.hash_vars.size(); ++i) { + size_t a = infos.hash_vars[i].slice_num; + solution->parts_map[infos.hash_vars[i].name] = std::vector(); + for (size_t j = 0; j < solution->servers.size(); ++j) { + size_t size = std::min((size_t)(Hasher::kTargetRange / solution->servers.size()) + 1, a); + solution->servers[j].mem += infos.hash_vars[i].slice_mem * size; + solution->servers[j].socket++; + if (a != size) { total_socket++; } + solution->parts_map[infos.hash_vars[i].name].push_back(Solution::Part{.server = j, .size = size}); + a -= size; + if (a == 0) { break; } + } + } + s = 0; + for (size_t i = 0; i < infos.sparse_vars.size(); ++i) { + size_t a = infos.sparse_vars[i].slice_num; + solution->parts_map[infos.sparse_vars[i].name] = std::vector(); + while (a > 0 && s < solution->servers.size()) { + size_t size; + if (infos.avg_sparse_mem < solution->servers[s].mem) { + s++; + continue; + }; + size = std::min((size_t)((infos.avg_sparse_mem - solution->servers[s].mem) / infos.sparse_vars[i].slice_mem + 1) , a); + solution->servers[s].mem += infos.sparse_vars[i].slice_mem * size; + solution->servers[s].socket++; + if (a != size) { total_socket++; } + solution->parts_map[infos.sparse_vars[i].name].push_back(Solution::Part{.server = s, .size = size}); + a -= size; + if (solution->servers[s].mem >= infos.avg_sparse_mem) { + s++; + } + } + if (s >= solution->servers.size()) { + break; + } + } + if (s >= solution->servers.size()) { + LOG(INFO) << "Sparse variable memory out of range"; + } + s = 0; + for (size_t i = 0; i < infos.dense_vars.size(); ++i) { + size_t a = infos.dense_vars[i].slice_num; + solution->parts_map[infos.dense_vars[i].name] = std::vector(); + while (a > 0 && s < solution->servers.size()) { + size_t size; + if (infos.dense_vars[i].slice_net == 0) { + size = std::min((size_t)((infos.mem - solution->servers[s].mem) / infos.dense_vars[i].slice_mem) , a); + if ((double)(size * solution->servers.size()) / a < 0.2) { + s++; + if (s >= solution->servers.size()) { s = 0; total_socket += solution->servers.size(); avg_net *= 1.1; } + continue; + } + } else { + size = std::min((size_t)((avg_net - solution->servers[s].net) / infos.dense_vars[i].slice_net) , a); + size = std::min((size_t)((infos.mem - solution->servers[s].mem) / infos.dense_vars[i].slice_mem) , size); + if ((double)(size * solution->servers.size()) / a < 0.2) { + s++; + if (s >= solution->servers.size()) { s = 0; total_socket += solution->servers.size(); avg_net *= 1.1; } + continue; + } + } + if (infos.dense_vars[i].no_split == true && size != a) { + s++; + if (s >= solution->servers.size()) { s = 0; total_socket += solution->servers.size(); avg_net *= 1.1; } + continue; + } + solution->servers[s].mem += infos.dense_vars[i].slice_mem * size; + solution->servers[s].net += infos.dense_vars[i].slice_net * size; + if (infos.dense_vars[i].slice_net != 0) { solution->servers[s].socket++; } + if (a != size) { total_socket++; } + size_t iter; + for (iter = 0; iter < solution->parts_map[infos.dense_vars[i].name].size(); ++iter) { + if (s == solution->parts_map[infos.dense_vars[i].name][iter].server) { + solution->parts_map[infos.dense_vars[i].name][iter].size += size; + break; + } + } + if (iter == solution->parts_map[infos.dense_vars[i].name].size()) { + solution->parts_map[infos.dense_vars[i].name].push_back(Solution::Part{.server = s, .size = size}); + } + a -= size; + if (solution->servers[s].mem >= infos.mem || solution->servers[s].net >= avg_net + || solution->servers[s].socket >= total_socket / solution->servers.size() + 2) { + s++; + } + if (s >= solution->servers.size()) { s = 0; total_socket += solution->servers.size(); avg_net *= 1.1; } + } + } +} + +bool Get(const VariableInfos& infos, Solution* solution) { + Solution sol; + if (!CreateBase(infos, &sol)) { + return false; + } + CreateBalance(infos, solution); + return true; +} + +} + +class BalancePlacementerV2 : public Placementer { + public: + virtual Status Placement(const std::vector& inputs, std::vector* outputs, const Arg& arg, size_t server) override { + VariableInfos infos; + infos.mem = arg.mem; + double total_net = 0; + double total_sparse_mem = 0; + for (size_t i = 0; i < server; ++i) { + infos.servers.push_back(VariableInfos::ServerInfo{.mem = 0, .net = 0, .socket = 0}); + } + for (const VariableInfo& info : inputs) { + VariableInfos::Variable x; + x.name = info.name; + auto argiter = info.args.find("mem_ratio"); + double mem_ratio = argiter == info.args.end() ? kDefaultMemRatio : atof(argiter->second.c_str()); + argiter = info.args.find("no_split"); + x.no_split = argiter == info.args.end() ? false : true; + if (info.type == VariableInfo::kIndex) { + if (info.shape.empty()) { + x.slice_num = 1; + x.slice_mem = SizeOfType(info.datatype) * mem_ratio; + x.slice_net = SizeOfType(info.datatype); + x.type = VariableInfos::Variable::kDense; + } else { + size_t slice_size = 1; + for (size_t i = 1; i < info.shape.size(); i++) { + slice_size *= info.shape[i]; + } + auto iter = info.args.find("batch_read"); + double ratio = iter == info.args.end() ? 1 : atof(iter->second.c_str()) / info.shape[0]; + x.type = iter == info.args.end() ? VariableInfos::Variable::kDense : VariableInfos::Variable::kSparse; + x.slice_num = info.shape[0]; + x.slice_mem = SizeOfType(info.datatype) * slice_size * mem_ratio; + iter = info.args.find("io_ratio"); + double io_ratio = iter == info.args.end() ? 1 : atof(iter->second.c_str()); + x.slice_net = SizeOfType(info.datatype) * slice_size * ratio * io_ratio; + if (x.type == VariableInfos::Variable::kSparse) { + total_sparse_mem += x.slice_num * x.slice_mem; + } + } + } else if (info.type == VariableInfo::kHash128 || info.type == VariableInfo::kHash64) { + if (info.shape.empty()) { + return Status::ArgumentError("Hash Should at least 1 dim"); + } + size_t slice_size = 1; + for (size_t i = 1; i < info.shape.size(); i++) { + slice_size *= info.shape[i]; + } + auto iter = info.args.find("batch_read"); + int64_t batch_read = iter == info.args.end() ? info.shape[0] : atoll(iter->second.c_str()); + x.type = VariableInfos::Variable::kHash; + x.slice_num = Hasher::kTargetRange; + //x.slice_mem = double((SizeOfType(info.datatype) * slice_size * mem_ratio + kHashMem) * info.shape[0]) * 2 / Hasher::kTargetRange; + x.slice_mem = 1; + iter = info.args.find("io_ratio"); + double io_ratio = iter == info.args.end() ? 1 : atof(iter->second.c_str()); + x.slice_net = double(SizeOfType(info.datatype) * slice_size * batch_read * io_ratio) / Hasher::kTargetRange; + } else { + return Status::NotImplemented("Balance PlacementerV2 not support type: " + std::to_string(info.type) + " @ " + info.name); + } + if(x.type == VariableInfos::Variable::kDense) { + total_net += x.slice_net * x.slice_num; + } + if (info.parts.empty()) { + if (x.type == VariableInfos::Variable::kDense) { infos.dense_vars.push_back(x); } + else if (x.type == VariableInfos::Variable::kSparse) { infos.sparse_vars.push_back(x); } + else if (x.type == VariableInfos::Variable::kHash) { infos.hash_vars.push_back(x); } + } else { + for (auto&& part : info.parts) { + if (x.type == VariableInfos::Variable::kDense) { + infos.servers[part.server].net += x.slice_net * part.size; + } + infos.servers[part.server].mem += x.slice_mem * part.size; + infos.servers[part.server].socket++; + } + } + } + infos.avg_net = total_net / server; + infos.avg_sparse_mem = total_sparse_mem / server; + Solution solution; + if (infos.dense_vars.size() + infos.sparse_vars.size() + infos.hash_vars.size() > 0) { + bool result = Get(infos, &solution); + if (!result) { + return Status::ArgumentError("Cannot Placement, Too Heavy"); + } + } + outputs->clear(); + for (VariableInfo info : inputs) { + if (info.parts.empty()) { + auto parts_iter = solution.parts_map.find(info.name); + for (auto item : parts_iter->second) { + info.parts.push_back(VariableInfo::Part{.server = item.server, .size = item.size}); + } + } + outputs->push_back(info); + } + return Status::Ok(); + } +}; + +PLUGIN_REGISTER(Placementer, BalanceV2, BalancePlacementerV2); + +} +} + diff --git a/xdl/ps-plus/ps-plus/scheduler/scheduler_impl.cc b/xdl/ps-plus/ps-plus/scheduler/scheduler_impl.cc index c2c4f979..b140f074 100644 --- a/xdl/ps-plus/ps-plus/scheduler/scheduler_impl.cc +++ b/xdl/ps-plus/ps-plus/scheduler/scheduler_impl.cc @@ -20,28 +20,32 @@ limitations under the License. #include #include #include -#include +#include "ps-plus/common/logging.h" +#include "ps-plus/common/string_utils.h" #include "ps-plus/common/file_system.h" #include "ps-plus/common/serializer.h" #include "ps-plus/common/initializer/none_initializer.h" +#define CHECK_COND(cond, str) do {if (!(cond)) {return Status::ArgumentError(str);}} while(0); + using namespace ps; using namespace ps::scheduler; using namespace std; using namespace std::chrono; SchedulerImpl::SchedulerImpl( - const std::string& server_count, - const std::string& scheduler_addr, - const std::string& checkpoint_path, + const string& server_count, + const string& scheduler_addr, + const string& checkpoint_path, const Placementer::Arg& placement_arg, - const std::string& streaming_dense_model_addr, - const std::string& streaming_sparse_model_addr, - const std::string& streaming_hash_model_addr, + const string& streaming_dense_model_addr, + const string& streaming_sparse_model_addr, + const string& streaming_hash_model_addr, bool bind_cores) : main_thread_(nullptr), meta_thread_(nullptr), stopped_(false), ready_(false), version_(kUnusedVersion), + server_count_(server_count), checkpoint_path_(checkpoint_path), placement_arg_(placement_arg), streaming_dense_model_addr_(streaming_dense_model_addr), @@ -54,7 +58,7 @@ SchedulerImpl::SchedulerImpl( if (meta_var != NULL) { meta_string_ = meta_var; } else { meta_string_ = ""; } if (vp_string_ == "balance") { placementer_ = GetPlugin("Balance"); } - else { placementer_ = GetPlugin("Anneal"); } + else { placementer_ = GetPlugin("BalanceV2"); } lazy_queue_.reset(new ThreadPool(1)); synchronizer_queue_.reset(new ThreadPool(1)); } @@ -87,6 +91,10 @@ Version SchedulerImpl::GetVersion() { Status SchedulerImpl::RegisterServer(const ServerInfo& server) { unique_lock lock(m_); + if (disconnected_server_.find(server) != disconnected_server_.end()) { + LOG(INFO) << "Skip Disconnected Server " << server.ToString(); + return Status::ArgumentError("you are died."); + } const std::pair id(server.GetServerType(), server.GetId()); const auto& it = servers_.find(id); if (it == servers_.end()) { @@ -97,10 +105,11 @@ Status SchedulerImpl::RegisterServer(const ServerInfo& server) { ServerInfo old_server = it->second; if (old_server != server) { ready_ = false; + r_ready_ = false; servers_[id] = server; service_->SetServer(id.first, id.second, server.Address()); - LOG(INFO) << "Server" << old_server.ToString() << - " failed And Restore at " << server.ToString(); + LOG(INFO) << "Server" << old_server.ToString() << " failed And Restore at " << server.ToString(); + disconnected_server_.insert(old_server); op_cv_.notify_all(); } } @@ -128,16 +137,61 @@ void SchedulerImpl::Restore(Version version, const string& checkpoint, AssignOp(kRestore, version, checkpoint, cb); } -void SchedulerImpl::TriggerStreamingDense(Version version, OpCallback cb) { - lazy_queue_->Schedule([=](){cb(InternalTriggerStreamingDense(version));}); +void SchedulerImpl::TriggerStreamingDense(Version version, const std::string& stream_version, OpCallback cb) { + lazy_queue_->Schedule([=](){cb(InternalTriggerStreamingDense(version, stream_version));}); +} + +Status SchedulerImpl::InitGlobalQueue( + Version version, + const std::string& name, + const std::vector& paths, + size_t epochs, + bool epoch_isolate) { + std::unique_lock lock(mu_); + auto it = global_file_queues_.find(name); + if (it == global_file_queues_.end()) { + global_file_queues_[name].reset(new GlobalFileQueue()); + } + + return global_file_queues_[name]->Init( + paths, epochs, epoch_isolate); +} + +Status SchedulerImpl::GetNextFile( + Version version, + const std::string& name, + size_t worker_id, + WorkerState* ws) { + std::unique_lock lock(mu_); + return global_file_queues_[name]->GetNextFile( + worker_id, ws); +} + +Status SchedulerImpl::ReportWorkerState( + Version version, + const std::string& name, + size_t worker_id, + const std::vector& worker_states) { + std::unique_lock lock(mu_); + return global_file_queues_[name]->ReportWorkerState( + worker_id, worker_states); +} + +Status SchedulerImpl::RestoreWorkerState( + Version version, + const std::string& name, + size_t worker_id) { + std::unique_lock lock(mu_); + return global_file_queues_[name]->RestoreWorkerState( + worker_id); } -void SchedulerImpl::TriggerStreamingSparse(Version version, OpCallback cb) { - lazy_queue_->Schedule([=](){cb(InternalTriggerStreamingSparse(version));}); +void SchedulerImpl::TriggerStreamingSparse(Version version, const std::string& stream_version, OpCallback cb) { + lazy_queue_->Schedule([=](){cb(InternalTriggerStreamingSparse(version, stream_version));}); } -void SchedulerImpl::TriggerStreamingHash(Version version, OpCallback cb) { - lazy_queue_->Schedule([=](){cb(InternalTriggerStreamingHash(version));}); +void SchedulerImpl::TriggerStreamingHash(Version version, const std::string& stream_version, OpCallback cb) { + lazy_queue_->Schedule([=](){cb(InternalTriggerStreamingHash(version, stream_version));}); } void SchedulerImpl::AsynchronizeEnter(Version version, int id, int staleness, int worker_count, @@ -159,7 +213,6 @@ void SchedulerImpl::SynchronizeLeave(Version version, int id, int64_t token, fun }); } - void SchedulerImpl::WorkerReportFinish(Version version, int id, function cb) { synchronizer_queue_->Schedule([=] { InternalWorkerReportFinish(version, id, cb); @@ -172,6 +225,24 @@ void SchedulerImpl::WorkerBarrier(Version version, int id, int worker_count, fun }); } +void SchedulerImpl::WorkerBarrierV2( + Version version, + int barrier_id, + int task_id, + int task_num, + int token, + function cb) { + synchronizer_queue_->Schedule([=] { + InternalWorkerBarrierV2(version, barrier_id, task_id, task_num, token, cb); + }); +} + +void SchedulerImpl::GetWorkerFinishCount(Version version, function cb) { + synchronizer_queue_->Schedule([=] { + InternalGetWorkerFinishCount(version, cb); + }); +} + Status SchedulerImpl::UpdateVariableInfo(Version version, const vector& info, vector* result) { @@ -185,11 +256,21 @@ Status SchedulerImpl::InternalUpdateVariableInfo(const vector& inf map m; for (const auto& i: info) { m[i.name] = i; } for (auto& i: variable_info_) { - if (m[i.name].type == VariableInfo::Type::kHash) { + if (m[i.name].type == VariableInfo::Type::kHash128 || m[i.name].type == VariableInfo::Type::kHash64) { i.shape[0] = m[i.name].shape[0]; } } for (const auto& i: variable_info_) { m[i.name] = i; } + + // fill in new args + std::vector arg_names{"save_ratio", "batch_read", "mem_ratio", "no_split", "save", VariableInfo::ORIGIN_NAME, VariableInfo::ORIGIN_FILE_PATH}; + for (const auto& i: info) { + for (auto& arg_name: arg_names) { + auto it = i.args.find(arg_name); + if (it != i.args.end()) m[i.name].args[arg_name] = it->second; + } + } + vector v; for (const auto& it: m) { v.push_back(it.second); } const auto& st = placementer_->Placement(v, result, placement_arg_, service_->GetServerSize(0)); @@ -199,7 +280,7 @@ Status SchedulerImpl::InternalUpdateVariableInfo(const vector& inf return Status::Ok(); } -Status SchedulerImpl::UpdateVariableVisitInfo(Version version, const std::string& var_name, int64_t ids) { +Status SchedulerImpl::UpdateVariableVisitInfo(Version version, const string& var_name, int64_t ids) { unique_lock lock(m_); if (!ready_) { return Status::NotReady("Cluster is not ready"); } if (version != version_) { return VersionMismatch(version_, version); } @@ -207,8 +288,8 @@ Status SchedulerImpl::UpdateVariableVisitInfo(Version version, const std::string if (i.name == var_name) { i.visit_time++; if (ids < 0) { - if (i.shape.empty()) { i.dense_visit_ids += 1; } - else { i.dense_visit_ids += i.shape[0]; } + if (i.shape.empty()) { i.dense_visit_ids += 1; } + else { i.dense_visit_ids += i.shape[0]; } } else { i.sparse_visit_ids += ids; } @@ -252,8 +333,16 @@ Status SchedulerImpl::WriteMetaInfo() { PS_CHECK_STATUS(FileSystem::OpenWriteStreamAny(meta_string_, &s)); PS_CHECK_STATUS(s->WriteRaw(variable_info_.size())); for (auto& info : variable_info_) { - std::string data = info.name + " " + std::to_string(info.visit_time) + " " - + std::to_string(info.dense_visit_ids) + " " + std::to_string(info.sparse_visit_ids) + "\n"; + string data; + if (info.shape.empty()) { + data = info.name + " " + std::to_string(info.visit_time) + " " + + std::to_string(info.dense_visit_ids) + " " + std::to_string(info.sparse_visit_ids) + " " + + std::to_string(1) + "\n"; + } else { + data = info.name + " " + std::to_string(info.visit_time) + " " + + std::to_string(info.dense_visit_ids) + " " + std::to_string(info.sparse_visit_ids) + " " + + std::to_string(info.shape[0]) + "\n"; + } PS_CHECK_STATUS(s->WriteStr(data)); } } @@ -265,16 +354,16 @@ void SchedulerImpl::MainLoop() { // First Run: Must Have a restore op switch (op_code_) { case kSave: { - LOG(INFO) << "Saving checkpoint :" << op_checkpoint_; + LOG(INFO) << "Saving checkpoint " << op_checkpoint_; Status st = InternalSave(op_checkpoint_); - LOG(INFO) << "Saving checkpoint :" << op_checkpoint_ << ", Get Status: " << st.ToString(); + LOG(INFO) << "Saving checkpoint " << op_checkpoint_ << ", Get Status " << st.ToString(); op_cb_(st); break; } case kRestore: { - LOG(INFO) << "Restore checkpoint: " << op_checkpoint_; + LOG(INFO) << "Restore checkpoint " << op_checkpoint_; Status st = InternalRestore(op_checkpoint_); - LOG(INFO) << "Restore checkpoint :" << op_checkpoint_ << ", Get Status: " << st.ToString(); + LOG(INFO) << "Restore checkpoint " << op_checkpoint_ << ", Get Status " << st.ToString(); op_cb_(st); if (sync_) { sync_->Reset(); } break; @@ -351,8 +440,7 @@ void SchedulerImpl::AssignOp(OpCode code, Version version, op_checkpoint_ = checkpoint; op_cb_ = cb; op_cv_.notify_all(); - LOG(INFO) << "Schedule a new op to " << OpName(code) << - " checkpoint:" << checkpoint; + LOG(INFO) << "Schedule a new op to " << OpName(code) << " checkpoint " << checkpoint; } } @@ -362,7 +450,7 @@ void SchedulerImpl::WaitForServers() { unique_lock lock(m_); const size_t n = service_->GetServerTotalSize() - servers_.size(); if (n == 0) { return; } - LOG(INFO) << "Waiting for " << n << " more servers"; + LOG(INFO) << "Waiting for " << n << " more server"; } this_thread::sleep_for(seconds(1)); } @@ -378,26 +466,12 @@ Status SchedulerImpl::InternalRestore(const string& checkpoint) { // disable ready_ = false; + r_ready_ = true; version_ = NewRandomVersion(); - - std::vector checkpoints; - { - std::unique_ptr s; - Status st = FileSystem::OpenReadStreamAny(checkpoint_path_ + "/checkpoints", &s); - LOG(INFO) << "st is " << st.ToString(); - // Ignore st fail when we use a fresh checkpoint dir - if (st.IsOk()) { - size_t size; - PS_CHECK_STATUS(s->ReadRaw(&size)); - checkpoints.resize(size); - for (size_t i = 0; i < size; i++) { - PS_CHECK_STATUS(s->ReadStr(&checkpoints[i])); - } - } - } - - std::string real_checkpoint = ""; + vector checkpoints; + PS_CHECK_STATUS(ReadCheckpoints(checkpoint_path_, true, &checkpoints)); + string real_checkpoint = ""; if (checkpoint == "") { real_checkpoint = checkpoints.size() == 0 ? "" : checkpoints.back(); } else { @@ -411,90 +485,45 @@ Status SchedulerImpl::InternalRestore(const string& checkpoint) { return Status::NotFound("Checkpoint Not Found : " + checkpoint); } } - + LOG(INFO) << "Real checkpoint is " << real_checkpoint; - std::vector infos; - - if (real_checkpoint != "") { - std::unique_ptr s; - PS_CHECK_STATUS(FileSystem::OpenReadStreamAny(checkpoint_path_ + "/" + real_checkpoint + "/__meta__", &s)); - size_t old_server; - - { - size_t infos_type; - std::string infos_buf; - PS_CHECK_STATUS(s->ReadRaw(&old_server)); - PS_CHECK_STATUS(s->ReadRaw(&infos_type)); - PS_CHECK_STATUS(s->ReadStr(&infos_buf)); - Data* info_wrapper; - size_t len; - serializer::MemGuard mem; - serializer::Fragment frag(&infos_buf[0], infos_buf.size()); - PS_CHECK_STATUS(serializer::DeserializeAny(infos_type, &frag, 0, &info_wrapper, &len, mem)); - std::unique_ptr info_wrapper_deleter(info_wrapper); - WrapperData* info_wrapper_converted = dynamic_cast*>(info_wrapper); - if (info_wrapper_converted == nullptr) { - return Status::Unknown("Variable Info Load Error"); - } - infos = info_wrapper_converted->Internal().infos; - } - - if (old_server != service_->GetServerSize(0)) { - LOG(INFO) << "Change ps_num from " << old_server << " to " << service_->GetServerSize(0); - } - LOG(INFO) << "Info from checkpoint " << PrintVariableInfo(infos); - vector result; - vector input_infos = infos; - for (auto& i: input_infos) { - i.parts.clear(); - } - Status st = InternalUpdateVariableInfo(input_infos, &result); - if (!st.IsOk()) { - return st; - } - variable_info_ = result; - LOG(INFO) << "Info from placement " << PrintVariableInfo(variable_info_); - } else { - infos = variable_info_; - } - - LOG(INFO) << "Real Checkpoints[" << real_checkpoint << "] with info_size[" << infos.size() << "]"; + vector source_infos; + PS_CHECK_STATUS(GenerateVariableInfo(real_checkpoint, &source_infos)); + PS_CHECK_STATUS(RestoreGlobalQueue(checkpoint_path_ + "/" + real_checkpoint)); count_down = service_->GetServerTotalSize(); - - for (auto& it: servers_) { - ServerInfo& server = it.second; - ServerId id = server.GetId(); + LOG(INFO) << "VariableInfos " << PrintVariableInfo(variable_info_); + for (const auto& it: servers_) { + const ServerInfo& server = it.second; + const ServerId id = server.GetId(); ServerType server_type = server.GetServerType(); if (server_type == 0) { service_->ServerRestore( server_type, id, version_, - real_checkpoint == "" ? "" : checkpoint_path_ + "/" + real_checkpoint, - infos, variable_info_, [id, &result, &mu, &collect, &count_down](Status st) { - std::unique_lock lock(mu); - if (!st.IsOk() && collect.IsOk()) { - collect = st; - } - std::string st_str = st.IsOk() ? "OK" : st.Msg(); - LOG(INFO) << "server " << id << " finish restore, status " << st_str << " waiting " << count_down - 1 << " more."; - if (--count_down == 0) { - lock.unlock(); - result.set_value(collect); - } - }); + source_infos, variable_info_, [id, &result, &mu, &collect, &count_down](Status st) { + std::unique_lock lock(mu); + if (!st.IsOk() && collect.IsOk()) { + collect = st; + } + if (--count_down == 0) { + lock.unlock(); + result.set_value(collect); + } + LOG(INFO) << "server " << id << " finish restore, status " << (st.IsOk() ? "OK" : st.Msg()) << ", waiting " << count_down << " more"; + }); } else { service_->ModelServerFlush( server_type, id, version_, [&result, &mu, &collect, &count_down](Status st) { - std::unique_lock lock(mu); - if (!st.IsOk() && collect.IsOk()) { - collect = st; - } - if (--count_down == 0) { - lock.unlock(); - result.set_value(collect); - } - }); + std::unique_lock lock(mu); + if (!st.IsOk() && collect.IsOk()) { + collect = st; + } + if (--count_down == 0) { + lock.unlock(); + result.set_value(collect); + } + }); } } } @@ -502,11 +531,77 @@ Status SchedulerImpl::InternalRestore(const string& checkpoint) { if (collect.IsOk()) { // enable unique_lock lock(m_); - ready_ = true; + ready_ = r_ready_; } return collect; } +Status SchedulerImpl::GenerateVariableInfo(string real_checkpoint, vector* source) { + std::string checkpoint = ""; + if (real_checkpoint != "") { + checkpoint += "*@" + checkpoint_path_ + "/" + real_checkpoint; + } + if (checkpoint != "") { + vector result; + PS_CHECK_STATUS(ParseVariables(checkpoint, source)); + vector input_infos = *source; + for (auto& i: input_infos) { + i.parts.clear(); + } + PS_CHECK_STATUS(InternalUpdateVariableInfo(input_infos, &result)); + variable_info_ = result; + } else { + LOG(INFO) << "Empty checkpoint, not load"; + } + return Status::Ok(); +} + +Status SchedulerImpl::ParseVariables(const std::string& checkpoint, vector* result) { + map var_map; + vector v = StringUtils::split(checkpoint, "@"); + string source_path = v[1]; + if (source_path.back() == '/') { + source_path = source_path.substr(0, source_path.size()-1); + } + vector checkpoints; + PS_CHECK_STATUS(ReadCheckpoints(source_path, true, &checkpoints)); + if (checkpoints.size() != 0) { + source_path += "/" + checkpoints.back(); + } + size_t server_num; + std::vector infos; + PS_CHECK_STATUS(ReadVariableInfoMeta(source_path, &server_num, &infos)); + for (VariableInfo& info : infos) { + info.args[VariableInfo::ORIGIN_FILE_PATH] = source_path; + info.args[VariableInfo::ORIGIN_NAME] = info.name; + var_map[info.name] = info; + } + for (auto& iter : var_map) { + result->push_back(iter.second); + } + return Status::Ok(); +} + +string SchedulerImpl::PrintVariableInfo(const vector& infos) { + string logger = ""; + for (const auto& item : infos) { + logger += item.name + " result; std::mutex mu; @@ -525,11 +620,17 @@ Status SchedulerImpl::InternalSave(const string& checkpoint) { PS_CHECK_STATUS(FileSystem::OpenWriteStreamAny(checkpoint_path_ + "/" + checkpoint + "/__meta__", &s)); { - std::string infos_buf; + string infos_buf; size_t infos_type; std::unique_ptr> info_wrapper(new WrapperData); - info_wrapper->Internal().infos = variable_info_; - std::vector frags; + for (const auto& info: variable_info_) { + auto iter = info.args.find("save"); + if (iter != info.args.end() && iter->second == "false") { + continue; + } + info_wrapper->Internal().infos.push_back(info); + } + vector frags; serializer::MemGuard mem; PS_CHECK_STATUS(serializer::SerializeAny(info_wrapper.get(), &infos_type, &frags, mem)); for (auto frag : frags) { @@ -549,22 +650,23 @@ Status SchedulerImpl::InternalSave(const string& checkpoint) { ServerType server_type = server.GetServerType(); if (server_type == 0) { service_->ServerSave(server_type, id, version_, checkpoint_path_ + "/" + checkpoint, variable_info_, [id, &result, &mu, &collect, &count_down](Status st) { - std::unique_lock lock(mu); - if (!st.IsOk() && collect.IsOk()) { - collect = st; - } - if (--count_down == 0) { - lock.unlock(); - result.set_value(collect); - } - }); + std::unique_lock lock(mu); + if (!st.IsOk() && collect.IsOk()) { + collect = st; + } + if (--count_down == 0) { + lock.unlock(); + result.set_value(collect); + } + LOG(INFO) << "server " << id << " finish save, status " << (st.IsOk() ? "OK" : st.Msg()) << ", waiting " << count_down << " more."; + }); } } } result.get_future().wait(); PS_CHECK_STATUS(collect); - std::vector checkpoints; + vector checkpoints; { std::unique_ptr s; Status st = FileSystem::OpenReadStreamAny(checkpoint_path_ + "/checkpoints", &s); @@ -591,11 +693,19 @@ Status SchedulerImpl::InternalSave(const string& checkpoint) { FileSystem::RemoveAny(checkpoint_path_ + "/checkpoints"); PS_CHECK_STATUS(FileSystem::RenameAny(checkpoint_path_ + "/checkpoints.tmp", checkpoint_path_ + "/checkpoints")); + { + std::unique_ptr s; + PS_CHECK_STATUS(FileSystem::OpenWriteStreamAny(checkpoint_path_ + "/" + checkpoint + "/global_queue_meta", &s)); + std::string queue_buf; + PS_CHECK_STATUS(SerializeGlobalQueue(&queue_buf)); + PS_CHECK_STATUS(s->WriteStr(queue_buf)); + } + return Status::Ok();; } -Status SchedulerImpl::InternalTriggerStreamingDense(Version version) { - std::vector variable_info; +Status SchedulerImpl::InternalTriggerStreamingDense(Version version, const std::string& stream_version) { + vector variable_info; { unique_lock lock(m_); if (!ready_) { @@ -612,7 +722,7 @@ Status SchedulerImpl::InternalTriggerStreamingDense(Version version) { if (streaming_dense_model_writer_ == nullptr) { return Status::Unknown("Dense Model Writer Open Error"); } - std::unordered_set dense_vars; + std::unordered_set dense_vars; for (auto& info : variable_info) { if (info.args["streaming_dense_output"] == "true") { dense_vars.insert(info.name); @@ -633,19 +743,19 @@ Status SchedulerImpl::InternalTriggerStreamingDense(Version version) { service_->ServerStreamingDenseVarName( server_type, id, version, [&, id](Status st, const DenseVarNames& vars) { - std::unique_lock lock(mu); - if (!st.IsOk() && collect.IsOk()) { - collect = st; - } else { - for (auto& item : vars.names) { - dense_vars.insert(item); - } - } - if (--count_down == 0) { - lock.unlock(); - result.set_value(collect); - } - }); + std::unique_lock lock(mu); + if (!st.IsOk() && collect.IsOk()) { + collect = st; + } else { + for (auto& item : vars.names) { + dense_vars.insert(item); + } + } + if (--count_down == 0) { + lock.unlock(); + result.set_value(collect); + } + }); } } } @@ -656,7 +766,7 @@ Status SchedulerImpl::InternalTriggerStreamingDense(Version version) { for (auto& item : dense_vars) { vars.names.push_back(item); } - std::unordered_map> values; + std::unordered_map> values; { std::promise result; std::mutex mu; @@ -672,35 +782,35 @@ Status SchedulerImpl::InternalTriggerStreamingDense(Version version) { service_->ServerGatherStreamingDenseVar( server_type, id, version, vars, [&count_down, &mu, &result, &collect, &values, id](Status st, const DenseVarValues& val) { - std::unique_lock lock(mu); - if (!st.IsOk() && collect.IsOk()) { - collect = st; - } else { - for (auto& item : val.values) { - Tensor copy_tensor(item.data.Type(), item.data.Shape(), new initializer::NoneInitializer); - memcpy(copy_tensor.Raw(), item.data.Raw(), SizeOfType(copy_tensor.Type()) * copy_tensor.Shape().NumElements()); - values[item.name].push_back(DenseVarValues::DenseVarValue{ - .name = item.name, - .offset = item.offset, - .data = copy_tensor - }); - } - } - if (--count_down == 0) { - lock.unlock(); - result.set_value(collect); - } - }); + std::unique_lock lock(mu); + if (!st.IsOk() && collect.IsOk()) { + collect = st; + } else { + for (auto& item : val.values) { + Tensor copy_tensor(item.data.Type(), item.data.Shape(), new initializer::NoneInitializer); + memcpy(copy_tensor.Raw(), item.data.Raw(), SizeOfType(copy_tensor.Type()) * copy_tensor.Shape().NumElements()); + values[item.name].push_back(DenseVarValues::DenseVarValue{ + .name = item.name, + .offset = item.offset, + .data = copy_tensor + }); + } + } + if (--count_down == 0) { + lock.unlock(); + result.set_value(collect); + } + }); } } } result.get_future().wait(); PS_CHECK_STATUS(collect); } - std::unordered_map datas; + std::unordered_map datas; for (auto& item : values) { - std::string name = item.first; - std::vector val = item.second; + string name = item.first; + vector val = item.second; VariableInfo info; bool found = false; for (auto& xinfo : variable_info) { @@ -713,7 +823,7 @@ Status SchedulerImpl::InternalTriggerStreamingDense(Version version) { if (!found) { return Status::NotFound("Not Found variable info: " + name); } - Tensor result(info.datatype, TensorShape(std::vector(info.shape.begin(), info.shape.end())), new initializer::NoneInitializer); + Tensor result(info.datatype, TensorShape(vector(info.shape.begin(), info.shape.end())), new initializer::NoneInitializer); size_t slice_size = SizeOfType(info.datatype); for (size_t i = 1; i < info.shape.size(); i++) { slice_size *= info.shape[i]; @@ -746,15 +856,15 @@ Status SchedulerImpl::InternalTriggerStreamingDense(Version version) { } datas[name] = result; } - std::vector result; + vector result; for (auto& item : datas) { result.push_back(StreamingModelWriter::DenseModel{.name = item.first, .data = item.second}); } - Status rst = streaming_dense_model_writer_->WriteDenseModel(result); + Status rst = streaming_dense_model_writer_->WriteDenseModel(result, stream_version); return rst; } -Status SchedulerImpl::InternalTriggerStreamingSparse(Version version) { +Status SchedulerImpl::InternalTriggerStreamingSparse(Version version, const std::string& stream_version) { { unique_lock lock(m_); if (!ready_) { @@ -777,17 +887,17 @@ Status SchedulerImpl::InternalTriggerStreamingSparse(Version version) { ServerId id = server.GetId(); if (server_type == 0) { service_->ServerTriggerStreamingSparse( - server_type, id, version, + server_type, id, version, stream_version, [id, &result, &mu, &collect, &count_down](Status st) { - std::unique_lock lock(mu); - if (!st.IsOk() && collect.IsOk()) { - collect = st; - } - if (--count_down == 0) { - lock.unlock(); - result.set_value(collect); - } - }); + std::unique_lock lock(mu); + if (!st.IsOk() && collect.IsOk()) { + collect = st; + } + if (--count_down == 0) { + lock.unlock(); + result.set_value(collect); + } + }); } } } @@ -797,7 +907,7 @@ Status SchedulerImpl::InternalTriggerStreamingSparse(Version version) { return Status::Ok(); } -Status SchedulerImpl::InternalTriggerStreamingHash(Version version) { +Status SchedulerImpl::InternalTriggerStreamingHash(Version version, const std::string& stream_version) { { unique_lock lock(m_); if (!ready_) { @@ -820,17 +930,17 @@ Status SchedulerImpl::InternalTriggerStreamingHash(Version version) { ServerType server_type = server.GetServerType(); if (server_type == 0) { service_->ServerTriggerStreamingHash( - server_type, id, version, + server_type, id, version, stream_version, [id, &result, &mu, &collect, &count_down](Status st) { - std::unique_lock lock(mu); - if (!st.IsOk() && collect.IsOk()) { - collect = st; - } - if (--count_down == 0) { - lock.unlock(); - result.set_value(collect); - } - }); + std::unique_lock lock(mu); + if (!st.IsOk() && collect.IsOk()) { + collect = st; + } + if (--count_down == 0) { + lock.unlock(); + result.set_value(collect); + } + }); } } } @@ -869,35 +979,130 @@ void SchedulerImpl::InternalWorkerReportFinish(Version version, int id, function return; } } + finished_workers_.insert(id); - auto iter = worker_barriers_.find(id); - if (iter != worker_barriers_.end()) { - worker_barriers_.erase(iter); + + { + auto iter = worker_barriers_.find(id); + if (iter != worker_barriers_.end()) { + worker_barriers_.erase(iter); + } + + if (worker_barriers_.size() == worker_count_ - finished_workers_.size()) { + for (auto iter : worker_barriers_) { + (iter.second)(Status::Ok()); + } + + worker_barriers_.clear(); + } } - if (worker_barriers_.size() == worker_count_ - finished_workers_.size()) { - for (auto iter : worker_barriers_) { - (iter.second)(Status::Ok()); + + { + auto iter = barrier_infos_.find(id); + if (iter != barrier_infos_.end()) { + barrier_infos_.erase(iter); + } + + if (barrier_infos_.size() == worker_count_ - finished_workers_.size()) { + for (auto iter : barrier_infos_) { + (iter.second.cb)(Status::Ok()); + } + + barrier_infos_.clear(); } - worker_barriers_.clear(); } + cb(Status::Ok()); } void SchedulerImpl::InternalWorkerBarrier(Version version, int id, int worker_count, function cb) { - worker_count_ = worker_count; + worker_count_ = worker_count; if (version != version_) { cb(VersionMismatch(version_, version)); return; } worker_barriers_[id] = cb; if (worker_barriers_.size() == worker_count - finished_workers_.size()) { - for (auto iter : worker_barriers_) { - (iter.second)(Status::Ok()); + for (auto iter : worker_barriers_) { + (iter.second)(Status::Ok()); + } + worker_barriers_.clear(); + } +} + +void SchedulerImpl::InternalWorkerBarrierV2( + Version version, + int barrier_id, + int task_id, + int task_num, + int token, + function cb) { + worker_count_ = task_num; + if (version != version_) { + cb(VersionMismatch(version_, version)); + return; + } + + auto it = barrier_tokens_.find(task_id); + if (it == barrier_tokens_.end()) { + barrier_tokens_[task_id] = token; + } + + BarrierV2Info bi = BarrierV2Info{ + .token=token, + .barrier_id=barrier_id, + .cb=cb}; + + if (barrier_tokens_[task_id] == token) { + if (barrier_infos_.empty()) { + for (auto& it: failover_barrier_infos_) { + if (it.second.barrier_id == barrier_id) { + barrier_infos_[it.first] = it.second; + } else { + (it.second.cb)(Status::Ok()); + } } - worker_barriers_.clear(); + + failover_barrier_infos_.clear(); + } + + BarrierAddAndNotifyAll(task_id, bi); + } else { + // failovered worker + barrier_tokens_[task_id] = token; + if (barrier_infos_.empty()) { + failover_barrier_infos_[task_id] = bi; + } else { + if (barrier_infos_.begin()->second.barrier_id == barrier_id) { + BarrierAddAndNotifyAll(task_id, bi); + } else { + cb(Status::Ok()); + } + } + } +} + +void SchedulerImpl::BarrierAddAndNotifyAll( + int task_id, const BarrierV2Info& bi) { + barrier_infos_[task_id] = bi; + if (barrier_infos_.size() == worker_count_ - finished_workers_.size()) { + for (auto& it: barrier_infos_) { + (it.second.cb)(Status::Ok()); + } + + barrier_infos_.clear(); } } +void SchedulerImpl::InternalGetWorkerFinishCount(Version version, function cb) { + if (version != version_) { + cb(-1, VersionMismatch(version_, version)); + return; + } + int64_t size = finished_workers_.size(); + cb(size, Status::Ok()); +} + void SchedulerImpl::InternalSynchronizeEnter(Version version, int id, int worker_count, function cb) { if (version != version_) { @@ -929,18 +1134,97 @@ void SchedulerImpl::InternalSynchronizeLeave(Version version, int id, int64_t to sync->Leave(id, token, cb); } -std::string SchedulerImpl::PrintVariableInfo(const std::vector& infos) { - std::string logger = ""; - for (const auto& item : infos) { - logger += item.name + " s; + Status st = FileSystem::OpenReadStreamAny(ckpt_dir + "/global_queue_meta", &s); + if (st.IsOk()) { + std::string queue_state; + PS_CHECK_STATUS(s->ReadStr(&queue_state)); + PS_CHECK_STATUS(DeserializeGlobalQueue(queue_state)); + } + + return Status::Ok(); +} + +Status SchedulerImpl::SerializeGlobalQueue(std::string* buf) { + std::unique_lock lock(mu_); + size_t size = global_file_queues_.size(); + buf->append((char*)&size, sizeof(size_t)); + for (auto& it: global_file_queues_) { + size_t name_size = it.first.size(); + buf->append((char*)&name_size, sizeof(size_t)); + buf->append((char*)it.first.data(), it.first.size()); + std::string queue_state; + it.second->Serialize(&queue_state); + size_t queue_state_size = queue_state.size(); + buf->append((char*)&queue_state_size, sizeof(size_t)); + buf->append((char*)queue_state.data(), queue_state.size()); + } + + return Status::Ok(); +} + +Status SchedulerImpl::DeserializeGlobalQueue(const std::string& buf) { + std::unordered_map > queues; + char* ptr = const_cast(buf.data()); + size_t len = *(reinterpret_cast(ptr)); + ptr += sizeof(size_t); + for (size_t i = 0; i < len; ++i) { + size_t name_len = *(reinterpret_cast(ptr)); + ptr += sizeof(size_t); + std::string name; + name.assign(ptr, name_len); + ptr += name_len; + size_t queue_state_len = *(reinterpret_cast(ptr)); + ptr += sizeof(size_t); + std::string queue_state; + queue_state.assign(ptr, queue_state_len); + ptr += queue_state_len; + queues[name].reset(new GlobalFileQueue()); + PS_CHECK_STATUS(queues[name]->Deserialize(queue_state)); + } + + std::unique_lock lock(mu_); + global_file_queues_ = std::move(queues); + return Status::Ok(); +} + +Status SchedulerImpl::ReadCheckpoints(const std::string& ckpt_dir, bool ignoreError, std::vector* checkpoints) { + std::unique_ptr s; + Status st = FileSystem::OpenReadStreamAny(ckpt_dir + "/checkpoints", &s); + if (st.IsOk()) { + size_t size; + PS_CHECK_STATUS(s->ReadRaw(&size)); + checkpoints->resize(size); + for (size_t i = 0; i < size; i++) { + PS_CHECK_STATUS(s->ReadStr(&(*checkpoints)[i])); } - return logger; -} + return Status::Ok(); + } else if (ignoreError) { + return Status::Ok(); + } else { + return st; + } +} + +Status SchedulerImpl::ReadVariableInfoMeta(const std::string& path, size_t* server_num, std::vector* result) { + std::unique_ptr s; + PS_CHECK_STATUS(FileSystem::OpenReadStreamAny(path + "/__meta__", &s)); + size_t infos_type; + std::string infos_buf; + PS_CHECK_STATUS(s->ReadRaw(server_num)); + PS_CHECK_STATUS(s->ReadRaw(&infos_type)); + PS_CHECK_STATUS(s->ReadStr(&infos_buf)); + Data* info_wrapper; + size_t len; + serializer::MemGuard mem; + serializer::Fragment frag(&infos_buf[0], infos_buf.size()); + PS_CHECK_STATUS(serializer::DeserializeAny(infos_type, &frag, 0, &info_wrapper, &len, mem)); + std::unique_ptr info_wrapper_deleter(info_wrapper); + WrapperData* info_wrapper_converted = dynamic_cast*>(info_wrapper); + if (info_wrapper_converted == nullptr) { + return Status::Unknown("Variable Info Load Error"); + } + *result = info_wrapper_converted->Internal().infos; + return Status::Ok(); +} diff --git a/xdl/ps-plus/ps-plus/scheduler/scheduler_impl.h b/xdl/ps-plus/ps-plus/scheduler/scheduler_impl.h index 465caf5f..7daec1e3 100644 --- a/xdl/ps-plus/ps-plus/scheduler/scheduler_impl.h +++ b/xdl/ps-plus/ps-plus/scheduler/scheduler_impl.h @@ -14,8 +14,7 @@ limitations under the License. ==============================================================================*/ #ifndef PS_SCHEDULER_SCHEDULER_IMPL_H_ -#define PS_SCHEDULER_SCHEDULER_IMPL_H_ - +#define PS_SCHEDULER_SCHEDULER_IMPL_H_ #include #include #include @@ -23,6 +22,7 @@ limitations under the License. #include #include #include +#include #include "ps-plus/common/status.h" #include "ps-plus/message/cluster_info.h" @@ -30,10 +30,12 @@ limitations under the License. #include "ps-plus/message/version.h" #include "ps-plus/common/thread_pool.h" #include "ps-plus/message/streaming_model_manager.h" +#include "ps-plus/message/worker_state.h" #include "placementer.h" #include "scheduler_service.h" #include "synchronizer.h" +#include "ps-plus/common/global_file_queue.h" namespace ps { namespace scheduler { @@ -64,9 +66,29 @@ class SchedulerImpl { Status GetClusterInfo(const Version version, ClusterInfo* result); void Save(Version version, const std::string& checkpoint, OpCallback cb); void Restore(Version version, const std::string& checkpoint, OpCallback cb); - void TriggerStreamingDense(Version version, OpCallback cb); - void TriggerStreamingSparse(Version version, OpCallback cb); - void TriggerStreamingHash(Version version, OpCallback cb); + void TriggerStreamingDense(Version version, const std::string& stream_version, OpCallback cb); + void TriggerStreamingSparse(Version version, const std::string& stream_version, OpCallback cb); + void TriggerStreamingHash(Version version, const std::string& stream_version, OpCallback cb); + Status InitGlobalQueue( + Version version, + const std::string& name, + const std::vector& paths, + size_t epoch, + bool epoch_isolate); + Status GetNextFile( + Version version, + const std::string& name, + size_t worker_id, + WorkerState* ws); + Status ReportWorkerState( + Version version, + const std::string& name, + size_t worker_id, + const std::vector& worker_states); + Status RestoreWorkerState( + Version version, + const std::string& name, + size_t worker_id); ps::Status UpdateVariableInfo(Version version, const std::vector& info, std::vector* result); @@ -75,23 +97,43 @@ class SchedulerImpl { void SynchronizeEnter(Version version, int id, int worker_count, std::function cb); void SynchronizeLeave(Version version, int id, int64_t token, std::function cb); - void WorkerReportFinish(Version version, int id, std::function cb); + void WorkerReportFinish(Version version, int id, std::function cb); + void GetWorkerFinishCount(Version version, std::function cb); void WorkerBarrier(Version version, int id, int worker_count, std::function cb); + void WorkerBarrierV2(Version version, + int barrier_id, + int task_id, + int task_num, + int token, + std::function cb); ps::Status UpdateVariableVisitInfo(Version version, const std::string& var_name, int64_t ids); + ps::Status ParseVariables(const std::string& checkpoint, std::vector* result); ps::Status WriteMetaInfo(); - std::string PrintVariableInfo(const std::vector& infos); + static Status ReadVariableInfoMeta(const std::string& path, size_t* server_num, std::vector* result); + static Status ReadCheckpoints(const std::string& ckpt_dir, bool ignoreError, std::vector* checkpoints); + Status RestoreGlobalQueue(const std::string& ckpt_dir); + struct BarrierV2Info { + int token; + int barrier_id; + std::function cb; + }; + + void BarrierAddAndNotifyAll(int task_id, const BarrierV2Info& bi); private: std::unique_ptr main_thread_; std::unique_ptr meta_thread_; bool stopped_; - + bool variable_info_updated_ = false; + std::mutex m_; bool ready_; - Version version_; + bool r_ready_; std::map> worker_barriers_; int worker_count_ = 0; + Version version_; std::set finished_workers_; + std::string server_count_; std::map, ServerInfo> servers_; ps::Status VersionMismatch(Version exp, Version act); @@ -114,9 +156,9 @@ class SchedulerImpl { Status InternalUpdateVariableInfo(const std::vector& info, std::vector* result); Status InternalRestore(const std::string& checkpoint); Status InternalSave(const std::string& checkpoint); - Status InternalTriggerStreamingDense(Version version); - Status InternalTriggerStreamingSparse(Version version); - Status InternalTriggerStreamingHash(Version version); + Status InternalTriggerStreamingDense(Version version, const std::string& stream_version); + Status InternalTriggerStreamingSparse(Version version, const std::string& stream_version); + Status InternalTriggerStreamingHash(Version version, const std::string& stream_version); void InternalAsynchronizeEnter(Version version, int id, int staleness, int worker_count, std::function cb); @@ -125,8 +167,14 @@ class SchedulerImpl { void InternalSynchronizeLeave(Version version, int id, int64_t token, std::function cb); void InternalWorkerReportFinish(Version version, int id, std::function cb); - void InternalWorkerBarrier(Version version, int id, int worker_count, std::function cb); - + void InternalGetWorkerFinishCount(Version version, std::function cb); + void InternalWorkerBarrier(Version version, int id, int worker_count, std::function cb); + void InternalWorkerBarrierV2(Version version, int barrier_id, int task_id, int task_num, int token, std::function cb); + std::string static PrintVariableInfo(const std::vector& infos); + Status GenerateVariableInfo(std::string real_checkpoint, std::vector* source); + Status SerializeGlobalQueue(std::string* buf); + Status DeserializeGlobalQueue(const std::string& buf); + Placementer* placementer_; const std::string checkpoint_path_; const Placementer::Arg placement_arg_; @@ -139,10 +187,24 @@ class SchedulerImpl { std::unique_ptr sync_; + std::mutex mu_; + std::unordered_map > global_file_queues_; + std::string streaming_dense_model_addr_; std::string streaming_sparse_model_addr_; std::string streaming_hash_model_addr_; std::unique_ptr streaming_dense_model_writer_; + + struct ServerInfoHasher { + std::size_t operator()(const ServerInfo& info) const { + return info.GetVersion(); + } + }; + std::unordered_set disconnected_server_; + + std::unordered_map barrier_infos_; + std::unordered_map failover_barrier_infos_; + std::unordered_map barrier_tokens_; }; } diff --git a/xdl/ps-plus/ps-plus/scheduler/scheduler_service.cc b/xdl/ps-plus/ps-plus/scheduler/scheduler_service.cc index e401dbdf..b6849ca9 100644 --- a/xdl/ps-plus/ps-plus/scheduler/scheduler_service.cc +++ b/xdl/ps-plus/ps-plus/scheduler/scheduler_service.cc @@ -148,24 +148,61 @@ Status SchedulerService::Start() { ps::service::seastar::DoneClosure* done) { AsynchronizeEnter(inputs, outputs, done); }); + seastar_lib_->RegisterServerFunc(func_ids::kSchedulerWorkerReportFinish, + [this](const std::vector& inputs, + std::vector* outputs, + ps::service::seastar::DoneClosure* done) { + WorkerReportFinish(inputs, outputs, done); + }); seastar_lib_->RegisterServerFunc(func_ids::kSchedulerWorkerBarrier, [this](const std::vector& inputs, std::vector* outputs, ps::service::seastar::DoneClosure* done) { WorkerBarrier(inputs, outputs, done); }); - seastar_lib_->RegisterServerFunc(func_ids::kSchedulerWorkerReportFinish, + seastar_lib_->RegisterServerFunc(func_ids::kSchedulerWorkerBarrierV2, [this](const std::vector& inputs, std::vector* outputs, ps::service::seastar::DoneClosure* done) { - WorkerReportFinish(inputs, outputs, done); - }); + WorkerBarrierV2(inputs, outputs, done); + }); + seastar_lib_->RegisterServerFunc(func_ids::kSchedulerGetWorkerFinishCount, + [this](const std::vector& inputs, + std::vector* outputs, + ps::service::seastar::DoneClosure* done) { + GetWorkerFinishCount(inputs, outputs, done); + }); seastar_lib_->RegisterServerFunc(func_ids::kSchedulerUpdateVariableVisitInfo, [this](const std::vector& inputs, std::vector* outputs, ps::service::seastar::DoneClosure* done) { UpdateVariableVisitInfo(inputs, outputs, done); }); + seastar_lib_->RegisterServerFunc(func_ids::kSchedulerInitGlobalFileQueue, + [this](const std::vector& inputs, + std::vector* outputs, + ps::service::seastar::DoneClosure* done) { + InitGlobalQueue(inputs, outputs, done); + }); + seastar_lib_->RegisterServerFunc(func_ids::kSchedulerGetNextFile, + [this](const std::vector& inputs, + std::vector* outputs, + ps::service::seastar::DoneClosure* done) { + GetNextFile(inputs, outputs, done); + }); + seastar_lib_->RegisterServerFunc(func_ids::kSchedulerReportWorkerState, + [this](const std::vector& inputs, + std::vector* outputs, + ps::service::seastar::DoneClosure* done) { + ReportWorkerState(inputs, outputs, done); + }); + seastar_lib_->RegisterServerFunc(func_ids::kSchedulerRestoreWorkerState, + [this](const std::vector& inputs, + std::vector* outputs, + ps::service::seastar::DoneClosure* done) { + RestoreWorkerState(inputs, outputs, done); + }); + seastar_lib_->Start(); NetUtils::GetDefaultIP(ip_); @@ -207,13 +244,11 @@ void SchedulerService::ServerRestore( int server_type, int server_id, Version version, - const std::string& checkpoint, const std::vector& from, const std::vector& to, std::function cb) { std::vector datas = { new WrapperData(version), - new WrapperData(checkpoint), new WrapperData(VariableInfoCollection{.infos = from}), new WrapperData(VariableInfoCollection{.infos = to}) }; seastar_lib_->Request(server_offset_[server_type] + server_id, func_ids::kServerRestore, datas, @@ -283,9 +318,11 @@ void SchedulerService::ServerTriggerStreamingSparse( int server_type, int server_id, Version version, + const std::string& stream_version, std::function cb) { std::vector datas = { - new WrapperData(version) + new WrapperData(version), + new WrapperData(stream_version) }; seastar_lib_->Request(server_offset_[server_type] + server_id, func_ids::kServerTriggerStreamingSparse, datas, new CallBackClosure([cb](const SeastarStatus& sst, const std::vector& datas) { @@ -297,9 +334,11 @@ void SchedulerService::ServerTriggerStreamingHash( int server_type, int server_id, Version version, + const std::string& stream_version, std::function cb) { std::vector datas = { - new WrapperData(version) + new WrapperData(version), + new WrapperData(stream_version) }; seastar_lib_->Request(server_offset_[server_type] + server_id, func_ids::kServerTriggerStreamingHash, datas, new CallBackClosure([cb](const SeastarStatus& sst, const std::vector& datas) { @@ -383,6 +422,119 @@ void SchedulerService::Restore(const std::vector& inputs, std::vector& inputs, std::vector* outputs, ps::service::seastar::DoneClosure* done) { + if (inputs.size() != 5) { + outputs->push_back(new WrapperData(Status::ArgumentError("SchedulerService InitGlobalQueue: Need 5 inputs"))); + done->Run(); + return; + } + + WrapperData* ver = dynamic_cast*>(inputs[0]); + WrapperData* name = dynamic_cast*>(inputs[1]); + using StringVec = std::vector; + WrapperData* paths = dynamic_cast*>(inputs[2]); + WrapperData* epoch = dynamic_cast*>(inputs[3]); + WrapperData* epoch_isolate = dynamic_cast*>(inputs[4]); + + if (ver == nullptr || paths == nullptr || + name == nullptr || + epoch == nullptr || + epoch_isolate == nullptr) { + outputs->push_back(new WrapperData(Status::ArgumentError("SchedulerService InitGlobalQueue: Input Type Error"))); + done->Run(); + return; + } + + Status st = impl_->InitGlobalQueue( + ver->Internal(), + name->Internal(), + paths->Internal(), + epoch->Internal(), + epoch_isolate->Internal()); + outputs->push_back(new WrapperData(st)); + done->Run(); +} + +void SchedulerService::GetNextFile(const std::vector& inputs, std::vector* outputs, ps::service::seastar::DoneClosure* done) { + if (inputs.size() != 3) { + outputs->push_back(new WrapperData(Status::ArgumentError("SchedulerService GetNextFile: Need 3 inputs"))); + done->Run(); + return; + } + + WrapperData* ver = dynamic_cast*>(inputs[0]); + WrapperData* name = dynamic_cast*>(inputs[1]); + WrapperData* worker_id = dynamic_cast*>(inputs[2]); + if (ver == nullptr || name == nullptr || worker_id == nullptr) { + outputs->push_back(new WrapperData(Status::ArgumentError("SchedulerService GetNextFile: Input Type Error"))); + done->Run(); + return; + } + + WorkerState ws; + Status st = impl_->GetNextFile(ver->Internal(), name->Internal() ,worker_id->Internal(), &ws); + outputs->push_back(new WrapperData(st)); + outputs->push_back(new WrapperData(ws.path_)); + outputs->push_back(new WrapperData(ws.begin_)); + outputs->push_back(new WrapperData(ws.epoch_)); + done->Run(); +} + +void SchedulerService::ReportWorkerState(const std::vector& inputs, std::vector* outputs, ps::service::seastar::DoneClosure* done) { + if (inputs.size() != 4) { + outputs->push_back(new WrapperData(Status::ArgumentError("SchedulerService ReportWorkerState: Need 4 inputs"))); + done->Run(); + return; + } + + WrapperData* ver = dynamic_cast*>(inputs[0]); + WrapperData* name = dynamic_cast*>(inputs[1]); + WrapperData* worker_id = dynamic_cast*>(inputs[2]); + using WorkerStateVec = std::vector; + WrapperData* worker_states = + dynamic_cast*>(inputs[3]); + + if (ver == nullptr || worker_id == nullptr || + name == nullptr || + worker_states == nullptr) { + outputs->push_back(new WrapperData(Status::ArgumentError("SchedulerService ReportWorkerState: Input Type Error"))); + done->Run(); + return; + } + + Status st = impl_->ReportWorkerState( + ver->Internal(), + name->Internal(), + worker_id->Internal(), + worker_states->Internal()); + outputs->push_back(new WrapperData(st)); + done->Run(); +} + +void SchedulerService::RestoreWorkerState(const std::vector& inputs, std::vector* outputs, ps::service::seastar::DoneClosure* done) { + if (inputs.size() != 3) { + outputs->push_back(new WrapperData(Status::ArgumentError("SchedulerService RestoreWorkerState: Need 3 inputs"))); + done->Run(); + return; + } + + WrapperData* ver = dynamic_cast*>(inputs[0]); + WrapperData* name = dynamic_cast*>(inputs[1]); + WrapperData* worker_id = dynamic_cast*>(inputs[2]); + if (ver == nullptr || name == nullptr || worker_id == nullptr) { + outputs->push_back(new WrapperData(Status::ArgumentError("SchedulerService RestoreWorkerState: Input Type Error"))); + done->Run(); + return; + } + + Status st = impl_->RestoreWorkerState( + ver->Internal(), + name->Internal(), + worker_id->Internal()); + outputs->push_back(new WrapperData(st)); + done->Run(); +} + void SchedulerService::RegisterServer(const std::vector& inputs, std::vector* outputs, ps::service::seastar::DoneClosure* done) { if (inputs.size() != 1) { outputs->push_back(new WrapperData(Status::ArgumentError("SchedulerService RegisterServer: Need 1 inputs"))); @@ -444,54 +596,57 @@ void SchedulerService::UpdateVariableInfo(const std::vector& inputs, std: } void SchedulerService::TriggerStreamingDense(const std::vector& inputs, std::vector* outputs, ps::service::seastar::DoneClosure* done) { - if (inputs.size() != 1) { - outputs->push_back(new WrapperData(Status::ArgumentError("SchedulerService TriggerStreamingDense: Need 1 inputs"))); + if (inputs.size() != 2) { + outputs->push_back(new WrapperData(Status::ArgumentError("SchedulerService TriggerStreamingDense: Need 2 inputs"))); done->Run(); return; } WrapperData* ver = dynamic_cast*>(inputs[0]); - if (ver == nullptr) { + WrapperData* stream_version = dynamic_cast*>(inputs[1]); + if ((ver == nullptr) || (stream_version == nullptr)){ outputs->push_back(new WrapperData(Status::ArgumentError("SchedulerService TriggerStreamingDense: Input Type Error"))); done->Run(); return; } - impl_->TriggerStreamingDense(ver->Internal(), [outputs, done](const Status& st) { + impl_->TriggerStreamingDense(ver->Internal(), stream_version->Internal(), [outputs, done](const Status& st) { outputs->push_back(new WrapperData(st)); done->Run(); }); } void SchedulerService::TriggerStreamingSparse(const std::vector& inputs, std::vector* outputs, ps::service::seastar::DoneClosure* done) { - if (inputs.size() != 1) { - outputs->push_back(new WrapperData(Status::ArgumentError("SchedulerService TriggerStreamingSparse: Need 1 inputs"))); + if (inputs.size() != 2) { + outputs->push_back(new WrapperData(Status::ArgumentError("SchedulerService TriggerStreamingSparse: Need 2 inputs"))); done->Run(); return; } WrapperData* ver = dynamic_cast*>(inputs[0]); - if (ver == nullptr) { + WrapperData* stream_version = dynamic_cast*>(inputs[1]); + if ((ver == nullptr) || (stream_version == nullptr)){ outputs->push_back(new WrapperData(Status::ArgumentError("SchedulerService TriggerStreamingSparse: Input Type Error"))); done->Run(); return; } - impl_->TriggerStreamingSparse(ver->Internal(), [outputs, done](const Status& st) { + impl_->TriggerStreamingSparse(ver->Internal(), stream_version->Internal(), [outputs, done](const Status& st) { outputs->push_back(new WrapperData(st)); done->Run(); }); } void SchedulerService::TriggerStreamingHash(const std::vector& inputs, std::vector* outputs, ps::service::seastar::DoneClosure* done) { - if (inputs.size() != 1) { - outputs->push_back(new WrapperData(Status::ArgumentError("SchedulerService TriggerStreamingHash: Need 1 inputs"))); + if (inputs.size() != 2) { + outputs->push_back(new WrapperData(Status::ArgumentError("SchedulerService TriggerStreamingHash: Need 2 inputs"))); done->Run(); return; } WrapperData* ver = dynamic_cast*>(inputs[0]); - if (ver == nullptr) { + WrapperData* stream_version = dynamic_cast*>(inputs[1]); + if ((ver == nullptr) || (stream_version == nullptr)){ outputs->push_back(new WrapperData(Status::ArgumentError("SchedulerService TriggerStreamingHash: Input Type Error"))); done->Run(); return; } - impl_->TriggerStreamingHash(ver->Internal(), [outputs, done](const Status& st) { + impl_->TriggerStreamingHash(ver->Internal(), stream_version->Internal(), [outputs, done](const Status& st) { outputs->push_back(new WrapperData(st)); done->Run(); }); @@ -575,14 +730,14 @@ void SchedulerService::WorkerReportFinish(const std::vector& inputs, std::vector* outputs, ps::service::seastar::DoneClosure* done) { if (inputs.size() != 2) { - outputs->push_back(new WrapperData(Status::ArgumentError("SchedulerService SynchronizeLeave: Need 3 inputs"))); + outputs->push_back(new WrapperData(Status::ArgumentError("SchedulerService WorkerReportFinish: Need 2 inputs"))); done->Run(); return; } WrapperData* ver = dynamic_cast*>(inputs[0]); WrapperData* id = dynamic_cast*>(inputs[1]); if (ver == nullptr || id == nullptr) { - outputs->push_back(new WrapperData(Status::ArgumentError("SchedulerService SynchronizeLeave: Input Type Error"))); + outputs->push_back(new WrapperData(Status::ArgumentError("SchedulerService WorkerReportFinish: Input Type Error"))); done->Run(); return; } @@ -592,6 +747,29 @@ void SchedulerService::WorkerReportFinish(const std::vector& inputs, }); } +void SchedulerService::GetWorkerFinishCount(const std::vector& inputs, + std::vector* outputs, + ps::service::seastar::DoneClosure* done) { + if (inputs.size() != 1) { + outputs->push_back(new WrapperData(Status::ArgumentError("SchedulerService GetWorkerFinishCount: Need 1 inputs"))); + outputs->push_back(new WrapperData(-1)); + done->Run(); + return; + } + WrapperData* ver = dynamic_cast*>(inputs[0]); + if (ver == nullptr) { + outputs->push_back(new WrapperData(Status::ArgumentError("SchedulerService GetWorkerFinishCount: Input Type Error"))); + outputs->push_back(new WrapperData(-1)); + done->Run(); + return; + } + impl_->GetWorkerFinishCount(ver->Internal(), [outputs, done](int64_t count, const Status& st) { + outputs->push_back(new WrapperData(st)); + outputs->push_back(new WrapperData(count)); + done->Run(); + }); +} + void SchedulerService::WorkerBarrier(const std::vector& inputs, std::vector* outputs, ps::service::seastar::DoneClosure* done) { @@ -614,6 +792,45 @@ void SchedulerService::WorkerBarrier(const std::vector& inputs, }); } +void SchedulerService::WorkerBarrierV2(const std::vector& inputs, + std::vector* outputs, + ps::service::seastar::DoneClosure* done) { + if (inputs.size() != 5) { + outputs->push_back( + new WrapperData( + Status::ArgumentError("SchedulerService WorkerBarrier: Need 3 inputs"))); + done->Run(); + return; + } + + WrapperData* ver = dynamic_cast*>(inputs[0]); + WrapperData* barrier_id = dynamic_cast*>(inputs[1]); + WrapperData* task_id = dynamic_cast*>(inputs[2]); + WrapperData* task_num = dynamic_cast*>(inputs[3]); + WrapperData* token = dynamic_cast*>(inputs[4]); + if (ver == nullptr || + barrier_id == nullptr || + task_id == nullptr || + task_num == nullptr || + token == nullptr) { + outputs->push_back( + new WrapperData( + Status::ArgumentError("SchedulerService WorkerBarrier: Input Type Error"))); + done->Run(); + return; + } + + impl_->WorkerBarrierV2(ver->Internal(), + barrier_id->Internal(), + task_id->Internal(), + task_num->Internal(), + token->Internal(), + [outputs, done](const Status& st) { + outputs->push_back(new WrapperData(st)); + done->Run(); + }); +} + void SchedulerService::UpdateVariableVisitInfo(const std::vector& inputs, std::vector* outputs, ps::service::seastar::DoneClosure* done) { @@ -626,7 +843,6 @@ void SchedulerService::UpdateVariableVisitInfo(const std::vector& inputs, WrapperData* var_name = dynamic_cast*>(inputs[1]); WrapperData* ids = dynamic_cast*>(inputs[2]); - if (ver == nullptr || var_name == nullptr || ids == nullptr) { outputs->push_back(new WrapperData(Status::ArgumentError("SchedulerService UpdateVariableVisitInfo: Input Type Error"))); done->Run(); diff --git a/xdl/ps-plus/ps-plus/scheduler/scheduler_service.h b/xdl/ps-plus/ps-plus/scheduler/scheduler_service.h index c77aa71d..73021ad0 100644 --- a/xdl/ps-plus/ps-plus/scheduler/scheduler_service.h +++ b/xdl/ps-plus/ps-plus/scheduler/scheduler_service.h @@ -40,7 +40,7 @@ class SchedulerService { : impl_(impl) , core_num_(NetUtils::GetAvailableCpuNum()) , scheduler_kv_addr_(scheduler_kv_addr) - , port_(NetUtils::GetAvailablePort()) + , port_(NetUtils::GetAvailablePort()) , bind_cores_(bind_cores) { server_count_ = server_count; server_offset_.push_back(0); @@ -71,7 +71,6 @@ class SchedulerService { int server_type, int server_id, Version version, - const std::string& checkpoint, const std::vector& from, const std::vector& to, std::function cb); @@ -90,11 +89,13 @@ class SchedulerService { int server_type, int server_id, Version version, + const std::string& stream_version, std::function cb); void ServerTriggerStreamingHash( int server_type, int server_id, Version version, + const std::string& stream_version, std::function cb); void ModelServerFlush( int server_type, @@ -110,6 +111,10 @@ class SchedulerService { void GetClusterInfo(const std::vector& inputs, std::vector* outputs, ps::service::seastar::DoneClosure* done); void Save(const std::vector& inputs, std::vector* outputs, ps::service::seastar::DoneClosure* done); void Restore(const std::vector& inputs, std::vector* outputs, ps::service::seastar::DoneClosure* done); + void InitGlobalQueue(const std::vector& inputs, std::vector* outputs, ps::service::seastar::DoneClosure* done); + void GetNextFile(const std::vector& inputs, std::vector* outputs, ps::service::seastar::DoneClosure* done); + void ReportWorkerState(const std::vector& inputs, std::vector* outputs, ps::service::seastar::DoneClosure* done); + void RestoreWorkerState(const std::vector& inputs, std::vector* outputs, ps::service::seastar::DoneClosure* done); void UpdateVariableInfo(const std::vector& inputs, std::vector* outputs, ps::service::seastar::DoneClosure* done); void TriggerStreamingDense(const std::vector& inputs, std::vector* outputs, ps::service::seastar::DoneClosure* done); void TriggerStreamingSparse(const std::vector& inputs, std::vector* outputs, ps::service::seastar::DoneClosure* done); @@ -118,13 +123,16 @@ class SchedulerService { void SynchronizeLeave(const std::vector& inputs, std::vector* outputs, ps::service::seastar::DoneClosure* done); void AsynchronizeEnter(const std::vector& inputs, std::vector* outputs, ps::service::seastar::DoneClosure* done); void WorkerReportFinish(const std::vector& inputs, std::vector* outputs, ps::service::seastar::DoneClosure* done); + void GetWorkerFinishCount(const std::vector& inputs, std::vector* outputs, ps::service::seastar::DoneClosure* done); void WorkerBarrier(const std::vector& inputs, std::vector* outputs, ps::service::seastar::DoneClosure* done); + void WorkerBarrierV2(const std::vector& inputs, std::vector* outputs, ps::service::seastar::DoneClosure* done); void UpdateVariableVisitInfo(const std::vector& inputs, std::vector* outputs, ps::service::seastar::DoneClosure* done); static const int CLIENT_THREAD_NUM = 100; SchedulerImpl* impl_; std::string server_count_; + bool bind_cores_; int core_num_; std::unique_ptr seastar_lib_; @@ -133,7 +141,6 @@ class SchedulerService { std::string ip_; int server_type_size_; std::vector server_offset_; - bool bind_cores_; }; } diff --git a/xdl/ps-plus/ps-plus/scheduler/simple_placementer.cc b/xdl/ps-plus/ps-plus/scheduler/simple_placementer.cc index 1a8e3400..9b980f27 100644 --- a/xdl/ps-plus/ps-plus/scheduler/simple_placementer.cc +++ b/xdl/ps-plus/ps-plus/scheduler/simple_placementer.cc @@ -177,7 +177,7 @@ class SimplePlacementer : public Placementer { x.slice_mem = SizeOfType(info.datatype) * slice_size; x.slice_net = SizeOfType(info.datatype) * slice_size * ratio; } - } else if (info.type == VariableInfo::kHash) { + } else if (info.type == VariableInfo::kHash128 || info.type == VariableInfo::kHash64) { if (info.shape.empty()) { return Status::ArgumentError("Hash Should at least 1 dim"); } diff --git a/xdl/ps-plus/ps-plus/scheduler/synchronizer.cc b/xdl/ps-plus/ps-plus/scheduler/synchronizer.cc index 31c6f85d..1e44f06b 100644 --- a/xdl/ps-plus/ps-plus/scheduler/synchronizer.cc +++ b/xdl/ps-plus/ps-plus/scheduler/synchronizer.cc @@ -16,7 +16,7 @@ limitations under the License. #include "synchronizer.h" #include "ps-plus/common/status.h" -#include +#include "ps-plus/common/logging.h" #include #include diff --git a/xdl/ps-plus/ps-plus/scheduler/test/anneal_placementer_test.cc b/xdl/ps-plus/ps-plus/scheduler/test/anneal_placementer_test.cc index 6777bf6b..9c143e70 100644 --- a/xdl/ps-plus/ps-plus/scheduler/test/anneal_placementer_test.cc +++ b/xdl/ps-plus/ps-plus/scheduler/test/anneal_placementer_test.cc @@ -52,7 +52,7 @@ TEST(AnnealPlacementer, AnnealPlacementer) { Placementer::Arg arg1{.net = 100, .mem = 10, .query = 100}; EXPECT_FALSE(sp->Placement(input, &output, arg1, sn).IsOk()); shape2[0] = 65535; - VariableInfo info3{.type = VariableInfo::Type::kHash, .name = "var2", .parts = parts2, .shape = shape2, .datatype = DataType::kInt8, .args = args2}; + VariableInfo info3{.type = VariableInfo::Type::kHash128, .name = "var2", .parts = parts2, .shape = shape2, .datatype = DataType::kInt8, .args = args2}; input[1] = info3; EXPECT_TRUE(sp->Placement(input, &output, arg, sn).IsOk()); } diff --git a/xdl/ps-plus/ps-plus/scheduler/test/balance_placementer_test.cc b/xdl/ps-plus/ps-plus/scheduler/test/balance_placementer_test.cc index 86486f30..df542c9e 100644 --- a/xdl/ps-plus/ps-plus/scheduler/test/balance_placementer_test.cc +++ b/xdl/ps-plus/ps-plus/scheduler/test/balance_placementer_test.cc @@ -49,12 +49,12 @@ TEST(BalancePlacementerTest, BalancePlacementer) { FILE *fp = fopen("./meta.bin", "w"); size_t a = 2; fwrite(&a, sizeof(a), 1, fp); - a = 11; + a = 13; fwrite(&a, sizeof(a), 1, fp); - fwrite("var1\n1\n2\n3\n", 11, 1, fp); - a = 11; + fwrite("var1\n1\n2\n3\n4\n", 13, 1, fp); + a = 13; fwrite(&a, sizeof(a), 1, fp); - fwrite("var2\n4\n5\n6\n", 11, 1, fp); + fwrite("var2\n4\n5\n6\n4\n", 13, 1, fp); fclose(fp); setenv("meta_dir", "./meta.bin", 1); @@ -62,7 +62,9 @@ TEST(BalancePlacementerTest, BalancePlacementer) { Status st = sp->Placement(input, &output, arg, sn); EXPECT_EQ(0, output.size()); std::vector input1 = output; - EXPECT_TRUE(sp->Placement(input1, &output, arg, sn).IsOk()); + st = sp->Placement(input1, &output, arg, sn); + std::cout << st.ToString() << std::endl; + EXPECT_TRUE(st.IsOk()); EXPECT_EQ(0, output.size()); Placementer::Arg arg1{.net = 100, .mem = 10, .query = 100}; EXPECT_FALSE(sp->Placement(input, &output, arg1, sn).IsOk()); diff --git a/xdl/ps-plus/ps-plus/scheduler/test/balance_placementer_v2_test.cc b/xdl/ps-plus/ps-plus/scheduler/test/balance_placementer_v2_test.cc new file mode 100644 index 00000000..7febf434 --- /dev/null +++ b/xdl/ps-plus/ps-plus/scheduler/test/balance_placementer_v2_test.cc @@ -0,0 +1,57 @@ +/* Copyright (C) 2016-2018 Alibaba Group Holding Limited + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include + +#include "gtest/gtest.h" +#include "ps-plus/scheduler/placementer.h" + +using ps::scheduler::Placementer; +using ps::VariableInfo; +using ps::Status; +using ps::DataType; + +TEST(BalancePlacementerV2Test, BalancePlacementerV2) { + auto sp = ps::GetPlugin("BalanceV2"); + + size_t sn = 2; + std::vector input; + std::vector shape1; + shape1.push_back(4); + shape1.push_back(8); + std::vector shape2; + shape2.push_back(4); + shape2.push_back(8); + std::vector parts1; + std::vector parts2; + std::unordered_map args1; + std::unordered_map args2; + + VariableInfo info1{.type = VariableInfo::Type::kIndex, .name = "var1", .parts = parts1, .shape = shape1, .datatype = DataType::kInt8, .args = args1}; + VariableInfo info2{.type = VariableInfo::Type::kIndex, .name = "var2", .parts = parts2, .shape = shape2, .datatype = DataType::kInt8, .args = args2}; + input.push_back(info1); + input.push_back(info2); + std::vector output; + Placementer::Arg arg{.net = 0, .mem = 0, .query = 0}; + + Status st = sp->Placement(input, &output, arg, sn); + EXPECT_EQ(0, output.size()); + std::vector input1 = output; + EXPECT_TRUE(sp->Placement(input1, &output, arg, sn).IsOk()); + EXPECT_EQ(0, output.size()); + Placementer::Arg arg1{.net = 100, .mem = 10, .query = 100}; + EXPECT_FALSE(sp->Placement(input, &output, arg1, sn).IsOk()); +} + diff --git a/xdl/ps-plus/ps-plus/scheduler/test/simple_placementer_test.cc b/xdl/ps-plus/ps-plus/scheduler/test/simple_placementer_test.cc index 16fd5a7c..1b45fceb 100644 --- a/xdl/ps-plus/ps-plus/scheduler/test/simple_placementer_test.cc +++ b/xdl/ps-plus/ps-plus/scheduler/test/simple_placementer_test.cc @@ -52,7 +52,7 @@ TEST(SimplePlacementer, SimplePlacementer) { Placementer::Arg arg1{.net = 100, .mem = 10, .query = 100}; EXPECT_FALSE(sp->Placement(input, &output, arg1, sn).IsOk()); shape2[0] = 65535; - VariableInfo info3{.type = VariableInfo::Type::kHash, .name = "var2", .parts = parts2, .shape = shape2, .datatype = DataType::kInt8, .args = args2}; + VariableInfo info3{.type = VariableInfo::Type::kHash128, .name = "var2", .parts = parts2, .shape = shape2, .datatype = DataType::kInt8, .args = args2}; input[1] = info3; EXPECT_FALSE(sp->Placement(input, &output, arg, sn).IsOk()); } diff --git a/xdl/ps-plus/ps-plus/scheduler/test/synchronizer_tests.cc b/xdl/ps-plus/ps-plus/scheduler/test/synchronizer_tests.cc index dd5460af..c540cd4a 100644 --- a/xdl/ps-plus/ps-plus/scheduler/test/synchronizer_tests.cc +++ b/xdl/ps-plus/ps-plus/scheduler/test/synchronizer_tests.cc @@ -98,3 +98,30 @@ TEST(Synchronizer, Reset) { }); EXPECT_EQ(result, 1); } + +TEST(Synchronizer, WorkerReportFinish) { + unique_ptr sync(new Synchronizer(2)); + int64_t result = -1; + sync->Enter(0, [&result](int64_t token, const Status& st) { + result = token; + }); + EXPECT_EQ(result, 0); + sync->Enter(1, [&result](int64_t token, const Status& st) { + result = token; + }); + EXPECT_EQ(result, 0); + string execute_log; + sync->Leave(0, 0, [&execute_log](const Status& st) { + execute_log += "0L"; + }); + EXPECT_EQ(execute_log, "0L"); + sync->Enter(0, [&result, &execute_log](int64_t token, const Status& st) { + result = token; + execute_log += "0E"; + }); + EXPECT_EQ(result, 0L); + EXPECT_EQ(execute_log, "0L"); + sync->WorkerReportFinish(1); + EXPECT_EQ(execute_log, "0L0E"); + EXPECT_EQ(result, 1L); +} diff --git a/xdl/ps-plus/ps-plus/server/checkpoint_utils.cc b/xdl/ps-plus/ps-plus/server/checkpoint_utils.cc index bce403dd..b2192f2f 100644 --- a/xdl/ps-plus/ps-plus/server/checkpoint_utils.cc +++ b/xdl/ps-plus/ps-plus/server/checkpoint_utils.cc @@ -1,140 +1,160 @@ -#include +/* Copyright (C) 2016-2018 Alibaba Group Holding Limited + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include #include "ps-plus/server/checkpoint_utils.h" #include "ps-plus/common/serializer.h" -#include "ps-plus/common/hasher.h" +#include "ps-plus/common/logging.h" +#include +#define CK_CHECK_STATUS(STATUS, STATUS_RET, COUNTER, OK) do { Status st = STATUS_RET; if (!st.IsOk()) {STATUS = st; if (--COUNTER == 0) {OK.set_value(true);} return;}} while(0); namespace ps { namespace server { -CheckpointUtils::CheckpointUtils(const std::string& path, const VariableInfoCollection& infos) { - path_ = path; - for (auto&& item : infos.infos) { - infos_[item.name] = item; - } +CheckpointUtils::CheckpointUtils(const VariableInfoCollection& infos) : infos_(infos) { } -/* Status CheckpointUtils::LoadVariables( const VariableInfoCollection& infos, size_t id, std::unordered_map>* vars) { - ThreadPool* pool = ThreadPool::Global(); - std::promise status; std::atomic counter(0); - for (auto&& info : infos.infos) { - for (auto& part : info.parts) { - if (part.server == id) { - counter++; - } + std::map source_infos; + for (auto&& item : infos_.infos) { + auto iter = item.args.find(VariableInfo::ORIGIN_NAME); + if (iter != item.args.end()) { + source_infos[iter->second] = item; + } else { + source_infos[item.name] = item; } } - for (auto&& info : infos.infos) { - auto iter = infos_.find(info.name); - if (iter == infos_.end()) { - continue; - } - size_t beg = 0; - for (size_t i = 0; i < info.parts.size(); i++) { - auto part = info.parts[i]; - size_t end = beg + part.size; - if (part.server == id) { - LOG_INFO("Loading variable[%s] part[%d].", info.name.c_str(), i); - (*vars)[info.name] = std::unique_ptr(nullptr); - VariableInfo vi = iter->second; - pool->Schedule([vi, beg, end, vars, i, this, &counter, &status] { - VariableStruct vs; - Status st = MergeLoadVariable(vi.name, vi, beg, end, &vs, &(*vars)[vi.name]); - if (!st.IsOk()) { - status.set_value(st); - } - LOG(INFO) << "Load variable" << vi.name.c_str() << " part " << i << " MergeLoadVariable success."; - if (--counter == 0) { - status.set_value(Status::Ok()); - } - }); - } - beg = end; - } - } - infos_.clear(); - for (auto&& item : infos.infos) { - infos_[item.name] = item; - } - std::future future = status.get_future(); - future.wait(); - PS_CHECK_STATUS(future.get()); - LOG(INFO) << "Finish load variables."; - return Status::Ok(); -} -*/ -Status CheckpointUtils::LoadVariables( - const VariableInfoCollection& infos, - size_t id, - std::unordered_map>* vars) { - for (auto&& info : infos.infos) { - auto iter = infos_.find(info.name); - if (iter == infos_.end()) { - continue; - } - size_t beg = 0; - for (size_t i = 0; i < info.parts.size(); i++) { - auto part = info.parts[i]; - size_t end = beg + part.size; - if (part.server == id) { -// LOG(DEBUG) << "Loading variable" << info.name.c_str() << " part" << i; - VariableInfo vi = iter->second; - VariableStruct vs; - Status st = MergeLoadVariable(vi.name, vi, beg, end, &vs, &(*vars)[vi.name]); - if (st.Code() == Status::ErrorCode::kNotFound) { - LOG(WARNING) << st.Msg(); - vars->erase(vi.name); - } else { - PS_CHECK_STATUS(st); -// LOG(DEBUG) << "Load variable" << vi.name << " part" << i << " MergeLoadVariable success."; + for (auto&& to : infos.infos) { + auto n = to.args.find(VariableInfo::ORIGIN_NAME); + std::string name = n == to.args.end() ? to.name : n->second; + auto iter = source_infos.find(name); + if (iter != source_infos.end()) { + for (size_t i = 0; i < to.parts.size(); i++) { + auto part = to.parts[i]; + if (part.server == id) { + (*vars)[to.name] = std::unique_ptr(nullptr); + ++counter; + break; } } - beg = end; } } - infos_.clear(); - for (auto&& item : infos.infos) { - infos_[item.name] = item; + if (counter == 0) { + return Status::Ok(); } -// LOG(DEBUG) << "Finish load variables."; + PS_CHECK_STATUS(MultiThreadDo(infos.infos.size(), [&](const Range& range) { + for (size_t si = range.begin; si < range.end; ++si) { + auto& to = infos.infos[si]; + auto n = to.args.find(VariableInfo::ORIGIN_NAME); + std::string name = n == to.args.end() ? to.name : n->second; + auto iter = source_infos.find(name); + if (iter == source_infos.end()) { + continue; + } + size_t beg = 0; + for (size_t i = 0; i < to.parts.size(); i++) { + auto part = to.parts[i]; + size_t end = beg + part.size; + if (part.server == id) { + LOG(INFO) << "Loading variable " << name << " part " << i; + VariableInfo vi = iter->second; + auto p = to.args.find(VariableInfo::ORIGIN_FILE_PATH); + if (p != to.args.end()) { + vi.args[VariableInfo::ORIGIN_FILE_PATH] = p->second; + } + Status st = MergeLoadVariable(to.name, vi, beg, end, &(*vars)[to.name]); + if (!st.IsOk()) { + if ((st.Code() == Status::ErrorCode::kUnknown || st.Code() == Status::ErrorCode::kNotFound) && vi.args.find("save") != vi.args.end() && vi.args["save"] == "false") { + LOG(INFO) << "Variable[" << to.name << "] not load."; + vars->erase(to.name); + continue; + } + LOG(WARNING) << "Variable[" << to.name << "] MergeLoadVariable failed, status[" << st.Msg() << "]."; + vars->erase(to.name); + return st; + } else { + LOG(INFO) << "Variable[" << to.name << "] MergeLoadVariable success."; + } + } + beg = end; + } + } + return Status::Ok();}, 4)); + LOG(INFO) << "Finish load variables."; return Status::Ok(); } Status CheckpointUtils::SaveVariables( size_t id, - const std::unordered_map>& vars) { + const std::string& checkpoint_path, + const std::unordered_map>& vars, + size_t timeout) { + std::map dest_infos; + for (auto&& item : infos_.infos) { + dest_infos[item.name] = item; + } + if (vars.size() == 0) { + return Status::Ok(); + } + std::atomic counter(vars.size()); + Status status = Status::Ok(); + std::promise ok; for (auto&& item : vars) { - auto iter = infos_.find(item.first); - if (iter == infos_.end()) { - LOG(ERROR) << "Can't find variable " << item.first << " in variable_infos."; - continue; - } - VariableInfo info = iter->second; - if (info.args["save"] == "false") { - LOG(ERROR) << "Variable" << item.first << " not to save."; - continue; - } - int part = -1; - for (size_t i = 0; i < info.parts.size(); i++) { - if (info.parts[i].server == id) { - part = i; - break; - } - } - if (part == -1) { - LOG(ERROR) << "Not found variable" << item.first << " part" << id << " in variable_infos when save variable."; - continue; - } - VariableStruct vs; - PS_CHECK_STATUS(VariableToStruct(item.second, &vs)); - PS_CHECK_STATUS(SaveVariable(iter->first, part, &vs)); + std::string name = item.first; + ThreadPool::Global()->Schedule([&, name] { + auto iter = dest_infos.find(name); + if (iter == dest_infos.end()) { + CK_CHECK_STATUS(status, Status::ArgumentError("Can't find variable[" + name + "] in variable_infos."), counter, ok); + } + VariableInfo info = iter->second; + if (info.args["save"] == "false") { + if (--counter == 0) { + ok.set_value(true); + } + return; + } + int part = -1; + for (size_t i = 0; i < info.parts.size(); i++) { + if (info.parts[i].server == id) { + part = i; + break; + } + } + if (part == -1) { + CK_CHECK_STATUS(status, Status::ArgumentError("Not found variable[" + name + "] part[" + std::to_string(id) + "] in variable_infos when save variable."), + counter, ok); + } + VariableStruct vs; + CK_CHECK_STATUS(status, VariableToStruct(vars.at(name), &vs), counter, ok); + CK_CHECK_STATUS(status, SaveVariable(checkpoint_path, iter->first, part, &vs), counter, ok); + if (--counter == 0) { + ok.set_value(true); + } + }); } - return Status::Ok(); + std::future_status fstatus = ok.get_future().wait_for(std::chrono::minutes(timeout)); + if (fstatus != std::future_status::ready) { + LOG(FATAL) << "Save checkpoint timeout, killing myself..."; + throw std::runtime_error("Save checkpoint timeout"); + } + return status; } std::string CheckpointUtils::VariableNameToFileName(const std::string& name, size_t id) { @@ -147,23 +167,35 @@ std::string CheckpointUtils::VariableNameToFileName(const std::string& name, siz return ret + '^' + std::to_string(id); } -Status CheckpointUtils::MergeLoadVariable(const std::string& var_name, const VariableInfo& info, size_t beg, size_t end, VariableStruct* var, std::unique_ptr* result_variable) { +std::string CheckpointUtils::VariableInfoToFileName(const VariableInfo& info, size_t id) { + auto p = info.args.find(VariableInfo::ORIGIN_FILE_PATH); + if (p == info.args.end()) { + LOG(ERROR) << info.name << " args not contain " << VariableInfo::ORIGIN_FILE_PATH; + return ""; + } + std::string file_path = p->second; + auto n = info.args.find(VariableInfo::ORIGIN_NAME); + std::string name = n == info.args.end() ? info.name : n->second; + return file_path + "/" + VariableNameToFileName(name, id); +} + +Status CheckpointUtils::MergeLoadVariable(const std::string& name, const VariableInfo& info, size_t beg, size_t end, std::unique_ptr* result_variable) { std::vector> variables; size_t part_beg = 0; - clock_t time_start, time_end; - time_start = clock(); - + std::chrono::time_point time_start, time_end; + time_start = std::chrono::system_clock::now(); + for (size_t i = 0; i < info.parts.size(); i++) { size_t part_end = part_beg + info.parts[i].size; -// LOG(DEBUG) << "part_beg " << part_beg << " part_end" << part_end; if (part_beg < end && beg < part_end) { + LOG(INFO) << name << ", part_beg [" << part_beg << "] part_end [" << part_end << "]"; variables.emplace_back(new LoadVariableStruct); LoadVariableStruct& lvs = *variables.back(); lvs.beg = part_beg; lvs.end = part_end; lvs.clip_beg = std::max(part_beg, beg); lvs.clip_end = std::min(part_end, end); - PS_CHECK_STATUS(LoadVariable(var_name, i, &lvs.variable)); + PS_CHECK_STATUS(LoadVariable(info, i, &lvs.variable)); if (!lvs.variable.initialized) { variables.pop_back(); } @@ -173,8 +205,10 @@ Status CheckpointUtils::MergeLoadVariable(const std::string& var_name, const Var if (variables.size() == 0) { return Status::NotFound("Not found variable when load " + info.name); } - time_end = clock(); + time_end = std::chrono::system_clock::now(); + LOG(INFO) << info.name << ", LoadVariable takes " << std::chrono::duration_cast(time_end-time_start).count(); + VariableStruct var; // convert index_slicer if (info.type == VariableInfo::Type::kIndex) { std::unique_ptr slicer; @@ -182,182 +216,179 @@ Status CheckpointUtils::MergeLoadVariable(const std::string& var_name, const Var if (shape.Dims().size() != 0) { shape.Set(0, end - beg); } - var->index_slicer = beg; + var.index_slicer = beg; slicer.reset(new WrapperData(beg)); - var->data = Tensor(variables[0]->variable.data.Type(), shape, variables[0]->variable.data.GetInitializer()->Clone(), true); - size_t slice_size = SizeOfType(var->data.Type()); + var.data = Tensor(variables[0]->variable.data.Type(), shape, variables[0]->variable.data.GetInitializer()->Clone()); + size_t slice_size = SizeOfType(var.data.Type()); if (shape.Dims().size() != 0) { - slice_size = SizeOfType(var->data.Type()) * shape.NumElements() / shape[0]; + slice_size = SizeOfType(var.data.Type()) * shape.NumElements() / shape[0]; } for (const auto& lvs : variables) { if (lvs->beg <= beg) { - QuickMemcpy(var->data.Raw(), lvs->variable.data.Raw() + (beg-lvs->beg)* slice_size, (lvs->clip_end-lvs->clip_beg) * slice_size); + QuickMemcpy(var.data.Raw(), lvs->variable.data.Raw() + (beg-lvs->beg)* slice_size, (lvs->clip_end-lvs->clip_beg) * slice_size); } else { - QuickMemcpy(var->data.Raw() + (lvs->beg-beg) * slice_size, lvs->variable.data.Raw(), (lvs->clip_end-lvs->clip_beg) * slice_size); + QuickMemcpy(var.data.Raw() + (lvs->beg-beg) * slice_size, lvs->variable.data.Raw(), (lvs->clip_end-lvs->clip_beg) * slice_size); } } - var->type = variables[0]->variable.type; + var.type = variables[0]->variable.type; for (auto& iter : variables[0]->variable.slots) { if (iter.second.joiner == Variable::SlotJoiner::kAnyOne) { - var->slots[iter.first] = Variable::Slot{.tensor = std::unique_ptr(new Tensor(*iter.second.tensor)), .joiner = iter.second.joiner}; + var.slots[iter.first] = Variable::Slot{.tensor = std::unique_ptr(new Tensor(*iter.second.tensor)), .joiner = iter.second.joiner}; } else { - Tensor* t = iter.second.tensor.get(); - TensorShape s = t->Shape(); - if (s.Dims().size() != 0) { - s.Set(0, end - beg); - } - var->slots[iter.first] = Variable::Slot{.tensor = std::unique_ptr(new Tensor(t->Type(), s, t->GetInitializer()->Clone(), true)), .joiner = iter.second.joiner}; - size_t ssize = SizeOfType(t->Type()); - if (s.Dims().size() != 0) { - ssize = SizeOfType(t->Type()) * s.NumElements() / s[0]; - } - for (auto& lvs : variables) { - if (lvs->beg <= beg) { - QuickMemcpy(var->slots[iter.first].tensor->Raw(), lvs->variable.slots[iter.first].tensor->Raw() + (beg-lvs->beg)* ssize, - (lvs->clip_end-lvs->clip_beg) * ssize); - } else { - QuickMemcpy(var->slots[iter.first].tensor->Raw()+(lvs->beg-beg) * slice_size, lvs->variable.slots[iter.first].tensor->Raw(), - (lvs->clip_end-lvs->clip_beg) * ssize); - } + Tensor* t = iter.second.tensor.get(); + TensorShape s = t->Shape(); + if (s.Dims().size() != 0) { + s.Set(0, end - beg); + } + var.slots[iter.first] = Variable::Slot{.tensor = std::unique_ptr(new Tensor(t->Type(), s, t->GetInitializer()->Clone())), .joiner = iter.second.joiner}; + size_t ssize = SizeOfType(t->Type()); + if (s.Dims().size() != 0) { + ssize = SizeOfType(t->Type()) * s.NumElements() / s[0]; + } + for (auto& lvs : variables) { + if (lvs->beg <= beg) { + QuickMemcpy(var.slots[iter.first].tensor->Raw(), lvs->variable.slots[iter.first].tensor->Raw() + (beg-lvs->beg)* ssize, (lvs->clip_end-lvs->clip_beg) * ssize); + } else { + QuickMemcpy(var.slots[iter.first].tensor->Raw()+(lvs->beg-beg) * slice_size, lvs->variable.slots[iter.first].tensor->Raw(), (lvs->clip_end-lvs->clip_beg) * ssize); } + } } } - var->initialized = true; - result_variable->reset(new Variable(new Tensor(var->data), slicer.release())); - (*result_variable)->SetSlots(CloneSlots(var->slots)); + var.initialized = true; + result_variable->reset(new Variable(new Tensor(var.data), slicer.release(), name)); + (*result_variable)->SetSlots(CloneSlots(var.slots)); return Status::Ok(); + } else { + time_start = std::chrono::system_clock::now(); + LoadHashVariable(variables, name, info, beg, end, *result_variable); + time_end = std::chrono::system_clock::now(); + LOG(INFO) << info.name << ", load hash variable total, takes " << std::chrono::duration_cast(time_end-time_start).count(); + return Status::Ok(); } +} + +Status CheckpointUtils::LoadHashVariable(const std::vector>& variables, const std::string& name, const VariableInfo& info, size_t beg, size_t end, std::unique_ptr& result_variable) { + auto time_start = std::chrono::system_clock::now(); + std::vector > keys, values; + size_t max_size = CalMaxSize(variables, name, beg, end, &keys, &values); + if (max_size == 0) { + max_size = 1; + } + auto time_end = std::chrono::system_clock::now(); + LOG(INFO) << name << ", CalMaxSize, takes " << std::chrono::duration_cast(time_end-time_start).count() << ", max_size is " << max_size; - time_start = clock(); - // convert hash_slicer - size_t max_size = CalMaxSize(variables, beg, end); - var->hash_slicer.counter = max_size; -// LOG(DEBUG) << "variable " << info.name << " slice " << max_size; - TensorShape data_shape = variables[0]->variable.data.Shape(); - max_size = int(max_size * 1.2) + 10; + time_start = std::chrono::system_clock::now(); + const Tensor& t = variables[0]->variable.data; + TensorShape data_shape = t.Shape(); data_shape.Set(0, max_size); - var->data = Tensor(variables[0]->variable.data.Type(), data_shape, variables[0]->variable.data.GetInitializer()->Clone(), true); + HashMap* hashmap; + if (info.type == VariableInfo::Type::kHash128) { + hashmap = new HashMapImpl(100); + } else { + hashmap = new HashMapImpl(100); + } + Variable* var = new Variable(new Tensor(t.Type(), data_shape, t.GetInitializer()->Clone(), Tensor::TType::kSegment, false), new WrapperData >(hashmap), name); + std::unordered_map slots; for (const auto& iter : variables[0]->variable.slots) { - if (iter.second.joiner == Variable::SlotJoiner::kAnyOne) { - var->slots[iter.first] = Variable::Slot{.tensor = std::unique_ptr(new Tensor(*iter.second.tensor)), .joiner = iter.second.joiner}; - } else { - Tensor* t = iter.second.tensor.get(); - TensorShape s = t->Shape(); - s.Set(0, max_size); - var->slots[iter.first] = Variable::Slot{.tensor = std::unique_ptr(new Tensor(t->Type(), s, t->GetInitializer()->Clone(), true)), .joiner = iter.second.joiner}; - } + if (iter.second.joiner == Variable::SlotJoiner::kAnyOne) { + slots[iter.first] = Variable::Slot{.tensor = std::unique_ptr(new Tensor(*iter.second.tensor)), .joiner = iter.second.joiner}; + } else { + Tensor& tt = *iter.second.tensor; + TensorShape tt_shape = tt.Shape(); + tt_shape.Set(0, max_size); + slots[iter.first] = Variable::Slot{.tensor = std::unique_ptr(new Tensor(tt.Type(), tt_shape, tt.GetInitializer()->Clone(), Tensor::TType::kSegment, false)), .joiner = iter.second.joiner}; + } } - time_end = clock(); + time_end = std::chrono::system_clock::now(); + LOG(INFO) << name << ", initialize takes " << std::chrono::duration_cast(time_end-time_start).count(); - time_start = clock(); - std::unique_ptr slicer; - std::unique_ptr> xslicer(new WrapperData(max_size)); - std::vector ids, reused_ids; - for (const auto& iter: variables) { - const HashMap::HashMapStruct& hash_slicer = iter->variable.hash_slicer; - std::vector keys, item_ids; - for (size_t index = 0; index < hash_slicer.items.size(); index++) { - auto& item = hash_slicer.items[index]; - uint32_t range = Hasher::Hash128(item.x, item.y); - if (beg <= range && range < end) { - keys.push_back(item.x); - keys.push_back(item.y); - item_ids.push_back(item.id); - } - if (keys.size() > 400000 || index == hash_slicer.items.size()-1) { - if (xslicer->Internal().Get(&keys[0], keys.size()/2, 2, &ids, &reused_ids) != 0) { - return Status::ArgumentError("insert hashmap failed."); - } - size_t slice_size = SizeOfType(var->data.Type()) * var->data.Shape().NumElements() / var->data.Shape()[0]; - for (size_t ki = 0; ki < keys.size()/2; ki++) { - CASES(var->data.Type(), do { - T* target = var->data.Raw(); - T* source = iter->variable.data.Raw(); - memcpy((void*)target + (ids[ki]*slice_size), (void*)source + (item_ids[ki]*slice_size), slice_size); - } while(0)); - for (auto& slot : var->slots) { - if (slot.second.tensor->Shape().IsScalar()) { - continue; - } - size_t ssize = SizeOfType(slot.second.tensor->Type()) * slot.second.tensor->Shape().NumElements() / slot.second.tensor->Shape()[0]; - CASES(slot.second.tensor->Type(), do { - T* target = slot.second.tensor->Raw(); - T* source = iter->variable.slots[slot.first].tensor->Raw(); - memcpy((void*)target + (ids[ki]*ssize), (void*)source + (item_ids[ki]*ssize), ssize); - } while(0)); - } + for (size_t i = 0; i < variables.size(); i++) { + const std::unique_ptr& lvs = variables[i]; + std::vector& key = keys[i]; + std::vector& value = values[i]; + std::vector ids; + time_start = std::chrono::system_clock::now(); + size_t no_use; + hashmap->Get((int64_t*)&key[0], value.size(), false, 1.0, &ids, nullptr, &no_use, 10000000000L); + size_t slice_size = SizeOfType(var->GetData()->Type()) * var->GetData()->Shape().NumElements() / var->GetData()->Shape()[0]; + for (size_t j = 0; j < ids.size(); j++) { + char* target = var->GetData()->Raw(ids[j]); + char* source = lvs->variable.data.Raw(value[j]); + memcpy(target, source, slice_size); + for (auto& slot : slots) { + if (slot.second.joiner == Variable::SlotJoiner::kVariableLike) { + size_t ssize = SizeOfType(slot.second.tensor->Type()) * slot.second.tensor->Shape().NumElements() / slot.second.tensor->Shape()[0]; + char* target = slot.second.tensor->Raw(ids[j]); + char* source = lvs->variable.slots[slot.first].tensor->Raw(value[j]); + memcpy(target, source, ssize); } - keys.clear(); - item_ids.clear(); } } + time_end = std::chrono::system_clock::now(); + LOG(INFO) << name << ", memcpy takes " << std::chrono::duration_cast(time_end-time_start).count(); } - time_end = clock(); - - //slicer.reset(xslicer.release()); - result_variable->reset(new Variable(new Tensor(var->data), xslicer.release())); - (*result_variable)->SetSlots(CloneSlots(var->slots)); - var->type = VariableStruct::kHashSlicer; - var->initialized = true; + var->SetSlots(std::move(slots)); + result_variable.reset(var); return Status::Ok(); } -int64_t CheckpointUtils::CalMaxSize(const std::vector>& variables, size_t begin, size_t end) { - int64_t total = 0; - for (auto& lvs : variables) { - if (begin <= lvs->beg && lvs->end <= end) { - total += lvs->variable.hash_slicer.items.size(); - continue; +int64_t CheckpointUtils::CalMaxSize(const std::vector >& variables, const std::string& name, size_t begin, size_t end, std::vector >* keys, std::vector >* values) { + keys->resize(variables.size()); + values->resize(variables.size()); + for (size_t i = 0; i < variables.size(); i++) { + if (variables[i]->variable.type == VariableStruct::kHashSlicer128) { + (*keys)[i].reserve(variables[i]->variable.hash_slicer128.items.size() * 2); + (*values)[i].reserve(variables[i]->variable.hash_slicer128.items.size()); + } else { + (*keys)[i].reserve(variables[i]->variable.hash_slicer64.items.size()); + (*values)[i].reserve(variables[i]->variable.hash_slicer64.items.size()); } - for (auto item : lvs->variable.hash_slicer.items) { - uint32_t range = Hasher::Hash128(item.x, item.y); - if (begin <= range && range < end) { - ++total; + } + for (size_t i = 0; i < variables.size(); i++) { + const std::unique_ptr& lvs = variables[i]; + if (lvs->variable.type == VariableStruct::kHashSlicer128) { + for (size_t j = 0; j < lvs->variable.hash_slicer128.items.size(); j++) { + const HashMapItem& item = lvs->variable.hash_slicer128.items[j]; + uint32_t range = Hasher::Hash128(item.key.hash1, item.key.hash2); + if (begin <= range && range < end) { + (*keys)[i].push_back(item.key.hash1); + (*keys)[i].push_back(item.key.hash2); + (*values)[i].push_back(item.id); + } + } + } else { + for (size_t j = 0; j < lvs->variable.hash_slicer64.items.size(); j++) { + const HashMapItem& item = lvs->variable.hash_slicer64.items[j]; + uint32_t range = Hasher::Hash64(item.key); + if (begin <= range && range < end) { + (*keys)[i].push_back(item.key); + (*values)[i].push_back(item.id); + } } } } + size_t total = 0; + for (size_t i = 0; i < variables.size(); i++) { + total += (*values)[i].size(); + } + LOG(INFO) << name << ", variables.size() " << variables.size() << " begin " << begin << " end " << end << " total " << total; return total; } -Status CheckpointUtils::StructToVariable(const VariableStruct& vs, std::unique_ptr* var, const VariableInfo& info, size_t part) { - std::unique_ptr slicer; - switch (vs.type) { - case VariableStruct::kIndexSlicer: { - slicer.reset(new WrapperData(vs.index_slicer)); - break; - } - case VariableStruct::kHashSlicer: { - if (info.shape.empty()) { - return Status::ArgumentError("CheckpointUtils: Hash Shape should not be scalar"); - } - size_t hashmap_size = std::max(info.shape[0] * info.parts[part].size / Hasher::kTargetRange, vs.hash_slicer.counter) + 10; - std::unique_ptr> xslicer(new WrapperData(hashmap_size)); - xslicer->Internal().SetHashKeys(vs.hash_slicer); - slicer.reset(xslicer.release()); - break; - } - default: - return Status::NotImplemented("Not Implemented variable slicer type"); - } - var->reset(new Variable(new Tensor(vs.data), slicer.release())); - (*var)->SetSlots(CloneSlots(vs.slots)); - return Status::Ok(); -} - -Status CheckpointUtils::LoadVariable(const std::string& var_name, size_t part, VariableStruct* var) { +Status CheckpointUtils::LoadVariable(const VariableInfo& info, size_t part, VariableStruct* var) { std::unique_ptr s; - Status st = FileSystem::OpenReadStreamAny(path_ + '/' + VariableNameToFileName(var_name, part), &s); + Status st = FileSystem::OpenReadStreamAny(VariableInfoToFileName(info, part), &s); if (!st.IsOk()) { - LOG(ERROR) << "Open" << path_ << "/" << VariableNameToFileName(var_name, part) << " failed."; + LOG(ERROR) << "Open " << VariableInfoToFileName(info, part) << " failed."; var->initialized = false; - return Status::Ok(); + return st; } - return LoadVariable(s.get(), var); + return LoadVariable(info.name + " part[" + std::to_string(part) + "]", s.get(), var); } -Status CheckpointUtils::SaveVariable(const std::string& var_name, size_t part, VariableStruct* var) { +Status CheckpointUtils::SaveVariable(const std::string& checkpoint, const std::string& var_name, size_t part, VariableStruct* var) { std::unique_ptr s; - PS_CHECK_STATUS(FileSystem::OpenWriteStreamAny(path_ + '/' + VariableNameToFileName(var_name, part), &s)); + PS_CHECK_STATUS(FileSystem::OpenWriteStreamAny(checkpoint + '/' + VariableNameToFileName(var_name, part), &s)); return SaveVariable(s.get(), var); } @@ -366,11 +397,14 @@ Status CheckpointUtils::VariableToStruct(const std::unique_ptr& var, V if (dynamic_cast*>(slicer) != nullptr) { vs->type = VariableStruct::kIndexSlicer; vs->index_slicer = dynamic_cast*>(slicer)->Internal(); - } else if (dynamic_cast*>(slicer) != nullptr) { - vs->type = VariableStruct::kHashSlicer; - int ret = dynamic_cast*>(slicer)->Internal().GetHashKeys(&vs->hash_slicer); - if (ret) { - return Status::Unknown("HashMap GetHashKeys Internal Error"); + } else if (dynamic_cast >*>(slicer) != nullptr) { + HashMap* hashmap = dynamic_cast >*>(slicer)->Internal().get(); + if (dynamic_cast*>(hashmap) != nullptr) { + vs->type = VariableStruct::kHashSlicer64; + dynamic_cast*>(hashmap)->GetItems(&vs->hash_slicer64); + } else if (dynamic_cast*>(hashmap) != nullptr) { + vs->type = VariableStruct::kHashSlicer128; + dynamic_cast*>(hashmap)->GetItems(&vs->hash_slicer128); } } else { return Status::NotImplemented("Not Implemented variable slicer type"); @@ -381,22 +415,24 @@ Status CheckpointUtils::VariableToStruct(const std::unique_ptr& var, V return Status::Ok(); } -Status CheckpointUtils::LoadVariable(FileSystem::ReadStream* s, VariableStruct* var) { +Status CheckpointUtils::LoadVariable(const std::string& name, FileSystem::ReadStream* s, VariableStruct* var) { PS_CHECK_STATUS(s->ReadRaw(&(var->type))); switch (var->type) { case VariableStruct::kIndexSlicer: PS_CHECK_STATUS(s->ReadRaw(&(var->index_slicer))); -// LOG(DEBUG) << "index_slicer size is " << var->index_slicer; break; - case VariableStruct::kHashSlicer: - PS_CHECK_STATUS(s->ReadRaw(&(var->hash_slicer.counter))); -// LOG(DEBUG) << "Hash_slicer counter is " << var->hash_slicer.counter; - PS_CHECK_STATUS(s->ReadVec(&(var->hash_slicer.items))); + case VariableStruct::kHashSlicer128: + PS_CHECK_STATUS(s->ReadRaw(&(var->hash_slicer128.count))); + PS_CHECK_STATUS(s->ReadTBBVec(&(var->hash_slicer128.items))); + break; + case VariableStruct::kHashSlicer64: + PS_CHECK_STATUS(s->ReadRaw(&(var->hash_slicer64.count))); + PS_CHECK_STATUS(s->ReadTBBVec(&(var->hash_slicer64.items))); break; default: return Status::NotImplemented("Not Implemented variable slicer type"); } - PS_CHECK_STATUS(LoadTensor(s, &var->data)); + PS_CHECK_STATUS(LoadTensor(name, s, var->type, &var->data)); size_t slot_size; PS_CHECK_STATUS(s->ReadRaw(&slot_size)); for (size_t i = 0; i < slot_size; i++) { @@ -405,7 +441,7 @@ Status CheckpointUtils::LoadVariable(FileSystem::ReadStream* s, VariableStruct* Variable::Slot& slot = var->slots[slot_name]; slot.tensor.reset(new Tensor); PS_CHECK_STATUS(s->ReadRaw(&slot.joiner)); - PS_CHECK_STATUS(LoadTensor(s, slot.tensor.get())); + PS_CHECK_STATUS(LoadTensor(name + " slot[" + slot_name + "]", s, var->type, slot.tensor.get())); } var->initialized = true; return Status::Ok(); @@ -417,9 +453,13 @@ Status CheckpointUtils::SaveVariable(FileSystem::WriteStream* s, VariableStruct* case VariableStruct::kIndexSlicer: PS_CHECK_STATUS(s->WriteRaw(var->index_slicer)); break; - case VariableStruct::kHashSlicer: - PS_CHECK_STATUS(s->WriteRaw(var->hash_slicer.counter)); - PS_CHECK_STATUS(s->WriteVec(var->hash_slicer.items)); + case VariableStruct::kHashSlicer128: + PS_CHECK_STATUS(s->WriteRaw(var->hash_slicer128.count.load())); + PS_CHECK_STATUS(s->WriteTBBVec(var->hash_slicer128.items)); + break; + case VariableStruct::kHashSlicer64: + PS_CHECK_STATUS(s->WriteRaw(var->hash_slicer64.count.load())); + PS_CHECK_STATUS(s->WriteTBBVec(var->hash_slicer64.items)); break; default: return Status::NotImplemented("Not Implemented variable slicer type"); @@ -435,7 +475,7 @@ Status CheckpointUtils::SaveVariable(FileSystem::WriteStream* s, VariableStruct* return Status::Ok(); } -Status CheckpointUtils::LoadTensor(FileSystem::ReadStream* s, Tensor* data) { +Status CheckpointUtils::LoadTensor(const std::string& name, FileSystem::ReadStream* s, VariableStruct::SlicerType slicer_type, Tensor* data) { DataType type; std::vector shape; Initializer* initializer; @@ -450,7 +490,7 @@ Status CheckpointUtils::LoadTensor(FileSystem::ReadStream* s, Tensor* data) { serializer::MemGuard mem; serializer::Fragment frag(&initializer_buf[0], initializer_buf.size()); PS_CHECK_STATUS(serializer::DeserializeAny(initializer_type, &frag, 0, &initializer, &len, mem)); - Tensor result(type, TensorShape(shape), initializer, false); + Tensor result(type, TensorShape(shape), initializer, Tensor::TType::kContinuous, false); PS_CHECK_STATUS(s->Read(result.Raw(), result.Shape().NumElements() * SizeOfType(type))); *data = result; return Status::Ok(); @@ -458,7 +498,8 @@ Status CheckpointUtils::LoadTensor(FileSystem::ReadStream* s, Tensor* data) { Status CheckpointUtils::SaveTensor(FileSystem::WriteStream* s, const Tensor& data) { DataType type = data.Type(); - const std::vector& shape = data.Shape().Dims(); + TensorShape tensor_shape = data.Shape(); + const std::vector& shape = tensor_shape.Dims(); Initializer* initializer = data.GetInitializer(); size_t initializer_type; std::string initializer_buf; @@ -474,8 +515,16 @@ Status CheckpointUtils::SaveTensor(FileSystem::WriteStream* s, const Tensor& dat PS_CHECK_STATUS(s->WriteVec(shape)); PS_CHECK_STATUS(s->WriteRaw(initializer_type)); PS_CHECK_STATUS(s->WriteStr(initializer_buf)); - PS_CHECK_STATUS(s->Write(data.Raw(), data.Shape().NumElements() * SizeOfType(type))); - + if (data.TensorType() == Tensor::TType::kContinuous) { + PS_CHECK_STATUS(s->Write(data.Raw(), tensor_shape.NumElements() * SizeOfType(type))); + } else if (data.TensorType() == Tensor::TType::kSegment) { + size_t slice_size = tensor_shape.NumElements()/tensor_shape[0]; + for (size_t i = 0; i < tensor_shape[0] / data.SegmentSize(); i++) { + PS_CHECK_STATUS(s->Write(data.Raw(i * data.SegmentSize()), data.SegmentSize() * slice_size * SizeOfType(type))); + } + } else { + return Status::ArgumentError("Tensor type not support ."); + } return Status::Ok(); } @@ -487,6 +536,7 @@ std::unordered_map CheckpointUtils::CloneSlots(cons return std::move(ret); } + } } diff --git a/xdl/ps-plus/ps-plus/server/checkpoint_utils.h b/xdl/ps-plus/ps-plus/server/checkpoint_utils.h index 2d3e34e3..4b536da1 100644 --- a/xdl/ps-plus/ps-plus/server/checkpoint_utils.h +++ b/xdl/ps-plus/ps-plus/server/checkpoint_utils.h @@ -1,60 +1,80 @@ +/* Copyright (C) 2016-2018 Alibaba Group Holding Limited + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + #ifndef PS_PLUS_SERVER_CHECKPOINT_UTILS_H_ #define PS_PLUS_SERVER_CHECKPOINT_UTILS_H_ +#include +#include #include "ps-plus/common/status.h" #include "ps-plus/common/file_system.h" #include "ps-plus/common/hashmap.h" #include "ps-plus/message/variable_info.h" #include "ps-plus/server/variable.h" - -#include +#include "ps-plus/common/hasher.h" namespace ps { namespace server { class CheckpointUtils { public: - CheckpointUtils(const std::string& path, const VariableInfoCollection& infos); + CheckpointUtils(const VariableInfoCollection& infos); Status LoadVariables( const VariableInfoCollection& infos, size_t id, std::unordered_map>* vars); Status SaveVariables( size_t id, - const std::unordered_map>& vars); + const std::string& checkpoint_path, + const std::unordered_map>& vars, + size_t timeout=30); + + private: struct VariableStruct { enum SlicerType : int32_t { kIndexSlicer = 0, - kHashSlicer = 1 + kHashSlicer128 = 1, + kHashSlicer64 = 2, }; bool initialized; SlicerType type; - HashMap::HashMapStruct hash_slicer; + HashMapStruct hash_slicer128; + HashMapStruct hash_slicer64; size_t index_slicer; Tensor data; std::unordered_map slots; }; - Status LoadVariable(const std::string& var_name, size_t part, VariableStruct* var); - private: struct LoadVariableStruct { VariableStruct variable; size_t beg, end; size_t clip_beg, clip_end; }; - Status MergeLoadVariable(const std::string& var_name, const VariableInfo& info, size_t beg, size_t end, VariableStruct* var, std::unique_ptr* result_variable); - Status SaveVariable(const std::string& var_name, size_t part, VariableStruct* var); - int64_t CalMaxSize(const std::vector>& variables, size_t begin, size_t end); + Status LoadVariable(const VariableInfo& info, size_t part, VariableStruct* var); + Status VariableToStruct(const std::unique_ptr& var, VariableStruct* vs); + static Status SaveVariable(const std::string& checkpoint_path, const std::string& var_name, size_t part, VariableStruct* var); + static std::string VariableInfoToFileName(const VariableInfo& info, size_t id); static std::string VariableNameToFileName(const std::string& name, size_t id); - static Status StructToVariable(const VariableStruct& vs, std::unique_ptr* var, const VariableInfo& info, size_t part); - static Status VariableToStruct(const std::unique_ptr& var, VariableStruct* vs); - static Status LoadVariable(FileSystem::ReadStream* s, VariableStruct* var); + static Status LoadVariable(const std::string& name, FileSystem::ReadStream* s, VariableStruct* var); static Status SaveVariable(FileSystem::WriteStream* s, VariableStruct* var); - static Status LoadTensor(FileSystem::ReadStream* s, Tensor* data); + static Status LoadTensor(const std::string& name, FileSystem::ReadStream* s, VariableStruct::SlicerType slicer_type, Tensor* data); static Status SaveTensor(FileSystem::WriteStream* s, const Tensor& data); static std::unordered_map CloneSlots(const std::unordered_map& slots); - - std::string path_; - std::unordered_map infos_; + Status MergeLoadVariable(const std::string& name, const VariableInfo& info, size_t beg, size_t end, std::unique_ptr* result_variable); + Status LoadHashVariable(const std::vector>& variables, const std::string& name, const VariableInfo& info, size_t beg, size_t end, std::unique_ptr& result_variable); + static int64_t CalMaxSize(const std::vector >& variables, const std::string& name, size_t begin, size_t end, std::vector >* keys, std::vector >* values); + VariableInfoCollection infos_; }; } diff --git a/xdl/ps-plus/ps-plus/server/local_server.cc b/xdl/ps-plus/ps-plus/server/local_server.cc index 927a2e74..d562c4fd 100644 --- a/xdl/ps-plus/ps-plus/server/local_server.cc +++ b/xdl/ps-plus/ps-plus/server/local_server.cc @@ -127,18 +127,20 @@ Status LocalServer::Restore(const std::string& ckpt_version) { { std::lock_guard lock(var_info_mutex_); for (auto& item: info.infos) { + item.args[VariableInfo::ORIGIN_FILE_PATH] = real_ckpt_path; + item.args[VariableInfo::ORIGIN_NAME] = item.name; size_t total = 0; for (const auto& part : item.parts) { total += part.size; } item.parts.clear(); - item.parts.push_back(ps::VariableInfo::Part{.server=0, .size=total}); + item.parts.push_back(ps::VariableInfo::Part{.server=0, .size=total}); var_infos_.insert(std::make_pair(item.name, item)); } } storage_manager_->Internal().clear(); - CheckpointUtils ckpt_utils(real_ckpt_path, info); + CheckpointUtils ckpt_utils(info); return ckpt_utils.LoadVariables(info, 0, &storage_manager_->Internal()); } @@ -203,7 +205,7 @@ Status LocalServer::RegisterVariable(const std::string& name, } std::lock_guard lock(var_info_mutex_); - var_infos_.insert({name, vi}); + var_infos_[name] = vi; return Status::Ok(); } @@ -242,8 +244,8 @@ Status LocalServer::Save(const std::string& ckpt_version) { } std::string real_ckpt_path = ckpt_path_ + "/" + ckpt_version; - CheckpointUtils ckpt_utils(real_ckpt_path, info); - PS_CHECK_STATUS(ckpt_utils.SaveVariables(0, storage_manager_->Internal())); + CheckpointUtils ckpt_utils(info); + PS_CHECK_STATUS(ckpt_utils.SaveVariables(0, real_ckpt_path, storage_manager_->Internal())); std::vector checkpoints; { std::unique_ptr s; diff --git a/xdl/ps-plus/ps-plus/server/server.cc b/xdl/ps-plus/ps-plus/server/server.cc index 04702343..bc311410 100644 --- a/xdl/ps-plus/ps-plus/server/server.cc +++ b/xdl/ps-plus/ps-plus/server/server.cc @@ -15,6 +15,7 @@ limitations under the License. #include "ps-plus/server/server.h" #include "ps-plus/server/checkpoint_utils.h" +#include "ps-plus/common/logging.h" namespace ps { namespace server { @@ -65,6 +66,7 @@ Status Server::RunUdfChain(Version ver, size_t udf, const std::string& variable_ locker.reset(new QRWLocker(variable->VariableLock(), QRWLocker::kSimpleRead)); ctx->SetLocker(locker.get()); } + ctx->SetServerLocker(&lock); Status ret = udf_chain->Process(ctx); return ret; } @@ -74,18 +76,15 @@ Status Server::Save(Version ver, const std::string& checkpoint, const VariableIn if (ver != ver_) { return Status::VersionMismatch("RunUdfChain Version Mismatch"); } - CheckpointUtils ckpt(checkpoint, info); - return ckpt.SaveVariables(id_, storage_manager_->Internal()); + CheckpointUtils ckpt(info); + return ckpt.SaveVariables(id_, checkpoint, storage_manager_->Internal()); } -Status Server::Restore(Version ver, const std::string& checkpoint, const VariableInfoCollection& from, const VariableInfoCollection& to) { +Status Server::Restore(Version ver, const VariableInfoCollection& from, const VariableInfoCollection& to) { QRWLocker lock(server_lock_, QRWLocker::kWrite); ver_ = ver; storage_manager_->Internal().clear(); - CheckpointUtils ckpt(checkpoint, from); - if (checkpoint == "") { - return Status::Ok(); - } + CheckpointUtils ckpt(from); return ckpt.LoadVariables(to, id_, &storage_manager_->Internal()); } @@ -136,18 +135,18 @@ Status Server::GatherStreamingDenseVar(Version ver, const DenseVarNames& name, D return Status::Ok(); } -Status Server::TriggerStreamingSparse(Version ver) { +Status Server::TriggerStreamingSparse(Version ver, const int& server_id, const std::string& stream_version) { { QRWLocker lock(server_lock_, QRWLocker::kSimpleRead); if (ver != ver_) { return Status::VersionMismatch("RunUdfChain Version Mismatch"); } } - if (streaming_model_args_.streaming_sparse_model_addr.empty()) { - return Status::Unknown("Streaming Sparse Model is Disabled"); + if (streaming_model_args_.streaming_hash_model_addr.empty()) { + return Status::Unknown("Streaming Hash Model is Disabled"); } - if (streaming_model_args_.streaming_sparse_model_writer == nullptr) { - return Status::Unknown("Streaming Sparse Model Writer connect error"); + if (streaming_model_args_.streaming_hash_model_writer == nullptr) { + return Status::Unknown("Streaming Hash Model Writer connect error"); } std::unordered_map logs; StreamingModelUtils::GetSparse(&logs); @@ -172,10 +171,10 @@ Status Server::TriggerStreamingSparse(Version ver) { } results.emplace_back(std::move(ret)); } - return streaming_model_args_.streaming_sparse_model_writer->WriteSparseModel(results); + return streaming_model_args_.streaming_sparse_model_writer->WriteSparseModel(results, stream_version, server_id); } -Status Server::TriggerStreamingHash(Version ver) { +Status Server::TriggerStreamingHash(Version ver, const int& server_id, const std::string& stream_version) { { QRWLocker lock(server_lock_, QRWLocker::kSimpleRead); if (ver != ver_) { @@ -198,13 +197,21 @@ Status Server::TriggerStreamingHash(Version ver) { PS_CHECK_STATUS(storage_manager_->Get(var_name, &var)); QRWLocker var_lock(var->VariableLock(), QRWLocker::kSimpleRead); StreamingModelWriter::HashModel ret; - WrapperData* offset_slicer = dynamic_cast*>(var->GetSlicer()); - if (offset_slicer == nullptr) { + std::unique_ptr& hashmap = (dynamic_cast >*>(var->GetSlicer()))->Internal(); + if (hashmap == nullptr) { return Status::Unknown("Variable " + var_name + " is not a hash variable"); } - std::vector ids; - std::vector> keys(log.write_ids.begin(), log.write_ids.end()); - size_t r = offset_slicer->Internal().GetWithoutAdd(&keys[0].first, keys.size(), 2, &ids); + std::vector ids; + int64_t* keys = new int64_t[log.write_ids.size()*2]; + int i = 0; + for (auto it = log.write_ids.begin(); it != log.write_ids.end(); ++it){ + keys[2*i] = it->first; + keys[2*i+1] = it->second; + i++; + } + tbb::concurrent_vector reids; + size_t filter; + size_t r = hashmap->Get(keys, log.write_ids.size(), false, 1.0, &ids, &reids, &filter); if (r != 0) { return Status::Unknown("Streaming Hash Model Get Hashmap error"); } @@ -214,13 +221,15 @@ Status Server::TriggerStreamingHash(Version ver) { if (ids[i] < 0) { continue; } - ret.ids.push_back(keys[i]); + std::pair temp(keys[2*i], keys[2*i+1]); + ret.ids.push_back(temp); ret.offsets.push_back(ids[i]); } ret.del_ids = std::vector>(log.del_ids.begin(), log.del_ids.end()); results.emplace_back(std::move(ret)); + delete keys; } - return streaming_model_args_.streaming_hash_model_writer->WriteHashModel(results); + return streaming_model_args_.streaming_hash_model_writer->WriteHashModel(results, stream_version, server_id); } } diff --git a/xdl/ps-plus/ps-plus/server/server.h b/xdl/ps-plus/ps-plus/server/server.h index 5cbcce26..eae6d24f 100644 --- a/xdl/ps-plus/ps-plus/server/server.h +++ b/xdl/ps-plus/ps-plus/server/server.h @@ -37,11 +37,11 @@ class Server { Status RegisterUdfChain(Version ver, const UdfChainRegister& def); Status RunUdfChain(Version ver, size_t udf, const std::string& variable_name, const std::vector& inputs, UdfContext* ctx); Status Save(Version ver, const std::string& checkpoint, const VariableInfoCollection& info); - Status Restore(Version ver, const std::string& checkpoint, const VariableInfoCollection& from, const VariableInfoCollection& to); + Status Restore(Version ver, const VariableInfoCollection& from, const VariableInfoCollection& to); Status StreamingDenseVarName(Version ver, DenseVarNames* result); Status GatherStreamingDenseVar(Version ver, const DenseVarNames& name, DenseVarValues* result); - Status TriggerStreamingSparse(Version ver); - Status TriggerStreamingHash(Version ver); + Status TriggerStreamingSparse(Version ver, const int& server_id, const std::string& stream_version); + Status TriggerStreamingHash(Version ver, const int& server_id, const std::string& stream_version); private: // Writelocked when restore. QRWLock server_lock_; diff --git a/xdl/ps-plus/ps-plus/server/server_service.cc b/xdl/ps-plus/ps-plus/server/server_service.cc index 71ff3900..f0626def 100644 --- a/xdl/ps-plus/ps-plus/server/server_service.cc +++ b/xdl/ps-plus/ps-plus/server/server_service.cc @@ -15,6 +15,7 @@ limitations under the License. #include "ps-plus/server/server_service.h" +#include "ps-plus/common/logging.h" #include "ps-plus/common/net_utils.h" #include "ps-plus/common/reliable_kv.h" #include "ps-plus/message/server_info.h" @@ -23,7 +24,6 @@ limitations under the License. #include #include #include -#include using ps::service::seastar::SeastarStatus; using ps::service::seastar::SeastarServerClientLib; @@ -215,27 +215,26 @@ void ServerService::Save(const std::vector& inputs, std::vector* o outputs->push_back(new WrapperData(Status::ArgumentError("SaveFunc: Input Type Error"))); return; } - LOG(INFO) << "Saving Checkpoint " << checkpoint->Internal(); + LOG(INFO) << "Saving Checkpoint " << checkpoint->Internal().c_str(); Status st = server_->Save(ver->Internal(), checkpoint->Internal(), info->Internal()); outputs->push_back(new WrapperData(st)); - LOG(INFO) << "Saving Checkpoint Done " << checkpoint->Internal(); + LOG(INFO) << "Saving Checkpoint Done " << checkpoint->Internal().c_str(); return; } void ServerService::Restore(const std::vector& inputs, std::vector* outputs) { - if (inputs.size() != 4) { - outputs->push_back(new WrapperData(Status::ArgumentError("RestoreFunc: Need 4 inputs"))); + if (inputs.size() != 3) { + outputs->push_back(new WrapperData(Status::ArgumentError("RestoreFunc: Need 3 inputs"))); return; } WrapperData* ver = dynamic_cast*>(inputs[0]); - WrapperData* checkpoint = dynamic_cast*>(inputs[1]); - WrapperData* from = dynamic_cast*>(inputs[2]); - WrapperData* to = dynamic_cast*>(inputs[3]); - if (ver == nullptr || checkpoint == nullptr || from == nullptr || to == nullptr) { + WrapperData* from = dynamic_cast*>(inputs[1]); + WrapperData* to = dynamic_cast*>(inputs[2]); + if (ver == nullptr || from == nullptr || to == nullptr) { outputs->push_back(new WrapperData(Status::ArgumentError("RestoreFunc: Input Type Error"))); return; } - Status st = server_->Restore(ver->Internal(), checkpoint->Internal(), from->Internal(), to->Internal()); + Status st = server_->Restore(ver->Internal(), from->Internal(), to->Internal()); outputs->push_back(new WrapperData(st)); return; } @@ -280,31 +279,33 @@ void ServerService::GatherStreamingDenseVar(const std::vector& inputs, st } void ServerService::TriggerStreamingSparse(const std::vector& inputs, std::vector* outputs) { - if (inputs.size() != 1) { - outputs->push_back(new WrapperData(Status::ArgumentError("TriggerStreamingSparseFunc: Need 1 inputs"))); + if (inputs.size() != 2) { + outputs->push_back(new WrapperData(Status::ArgumentError("TriggerStreamingSparseFunc: Need 2 inputs"))); return; } WrapperData* ver = dynamic_cast*>(inputs[0]); - if (ver == nullptr) { + WrapperData* stream_version = dynamic_cast*>(inputs[1]); + if ((ver == nullptr) || (stream_version == nullptr)){ outputs->push_back(new WrapperData(Status::ArgumentError("TriggerStreamingSparseFunc: Input Type Error"))); return; } - Status st = server_->TriggerStreamingSparse(ver->Internal()); + Status st = server_->TriggerStreamingSparse(ver->Internal(), server_id_, stream_version->Internal()); outputs->push_back(new WrapperData(st)); return; } void ServerService::TriggerStreamingHash(const std::vector& inputs, std::vector* outputs) { - if (inputs.size() != 1) { - outputs->push_back(new WrapperData(Status::ArgumentError("TriggerStreamingHashFunc: Need 1 inputs"))); + if (inputs.size() != 2) { + outputs->push_back(new WrapperData(Status::ArgumentError("TriggerStreamingHashFunc: Need 2 inputs"))); return; } WrapperData* ver = dynamic_cast*>(inputs[0]); - if (ver == nullptr) { + WrapperData* stream_version = dynamic_cast*>(inputs[1]); + if ((ver == nullptr) || (stream_version == nullptr)){ outputs->push_back(new WrapperData(Status::ArgumentError("TriggerStreamingHashFunc: Input Type Error"))); return; } - Status st = server_->TriggerStreamingHash(ver->Internal()); + Status st = server_->TriggerStreamingHash(ver->Internal(), server_id_, stream_version->Internal()); outputs->push_back(new WrapperData(st)); return; } @@ -322,11 +323,11 @@ void ServerService::RegisterServer() { size_t pos = scheduler_addr.find('^'); if (pos == std::string::npos) { - LOG(WARNING) << "Cannot Get Scheduler Addr[" << scheduler_kv_addr_ << - "]: Store[" << scheduler_addr << "]"; + LOG(WARNING) << "Cannot Get Scheduler Addr[" << scheduler_kv_addr_ << + "]: Store[" << scheduler_addr << "]"; } - scheduler_addr = scheduler_addr.substr(pos + 1); + if (scheduler_addr != old_scheduler_addr) { seastar_lib_->Connect(0, scheduler_addr); old_scheduler_addr = scheduler_addr; @@ -347,6 +348,7 @@ void ServerService::RegisterServer() { } })); result.get_future().wait(); + // TODO: process errors } } diff --git a/xdl/ps-plus/ps-plus/server/server_service.h b/xdl/ps-plus/ps-plus/server/server_service.h index 40a423d4..68f4fdb7 100644 --- a/xdl/ps-plus/ps-plus/server/server_service.h +++ b/xdl/ps-plus/ps-plus/server/server_service.h @@ -31,11 +31,11 @@ namespace server { class ServerService { public: ServerService(const std::string& scheduler, - int server_id, - std::string streaming_dense_model_addr, - std::string streaming_sparse_model_addr, - std::string streaming_hash_model_addr, - bool bind_cores = false); + int server_id, + std::string streaming_dense_model_addr, + std::string streaming_sparse_model_addr, + std::string streaming_hash_model_addr, + bool bind_cores); Status Init(); ~ServerService(); private: @@ -58,8 +58,8 @@ class ServerService { bool stop_; int server_id_; int core_num_; - bool bind_cores_; - + int bind_cores_; + Version server_version_; std::unique_ptr server_; std::unique_ptr seastar_lib_; diff --git a/xdl/ps-plus/ps-plus/server/storage_manager.cc b/xdl/ps-plus/ps-plus/server/storage_manager.cc index a56eb03f..b91d76d7 100644 --- a/xdl/ps-plus/ps-plus/server/storage_manager.cc +++ b/xdl/ps-plus/ps-plus/server/storage_manager.cc @@ -22,10 +22,10 @@ Status StorageManager::Get(const std::string& name, Variable** variable) { QRWLocker lock(rd_lock_, QRWLocker::kSimpleRead); auto iter = variable_map_.find(name); if (iter == variable_map_.end()) { - return Status::NotFound("Storage Manager Get: Net Found For Name: " + name); + return Status::NotFound("Storage Manager Get: Not Found For Name: " + name); } if (iter->second == nullptr) { - return Status::NotFound("Sotrage Manager Get: Initializing: " + name); + return Status::NotFound("Storage Manager Get: Initializing: " + name); } *variable = iter->second.get(); return Status::Ok(); diff --git a/xdl/ps-plus/ps-plus/server/test/checkpoint_utils_test.cc b/xdl/ps-plus/ps-plus/server/test/checkpoint_utils_test.cc index 0054dc9e..1e09d0f4 100644 --- a/xdl/ps-plus/ps-plus/server/test/checkpoint_utils_test.cc +++ b/xdl/ps-plus/ps-plus/server/test/checkpoint_utils_test.cc @@ -14,14 +14,21 @@ limitations under the License. ==============================================================================*/ #include "gtest/gtest.h" + +#define private public #include "ps-plus/server/checkpoint_utils.h" +#include "ps-plus/scheduler/scheduler_impl.h" #include "ps-plus/common/initializer/constant_initializer.h" +#include +#undef private using ps::Tensor; using ps::Initializer; using ps::DataType; using ps::TensorShape; using ps::HashMap; +using ps::HashMapImpl; +using ps::Hash128Key; using ps::server::Variable; using ps::server::CheckpointUtils; using ps::initializer::ConstantInitializer; @@ -32,77 +39,98 @@ using ps::VariableInfo; TEST(CheckpointUtilsTest, CheckpointUtilsTest) { std::unordered_map> a; std::unordered_map> b; - WrapperData* y_slicer = new WrapperData(10); - int64_t y_keys[] = {1, 2, 3, 4}; - std::vector y_ids; - std::vector y_reused_ids; - EXPECT_EQ(0, y_slicer->Internal().Get(y_keys, 2, 2, &y_ids, &y_reused_ids)); + WrapperData >* y_slicer = new WrapperData >(new HashMapImpl(10)); + int64_t y_keys[] = {1, 2, 3, 4}; + std::vector y_ids; + size_t filtered; + EXPECT_EQ(2, y_slicer->Internal()->Get(y_keys, 2, false, 1.0, &y_ids, nullptr, &filtered)); EXPECT_EQ(2u, y_ids.size()); - EXPECT_EQ(0, y_ids[1]); - EXPECT_EQ(1, y_ids[0]); - a["x"].reset(new Variable(new Tensor(DataType::kInt8, TensorShape({4, 8}), new ConstantInitializer(0)), new WrapperData(10))); - a["y"].reset(new Variable(new Tensor(DataType::kInt8, TensorShape({4, 8}), new ConstantInitializer(1)), y_slicer)); - a["z"].reset(new Variable(new Tensor(DataType::kInt8, TensorShape({4, 8}), new ConstantInitializer(2)), new WrapperData(5))); + EXPECT_EQ(1, y_ids[1] + y_ids[0]); + a["x"].reset(new Variable(new Tensor(DataType::kInt8, TensorShape({4, 8}), new ConstantInitializer(0)), new WrapperData(10), "x")); + a["y"].reset(new Variable(new Tensor(DataType::kInt8, TensorShape({4, 8}), new ConstantInitializer(1)), y_slicer, "y")); + a["z"].reset(new Variable(new Tensor(DataType::kInt8, TensorShape({4, 8}), new ConstantInitializer(2)), new WrapperData(5), "z")); a["x"]->GetVariableLikeSlot("slot", DataType::kInt16, []{return new ConstantInitializer(42);}); - VariableInfoCollection infos = {.infos = { - VariableInfo { - .type = VariableInfo::kIndex, - .name = "w", - .parts = {VariableInfo::Part{.server = 0, .size = 10}, {.server = 1, .size = 4}}, - .shape = {14, 8}, - .datatype = DataType::kInt8, - .args = {}}, - VariableInfo { - .type = VariableInfo::kIndex, - .name = "x", - .parts = {VariableInfo::Part{.server = 0, .size = 10}, {.server = 1, .size = 4}}, - .shape = {14, 8}, - .datatype = DataType::kInt8, - .args = {}}, - VariableInfo { - .type = VariableInfo::kHash, - .name = "y", - .parts = {VariableInfo::Part{.server = 0, .size = 32760}, {.server = 1, .size = 32776}}, - .shape = {2, 8}, - .datatype = DataType::kInt8, - .args = {}}, - VariableInfo { - .type = VariableInfo::kIndex, - .name = "z", - .parts = {VariableInfo::Part{.server = 0, .size = 4}, {.server = 1, .size = 4}}, - .shape = {9, 8}, - .datatype = DataType::kInt8, - .args = {{"save", "false"}}} - }}; - CheckpointUtils ckpt("memory://save", infos); - EXPECT_TRUE(ckpt.SaveVariables(1, a).IsOk()); - EXPECT_TRUE(ckpt.LoadVariables(infos, 1, &b).IsOk()); - EXPECT_TRUE(b.find("x") != b.end()); - EXPECT_TRUE(b.find("y") != b.end()); - EXPECT_TRUE(b.find("z") == b.end()); - EXPECT_TRUE(b.find("w") == b.end()); - Tensor* slot = b["x"]->GetVariableLikeSlot("slot", DataType::kInt16, []{return new ConstantInitializer(43);}); - EXPECT_EQ(4, b["x"]->GetData()->Shape()[0]); - EXPECT_EQ(8, b["x"]->GetData()->Shape()[1]); - EXPECT_EQ(12, b["y"]->GetData()->Shape()[0]); - EXPECT_EQ(8, b["y"]->GetData()->Shape()[1]); + VariableInfoCollection from = {.infos = { + VariableInfo { + .type = VariableInfo::kIndex, + .name = "w", + .parts = {VariableInfo::Part{.server = 0, .size = 10}, {.server = 1, .size = 4}}, + .shape = {14, 8}, + .datatype = DataType::kInt8, + .args = {}}, + VariableInfo { + .type = VariableInfo::kIndex, + .name = "x", + .parts = {VariableInfo::Part{.server = 0, .size = 10}, {.server = 1, .size = 4}}, + .shape = {14, 8}, + .datatype = DataType::kInt8, + .args = {}}, + VariableInfo { + .type = VariableInfo::kHash128, + .name = "y", + .parts = {VariableInfo::Part{.server = 0, .size = 1}, {.server = 1, .size = 65534}}, + .shape = {2, 8}, + .datatype = DataType::kInt8, + .args = {}}, + VariableInfo { + .type = VariableInfo::kIndex, + .name = "z", + .parts = {VariableInfo::Part{.server = 0, .size = 4}, {.server = 1, .size = 4}}, + .shape = {9, 8}, + .datatype = DataType::kInt8, + .args = {{"save", "false"}}} + }}; + CheckpointUtils ckpt(from); + + ps::Status status = ckpt.SaveVariables(1, "memory://save", a); + std::cout << status.ToString() << std::endl; + EXPECT_TRUE(status.IsOk()); + + VariableInfoCollection to = from; + for (auto& info : to.infos) { + info.args[VariableInfo::ORIGIN_FILE_PATH] = "memory://save"; + info.args[VariableInfo::ORIGIN_NAME] = info.name; + //z=>d, y=>c, etc + info.name[0] -= 22; + } + EXPECT_FALSE(ckpt.LoadVariables(to, 1, &b).IsOk()); + to.infos.erase(to.infos.begin()); + + status = ckpt.LoadVariables(to, 1, &b); + std::cout << status.ToString() << std::endl; + EXPECT_TRUE(status.IsOk()); + + EXPECT_TRUE(b.find("b") != b.end()); + EXPECT_TRUE(b.find("c") != b.end()); + EXPECT_TRUE(b.find("d") == b.end()); + EXPECT_TRUE(b.find("a") == b.end()); + Tensor* slot = b["b"]->GetVariableLikeSlot("slot", DataType::kInt16, []{return new ConstantInitializer(43);}); + EXPECT_EQ(TensorShape({4, 8}), b["b"]->GetData()->Shape()); + TensorShape c_shape = b["c"]->GetData()->Shape(); + EXPECT_EQ(TensorShape({ps::Tensor::DEFAULT_SEGMENT_SIZE, 8}), c_shape); EXPECT_EQ(TensorShape({4, 8}), slot->Shape()); - EXPECT_EQ(DataType::kInt8, b["x"]->GetData()->Type()); - EXPECT_EQ(DataType::kInt8, b["y"]->GetData()->Type()); + EXPECT_EQ(DataType::kInt8, b["b"]->GetData()->Type()); + EXPECT_EQ(DataType::kInt8, b["c"]->GetData()->Type()); EXPECT_EQ(DataType::kInt16, slot->Type()); for (size_t i = 0; i < 32; i++) { - EXPECT_EQ(0, b["x"]->GetData()->Raw()[i]); - EXPECT_EQ(1, b["y"]->GetData()->Raw()[i]); + EXPECT_EQ(0, b["b"]->GetData()->Raw()[i]); + EXPECT_EQ(1, b["c"]->GetData()->Raw()[i]); EXPECT_EQ(42, slot->Raw()[i]); } - WrapperData* x_slicer = dynamic_cast*>(b["x"]->GetSlicer()); - y_slicer = dynamic_cast*>(b["y"]->GetSlicer()); + + WrapperData* x_slicer = dynamic_cast*>(b["b"]->GetSlicer()); + WrapperData >* c_slicer = dynamic_cast >*>(b["c"]->GetSlicer()); EXPECT_TRUE(x_slicer != nullptr); EXPECT_EQ(10u, x_slicer->Internal()); - EXPECT_TRUE(y_slicer != nullptr); + EXPECT_TRUE(c_slicer != nullptr); int64_t keys1[] = {1, 2, 3, 4, 13, 14}; - EXPECT_EQ(0, y_slicer->Internal().Get(keys1, 3, 2, &y_ids, &y_reused_ids)); + tbb::concurrent_vector y_reused_ids; + size_t filter_count; + EXPECT_EQ(3, y_slicer->Internal()->Get(keys1, 3, false, 1.0, &y_ids, &y_reused_ids, &filter_count)); EXPECT_EQ(3u, y_ids.size()); EXPECT_EQ(3, y_ids[2] + y_ids[1] + y_ids[0]); EXPECT_EQ(0u, y_reused_ids.size()); } + +TEST(CheckpointUtilsTest, CheckpointUtilsDebug) { +} diff --git a/xdl/ps-plus/ps-plus/server/test/server_test.cc b/xdl/ps-plus/ps-plus/server/test/server_test.cc index 61d4fcda..0f58f63f 100644 --- a/xdl/ps-plus/ps-plus/server/test/server_test.cc +++ b/xdl/ps-plus/ps-plus/server/test/server_test.cc @@ -106,9 +106,8 @@ TEST(ServerTest, ServerTest) { VariableInfoCollection vic; st = server.Save(0, "hello", vic); EXPECT_EQ(st, Status::Ok()); - VariableInfoCollection from, to; - st = server.Restore(0, "hello", from, to); + st = server.Restore(0, from, to); EXPECT_EQ(st, Status::Ok()); DenseVarNames dvn; @@ -122,17 +121,18 @@ TEST(ServerTest, ServerTest) { server.GatherStreamingDenseVar(0, dvn2, &dvv); EXPECT_EQ(st, Status::Ok()); - st = server.TriggerStreamingSparse(0); + std::string ver("inc-99"); + st = server.TriggerStreamingSparse(0, 10, ver); EXPECT_NE(st, Status::Ok()); - st = server.TriggerStreamingHash(0); + st = server.TriggerStreamingHash(0, 10, ver); EXPECT_NE(st, Status::Ok()); EXPECT_TRUE(server.RegisterUdfChain(kUnusedVersion, BuildUdfChainRegister()).IsOk()); EXPECT_TRUE(server.RegisterUdfChain(kUnusedVersion, BuildUdfChainRegister()).IsOk()); UdfContext ctx1; EXPECT_TRUE(server.RunUdfChain(kUnusedVersion, 100, "^var", Inputs(), &ctx1).IsOk()); - ctx1.GetStorageManager()->Set("var", []{ return new Variable(new Tensor(DataType::kInt8, TensorShape({4, 8}), new ConstantInitializer(1)), nullptr); }); + ctx1.GetStorageManager()->Set("var", []{ return new Variable(new Tensor(DataType::kInt8, TensorShape({4, 8}), new ConstantInitializer(1)), nullptr, "");}); UdfContext ctx2; EXPECT_TRUE(server.RunUdfChain(kUnusedVersion, 100, "var", Inputs(), &ctx2).IsOk()); UdfContext ctx3; @@ -144,7 +144,6 @@ TEST(ServerTest, ServerTest) { EXPECT_EQ(1u, ctx2.Outputs().size()); EXPECT_EQ(40, dynamic_cast*>(ctx2.Outputs()[0])->Internal()); - } TEST(LocalServerTest, LocalServer) { diff --git a/xdl/ps-plus/ps-plus/server/test/storage_manager_test.cc b/xdl/ps-plus/ps-plus/server/test/storage_manager_test.cc index 7e9860f9..678f5293 100644 --- a/xdl/ps-plus/ps-plus/server/test/storage_manager_test.cc +++ b/xdl/ps-plus/ps-plus/server/test/storage_manager_test.cc @@ -28,9 +28,9 @@ using ps::initializer::ConstantInitializer; TEST(StorageManagerTest, SingleThread) { StorageManager* manager = new StorageManager; Variable* rst = nullptr; - Variable* x = new Variable(new Tensor(DataType::kInt8, TensorShape({4, 8}), new ConstantInitializer(0)), nullptr); - Variable* y = new Variable(new Tensor(DataType::kInt8, TensorShape({4, 8}), new ConstantInitializer(0)), nullptr); - Variable* z = new Variable(new Tensor(DataType::kInt8, TensorShape({4, 8}), new ConstantInitializer(0)), nullptr); + Variable* x = new Variable(new Tensor(DataType::kInt8, TensorShape({4, 8}), new ConstantInitializer(0)), nullptr, ""); + Variable* y = new Variable(new Tensor(DataType::kInt8, TensorShape({4, 8}), new ConstantInitializer(0)), nullptr, ""); + Variable* z = new Variable(new Tensor(DataType::kInt8, TensorShape({4, 8}), new ConstantInitializer(0)), nullptr, ""); EXPECT_FALSE(manager->Get("abc", &rst).IsOk()); EXPECT_TRUE(manager->Set("abc", [x](){return x;}).IsOk()); EXPECT_FALSE(manager->Set("abc", [y](){return y;}).IsOk()); diff --git a/xdl/ps-plus/ps-plus/server/test/variable_test.cc b/xdl/ps-plus/ps-plus/server/test/variable_test.cc index 71ff0af9..195ee21b 100644 --- a/xdl/ps-plus/ps-plus/server/test/variable_test.cc +++ b/xdl/ps-plus/ps-plus/server/test/variable_test.cc @@ -27,7 +27,7 @@ using ps::initializer::ConstantInitializer; using ps::QRWLocker; TEST(VariableTest, Constructor) { - Variable var(new Tensor(DataType::kInt8, TensorShape({4, 8}), new ConstantInitializer(1)), nullptr); + Variable var(new Tensor(DataType::kInt8, TensorShape({4, 8}), new ConstantInitializer(1)), nullptr, ""); EXPECT_EQ(TensorShape({4, 8}), var.GetData()->Shape()); EXPECT_EQ(DataType::kInt8, var.GetData()->Type()); EXPECT_EQ(0x0101010101010101, var.GetData()->Raw()[0]); @@ -37,7 +37,7 @@ TEST(VariableTest, Constructor) { } TEST(VariableTest, Slot) { - Variable var(new Tensor(DataType::kInt8, TensorShape({4, 8}), new ConstantInitializer(1)), nullptr); + Variable var(new Tensor(DataType::kInt8, TensorShape({4, 8}), new ConstantInitializer(1)), nullptr, ""); QRWLocker locker(var.VariableLock(), QRWLocker::kSimpleRead); EXPECT_EQ(TensorShape({4, 8}), var.GetData()->Shape()); EXPECT_EQ(DataType::kInt8, var.GetData()->Type()); @@ -59,3 +59,27 @@ TEST(VariableTest, Slot) { EXPECT_EQ(TensorShape({2, 8}), z->Shape()); EXPECT_EQ(DataType::kInt64, z->Type()); } + +TEST(VariableTest, ClearId) { + Variable var(new Tensor(DataType::kInt8, TensorShape({4, 8}), new ConstantInitializer(1), Tensor::TType::kSegment), nullptr, ""); + EXPECT_EQ(TensorShape({Tensor::DEFAULT_SEGMENT_SIZE, 8}), var.GetData()->Shape()); + EXPECT_EQ(DataType::kInt8, var.GetData()->Type()); + EXPECT_EQ(0x0101010101010101, var.GetData()->Raw()[0]); + EXPECT_EQ(0x0101010101010101, var.GetData()->Raw()[1]); + EXPECT_EQ(0x0101010101010101, var.GetData()->Raw()[2]); + EXPECT_EQ(0x0101010101010101, var.GetData()->Raw()[3]); + var.GetData()->Raw()[0] = 100; + var.GetData()->Raw()[2] = 200; + var.GetData()->Raw()[3] = 300; + EXPECT_EQ(100, var.GetData()->Raw()[0]); + EXPECT_EQ(0x0101010101010101, var.GetData()->Raw()[1]); + EXPECT_EQ(200, var.GetData()->Raw()[2]); + EXPECT_EQ(300, var.GetData()->Raw()[3]); + var.ClearIds(std::vector{0, 2}); + /* + EXPECT_EQ(0x0101010101010101, var.GetData()->Raw()[0]); + EXPECT_EQ(0x0101010101010101, var.GetData()->Raw()[1]); + EXPECT_EQ(0x0101010101010101, var.GetData()->Raw()[2]); + EXPECT_EQ(300, var.GetData()->Raw()[3]); + */ +} diff --git a/xdl/ps-plus/ps-plus/server/udf/adagrad_updater.cc b/xdl/ps-plus/ps-plus/server/udf/adagrad_updater.cc index dac1b1b5..cde9e664 100644 --- a/xdl/ps-plus/ps-plus/server/udf/adagrad_updater.cc +++ b/xdl/ps-plus/ps-plus/server/udf/adagrad_updater.cc @@ -22,49 +22,51 @@ namespace ps { namespace server { namespace udf { -class AdagradUpdater : public SimpleUdf { +using std::vector; + +class AdagradUpdater : public SimpleUdf, vector, vector, vector > { public: virtual Status SimpleRun( UdfContext* ctx, - const Slices& slices, - const Tensor& grad_tensor, - const double& learning_rate_, - const double& initial_accumulator_value_) const { - if (!slices.writable) { - return Status::ArgumentError("slice is not writable"); + const vector& sslices, + const vector& grad_tensors, + const vector& learning_rates, + const vector& initial_accumulator_values) const { + if (sslices.size() != grad_tensors.size() || sslices.size() != learning_rates.size() || sslices.size() != initial_accumulator_values.size()) { + return Status::ArgumentError("AdagradUpdater: slices and other size not match"); } + for (size_t si = 0; si < sslices.size(); si++) { + const Slices& slices = sslices[si]; + if (!slices.writable) { + return Status::ArgumentError("slice is not writable"); + } + double learning_rate = learning_rates[si]; + double initial_accumulator_value = initial_accumulator_values[si]; + Tensor* data_tensor = slices.variable->GetData(); + Tensor* acc_tensor = slices.variable->GetVariableLikeSlot("adagrad_accumulation", data_tensor->Type(), [=]{ return new initializer::ConstantInitializer(initial_accumulator_value); }); + const Tensor& grad_tensor = grad_tensors[si]; + if (grad_tensor.Type() != data_tensor->Type()) { + return Status::ArgumentError("grad should has same datatype with variable"); + } - double learning_rate = learning_rate_; - double initial_accumulator_value = initial_accumulator_value_; - Tensor* data_tensor = slices.variable->GetData(); - Tensor* acc_tensor = slices.variable->GetVariableLikeSlot("accumulation", data_tensor->Type(), [=]{ return new initializer::ConstantInitializer(initial_accumulator_value); }); - - if (grad_tensor.Type() != data_tensor->Type()) { - return Status::ArgumentError("grad should has same datatype with variable"); + CASES(data_tensor->Type(), MultiThreadDo(slices.slice_id.size(), [&](const Range& r) { + for (size_t i = r.begin; i < r.end; i++) { + int64_t slice = slices.slice_id[i]; + if ((int64_t)slice == ps::HashMap::NOT_ADD_ID) { + continue; + } + T* grad = grad_tensor.Raw(i); + T* acc = acc_tensor->Raw(slice); + T* data = data_tensor->Raw(slice); + for (size_t j = 0; j < slices.slice_size; j++) { + *acc += *grad * *grad; + *data -= *grad * learning_rate / sqrt(*acc); + data++;grad++;acc++; + } + } + return Status::Ok(); + })); } - /* - if (grad_tensor.Shape().NumElements() != slices.slice_size * slices.slice_id.size()) { - return Status::ArgumentError("grad should has shape: " + std::to_string(slices.slice_size * slices.slice_id.size())); - } - */ - CASES(data_tensor->Type(), do { - T* data_ptr = data_tensor->Raw(); - T* grad = grad_tensor.Raw(); - T* acc_ptr = acc_tensor->Raw(); - for (size_t slice : slices.slice_id) { - if ((int64_t)slice == ps::HashMap::NOT_ADD_ID) { - grad += slices.slice_size; - continue; - } - T* data = data_ptr + slice * slices.slice_size; - T* acc = acc_ptr + slice * slices.slice_size; - for (size_t i = 0; i < slices.slice_size; i++) { - *acc += *grad * *grad; - *data -= *grad * learning_rate / sqrt(*acc); - data++;grad++;acc++; - } - } - } while(0)); return Status::Ok(); } }; @@ -74,4 +76,3 @@ SIMPLE_UDF_REGISTER(AdagradUpdater, AdagradUpdater); } } } - diff --git a/xdl/ps-plus/ps-plus/server/udf/adam_updater.cc b/xdl/ps-plus/ps-plus/server/udf/adam_updater.cc index 6223b7e3..7fb1c1b7 100644 --- a/xdl/ps-plus/ps-plus/server/udf/adam_updater.cc +++ b/xdl/ps-plus/ps-plus/server/udf/adam_updater.cc @@ -22,77 +22,78 @@ namespace ps { namespace server { namespace udf { -class AdamUpdater : public SimpleUdf { +using std::vector; + +class AdamUpdater : public SimpleUdf, vector, vector, vector, vector, vector, vector > { public: virtual Status SimpleRun( UdfContext* ctx, - const Slices& slices, - const Tensor& grad_tensor, - const double& learning_rate_, - const double& epsilon_, - const double& beta1_, - const double& beta2_, - const bool& lr_decay_) const { - if (!slices.writable) { - return Status::ArgumentError("slice is not writable"); + const vector& sslices, + const vector& grad_tensors, + const vector& learning_rates, + const vector& epsilons, + const vector& beta1s, + const vector& beta2s, + const vector& lr_decays) const { + if (sslices.size() != grad_tensors.size() || sslices.size() != learning_rates.size() || sslices.size() != epsilons.size() + || sslices.size() != beta1s.size() || sslices.size() != beta2s.size() || sslices.size() != lr_decays.size()) { + return Status::ArgumentError("AdamUpdater: slices and other size not match"); } - - double learning_rate = learning_rate_; - double epsilon = epsilon_; - double beta1 = beta1_; - double beta2 = beta2_; - bool lr_decay = lr_decay_; - Tensor* data_tensor = slices.variable->GetData(); - - Tensor* beta1_tensor = slices.variable->GetAnyOneSlot("beta1", DataType::kDouble, ps::TensorShape({}), [&]{ return new initializer::ConstantInitializer(beta1); }); - Tensor* beta2_tensor = slices.variable->GetAnyOneSlot("beta2", DataType::kDouble, ps::TensorShape({}), [&]{ return new initializer::ConstantInitializer(beta2); }); - Tensor* m_tensor = slices.variable->GetVariableLikeSlot("m", DataType::kDouble, []{ return new initializer::ConstantInitializer(0); }); - Tensor* v_tensor = slices.variable->GetVariableLikeSlot("v", DataType::kDouble, []{ return new initializer::ConstantInitializer(0); }); + for (size_t si = 0; si < sslices.size(); si++) { + const Slices& slices = sslices[si]; + if (!slices.writable) { + return Status::ArgumentError("slice is not writable"); + } + double learning_rate = learning_rates[si]; + double epsilon = epsilons[si]; + double beta1 = beta1s[si]; + double beta2 = beta2s[si]; + const Tensor& grad_tensor = grad_tensors[si]; + bool lr_decay = lr_decays[si]; + Tensor* data_tensor = slices.variable->GetData(); + Tensor* beta1_tensor = slices.variable->GetAnyOneSlot("beta1", DataType::kDouble, ps::TensorShape({}), [&]{ return new initializer::ConstantInitializer(beta1); }); + Tensor* beta2_tensor = slices.variable->GetAnyOneSlot("beta2", DataType::kDouble, ps::TensorShape({}), [&]{ return new initializer::ConstantInitializer(beta2); }); + Tensor* m_tensor = slices.variable->GetVariableLikeSlot("m", DataType::kDouble, []{ return new initializer::ConstantInitializer(0); }); + Tensor* v_tensor = slices.variable->GetVariableLikeSlot("v", DataType::kDouble, []{ return new initializer::ConstantInitializer(0); }); - if (grad_tensor.Type() != data_tensor->Type()) { - return Status::ArgumentError("grad should has same datatype with variable"); - } - /* - if (grad_tensor.Shape().NumElements() != slices.slice_size * slices.slice_id.size()) { - return Status::ArgumentError("grad should has shape: " + std::to_string(slices.slice_size * slices.slice_id.size())); - } - */ - CASES(data_tensor->Type(), do { - T* data_ptr = data_tensor->Raw(); - T* grad = grad_tensor.Raw(); - double* beta1_power = beta1_tensor->Raw(); - double* beta2_power = beta2_tensor->Raw(); - double* m_ptr = m_tensor->Raw(); - double* v_ptr = v_tensor->Raw(); - - double alpha; - if (lr_decay) { - alpha = learning_rate * sqrt(1 - *beta2_power) / (1 - *beta1_power); - } else { - alpha = learning_rate; + if (grad_tensor.Type() != data_tensor->Type()) { + return Status::ArgumentError("grad should has same datatype with variable"); } - for (size_t slice : slices.slice_id) { - if ((int64_t)slice == ps::HashMap::NOT_ADD_ID) { - grad += slices.slice_size; - continue; - } - T* data = data_ptr + slice * slices.slice_size; - double* m = m_ptr + slice * slices.slice_size; - double* v = v_ptr + slice * slices.slice_size; - for (size_t i = 0; i < slices.slice_size; i++) { - double grad_d = (double)(*grad); - - *m += (grad_d - *m) * (1 - beta1); - *v += (grad_d * grad_d - *v) * (1 - beta2); - *data -= (alpha * *m) / (sqrt(*v) + epsilon); - data++;grad++;m++;v++; - } - } - *beta1_power *= beta1; - *beta2_power *= beta2; - } while(0)); - return Status::Ok(); + CASES(data_tensor->Type(), do { + double* beta1_power = beta1_tensor->Raw(); + double* beta2_power = beta2_tensor->Raw(); + double alpha; + if (lr_decay) { + alpha = learning_rate * sqrt(1 - *beta2_power) / (1 - *beta1_power); + } else { + alpha = learning_rate; + } + MultiThreadDo(slices.slice_id.size(), [&](const Range& r) { + for (size_t i = r.begin; i < r.end; i++) { + T* grad = grad_tensor.Raw(i); + size_t slice = slices.slice_id[i]; + if ((int64_t)slice == ps::HashMap::NOT_ADD_ID) { + continue; + } + T* data = data_tensor->Raw(slice); + double* m = m_tensor->Raw(slice); + double* v = v_tensor->Raw(slice); + for (size_t j = 0; j < slices.slice_size; j++) { + double grad_d = (double)(*grad); + *m += (grad_d - *m) * (1 - beta1); + *v += (grad_d * grad_d - *v) * (1 - beta2); + *data -= (alpha * *m) / (sqrt(*v) + epsilon); + data++;grad++;m++;v++; + } + } + return Status::Ok(); + }); + *beta1_power *= beta1; + *beta2_power *= beta2; + } while(0)); + } + return Status::Ok(); } }; diff --git a/xdl/ps-plus/ps-plus/server/udf/adaptive_revision_pull_updater.cc b/xdl/ps-plus/ps-plus/server/udf/adaptive_revision_pull_updater.cc index d98bc218..cbcfc359 100644 --- a/xdl/ps-plus/ps-plus/server/udf/adaptive_revision_pull_updater.cc +++ b/xdl/ps-plus/ps-plus/server/udf/adaptive_revision_pull_updater.cc @@ -22,42 +22,46 @@ namespace ps { namespace server { namespace udf { -class AdaptiveRevisionPullUpdater : public SimpleUdf { +using std::vector; + +class AdaptiveRevisionPullUpdater : public SimpleUdf, size_t, size_t> { public: virtual Status SimpleRun( UdfContext* ctx, - const Slices& slices, - const size_t& worker_cnt_, - const size_t& worker_idx_) const { - if (!slices.writable) { - return Status::ArgumentError("slice is not writable"); - } - - size_t worker_cnt = worker_cnt_; - size_t worker_idx = worker_idx_; + const vector& sslices, + const size_t& worker_cnt, + const size_t& worker_idx) const { + for (size_t si = 0; si < sslices.size(); si++) { + const Slices& slices = sslices[si]; + if (!slices.writable) { + return Status::ArgumentError("slice is not writable"); + } - Tensor* data_tensor = slices.variable->GetData(); - Tensor* g_tensor = slices.variable->GetVariableLikeSlot("g", data_tensor->Type(), [=]{ return new initializer::ConstantInitializer(0.0); }); - - std::vector g_worker_dims{worker_cnt}; - const std::vector& var_dims = data_tensor->Shape().Dims(); - g_worker_dims.insert(g_worker_dims.end(), var_dims.begin(), var_dims.end()); - Tensor* g_old_tensor = slices.variable->GetAnyOneSlot("g_old", data_tensor->Type(), ps::TensorShape(g_worker_dims), [=]{ return new initializer::ConstantInitializer(0.0); }); - - CASES(data_tensor->Type(), do { - T* g_base_ptr = g_tensor->Raw(); - T* g_old_base_ptr = g_old_tensor->Raw(); - g_old_base_ptr += worker_idx * data_tensor->Shape().NumElements(); + Tensor* data_tensor = slices.variable->GetData(); + Tensor* g_tensor = slices.variable->GetVariableLikeSlot("g", data_tensor->Type(), [=]{ return new initializer::ConstantInitializer(0.0); }); + std::vector g_worker_dims{worker_cnt}; + const std::vector var_dims = data_tensor->Shape().Dims(); + g_worker_dims.insert(g_worker_dims.end(), var_dims.begin(), var_dims.end()); + Tensor* g_old_tensor = slices.variable->GetAnyOneSlot("g_old", data_tensor->Type(), ps::TensorShape(g_worker_dims), [=]{ return new initializer::ConstantInitializer(0.0); }); + + CASES(data_tensor->Type(), do { + T* g_old_base_ptr = g_old_tensor->Raw(); + g_old_base_ptr += worker_idx * data_tensor->Shape().NumElements(); + MultiThreadDo(slices.slice_id.size(), [&](const Range& r) { + for (size_t i = r.begin; i < r.end; i++) { + int64_t slice = slices.slice_id[i]; + if ((int64_t)slice == ps::HashMap::NOT_ADD_ID) { + continue; + } - for (auto slice : slices.slice_id) { - if ((int64_t)slice == ps::HashMap::NOT_ADD_ID) { - continue; - } - T* g = g_base_ptr + slice * slices.slice_size; - T* g_old = g_old_base_ptr + slice * slices.slice_size; - memcpy(g_old, g, slices.slice_size * sizeof(T)); - } - } while(0)); + T* g = g_tensor->Raw(slice); + T* g_old = g_old_base_ptr + slice * slices.slice_size; + memcpy(g_old, g, slices.slice_size * sizeof(T)); + } + return Status::Ok(); + }); + } while(0)); + } return Status::Ok(); } }; diff --git a/xdl/ps-plus/ps-plus/server/udf/adaptive_revision_updater.cc b/xdl/ps-plus/ps-plus/server/udf/adaptive_revision_updater.cc index d9f381a9..25fae838 100644 --- a/xdl/ps-plus/ps-plus/server/udf/adaptive_revision_updater.cc +++ b/xdl/ps-plus/ps-plus/server/udf/adaptive_revision_updater.cc @@ -22,119 +22,113 @@ namespace ps { namespace server { namespace udf { -class AdaptiveRevisionUpdater : public SimpleUdf { +using std::vector; + +class AdaptiveRevisionUpdater : public SimpleUdf, vector, vector, vector, vector, size_t, size_t> { public: virtual Status SimpleRun( UdfContext* ctx, - const Slices& slices, - const Tensor& grad_tensor, - const double& learning_rate_, - const double& initial_accumulator_value_, - const double& max_revision_ratio_, - const size_t& worker_cnt_, - const size_t& worker_idx_) const { - if (!slices.writable) { - return Status::ArgumentError("slice is not writable"); - } - - double learning_rate = learning_rate_; - double initial_accumulator_value = initial_accumulator_value_; - double max_revision_ratio = max_revision_ratio_; - size_t worker_cnt = worker_cnt_; - size_t worker_idx = worker_idx_; - - Tensor* data_tensor = slices.variable->GetData(); - Tensor* g_tensor = slices.variable->GetVariableLikeSlot("g", data_tensor->Type(), [=]{ return new initializer::ConstantInitializer(0.0); }); - - std::vector g_worker_dims{worker_cnt}; - const std::vector& var_dims = data_tensor->Shape().Dims(); - g_worker_dims.insert(g_worker_dims.end(), var_dims.begin(), var_dims.end()); - Tensor* g_old_tensor = slices.variable->GetAnyOneSlot("g_old", data_tensor->Type(), ps::TensorShape(g_worker_dims), [=]{ return new initializer::ConstantInitializer(0.0); }); - - Tensor* z_tensor = slices.variable->GetVariableLikeSlot("z", data_tensor->Type(), [=]{ return new initializer::ConstantInitializer(initial_accumulator_value); }); - Tensor* z2_tensor = slices.variable->GetVariableLikeSlot("z2", data_tensor->Type(), [=]{ return new initializer::ConstantInitializer(initial_accumulator_value); }); - - if (grad_tensor.Type() != data_tensor->Type()) { - return Status::ArgumentError("grad should has same datatype with variable"); + const vector& sslices, + const vector& grad_tensors, + const vector& learning_rates, + const vector& initial_accumulator_values, + const vector& max_revision_ratios, + const size_t& worker_cnt, + const size_t& worker_idx) const { + if (sslices.size() != grad_tensors.size() || sslices.size() != learning_rates.size() || sslices.size() != initial_accumulator_values.size() || sslices.size() != max_revision_ratios.size()) { + return Status::ArgumentError("AdaptiveRevisionUpdater: slices and other size not match"); } - /* - if (grad_tensor.Shape().NumElements() != slices.slice_size * slices.slice_id.size()) { - return Status::ArgumentError("grad should has shape: " + std::to_string(slices.slice_size * slices.slice_id.size())); - } - */ - CASES(data_tensor->Type(), do { - T* data_ptr = data_tensor->Raw(); - T* g_base_ptr = g_tensor->Raw(); - T* g_old_base_ptr = g_old_tensor->Raw(); - g_old_base_ptr += worker_idx * data_tensor->Shape().NumElements(); - T* z_base_ptr = z_tensor->Raw(); - T* z2_base_ptr = z2_tensor->Raw(); - T* grad = grad_tensor.Raw(); - - size_t num_vals = 0; - for (size_t i = 0; i < slices.slice_id.size(); ++i) { - num_vals += slices.slice_size; - } - T* delta2_base = new T[num_vals]; - T* delta2 = delta2_base; - T delta1_sum = 0.0; - T delta2_sum = 0.0; - - for (size_t slice : slices.slice_id) { - if ((int64_t)slice == ps::HashMap::NOT_ADD_ID) { - continue; - } - T* data = data_ptr + slice * slices.slice_size; - T* g = g_base_ptr + slice * slices.slice_size; - T* g_old = g_old_base_ptr + slice * slices.slice_size; - T* z = z_base_ptr + slice * slices.slice_size; - T* z2 = z2_base_ptr + slice * slices.slice_size; - - for (size_t i = 0; i < slices.slice_size; ++i) { - T g_bck = *g - *g_old; - T lr_old = learning_rate / sqrt(*z2); - T z_delta = *grad * *grad + 2 * *grad * g_bck; - T z_new = *z + z_delta; - T z2_new = fmax(z_new, *z2); - T z2_delta = z2_new - *z2; - T lr = learning_rate / sqrt(z2_new); - T delta1 = - lr * *grad; - *delta2 = (lr_old - lr) * g_bck; - delta1_sum += delta1 * delta1; - delta2_sum += *delta2 * *delta2; - - *data += delta1; - *g += *grad; - *z += z_delta; - *z2 += z2_delta; - - data++; g++; g_old++; z++; z2++; delta2++; grad++; - } + for (size_t si = 0; si < sslices.size(); si++) { + const Slices& slices = sslices[si]; + if (!slices.writable) { + return Status::ArgumentError("slice is not writable"); } - // Stabilize the initial revision process. - T delta1_dot = sqrt(delta1_sum); - T delta2_dot = sqrt(delta2_sum); - T delta_ratio = delta2_dot / delta1_dot; - if (delta_ratio > max_revision_ratio) { - for (size_t i = 0; i < num_vals; ++i) { - delta2_base[i] = delta2_base[i] * max_revision_ratio / delta_ratio; - } + double learning_rate = learning_rates[si]; + double initial_accumulator_value = initial_accumulator_values[si]; + double max_revision_ratio = max_revision_ratios[si]; + Tensor* data_tensor = slices.variable->GetData(); + Tensor* g_tensor = slices.variable->GetVariableLikeSlot("g", data_tensor->Type(), [=]{ return new initializer::ConstantInitializer(0.0); }); + std::vector g_worker_dims{worker_cnt}; + const std::vector& var_dims = data_tensor->Shape().Dims(); + g_worker_dims.insert(g_worker_dims.end(), var_dims.begin(), var_dims.end()); + Tensor* g_old_tensor = slices.variable->GetAnyOneSlot("g_old", data_tensor->Type(), ps::TensorShape(g_worker_dims), [=]{ return new initializer::ConstantInitializer(0.0); }); + Tensor* z_tensor = slices.variable->GetVariableLikeSlot("z", data_tensor->Type(), [=]{ return new initializer::ConstantInitializer(initial_accumulator_value); }); + Tensor* z2_tensor = slices.variable->GetVariableLikeSlot("z2", data_tensor->Type(), [=]{ return new initializer::ConstantInitializer(initial_accumulator_value); }); + const Tensor& grad_tensor = grad_tensors[si]; + if (grad_tensor.Type() != data_tensor->Type()) { + return Status::ArgumentError("grad should has same datatype with variable"); } - delta2 = delta2_base; - for (size_t slice : slices.slice_id) { - T* data = data_ptr + slice * slices.slice_size; - for (size_t i = 0; i < slices.slice_size; ++i) { - *data += *delta2; - data++; - delta2++; - } - } - - delete[] delta2_base; - } while(0)); + size_t num_vals = slices.slice_id.size() * slices.slice_size; + CASES(data_tensor->Type(), do { + T* delta2_base = new T[num_vals]; + T* g_old_base_ptr = g_old_tensor->Raw(); + g_old_base_ptr += worker_idx * data_tensor->Shape().NumElements(); + T* delta2 = delta2_base; + T delta1_sum = 0.0; + T delta2_sum = 0.0; + MultiThreadDo(slices.slice_id.size(), [&](const Range& r) { + for (size_t i = r.begin; i < r.end; i++) { + int64_t slice = slices.slice_id[i]; + if ((int64_t)slice == ps::HashMap::NOT_ADD_ID) { + continue; + } + + T* data = data_tensor->Raw(slice); + T* g = g_tensor->Raw(slice); + T* g_old = g_old_base_ptr + slice * slices.slice_size; + + T* z = z_tensor->Raw(slice); + T* z2 = z2_tensor->Raw(slice); + T* grad = grad_tensor.Raw(i); + + for (size_t j = 0; j < slices.slice_size; ++j) { + T g_bck = *g - *g_old; + T lr_old = learning_rate / sqrt(*z2); + T z_delta = *grad * *grad + 2 * *grad * g_bck; + T z_new = *z + z_delta; + T z2_new = fmax(z_new, *z2); + T z2_delta = z2_new - *z2; + T lr = learning_rate / sqrt(z2_new); + T delta1 = - lr * *grad; + *delta2 = (lr_old - lr) * g_bck; + delta1_sum += delta1 * delta1; + delta2_sum += *delta2 * *delta2; + *data += delta1; + *g += *grad; + *z += z_delta; + *z2 += z2_delta; + data++; g++; g_old++; z++; z2++; delta2++; grad++; + } + } + return Status::Ok(); + }); + // Stabilize the initial revision process. + T delta1_dot = sqrt(delta1_sum); + T delta2_dot = sqrt(delta2_sum); + T delta_ratio = delta2_dot / delta1_dot; + if (delta_ratio > max_revision_ratio) { + for (size_t i = 0; i < num_vals; ++i) { + delta2_base[i] = delta2_base[i] * max_revision_ratio / delta_ratio; + } + } + + delta2 = delta2_base; + for (size_t slice : slices.slice_id) { + if ((int64_t)slice == ps::HashMap::NOT_ADD_ID) { + continue; + } + T* data = data_tensor->Raw(slice); + for (size_t i = 0; i < slices.slice_size; ++i) { + *data += *delta2; + data++;delta2++; + } + } + delete[] delta2_base; + } while(0)); + } return Status::Ok(); - } + } }; SIMPLE_UDF_REGISTER(AdaptiveRevisionUpdater, AdaptiveRevisionUpdater); diff --git a/xdl/ps-plus/ps-plus/server/udf/aggregate_slice.cc b/xdl/ps-plus/ps-plus/server/udf/aggregate_slice.cc index 49c63bf0..ed9360eb 100644 --- a/xdl/ps-plus/ps-plus/server/udf/aggregate_slice.cc +++ b/xdl/ps-plus/ps-plus/server/udf/aggregate_slice.cc @@ -18,6 +18,8 @@ limitations under the License. #include "ps-plus/server/slice.h" #include "ps-plus/common/hashmap.h" #include "ps-plus/server/streaming_model_utils.h" +#include "ps-plus/common/logging.h" +#include "ps-plus/common/thread_pool.h" #include #include @@ -25,95 +27,130 @@ namespace ps { namespace server { namespace udf { -class AggregateSlice : public SimpleUdf { +using std::vector; + +class AggregateSlice : public SimpleUdf, int64_t, int, vector, vector*, vector*> { public: - virtual Status SimpleRun(UdfContext* ctx, const Slices& input_slices, const int64_t& token, const int& worker_count, const Tensor& input_grad, Slices* output_slices, Tensor* output_grad) const { - std::vector grads = {}; - std::vector slices = {}; - Tensor tensor_cp(input_grad.Type(), input_grad.Shape(), new ps::initializer::ConstantInitializer(0.0), false); - QuickMemcpy(tensor_cp.Raw(), input_grad.Raw(), SizeOfType(input_grad.Type()) * input_grad.Shape().NumElements()); - std::string variable_name = ctx->GetVariableName(); - lock_.lock(); - if (current_tokens[variable_name] != token) { - current_tokens[variable_name] = token; - grads_map[variable_name] = {}; - slices_map[variable_name] = {}; - } - - grads_map[variable_name].push_back(tensor_cp); - slices_map[variable_name].push_back(input_slices); - if (grads_map[variable_name].size() == (size_t) worker_count) { - grads = grads_map[variable_name]; - slices = slices_map[variable_name]; - grads_map[variable_name] = {}; - slices_map[variable_name] = {}; - } - lock_.unlock(); - - std::map id_count; - for (const Slices& cur_slices: slices) { - for (size_t id : cur_slices.slice_id) { - auto iter = id_count.find(id); - if (iter == id_count.end()) { - id_count[id] = 1; - } else { - iter->second++; - } - } - } - std::unordered_map id_position; - size_t base_index = 0; - for (auto iter = id_count.begin(); iter != id_count.end(); ++iter) { - id_position[iter->first] = base_index++; - } - size_t total_id = id_count.size(); - TensorShape new_shape = input_grad.Shape(); - if (new_shape.Size() > 1 && input_slices.dim_part != -1) { - new_shape.Set(0, total_id); - } - *output_grad = Tensor(input_grad.Type(), new_shape, new ps::initializer::ConstantInitializer(0.0), true); - for (size_t i = 0; i < grads.size(); i++) { - const Slices& cur_slices = slices[i]; - const Tensor& cur_grad = grads[i]; - CASES(input_grad.Type(), do { - T* grad = cur_grad.Raw(); - T* out = output_grad->Raw(); - for (size_t j = 0; j < cur_slices.slice_id.size(); j++) { - size_t index = id_position[(cur_slices.slice_id[j])]; - T* p = out + index * cur_slices.slice_size; - for (size_t k = 0; k < cur_slices.slice_size; k++) { - *p += *grad; - ++p;++grad; - } - } - } while(0)); - } - - output_slices->writable = input_slices.writable; - output_slices->variable = input_slices.variable; - output_slices->dim_part = input_slices.dim_part; - output_slices->slice_size = input_slices.slice_size; - CASES(input_grad.Type(), do { - T* out = output_grad->Raw(); - for (auto iter = id_count.begin(); iter != id_count.end(); ++iter) { - output_slices->slice_id.push_back(iter->first); - for (size_t i = 0; i < input_slices.slice_size; i++) { - *out++ /= (T)iter->second; - } - } - } while(0)); - return Status::Ok(); - } + virtual Status SimpleRun(UdfContext* ctx, const vector& sslices, const int64_t& token, const int& worker_count, const vector& input_grads, vector* output_slices, vector* output_grads) const { + if (sslices.size() != input_grads.size()) { + return Status::ArgumentError("AggregateSlice: slices and other size not match"); + } + + //for dense and sparse, token_name and variable_name are same, but for hash variable, token_name is fake. + const std::string& token_name = ctx->GetVariableName(); + lock_.lock(); + if (current_tokens[token_name].first != token) { + if (current_tokens[token_name].second != worker_count) { + LOG(WARNING) << "AggregateSlice: receive wrong token [" << token << "] current token[" << current_tokens[token_name].first << "]"; + } + current_tokens[token_name] = std::make_pair(token, 0); + for (size_t si = 0; si < sslices.size(); si++) { + const Slices& input_slices = sslices[si]; + std::string variable_name = input_slices.variable->GetName(); + grads_map[variable_name] = {}; + slices_map[variable_name] = {}; + } + } + current_tokens[token_name].second += 1; + lock_.unlock(); + + output_slices->resize(sslices.size()); + output_grads->resize(sslices.size()); + for (size_t si = 0; si < sslices.size(); si++) { + const Tensor& input_grad = input_grads[si]; + const Slices& input_slices = sslices[si]; + const std::string& variable_name = input_slices.variable->GetName(); + + lock_.lock(); + + std::vector grads; + std::vector slices; + + grads_map[variable_name].push_back(input_grad.Clone()); + slices_map[variable_name].push_back(input_slices); + if (current_tokens[token_name].second == worker_count) { + grads = std::move(grads_map[variable_name]); + slices = std::move(slices_map[variable_name]); + grads_map[variable_name] = {}; + slices_map[variable_name] = {}; + } + lock_.unlock(); + + (*output_slices)[si].writable = input_slices.writable; + (*output_slices)[si].variable = input_slices.variable; + (*output_slices)[si].dim_part = input_slices.dim_part; + (*output_slices)[si].slice_size = input_slices.slice_size; + if (grads.size() == 0) { + (*output_grads)[si] = Tensor(input_grad.Type(), TensorShape({}), new ps::initializer::ConstantInitializer(0.0)); + continue; + } + HashMap* id_position = new HashMapImpl(100); + tbb::concurrent_vector no_use; + MultiThreadDoTBB(slices.size(), [&](const Range& r) { + for (size_t i = r.begin; i < r.end; i++) { + const Slices& cur_slices = slices[i]; + std::vector position; + size_t filter_count; + size_t ret = id_position->Get((int64_t*)&cur_slices.slice_id[0], cur_slices.slice_id.size(), false, 1.0, &position, &no_use, &filter_count); + } + return Status::Ok();}); + size_t ids_size = id_position->GetSize(); + // empty slices + if (ids_size == 0) { + (*output_grads)[si] = Tensor(input_grad.Type(), TensorShape({}), new ps::initializer::ConstantInitializer(0.0)); + continue; + } + TensorShape output_shape = input_grad.Shape(); + if (output_shape.Size() > 1 && input_slices.dim_part != -1) { + output_shape.Set(0, ids_size); + } + Tensor output_grad(input_grad.Type(), output_shape, new ps::initializer::ConstantInitializer(0.0)); + (*output_slices)[si].slice_id.resize(ids_size); + for (size_t i = 0; i < grads.size(); i++) { + const Slices& cur_slices = slices[i]; + const Tensor& cur_grad = grads[i]; + CASES(input_grad.Type(), do { + std::vector position; + size_t filter_count; + id_position->Get((int64_t*)&cur_slices.slice_id[0], cur_slices.slice_id.size(), true, 0.0, &position, &no_use, &filter_count); + MultiThreadDoTBB(cur_slices.slice_id.size(), [&](const Range& r) { + for (size_t j = r.begin; j < r.end; j++) { + T* o = output_grad.Raw(position[j]); + T* i = cur_grad.Raw(j); + for (size_t k = 0; k < cur_slices.slice_size; k++) { + *o++ += *i++; + } + (*output_slices)[si].slice_id[position[j]] = cur_slices.slice_id[j]; + } + return Status::Ok(); + }); + } while(0)); + } + + CASES(input_grad.Type(), MultiThreadDoTBB(ids_size, [&](const Range& r) { + for (size_t i = r.begin; i < r.end; i++) { + T* out = output_grad.Raw(i); + for (size_t j = 0; j < input_slices.slice_size; j++) { + *out++ /= worker_count; + } + } + return Status::Ok();})); + (*output_grads)[si] = std::move(output_grad); + delete id_position; + } + return Status::Ok(); + } private: - static std::mutex lock_; - static std::map> slices_map; - static std::map> grads_map; - static std::map current_tokens; + static std::mutex lock_; + static std::map> slices_map; + static std::map> grads_map; + //map> + static std::map > current_tokens; }; std::map> AggregateSlice::slices_map; std::map> AggregateSlice::grads_map; -std::map AggregateSlice::current_tokens; +std::map > AggregateSlice::current_tokens; std::mutex AggregateSlice::lock_; SIMPLE_UDF_REGISTER(AggregateSlice, AggregateSlice); diff --git a/xdl/ps-plus/ps-plus/server/udf/assign_add_updater.cc b/xdl/ps-plus/ps-plus/server/udf/assign_add_updater.cc index 62011863..88ec0568 100644 --- a/xdl/ps-plus/ps-plus/server/udf/assign_add_updater.cc +++ b/xdl/ps-plus/ps-plus/server/udf/assign_add_updater.cc @@ -22,40 +22,43 @@ namespace ps { namespace server { namespace udf { -class AssignAddUpdater : public SimpleUdf { +using std::vector; + +class AssignAddUpdater : public SimpleUdf, vector > { public: virtual Status SimpleRun( UdfContext* ctx, - const Slices& slices, - const Tensor& grad_tensor) const { - if (!slices.writable) { - return Status::ArgumentError("slice is not writable"); + const vector& sslices, + const vector& grad_tensors) const { + if (sslices.size() != grad_tensors.size()) { + return Status::ArgumentError("AssignAddUpdater: slices and other size not match"); } + for (size_t si = 0; si < sslices.size(); si++) { + const Slices& slices = sslices[si]; + if (!slices.writable) { + return Status::ArgumentError("slice is not writable"); + } + Tensor* data_tensor = slices.variable->GetData(); + const Tensor& grad_tensor = grad_tensors[si]; + if (grad_tensor.Type() != data_tensor->Type()) { + return Status::ArgumentError("grad should has same datatype with variable"); + } - Tensor* data_tensor = slices.variable->GetData(); - if (grad_tensor.Type() != data_tensor->Type()) { - return Status::ArgumentError("grad should has same datatype with variable"); + CASES(data_tensor->Type(), MultiThreadDo(slices.slice_id.size(), [&](const Range& r) { + for (size_t i = r.begin; i < r.end; i++) { + int64_t slice = slices.slice_id[i]; + if ((int64_t)slice == ps::HashMap::NOT_ADD_ID) { + continue; + } + T* grad = grad_tensor.Raw(i); + T* data = data_tensor->Raw(slice); + for (size_t j = 0; j < slices.slice_size; j++) { + *data += *grad; + data++;grad++; + } + } + return Status::Ok();})); } - /* - if (grad_tensor.Shape().NumElements() != slices.slice_size * slices.slice_id.size()) { - return Status::ArgumentError("grad should has shape: " + std::to_string(slices.slice_size * slices.slice_id.size())); - } - */ - CASES(data_tensor->Type(), do { - T* data_ptr = data_tensor->Raw(); - T* grad = grad_tensor.Raw(); - for (size_t slice : slices.slice_id) { - if ((int64_t)slice == ps::HashMap::NOT_ADD_ID) { - grad += slices.slice_size; - continue; - } - T* data = data_ptr + slice * slices.slice_size; - for (size_t i = 0; i < slices.slice_size; i++) { - *data += *grad; - data++;grad++; - } - } - } while(0)); return Status::Ok(); } }; diff --git a/xdl/ps-plus/ps-plus/server/udf/assign_sub_updater.cc b/xdl/ps-plus/ps-plus/server/udf/assign_sub_updater.cc index c6d98d50..b2c4c8a0 100644 --- a/xdl/ps-plus/ps-plus/server/udf/assign_sub_updater.cc +++ b/xdl/ps-plus/ps-plus/server/udf/assign_sub_updater.cc @@ -22,40 +22,43 @@ namespace ps { namespace server { namespace udf { -class AssignSubUpdater : public SimpleUdf { +using std::vector; + +class AssignSubUpdater : public SimpleUdf, vector > { public: virtual Status SimpleRun( UdfContext* ctx, - const Slices& slices, - const Tensor& grad_tensor) const { - if (!slices.writable) { - return Status::ArgumentError("slice is not writable"); + const vector& sslices, + const vector& grad_tensors) const { + if (sslices.size() != grad_tensors.size()) { + return Status::ArgumentError("AssignSubUpdater: slices and other size not match"); } + for (size_t si = 0; si < sslices.size(); si++) { + const Slices& slices = sslices[si]; + if (!slices.writable) { + return Status::ArgumentError("slice is not writable"); + } + Tensor* data_tensor = slices.variable->GetData(); + const Tensor& grad_tensor = grad_tensors[si]; + if (grad_tensor.Type() != data_tensor->Type()) { + return Status::ArgumentError("grad should has same datatype with variable"); + } - Tensor* data_tensor = slices.variable->GetData(); - if (grad_tensor.Type() != data_tensor->Type()) { - return Status::ArgumentError("grad should has same datatype with variable"); + CASES(data_tensor->Type(), MultiThreadDo(slices.slice_id.size(), [&](const Range& r) { + for (size_t i = r.begin; i < r.end; i++) { + int64_t slice = slices.slice_id[i]; + if ((int64_t)slice == ps::HashMap::NOT_ADD_ID) { + continue; + } + T* grad = grad_tensor.Raw(i); + T* data = data_tensor->Raw(slice); + for (size_t j = 0; j < slices.slice_size; j++) { + *data -= *grad; + data++;grad++; + } + } + return Status::Ok();})); } - /* - if (grad_tensor.Shape().NumElements() != slices.slice_size * slices.slice_id.size()) { - return Status::ArgumentError("grad should has shape: " + std::to_string(slices.slice_size * slices.slice_id.size())); - } - */ - CASES(data_tensor->Type(), do { - T* data_ptr = data_tensor->Raw(); - T* grad = grad_tensor.Raw(); - for (size_t slice : slices.slice_id) { - if ((int64_t)slice == ps::HashMap::NOT_ADD_ID) { - grad += slices.slice_size; - continue; - } - T* data = data_ptr + slice * slices.slice_size; - for (size_t i = 0; i < slices.slice_size; i++) { - *data -= *grad; - data++;grad++; - } - } - } while(0)); return Status::Ok(); } }; diff --git a/xdl/ps-plus/ps-plus/server/udf/assign_updater.cc b/xdl/ps-plus/ps-plus/server/udf/assign_updater.cc index b8010a1d..ba4c4c1a 100644 --- a/xdl/ps-plus/ps-plus/server/udf/assign_updater.cc +++ b/xdl/ps-plus/ps-plus/server/udf/assign_updater.cc @@ -16,42 +16,48 @@ limitations under the License. #include "ps-plus/server/udf/simple_udf.h" #include "ps-plus/server/slice.h" #include "ps-plus/common/initializer/constant_initializer.h" +#include "ps-plus/common/logging.h" #include "ps-plus/common/hashmap.h" namespace ps { namespace server { namespace udf { -class AssignUpdater : public SimpleUdf { +using std::vector; + +class AssignUpdater : public SimpleUdf, vector > { public: virtual Status SimpleRun( UdfContext* ctx, - const Slices& slices, - const Tensor& grad_tensor) const { - if (!slices.writable) { - return Status::ArgumentError("slice is not writable"); - } - Tensor* data_tensor = slices.variable->GetData(); - if (grad_tensor.Type() != data_tensor->Type()) { - return Status::ArgumentError("grad should has same datatype with variable"); - } - /* - if (grad_tensor.Shape().NumElements() != slices.slice_size * slices.slice_id.size()) { - return Status::ArgumentError("grad should has shape: " + std::to_string(slices.slice_size * slices.slice_id.size())); + const vector& sslices, + const vector& grad_tensors) const { + if (sslices.size() != grad_tensors.size()) { + return Status::ArgumentError("AssignAddUpdater: slices and other size not match"); } - */ - CASES(data_tensor->Type(), do { - T* data_ptr = data_tensor->Raw(); - T* grad = grad_tensor.Raw(); - for (size_t slice : slices.slice_id) { - T* data = data_ptr + slice * slices.slice_size; - if ((int64_t)slice != ps::HashMap::NOT_ADD_ID) { - memcpy((void*)data, (void*)grad, sizeof(T) * slices.slice_size); - } - grad += slices.slice_size; + for (size_t si = 0; si < sslices.size(); si++) { + const Slices& slices = sslices[si]; + if (!slices.writable) { + return Status::ArgumentError("slice is not writable"); } - } while(0)); - return Status::Ok(); + Tensor* data_tensor = slices.variable->GetData(); + const Tensor& grad_tensor = grad_tensors[si]; + if (grad_tensor.Type() != data_tensor->Type()) { + return Status::ArgumentError("grad should has same datatype with variable"); + } + CASES(data_tensor->Type(), MultiThreadDo(slices.slice_id.size(), [&](const Range& r) { + for (size_t i = r.begin; i < r.end; i++) { + int64_t slice = slices.slice_id[i]; + if ((int64_t)slice == ps::HashMap::NOT_ADD_ID) { + continue; + } + T* grad = grad_tensor.Raw(i); + T* data = data_tensor->Raw(slice); + memcpy((void*)data, (void*)grad, sizeof(T) * slices.slice_size); + } + return Status::Ok(); + })); + } + return Status::Ok();; } }; diff --git a/xdl/ps-plus/ps-plus/server/udf/build_dense_slice.cc b/xdl/ps-plus/ps-plus/server/udf/build_dense_slice.cc index 47b40ec8..771a0c13 100644 --- a/xdl/ps-plus/ps-plus/server/udf/build_dense_slice.cc +++ b/xdl/ps-plus/ps-plus/server/udf/build_dense_slice.cc @@ -21,20 +21,23 @@ namespace ps { namespace server { namespace udf { -class BuildDenseSlice : public SimpleUdf { +class BuildDenseSlice : public SimpleUdf*> { public: - virtual Status SimpleRun(UdfContext* ctx, const bool& writable, Slices* result) const { + virtual Status SimpleRun(UdfContext* ctx, const bool& writable, std::vector* result) const { Variable* variable = GetVariable(ctx); if (variable == nullptr) { return Status::ArgumentError("BuildDenseSlice: Variable should not be empty"); } - result->writable = writable; - result->variable = variable; - result->dim_part = -1; - result->slice_size = variable->GetData()->Shape().NumElements(); - result->slice_id.push_back(0); - - if (writable && !ctx->GetStreamingModelArgs()->streaming_dense_model_addr.empty()) { + Slices slices; + slices.writable = writable; + slices.variable = variable; + slices.dim_part = -1; + slices.slice_size = variable->GetData()->Shape().NumElements(); + slices.slice_id.push_back(0); + result->push_back(slices); + + //TODO write dense + if (writable && ctx->GetStreamingModelArgs() != NULL && !ctx->GetStreamingModelArgs()->streaming_dense_model_addr.empty()) { PS_CHECK_STATUS(StreamingModelUtils::WriteDense(ctx->GetVariableName())); } diff --git a/xdl/ps-plus/ps-plus/server/udf/build_hash_slice.cc b/xdl/ps-plus/ps-plus/server/udf/build_hash_slice.cc index 7522a7ed..f33c8c3d 100644 --- a/xdl/ps-plus/ps-plus/server/udf/build_hash_slice.cc +++ b/xdl/ps-plus/ps-plus/server/udf/build_hash_slice.cc @@ -17,66 +17,63 @@ limitations under the License. #include "ps-plus/server/slice.h" #include "ps-plus/common/hashmap.h" #include "ps-plus/server/streaming_model_utils.h" +#include "ps-plus/common/string_utils.h" +#include "ps-plus/common/logging.h" #include namespace ps { namespace server { namespace udf { -class BuildHashSlice : public SimpleUdf { +class BuildHashSlice : public SimpleUdf, std::vector, std::vector, bool, bool, std::vector*> { public: - virtual Status SimpleRun(UdfContext* ctx, const Tensor& ids, const bool& writable, const double& add_probability, Slices* result) const { - Variable* variable = GetVariable(ctx); - if (variable == nullptr) { - return Status::ArgumentError("BuildHashSlice: Variable should not be empty"); + virtual Status SimpleRun(UdfContext* ctx, const std::vector& ids, const std::vector& tensor_names, const std::vector& save_ratios, const bool& writable, const bool& insert, std::vector* result) const { + static size_t step = 0; + size_t current_step = step++; + if (ids.size() != tensor_names.size()) { + return Status::ArgumentError("BuildHashSlice: ids and tensor_names can't match"); } - if (variable->GetData()->Shape().IsScalar()) { - return Status::ArgumentError("BuildHashSlice: Variable should not be Scalar"); - } - if (ids.Shape().Size() != 2 || ids.Shape()[1] != 2 || ids.Type() != DataType::kInt64) { - return Status::ArgumentError("BuildHashSlice: Id should be [?:2] and dtype should be int64"); - } - WrapperData* hashmap = dynamic_cast*>(variable->GetSlicer()); - if (hashmap == nullptr) { - return Status::ArgumentError("BuildHashSlice: Variable Should be a Hash Variable"); - } - - result->writable = writable; - result->variable = variable; - result->dim_part = 1; - result->slice_size = variable->GetData()->Shape().NumElements() / variable->GetData()->Shape()[0]; - - std::vector raw_ids, reused_ids; - hashmap->Internal().GetWithAddProbability(ids.Raw(), ids.Shape()[0], 2, add_probability, &raw_ids, &reused_ids); - std::vector raw_reused_ids; - for (int64_t id : reused_ids) { - raw_reused_ids.push_back(id); - } - variable->ClearIds(raw_reused_ids); - size_t max = 0; - result->slice_id.reserve(raw_ids.size()); - for (int64_t id : raw_ids) { - result->slice_id.push_back(id); - if (id > 0) { - max = std::max(max, (size_t)id); + StorageManager* manager = ctx->GetStorageManager(); + result->resize(ids.size()); + size_t total_id = 0; + for (size_t si = 0; si < ids.size(); si++) { + const Tensor& id = ids[si]; + Variable* variable; + PS_CHECK_STATUS(manager->Get(tensor_names[si], &variable)); + if (id.Type() != DataType::kInt64) { + return Status::ArgumentError("BuildHashSlice: dtype should be int64 for " + tensor_names[si]); } - } - if (max >= variable->GetData()->Shape()[0]) { - ctx->GetLocker()->ChangeType(QRWLocker::kWrite); - if (max >= variable->GetData()->Shape()[0]) { - TensorShape shape = variable->GetData()->Shape(); - size_t x = shape[0]; - while (x <= max) { - x *= 2; + std::unique_ptr& hashmap = (dynamic_cast >*>(variable->GetSlicer()))->Internal(); + if (hashmap == nullptr) { + return Status::ArgumentError("BuildHashSlice: Variable Should be a Hash Variable for " + tensor_names[si]); + } + QRWLocker locker(variable->VariableLock(), QRWLocker::kSimpleRead); + Slices& element = (*result)[si]; + tbb::concurrent_vector reused_ids; + size_t total_filtered_count = 0; + int64_t max_id = hashmap->Get(id.Raw(), id.Shape()[0], !insert, save_ratios[si], &element.slice_id, &reused_ids, &total_filtered_count); + if (!insert && (current_step % 200 == 0) && total_filtered_count != 0) { + LOG(INFO) << "Step " << current_step/2 << ", variable[" << tensor_names[si] << "], filtered keys [" << total_filtered_count << "], hashmap size [" << hashmap->GetSize() << "]"; + } + if (max_id > 0) { + PS_CHECK_STATUS(variable->ReShapeId(max_id)); + } + if (reused_ids.size() != 0) { + std::vector raw_reused_ids; + for (auto iter : reused_ids) { + raw_reused_ids.push_back(iter); } - PS_CHECK_STATUS(variable->ReShapeId(x)); + variable->ClearIds(raw_reused_ids); + } + ps::TensorShape shape = variable->GetData()->Shape(); + element.slice_size = shape.NumElements() / shape[0]; + element.writable = writable; + element.variable = variable; + element.dim_part = 1; + if (writable && ctx->GetStreamingModelArgs() != NULL && !ctx->GetStreamingModelArgs()->streaming_hash_model_addr.empty()) { + PS_CHECK_STATUS(StreamingModelUtils::WriteHash(tensor_names[si], id)); } - ctx->GetLocker()->ChangeType(QRWLocker::kSimpleRead); - } - if (writable && !ctx->GetStreamingModelArgs()->streaming_hash_model_addr.empty()) { - PS_CHECK_STATUS(StreamingModelUtils::WriteHash(ctx->GetVariableName(), ids)); } - return Status::Ok(); } }; diff --git a/xdl/ps-plus/ps-plus/server/udf/build_sparse_slice.cc b/xdl/ps-plus/ps-plus/server/udf/build_sparse_slice.cc index cf1650db..2d61af1c 100644 --- a/xdl/ps-plus/ps-plus/server/udf/build_sparse_slice.cc +++ b/xdl/ps-plus/ps-plus/server/udf/build_sparse_slice.cc @@ -21,9 +21,9 @@ namespace ps { namespace server { namespace udf { -class BuildSparseSlice : public SimpleUdf { +class BuildSparseSlice : public SimpleUdf*> { public: - virtual Status SimpleRun(UdfContext* ctx, const Tensor& ids, const bool& writable, Slices* result) const { + virtual Status SimpleRun(UdfContext* ctx, const Tensor& ids, const bool& writable, std::vector* result) const { Variable* variable = GetVariable(ctx); if (variable == nullptr) { return Status::ArgumentError("BuildSparseSlice: Variable should not be empty"); @@ -41,25 +41,27 @@ class BuildSparseSlice : public SimpleUdf { int64_t min_id = offset->Internal(); int64_t max_id = variable->GetData()->Shape()[0] + min_id; - result->writable = writable; - result->variable = variable; - result->dim_part = 1; - result->slice_size = variable->GetData()->Shape().NumElements() / variable->GetData()->Shape()[0]; + Slices slices; + slices.writable = writable; + slices.variable = variable; + slices.dim_part = 1; + slices.slice_size = variable->GetData()->Shape().NumElements() / variable->GetData()->Shape()[0]; + TensorShape shape = variable->GetData()->Shape(); CASES(ids.Type(), do { - result->slice_id.reserve(ids.Shape()[0]); - for (size_t i = 0; i < ids.Shape()[0]; i++) { - int64_t id = ids.Raw()[i]; - if (id < min_id || id >= max_id) { - return Status::ArgumentError("BuildSparseSlice: id Overflow"); - } - result->slice_id.push_back(id - min_id); - } - } while (0)); - - if (writable && !ctx->GetStreamingModelArgs()->streaming_sparse_model_addr.empty()) { + slices.slice_id.reserve(ids.Shape()[0]); + for (size_t i = 0; i < ids.Shape()[0]; i++) { + int64_t id = ids.Raw()[i]; + if (id < min_id || id >= max_id) { + return Status::ArgumentError("BuildSparseSlice: id Overflow"); + } + slices.slice_id.push_back(id - min_id); + } + } while (0)); + result->push_back(slices); + //TODO Write Sparse + if (writable && ctx->GetStreamingModelArgs() != NULL && !ctx->GetStreamingModelArgs()->streaming_sparse_model_addr.empty()) { PS_CHECK_STATUS(StreamingModelUtils::WriteSparse(ctx->GetVariableName(), ids)); } - return Status::Ok(); } }; diff --git a/xdl/ps-plus/ps-plus/server/udf/ftrl_updater.cc b/xdl/ps-plus/ps-plus/server/udf/ftrl_updater.cc index eadfbda3..30ce2ff8 100644 --- a/xdl/ps-plus/ps-plus/server/udf/ftrl_updater.cc +++ b/xdl/ps-plus/ps-plus/server/udf/ftrl_updater.cc @@ -22,81 +22,82 @@ namespace ps { namespace server { namespace udf { -class FtrlUpdater : public SimpleUdf { +using std::vector; + +class FtrlUpdater : public SimpleUdf, vector, vector, vector, vector, vector, vector > { public: virtual Status SimpleRun( UdfContext* ctx, - const Slices& slices, - const Tensor& grad_tensor, - const double& learning_rate_, - const double& learning_rate_power_, - const double& initial_accumulator_value_, - const double& l1_reg_, - const double& l2_reg_) const { - if (!slices.writable) { - return Status::ArgumentError("slice is not writable"); + const vector& sslices, + const vector& grad_tensors, + const vector& learning_rates, + const vector& learning_rate_powers, + const vector& initial_accumulator_values, + const vector& l1_regs, + const vector& l2_regs) const { + if (sslices.size() != grad_tensors.size() || sslices.size() != learning_rates.size() || sslices.size() != learning_rate_powers.size() || sslices.size() != initial_accumulator_values.size() || sslices.size() != l1_regs.size() || sslices.size() != l1_regs.size()) { + return Status::ArgumentError("FtrlUpdater: slices and other size not match"); } + for (size_t si = 0; si < sslices.size(); si++) { + const Slices& slices = sslices[si]; + if (!slices.writable) { + return Status::ArgumentError("slice is not writable"); + } + double learning_rate = learning_rates[si]; + double learning_rate_power = learning_rate_powers[si]; + double initial_accumulator_value = initial_accumulator_values[si]; + double l1_reg = l1_regs[si]; + double l2_reg = l2_regs[si]; + const Tensor& grad_tensor = grad_tensors[si]; - double learning_rate = learning_rate_; - double learning_rate_power = learning_rate_power_; - double initial_accumulator_value = initial_accumulator_value_; - double l1_reg = l1_reg_; - double l2_reg = l2_reg_; - - Tensor* data_tensor = slices.variable->GetData(); - Tensor* acc_tensor = slices.variable->GetVariableLikeSlot("accum", data_tensor->Type(), [&]{ return new initializer::ConstantInitializer(initial_accumulator_value); }); - Tensor* linear_tensor = slices.variable->GetVariableLikeSlot("linear", data_tensor->Type(), [&]{ return new initializer::ConstantInitializer(0); }); - if (grad_tensor.Type() != data_tensor->Type()) { - return Status::ArgumentError("grad should has same datatype with variable"); - } - /* - if (grad_tensor.Shape().NumElements() != slices.slice_size * slices.slice_id.size()) { - return Status::ArgumentError("grad should has shape: " + std::to_string(slices.slice_size * slices.slice_id.size())); - } - */ - CASES(data_tensor->Type(), do { - T* data_ptr = data_tensor->Raw(); - T* grad = grad_tensor.Raw(); - T* acc_ptr = acc_tensor->Raw(); - T* linear_ptr = linear_tensor->Raw(); + Tensor* data_tensor = slices.variable->GetData(); + Tensor* acc_tensor = slices.variable->GetVariableLikeSlot("accum", data_tensor->Type(), [&]{ return new initializer::ConstantInitializer(initial_accumulator_value); }); + Tensor* linear_tensor = slices.variable->GetVariableLikeSlot("linear", data_tensor->Type(), [&]{ return new initializer::ConstantInitializer(0); }); + if (grad_tensor.Type() != data_tensor->Type()) { + return Status::ArgumentError("grad should has same datatype with variable"); + } - for (size_t slice : slices.slice_id) { - if ((int64_t)slice == ps::HashMap::NOT_ADD_ID) { - grad += slices.slice_size; - continue; - } - T* data = data_ptr + slice * slices.slice_size; - T* accum = acc_ptr + slice * slices.slice_size; - T* linear = linear_ptr + slice * slices.slice_size; - for (size_t i = 0; i < slices.slice_size; i++) { - T new_accum = *accum + *grad * *grad; - if (fabs(learning_rate_power + 0.5) < 1e-6) { - *linear += *grad - (sqrt(new_accum) - sqrt(*accum)) / learning_rate * *data; - auto x = l1_reg * sgn(*linear) - *linear; - auto y = sqrt(new_accum) / learning_rate + l2_reg * 2; - auto pre_shrink = x / y; - if (fabs(*linear) > l1_reg) { - *data = pre_shrink; - } else { - *data = 0; + CASES(data_tensor->Type(), MultiThreadDo(slices.slice_id.size(), [&](const Range& r) { + for (size_t i = r.begin; i < r.end; i++) { + T* grad = grad_tensor.Raw(i); + int64_t slice = slices.slice_id[i]; + if ((int64_t)slice == ps::HashMap::NOT_ADD_ID) { + continue; } - } else { - *linear += *grad - (pow(new_accum, -learning_rate_power) - pow(*accum, -learning_rate_power)) / learning_rate * *data; - auto x = l1_reg * sgn(*linear) - *linear; - auto y = pow(new_accum, -learning_rate_power) / learning_rate + l2_reg * 2; - auto pre_shrink = x / y; - if (fabs(*linear) > l1_reg) { - *data = pre_shrink; - } else { - *data = 0; + T* data = data_tensor->Raw(slice); + T* acc = acc_tensor->Raw(slice); + T* linear = linear_tensor->Raw(slice); + for (size_t j = 0; j < slices.slice_size; j++) { + T new_accum = *acc + *grad * *grad; + if (fabs(learning_rate_power + 0.5) < 1e-6) { + *linear += *grad - (sqrt(new_accum) - sqrt(*acc)) / learning_rate * *data; + auto x = l1_reg * sgn(*linear) - *linear; + auto y = sqrt(new_accum) / learning_rate + l2_reg * 2; + auto pre_shrink = x / y; + if (fabs(*linear) > l1_reg) { + *data = pre_shrink; + } else { + *data = 0; + } + } else { + *linear += *grad - (pow(new_accum, -learning_rate_power) - pow(*acc, -learning_rate_power)) / learning_rate * *data; + auto x = l1_reg * sgn(*linear) - *linear; + auto y = pow(new_accum, -learning_rate_power) / learning_rate + l2_reg * 2; + auto pre_shrink = x / y; + if (fabs(*linear) > l1_reg) { + *data = pre_shrink; + } else { + *data = 0; + } + } + *acc += *grad * *grad; + data++; grad++; acc++; linear++; } - } - *accum += *grad * *grad; - data++; grad++; accum++; linear++; - } - } - } while(0)); - return Status::Ok(); + } + return Status::Ok(); + })); + } + return Status::Ok();; } protected: diff --git a/xdl/ps-plus/ps-plus/server/udf/hash_black_list.cc b/xdl/ps-plus/ps-plus/server/udf/hash_black_list.cc new file mode 100644 index 00000000..7c6591d4 --- /dev/null +++ b/xdl/ps-plus/ps-plus/server/udf/hash_black_list.cc @@ -0,0 +1,143 @@ +/* Copyright (C) 2016-2018 Alibaba Group Holding Limited + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "ps-plus/server/udf/simple_udf.h" +#include "ps-plus/common/hashmap.h" +#include "ps-plus/common/hasher.h" +#include "ps-plus/common/file_system.h" + +namespace ps { +namespace server { +namespace udf { + +namespace { +struct ListHandle { + HashMapImpl::NonCocurrentHashTable* list; + int beg, end; + int threshold; + bool is_black; +}; +} + +class HashBlackWhiteList : public SimpleUdf, std::vector, std::vector, std::vector, std::vector, std::vector, std::vector> { + public: + virtual Status SimpleRun( + UdfContext* ctx, const std::vector& token_names, + const std::vector& var_names, + const std::vector& dirs, const std::vector& threshold, + const std::vector& is_black, const std::vector& beg, const std::vector& end) const { + ctx->GetServerLocker()->ChangeType(QRWLocker::kWrite); + std::unordered_map*> hashmaps; + std::unordered_map lists; + StorageManager* manager = ctx->GetStorageManager(); + std::unordered_map*> white_hashmap, black_hashmap; + for (size_t i = 0; i < token_names.size(); i++) { + std::string token = token_names[i]; + std::string var = var_names[i]; + Variable* variable; + PS_CHECK_STATUS(manager->Get(var, &variable)); + auto slicer = dynamic_cast >*>(variable->GetSlicer()); + if (slicer == nullptr) { + return Status::ArgumentError("HashBlackWhiteList: Variable Should be a Hash Variable for " + var); + } + auto hashmap = dynamic_cast*>(slicer->Internal().get()); + if (hashmap == nullptr) { + return Status::ArgumentError("HashBlackWhiteList: Variable Should be a Hash 64 Variable for " + var); + } + hashmaps[token] = hashmap; + if (is_black[i]) { + if (black_hashmap[var] == nullptr) { + black_hashmap[var] = hashmap; + lists[token].list = hashmap->NewBlackList(); + } else { + lists[token].list = hashmap->GetBlackList(); + } + } else { + if (white_hashmap[var] == nullptr) { + white_hashmap[var] = hashmap; + lists[token].list = hashmap->NewWhiteList(); + } else { + lists[token].list = hashmap->GetWhiteList(); + } + } + lists[token].beg = beg[i]; + lists[token].end = end[i]; + lists[token].threshold = threshold[i]; + lists[token].is_black = is_black[i]; + } + std::vector files; + for (auto&& dir : dirs) { + std::vector filenames; + PS_CHECK_STATUS(FileSystem::ListDirectoryAny(dir, &filenames)); + for (auto&& file : filenames) { + files.emplace_back(file); + } + } + for (auto& file : files) { + LOG(INFO) << "Processing " << file; + std::unique_ptr f; + PS_CHECK_STATUS(FileSystem::OpenReadStreamAny(file, &f)); + while (true) { + bool eof; + PS_CHECK_STATUS(f->Eof(&eof)); + if (eof) { + break; + } + std::string token; + int64_t id; + double d; + PS_CHECK_STATUS(f->ReadShortStr(&token)); + PS_CHECK_STATUS(f->ReadRaw(&id)); + PS_CHECK_STATUS(f->ReadRaw(&d)); + auto iter = lists.find(token); + if (iter == lists.end()) { + continue; + } + int hash = Hasher::Hash64(id); + auto&& list = iter->second; + if (hash < list.beg || hash >= list.end) { + continue; + } + if (list.is_black) { + if (d < list.threshold) { + list.list->insert(id); + } + } else { + if (d >= list.threshold) { + list.list->insert(id); + } + } + } + f->Close(); + } + for (auto&& item : white_hashmap) { + size_t s = item.second->FilterByWhiteList(); + LOG(INFO) << "filter " << item.first << " as " << s << " listsize " << item.second->GetWhiteList()->size(); + } + for (auto&& item : black_hashmap) { + size_t s = item.second->FilterByBlackList(); + LOG(INFO) << "filter " << item.first << " as " << s << " listsize " << item.second->GetBlackList()->size(); + } + ctx->GetServerLocker()->ChangeType(QRWLocker::kSimpleRead); + return Status::Ok(); + } +}; + +SIMPLE_UDF_REGISTER(HashBlackWhiteList, HashBlackWhiteList); + +} +} +} + diff --git a/xdl/ps-plus/ps-plus/server/udf/hash_simple_filter.cc b/xdl/ps-plus/ps-plus/server/udf/hash_simple_filter.cc new file mode 100644 index 00000000..5b8a6b7b --- /dev/null +++ b/xdl/ps-plus/ps-plus/server/udf/hash_simple_filter.cc @@ -0,0 +1,126 @@ +/* Copyright (C) 2016-2018 Alibaba Group Holding Limited + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "ps-plus/server/udf/simple_udf.h" +#include "ps-plus/server/slice.h" +#include "ps-plus/common/hashmap.h" +#include "ps-plus/server/streaming_model_utils.h" +#include "ps-plus/common/logging.h" +#include "ps-plus/server/udf/python_runner.h" + +namespace ps { +namespace server { +namespace udf { + +namespace { + +struct Argument { + enum Type { + kArr, + kSlice + }; + Type type; + Tensor t; + PythonRunner::NumpyArray arr; +}; + +} + +class HashSimpleFilter + : public SimpleUdf, + std::vector, + std::vector, + size_t*> { + public: + virtual Status SimpleRun( + UdfContext* ctx, + const std::string& func_def, + const std::string& func_name, + const std::vector& func_args, + const std::vector& payload_name, + const std::vector& payload, + size_t* del_size) const { + PythonRunner runner; + Variable* var = ctx->GetVariable(); + PS_CHECK_STATUS(runner.Init(func_def, func_name)); + std::unique_ptr& hashmap = (dynamic_cast >*>(var->GetSlicer()))->Internal(); + if (hashmap == nullptr) { + return Status::ArgumentError("HashSimpleFilter: Variable Should be a Hash Variable for " + ctx->GetVariableName()); + } + std::vector arguments; + for (auto&& arg : func_args) { + Argument argument; + auto iter = std::find(payload_name.begin(), payload_name.end(), arg); + if (iter != payload_name.end()) { + argument.type = Argument::kArr; + argument.t = payload[iter - payload_name.begin()]; + PS_CHECK_STATUS(PythonRunner::ParseTensor(argument.t, &argument.arr)); + } else if (arg == "data_") { + argument.type = Argument::kSlice; + argument.t = *var->GetData(); + } else { + Tensor* t; + PS_CHECK_STATUS(var->GetExistSlot(arg, &t)); + argument.type = Argument::kSlice; + argument.t = *t; + } + arguments.push_back(argument); + } + // Block Everything + ctx->GetServerLocker()->ChangeType(QRWLocker::kWrite); + size_t size = hashmap->GetSize(); + size_t segment_size = var->GetData()->SegmentSize(); + size_t segment_count = (size + segment_size - 1) / segment_size; + std::vector ids; + for (size_t i = 0; i < segment_count; i++) { + std::vector real_args; + for (auto& arg : arguments) { + PythonRunner::NumpyArray real_arg; + if (arg.type == Argument::kArr) { + real_arg = arg.arr; + } else { + PS_CHECK_STATUS(PythonRunner::ParseSubTensor(arg.t, i, size, &real_arg)); + } + real_args.push_back(real_arg); + } + PythonRunner::NumpyArray result; + PS_CHECK_STATUS(runner.Run(real_args, &result)); + if (result.shape.Size() != 1) { + return Status::ArgumentError("HashSimpleFilter: return array should be 1-D"); + } + if (result.type != DataType::kInt8) { + return Status::ArgumentError("HashSimpleFilter: return array type should be Bool"); + } + for (size_t j = 0; j < result.shape[0]; j++) { + if (((uint8_t*)result.data)[j]) { + ids.push_back(j + segment_size * i); + } + } + } + tbb::concurrent_vector unfiltered_ids; + *del_size = hashmap->EraseById(ctx->GetVariableName(), ids, &unfiltered_ids); + ctx->GetServerLocker()->ChangeType(QRWLocker::kSimpleRead); + return Status::Ok(); + } +}; + +SIMPLE_UDF_REGISTER(HashSimpleFilter, HashSimpleFilter); + +} +} +} + diff --git a/xdl/ps-plus/ps-plus/server/udf/hash_slot_filter.cc b/xdl/ps-plus/ps-plus/server/udf/hash_slot_filter.cc new file mode 100644 index 00000000..84f5eaa7 --- /dev/null +++ b/xdl/ps-plus/ps-plus/server/udf/hash_slot_filter.cc @@ -0,0 +1,145 @@ +/* Copyright (C) 2016-2018 Alibaba Group Holding Limited + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "ps-plus/server/udf/simple_udf.h" +#include "ps-plus/server/slice.h" +#include "ps-plus/common/hashmap.h" +#include "ps-plus/server/streaming_model_utils.h" +#include "ps-plus/common/logging.h" +#include "ps-plus/server/udf/python_runner.h" +#include "ps-plus/common/initializer/constant_initializer.h" + +namespace ps { +namespace server { +namespace udf { + +namespace { + +struct Argument { + enum Type { + kArr, + kSlice + }; + Type type; + Tensor t; + PythonRunner::NumpyArray arr; +}; + +} + +class HashSlotFilter + : public SimpleUdf, + std::vector, + std::vector, + std::string, + size_t, + size_t*> { + public: + virtual Status SimpleRun( + UdfContext* ctx, + const std::string& func_def, + const std::string& func_name, + const std::vector& func_args, + const std::vector& payload_name, + const std::vector& payload, + const std::string& slot_name, + const size_t& slot_size, + size_t* del_size) const { + PythonRunner runner; + Variable* var = ctx->GetVariable(); + PS_CHECK_STATUS(runner.Init(func_def, func_name)); + std::unique_ptr& hashmap = (dynamic_cast >*>(var->GetSlicer()))->Internal(); + if (hashmap == nullptr) { + return Status::ArgumentError("HashSlotFilter: Variable Should be a Hash Variable for " + ctx->GetVariableName()); + } + Tensor* slot = var->GetVariableLikeSlot(slot_name, DataType::kFloat, TensorShape({slot_size}), []{ return new initializer::ConstantInitializer(0); }); + std::vector arguments; + for (auto&& arg : func_args) { + Argument argument; + auto iter = std::find(payload_name.begin(), payload_name.end(), arg); + if (iter != payload_name.end()) { + argument.type = Argument::kArr; + argument.t = payload[iter - payload_name.begin()]; + PS_CHECK_STATUS(PythonRunner::ParseTensor(argument.t, &argument.arr)); + } else if (arg == "data_") { + argument.type = Argument::kSlice; + argument.t = *var->GetData(); + } else { + Tensor* t; + PS_CHECK_STATUS(var->GetExistSlot(arg, &t)); + argument.type = Argument::kSlice; + argument.t = *t; + } + arguments.push_back(argument); + } + // Block Everything + ctx->GetServerLocker()->ChangeType(QRWLocker::kWrite); + size_t size = hashmap->GetSize(); + size_t segment_size = var->GetData()->SegmentSize(); + size_t segment_count = (size + segment_size - 1) / segment_size; + *del_size = 0; + for (size_t i = 0; i < segment_count; i++) { + std::vector real_args; + for (auto& arg : arguments) { + PythonRunner::NumpyArray real_arg; + if (arg.type == Argument::kArr) { + real_arg = arg.arr; + } else { + PS_CHECK_STATUS(PythonRunner::ParseSubTensor(arg.t, i, size, &real_arg)); + } + real_args.push_back(real_arg); + } + PythonRunner::NumpyArray result, new_slot; + PS_CHECK_STATUS(runner.Run(real_args, &result, &new_slot)); + if (result.shape.Size() != 1) { + return Status::ArgumentError("HashSlotFilter: return array should be 1-D"); + } + if (result.type != DataType::kInt8) { + return Status::ArgumentError("HashSlotFilter: return array type should be Bool"); + } + if (new_slot.shape.Size() != 2) { + return Status::ArgumentError("HashSlotFilter: return slot array should be 2-D"); + } + if (new_slot.type != DataType::kFloat) { + return Status::ArgumentError("HashSlotFilter: return slot array type should be Float"); + } + if (new_slot.shape[1] != slot_size) { + return Status::ArgumentError("HashSlotFilter: return slot array should be [*, slot_size]"); + } + std::vector ids; + for (size_t j = 0; j < result.shape[0]; j++) { + if (((uint8_t*)result.data)[j]) { + ids.push_back(j + segment_size * i); + } + } + tbb::concurrent_vector unfiltered_ids; + *del_size += hashmap->EraseById(ctx->GetVariableName(), ids, &unfiltered_ids); + for (auto id : unfiltered_ids) { + memcpy(slot->Raw(id), ((float*)new_slot.data) + slot_size * (id - segment_size * i), sizeof(float) * slot_size); + } + } + ctx->GetServerLocker()->ChangeType(QRWLocker::kSimpleRead); + return Status::Ok(); + } +}; + +SIMPLE_UDF_REGISTER(HashSlotFilter, HashSlotFilter); + +} +} +} + diff --git a/xdl/ps-plus/ps-plus/server/udf/hash_unary_filter.cc b/xdl/ps-plus/ps-plus/server/udf/hash_unary_filter.cc index 7baf7b40..2b4f9903 100644 --- a/xdl/ps-plus/ps-plus/server/udf/hash_unary_filter.cc +++ b/xdl/ps-plus/ps-plus/server/udf/hash_unary_filter.cc @@ -13,12 +13,11 @@ See the License for the specific language governing permissions and limitations under the License. ==============================================================================*/ -#include - #include "ps-plus/server/udf/simple_udf.h" #include "ps-plus/server/slice.h" #include "ps-plus/common/hashmap.h" #include "ps-plus/server/streaming_model_utils.h" +#include "ps-plus/common/logging.h" namespace ps { namespace server { @@ -61,6 +60,7 @@ namespace udf { class HashUnaryFilter : public SimpleUdf { public: virtual Status SimpleRun(UdfContext* ctx, const std::string& cond, const double& pd, const int64_t& pi) const { + #if 0 double d = pd; int64_t i = pi; Variable* variable = GetVariable(ctx); @@ -109,10 +109,8 @@ class HashUnaryFilter : public SimpleUdf { PS_CHECK_STATUS(StreamingModelUtils::DelHash(ctx->GetVariableName(), keys)); } - //LOG(INFO) << "Hash Filter for " << ctx->GetVariableName() << " origin=" << - //map.items.size() << ", clear=" << keys.size() / 2; - printf("Hash Filter for %s origin= %ld, clear= %ld\n", ctx->GetVariableName().c_str(), map.items.size(), keys.size() / 2); - + LOG_INFO("Hash Filter for %s, origin=%lld, clear=%lld", ctx->GetVariableName().c_str(), map.items.size(), keys.size() / 2); + #endif return Status::Ok(); } }; diff --git a/xdl/ps-plus/ps-plus/server/udf/hash_variable_initializer.cc b/xdl/ps-plus/ps-plus/server/udf/hash_variable_initializer.cc index 90e3ec0e..cc2dfdb0 100644 --- a/xdl/ps-plus/ps-plus/server/udf/hash_variable_initializer.cc +++ b/xdl/ps-plus/ps-plus/server/udf/hash_variable_initializer.cc @@ -15,22 +15,69 @@ limitations under the License. #include "ps-plus/server/udf/simple_udf.h" #include "ps-plus/common/hashmap.h" +#include "ps-plus/common/string_utils.h" namespace ps { namespace server { namespace udf { -class HashVariableInitializer : public SimpleUdf> { +class HashVariableInitializer : public SimpleUdf> { public: virtual Status SimpleRun( UdfContext* ctx, - const DataType& type, + const DataType& dt, const TensorShape& shape, + const std::string& extra_info, const std::unique_ptr& initializer) const { if (shape.IsScalar()) { return Status::ArgumentError("Hash Shape Should not be Scalar"); } - return ctx->GetStorageManager()->Set(ctx->GetVariableName(), [&]{ return new Variable(new Tensor(type, shape, initializer->Clone()), new WrapperData(shape[0])); }); + std::unordered_map kvs = StringUtils::ParseMap(extra_info); + bool hash64 = false; + int32_t bloom_filter_threthold = 0; + for (const auto iter : kvs) { + if (iter.first == "hash64" && iter.second == "true") { + hash64 = true; + } else if (iter.first == "bloom_filter") { + if (!StringUtils::strToInt32(iter.second.c_str(), bloom_filter_threthold)) { + return Status::ArgumentError("HashVariableInitializer: bloom_filter not int " + iter.first + "=" + iter.second); + } + if (bloom_filter_threthold >= 65500) { + return Status::ArgumentError("HashVariableInitializer: bloom_filter_threthold too large, only support < 65500, " + iter.first + "=" + iter.second); + } + GlobalBloomFilter::SetThrethold(bloom_filter_threthold); + } + } + if (bloom_filter_threthold != 0) { + LOG(INFO) << ctx->GetVariableName() << ", bloom_filter_threthold " << bloom_filter_threthold; + } + std::string var_name = ctx->GetVariableName(); + Variable* var; + ps::Status status = GetStorageManager(ctx)->Get(var_name, &var); + if (!status.IsOk()) { + return ctx->GetStorageManager()->Set(var_name, [&]{ + HashMap* hashmap = nullptr; + if (hash64) { + hashmap = new HashMapImpl(shape[0]); + } else { + hashmap = new HashMapImpl(shape[0]); + } + hashmap->SetBloomFilterThrethold(bloom_filter_threthold); + Variable* var = new Variable(new Tensor(dt, shape, initializer->Clone(), Tensor::TType::kSegment, true), new WrapperData >(hashmap), var_name); + var->SetRealInited(true); + return var; + }); + } else { + std::unique_ptr& hashmap = dynamic_cast >*>(var->GetSlicer())->Internal(); + if (hashmap.get() == nullptr) { + return Status::ArgumentError("hashmap is empty for " + var_name); + } + var->GetData()->SetInititalizer(initializer->Clone()); + var->GetData()->InitChunkFrom(hashmap->GetSize()); + hashmap->SetBloomFilterThrethold(bloom_filter_threthold); + var->SetRealInited(true); + return Status::Ok(); + } } }; diff --git a/xdl/ps-plus/ps-plus/server/udf/identity_index_variable_initializer.cc b/xdl/ps-plus/ps-plus/server/udf/identity_index_variable_initializer.cc index 191b530e..63906940 100644 --- a/xdl/ps-plus/ps-plus/server/udf/identity_index_variable_initializer.cc +++ b/xdl/ps-plus/ps-plus/server/udf/identity_index_variable_initializer.cc @@ -34,11 +34,20 @@ class IdentityIndexVariableInitializer : public SimpleUdfGetStorageManager()->Set(ctx->GetVariableName(), [&]{ - Tensor* ret = new Tensor(type, shape, new initializer::NoneInitializer); - QuickMemcpy(ret->Raw(), tensor.Raw(), SizeOfType(type) * shape.NumElements()); - return new Variable(ret, new WrapperData(offset)); - }); + std::string var_name = ctx->GetVariableName(); + Variable* var; + ps::Status status = GetStorageManager(ctx)->Get(var_name, &var); + if (!status.IsOk()) { + return ctx->GetStorageManager()->Set(var_name, [&]{ + Tensor* ret = new Tensor(type, shape, new initializer::NoneInitializer); + QuickMemcpy(ret->Raw(), tensor.Raw(), SizeOfType(type) * shape.NumElements()); + Variable* var = new Variable(ret, new WrapperData(offset), var_name); + var->SetRealInited(true); + return var;}); + } else { + var->SetRealInited(true); + return Status::Ok(); + } } }; diff --git a/xdl/ps-plus/ps-plus/server/udf/index_variable_initializer.cc b/xdl/ps-plus/ps-plus/server/udf/index_variable_initializer.cc index 2eb649db..d7685075 100644 --- a/xdl/ps-plus/ps-plus/server/udf/index_variable_initializer.cc +++ b/xdl/ps-plus/ps-plus/server/udf/index_variable_initializer.cc @@ -27,7 +27,15 @@ class IndexVariableInitializer : public SimpleUdf& initializer) const { - return ctx->GetStorageManager()->Set(ctx->GetVariableName(), [&]{ return new Variable(new Tensor(type, shape, initializer->Clone()), new WrapperData(offset)); }); + std::string var_name = ctx->GetVariableName(); + Variable* var; + ps::Status status = GetStorageManager(ctx)->Get(var_name, &var); + if (!status.IsOk()) { + return ctx->GetStorageManager()->Set(var_name, [&]{ Variable* var = new Variable(new Tensor(type, shape, initializer->Clone()), new WrapperData(offset), var_name); var->SetRealInited(true); return var;}); + } else { + var->SetRealInited(true); + return Status::Ok(); + } } }; diff --git a/xdl/ps-plus/ps-plus/server/udf/is_initialized.cc b/xdl/ps-plus/ps-plus/server/udf/is_initialized.cc index 18de063c..184ac928 100644 --- a/xdl/ps-plus/ps-plus/server/udf/is_initialized.cc +++ b/xdl/ps-plus/ps-plus/server/udf/is_initialized.cc @@ -24,8 +24,13 @@ class IsInitialized : public SimpleUdf { public: virtual Status SimpleRun(UdfContext* ctx, bool* result) const { std::string variable_name = GetVariableName(ctx); - Variable* unused; - *result = GetStorageManager(ctx)->Get(variable_name, &unused).IsOk(); + Variable* var; + ps::Status status = GetStorageManager(ctx)->Get(variable_name, &var); + if (!status.IsOk()) { + *result = false; + } else { + *result = var->RealInited(); + } return Status::Ok(); } }; diff --git a/xdl/ps-plus/ps-plus/server/udf/momentum_updater.cc b/xdl/ps-plus/ps-plus/server/udf/momentum_updater.cc index fd6c11cc..036c1258 100644 --- a/xdl/ps-plus/ps-plus/server/udf/momentum_updater.cc +++ b/xdl/ps-plus/ps-plus/server/udf/momentum_updater.cc @@ -22,66 +22,63 @@ namespace ps { namespace server { namespace udf { -class MomentumUpdater : public SimpleUdf { +using std::vector; + +class MomentumUpdater : public SimpleUdf, vector, vector, vector, vector > { public: virtual Status SimpleRun( UdfContext* ctx, - const Slices& slices, - const Tensor& grad_tensor, - const double& learning_rate_, - const double& momentum_, - const bool& use_nesterov_) const { - if (!slices.writable) { - return Status::ArgumentError("slice is not writable"); + const vector& sslices, + const vector& grad_tensors, + const vector& learning_rates, + const vector& momentums, + const vector& use_nesterovs) const { + if (sslices.size() != grad_tensors.size() || sslices.size() != learning_rates.size() || sslices.size() != momentums.size() || sslices.size() != use_nesterovs.size()) { + return Status::ArgumentError("MomentumUpdater: slices and other size not match"); } + for (size_t si = 0; si < sslices.size(); si++) { + const Slices& slices = sslices[si]; + std::unique_ptr locker; + locker.reset(new QRWLocker(slices.variable->VariableLock(), QRWLocker::kSimpleRead)); + if (!slices.writable) { + return Status::ArgumentError("slice is not writable"); + } + double learning_rate = learning_rates[si]; + double momentum = momentums[si]; + bool use_nesterov = use_nesterovs[si]; + const Tensor& grad_tensor = grad_tensors[si]; + Tensor* data_tensor = slices.variable->GetData(); + Tensor* acc_tensor = slices.variable->GetVariableLikeSlot("accumulation", data_tensor->Type(), []{ return new initializer::ConstantInitializer(0); }); + if (grad_tensor.Type() != data_tensor->Type()) { + return Status::ArgumentError("grad should has same datatype with variable"); + } - double learning_rate = learning_rate_; - double momentum = momentum_; - bool use_nesterov = use_nesterov_; - Tensor* data_tensor = slices.variable->GetData(); - Tensor* acc_tensor = slices.variable->GetVariableLikeSlot("accumulation", data_tensor->Type(), []{ return new initializer::ConstantInitializer(0); }); - if (grad_tensor.Type() != data_tensor->Type()) { - return Status::ArgumentError("grad should has same datatype with variable"); - } - /* - if (grad_tensor.Shape().NumElements() != slices.slice_size * slices.slice_id.size()) { - return Status::ArgumentError("grad should has shape: " + std::to_string(slices.slice_size * slices.slice_id.size())); + CASES(data_tensor->Type(), MultiThreadDo(slices.slice_id.size(), [&](const Range& r) { + for (size_t i = r.begin; i < r.end; i++) { + int64_t slice = slices.slice_id[i]; + if ((int64_t)slice == ps::HashMap::NOT_ADD_ID) { + continue; + } + T* data = data_tensor->Raw(slice); + T* acc = acc_tensor->Raw(slice); + T* grad = grad_tensor.Raw(i); + if (use_nesterov) { + for (size_t j = 0; j < slices.slice_size; j++) { + *acc = *acc * momentum + *grad; + *data -= *grad * learning_rate + *acc * momentum * learning_rate; + data++; acc++; grad++; + } + } else { + for (size_t j = 0; j < slices.slice_size; j++) { + *acc = *acc * momentum + *grad; + *data -= *acc * learning_rate; + data++; acc++; grad++; + } + } + } + return Status::Ok(); + })); } - */ - CASES(data_tensor->Type(), { - T* data_ptr = data_tensor->Raw(); - T* acc_ptr = acc_tensor->Raw(); - T* grad = grad_tensor.Raw(); - if (use_nesterov) { - for (size_t slice : slices.slice_id) { - if ((int64_t)slice == ps::HashMap::NOT_ADD_ID) { - grad += slices.slice_size; - continue; - } - T* data = data_ptr + slice * slices.slice_size; - T* acc = acc_ptr + slice * slices.slice_size; - for (size_t i = 0; i < slices.slice_size; i++) { - *acc = *acc * momentum + *grad; - *data -= *grad * learning_rate + *acc * momentum * learning_rate; - data++; acc++; grad++; - } - } - } else { - for (size_t slice : slices.slice_id) { - if ((int64_t)slice == ps::HashMap::NOT_ADD_ID) { - grad += slices.slice_size; - continue; - } - T* data = data_ptr + slice * slices.slice_size; - T* acc = acc_ptr + slice * slices.slice_size; - for (size_t i = 0; i < slices.slice_size; i++) { - *acc = *acc * momentum + *grad; - *data -= *acc * learning_rate; - data++; acc++; grad++; - } - } - } - }); return Status::Ok(); } }; diff --git a/xdl/ps-plus/ps-plus/server/udf/moving_average_updater.cc b/xdl/ps-plus/ps-plus/server/udf/moving_average_updater.cc index 7d7c713e..7586bacc 100644 --- a/xdl/ps-plus/ps-plus/server/udf/moving_average_updater.cc +++ b/xdl/ps-plus/ps-plus/server/udf/moving_average_updater.cc @@ -15,43 +15,53 @@ limitations under the License. #include "ps-plus/server/udf/simple_udf.h" #include "ps-plus/server/slice.h" +#include "ps-plus/common/logging.h" #include "ps-plus/common/hashmap.h" namespace ps { namespace server { namespace udf { -class MovingAverageUpdater : public SimpleUdf { +using std::vector; + +class MovingAverageUpdater : public SimpleUdf, vector, vector > { public: virtual Status SimpleRun( UdfContext* ctx, - const Slices& slices, - const float& moment, - const Tensor& value) const { - if (!slices.writable) { - return Status::ArgumentError("slice is not writable"); - } - - Tensor* data_tensor = slices.variable->GetData(); - if (value.Type() != data_tensor->Type()) { - return Status::ArgumentError("value should has same datatype with variable"); + const vector& sslices, + const vector& moments, + const vector& value_tensors) const { + if (sslices.size() != value_tensors.size() || sslices.size() != moments.size()) { + return Status::ArgumentError("MovingAverageUpdater: slices and other size not match"); } - - CASES(data_tensor->Type(), do { - T* data_ptr = data_tensor->Raw(); - T* value_ptr = value.Raw(); - for (size_t slice : slices.slice_id) { - T* data = data_ptr + slice * slices.slice_size; - for (size_t i = 0; i < slices.slice_size; ++i) { - *data = moment * (*data) + (1.0 - moment) * (*value_ptr); - data++; - value_ptr++; - } + for (size_t si = 0; si < sslices.size(); si++) { + const Slices& slices = sslices[si]; + if (!slices.writable) { + return Status::ArgumentError("slice is not writable"); } - } while(0)); - + float moment = moments[si]; + const Tensor& value_tensor = value_tensors[si]; + Tensor* data_tensor = slices.variable->GetData(); + if (value_tensor.Type() != data_tensor->Type()) { + return Status::ArgumentError("value should has same datatype with variable"); + } + CASES(data_tensor->Type(), MultiThreadDo(slices.slice_id.size(), [&](const Range& r) { + for (size_t i = r.begin; i < r.end; i++) { + int64_t slice = slices.slice_id[i]; + if ((int64_t)slice == ps::HashMap::NOT_ADD_ID) { + continue; + } + T* data = data_tensor->Raw(slice); + T* value = value_tensor.Raw(i); + for (size_t j = 0; j < slices.slice_size; ++j) { + *data = moment * (*data) + (1.0 - moment) * (*value); + data++;value++; + } + } + return Status::Ok();})); + } return Status::Ok(); - } + } }; SIMPLE_UDF_REGISTER(MovingAverageUpdater, MovingAverageUpdater); diff --git a/xdl/ps-plus/ps-plus/server/udf/python_runner.cc b/xdl/ps-plus/ps-plus/server/udf/python_runner.cc new file mode 100644 index 00000000..833812b9 --- /dev/null +++ b/xdl/ps-plus/ps-plus/server/udf/python_runner.cc @@ -0,0 +1,297 @@ +/* Copyright (C) 2016-2018 Alibaba Group Holding Limited + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "python_runner.h" +#include +#include "numpy/npy_common.h" +#include "numpy/ndarrayobject.h" + +namespace ps { + +namespace { +int DtypeToNumpy(DataType type) { + switch(type) { + case DataType::kInt8: return NPY_INT8; + case DataType::kInt16: return NPY_INT16; + case DataType::kInt32: return NPY_INT32; + case DataType::kInt64: return NPY_INT64; + case DataType::kFloat: return NPY_FLOAT; + case DataType::kDouble: return NPY_DOUBLE; + default: return -1; + }; +} + +Status NumpyToDtype(int x, DataType* type) { + switch(x) { + case NPY_BOOL: case NPY_INT8: *type = DataType::kInt8; return Status::Ok(); + case NPY_INT16: *type = DataType::kInt16; return Status::Ok(); + case NPY_INT32: *type = DataType::kInt32; return Status::Ok(); + case NPY_INT64: *type = DataType::kInt64; return Status::Ok(); + case NPY_FLOAT: *type = DataType::kFloat; return Status::Ok(); + case NPY_DOUBLE: *type = DataType::kDouble; return Status::Ok(); + default: return Status::ArgumentError("return type error " + std::to_string(x)); + }; +} + +class PythonContext { + public: + PythonContext() : lock_(mu_) { + if (!inited_) { + Py_Initialize(); + PyRun_SimpleString("import traceback"); + PyRun_SimpleString("import numpy"); + import_array(); + PyObject* mainModule = PyImport_ImportModule("__main__" ); + PyObject* dict = PyModule_GetDict(mainModule); + PyObject* traceback = PyDict_GetItemString(dict, "traceback"); + format_exception = PyObject_GetAttrString(traceback, "format_exception"); + format_exception_only = PyObject_GetAttrString(traceback, "format_exception_only"); + if (format_exception == nullptr || format_exception_only == nullptr) { + std::cerr << "traceback module import error." << std::endl; + abort(); + } + inited_ = true; + } + PyErr_Clear(); + } + std::string getException() { + PyObject *ptype = nullptr, *pvalue = nullptr, *ptraceback = nullptr, *pstr; + PyErr_Fetch(&ptype, &pvalue, &ptraceback); + if (ptype == nullptr) { + return "Unknown Python Exception"; + } + if (ptraceback != nullptr) { + pstr = PyObject_CallFunction(format_exception, "OOO", ptype, pvalue, ptraceback); + } else { + pstr = PyObject_CallFunction(format_exception_only, "OO", ptype, pvalue); + } + PyObject* slash_n = PyString_FromString("\n"); + pstr = PyObject_CallMethod(slash_n, "join", "O", pstr); + char *pStrErrorMessage = PyString_AsString(pstr); + PyErr_Clear(); + return pStrErrorMessage; + } + private: + std::unique_lock lock_; + static PyObject *format_exception, *format_exception_only; + static bool inited_; + static std::mutex mu_; +}; + +bool PythonContext::inited_ = false; +std::mutex PythonContext::mu_; +PyObject *PythonContext::format_exception, *PythonContext::format_exception_only; +} + +PythonRunner::NumpyArray::~NumpyArray() { + Py_XDECREF(object); +} + +PythonRunner::NumpyArray::NumpyArray() { + this->object = nullptr; +} + +PythonRunner::NumpyArray::NumpyArray( + void* data, DataType type, const TensorShape& shape, PyObject* object) { + this->data = data; + this->type = type; + this->shape = shape; + this->object = object; +} + +PythonRunner::NumpyArray::NumpyArray(const PythonRunner::NumpyArray& rhs) { + this->data = rhs.data; + this->type = rhs.type; + this->shape = rhs.shape; + this->object = rhs.object; + Py_XINCREF(object); +} + +PythonRunner::NumpyArray& PythonRunner::NumpyArray::operator=(const PythonRunner::NumpyArray& rhs) { + Py_XDECREF(this->object); + this->data = rhs.data; + this->type = rhs.type; + this->shape = rhs.shape; + this->object = rhs.object; + Py_XINCREF(object); +} + +Status PythonRunner::Init( + const std::string& func_def, + const std::string& func_name) { + PythonContext ctx; + PyRun_SimpleString(func_def.c_str()); + if (PyErr_Occurred()) { + return Status::ArgumentError("Cannot Create Python Func\n" + ctx.getException()); + } + PyObject* mainModule = PyImport_ImportModule("__main__" ); + PyObject* dict = PyModule_GetDict(mainModule); + func_ = PyDict_GetItemString(dict, func_name.c_str()); + if (func_ == nullptr) { + return Status::ArgumentError("Python Func Name Error\n" + ctx.getException()); + } + Py_XINCREF(func_); + return Status::Ok(); +} + +Status PythonRunner::RunImpl( + const std::vector& inputs, + PyObject** result) { + PythonContext ctx; + PyObject* result_object; + switch (inputs.size()) { + case 0:result_object = PyObject_CallFunction(func_, ""); break; + case 1:result_object = PyObject_CallFunction(func_, "O", inputs[0].object); break; + case 2:result_object = PyObject_CallFunction(func_, "OO", inputs[0].object, inputs[1].object); break; + case 3:result_object = PyObject_CallFunction(func_, "OOO", inputs[0].object, inputs[1].object, inputs[2].object); break; + case 4:result_object = PyObject_CallFunction(func_, "OOOO", inputs[0].object, inputs[1].object, inputs[2].object, inputs[3].object); break; + case 5:result_object = PyObject_CallFunction(func_, "OOOOO", inputs[0].object, inputs[1].object, inputs[2].object, inputs[3].object, inputs[4].object); break; + case 6:result_object = PyObject_CallFunction(func_, "OOOOOO", inputs[0].object, inputs[1].object, inputs[2].object, inputs[3].object, inputs[4].object, inputs[5].object); break; + case 7:result_object = PyObject_CallFunction(func_, "OOOOOOO", inputs[0].object, inputs[1].object, inputs[2].object, inputs[3].object, inputs[4].object, inputs[5].object, inputs[6].object); break; + case 8:result_object = PyObject_CallFunction(func_, "OOOOOOOO", inputs[0].object, inputs[1].object, inputs[2].object, inputs[3].object, inputs[4].object, inputs[5].object, inputs[6].object, inputs[7].object); break; + case 9:result_object = PyObject_CallFunction(func_, "OOOOOOOOO", inputs[0].object, inputs[1].object, inputs[2].object, inputs[3].object, inputs[4].object, inputs[5].object, inputs[6].object, inputs[7].object, inputs[8].object); break; + case 10:result_object = PyObject_CallFunction(func_, "OOOOOOOOOO", inputs[0].object, inputs[1].object, inputs[2].object, inputs[3].object, inputs[4].object, inputs[5].object, inputs[6].object, inputs[7].object, inputs[8].object, inputs[9].object); break; + case 11:result_object = PyObject_CallFunction(func_, "OOOOOOOOOOO", inputs[0].object, inputs[1].object, inputs[2].object, inputs[3].object, inputs[4].object, inputs[5].object, inputs[6].object, inputs[7].object, inputs[8].object, inputs[9].object, inputs[10].object); break; + case 12:result_object = PyObject_CallFunction(func_, "OOOOOOOOOOOO", inputs[0].object, inputs[1].object, inputs[2].object, inputs[3].object, inputs[4].object, inputs[5].object, inputs[6].object, inputs[7].object, inputs[8].object, inputs[9].object, inputs[10].object, inputs[11].object); break; + case 13:result_object = PyObject_CallFunction(func_, "OOOOOOOOOOOOO", inputs[0].object, inputs[1].object, inputs[2].object, inputs[3].object, inputs[4].object, inputs[5].object, inputs[6].object, inputs[7].object, inputs[8].object, inputs[9].object, inputs[10].object, inputs[11].object, inputs[12].object); break; + case 14:result_object = PyObject_CallFunction(func_, "OOOOOOOOOOOOOO", inputs[0].object, inputs[1].object, inputs[2].object, inputs[3].object, inputs[4].object, inputs[5].object, inputs[6].object, inputs[7].object, inputs[8].object, inputs[9].object, inputs[10].object, inputs[11].object, inputs[12].object, inputs[13].object); break; + case 15:result_object = PyObject_CallFunction(func_, "OOOOOOOOOOOOOOO", inputs[0].object, inputs[1].object, inputs[2].object, inputs[3].object, inputs[4].object, inputs[5].object, inputs[6].object, inputs[7].object, inputs[8].object, inputs[9].object, inputs[10].object, inputs[11].object, inputs[12].object, inputs[13].object, inputs[14].object); break; + case 16:result_object = PyObject_CallFunction(func_, "OOOOOOOOOOOOOOOO", inputs[0].object, inputs[1].object, inputs[2].object, inputs[3].object, inputs[4].object, inputs[5].object, inputs[6].object, inputs[7].object, inputs[8].object, inputs[9].object, inputs[10].object, inputs[11].object, inputs[12].object, inputs[13].object, inputs[14].object, inputs[15].object); break; + case 17:result_object = PyObject_CallFunction(func_, "OOOOOOOOOOOOOOOOO", inputs[0].object, inputs[1].object, inputs[2].object, inputs[3].object, inputs[4].object, inputs[5].object, inputs[6].object, inputs[7].object, inputs[8].object, inputs[9].object, inputs[10].object, inputs[11].object, inputs[12].object, inputs[13].object, inputs[14].object, inputs[15].object, inputs[16].object); break; + case 18:result_object = PyObject_CallFunction(func_, "OOOOOOOOOOOOOOOOOO", inputs[0].object, inputs[1].object, inputs[2].object, inputs[3].object, inputs[4].object, inputs[5].object, inputs[6].object, inputs[7].object, inputs[8].object, inputs[9].object, inputs[10].object, inputs[11].object, inputs[12].object, inputs[13].object, inputs[14].object, inputs[15].object, inputs[16].object, inputs[17].object); break; + case 19:result_object = PyObject_CallFunction(func_, "OOOOOOOOOOOOOOOOOOO", inputs[0].object, inputs[1].object, inputs[2].object, inputs[3].object, inputs[4].object, inputs[5].object, inputs[6].object, inputs[7].object, inputs[8].object, inputs[9].object, inputs[10].object, inputs[11].object, inputs[12].object, inputs[13].object, inputs[14].object, inputs[15].object, inputs[16].object, inputs[17].object, inputs[18].object); break; + case 20:result_object = PyObject_CallFunction(func_, "OOOOOOOOOOOOOOOOOOOO", inputs[0].object, inputs[1].object, inputs[2].object, inputs[3].object, inputs[4].object, inputs[5].object, inputs[6].object, inputs[7].object, inputs[8].object, inputs[9].object, inputs[10].object, inputs[11].object, inputs[12].object, inputs[13].object, inputs[14].object, inputs[15].object, inputs[16].object, inputs[17].object, inputs[18].object, inputs[19].object); break; + case 21:result_object = PyObject_CallFunction(func_, "OOOOOOOOOOOOOOOOOOOOO", inputs[0].object, inputs[1].object, inputs[2].object, inputs[3].object, inputs[4].object, inputs[5].object, inputs[6].object, inputs[7].object, inputs[8].object, inputs[9].object, inputs[10].object, inputs[11].object, inputs[12].object, inputs[13].object, inputs[14].object, inputs[15].object, inputs[16].object, inputs[17].object, inputs[18].object, inputs[19].object, inputs[20].object); break; + case 22:result_object = PyObject_CallFunction(func_, "OOOOOOOOOOOOOOOOOOOOOO", inputs[0].object, inputs[1].object, inputs[2].object, inputs[3].object, inputs[4].object, inputs[5].object, inputs[6].object, inputs[7].object, inputs[8].object, inputs[9].object, inputs[10].object, inputs[11].object, inputs[12].object, inputs[13].object, inputs[14].object, inputs[15].object, inputs[16].object, inputs[17].object, inputs[18].object, inputs[19].object, inputs[20].object, inputs[21].object); break; + case 23:result_object = PyObject_CallFunction(func_, "OOOOOOOOOOOOOOOOOOOOOOO", inputs[0].object, inputs[1].object, inputs[2].object, inputs[3].object, inputs[4].object, inputs[5].object, inputs[6].object, inputs[7].object, inputs[8].object, inputs[9].object, inputs[10].object, inputs[11].object, inputs[12].object, inputs[13].object, inputs[14].object, inputs[15].object, inputs[16].object, inputs[17].object, inputs[18].object, inputs[19].object, inputs[20].object, inputs[21].object, inputs[22].object); break; + case 24:result_object = PyObject_CallFunction(func_, "OOOOOOOOOOOOOOOOOOOOOOOO", inputs[0].object, inputs[1].object, inputs[2].object, inputs[3].object, inputs[4].object, inputs[5].object, inputs[6].object, inputs[7].object, inputs[8].object, inputs[9].object, inputs[10].object, inputs[11].object, inputs[12].object, inputs[13].object, inputs[14].object, inputs[15].object, inputs[16].object, inputs[17].object, inputs[18].object, inputs[19].object, inputs[20].object, inputs[21].object, inputs[22].object, inputs[23].object); break; + case 25:result_object = PyObject_CallFunction(func_, "OOOOOOOOOOOOOOOOOOOOOOOOO", inputs[0].object, inputs[1].object, inputs[2].object, inputs[3].object, inputs[4].object, inputs[5].object, inputs[6].object, inputs[7].object, inputs[8].object, inputs[9].object, inputs[10].object, inputs[11].object, inputs[12].object, inputs[13].object, inputs[14].object, inputs[15].object, inputs[16].object, inputs[17].object, inputs[18].object, inputs[19].object, inputs[20].object, inputs[21].object, inputs[22].object, inputs[23].object, inputs[24].object); break; + case 26:result_object = PyObject_CallFunction(func_, "OOOOOOOOOOOOOOOOOOOOOOOOOO", inputs[0].object, inputs[1].object, inputs[2].object, inputs[3].object, inputs[4].object, inputs[5].object, inputs[6].object, inputs[7].object, inputs[8].object, inputs[9].object, inputs[10].object, inputs[11].object, inputs[12].object, inputs[13].object, inputs[14].object, inputs[15].object, inputs[16].object, inputs[17].object, inputs[18].object, inputs[19].object, inputs[20].object, inputs[21].object, inputs[22].object, inputs[23].object, inputs[24].object, inputs[25].object); break; + case 27:result_object = PyObject_CallFunction(func_, "OOOOOOOOOOOOOOOOOOOOOOOOOOO", inputs[0].object, inputs[1].object, inputs[2].object, inputs[3].object, inputs[4].object, inputs[5].object, inputs[6].object, inputs[7].object, inputs[8].object, inputs[9].object, inputs[10].object, inputs[11].object, inputs[12].object, inputs[13].object, inputs[14].object, inputs[15].object, inputs[16].object, inputs[17].object, inputs[18].object, inputs[19].object, inputs[20].object, inputs[21].object, inputs[22].object, inputs[23].object, inputs[24].object, inputs[25].object, inputs[26].object); break; + case 28:result_object = PyObject_CallFunction(func_, "OOOOOOOOOOOOOOOOOOOOOOOOOOOO", inputs[0].object, inputs[1].object, inputs[2].object, inputs[3].object, inputs[4].object, inputs[5].object, inputs[6].object, inputs[7].object, inputs[8].object, inputs[9].object, inputs[10].object, inputs[11].object, inputs[12].object, inputs[13].object, inputs[14].object, inputs[15].object, inputs[16].object, inputs[17].object, inputs[18].object, inputs[19].object, inputs[20].object, inputs[21].object, inputs[22].object, inputs[23].object, inputs[24].object, inputs[25].object, inputs[26].object, inputs[27].object); break; + case 29:result_object = PyObject_CallFunction(func_, "OOOOOOOOOOOOOOOOOOOOOOOOOOOOO", inputs[0].object, inputs[1].object, inputs[2].object, inputs[3].object, inputs[4].object, inputs[5].object, inputs[6].object, inputs[7].object, inputs[8].object, inputs[9].object, inputs[10].object, inputs[11].object, inputs[12].object, inputs[13].object, inputs[14].object, inputs[15].object, inputs[16].object, inputs[17].object, inputs[18].object, inputs[19].object, inputs[20].object, inputs[21].object, inputs[22].object, inputs[23].object, inputs[24].object, inputs[25].object, inputs[26].object, inputs[27].object, inputs[28].object); break; + case 30:result_object = PyObject_CallFunction(func_, "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", inputs[0].object, inputs[1].object, inputs[2].object, inputs[3].object, inputs[4].object, inputs[5].object, inputs[6].object, inputs[7].object, inputs[8].object, inputs[9].object, inputs[10].object, inputs[11].object, inputs[12].object, inputs[13].object, inputs[14].object, inputs[15].object, inputs[16].object, inputs[17].object, inputs[18].object, inputs[19].object, inputs[20].object, inputs[21].object, inputs[22].object, inputs[23].object, inputs[24].object, inputs[25].object, inputs[26].object, inputs[27].object, inputs[28].object, inputs[29].object); break; + case 31:result_object = PyObject_CallFunction(func_, "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", inputs[0].object, inputs[1].object, inputs[2].object, inputs[3].object, inputs[4].object, inputs[5].object, inputs[6].object, inputs[7].object, inputs[8].object, inputs[9].object, inputs[10].object, inputs[11].object, inputs[12].object, inputs[13].object, inputs[14].object, inputs[15].object, inputs[16].object, inputs[17].object, inputs[18].object, inputs[19].object, inputs[20].object, inputs[21].object, inputs[22].object, inputs[23].object, inputs[24].object, inputs[25].object, inputs[26].object, inputs[27].object, inputs[28].object, inputs[29].object, inputs[30].object); break; + default: return Status::ArgumentError("Python Call should less than 31 arguments"); + } + if (PyErr_Occurred()) { + return Status::ArgumentError("Python Call run with some error\n" + ctx.getException()); + } + if (result_object == nullptr) { + return Status::ArgumentError("Python Call run return None"); + } + *result = result_object; + return Status::Ok(); +} +Status PythonRunner::ParseObject(PyObject* arr, PythonRunner::NumpyArray* result) { + PyArrayObject* obj = (PyArrayObject*)PyArray_FROM_OF(arr, NPY_ARRAY_IN_ARRAY); + if (obj == nullptr) { + return Status::ArgumentError("Cannot convert to numpy array"); + } + DataType dtype; + Status conv_status = NumpyToDtype(PyArray_TYPE(obj), &dtype); + if (!conv_status.IsOk()) { + Py_XDECREF(obj); + return conv_status; + } + result->object = (PyObject*)obj; + result->data = PyArray_DATA(obj); + int dim_size = PyArray_NDIM(obj); + npy_intp * dims = PyArray_DIMS(obj); + result->shape = TensorShape(std::vector(dims, dims+dim_size)); + result->type = dtype; + return Status::Ok(); +} + +Status PythonRunner::Run(const std::vector& inputs) { + PyObject* obj; + PS_CHECK_STATUS(RunImpl(inputs, &obj)); + return Status::Ok(); +} +Status PythonRunner::Run( + const std::vector& inputs, + PythonRunner::NumpyArray* result) { + PyObject* obj; + PS_CHECK_STATUS(RunImpl(inputs, &obj)); + PythonContext ctx; + Status st = ParseObject(obj, result); + Py_XDECREF(obj); + return st; +} + +Status PythonRunner::Run( + const std::vector& inputs, + PythonRunner::NumpyArray* r1, + PythonRunner::NumpyArray* r2) { + PyObject* obj, *obj1, *obj2; + PS_CHECK_STATUS(RunImpl(inputs, &obj)); + PythonContext ctx; + if (!PyArg_ParseTuple(obj, "OO", &obj1, &obj2)) { + Py_XDECREF(obj); + return Status::ArgumentError("Parse Result Error!\n" + ctx.getException()); + } + Status st1 = ParseObject(obj1, r1); + Status st2 = ParseObject(obj2, r2); + Py_XDECREF(obj); + if (!st1.IsOk()) { + return st1; + } else { + return st2; + } +} + +Status PythonRunner::ParseSubTensor( + Tensor t, size_t seg_id, size_t max_id, PythonRunner::NumpyArray* arr) { + size_t segment_size = t.SegmentSize(); + void* data = t.Raw(segment_size * seg_id); + arr->shape = t.Shape(); + arr->shape.Set(0, std::min(segment_size, max_id - seg_id * segment_size)); + arr->data = data; + arr->type = t.Type(); + std::vector shapex; + for (int i = 0; i < arr->shape.Size(); i++) { + shapex.push_back(arr->shape[i]); + } + int type = DtypeToNumpy(arr->type); + if (type == -1) { + return Status::ArgumentError("input Type Error"); + } + int ndim = shapex.size(); + arr->object = PyArray_SimpleNewFromData( + ndim, &shapex[0], type, data); + return Status::Ok(); +} + +Status PythonRunner::ParseTensor( + Tensor t, PythonRunner::NumpyArray* arr) { + arr->shape = t.Shape(); + arr->data = t.Raw(); + arr->type = t.Type(); + std::vector shapex; + for (int i = 0; i < arr->shape.Size(); i++) { + shapex.push_back(arr->shape[i]); + } + int type = DtypeToNumpy(arr->type); + if (type == -1) { + return Status::ArgumentError("input Type Error"); + } + int ndim = shapex.size(); + arr->object = PyArray_SimpleNewFromData( + ndim, &shapex[0], type, arr->data); + return Status::Ok(); +} + +} // namespace ps + diff --git a/xdl/ps-plus/ps-plus/server/udf/python_runner.h b/xdl/ps-plus/ps-plus/server/udf/python_runner.h new file mode 100644 index 00000000..0840f041 --- /dev/null +++ b/xdl/ps-plus/ps-plus/server/udf/python_runner.h @@ -0,0 +1,64 @@ +/* Copyright (C) 2016-2018 Alibaba Group Holding Limited + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef PS_PLUS_COMMON_PYTHON_RUNNER_H_ +#define PS_PLUS_COMMON_PYTHON_RUNNER_H_ + +#include +#include +#include "Python.h" +#include "ps-plus/common/types.h" +#include "ps-plus/common/tensor_shape.h" +#include "ps-plus/common/tensor.h" +#include "ps-plus/common/status.h" + +namespace ps { + +class PythonRunner { + public: + struct NumpyArray { + ~NumpyArray(); + NumpyArray(); + NumpyArray( + void* data, DataType type, const TensorShape& shape, PyObject* object); + NumpyArray(const NumpyArray&); + NumpyArray& operator=(const NumpyArray&); + void* data; + DataType type; + TensorShape shape; + PyObject* object; + }; + + PythonRunner() : func_(nullptr) {} + ~PythonRunner() {Py_XDECREF(func_);} + + Status Init(const std::string& func_def, const std::string& func_name); + + Status Run(const std::vector& inputs); + Status Run(const std::vector& inputs, NumpyArray* result); + Status Run(const std::vector& inputs, NumpyArray* r1, NumpyArray* r2); + static Status ParseSubTensor(Tensor t, size_t seg_id, size_t max_id, NumpyArray* arr); + static Status ParseTensor(Tensor t, NumpyArray* arr); + private: + Status RunImpl(const std::vector& inputs, PyObject** result); + Status ParseObject(PyObject* arr, NumpyArray* result); + PyObject* func_; +}; + + +} // namespace ps + +#endif // PS_PLUS_COMMON_PYTHON_RUNNER_H_ + diff --git a/xdl/ps-plus/ps-plus/server/udf/rmsprop_updater.cc b/xdl/ps-plus/ps-plus/server/udf/rmsprop_updater.cc new file mode 100644 index 00000000..1ac76561 --- /dev/null +++ b/xdl/ps-plus/ps-plus/server/udf/rmsprop_updater.cc @@ -0,0 +1,87 @@ +/* Copyright (C) 2016-2018 Alibaba Group Holding Limited + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "ps-plus/server/udf/simple_udf.h" +#include "ps-plus/server/slice.h" +#include "ps-plus/common/initializer/constant_initializer.h" +#include "ps-plus/common/hashmap.h" + +namespace ps { +namespace server { +namespace udf { + +using std::vector; + +class RmspropUpdater : public SimpleUdf, vector, vector, vector, vector, vector > { + public: + virtual Status SimpleRun( + UdfContext* ctx, + const vector& sslices, + const vector& grad_tensors, + const vector& learning_rates, + const vector& decays, + const vector& alphas, /* It's called 'momentum' in tf.RMSPropOptimizer, but it is actually a coefficiency. Thus we call it 'alpha'. */ + const vector& epsilons) const { + if (sslices.size() != grad_tensors.size() || sslices.size() != learning_rates.size() || sslices.size() != decays.size() || sslices.size() != alphas.size() || sslices.size() != epsilons.size()) { + return Status::ArgumentError("Rmspropoptimizer: slices and other size not match"); + } + for (size_t si = 0; si < sslices.size(); si++) { + const Slices& slices = sslices[si]; + if (!slices.writable) { + return Status::ArgumentError("slice is not writable"); + } + Tensor* data_tensor = slices.variable->GetData(); + Tensor* acc_tensor = slices.variable->GetVariableLikeSlot("accumulator", data_tensor->Type(), []{ return new initializer::ConstantInitializer(0); }); + Tensor* mom_tensor = slices.variable->GetVariableLikeSlot("momentum", data_tensor->Type(), []{ return new initializer::ConstantInitializer(0); }); + double learning_rate = learning_rates[si]; + double decay = decays[si]; + double alpha = alphas[si]; + double epsilon = epsilons[si]; + const Tensor& grad_tensor = grad_tensors[si]; + + if (grad_tensor.Type() != data_tensor->Type()) { + return Status::ArgumentError("grad should has same datatype with variable"); + } + + CASES(data_tensor->Type(), MultiThreadDo(slices.slice_id.size(), [&](const Range& r) { + for (size_t i = r.begin; i < r.end; i++) { + int64_t slice = slices.slice_id[i]; + if ((int64_t)slice == ps::HashMap::NOT_ADD_ID) { + continue; + } + T* data = data_tensor->Raw(slice); + T* acc = acc_tensor->Raw(slice); + T* mom = mom_tensor->Raw(slice); + T* grad = grad_tensor.Raw(i); + for (size_t j = 0; j < slices.slice_size; j++) { + *acc += (*grad * *grad - *acc) * (1 - decay); + *mom = *mom * alpha + (*grad * learning_rate) / sqrt(*acc + epsilon); + *data -= *mom; + data++; grad++; acc++; mom++; + } + } + return Status::Ok(); + })); + } + return Status::Ok(); + } +}; + +SIMPLE_UDF_REGISTER(RmspropUpdater, RmspropUpdater); + +} +} +} + diff --git a/xdl/ps-plus/ps-plus/server/udf/scalar_integer_logger.cc b/xdl/ps-plus/ps-plus/server/udf/scalar_integer_logger.cc index c6afc2fa..df467e02 100644 --- a/xdl/ps-plus/ps-plus/server/udf/scalar_integer_logger.cc +++ b/xdl/ps-plus/ps-plus/server/udf/scalar_integer_logger.cc @@ -15,27 +15,42 @@ limitations under the License. #include "ps-plus/server/udf/simple_udf.h" #include "ps-plus/server/slice.h" -#include "ps-plus/common/initializer/constant_initializer.h" #include "ps-plus/common/hashmap.h" +#include "ps-plus/common/initializer/constant_initializer.h" namespace ps { namespace server { namespace udf { -class ScalarIntegerLogger : public SimpleUdf { +using std::vector; + +class ScalarIntegerLogger : public SimpleUdf, vector, vector > { public: virtual Status SimpleRun( UdfContext* ctx, - const Slices& slices, - const std::string& slot_name, - const int64_t& pval) const { - Tensor* t = slices.variable->GetVariableLikeSlot(slot_name, DataType::kInt64, TensorShape(), []{ return new initializer::ConstantInitializer(0); }); - int64_t* data = t->Raw(); - int64_t val = pval; - for (size_t slice : slices.slice_id) { - if (slice != (size_t)HashMap::NOT_ADD_ID) { - data[slice] = val; - } + const vector& sslices, + const vector& slot_names, + const vector& pvals) const { + if (sslices.size() != slot_names.size() || sslices.size() != pvals.size()) { + return Status::ArgumentError("ScalarIntegerLogger: slices and other size not match"); + } + for (size_t si = 0; si < sslices.size(); si++) { + const Slices& slices = sslices[si]; + Tensor* data_tensor = slices.variable->GetData(); + std::string slot_name = slot_names[si]; + Tensor* t = slices.variable->GetVariableLikeSlot(slot_name, DataType::kInt64, TensorShape(), []{ return new initializer::ConstantInitializer(0); }); + int64_t val = pvals[si]; + CASES(data_tensor->Type(), MultiThreadDo(slices.slice_id.size(), [&](const Range& r) { + for (size_t i = r.begin; i < r.end; i++) { + int64_t slice = slices.slice_id[i]; + if ((int64_t)slice == ps::HashMap::NOT_ADD_ID) { + continue; + } + int64_t* data = t->Raw(slice); + *data = val; + } + return Status::Ok(); + })); } return Status::Ok(); } diff --git a/xdl/ps-plus/ps-plus/server/udf/simple_udf.h b/xdl/ps-plus/ps-plus/server/udf/simple_udf.h index d2b5d2e8..69f55edc 100644 --- a/xdl/ps-plus/ps-plus/server/udf/simple_udf.h +++ b/xdl/ps-plus/ps-plus/server/udf/simple_udf.h @@ -65,6 +65,7 @@ class SimpleUdf : public Udf { } return ret; } + static constexpr size_t kInputSize = simple_udf_helper::Counter::kInputSize; static constexpr size_t kOutputSize = simple_udf_helper::Counter::kOutputSize; }; @@ -76,5 +77,7 @@ class SimpleUdf : public Udf { #define SIMPLE_UDF_REGISTER(TYPE, NAME) \ UDF_REGISTER(TYPE, NAME, TYPE::kInputSize, TYPE::kOutputSize) +#define CHECK_COUNTER(COUNTER, OK) do { if (--COUNTER == 0) {OK.set_value(true);} return;} while(0); + #endif diff --git a/xdl/ps-plus/ps-plus/server/udf/slice_to_tensor.cc b/xdl/ps-plus/ps-plus/server/udf/slice_to_tensor.cc index c52729ff..a71769fa 100644 --- a/xdl/ps-plus/ps-plus/server/udf/slice_to_tensor.cc +++ b/xdl/ps-plus/ps-plus/server/udf/slice_to_tensor.cc @@ -15,49 +15,55 @@ limitations under the License. #include "ps-plus/server/udf/simple_udf.h" #include "ps-plus/server/slice.h" +#include "ps-plus/common/hashmap.h" namespace ps { namespace server { namespace udf { -class SliceToTensor : public SimpleUdf { - public: - virtual Status SimpleRun(UdfContext* ctx, const TensorSlices& slices, Tensor* result) const { - TensorShape new_shape; - const Tensor* t = &slices.tensor; - if (slices.dim_part < 0) { - *result = slices.tensor; - } else { - std::vector dims(1, slices.slice_size); - if ((size_t)slices.dim_part > t->Shape().Size()) { - return Status::ArgumentError("Slice dim_part Error"); - } - - dims.insert(dims.end(), - t->Shape().Dims().begin() + slices.dim_part, - t->Shape().Dims().end()); - new_shape = TensorShape(dims); - new_shape.Set(0, slices.slice_id.size()); - size_t buf_size = 0; - CASES(t->Type(), { - buf_size = slices.slice_id.size() * slices.slice_size * sizeof(T); - }); - - char* buf = new char[buf_size]; - char* base = t->Raw(); - CASES(t->Type(), { - size_t chunk_size = slices.slice_size * sizeof(T); - for (size_t i = 0; i < slices.slice_id.size(); ++i) { - memcpy(buf + i * chunk_size, - base + slices.slice_id[i] * chunk_size, - chunk_size); - } - }); +using std::vector; - *result = ps::Tensor(t->Type(), new_shape, buf, nullptr); +class SliceToTensor : public SimpleUdf, vector*> { + public: + virtual Status SimpleRun(UdfContext* ctx, const vector& sslices, vector* results) const { + static char zero_buffer[1<<16] = {0}; + results->resize(sslices.size()); + std::promise ok; + Status status = Status::Ok(); + std::atomic counter(sslices.size()); + for (size_t si = 0; si < sslices.size(); si++) { + ThreadPool::Global()->Schedule([&, si]{ + const Slices& slices = sslices[si]; + const Tensor& t = *(slices.variable->GetData()); + if (slices.dim_part < 0) { + (*results)[si] = t; + } else { + if ((size_t)slices.dim_part > t.Shape().Size()) { + status = Status::ArgumentError("Slice dim_part Error"); + CHECK_COUNTER(counter, ok); + } + std::vector dims(1, slices.slice_id.size()); + for (size_t i = slices.dim_part; i < t.Shape().Dims().size(); i++) { + dims.push_back(t.Shape()[i]); + } + Tensor result(t.Type(), TensorShape{dims}, t.GetInitializer()->Clone(), ps::Tensor::TType::kContinuous, false); + CASES(t.Type(), { + size_t chunk_size = slices.slice_size * sizeof(T); + for (size_t i = 0; i < slices.slice_id.size(); ++i) { + int64_t slice = slices.slice_id[i]; + if ((int64_t)slice == ps::HashMap::NOT_ADD_ID) { + memcpy(result.Raw(i), zero_buffer, chunk_size); + } else { + memcpy(result.Raw(i), t.Raw(slice), chunk_size); + } + }}); + (*results)[si] = result; + } + CHECK_COUNTER(counter, ok); + }); } - - return Status::Ok(); + ok.get_future().wait(); + return status; } }; diff --git a/xdl/ps-plus/ps-plus/server/udf/statis_slice.cc b/xdl/ps-plus/ps-plus/server/udf/statis_slice.cc new file mode 100644 index 00000000..8d0a8451 --- /dev/null +++ b/xdl/ps-plus/ps-plus/server/udf/statis_slice.cc @@ -0,0 +1,120 @@ +/* Copyright (C) 2016-2018 Alibaba Group Holding Limited + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include +#include + +#include "ps-plus/common/hashmap.h" +#include "ps-plus/common/initializer/constant_initializer.h" +#include "ps-plus/server/udf/simple_udf.h" +#include "ps-plus/server/slice.h" + +namespace ps { +namespace server { +namespace udf { + +class StatisSlice : public SimpleUdf, std::vector, Tensor, Tensor, Tensor, + std::string, std::vector*> { + public: + /* + * S[0] = a[0] + * S[N] = a[N] + decay * S[N-1] + * = a[N] + decay*a[N-1] + decay^2*a[N-2] + ... + decay^(N-1)*a[1] + decay^N*a[0] + * = decay^N * sum { decay^(-j) * a[j] } + * + * N = gs / period + * K = decay^(N-offset) + * acc = sum { decay^(offset-j) * a[j] } + * data = K * acc + */ + virtual Status SimpleRun(UdfContext* ctx, + const std::vector& slices, + const std::vector& clicks, + const Tensor& global_step, + const Tensor& statis_decay, + const Tensor& statis_decay_period, + const std::string& statis_type, + std::vector* result) const { + int64_t gs = *global_step.Raw(); + float decay = (float) *statis_decay.Raw(); + int64_t period = *statis_decay_period.Raw(); + int64_t N = gs / period; + static int64_t N_begin = N; + static int64_t step = int64_t(logf(1e-30) / logf(decay)); + static int64_t offset = (N_begin / step) * step; + static std::mutex mutex; + if (N - offset > step) { + std::lock_guard lock(mutex); + while (N - offset > step) { + offset += step; + UpdateOffset(slices, decay, step); + } + } + float K = powf(decay, N - offset); + result->resize(slices.size()); // number of variables + for (size_t si = 0; si < slices.size(); ++si) { + const Slices& slice = slices[si]; + Tensor* data_tensor = slice.variable->GetData(); + Tensor* acc_tensor = slice.variable->GetVariableLikeSlot(slice.variable->GetName() + "_ACC", data_tensor->Type(), + []{ return new initializer::ConstantInitializer(0); }); + Statis(slice, clicks[si], decay, offset, N, K, acc_tensor, data_tensor); + (*result)[si].slice_size = slice.slice_size; + (*result)[si].slice_id = slice.slice_id; + (*result)[si].dim_part = slice.dim_part; + (*result)[si].tensor = *data_tensor; + } + return Status::Ok(); + } + + private: + inline void Statis(const Slices& slice, const Tensor& click, float decay, int64_t offset, int64_t N, float K, + Tensor* acc_tensor, Tensor* data_tensor) const { + int32_t* pclick = click.Raw(); + CASES(data_tensor->Type(), MultiThreadDo(slice.slice_id.size(), [&](const Range& r) { + for (size_t i = r.begin; i < r.end; ++i) { + size_t s = slice.slice_id[i]; + if (s == ps::HashMap::NOT_ADD_ID) continue; + T* acc = acc_tensor->Raw(s); + T* data = data_tensor->Raw(s); + *acc += pclick[i] * powf(decay, offset - N); + *data = K * (*acc); + } + return Status::Ok(); + })); + } + + inline void UpdateOffset(const std::vector& slices, float decay, int64_t step) const { + for (size_t si = 0; si < slices.size(); ++si) { + const Slices& slice = slices[si]; + Tensor* data_tensor = slice.variable->GetData(); + Tensor* acc_tensor = slice.variable->GetVariableLikeSlot(slice.variable->GetName() + "_ACC", data_tensor->Type(), + []{ return new initializer::ConstantInitializer(0); }); + CASES(data_tensor->Type(), MultiThreadDo(acc_tensor->Shape().NumElements(), [&](const Range& r) { + for (size_t i = r.begin; i < r.end; ++i) { + T* acc = acc_tensor->Raw(i); + *acc *= powf(decay, step); + } + return Status::Ok(); + })); + } + } +}; + +SIMPLE_UDF_REGISTER(StatisSlice, StatisSlice); + +} +} +} + diff --git a/xdl/ps-plus/ps-plus/server/udf/test/adagrad_updater_test.cc b/xdl/ps-plus/ps-plus/server/udf/test/adagrad_updater_test.cc index 730a82c1..fe57ca90 100644 --- a/xdl/ps-plus/ps-plus/server/udf/test/adagrad_updater_test.cc +++ b/xdl/ps-plus/ps-plus/server/udf/test/adagrad_updater_test.cc @@ -13,6 +13,7 @@ See the License for the specific language governing permissions and limitations under the License. ==============================================================================*/ +#include #include "gtest/gtest.h" #include "ps-plus/common/data.h" #include "ps-plus/server/udf.h" @@ -33,27 +34,34 @@ using ps::Tensor; using ps::Data; using ps::WrapperData; using ps::HashMap; +using ps::Status; TEST(AdagradUpdater, AdagradUpdater) { UdfRegistry* udf_registry = UdfRegistry::Get("AdagradUpdater"); Udf* udf = udf_registry->Build(std::vector({0, 1, 2, 3}), std::vector({})); UdfContext* ctx = new UdfContext; - Variable* var = new Variable(new Tensor(DataType::kFloat, TensorShape({4, 8}), new ConstantInitializer(5)), nullptr); + Variable* var = new Variable(new Tensor(DataType::kFloat, TensorShape({4, 8}), new ConstantInitializer(5)), nullptr, ""); ctx->SetVariable(var); - Slices slices{.slice_size = 8, .slice_id = std::vector({0, 2}), .dim_part = -1, .variable = var, .writable = true}; - ctx->SetData(0, new WrapperData(slices), true); - ctx->SetData(1, new WrapperData(DataType::kFloat, TensorShape({2, 8}), new ConstantInitializer(2)), true); - ctx->SetData(2, new WrapperData(3), true); - ctx->SetData(3, new WrapperData(5), true); + std::vector sv; + sv.push_back(Slices{.slice_size = 8, .slice_id = std::vector({0, 2}), .dim_part = 1, .variable = var, .writable = true}); + ctx->SetData(0, new WrapperData >(sv), true); + std::vector tv; + tv.push_back(Tensor(DataType::kFloat, TensorShape({2, 8}), new ConstantInitializer(2))); + ctx->SetData(1, new WrapperData >(tv), true); + ctx->SetData(2, new WrapperData >(std::vector{3}), true); + ctx->SetData(3, new WrapperData >(std::vector{5}), true); - EXPECT_TRUE(udf->Run(ctx).IsOk()); + Status status = udf->Run(ctx); + EXPECT_TRUE(status.IsOk()); for (size_t i = 0; i < 8; i++) { EXPECT_EQ(3, var->GetData()->Raw()[i]); EXPECT_EQ(3, var->GetData()->Raw()[i + 16]); EXPECT_EQ(5, var->GetData()->Raw()[i + 8]); EXPECT_EQ(5, var->GetData()->Raw()[i + 24]); } - ctx->SetData(1, new WrapperData(DataType::kFloat, TensorShape({2, 8}), new ConstantInitializer(4)), true); + std::vector tv2; + tv2.push_back(Tensor(DataType::kFloat, TensorShape({2, 8}), new ConstantInitializer(4))); + ctx->SetData(1, new WrapperData >(tv2), true); EXPECT_TRUE(udf->Run(ctx).IsOk()); for (size_t i = 0; i < 8; i++) { EXPECT_FLOAT_EQ(0.6, var->GetData()->Raw()[i]); @@ -61,9 +69,9 @@ TEST(AdagradUpdater, AdagradUpdater) { EXPECT_EQ(5, var->GetData()->Raw()[i + 8]); EXPECT_EQ(5, var->GetData()->Raw()[i + 24]); } - - Slices slices2{.slice_size = 8, .slice_id = std::vector({(size_t)ps::HashMap::NOT_ADD_ID, 1}), .dim_part = -1, .variable = var, .writable = true}; - ctx->SetData(0, new WrapperData(slices2), true); + std::vector slices2; + slices2.push_back(Slices{.slice_size = 8, .slice_id = std::vector({(size_t)ps::HashMap::NOT_ADD_ID, 1}), .dim_part = -1, .variable = var, .writable = true}); + ctx->SetData(0, new WrapperData >(slices2), true); EXPECT_TRUE(udf->Run(ctx).IsOk()); for (size_t i = 0; i < 8; i++) { EXPECT_FLOAT_EQ(0.6, var->GetData()->Raw()[i]); @@ -71,14 +79,113 @@ TEST(AdagradUpdater, AdagradUpdater) { EXPECT_FLOAT_EQ(2.381385, var->GetData()->Raw()[i + 8]); EXPECT_EQ(5, var->GetData()->Raw()[i + 24]); } - Slices slices3{.slice_size = 8, .slice_id = std::vector({(size_t)ps::HashMap::NOT_ADD_ID, 1}), .dim_part = -1, .variable = var, .writable = false}; - ctx->SetData(0, new WrapperData(slices3), true); - EXPECT_FALSE(udf->Run(ctx).IsOk()); - ctx->SetData(0, new WrapperData(slices2), true); - ctx->SetData(1, new WrapperData(DataType::kDouble, TensorShape({2, 8}), new ConstantInitializer(2)), true); - EXPECT_FALSE(udf->Run(ctx).IsOk()); + std::vector slices3; + slices3.push_back(Slices{.slice_size = 8, .slice_id = std::vector({(size_t)ps::HashMap::NOT_ADD_ID, 1}), .dim_part = -1, .variable = var, .writable = false}); + ctx->SetData(0, new WrapperData >(slices3), true); + status = udf->Run(ctx); + EXPECT_FALSE(status.IsOk()); + EXPECT_EQ(status.Msg(), "slice is not writable"); + + ctx->SetData(0, new WrapperData >(slices2), true); + std::vector vt3(1, Tensor(DataType::kDouble, TensorShape({2, 8}), new ConstantInitializer(2))); + ctx->SetData(1, new WrapperData >(vt3), true); + status = udf->Run(ctx); + EXPECT_FALSE(status.IsOk()); + EXPECT_EQ(status.Msg(), "grad should has same datatype with variable"); delete var; delete ctx; delete udf; } +TEST(AdagradUpdater, AdagradUpdaterForHash) { + UdfRegistry* udf_registry = UdfRegistry::Get("AdagradUpdater"); + Udf* udf = udf_registry->Build(std::vector({0, 1, 2, 3}), std::vector({})); + UdfContext* ctx = new UdfContext; + ps::server::StorageManager* manager = new ps::server::StorageManager(); + Variable* var0 = new Variable(new Tensor(DataType::kFloat, TensorShape({4, 8}), new ConstantInitializer(5), Tensor::TType::kSegment, true), nullptr, ""); + Variable* var1 = new Variable(new Tensor(DataType::kFloat, TensorShape({4, 8}), new ConstantInitializer(1), Tensor::TType::kContinuous, true), nullptr, ""); + EXPECT_TRUE(manager->Set("var0", [var0](){return var0;}).IsOk()); + EXPECT_TRUE(manager->Set("var1", [var1](){return var1;}).IsOk()); + std::vector slices; + slices.push_back(Slices{.slice_size = 8, .slice_id = std::vector({0, 2}), .dim_part = -1, .variable = var0, .writable = true}); + slices.push_back(Slices{.slice_size = 8, .slice_id = std::vector({1, 2}), .dim_part = -1, .variable = var1, .writable = true}); + ctx->SetData(0, new WrapperData >(slices), true); + std::vector grads; + grads.push_back(Tensor(DataType::kFloat, TensorShape({2, 8}), new ConstantInitializer(2))); + grads.push_back(Tensor(DataType::kFloat, TensorShape({2, 8}), new ConstantInitializer(1))); + ctx->SetData(1, new WrapperData >(grads), true); + ctx->SetData(2, new WrapperData >(std::vector{3, 4}), true); + ctx->SetData(3, new WrapperData >(std::vector{5, 3}), true); + EXPECT_TRUE(udf->Run(ctx).IsOk()); + for (size_t i = 0; i < 8; i++) { + EXPECT_EQ(3, *(var0->GetData()->Raw(0) + i)); + EXPECT_EQ(3, *(var0->GetData()->Raw(2) + i)); + EXPECT_EQ(5, *(var0->GetData()->Raw(1) + i)); + EXPECT_EQ(5, *(var0->GetData()->Raw(3) + i)); + + EXPECT_EQ(-1, *(var1->GetData()->Raw(1) + i)); + EXPECT_EQ(-1, *(var1->GetData()->Raw(2) + i)); + EXPECT_EQ(1, *(var1->GetData()->Raw(0) + i)); + EXPECT_EQ(1, *(var1->GetData()->Raw(3) + i)); + } + + std::vector grads2; + grads2.push_back(Tensor(DataType::kFloat, TensorShape({2, 8}), new ConstantInitializer(4))); + grads2.push_back(Tensor(DataType::kFloat, TensorShape({2, 8}), new ConstantInitializer(3))); + ctx->SetData(1, new WrapperData >(grads2), true); + + EXPECT_TRUE(udf->Run(ctx).IsOk()); + for (size_t i = 0; i < 8; i++) { + EXPECT_FLOAT_EQ(0.6, *(var0->GetData()->Raw(0) + i)); + EXPECT_FLOAT_EQ(0.6, *(var0->GetData()->Raw(2) + i)); + EXPECT_FLOAT_EQ(5, *(var0->GetData()->Raw(1) + i)); + EXPECT_FLOAT_EQ(5, *(var0->GetData()->Raw(3) + i)); + + EXPECT_FLOAT_EQ(-4.3282, *(var1->GetData()->Raw(1) + i)); + EXPECT_FLOAT_EQ(-4.3282, *(var1->GetData()->Raw(2) + i)); + EXPECT_FLOAT_EQ(1, *(var1->GetData()->Raw(0) + i)); + EXPECT_FLOAT_EQ(1, *(var1->GetData()->Raw(3) + i)); + } + std::vector slices2; + slices2.push_back(Slices{.slice_size = 8, .slice_id = std::vector({(size_t)ps::HashMap::NOT_ADD_ID, 1}), .dim_part = -1, .variable = var0, .writable = true}); + slices2.push_back(Slices{.slice_size = 8, .slice_id = std::vector({(size_t)ps::HashMap::NOT_ADD_ID, 1}), .dim_part = -1, .variable = var1, .writable = true}); + ctx->SetData(0, new WrapperData >(slices2), true); + EXPECT_TRUE(udf->Run(ctx).IsOk()); + for (size_t i = 0; i < 8; i++) { + EXPECT_FLOAT_EQ(0.6, *(var0->GetData()->Raw(0) + i)); + EXPECT_FLOAT_EQ(0.6, *(var0->GetData()->Raw(2) + i)); + EXPECT_FLOAT_EQ(2.381385, *(var0->GetData()->Raw(1) + i)); + EXPECT_FLOAT_EQ(5, *(var0->GetData()->Raw(3) + i)); + + EXPECT_FLOAT_EQ(-6.88661, *(var1->GetData()->Raw(1) + i)); + EXPECT_FLOAT_EQ(-4.3282, *(var1->GetData()->Raw(2) + i)); + EXPECT_FLOAT_EQ(1, *(var1->GetData()->Raw(0) + i)); + EXPECT_FLOAT_EQ(1, *(var1->GetData()->Raw(3) + i)); + } + std::vector slices3; + slices3.push_back(Slices{.slice_size = 8, .slice_id = std::vector({(size_t)ps::HashMap::NOT_ADD_ID, 1}), .dim_part = -1, .variable = var0, .writable = false}); + slices3.push_back(Slices{.slice_size = 8, .slice_id = std::vector({(size_t)ps::HashMap::NOT_ADD_ID, 1}), .dim_part = -1, .variable = var1, .writable = true}); + ctx->SetData(0, new WrapperData >(slices3), true); + Status status = udf->Run(ctx); + EXPECT_FALSE(status.IsOk()); + EXPECT_EQ(status.Msg(), "slice is not writable"); + + ctx->SetData(0, new WrapperData >(slices2), true); + std::vector grad3; + grad3.push_back(Tensor(DataType::kDouble, TensorShape({2, 8}), new ConstantInitializer(2))); + grad3.push_back(Tensor(DataType::kFloat, TensorShape({2, 8}), new ConstantInitializer(2))); + ctx->SetData(1, new WrapperData >(grad3), true); + status = udf->Run(ctx); + EXPECT_FALSE(status.IsOk()); + EXPECT_EQ(status.Msg(), "grad should has same datatype with variable"); + + std::vector grad4; + grad4.push_back(Tensor(DataType::kFloat, TensorShape({2, 8}), new ConstantInitializer(2))); + ctx->SetData(1, new WrapperData >(grad4), true); + status = udf->Run(ctx); + EXPECT_FALSE(status.IsOk()); + EXPECT_EQ(status.Msg(), "AdagradUpdater: slices and other size not match"); + delete manager; + delete ctx; + delete udf; +} diff --git a/xdl/ps-plus/ps-plus/server/udf/test/adam_updater_test.cc b/xdl/ps-plus/ps-plus/server/udf/test/adam_updater_test.cc index 4687fb77..8def91e4 100644 --- a/xdl/ps-plus/ps-plus/server/udf/test/adam_updater_test.cc +++ b/xdl/ps-plus/ps-plus/server/udf/test/adam_updater_test.cc @@ -33,53 +33,64 @@ using ps::Tensor; using ps::Data; using ps::WrapperData; using ps::HashMap; +using std::vector; TEST(AdamUpdater, AdamUpdater) { UdfRegistry* udf_registry = UdfRegistry::Get("AdamUpdater"); Udf* udf = udf_registry->Build(std::vector({0, 1, 2, 3, 4, 5, 6}), std::vector({})); UdfContext* ctx = new UdfContext; - Variable* var = new Variable(new Tensor(DataType::kFloat, TensorShape({4, 8}), new ConstantInitializer(5)), nullptr); - ctx->SetVariable(var); - Slices slices{.slice_size = 8, .slice_id = std::vector({0, 2}), .dim_part = -1, .variable = var, .writable = true}; - ctx->SetData(0, new WrapperData(slices), true); - ctx->SetData(1, new WrapperData(DataType::kFloat, TensorShape({2, 8}), new ConstantInitializer(2)), true); - ctx->SetData(2, new WrapperData(2), true); - ctx->SetData(3, new WrapperData(0.5), true); - ctx->SetData(4, new WrapperData(0.9), true); - ctx->SetData(5, new WrapperData(0.8), true); - ctx->SetData(6, new WrapperData(true), true); + Variable* var = new Variable(new Tensor(DataType::kFloat, TensorShape({4, 8}), new ConstantInitializer(5), true, 1), nullptr, ""); - EXPECT_TRUE(udf->Run(ctx).IsOk()); + vector slices(1, Slices{.slice_size = 8, .slice_id = std::vector({0, 2}), .dim_part = 1, .variable = var, .writable = true}); + vector grad(1, Tensor(DataType::kFloat, TensorShape({2, 8}), new ConstantInitializer(2))); + ctx->SetData(0, new WrapperData >(slices), true); + ctx->SetData(1, new WrapperData >(grad), true); + ctx->SetData(2, new WrapperData >(vector{2}), true); + ctx->SetData(3, new WrapperData >(vector{0.5}), true); + ctx->SetData(4, new WrapperData >(vector{0.9}), true); + ctx->SetData(5, new WrapperData >(vector{0.8}), true); + ctx->SetData(6, new WrapperData >(vector{true}), true); + + ps::Status status = udf->Run(ctx); + EXPECT_TRUE(status.IsOk()); for (size_t i = 0; i < 8; i++) { - EXPECT_FLOAT_EQ(3.71714, var->GetData()->Raw()[i]); - EXPECT_FLOAT_EQ(3.71714, var->GetData()->Raw()[i + 16]); - EXPECT_EQ(5, var->GetData()->Raw()[i + 8]); - EXPECT_EQ(5, var->GetData()->Raw()[i + 24]); + EXPECT_FLOAT_EQ(3.71714, *(var->GetData()->Raw(0) + i)); + EXPECT_FLOAT_EQ(3.71714, *(var->GetData()->Raw(2) + i)); + EXPECT_EQ(5, *(var->GetData()->Raw(1) + i)); + EXPECT_EQ(5, *(var->GetData()->Raw(3) + i)); } - ctx->SetData(1, new WrapperData(DataType::kFloat, TensorShape({2, 8}), new ConstantInitializer(1)), true); + + vector grad2(1, Tensor(DataType::kFloat, TensorShape({2, 8}), new ConstantInitializer(1))); + ctx->SetData(1, new WrapperData >(grad2), true); EXPECT_TRUE(udf->Run(ctx).IsOk()); for (size_t i = 0; i < 8; i++) { - EXPECT_FLOAT_EQ(2.46871, var->GetData()->Raw()[i]); - EXPECT_FLOAT_EQ(2.46871, var->GetData()->Raw()[i + 16]); - EXPECT_EQ(5, var->GetData()->Raw()[i + 8]); - EXPECT_EQ(5, var->GetData()->Raw()[i + 24]); + EXPECT_FLOAT_EQ(2.46871, *(var->GetData()->Raw(0) + i)); + EXPECT_FLOAT_EQ(2.46871, *(var->GetData()->Raw(2) + i)); + EXPECT_EQ(5, *(var->GetData()->Raw(1) + i)); + EXPECT_EQ(5, *(var->GetData()->Raw(3) + i)); } - Slices slices2{.slice_size = 8, .slice_id = std::vector({(size_t)ps::HashMap::NOT_ADD_ID, 1}), .dim_part = -1, .variable = var, .writable = true}; - ctx->SetData(0, new WrapperData(slices2), true); + vector slices2(1, Slices{.slice_size = 8, .slice_id = std::vector({(size_t)ps::HashMap::NOT_ADD_ID, 1}), .dim_part = -1, .variable = var, .writable = true}); + ctx->SetData(0, new WrapperData >(slices2), true); EXPECT_TRUE(udf->Run(ctx).IsOk()); for (size_t i = 0; i < 8; i++) { - EXPECT_FLOAT_EQ(2.46871, var->GetData()->Raw()[i]); - EXPECT_FLOAT_EQ(2.46871, var->GetData()->Raw()[i + 16]); - EXPECT_FLOAT_EQ(4.45572, var->GetData()->Raw()[i + 8]); - EXPECT_EQ(5, var->GetData()->Raw()[i + 24]); - } - Slices slices3{.slice_size = 8, .slice_id = std::vector({(size_t)ps::HashMap::NOT_ADD_ID, 1}), .dim_part = -1, .variable = var, .writable = false}; - ctx->SetData(0, new WrapperData(slices3), true); - EXPECT_FALSE(udf->Run(ctx).IsOk()); - ctx->SetData(0, new WrapperData(slices2), true); - ctx->SetData(1, new WrapperData(DataType::kDouble, TensorShape({2, 8}), new ConstantInitializer(2)), true); - EXPECT_FALSE(udf->Run(ctx).IsOk()); + EXPECT_FLOAT_EQ(2.46871, *(var->GetData()->Raw(0) + i)); + EXPECT_FLOAT_EQ(2.46871, *(var->GetData()->Raw(2) + i)); + EXPECT_FLOAT_EQ(4.45572, *(var->GetData()->Raw(1) + i)); + EXPECT_EQ(5, *(var->GetData()->Raw(3) + i)); + } + + vector slices3(1, Slices{.slice_size = 8, .slice_id = std::vector({(size_t)ps::HashMap::NOT_ADD_ID, 1}), .dim_part = -1, .variable = var, .writable = false}); + ctx->SetData(0, new WrapperData >(slices3), true); + status = udf->Run(ctx); + EXPECT_FALSE(status.IsOk()); + EXPECT_EQ(status.Msg(), "slice is not writable"); + ctx->SetData(0, new WrapperData >(slices2), true); + vector grad3(1, Tensor(DataType::kDouble, TensorShape({2, 8}), new ConstantInitializer(2))); + ctx->SetData(1, new WrapperData >(grad3), true); + status = udf->Run(ctx); + EXPECT_FALSE(status.IsOk()); + EXPECT_EQ(status.Msg(), "grad should has same datatype with variable"); delete var; delete ctx; delete udf; diff --git a/xdl/ps-plus/ps-plus/server/udf/test/adaptive_revision_pull_updater_test.cc b/xdl/ps-plus/ps-plus/server/udf/test/adaptive_revision_pull_updater_test.cc index 0404e2a3..21ce7c06 100644 --- a/xdl/ps-plus/ps-plus/server/udf/test/adaptive_revision_pull_updater_test.cc +++ b/xdl/ps-plus/ps-plus/server/udf/test/adaptive_revision_pull_updater_test.cc @@ -33,15 +33,16 @@ using ps::Tensor; using ps::Data; using ps::WrapperData; using ps::HashMap; +using std::vector; TEST(AdaptiveRevisionPullUpdater, AdaptiveRevisionPullUpdater) { UdfRegistry* udf_registry = UdfRegistry::Get("AdaptiveRevisionPullUpdater"); Udf* udf = udf_registry->Build(std::vector({0, 1, 2}), std::vector({})); UdfContext* ctx = new UdfContext; - Variable* var = new Variable(new Tensor(DataType::kFloat, TensorShape({4, 8}), new ConstantInitializer(5)), nullptr); + Variable* var = new Variable(new Tensor(DataType::kFloat, TensorShape({4, 8}), new ConstantInitializer(5), true, 1), nullptr, ""); ctx->SetVariable(var); - Slices slices{.slice_size = 8, .slice_id = std::vector({0, 2}), .dim_part = -1, .variable = var, .writable = true}; - ctx->SetData(0, new WrapperData(slices), true); + vector slices(1, Slices{.slice_size = 8, .slice_id = std::vector({0, 2}), .dim_part = -1, .variable = var, .writable = true}); + ctx->SetData(0, new WrapperData >(slices), true); ctx->SetData(1, new WrapperData(5), true); ctx->SetData(2, new WrapperData(2), true); @@ -51,15 +52,15 @@ TEST(AdaptiveRevisionPullUpdater, AdaptiveRevisionPullUpdater) { EXPECT_TRUE(var->GetExistSlot("g", &g).IsOk()); EXPECT_TRUE(var->GetExistSlot("g_old", &g_old).IsOk()); EXPECT_EQ(2, g->Shape().Size()); - EXPECT_EQ(4, g->Shape()[0]); + EXPECT_EQ(Tensor::DEFAULT_SEGMENT_SIZE, g->Shape()[0]); EXPECT_EQ(8, g->Shape()[1]); EXPECT_EQ(3, g_old->Shape().Size()); EXPECT_EQ(5, g_old->Shape()[0]); EXPECT_EQ(4, g_old->Shape()[1]); EXPECT_EQ(8, g_old->Shape()[2]); - Slices slices1{.slice_size = 8, .slice_id = std::vector({0, 2}), .dim_part = -1, .variable = var, .writable = false}; - ctx->SetData(0, new WrapperData(slices1), true); + vector slices2(1, Slices{.slice_size = 8, .slice_id = std::vector({0, 2}), .dim_part = -1, .variable = var, .writable = false}); + ctx->SetData(0, new WrapperData >(slices2), true); EXPECT_FALSE(udf->Run(ctx).IsOk()); delete var; diff --git a/xdl/ps-plus/ps-plus/server/udf/test/aggregate_slice_test.cc b/xdl/ps-plus/ps-plus/server/udf/test/aggregate_slice_test.cc index 26eba377..45290ba9 100644 --- a/xdl/ps-plus/ps-plus/server/udf/test/aggregate_slice_test.cc +++ b/xdl/ps-plus/ps-plus/server/udf/test/aggregate_slice_test.cc @@ -38,78 +38,95 @@ using ps::ThreadPool; using ps::Status; using std::cout; using std::endl; +using std::vector; TEST(AggregateSlice, AggregateSliceSparse) { UdfRegistry* udf_registry = UdfRegistry::Get("AggregateSlice"); - Udf* udf = udf_registry->Build(std::vector({0, 1, 2, 3}), std::vector({0, 1})); + Udf* udf = udf_registry->Build(vector({0, 1, 2, 3}), vector({4, 5})); UdfContext* ctx = new UdfContext; - Variable* var = new Variable(new Tensor(DataType::kFloat, TensorShape({4, 8}), new ConstantInitializer(0.0), true), nullptr); - Slices slices{.slice_size = 8, .slice_id = std::vector({0, 2}), .dim_part = 1, .variable = var, .writable = true}; - ctx->SetData(0, new WrapperData(slices), true); + Variable* var = new Variable(new Tensor(DataType::kFloat, TensorShape({4, 8}), new ConstantInitializer(0.0), Tensor::TType::kSegment, true), nullptr, "var"); + ctx->SetVariableName("var"); + vector slices(1, Slices{.slice_size = 8, .slice_id = vector({3, 5}), .dim_part = 1, .variable = var, .writable = true}); + vector grad(1, Tensor(DataType::kFloat, TensorShape({2, 8}), new ConstantInitializer(1.0))); + ctx->SetData(0, new WrapperData >(slices), true); ctx->SetData(1, new WrapperData(1), true); ctx->SetData(2, new WrapperData(3), true); - ctx->SetData(3, new WrapperData(DataType::kFloat, TensorShape({2, 8}), new ConstantInitializer(1.0), true), true); + ctx->SetData(3, new WrapperData >(grad), true); ctx->SetVariable(var); Data* output; - EXPECT_TRUE(udf->Run(ctx).IsOk()); - EXPECT_TRUE(ctx->GetData(0, &output).IsOk()); - Slices& out_slices = dynamic_cast*>(output)->Internal(); - EXPECT_EQ(8ul, out_slices.slice_size); - EXPECT_EQ(0ul, out_slices.slice_id.size()); - EXPECT_EQ(1, out_slices.dim_part); - EXPECT_TRUE(ctx->GetData(1, &output).IsOk()); - Tensor& out_grad = dynamic_cast*>(output)->Internal(); - EXPECT_EQ(0ul, out_grad.Shape().NumElements()); - - Slices slices1{.slice_size = 8, .slice_id = std::vector({1, 2}), .dim_part = 1, .variable = var, .writable = true}; - ctx->SetData(0, new WrapperData(slices1), true); + EXPECT_TRUE(ctx->GetData(4, &output).IsOk()); + vector& out_slices = dynamic_cast >*>(output)->Internal(); + EXPECT_EQ(1ul, out_slices.size()); + EXPECT_EQ(8ul, out_slices[0].slice_size); + EXPECT_EQ(0ul, out_slices[0].slice_id.size()); + EXPECT_EQ(1, out_slices[0].dim_part); + ASSERT_TRUE(ctx->GetData(5, &output).IsOk()); + vector& out_grad = dynamic_cast >*>(output)->Internal(); + ASSERT_EQ(1ul, out_grad.size()); + EXPECT_TRUE(out_grad[0].Shape().IsScalar()); + + vector slices1(1, Slices{.slice_size = 8, .slice_id = std::vector({4, 5}), .dim_part = 1, .variable = var, .writable = true}); + vector grad1(1, Tensor(DataType::kFloat, TensorShape({2, 8}), new ConstantInitializer(2.0))); + ctx->SetData(0, new WrapperData >(slices1), true); ctx->SetData(1, new WrapperData(1), true); ctx->SetData(2, new WrapperData(3), true); - ctx->SetData(3, new WrapperData(DataType::kFloat, TensorShape({2, 8}), new ConstantInitializer(2.0), true), true); + ctx->SetData(3, new WrapperData >(grad1), true); EXPECT_TRUE(udf->Run(ctx).IsOk()); - EXPECT_TRUE(ctx->GetData(0, &output).IsOk()); - Slices& out_slices1 = dynamic_cast*>(output)->Internal(); - EXPECT_EQ(8ul, out_slices1.slice_size); - EXPECT_EQ(0ul, out_slices1.slice_id.size()); - EXPECT_EQ(1, out_slices1.dim_part); - EXPECT_TRUE(ctx->GetData(1, &output).IsOk()); - Tensor& out_grad1 = dynamic_cast*>(output)->Internal(); - EXPECT_EQ(0ul, out_grad1.Shape().NumElements()); - - Slices slices2{.slice_size = 8, .slice_id = std::vector({0}), .dim_part = 1, .variable = var, .writable = true}; - ctx->SetData(0, new WrapperData(slices2), true); + EXPECT_TRUE(ctx->GetData(4, &output).IsOk()); + vector& out_slices1 = dynamic_cast >*>(output)->Internal(); + EXPECT_EQ(1ul, out_slices1.size()); + EXPECT_EQ(8ul, out_slices1[0].slice_size); + EXPECT_EQ(0ul, out_slices1[0].slice_id.size()); + EXPECT_EQ(1, out_slices1[0].dim_part); + EXPECT_TRUE(ctx->GetData(5, &output).IsOk()); + vector& out_grad1 = dynamic_cast >*>(output)->Internal(); + EXPECT_EQ(1ul, out_grad1.size()); + EXPECT_TRUE(out_grad1[0].Shape().IsScalar()); + + vector slices2(1, Slices{.slice_size = 8, .slice_id = std::vector({3}), .dim_part = 1, .variable = var, .writable = true}); + vector grad2(1, Tensor(DataType::kFloat, TensorShape({1, 8}), new ConstantInitializer(3.0))); + ctx->SetData(0, new WrapperData >(slices2), true); ctx->SetData(1, new WrapperData(1), true); ctx->SetData(2, new WrapperData(3), true); - ctx->SetData(3, new WrapperData(DataType::kFloat, TensorShape({1, 8}), new ConstantInitializer(3.0), true), true); + ctx->SetData(3, new WrapperData >(grad2), true); EXPECT_TRUE(udf->Run(ctx).IsOk()); - EXPECT_TRUE(ctx->GetData(0, &output).IsOk()); - Slices& out_slices2 = dynamic_cast*>(output)->Internal(); - EXPECT_EQ(8ul, out_slices2.slice_size); - EXPECT_EQ(3ul, out_slices2.slice_id.size()); - for (size_t i = 0; i < 3; i++) { - EXPECT_EQ(i, out_slices2.slice_id[i]); - } - EXPECT_EQ(1, out_slices.dim_part); - EXPECT_TRUE(ctx->GetData(1, &output).IsOk()); - Tensor& out_grad2 = dynamic_cast*>(output)->Internal(); - EXPECT_EQ(24ul, out_grad2.Shape().NumElements()); - for (size_t i = 0; i < 8; i++) { - EXPECT_FLOAT_EQ(2, out_grad2.Raw()[i]); - EXPECT_FLOAT_EQ(2, out_grad2.Raw()[i + 8]); - EXPECT_FLOAT_EQ(1.5, out_grad2.Raw()[i + 16]); + EXPECT_TRUE(ctx->GetData(4, &output).IsOk()); + vector& out_slices2 = dynamic_cast >*>(output)->Internal(); + EXPECT_EQ(1, out_slices2.size()); + EXPECT_EQ(8ul, out_slices2[0].slice_size); + ASSERT_EQ(3ul, out_slices2[0].slice_id.size()); + EXPECT_EQ(12, out_slices2[0].slice_id[0] + out_slices2[0].slice_id[1] + out_slices2[0].slice_id[2]); + EXPECT_EQ(1, out_slices[0].dim_part); + EXPECT_TRUE(ctx->GetData(5, &output).IsOk()); + vector& out_grad2 = dynamic_cast >*>(output)->Internal(); + EXPECT_EQ(24ul, out_grad2[0].Shape().NumElements()); + for (size_t j = 0; j < 3; j++) { + if (out_slices2[0].slice_id[j] == 3) { + for (size_t i = 0; i < 8; i++) { + EXPECT_FLOAT_EQ(4/3.0, *(out_grad2[0].Raw(j) + i)); + } + } else if (out_slices2[0].slice_id[j] == 4) { + for (size_t i = 0; i < 8; i++) { + EXPECT_FLOAT_EQ(2/3.0, *(out_grad2[0].Raw(j) + i)); + } + } else { + for (size_t i = 0; i < 8; i++) { + EXPECT_FLOAT_EQ(1, *(out_grad2[0].Raw(j) + i)); + } + } } - - Slices slices3{.slice_size = 8, .slice_id = std::vector({}), .dim_part = 1, .variable = var, .writable = true}; - ctx->SetData(0, new WrapperData(slices3), true); + + vector slices3(1, Slices{.slice_size = 8, .slice_id = std::vector({}), .dim_part = 1, .variable = var, .writable = true}); + vector grad3(1, Tensor(DataType::kFloat, TensorShape(), new ConstantInitializer(3.0))); + ctx->SetData(0, new WrapperData >(slices3), true); ctx->SetData(1, new WrapperData(1), true); ctx->SetData(2, new WrapperData(3), true); - ctx->SetData(3, new WrapperData(DataType::kFloat, TensorShape(), new ConstantInitializer(3.0), true), true); + ctx->SetData(3, new WrapperData >(grad3), true); EXPECT_TRUE(udf->Run(ctx).IsOk()); - delete ctx; delete var; delete udf; @@ -117,54 +134,61 @@ TEST(AggregateSlice, AggregateSliceSparse) { TEST(AggregateSlice, AggregateSliceDense) { UdfRegistry* udf_registry = UdfRegistry::Get("AggregateSlice"); - Udf* udf = udf_registry->Build(std::vector({0, 1, 2, 3}), std::vector({0, 1})); + Udf* udf = udf_registry->Build(std::vector({0, 1, 2, 3}), std::vector({4, 5})); UdfContext* ctx = new UdfContext; - Variable* var = new Variable(new Tensor(DataType::kFloat, TensorShape({4, 8}), new ConstantInitializer(0)), nullptr); + Variable* var = new Variable(new Tensor(DataType::kFloat, TensorShape({4, 8}), new ConstantInitializer(0)), nullptr, "dense"); ctx->SetVariable(var); ctx->SetVariableName("dense"); - Slices slices{.slice_size = 32, .slice_id = std::vector({0}), .dim_part = -1, .variable = var, .writable = true}; - ctx->SetData(0, new WrapperData(slices), true); + vector slices(1, Slices{.slice_size = 32, .slice_id = std::vector({0}), .dim_part = -1, .variable = var, .writable = true}); + vector grad(1, Tensor(DataType::kFloat, TensorShape({4, 8}), new ConstantInitializer(1.0))); + ctx->SetData(0, new WrapperData >(slices), true); ctx->SetData(1, new WrapperData(1), true); ctx->SetData(2, new WrapperData(2), true); - ctx->SetData(3, new WrapperData(DataType::kFloat, TensorShape({4, 8}), new ConstantInitializer(1.0), true), true); - + ctx->SetData(3, new WrapperData >(grad), true); + Data* output; EXPECT_TRUE(udf->Run(ctx).IsOk()); - EXPECT_TRUE(ctx->GetData(0, &output).IsOk()); - Slices& out_slices1 = dynamic_cast*>(output)->Internal(); - EXPECT_EQ(32ul, out_slices1.slice_size); - EXPECT_EQ(0ul, out_slices1.slice_id.size()); - EXPECT_EQ(-1, out_slices1.dim_part); - EXPECT_TRUE(ctx->GetData(1, &output).IsOk()); - Tensor& out_grad1 = dynamic_cast*>(output)->Internal(); - EXPECT_EQ(32ul, out_grad1.Shape().NumElements()); - - ctx->SetData(0, new WrapperData(slices), true); + EXPECT_TRUE(ctx->GetData(4, &output).IsOk()); + vector& out_slices1 = dynamic_cast >*>(output)->Internal(); + EXPECT_EQ(1, out_slices1.size()); + EXPECT_EQ(32ul, out_slices1[0].slice_size); + EXPECT_EQ(0ul, out_slices1[0].slice_id.size()); + EXPECT_EQ(-1, out_slices1[0].dim_part); + EXPECT_TRUE(ctx->GetData(5, &output).IsOk()); + vector& out_grad1 = dynamic_cast >*>(output)->Internal(); + EXPECT_EQ(1, out_grad1.size()); + EXPECT_TRUE(out_grad1[0].Shape().IsScalar()); + + vector grad2(1, Tensor(DataType::kFloat, TensorShape({4, 8}), new ConstantInitializer(2.0))); + ctx->SetData(0, new WrapperData >(slices), true); ctx->SetData(1, new WrapperData(1), true); ctx->SetData(2, new WrapperData(2), true); - ctx->SetData(3, new WrapperData(DataType::kFloat, TensorShape({4, 8}), new ConstantInitializer(2.0), true), true); + ctx->SetData(3, new WrapperData >(grad2), true); EXPECT_TRUE(udf->Run(ctx).IsOk()); - EXPECT_TRUE(ctx->GetData(0, &output).IsOk()); - Slices& out_slices2 = dynamic_cast*>(output)->Internal(); - EXPECT_EQ(32ul, out_slices2.slice_size); - EXPECT_EQ(1ul, out_slices2.slice_id.size()); - EXPECT_EQ(0, out_slices2.slice_id[0]); - EXPECT_EQ(-1, out_slices2.dim_part); - EXPECT_TRUE(ctx->GetData(1, &output).IsOk()); - Tensor& out_grad2 = dynamic_cast*>(output)->Internal(); - EXPECT_EQ(32ul, out_grad2.Shape().NumElements()); + EXPECT_TRUE(ctx->GetData(4, &output).IsOk()); + vector& out_slices2 = dynamic_cast >*>(output)->Internal(); + EXPECT_EQ(1, out_slices2.size()); + EXPECT_EQ(32ul, out_slices2[0].slice_size); + EXPECT_EQ(1ul, out_slices2[0].slice_id.size()); + EXPECT_EQ(0, out_slices2[0].slice_id[0]); + EXPECT_EQ(-1, out_slices2[0].dim_part); + EXPECT_TRUE(ctx->GetData(5, &output).IsOk()); + vector& out_grad2 = dynamic_cast >*>(output)->Internal(); + EXPECT_EQ(1, out_grad2.size()); + EXPECT_EQ(32ul, out_grad2[0].Shape().NumElements()); for (size_t i = 0; i < 32; i++) { - EXPECT_FLOAT_EQ(1.5, out_grad2.Raw()[i]); + EXPECT_FLOAT_EQ(1.5, out_grad2[0].Raw()[i]); } - delete var; delete ctx; delete udf; + } +/* TEST(AggregateSlice, AggregateSliceSparseBenchMark) { ThreadPool* queue_ = new ThreadPool(8); UdfRegistry* udf_registry = UdfRegistry::Get("AggregateSlice"); @@ -208,3 +232,4 @@ TEST(AggregateSlice, AggregateSliceSparseBenchMark) { delete var; delete udf; } +*/ diff --git a/xdl/ps-plus/ps-plus/server/udf/test/assign_add_updater_test.cc b/xdl/ps-plus/ps-plus/server/udf/test/assign_add_updater_test.cc index c8099355..2fbf43af 100644 --- a/xdl/ps-plus/ps-plus/server/udf/test/assign_add_updater_test.cc +++ b/xdl/ps-plus/ps-plus/server/udf/test/assign_add_updater_test.cc @@ -33,48 +33,58 @@ using ps::Tensor; using ps::Data; using ps::WrapperData; using ps::HashMap; +using std::vector; TEST(AssignAddUpdater, AssignAddUpdater) { UdfRegistry* udf_registry = UdfRegistry::Get("AssignAddUpdater"); Udf* udf = udf_registry->Build(std::vector({0, 1}), std::vector({})); UdfContext* ctx = new UdfContext; - Variable* var = new Variable(new Tensor(DataType::kFloat, TensorShape({4, 8}), new ConstantInitializer(5)), nullptr); + Variable* var = new Variable(new Tensor(DataType::kFloat, TensorShape({4, 8}), new ConstantInitializer(5), true, 1), nullptr, ""); ctx->SetVariable(var); - Slices slices{.slice_size = 8, .slice_id = std::vector({0, 2}), .dim_part = -1, .variable = var, .writable = true}; - ctx->SetData(0, new WrapperData(slices), true); - ctx->SetData(1, new WrapperData(DataType::kFloat, TensorShape({2, 8}), new ConstantInitializer(2)), true); + vector slices(1, Slices{.slice_size = 8, .slice_id = std::vector({0, 2}), .dim_part = 1, .variable = var, .writable = true}); + vector grad(1, Tensor(DataType::kFloat, TensorShape({2, 8}), new ConstantInitializer(2))); + ctx->SetData(0, new WrapperData >(slices), true); + ctx->SetData(1, new WrapperData >(grad), true); EXPECT_TRUE(udf->Run(ctx).IsOk()); for (size_t i = 0; i < 8; i++) { - EXPECT_EQ(7, var->GetData()->Raw()[i]); - EXPECT_EQ(7, var->GetData()->Raw()[i + 16]); - EXPECT_EQ(5, var->GetData()->Raw()[i + 8]); - EXPECT_EQ(5, var->GetData()->Raw()[i + 24]); + EXPECT_EQ(7, *(var->GetData()->Raw(0) + i)); + EXPECT_EQ(7, *(var->GetData()->Raw(2) + i)); + EXPECT_EQ(5, *(var->GetData()->Raw(1) + i)); + EXPECT_EQ(5, *(var->GetData()->Raw(3) + i)); } - ctx->SetData(1, new WrapperData(DataType::kFloat, TensorShape({2, 8}), new ConstantInitializer(4)), true); + vector grad2(1, Tensor(DataType::kFloat, TensorShape({2, 8}), new ConstantInitializer(4))); + ctx->SetData(1, new WrapperData >(grad2), true); EXPECT_TRUE(udf->Run(ctx).IsOk()); for (size_t i = 0; i < 8; i++) { - EXPECT_EQ(11, var->GetData()->Raw()[i]); - EXPECT_EQ(11, var->GetData()->Raw()[i + 16]); - EXPECT_EQ(5, var->GetData()->Raw()[i + 8]); - EXPECT_EQ(5, var->GetData()->Raw()[i + 24]); + EXPECT_EQ(11, *(var->GetData()->Raw(0) + i)); + EXPECT_EQ(11, *(var->GetData()->Raw(2) + i)); + EXPECT_EQ(5, *(var->GetData()->Raw(1) + i)); + EXPECT_EQ(5, *(var->GetData()->Raw(3) + i)); } - Slices slices2{.slice_size = 8, .slice_id = std::vector({(size_t)ps::HashMap::NOT_ADD_ID, 2}), .dim_part = -1, .variable = var, .writable = true}; - ctx->SetData(0, new WrapperData(slices2), true); + vector slices2(1, Slices{.slice_size = 8, .slice_id = std::vector({(size_t)ps::HashMap::NOT_ADD_ID, 2}), .dim_part = -1, .variable = var, .writable = true}); + ctx->SetData(0, new WrapperData >(slices2), true); EXPECT_TRUE(udf->Run(ctx).IsOk()); for (size_t i = 0; i < 8; i++) { - EXPECT_EQ(11, var->GetData()->Raw()[i]); - EXPECT_EQ(15, var->GetData()->Raw()[i + 16]); - EXPECT_EQ(5, var->GetData()->Raw()[i + 8]); - EXPECT_EQ(5, var->GetData()->Raw()[i + 24]); - } - Slices slices3{.slice_size = 8, .slice_id = std::vector({(size_t)ps::HashMap::NOT_ADD_ID, 1}), .dim_part = -1, .variable = var, .writable = false}; - ctx->SetData(0, new WrapperData(slices3), true); - EXPECT_FALSE(udf->Run(ctx).IsOk()); - ctx->SetData(0, new WrapperData(slices2), true); - ctx->SetData(1, new WrapperData(DataType::kDouble, TensorShape({2, 8}), new ConstantInitializer(2)), true); - EXPECT_FALSE(udf->Run(ctx).IsOk()); + EXPECT_EQ(11, *(var->GetData()->Raw(0) + i)); + EXPECT_EQ(15, *(var->GetData()->Raw(2) + i)); + EXPECT_EQ(5, *(var->GetData()->Raw(1) + i)); + EXPECT_EQ(5, *(var->GetData()->Raw(3) + i)); + } + + vector slices3(1, Slices{.slice_size = 8, .slice_id = std::vector({(size_t)ps::HashMap::NOT_ADD_ID, 1}), .dim_part = -1, .variable = var, .writable = false}); + ctx->SetData(0, new WrapperData >(slices3), true); + ps::Status status = udf->Run(ctx); + EXPECT_FALSE(status.IsOk()); + EXPECT_EQ(status.Msg(), "slice is not writable"); + + vector grad4(1, Tensor(DataType::kDouble, TensorShape({2, 8}), new ConstantInitializer(6))); + ctx->SetData(0, new WrapperData >(slices2), true); + ctx->SetData(1, new WrapperData >(grad4), true); + status = udf->Run(ctx); + EXPECT_FALSE(status.IsOk()); + EXPECT_EQ(status.Msg(), "grad should has same datatype with variable"); delete var; delete ctx; delete udf; diff --git a/xdl/ps-plus/ps-plus/server/udf/test/assign_sub_updater_test.cc b/xdl/ps-plus/ps-plus/server/udf/test/assign_sub_updater_test.cc index ce209d02..f923244a 100644 --- a/xdl/ps-plus/ps-plus/server/udf/test/assign_sub_updater_test.cc +++ b/xdl/ps-plus/ps-plus/server/udf/test/assign_sub_updater_test.cc @@ -33,48 +33,58 @@ using ps::Tensor; using ps::Data; using ps::WrapperData; using ps::HashMap; +using std::vector; TEST(AssignSubUpdater, AssignSubUpdater) { UdfRegistry* udf_registry = UdfRegistry::Get("AssignSubUpdater"); Udf* udf = udf_registry->Build(std::vector({0, 1}), std::vector({})); UdfContext* ctx = new UdfContext; - Variable* var = new Variable(new Tensor(DataType::kFloat, TensorShape({4, 8}), new ConstantInitializer(5)), nullptr); + Variable* var = new Variable(new Tensor(DataType::kFloat, TensorShape({4, 8}), new ConstantInitializer(5), true, 1), nullptr, ""); ctx->SetVariable(var); - Slices slices{.slice_size = 8, .slice_id = std::vector({0, 2}), .dim_part = -1, .variable = var, .writable = true}; - ctx->SetData(0, new WrapperData(slices), true); - ctx->SetData(1, new WrapperData(DataType::kFloat, TensorShape({2, 8}), new ConstantInitializer(2)), true); + vector slices(1, Slices{.slice_size = 8, .slice_id = std::vector({0, 2}), .dim_part = 1, .variable = var, .writable = true}); + vector grad(1, Tensor(DataType::kFloat, TensorShape({2, 8}), new ConstantInitializer(2))); + ctx->SetData(0, new WrapperData >(slices), true); + ctx->SetData(1, new WrapperData >(grad), true); EXPECT_TRUE(udf->Run(ctx).IsOk()); for (size_t i = 0; i < 8; i++) { - EXPECT_EQ(3, var->GetData()->Raw()[i]); - EXPECT_EQ(3, var->GetData()->Raw()[i + 16]); - EXPECT_EQ(5, var->GetData()->Raw()[i + 8]); - EXPECT_EQ(5, var->GetData()->Raw()[i + 24]); + EXPECT_EQ(3, *(var->GetData()->Raw(0) + i)); + EXPECT_EQ(3, *(var->GetData()->Raw(2) + i)); + EXPECT_EQ(5, *(var->GetData()->Raw(1) + i)); + EXPECT_EQ(5, *(var->GetData()->Raw(3) + i)); } - ctx->SetData(1, new WrapperData(DataType::kFloat, TensorShape({2, 8}), new ConstantInitializer(1)), true); + vector grad2(1, Tensor(DataType::kFloat, TensorShape({2, 8}), new ConstantInitializer(1))); + ctx->SetData(1, new WrapperData >(grad2), true); EXPECT_TRUE(udf->Run(ctx).IsOk()); for (size_t i = 0; i < 8; i++) { - EXPECT_EQ(2, var->GetData()->Raw()[i]); - EXPECT_EQ(2, var->GetData()->Raw()[i + 16]); - EXPECT_EQ(5, var->GetData()->Raw()[i + 8]); - EXPECT_EQ(5, var->GetData()->Raw()[i + 24]); + EXPECT_EQ(2, *(var->GetData()->Raw(0) + i)); + EXPECT_EQ(2, *(var->GetData()->Raw(2) + i)); + EXPECT_EQ(5, *(var->GetData()->Raw(1) + i)); + EXPECT_EQ(5, *(var->GetData()->Raw(3) + i)); } - Slices slices2{.slice_size = 8, .slice_id = std::vector({(size_t)ps::HashMap::NOT_ADD_ID, 2}), .dim_part = -1, .variable = var, .writable = true}; - ctx->SetData(0, new WrapperData(slices2), true); + vector slices2(1, Slices{.slice_size = 8, .slice_id = std::vector({(size_t)ps::HashMap::NOT_ADD_ID, 2}), .dim_part = -1, .variable = var, .writable = true}); + ctx->SetData(0, new WrapperData >(slices2), true); EXPECT_TRUE(udf->Run(ctx).IsOk()); for (size_t i = 0; i < 8; i++) { - EXPECT_EQ(2, var->GetData()->Raw()[i]); - EXPECT_EQ(1, var->GetData()->Raw()[i + 16]); - EXPECT_EQ(5, var->GetData()->Raw()[i + 8]); - EXPECT_EQ(5, var->GetData()->Raw()[i + 24]); - } - Slices slices3{.slice_size = 8, .slice_id = std::vector({(size_t)ps::HashMap::NOT_ADD_ID, 1}), .dim_part = -1, .variable = var, .writable = false}; - ctx->SetData(0, new WrapperData(slices3), true); - EXPECT_FALSE(udf->Run(ctx).IsOk()); - ctx->SetData(0, new WrapperData(slices2), true); - ctx->SetData(1, new WrapperData(DataType::kDouble, TensorShape({2, 8}), new ConstantInitializer(2)), true); - EXPECT_FALSE(udf->Run(ctx).IsOk()); + EXPECT_EQ(2, *(var->GetData()->Raw(0) + i)); + EXPECT_EQ(1, *(var->GetData()->Raw(2) + i)); + EXPECT_EQ(5, *(var->GetData()->Raw(1) + i)); + EXPECT_EQ(5, *(var->GetData()->Raw(3) + i)); + } + + vector slices3(1, Slices{.slice_size = 8, .slice_id = std::vector({(size_t)ps::HashMap::NOT_ADD_ID, 1}), .dim_part = -1, .variable = var, .writable = false}); + ctx->SetData(0, new WrapperData >(slices3), true); + ps::Status status = udf->Run(ctx); + EXPECT_FALSE(status.IsOk()); + EXPECT_EQ(status.Msg(), "slice is not writable"); + + vector grad4(1, Tensor(DataType::kDouble, TensorShape({2, 8}), new ConstantInitializer(6))); + ctx->SetData(0, new WrapperData >(slices2), true); + ctx->SetData(1, new WrapperData >(grad4), true); + status = udf->Run(ctx); + EXPECT_FALSE(status.IsOk()); + EXPECT_EQ(status.Msg(), "grad should has same datatype with variable"); delete var; delete ctx; delete udf; diff --git a/xdl/ps-plus/ps-plus/server/udf/test/assign_updater_test.cc b/xdl/ps-plus/ps-plus/server/udf/test/assign_updater_test.cc index 9f76a816..3f7ac099 100644 --- a/xdl/ps-plus/ps-plus/server/udf/test/assign_updater_test.cc +++ b/xdl/ps-plus/ps-plus/server/udf/test/assign_updater_test.cc @@ -33,49 +33,61 @@ using ps::Tensor; using ps::Data; using ps::WrapperData; using ps::HashMap; +using std::vector; TEST(AssignUpdater, AssignUpdater) { UdfRegistry* udf_registry = UdfRegistry::Get("AssignUpdater"); Udf* udf = udf_registry->Build(std::vector({0, 1}), std::vector({})); UdfContext* ctx = new UdfContext; - Variable* var = new Variable(new Tensor(DataType::kFloat, TensorShape({4, 8}), new ConstantInitializer(5)), nullptr); + Variable* var = new Variable(new Tensor(DataType::kFloat, TensorShape({4, 8}), new ConstantInitializer(5), true, 1), nullptr, ""); ctx->SetVariable(var); - Slices slices{.slice_size = 8, .slice_id = std::vector({0, 2}), .dim_part = -1, .variable = var, .writable = true}; - ctx->SetData(0, new WrapperData(slices), true); - ctx->SetData(1, new WrapperData(DataType::kFloat, TensorShape({2, 8}), new ConstantInitializer(2)), true); + + vector slices(1, Slices{.slice_size = 8, .slice_id = std::vector({0, 2}), .dim_part = -1, .variable = var, .writable = true}); + vector grad(1, Tensor(DataType::kFloat, TensorShape({2, 8}), new ConstantInitializer(2))); + ctx->SetData(0, new WrapperData >(slices), true); + ctx->SetData(1, new WrapperData >(grad), true); EXPECT_TRUE(udf->Run(ctx).IsOk()); for (size_t i = 0; i < 8; i++) { - EXPECT_EQ(2, var->GetData()->Raw()[i]); - EXPECT_EQ(2, var->GetData()->Raw()[i + 16]); - EXPECT_EQ(5, var->GetData()->Raw()[i + 8]); - EXPECT_EQ(5, var->GetData()->Raw()[i + 24]); + EXPECT_EQ(2, *(var->GetData()->Raw(0) + i)); + EXPECT_EQ(2, *(var->GetData()->Raw(2) + i)); + EXPECT_EQ(5, *(var->GetData()->Raw(1) + i)); + EXPECT_EQ(5, *(var->GetData()->Raw(3) + i)); } - ctx->SetData(1, new WrapperData(DataType::kFloat, TensorShape({2, 8}), new ConstantInitializer(4)), true); + + vector grad2(1, Tensor(DataType::kFloat, TensorShape({2, 8}), new ConstantInitializer(4))); + ctx->SetData(1, new WrapperData >(grad2), true); EXPECT_TRUE(udf->Run(ctx).IsOk()); for (size_t i = 0; i < 8; i++) { - EXPECT_EQ(4, var->GetData()->Raw()[i]); - EXPECT_EQ(4, var->GetData()->Raw()[i + 16]); - EXPECT_EQ(5, var->GetData()->Raw()[i + 8]); - EXPECT_EQ(5, var->GetData()->Raw()[i + 24]); + EXPECT_EQ(4, *(var->GetData()->Raw(0) + i)); + EXPECT_EQ(4, *(var->GetData()->Raw(2) + i)); + EXPECT_EQ(5, *(var->GetData()->Raw(1) + i)); + EXPECT_EQ(5, *(var->GetData()->Raw(3) + i)); } - Slices slices2{.slice_size = 8, .slice_id = std::vector({(size_t)ps::HashMap::NOT_ADD_ID, 2}), .dim_part = -1, .variable = var, .writable = true}; - ctx->SetData(0, new WrapperData(slices2), true); - ctx->SetData(1, new WrapperData(DataType::kFloat, TensorShape({2, 8}), new ConstantInitializer(6)), true); + vector slices2(1, Slices{.slice_size = 8, .slice_id = std::vector({(size_t)ps::HashMap::NOT_ADD_ID, 2}), .dim_part = -1, .variable = var, .writable = true}); + vector grad3(1, Tensor(DataType::kFloat, TensorShape({2, 8}), new ConstantInitializer(6))); + ctx->SetData(0, new WrapperData >(slices2), true); + ctx->SetData(1, new WrapperData >(grad3), true); EXPECT_TRUE(udf->Run(ctx).IsOk()); for (size_t i = 0; i < 8; i++) { - EXPECT_EQ(4, var->GetData()->Raw()[i]); - EXPECT_EQ(6, var->GetData()->Raw()[i + 16]); - EXPECT_EQ(5, var->GetData()->Raw()[i + 8]); - EXPECT_EQ(5, var->GetData()->Raw()[i + 24]); + EXPECT_EQ(4, *(var->GetData()->Raw(0) + i)); + EXPECT_EQ(6, *(var->GetData()->Raw(2) + i)); + EXPECT_EQ(5, *(var->GetData()->Raw(1) + i)); + EXPECT_EQ(5, *(var->GetData()->Raw(3) + i)); } - Slices slices3{.slice_size = 8, .slice_id = std::vector({(size_t)ps::HashMap::NOT_ADD_ID, 1}), .dim_part = -1, .variable = var, .writable = false}; - ctx->SetData(0, new WrapperData(slices3), true); - EXPECT_FALSE(udf->Run(ctx).IsOk()); - ctx->SetData(0, new WrapperData(slices2), true); - ctx->SetData(1, new WrapperData(DataType::kDouble, TensorShape({2, 8}), new ConstantInitializer(2)), true); - EXPECT_FALSE(udf->Run(ctx).IsOk()); + vector slices3(1, Slices{.slice_size = 8, .slice_id = std::vector({(size_t)ps::HashMap::NOT_ADD_ID, 1}), .dim_part = -1, .variable = var, .writable = false}); + ctx->SetData(0, new WrapperData >(slices3), true); + ps::Status status = udf->Run(ctx); + EXPECT_FALSE(status.IsOk()); + EXPECT_EQ(status.Msg(), "slice is not writable"); + + vector grad4(1, Tensor(DataType::kDouble, TensorShape({2, 8}), new ConstantInitializer(6))); + ctx->SetData(0, new WrapperData >(slices2), true); + ctx->SetData(1, new WrapperData >(grad4), true); + status = udf->Run(ctx); + EXPECT_FALSE(status.IsOk()); + EXPECT_EQ(status.Msg(), "grad should has same datatype with variable"); delete var; delete ctx; delete udf; diff --git a/xdl/ps-plus/ps-plus/server/udf/test/build_dense_slice_test.cc b/xdl/ps-plus/ps-plus/server/udf/test/build_dense_slice_test.cc index 35c4b92f..a10111fc 100644 --- a/xdl/ps-plus/ps-plus/server/udf/test/build_dense_slice_test.cc +++ b/xdl/ps-plus/ps-plus/server/udf/test/build_dense_slice_test.cc @@ -36,21 +36,20 @@ TEST(BuildDenseSlice, BuildDenseSlice) { UdfRegistry* udf_registry = UdfRegistry::Get("BuildDenseSlice"); Udf* udf = udf_registry->Build(std::vector({0}), std::vector({1})); UdfContext* ctx = new UdfContext; - Variable* var = new Variable(new Tensor(DataType::kInt8, TensorShape({4, 8}), new ConstantInitializer(0)), nullptr); + Variable* var = new Variable(new Tensor(DataType::kInt8, TensorShape({4, 8}), new ConstantInitializer(0)), nullptr, ""); ctx->SetVariable(var); EXPECT_TRUE(ctx->SetData(0, new WrapperData(false), true).IsOk()); EXPECT_TRUE(udf->Run(ctx).IsOk()); Data* output; EXPECT_TRUE(ctx->GetData(1, &output).IsOk()); - Slices& slices = dynamic_cast*>(output)->Internal(); - EXPECT_EQ(32u, slices.slice_size); - EXPECT_EQ(1u, slices.slice_id.size()); - EXPECT_EQ(0u, slices.slice_id[0]); - EXPECT_EQ(-1, slices.dim_part); + std::vector& slices = dynamic_cast >*>(output)->Internal(); + EXPECT_EQ(32u, slices[0].slice_size); + EXPECT_EQ(1u, slices[0].slice_id.size()); + EXPECT_EQ(0u, slices[0].slice_id[0]); + EXPECT_EQ(-1, slices[0].dim_part); ctx->SetVariable(nullptr); EXPECT_FALSE(udf->Run(ctx).IsOk()); delete var; delete ctx; delete udf; } - diff --git a/xdl/ps-plus/ps-plus/server/udf/test/build_hash_slice_test.cc b/xdl/ps-plus/ps-plus/server/udf/test/build_hash_slice_test.cc index ebf8a4f3..4f084ab4 100644 --- a/xdl/ps-plus/ps-plus/server/udf/test/build_hash_slice_test.cc +++ b/xdl/ps-plus/ps-plus/server/udf/test/build_hash_slice_test.cc @@ -35,83 +35,85 @@ using ps::Tensor; using ps::Data; using ps::WrapperData; using ps::HashMap; +using ps::HashMapImpl; using ps::QRWLocker; using ps::Status; +using ps::Hash128Key; +using ps::server::StorageManager; TEST(BuildHashSlice, BuildHashSlice) { UdfRegistry* udf_registry = UdfRegistry::Get("BuildHashSlice"); - Udf* udf = udf_registry->Build(std::vector({0, 1, 2}), std::vector({3})); + Udf* udf = udf_registry->Build(std::vector({0, 1, 2, 3, 4}), std::vector({5})); UdfContext* ctx = new UdfContext; - Variable* var = new Variable(new Tensor(DataType::kInt8, TensorShape({2, 8}), new ConstantInitializer(1)), new WrapperData(2)); - QRWLocker* locker = new QRWLocker(var->VariableLock(), QRWLocker::kSimpleRead); - ctx->SetLocker(locker); + HashMap* hashmap = new HashMapImpl(2); + Variable* var = new Variable(new Tensor(DataType::kInt8, TensorShape({1, 8}), new ConstantInitializer(1), true, 1), new WrapperData >(hashmap), ""); + StorageManager* manager = new StorageManager(); + EXPECT_TRUE(manager->Set("var", [var](){return var;}).IsOk()); + + ctx->SetStorageManager(manager); Tensor d(DataType::kInt64, TensorShape({3, 2}), new ConstantInitializer(0)); d.Raw()[0] = d.Raw()[1] = 10; d.Raw()[2] = d.Raw()[3] = 10; d.Raw()[4] = d.Raw()[5] = 12; + ctx->SetVariable(var); - EXPECT_TRUE(ctx->SetData(0, new WrapperData(d), true).IsOk()); - EXPECT_TRUE(ctx->SetData(1, new WrapperData(false), true).IsOk()); - EXPECT_TRUE(ctx->SetData(2, new WrapperData(1.0), true).IsOk()); - EXPECT_TRUE(udf->Run(ctx).IsOk()); + EXPECT_TRUE(ctx->SetData(0, new WrapperData >(std::vector{d}), true).IsOk()); + EXPECT_TRUE(ctx->SetData(1, new WrapperData >(std::vector{"var"}), true).IsOk()); + EXPECT_TRUE(ctx->SetData(2, new WrapperData >(std::vector{1.0}), true).IsOk()); + EXPECT_TRUE(ctx->SetData(3, new WrapperData(false), true).IsOk()); + EXPECT_TRUE(ctx->SetData(4, new WrapperData(true), true).IsOk()); + + ps::Status status = udf->Run(ctx); + EXPECT_TRUE(status.IsOk()); Data* output; - EXPECT_TRUE(ctx->GetData(3, &output).IsOk()); - Slices slices = dynamic_cast*>(output)->Internal(); - EXPECT_EQ(8u, slices.slice_size); - EXPECT_EQ(3u, slices.slice_id.size()); - EXPECT_EQ(1u, slices.slice_id[0]); - EXPECT_EQ(1u, slices.slice_id[1]); - EXPECT_EQ(0u, slices.slice_id[2]); + EXPECT_TRUE(ctx->GetData(5, &output).IsOk()); + std::vector& slices0 = dynamic_cast >*>(output)->Internal(); + EXPECT_EQ(1, slices0.size()); + EXPECT_EQ(8u, slices0[0].slice_size); + EXPECT_EQ(3u, slices0[0].slice_id.size()); + EXPECT_EQ(1u, slices0[0].slice_id[0] + slices0[0].slice_id[2]); + EXPECT_EQ(slices0[0].slice_id[0], slices0[0].slice_id[1]); d.Raw()[0] = d.Raw()[1] = 12; d.Raw()[2] = d.Raw()[3] = 13; d.Raw()[4] = d.Raw()[5] = 14; EXPECT_TRUE(udf->Run(ctx).IsOk()); - EXPECT_TRUE(ctx->GetData(3, &output).IsOk()); - slices = dynamic_cast*>(output)->Internal(); - EXPECT_EQ(8u, slices.slice_size); - EXPECT_EQ(3u, slices.slice_id.size()); - EXPECT_EQ(0u, slices.slice_id[0]); - EXPECT_EQ(3u, slices.slice_id[1]); - EXPECT_EQ(2u, slices.slice_id[2]); - EXPECT_EQ(1, slices.dim_part); - EXPECT_EQ(TensorShape({4, 8}), var->GetData()->Shape()); - EXPECT_EQ(0x0101010101010101l, var->GetData()->Raw()[0]); - EXPECT_EQ(0x0101010101010101l, var->GetData()->Raw()[1]); - EXPECT_EQ(0x0101010101010101l, var->GetData()->Raw()[2]); - EXPECT_EQ(0x0101010101010101l, var->GetData()->Raw()[3]); + EXPECT_TRUE(ctx->GetData(5, &output).IsOk()); + std::vector slices1 = dynamic_cast >*>(output)->Internal(); + EXPECT_EQ(8u, slices1[0].slice_size); + EXPECT_EQ(3u, slices1[0].slice_id.size()); + EXPECT_EQ(slices0[0].slice_id[2], slices1[0].slice_id[0]); + EXPECT_EQ(5, slices1[0].slice_id[1] + slices1[0].slice_id[2]); + EXPECT_EQ(1, slices1[0].dim_part); + EXPECT_EQ(0x0101010101010101l, *var->GetData()->Raw(0)); + EXPECT_EQ(0x0101010101010101l, *var->GetData()->Raw(1)); + EXPECT_EQ(0x0101010101010101l, *var->GetData()->Raw(2)); + EXPECT_EQ(0x0101010101010101l, *var->GetData()->Raw(3)); - EXPECT_TRUE(ctx->SetData(2, new WrapperData(0.0), true).IsOk()); + EXPECT_TRUE(ctx->SetData(3, new WrapperData(true), true).IsOk()); + EXPECT_TRUE(ctx->SetData(4, new WrapperData(false), true).IsOk()); d.Raw()[0] = d.Raw()[1] = 10; d.Raw()[2] = d.Raw()[3] = 12; d.Raw()[4] = d.Raw()[5] = 16; EXPECT_TRUE(udf->Run(ctx).IsOk()); - EXPECT_TRUE(ctx->GetData(3, &output).IsOk()); - slices = dynamic_cast*>(output)->Internal(); - EXPECT_EQ(8u, slices.slice_size); - EXPECT_EQ(3u, slices.slice_id.size()); - EXPECT_EQ(1u, slices.slice_id[0]); - EXPECT_EQ(0u, slices.slice_id[1]); - EXPECT_EQ(HashMap::NOT_ADD_ID, slices.slice_id[2]); - EXPECT_EQ(1, slices.dim_part); - EXPECT_EQ(TensorShape({4, 8}), var->GetData()->Shape()); + EXPECT_TRUE(ctx->GetData(5, &output).IsOk()); + std::vector& slices2 = dynamic_cast >*>(output)->Internal(); + EXPECT_EQ(8u, slices2[0].slice_size); + EXPECT_EQ(3u, slices2[0].slice_id.size()); + EXPECT_EQ(slices0[0].slice_id[0], slices2[0].slice_id[0]); + EXPECT_EQ(slices0[0].slice_id[2], slices2[0].slice_id[1]); + EXPECT_EQ(0, slices2[0].slice_id[2]); + EXPECT_EQ(1, slices2[0].dim_part); ctx->SetVariable(nullptr); - EXPECT_FALSE(udf->Run(ctx).IsOk()); - Variable* var1 = new Variable(new Tensor(DataType::kInt8, TensorShape({}), new ConstantInitializer(1)), new WrapperData(2)); - ctx->SetVariable(var1); - EXPECT_FALSE(udf->Run(ctx).IsOk()); - Tensor d1(DataType::kInt64, TensorShape({3}), new ConstantInitializer(0)); - ctx->SetData(0, new WrapperData(d1), true); - ctx->SetVariable(var); - EXPECT_FALSE(udf->Run(ctx).IsOk()); - Variable* var2 = new Variable(new Tensor(DataType::kInt8, TensorShape({2, 8}), new ConstantInitializer(1)), nullptr); + EXPECT_TRUE(udf->Run(ctx).IsOk()); + HashMap* hashmap2 = new HashMapImpl(2); + Variable* var2 = new Variable(new Tensor(DataType::kInt8, TensorShape({}), new ConstantInitializer(1)), new WrapperData(hashmap2), ""); ctx->SetVariable(var2); - EXPECT_FALSE(udf->Run(ctx).IsOk()); + EXPECT_TRUE(udf->Run(ctx).IsOk()); - delete locker; - delete var; + delete manager; + delete var2; delete ctx; delete udf; } - diff --git a/xdl/ps-plus/ps-plus/server/udf/test/build_sparse_slice_test.cc b/xdl/ps-plus/ps-plus/server/udf/test/build_sparse_slice_test.cc index e83fa693..44e70707 100644 --- a/xdl/ps-plus/ps-plus/server/udf/test/build_sparse_slice_test.cc +++ b/xdl/ps-plus/ps-plus/server/udf/test/build_sparse_slice_test.cc @@ -36,7 +36,7 @@ TEST(BuildSparseSlice, BuildSparseSlice) { UdfRegistry* udf_registry = UdfRegistry::Get("BuildSparseSlice"); Udf* udf = udf_registry->Build(std::vector({0, 1}), std::vector({2})); UdfContext* ctx = new UdfContext; - Variable* var = new Variable(new Tensor(DataType::kInt8, TensorShape({4, 8}), new ConstantInitializer(0)), new WrapperData(10)); + Variable* var = new Variable(new Tensor(DataType::kInt8, TensorShape({4, 8}), new ConstantInitializer(0)), new WrapperData(10), ""); Tensor d(DataType::kInt8, TensorShape({2}), new ConstantInitializer(0)); d.Raw()[0] = 10; d.Raw()[1] = 12; @@ -46,15 +46,15 @@ TEST(BuildSparseSlice, BuildSparseSlice) { EXPECT_TRUE(udf->Run(ctx).IsOk()); Data* output; EXPECT_TRUE(ctx->GetData(2, &output).IsOk()); - Slices& slices = dynamic_cast*>(output)->Internal(); - EXPECT_EQ(8u, slices.slice_size); - EXPECT_EQ(2u, slices.slice_id.size()); - EXPECT_EQ(0u, slices.slice_id[0]); - EXPECT_EQ(2u, slices.slice_id[1]); - EXPECT_EQ(1, slices.dim_part); + std::vector& slices = dynamic_cast >*>(output)->Internal(); + EXPECT_EQ(8u, slices[0].slice_size); + EXPECT_EQ(2u, slices[0].slice_id.size()); + EXPECT_EQ(0u, slices[0].slice_id[0]); + EXPECT_EQ(2u, slices[0].slice_id[1]); + EXPECT_EQ(1, slices[0].dim_part); ctx->SetVariable(nullptr); EXPECT_FALSE(udf->Run(ctx).IsOk()); - Variable* var1 = new Variable(new Tensor(DataType::kInt8, TensorShape({}), new ConstantInitializer(0)), new WrapperData(0)); + Variable* var1 = new Variable(new Tensor(DataType::kInt8, TensorShape({}), new ConstantInitializer(0)), new WrapperData(0), ""); ctx->SetVariable(var1); EXPECT_FALSE(udf->Run(ctx).IsOk()); Tensor d1(DataType::kInt8, TensorShape({2, 2}), new ConstantInitializer(0)); @@ -62,7 +62,7 @@ TEST(BuildSparseSlice, BuildSparseSlice) { ctx->SetData(0, new WrapperData(d1), true); EXPECT_FALSE(udf->Run(ctx).IsOk()); ctx->SetData(0, new WrapperData(d), true); - Variable* var2 = new Variable(new Tensor(DataType::kInt8, TensorShape({4, 8}), new ConstantInitializer(0)), nullptr); + Variable* var2 = new Variable(new Tensor(DataType::kInt8, TensorShape({4, 8}), new ConstantInitializer(0)), nullptr, ""); ctx->SetVariable(var2); EXPECT_FALSE(udf->Run(ctx).IsOk()); delete var; diff --git a/xdl/ps-plus/ps-plus/server/udf/test/hash_variable_initializer.cc b/xdl/ps-plus/ps-plus/server/udf/test/hash_variable_initializer_test.cc similarity index 72% rename from xdl/ps-plus/ps-plus/server/udf/test/hash_variable_initializer.cc rename to xdl/ps-plus/ps-plus/server/udf/test/hash_variable_initializer_test.cc index 0d0f1235..3a910a0a 100644 --- a/xdl/ps-plus/ps-plus/server/udf/test/hash_variable_initializer.cc +++ b/xdl/ps-plus/ps-plus/server/udf/test/hash_variable_initializer_test.cc @@ -37,27 +37,29 @@ using ps::HashMap; TEST(HashVariableInitializer, HashVariableInitializer) { UdfRegistry* udf_registry = UdfRegistry::Get("HashVariableInitializer"); - Udf* udf = udf_registry->Build(std::vector({0, 1, 2}), std::vector({})); + Udf* udf = udf_registry->Build(std::vector({0, 1, 2, 3}), std::vector({})); UdfContext* ctx = new UdfContext; StorageManager* storage_manager = new StorageManager; EXPECT_TRUE(ctx->SetVariableName("123").IsOk()); EXPECT_TRUE(ctx->SetData(0, new WrapperData(DataType::kInt8), true).IsOk()); - EXPECT_TRUE(ctx->SetData(2, new WrapperData>(new ConstantInitializer(1)), true).IsOk()); + EXPECT_TRUE(ctx->SetData(2, new WrapperData("save_ratio=1.0&hash64=true"), true).IsOk()); + EXPECT_TRUE(ctx->SetData(3, new WrapperData>(new ConstantInitializer(1)), true).IsOk()); EXPECT_TRUE(ctx->SetStorageManager(storage_manager).IsOk()); ctx->SetData(1, new WrapperData(std::vector({})), true); - EXPECT_FALSE(udf->Run(ctx).IsOk()); + ps::Status status = udf->Run(ctx); + EXPECT_FALSE(status.IsOk()); + EXPECT_EQ(status.Msg(), "Hash Shape Should not be Scalar"); EXPECT_TRUE(ctx->SetData(1, new WrapperData(std::vector({4, 8})), true).IsOk()); EXPECT_TRUE(udf->Run(ctx).IsOk()); - EXPECT_FALSE(udf->Run(ctx).IsOk()); + EXPECT_TRUE(udf->Run(ctx).IsOk()); Variable* var; EXPECT_TRUE(storage_manager->Get("123", &var).IsOk()); - EXPECT_EQ(TensorShape({4, 8}), var->GetData()->Shape()); EXPECT_EQ(DataType::kInt8, var->GetData()->Type()); - EXPECT_EQ(0x0101010101010101l, var->GetData()->Raw()[0]); - EXPECT_EQ(0x0101010101010101l, var->GetData()->Raw()[1]); - EXPECT_EQ(0x0101010101010101l, var->GetData()->Raw()[2]); - EXPECT_EQ(0x0101010101010101l, var->GetData()->Raw()[3]); - EXPECT_NE(nullptr, dynamic_cast*>(var->GetSlicer())); + EXPECT_EQ(0x0101010101010101l, *var->GetData()->Raw(0)); + EXPECT_EQ(0x0101010101010101l, *var->GetData()->Raw(1)); + EXPECT_EQ(0x0101010101010101l, *var->GetData()->Raw(2)); + EXPECT_EQ(0x0101010101010101l, *var->GetData()->Raw(3)); + EXPECT_NE(nullptr, dynamic_cast >*>(var->GetSlicer())); delete ctx; delete udf; } diff --git a/xdl/ps-plus/ps-plus/server/udf/test/identity_index_variable_initializer.cc b/xdl/ps-plus/ps-plus/server/udf/test/identity_index_variable_initializer_test.cc similarity index 97% rename from xdl/ps-plus/ps-plus/server/udf/test/identity_index_variable_initializer.cc rename to xdl/ps-plus/ps-plus/server/udf/test/identity_index_variable_initializer_test.cc index c22b0a4a..13c9a6a4 100644 --- a/xdl/ps-plus/ps-plus/server/udf/test/identity_index_variable_initializer.cc +++ b/xdl/ps-plus/ps-plus/server/udf/test/identity_index_variable_initializer_test.cc @@ -48,7 +48,7 @@ TEST(IdentityIndexVariableInitializer, IdentityIndexVariableInitializer) { EXPECT_FALSE(udf->Run(ctx).IsOk()); EXPECT_TRUE(ctx->SetData(0, new WrapperData(DataType::kInt8), true).IsOk()); EXPECT_TRUE(udf->Run(ctx).IsOk()); - EXPECT_FALSE(udf->Run(ctx).IsOk()); + EXPECT_TRUE(udf->Run(ctx).IsOk()); Variable* var; EXPECT_TRUE(storage_manager->Get("123", &var).IsOk()); EXPECT_EQ(TensorShape({4, 8}), var->GetData()->Shape()); @@ -57,6 +57,7 @@ TEST(IdentityIndexVariableInitializer, IdentityIndexVariableInitializer) { EXPECT_EQ(0x0101010101010101l, var->GetData()->Raw()[1]); EXPECT_EQ(0x0101010101010101l, var->GetData()->Raw()[2]); EXPECT_EQ(0x0101010101010101l, var->GetData()->Raw()[3]); + delete storage_manager; delete ctx; delete udf; } diff --git a/xdl/ps-plus/ps-plus/server/udf/test/index_variable_initializer.cc b/xdl/ps-plus/ps-plus/server/udf/test/index_variable_initializer_test.cc similarity index 98% rename from xdl/ps-plus/ps-plus/server/udf/test/index_variable_initializer.cc rename to xdl/ps-plus/ps-plus/server/udf/test/index_variable_initializer_test.cc index c28e8775..ad485570 100644 --- a/xdl/ps-plus/ps-plus/server/udf/test/index_variable_initializer.cc +++ b/xdl/ps-plus/ps-plus/server/udf/test/index_variable_initializer_test.cc @@ -45,7 +45,7 @@ TEST(IndexVariableInitializer, IndexVariableInitializer) { EXPECT_TRUE(ctx->SetData(3, new WrapperData>(new ConstantInitializer(1)), true).IsOk()); EXPECT_TRUE(ctx->SetStorageManager(storage_manager).IsOk()); EXPECT_TRUE(udf->Run(ctx).IsOk()); - EXPECT_FALSE(udf->Run(ctx).IsOk()); + EXPECT_TRUE(udf->Run(ctx).IsOk()); Variable* var; EXPECT_TRUE(storage_manager->Get("123", &var).IsOk()); EXPECT_EQ(TensorShape({4, 8}), var->GetData()->Shape()); diff --git a/xdl/ps-plus/ps-plus/server/udf/test/is_initiailzed_test.cc b/xdl/ps-plus/ps-plus/server/udf/test/is_initiailzed_test.cc index 3a863895..78fdb3ba 100644 --- a/xdl/ps-plus/ps-plus/server/udf/test/is_initiailzed_test.cc +++ b/xdl/ps-plus/ps-plus/server/udf/test/is_initiailzed_test.cc @@ -39,12 +39,20 @@ TEST(IsInitialized, IsInitialized) { StorageManager* sm = new StorageManager; UdfContext* ctx = new UdfContext; ctx->SetStorageManager(sm); - sm->Set("a", [&]{ return new Variable(new Tensor(DataType::kInt8, TensorShape({4, 8}), new ConstantInitializer(0)), nullptr); }); + sm->Set("a", [&]{ return new Variable(new Tensor(DataType::kInt8, TensorShape({4, 8}), new ConstantInitializer(0)), nullptr, ""); }); ctx->SetVariableName("a"); EXPECT_TRUE(udf->Run(ctx).IsOk()); Data* output; EXPECT_TRUE(ctx->GetData(0, &output).IsOk()); bool inited = dynamic_cast*>(output)->Internal(); + EXPECT_FALSE(inited); + Variable* var; + EXPECT_TRUE(sm->Get("a", &var).IsOk()); + var->SetRealInited(true); + EXPECT_TRUE(udf->Run(ctx).IsOk()); + output; + EXPECT_TRUE(ctx->GetData(0, &output).IsOk()); + inited = dynamic_cast*>(output)->Internal(); EXPECT_TRUE(inited); ctx->SetVariableName("b"); EXPECT_TRUE(udf->Run(ctx).IsOk()); @@ -52,7 +60,7 @@ TEST(IsInitialized, IsInitialized) { inited = dynamic_cast*>(output)->Internal(); EXPECT_FALSE(inited); delete ctx; - delete udf; delete sm; + delete udf; } diff --git a/xdl/ps-plus/ps-plus/server/udf/test/momentum_updater_test.cc b/xdl/ps-plus/ps-plus/server/udf/test/momentum_updater_test.cc index 55eeda84..e8f2b08c 100644 --- a/xdl/ps-plus/ps-plus/server/udf/test/momentum_updater_test.cc +++ b/xdl/ps-plus/ps-plus/server/udf/test/momentum_updater_test.cc @@ -32,51 +32,61 @@ using ps::TensorShape; using ps::Tensor; using ps::Data; using ps::WrapperData; +using std::vector; TEST(MomentumUpdater, MomentumUpdater) { UdfRegistry* udf_registry = UdfRegistry::Get("MomentumUpdater"); Udf* udf = udf_registry->Build(std::vector({0, 1, 2, 3, 4}), std::vector({})); UdfContext* ctx = new UdfContext; - Variable* var = new Variable(new Tensor(DataType::kFloat, TensorShape({4, 8}), new ConstantInitializer(0)), nullptr); + Variable* var = new Variable(new Tensor(DataType::kFloat, TensorShape({4, 8}), new ConstantInitializer(0)), nullptr, ""); ctx->SetVariable(var); - Slices slices{.slice_size = 8, .slice_id = std::vector({0, 2}), .dim_part = -1, .variable = var, .writable = true}; - ctx->SetData(0, new WrapperData(slices), true); - ctx->SetData(1, new WrapperData(DataType::kFloat, TensorShape({2, 8}), new ConstantInitializer(1)), true); - ctx->SetData(2, new WrapperData(1), true); - ctx->SetData(3, new WrapperData(0.5), true); - ctx->SetData(4, new WrapperData(false), true); + vector slices(1, Slices{.slice_size = 8, .slice_id = std::vector({0, 2}), .dim_part = 1, .variable = var, .writable = true}); + vector grad(1, Tensor(DataType::kFloat, TensorShape({2, 8}), new ConstantInitializer(1))); + ctx->SetData(0, new WrapperData >(slices), true); + ctx->SetData(1, new WrapperData >(grad), true); + ctx->SetData(2, new WrapperData >(vector{1}), true); + ctx->SetData(3, new WrapperData >(vector{0.5}), true); + ctx->SetData(4, new WrapperData >(vector{false}), true); EXPECT_TRUE(udf->Run(ctx).IsOk()); for (size_t i = 0; i < 8; i++) { - EXPECT_EQ(-1, var->GetData()->Raw()[i]); - EXPECT_EQ(-1, var->GetData()->Raw()[i + 16]); - EXPECT_EQ(0, var->GetData()->Raw()[i + 8]); - EXPECT_EQ(0, var->GetData()->Raw()[i + 24]); + EXPECT_EQ(-1, *(var->GetData()->Raw(0) + i)); + EXPECT_EQ(-1, *(var->GetData()->Raw(2) + i)); + EXPECT_EQ(0, *(var->GetData()->Raw(1) + i)); + EXPECT_EQ(0, *(var->GetData()->Raw(3) + i)); } EXPECT_TRUE(udf->Run(ctx).IsOk()); for (size_t i = 0; i < 8; i++) { - EXPECT_EQ(-2.5, var->GetData()->Raw()[i]); - EXPECT_EQ(-2.5, var->GetData()->Raw()[i + 16]); - EXPECT_EQ(0, var->GetData()->Raw()[i + 8]); - EXPECT_EQ(0, var->GetData()->Raw()[i + 24]); + EXPECT_EQ(-2.5, *(var->GetData()->Raw(0) + i)); + EXPECT_EQ(-2.5, *(var->GetData()->Raw(2) + i)); + EXPECT_EQ(0, *(var->GetData()->Raw(1) + i)); + EXPECT_EQ(0, *(var->GetData()->Raw(3) + i)); } - Slices slices2{.slice_size = 8, .slice_id = std::vector({1, (size_t)ps::HashMap::NOT_ADD_ID, 2}), .dim_part = -1, .variable = var, .writable = true}; - ctx->SetData(1, new WrapperData(DataType::kFloat, TensorShape({3, 8}), new ConstantInitializer(1)), true); - ctx->SetData(0, new WrapperData(slices2), true); + vector slices2(1, Slices{.slice_size = 8, .slice_id = std::vector({1, (size_t)ps::HashMap::NOT_ADD_ID, 2}), .dim_part = -1, .variable = var, .writable = true}); + vector grad2(1, Tensor(DataType::kFloat, TensorShape({3, 8}), new ConstantInitializer(1))); + ctx->SetData(1, new WrapperData >(grad2), true); + ctx->SetData(0, new WrapperData >(slices2), true); EXPECT_TRUE(udf->Run(ctx).IsOk()); for (size_t i = 0; i < 8; i++) { - EXPECT_EQ(-2.5, var->GetData()->Raw()[i]); - EXPECT_EQ(-4.25, var->GetData()->Raw()[i + 16]); - EXPECT_EQ(-1, var->GetData()->Raw()[i + 8]); - EXPECT_EQ(0, var->GetData()->Raw()[i + 24]); + EXPECT_EQ(-2.5, *(var->GetData()->Raw(0) + i)); + EXPECT_EQ(-4.25, *(var->GetData()->Raw(2) + i)); + EXPECT_EQ(-1, *(var->GetData()->Raw(1) + i)); + EXPECT_EQ(0, *(var->GetData()->Raw(3) + i)); } - Slices slices3{.slice_size = 8, .slice_id = std::vector({(size_t)ps::HashMap::NOT_ADD_ID, 1}), .dim_part = -1, .variable = var, .writable = false}; - ctx->SetData(0, new WrapperData(slices3), true); - EXPECT_FALSE(udf->Run(ctx).IsOk()); - ctx->SetData(0, new WrapperData(slices2), true); - ctx->SetData(1, new WrapperData(DataType::kDouble, TensorShape({2, 8}), new ConstantInitializer(2)), true); - EXPECT_FALSE(udf->Run(ctx).IsOk()); - + + vector slices3(1, Slices{.slice_size = 8, .slice_id = std::vector({(size_t)ps::HashMap::NOT_ADD_ID, 1}), .dim_part = -1, .variable = var, .writable = false}); + ctx->SetData(0, new WrapperData >(slices3), true); + ps::Status status = udf->Run(ctx); + EXPECT_FALSE(status.IsOk()); + EXPECT_EQ(status.Msg(), "slice is not writable"); + + vector grad3(1, Tensor(DataType::kDouble, TensorShape({2, 8}), new ConstantInitializer(2))); + ctx->SetData(0, new WrapperData >(slices2), true); + ctx->SetData(1, new WrapperData >(grad3), true); + status = udf->Run(ctx); + EXPECT_FALSE(status.IsOk()); + EXPECT_EQ(status.Msg(), "grad should has same datatype with variable"); + delete var; delete ctx; delete udf; diff --git a/xdl/ps-plus/ps-plus/server/udf/test/python_runner_test.cc b/xdl/ps-plus/ps-plus/server/udf/test/python_runner_test.cc new file mode 100644 index 00000000..20af3f1e --- /dev/null +++ b/xdl/ps-plus/ps-plus/server/udf/test/python_runner_test.cc @@ -0,0 +1,90 @@ +/* Copyright (C) 2016-2018 Alibaba Group Holding Limited + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "gtest/gtest.h" +#include "ps-plus/server/udf/python_runner.h" +#include "ps-plus/common/initializer/constant_initializer.h" +#include + +using ps::PythonRunner; +using ps::DataType; +using ps::TensorShape; +using ps::Tensor; +using ps::Status; +using ps::initializer::ConstantInitializer; + +TEST(PythonRunner, PythonRunner) { + std::string func_def = "import numpy\ndef X():\n print 'Hello World';\n return 1"; + std::string func_name = "X"; + PythonRunner runner; + + Status status = runner.Init(func_def, func_name); + EXPECT_TRUE(status.IsOk()); + PythonRunner::NumpyArray arr; + status = runner.Run({}, &arr); + EXPECT_TRUE(status.IsOk()); + EXPECT_EQ(1, ((int*)arr.data)[0]); +} + +TEST(PythonRunner, Add) { + std::string func_def = "import numpy\ndef Y(a, b):\n return a + b"; + std::string func_name = "Y"; + PythonRunner runner; + Status status = runner.Init(func_def, func_name); + EXPECT_TRUE(status.IsOk()); + Tensor t1(DataType::kFloat, TensorShape({3, 8}), new ConstantInitializer(1), true, 2); + Tensor t2(DataType::kFloat, TensorShape({3, 8}), new ConstantInitializer(2), true, 2); + PythonRunner::NumpyArray r1, r2, r3; + status = PythonRunner::ParseSubTensor(t1, 1, 3, &r1); + EXPECT_TRUE(status.IsOk()); + status = PythonRunner::ParseSubTensor(t2, 1, 3, &r2); + EXPECT_TRUE(status.IsOk()); + status = runner.Run({r1, r2}, &r3); + EXPECT_TRUE(status.IsOk()); + EXPECT_EQ(3, ((float*)r3.data)[0]); + EXPECT_EQ(1, r1.shape[0]); + EXPECT_EQ(8, r1.shape[1]); + EXPECT_EQ(1, r2.shape[0]); + EXPECT_EQ(8, r2.shape[1]); + EXPECT_EQ(1, r3.shape[0]); + EXPECT_EQ(8, r3.shape[1]); +} + +TEST(PythonRunner, Swap) { + std::string func_def = "import numpy\ndef Z(a, b):\n return b, a"; + std::string func_name = "Z"; + PythonRunner runner; + Status status = runner.Init(func_def, func_name); + EXPECT_TRUE(status.IsOk()); + Tensor t1(DataType::kFloat, TensorShape({3, 8}), new ConstantInitializer(1)); + Tensor t2(DataType::kFloat, TensorShape({3, 8}), new ConstantInitializer(2)); + PythonRunner::NumpyArray r1, r2, r3, r4; + status = PythonRunner::ParseTensor(t1, &r1); + EXPECT_TRUE(status.IsOk()); + status = PythonRunner::ParseTensor(t2, &r2); + EXPECT_TRUE(status.IsOk()); + status = runner.Run({r1, r2}, &r3, &r4); + EXPECT_TRUE(status.IsOk()); + EXPECT_EQ(2, ((float*)r3.data)[0]); + EXPECT_EQ(1, ((float*)r4.data)[0]); + EXPECT_EQ(3, r1.shape[0]); + EXPECT_EQ(8, r1.shape[1]); + EXPECT_EQ(3, r2.shape[0]); + EXPECT_EQ(8, r2.shape[1]); + EXPECT_EQ(3, r3.shape[0]); + EXPECT_EQ(8, r3.shape[1]); + EXPECT_EQ(3, r4.shape[0]); + EXPECT_EQ(8, r4.shape[1]); +} diff --git a/xdl/ps-plus/ps-plus/server/udf/test/rmsprop_updater_test.cc b/xdl/ps-plus/ps-plus/server/udf/test/rmsprop_updater_test.cc new file mode 100644 index 00000000..df298349 --- /dev/null +++ b/xdl/ps-plus/ps-plus/server/udf/test/rmsprop_updater_test.cc @@ -0,0 +1,95 @@ +/* Copyright (C) 2016-2018 Alibaba Group Holding Limited + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "gtest/gtest.h" +#include "ps-plus/common/data.h" +#include "ps-plus/server/udf.h" +#include "ps-plus/server/slice.h" +#include "ps-plus/common/initializer/constant_initializer.h" +#include "ps-plus/common/hashmap.h" + +using ps::server::Udf; +using ps::server::UdfContext; +using ps::server::UdfRegistry; +using ps::server::Variable; +using ps::server::Slices; +using ps::initializer::ConstantInitializer; +using ps::Initializer; +using ps::DataType; +using ps::TensorShape; +using ps::Tensor; +using ps::Data; +using ps::WrapperData; +using std::vector; + +TEST(RmspropUpdater, RmspropUpdater) { + UdfRegistry* udf_registry = UdfRegistry::Get("RmspropUpdater"); + Udf* udf = udf_registry->Build(std::vector({0, 1, 2, 3, 4, 5}), std::vector({})); + UdfContext* ctx = new UdfContext; + Variable* var = new Variable(new Tensor(DataType::kFloat, TensorShape({4, 8}), new ConstantInitializer(0), true, 1), nullptr, ""); + ctx->SetVariable(var); + vector slices(1, Slices{.slice_size = 8, .slice_id = std::vector({0, 2}), .dim_part = 1, .variable = var, .writable = true}); + vector grad(1, Tensor(DataType::kFloat, TensorShape({2, 8}), new ConstantInitializer(1))); + ctx->SetData(0, new WrapperData >(slices), true); // slices + ctx->SetData(1, new WrapperData >(grad), true); // grad_tensor + ctx->SetData(2, new WrapperData >(vector{1}), true); // learning_rate + ctx->SetData(3, new WrapperData >(vector{0.99}), true); // decay + ctx->SetData(4, new WrapperData >(vector{0.0}), true); // alpha + ctx->SetData(5, new WrapperData >(vector{0.0}), true); // epsilon + + EXPECT_TRUE(udf->Run(ctx).IsOk()); + for (size_t i = 0; i < 8; i++) { + EXPECT_FLOAT_EQ(-10, *(var->GetData()->Raw(0) + i)); + EXPECT_FLOAT_EQ(-10, *(var->GetData()->Raw(2) + i)); + EXPECT_EQ(0, *(var->GetData()->Raw(1) + i)); + EXPECT_EQ(0, *(var->GetData()->Raw(3) + i)); + } + EXPECT_TRUE(udf->Run(ctx).IsOk()); + for (size_t i = 0; i < 8; i++) { + EXPECT_FLOAT_EQ(-17.088812, *(var->GetData()->Raw(0) + i)); + EXPECT_FLOAT_EQ(-17.088812, *(var->GetData()->Raw(2) + i)); + EXPECT_EQ(0, *(var->GetData()->Raw(1) + i)); + EXPECT_EQ(0, *(var->GetData()->Raw(3) + i)); + } + + vector slices2(1, Slices{.slice_size = 8, .slice_id = std::vector({1, (size_t)ps::HashMap::NOT_ADD_ID, 2}), .dim_part = -1, .variable = var, .writable = true}); + vector grad2(1, Tensor(DataType::kFloat, TensorShape({3, 8}), new ConstantInitializer(1))); + ctx->SetData(1, new WrapperData >(grad2), true); + ctx->SetData(0, new WrapperData >(slices2), true); + EXPECT_TRUE(udf->Run(ctx).IsOk()); + for (size_t i = 0; i < 8; i++) { + EXPECT_FLOAT_EQ(-17.088812, *(var->GetData()->Raw(0) + i)); + EXPECT_FLOAT_EQ(-22.891302, *(var->GetData()->Raw(2) + i)); + EXPECT_EQ(-10, *(var->GetData()->Raw(1) + i)); + EXPECT_EQ(0, *(var->GetData()->Raw(3) + i)); + } + vector slices3(1, Slices{.slice_size = 8, .slice_id = std::vector({(size_t)ps::HashMap::NOT_ADD_ID, 1}), .dim_part = -1, .variable = var, .writable = false}); + ctx->SetData(0, new WrapperData >(slices3), true); + ps::Status status = udf->Run(ctx); + EXPECT_FALSE(status.IsOk()); + EXPECT_EQ(status.Msg(), "slice is not writable"); + + vector grad3(1, Tensor(DataType::kDouble, TensorShape({2, 8}), new ConstantInitializer(2))); + ctx->SetData(0, new WrapperData >(slices2), true); + ctx->SetData(1, new WrapperData >(grad3), true); + status = udf->Run(ctx); + EXPECT_FALSE(status.IsOk()); + EXPECT_EQ(status.Msg(), "grad should has same datatype with variable"); + + delete var; + delete ctx; + delete udf; +} + diff --git a/xdl/ps-plus/ps-plus/server/udf/test/scalar_integer_logger_test.cc b/xdl/ps-plus/ps-plus/server/udf/test/scalar_integer_logger_test.cc index af635772..511a9a2c 100644 --- a/xdl/ps-plus/ps-plus/server/udf/test/scalar_integer_logger_test.cc +++ b/xdl/ps-plus/ps-plus/server/udf/test/scalar_integer_logger_test.cc @@ -33,27 +33,32 @@ using ps::Tensor; using ps::Data; using ps::WrapperData; using ps::HashMap; +using std::vector; +using std::string; TEST(ScalarIntegerLogger, ScalarIntegerLogger) { UdfRegistry* udf_registry = UdfRegistry::Get("ScalarIntegerLogger"); Udf* udf = udf_registry->Build(std::vector({0, 1, 2}), std::vector({})); UdfContext* ctx = new UdfContext; - Variable* var = new Variable(new Tensor(DataType::kFloat, TensorShape({4, 8}), new ConstantInitializer(5)), nullptr); + Variable* var = new Variable(new Tensor(DataType::kFloat, TensorShape({4, 8}), new ConstantInitializer(5), true, 1), nullptr, ""); ctx->SetVariable(var); - Slices slices{.slice_size = 8, .slice_id = std::vector({0, 2}), .dim_part = -1, .variable = var, .writable = true}; - std::string slot_name = "test"; - int64_t val = 8848; - ctx->SetData(0, new WrapperData(slices), true); - ctx->SetData(1, new WrapperData(slot_name), true); - ctx->SetData(2, new WrapperData(val), true); + vector slices(1, Slices{.slice_size = 8, .slice_id = std::vector({0, 2}), .dim_part = -1, .variable = var, .writable = true}); + vector slot_name(1, "test"); + int64_t MAGIC_NUMBER = 8848; + ctx->SetData(0, new WrapperData >(slices), true); + ctx->SetData(1, new WrapperData >(slot_name), true); + ctx->SetData(2, new WrapperData >(vector{MAGIC_NUMBER}), true); + EXPECT_TRUE(udf->Run(ctx).IsOk()); + Tensor* result; EXPECT_TRUE(var->GetExistSlot("test", &result).IsOk()); - EXPECT_EQ(8848, result->Raw()[0]); - EXPECT_EQ(0, result->Raw()[1]); - EXPECT_EQ(8848, result->Raw()[2]); - EXPECT_EQ(0, result->Raw()[3]); + EXPECT_EQ(MAGIC_NUMBER, *(result->Raw(0))); + EXPECT_EQ(0, *(result->Raw(1))); + EXPECT_EQ(MAGIC_NUMBER, *(result->Raw(2))); + EXPECT_EQ(0, *(result->Raw(3))); + delete var; delete ctx; delete udf; diff --git a/xdl/ps-plus/ps-plus/server/udf/test/slice_to_tensor_test.cc b/xdl/ps-plus/ps-plus/server/udf/test/slice_to_tensor_test.cc index 35a1ea9d..43de4d3a 100644 --- a/xdl/ps-plus/ps-plus/server/udf/test/slice_to_tensor_test.cc +++ b/xdl/ps-plus/ps-plus/server/udf/test/slice_to_tensor_test.cc @@ -36,39 +36,51 @@ using ps::WrapperData; TEST(SliceToTensor, SliceToTensor) { UdfRegistry* udf_registry = UdfRegistry::Get("SliceToTensor"); Udf* udf = udf_registry->Build(std::vector({0}), std::vector({1})); - Udf* udf_ = udf_registry->Build(std::vector({0, 1}), std::vector({2})); UdfContext* ctx = new UdfContext; - Variable* var = new Variable(new Tensor(DataType::kInt8, TensorShape({4, 8}), new ConstantInitializer(1)), nullptr); + Variable* var = new Variable(new Tensor(DataType::kInt8, TensorShape({4, 8}), new ConstantInitializer(1)), nullptr, ""); ctx->SetVariable(var); - TensorSlices slices{.slice_size = 8, .slice_id = std::vector({0, 2}), .dim_part = -1, .tensor = *(var->GetData())}; - EXPECT_TRUE(ctx->SetData(0, new WrapperData(slices), true).IsOk()); + std::vector slices; + slices.push_back(Slices{.slice_size = 32, .slice_id = std::vector({0}), .dim_part = -1, .variable = var}); + EXPECT_TRUE(ctx->SetData(0, new WrapperData >(slices), true).IsOk()); EXPECT_TRUE(udf->Run(ctx).IsOk()); - EXPECT_FALSE(udf_->Run(ctx).IsOk()); Data* output; EXPECT_TRUE(ctx->GetData(1, &output).IsOk()); - Tensor& tensor = dynamic_cast*>(output)->Internal(); - EXPECT_EQ(0x0101010101010101l, tensor.Raw()[0]); - EXPECT_EQ(0x0101010101010101l, tensor.Raw()[1]); - EXPECT_EQ(0x0101010101010101l, tensor.Raw()[2]); - EXPECT_EQ(0x0101010101010101l, tensor.Raw()[3]); - Variable* var1 = new Variable(new Tensor(DataType::kInt8, TensorShape({4, 8}), new ConstantInitializer(1)), new WrapperData(10)); + std::vector& tensors = dynamic_cast >*>(output)->Internal(); + EXPECT_EQ(1, tensors.size()); + TensorShape shape = tensors[0].Shape(); + EXPECT_EQ(2, shape.Size()); + EXPECT_EQ(4, shape.Dims()[0]); + EXPECT_EQ(8, shape.Dims()[1]); + EXPECT_EQ(0x0101010101010101l, *(tensors[0].Raw(0))); + EXPECT_EQ(0x0101010101010101l, *(tensors[0].Raw(1))); + EXPECT_EQ(0x0101010101010101l, *(tensors[0].Raw(2))); + EXPECT_EQ(0x0101010101010101l, *(tensors[0].Raw(3))); + + Tensor* tensor_ = new Tensor(DataType::kInt8, TensorShape({4, 8}), new ConstantInitializer(1)); + Data* slicer_ = new WrapperData(10); + Variable* var1 = new Variable(tensor_, slicer_, ""); + Tensor* t = var1->GetData(); ctx->SetVariable(var1); - TensorSlices slices1{.slice_size = 8, .slice_id = std::vector({0, 2}), .dim_part = 1, .tensor = *(var1->GetData())}; - EXPECT_TRUE(ctx->SetData(0, new WrapperData(slices1), true).IsOk()); + std::vector slices1; + slices1.push_back(Slices{.slice_size = 8, .slice_id = std::vector({0, 2}), .dim_part = 1, .variable = var1}); + + EXPECT_TRUE(ctx->SetData(0, new WrapperData >(slices1), true).IsOk()); EXPECT_TRUE(udf->Run(ctx).IsOk()); EXPECT_TRUE(ctx->GetData(1, &output).IsOk()); - tensor = dynamic_cast*>(output)->Internal(); - EXPECT_EQ(2u, tensor.Shape().Size()); - EXPECT_EQ(2u, tensor.Shape()[0]); - EXPECT_EQ(8u, tensor.Shape()[1]); - EXPECT_EQ(0x0101010101010101l, tensor.Raw()[0]); - EXPECT_EQ(0x0101010101010101l, tensor.Raw()[1]); + std::vector& tensors1 = dynamic_cast >*>(output)->Internal(); + + EXPECT_EQ(1u, tensors1.size()); + EXPECT_EQ(2u, tensors1[0].Shape().Size()); + EXPECT_EQ(2u, tensors1[0].Shape()[0]); + EXPECT_EQ(8u, tensors1[0].Shape()[1]); + EXPECT_EQ(0x0101010101010101l, *(tensors1[0].Raw(0))); + EXPECT_EQ(0x0101010101010101l, *(tensors1[0].Raw(1))); TensorSlices slices2{.slice_size = 8, .slice_id = std::vector({0, 2}), .dim_part = 3, .tensor = *(var1->GetData())}; EXPECT_TRUE(ctx->SetData(0, new WrapperData(slices2), true).IsOk()); EXPECT_FALSE(udf->Run(ctx).IsOk()); - delete var; + delete var1; + delete var; delete ctx; delete udf; } - diff --git a/xdl/ps-plus/ps-plus/server/udf/test/trans_slice_test.cc b/xdl/ps-plus/ps-plus/server/udf/test/trans_slice_test.cc index 6880570e..0ab12132 100644 --- a/xdl/ps-plus/ps-plus/server/udf/test/trans_slice_test.cc +++ b/xdl/ps-plus/ps-plus/server/udf/test/trans_slice_test.cc @@ -32,15 +32,17 @@ using ps::TensorShape; using ps::Tensor; using ps::Data; using ps::WrapperData; +using std::vector; TEST(TransSlice, TransSlice) { UdfRegistry* udf_registry = UdfRegistry::Get("TransSlice"); Udf* udf = udf_registry->Build(std::vector({0}), std::vector({1})); UdfContext* ctx = new UdfContext; - Variable* var = new Variable(new Tensor(DataType::kInt8, TensorShape({4, 8}), new ConstantInitializer(1)), nullptr); + Variable* var = new Variable(new Tensor(DataType::kInt8, TensorShape({4, 8}), new ConstantInitializer(1)), nullptr, ""); ctx->SetVariable(var); - Slices slices{.slice_size = 8, .slice_id = std::vector({0, 2}), .dim_part = -1, .variable = var, .writable = true}; - EXPECT_TRUE(ctx->SetData(0, new WrapperData(slices), true).IsOk()); + vector slices; + slices.push_back(Slices{.slice_size = 8, .slice_id = std::vector({0, 2}), .dim_part = -1, .variable = var, .writable = true}); + EXPECT_TRUE(ctx->SetData(0, new WrapperData >(slices), true).IsOk()); EXPECT_TRUE(udf->Run(ctx).IsOk()); Data* output; EXPECT_TRUE(ctx->GetData(1, &output).IsOk()); diff --git a/xdl/ps-plus/ps-plus/server/udf/trans_slice.cc b/xdl/ps-plus/ps-plus/server/udf/trans_slice.cc index ab5a196b..4f13e23c 100644 --- a/xdl/ps-plus/ps-plus/server/udf/trans_slice.cc +++ b/xdl/ps-plus/ps-plus/server/udf/trans_slice.cc @@ -20,13 +20,16 @@ namespace ps { namespace server { namespace udf { -class TransSlice : public SimpleUdf { +class TransSlice : public SimpleUdf, TensorSlices*> { public: - virtual Status SimpleRun(UdfContext* ctx, const Slices& slices, TensorSlices* result) const { - result->slice_size = slices.slice_size; - result->slice_id = slices.slice_id; - result->dim_part = slices.dim_part; - result->tensor = *(slices.variable->GetData()); + virtual Status SimpleRun(UdfContext* ctx, const std::vector& slices, TensorSlices* result) const { + if (slices.size() != 1) { + return Status::ArgumentError("TransSlice: slices size must be 1"); + } + result->slice_size = slices[0].slice_size; + result->slice_id = slices[0].slice_id; + result->dim_part = slices[0].dim_part; + result->tensor = *(slices[0].variable->GetData()); return Status::Ok(); } }; diff --git a/xdl/ps-plus/ps-plus/server/udf_context.cc b/xdl/ps-plus/ps-plus/server/udf_context.cc index a54beb37..d723cbfe 100644 --- a/xdl/ps-plus/ps-plus/server/udf_context.cc +++ b/xdl/ps-plus/ps-plus/server/udf_context.cc @@ -21,7 +21,7 @@ namespace ps { namespace server { UdfContext::UdfContext() - : variable_(nullptr), storage_manager_(nullptr), locker_(nullptr) { + : variable_(nullptr), storage_manager_(nullptr), locker_(nullptr), server_locker_(nullptr), streaming_model_args_(nullptr) { } UdfContext::~UdfContext() { @@ -70,6 +70,11 @@ Status UdfContext::SetLocker(QRWLocker* locker) { return Status::Ok(); } +Status UdfContext::SetServerLocker(QRWLocker* locker) { + server_locker_ = locker; + return Status::Ok(); +} + Status UdfContext::SetStreamingModelArgs(StreamingModelArgs* streaming_model_args) { streaming_model_args_ = streaming_model_args; return Status::Ok(); @@ -127,6 +132,10 @@ QRWLocker* UdfContext::GetLocker() { return locker_; } +QRWLocker* UdfContext::GetServerLocker() { + return server_locker_; +} + StreamingModelArgs* UdfContext::GetStreamingModelArgs() { return streaming_model_args_; } diff --git a/xdl/ps-plus/ps-plus/server/udf_context.h b/xdl/ps-plus/ps-plus/server/udf_context.h index 3eb4cae3..69355b88 100644 --- a/xdl/ps-plus/ps-plus/server/udf_context.h +++ b/xdl/ps-plus/ps-plus/server/udf_context.h @@ -43,6 +43,7 @@ class UdfContext { Status SetVariable(Variable* variable); Status SetVariableName(const std::string& variable_name); Status SetLocker(QRWLocker* locker); + Status SetServerLocker(QRWLocker* locker); Status SetStreamingModelArgs(StreamingModelArgs* streaming_model_args); Status SetData(size_t id, Data* data, bool need_free); @@ -53,6 +54,7 @@ class UdfContext { Variable* GetVariable(); const std::string& GetVariableName(); QRWLocker* GetLocker(); + QRWLocker* GetServerLocker(); StreamingModelArgs* GetStreamingModelArgs(); private: std::vector datas_; @@ -62,6 +64,7 @@ class UdfContext { std::string variable_name_; StorageManager* storage_manager_; QRWLocker* locker_; + QRWLocker* server_locker_; StreamingModelArgs* streaming_model_args_; }; diff --git a/xdl/ps-plus/ps-plus/server/udf_manager.cc b/xdl/ps-plus/ps-plus/server/udf_manager.cc index 61007253..49873a76 100644 --- a/xdl/ps-plus/ps-plus/server/udf_manager.cc +++ b/xdl/ps-plus/ps-plus/server/udf_manager.cc @@ -102,7 +102,7 @@ Status UdfChain::Process(UdfContext* ctx) { for (Udf* udf : udfs_) { PS_CHECK_STATUS(udf->Run(ctx)); } - ctx->ProcessOutputs(output_ids_); + PS_CHECK_STATUS(ctx->ProcessOutputs(output_ids_)); return Status::Ok(); } diff --git a/xdl/ps-plus/ps-plus/server/variable.cc b/xdl/ps-plus/ps-plus/server/variable.cc index 64855765..0e6fbc88 100644 --- a/xdl/ps-plus/ps-plus/server/variable.cc +++ b/xdl/ps-plus/ps-plus/server/variable.cc @@ -38,7 +38,7 @@ Tensor* Variable::GetSlot(const std::string& name, const std::function& } Variable::Slot Variable::VariableLikeSlot(DataType type, const TensorShape& shape, Initializer* initializer) { - return Slot{.tensor = std::unique_ptr(new Tensor(type, shape, initializer)), .joiner = kVariableLike}; + return Slot{.tensor = std::unique_ptr(new Tensor(type, shape, initializer, data_->TensorType(), true)), .joiner = kVariableLike}; } Variable::Slot Variable::AnyOneSlot(DataType type, const TensorShape& shape, Initializer* initializer) { @@ -81,19 +81,19 @@ Status Variable::ReShapeId(size_t id) { if (shape.Size() == 0) { return Status::ArgumentError("Scalar Not Support ReShapeId"); } - shape.Set(0, id); - data_->ReShape(shape); for (auto& slot : slots_) { if (slot.second.joiner == kVariableLike) { Tensor* tensor = slot.second.tensor.get(); - TensorShape shape = tensor->Shape(); - if (shape.Size() == 0) { + TensorShape sshape = tensor->Shape(); + if (sshape.Size() == 0) { return Status::ArgumentError("Scalar Not Support ReShapeId"); } - shape.Set(0, id); - tensor->ReShape(shape); + sshape.Set(0, id); + tensor->ReShape(sshape); } } + shape.Set(0, id); + data_->ReShape(shape); return Status::Ok(); } diff --git a/xdl/ps-plus/ps-plus/server/variable.h b/xdl/ps-plus/ps-plus/server/variable.h index ea682bca..b20ad4ad 100644 --- a/xdl/ps-plus/ps-plus/server/variable.h +++ b/xdl/ps-plus/ps-plus/server/variable.h @@ -37,15 +37,18 @@ class Variable { SlotJoiner joiner; }; - Variable(Tensor* data, Data* slicer) - : data_(data), slicer_(slicer) {} + Variable(Tensor* data, Data* slicer, std::string name): data_(data), slicer_(slicer), name_(name), real_inited_(false) { + } // you should lock this when you process the data. QRWLock& VariableLock() { return variable_lock_; } // you should use following method when VariableLock is read_locked. Data* GetSlicer() { return slicer_.get(); } - Tensor* GetData() { return data_.get(); } + Tensor* GetData() { + Tensor* tensor = data_.get(); + return tensor; + } Tensor* GetSlot(const std::string& name, const std::function& slot_creator); Slot VariableLikeSlot(DataType type, const TensorShape& shape, Initializer* initializer); Slot AnyOneSlot(DataType type, const TensorShape& shape, Initializer* initializer); @@ -55,10 +58,12 @@ class Variable { Status GetExistSlot(const std::string& name, Tensor** result); Status ReShapeId(size_t id); void ClearIds(const std::vector& id); - + std::string GetName() { return name_;} // Used for Save and Restore const std::unordered_map& GetSlots() { return slots_; } void SetSlots(std::unordered_map&& slots) { slots_ = std::move(slots); } + bool RealInited() {return real_inited_;} + void SetRealInited(bool init) {real_inited_ = init;} private: // There is 3 state in Variable Processor: @@ -71,6 +76,8 @@ class Variable { std::unique_ptr data_; std::unique_ptr slicer_; std::unordered_map slots_; + std::string name_; + bool real_inited_; }; } diff --git a/xdl/ps-plus/ps-plus/service/seastar/lib/cpu_pool.h b/xdl/ps-plus/ps-plus/service/seastar/lib/cpu_pool.h index 5379b239..9b32b540 100644 --- a/xdl/ps-plus/ps-plus/service/seastar/lib/cpu_pool.h +++ b/xdl/ps-plus/ps-plus/service/seastar/lib/cpu_pool.h @@ -54,15 +54,17 @@ class CPUPool { return false; } + std::stringstream ss; for (size_t i = 0; i < ids.size(); ++i) { if (i > 0) { - *core_ids += ","; + ss << ","; } - *core_ids += std::to_string(ids[i]); + ss << ids[i]; } - printf("cpuset: %s\n", core_ids->c_str()); + *core_ids = ss.str(); + std::cout << "cpuset:" << *core_ids << std::endl; return true; } diff --git a/xdl/ps-plus/ps-plus/service/seastar/lib/seastar_client_lib.cc b/xdl/ps-plus/ps-plus/service/seastar/lib/seastar_client_lib.cc index a1b6dbe1..1180c655 100644 --- a/xdl/ps-plus/ps-plus/service/seastar/lib/seastar_client_lib.cc +++ b/xdl/ps-plus/ps-plus/service/seastar/lib/seastar_client_lib.cc @@ -24,7 +24,6 @@ limitations under the License. #include #include -#include #include "ps-plus/common/data.h" #include "common.h" @@ -75,15 +74,8 @@ bool SeastarClientLib::Start() { } void SeastarClientLib::ToCmdOptions(int* argc, char*** argv) { - std::string is_poll_mode = ps::NetUtils::GetEnv("POLL_MODE"); - if (is_poll_mode == "1") { - *argc = 8; - *argv = new char*[9]; - } else { - *argc = 7; - *argv = new char*[8]; - } - + *argc = 7; + *argv = new char*[8]; (*argv)[0] = new char[1000]; (*argv)[1] = new char[1000]; (*argv)[2] = new char[1000]; @@ -92,19 +84,13 @@ void SeastarClientLib::ToCmdOptions(int* argc, char*** argv) { (*argv)[5] = new char[1000]; (*argv)[6] = new char[1000]; (*argv)[7] = nullptr; - - strcpy((*argv)[0], "fake_path_for_seastar"); - snprintf((*argv)[1], 1000, "--smp=%d", core_num_); - snprintf((*argv)[2], 1000, "--cpuset=%s", core_ids_.c_str()); - strcpy((*argv)[3], "--tcp_nodelay_on=1"); - strcpy((*argv)[4], "--tcp_keep_alive_idle=300"); - strcpy((*argv)[5], "--tcp_keep_alive_cnt=6"); - strcpy((*argv)[6], "--tcp_keep_alive_interval=10"); - if (is_poll_mode == "1") { - (*argv)[7] = new char[1000]; - strcpy((*argv)[7], "--poll-mode"); - (*argv)[8] = nullptr; - } + snprintf((*argv)[0], 1000, "--smp=%d", core_num_); + snprintf((*argv)[1], 1000, "--cpuset=%s", core_ids_.c_str()); + strcpy((*argv)[2], "--tcp_nodelay_on=1"); + strcpy((*argv)[3], "--tcp_keep_alive_idle=300"); + strcpy((*argv)[4], "--tcp_keep_alive_cnt=6"); + strcpy((*argv)[5], "--tcp_keep_alive_interval=10"); + strcpy((*argv)[6], "--thread-affinity=0"); } void SeastarClientLib::Stop() { diff --git a/xdl/ps-plus/ps-plus/service/seastar/lib/seastar_server_client_lib.cc b/xdl/ps-plus/ps-plus/service/seastar/lib/seastar_server_client_lib.cc index d697987d..6202d65a 100644 --- a/xdl/ps-plus/ps-plus/service/seastar/lib/seastar_server_client_lib.cc +++ b/xdl/ps-plus/ps-plus/service/seastar/lib/seastar_server_client_lib.cc @@ -45,11 +45,11 @@ const int SeastarServerClientLib::MAX_SERVER_NUM = 5000; const uint64_t SeastarServerClientLib::DEFAULT_TIMEOUT = 30 * 60 * 1000; SeastarServerClientLib::SeastarServerClientLib(int port, - int core_num, - int server_thread_num, - int client_thread_num, - bool bind_cores, - uint64_t timeout) + int core_num, + int server_thread_num, + int client_thread_num, + bool bind_cores, + uint64_t timeout) : context_(MAX_SERVER_NUM, 1, core_num, client_thread_num, @@ -57,7 +57,7 @@ SeastarServerClientLib::SeastarServerClientLib(int port, , port_(port) , core_num_(core_num) , server_thread_num_(server_thread_num) - , client_thread_num_(client_thread_num) + , client_thread_num_(client_thread_num) , bind_cores_(bind_cores) , timeout_(timeout) { } @@ -80,8 +80,8 @@ bool SeastarServerClientLib::Start() { } void SeastarServerClientLib::ToCmdOptions(int* argc, char*** argv) { - *argc = 9; - *argv = new char*[10]; + *argc = 8; + *argv = new char*[9]; (*argv)[0] = new char[1000]; (*argv)[1] = new char[1000]; (*argv)[2] = new char[1000]; @@ -90,17 +90,15 @@ void SeastarServerClientLib::ToCmdOptions(int* argc, char*** argv) { (*argv)[5] = new char[1000]; (*argv)[6] = new char[1000]; (*argv)[7] = new char[1000]; - (*argv)[8] = new char[1000]; - (*argv)[9] = nullptr; - strcpy((*argv)[0], "fake_path_for_seastar"); - snprintf((*argv)[1], 1000, "--smp=%d", core_num_); - snprintf((*argv)[2], 1000, "--cpuset=%s", core_ids_.c_str()); - snprintf((*argv)[3], 1000, "--port=%d", port_); - strcpy((*argv)[4], "--tcp_nodelay_on=1"); - strcpy((*argv)[5], "--tcp_keep_alive_idle=300"); - strcpy((*argv)[6], "--tcp_keep_alive_cnt=6"); - strcpy((*argv)[7], "--tcp_keep_alive_interval=10"); - snprintf((*argv)[8], 1000, "--thread-affinity=%d", bind_cores_ ? 1 : 0); + (*argv)[8] = nullptr; + snprintf((*argv)[0], 1000, "--smp=%d", core_num_); + snprintf((*argv)[1], 1000, "--cpuset=%s", core_ids_.c_str()); + snprintf((*argv)[2], 1000, "--port=%d", port_); + strcpy((*argv)[3], "--tcp_nodelay_on=1"); + strcpy((*argv)[4], "--tcp_keep_alive_idle=300"); + strcpy((*argv)[5], "--tcp_keep_alive_cnt=6"); + strcpy((*argv)[6], "--tcp_keep_alive_interval=10"); + snprintf((*argv)[7], 1000, "--thread-affinity=%d", bind_cores_ ? 1 : 0); printf("seastar binding cores: %s\n", bind_cores_ ? "true" : "false"); } diff --git a/xdl/ps-plus/ps-plus/service/seastar/lib/seastar_server_lib.cc b/xdl/ps-plus/ps-plus/service/seastar/lib/seastar_server_lib.cc index 80601af8..e790501e 100644 --- a/xdl/ps-plus/ps-plus/service/seastar/lib/seastar_server_lib.cc +++ b/xdl/ps-plus/ps-plus/service/seastar/lib/seastar_server_lib.cc @@ -47,13 +47,11 @@ bool SeastarServerLib::Start() { void SeastarServerLib::ToCmdOptions(int* argc, char*** argv) { std::string is_poll_mode = ps::NetUtils::GetEnv("POLL_MODE"); if (is_poll_mode == "1") { - *argc = 9; - *argv = new char*[10]; - } else { *argc = 8; - *argv = new char*[9]; + } else { + *argc = 7; } - + *argv = new char*[8]; (*argv)[0] = new char[1000]; (*argv)[1] = new char[1000]; (*argv)[2] = new char[1000]; @@ -62,21 +60,14 @@ void SeastarServerLib::ToCmdOptions(int* argc, char*** argv) { (*argv)[5] = new char[1000]; (*argv)[6] = new char[1000]; (*argv)[7] = new char[1000]; - (*argv)[8] = nullptr; - - strcpy((*argv)[0], "fake_path_for_seastar"); - snprintf((*argv)[1], 1000, "--smp=%d", core_num_); - snprintf((*argv)[2], 1000, "--cpuset=%s", core_ids_.c_str()); - snprintf((*argv)[3], 1000, "--port=%d", port_); - strcpy((*argv)[4], "--tcp_nodelay_on=1"); - strcpy((*argv)[5], "--tcp_keep_alive_idle=300"); - strcpy((*argv)[6], "--tcp_keep_alive_cnt=6"); - strcpy((*argv)[7], "--tcp_keep_alive_interval=10"); - if (is_poll_mode == "1") { - (*argv)[8] = new char[1000]; - strcpy((*argv)[8], "--poll-mode"); - (*argv)[9] = nullptr; - } + snprintf((*argv)[0], 1000, "--smp=%d", core_num_); + snprintf((*argv)[1], 1000, "--cpuset=%s", core_ids_.c_str()); + snprintf((*argv)[2], 1000, "--port=%d", port_); + strcpy((*argv)[3], "--tcp_nodelay_on=1"); + strcpy((*argv)[4], "--tcp_keep_alive_idle=300"); + strcpy((*argv)[5], "--tcp_keep_alive_cnt=6"); + strcpy((*argv)[6], "--tcp_keep_alive_interval=10"); + strcpy((*argv)[7], "--poll-mode"); } void SeastarServerLib::Stop() { diff --git a/xdl/ps-plus/ps-plus/tool/client_tool.cpp b/xdl/ps-plus/ps-plus/tool/client_tool.cpp index 98612f6c..ca6cbb92 100644 --- a/xdl/ps-plus/ps-plus/tool/client_tool.cpp +++ b/xdl/ps-plus/ps-plus/tool/client_tool.cpp @@ -14,7 +14,7 @@ limitations under the License. ==============================================================================*/ #include -#include +#include "xdl/core/utils/logging.h" #include "ps-plus/common/option_parser.h" #include "ps-plus/common/initializer.h" #include "ps-plus/common/initializer/constant_initializer.h" @@ -93,8 +93,6 @@ void densePullVariable(client::Client& client, const std::string& variable_name) } int main(int argc, char** argv) { - google::InitGoogleLogging("ps-plus"); -// FLAGS_logtostderr = 1; OptionParser optParser; optParser.addOption("-v", "--variable_name", "variable_name", OptionParser::OPT_STRING, true); optParser.addOption("-sn", "--server_num", "server_num", OptionParser::OPT_INT32, true); diff --git a/xdl/test/binary/hadoop-2.8.5/etc/hadoop/core-site.xml b/xdl/test/binary/hadoop-2.8.5/etc/hadoop/core-site.xml index 3c627cdc..49cdecae 100644 --- a/xdl/test/binary/hadoop-2.8.5/etc/hadoop/core-site.xml +++ b/xdl/test/binary/hadoop-2.8.5/etc/hadoop/core-site.xml @@ -1,28 +1 @@ - - - - - - - - - fs.defaultFS - hdfs://localhost:9090 - - - hadoop.tmp.dir - /tmp/xdl_test/hadoop/ - - + fs.defaultFS hdfs://localhost:9090 hadoop.tmp.dir /tmp/xdl_test/hadoop/ \ No newline at end of file diff --git a/xdl/test/binary/hadoop-2.8.5/etc/hadoop/hdfs-site.xml b/xdl/test/binary/hadoop-2.8.5/etc/hadoop/hdfs-site.xml index 778f3ef2..b6201713 100644 --- a/xdl/test/binary/hadoop-2.8.5/etc/hadoop/hdfs-site.xml +++ b/xdl/test/binary/hadoop-2.8.5/etc/hadoop/hdfs-site.xml @@ -1,24 +1 @@ - - - - - - - - - dfs.replication - 1 - - + dfs.replication 1 \ No newline at end of file diff --git a/xdl/test/binary/hadoop-2.8.5/lib/native/libhadoop.so b/xdl/test/binary/hadoop-2.8.5/lib/native/libhadoop.so deleted file mode 120000 index e9aafc2b..00000000 --- a/xdl/test/binary/hadoop-2.8.5/lib/native/libhadoop.so +++ /dev/null @@ -1 +0,0 @@ -libhadoop.so.1.0.0 \ No newline at end of file diff --git a/xdl/test/binary/hadoop-2.8.5/lib/native/libhadoop.so b/xdl/test/binary/hadoop-2.8.5/lib/native/libhadoop.so new file mode 100755 index 00000000..95f28390 Binary files /dev/null and b/xdl/test/binary/hadoop-2.8.5/lib/native/libhadoop.so differ diff --git a/xdl/test/binary/hadoop-2.8.5/lib/native/libhdfs.so b/xdl/test/binary/hadoop-2.8.5/lib/native/libhdfs.so deleted file mode 120000 index 2f587b56..00000000 --- a/xdl/test/binary/hadoop-2.8.5/lib/native/libhdfs.so +++ /dev/null @@ -1 +0,0 @@ -libhdfs.so.0.0.0 \ No newline at end of file diff --git a/xdl/test/binary/hadoop-2.8.5/lib/native/libhdfs.so b/xdl/test/binary/hadoop-2.8.5/lib/native/libhdfs.so new file mode 100755 index 00000000..bd45e348 Binary files /dev/null and b/xdl/test/binary/hadoop-2.8.5/lib/native/libhdfs.so differ diff --git a/xdl/test/binary/zookeeper-3.4.13/conf/zoo.cfg b/xdl/test/binary/zookeeper-3.4.13/conf/zoo.cfg index 3c3e5326..f00c6e8c 100644 --- a/xdl/test/binary/zookeeper-3.4.13/conf/zoo.cfg +++ b/xdl/test/binary/zookeeper-3.4.13/conf/zoo.cfg @@ -11,7 +11,7 @@ syncLimit=5 # example sakes. dataDir=/tmp/xdl_zookeeper # the port at which the clients will connect -clientPort=2181 +clientPort=${port} # the maximum number of client connections. # increase this if you need to handle more clients #maxClientCnxns=60 diff --git a/xdl/test/core/CMakeLists.txt b/xdl/test/core/CMakeLists.txt index 387c3ab9..a91ee61f 100644 --- a/xdl/test/core/CMakeLists.txt +++ b/xdl/test/core/CMakeLists.txt @@ -3,11 +3,6 @@ add_executable(xdl_core_lib_test ${SRC_CORE_LIB_TEST}) target_link_libraries(xdl_core_lib_test gtest gtest_main ${XDL_CORE_LIB}) add_test(NAME xdl_core_lib_test COMMAND xdl_core_lib_test) -aux_source_directory(inference SRC_CORE_INFERENCE_TEST) -add_executable(xdl_core_inference_test ${SRC_CORE_INFERENCE_TEST}) -target_link_libraries(xdl_core_inference_test gtest gtest_main ${XDL_CORE_LIB}) -add_test(NAME xdl_core_inference_test COMMAND xdl_core_inference_test) - aux_source_directory(grappler SRC_CORE_FRAMEWORK_TEST) aux_source_directory(framework SRC_CORE_FRAMEWORK_TEST) add_executable(xdl_core_framework_test ${SRC_CORE_FRAMEWORK_TEST}) diff --git a/xdl/test/core/backend/mxnet/convert_utils_test.cc b/xdl/test/core/backend/mxnet/convert_utils_test.cc index 693c0646..6f412ecb 100644 --- a/xdl/test/core/backend/mxnet/convert_utils_test.cc +++ b/xdl/test/core/backend/mxnet/convert_utils_test.cc @@ -14,7 +14,6 @@ limitations under the License. ==============================================================================*/ #include "gtest/gtest.h" -#include "glog/logging.h" #include "xdl/core/framework/tensor.h" #include "xdl/core/backend/mxnet/mxnet_runner.h" #include "xdl/core/backend/mxnet/convert_utils.h" diff --git a/xdl/test/core/backend/mxnet/mxnet_backend_dnn_test.cc b/xdl/test/core/backend/mxnet/mxnet_backend_dnn_test.cc index 11d51c32..9c762d98 100644 --- a/xdl/test/core/backend/mxnet/mxnet_backend_dnn_test.cc +++ b/xdl/test/core/backend/mxnet/mxnet_backend_dnn_test.cc @@ -14,7 +14,6 @@ limitations under the License. ==============================================================================*/ #include "gtest/gtest.h" -#include "glog/logging.h" #include "xdl/core/framework/tensor.h" #include "xdl/core/utils/file_utils.h" #include "xdl/core/backend/device_singleton.h" diff --git a/xdl/test/core/backend/mxnet/mxnet_backend_dummy_test.cc b/xdl/test/core/backend/mxnet/mxnet_backend_dummy_test.cc index 15030a1b..e9b1538c 100644 --- a/xdl/test/core/backend/mxnet/mxnet_backend_dummy_test.cc +++ b/xdl/test/core/backend/mxnet/mxnet_backend_dummy_test.cc @@ -14,7 +14,6 @@ limitations under the License. ==============================================================================*/ #include "gtest/gtest.h" -#include "glog/logging.h" #include "xdl/core/framework/tensor.h" #include "xdl/core/utils/file_utils.h" #include "xdl/core/backend/device_singleton.h" diff --git a/xdl/test/core/backend/mxnet/mxnet_backend_test.cc b/xdl/test/core/backend/mxnet/mxnet_backend_test.cc index 6d98b0ca..ff769af3 100644 --- a/xdl/test/core/backend/mxnet/mxnet_backend_test.cc +++ b/xdl/test/core/backend/mxnet/mxnet_backend_test.cc @@ -14,7 +14,6 @@ limitations under the License. ==============================================================================*/ #include "gtest/gtest.h" -#include "glog/logging.h" #include "xdl/core/framework/tensor.h" #include "xdl/core/utils/file_utils.h" #include "xdl/core/backend/device_singleton.h" diff --git a/xdl/test/core/backend/tf/convert_utils_test.cc b/xdl/test/core/backend/tf/convert_utils_test.cc index e035f621..73190bd2 100644 --- a/xdl/test/core/backend/tf/convert_utils_test.cc +++ b/xdl/test/core/backend/tf/convert_utils_test.cc @@ -14,7 +14,6 @@ limitations under the License. ==============================================================================*/ #include "gtest/gtest.h" -#include "glog/logging.h" #include "xdl/core/framework/tensor.h" #include "xdl/core/backend/tf/convert_utils.h" #include "xdl/core/backend/device_singleton.h" diff --git a/xdl/test/core/backend/tf/tf_backend_test.cc b/xdl/test/core/backend/tf/tf_backend_test.cc index db578367..73d4c7f0 100644 --- a/xdl/test/core/backend/tf/tf_backend_test.cc +++ b/xdl/test/core/backend/tf/tf_backend_test.cc @@ -14,7 +14,6 @@ limitations under the License. ==============================================================================*/ #include "gtest/gtest.h" -#include "glog/logging.h" #include "xdl/core/framework/tensor.h" #include "xdl/core/utils/file_utils.h" #include "xdl/core/backend/tf/tf_runner.h" diff --git a/xdl/test/core/framework/grappler_test.cc b/xdl/test/core/framework/grappler_test.cc index 55e5fd15..e1cc542f 100644 --- a/xdl/test/core/framework/grappler_test.cc +++ b/xdl/test/core/framework/grappler_test.cc @@ -80,11 +80,10 @@ OutputSpec CreateOutput() { TEST(GrapplerTest, Grappler) { xdl::GraphDef def = CreateDef(); xdl::OutputSpec output = CreateOutput(); - xdl::InputSpec input; GrapplerRegistry *registry = GrapplerRegistry::Get(); ASSERT_TRUE(registry != nullptr); - Status st = registry->Process(input, &def, &output); + Status st = registry->Process(&def, &output); ASSERT_EQ(st, Status::Ok()); } diff --git a/xdl/test/core/framework/op_registry_test.cc b/xdl/test/core/framework/op_registry_test.cc index 51d2dcdf..1154d0c4 100644 --- a/xdl/test/core/framework/op_registry_test.cc +++ b/xdl/test/core/framework/op_registry_test.cc @@ -14,7 +14,6 @@ limitations under the License. ==============================================================================*/ #include "gtest/gtest.h" -#include "glog/logging.h" #include "xdl/core/framework/op_registry.h" using xdl::OpKernelBase; diff --git a/xdl/test/core/framework/tensor_test.cc b/xdl/test/core/framework/tensor_test.cc index 82cab34d..a24738fd 100644 --- a/xdl/test/core/framework/tensor_test.cc +++ b/xdl/test/core/framework/tensor_test.cc @@ -14,7 +14,6 @@ limitations under the License. ==============================================================================*/ #include "gtest/gtest.h" -#include "glog/logging.h" #include "xdl/core/framework/tensor.h" using xdl::Tensor; diff --git a/xdl/test/core/inference/serving_test.cc b/xdl/test/core/inference/serving_test.cc deleted file mode 100644 index 6cb5c37f..00000000 --- a/xdl/test/core/inference/serving_test.cc +++ /dev/null @@ -1,52 +0,0 @@ -/* Copyright (C) 2016-2018 Alibaba Group Holding Limited - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ - -#include "gtest/gtest.h" -#include "glog/logging.h" -#include "xdl/core/utils/file_utils.h" -#include "test/util/test_utils.h" -#include "xdl/core/inference/serving.h" -#include "xdl/core/backend/device_singleton.h" - -using namespace xdl; - -namespace { - -TEST(ServingTest, TestWithTagDef) { - { - std::string graph_path = "../test_data/inference/ckpt/graph.txt"; - std::string ckpt_dir = "../test_data/inference/ckpt"; - std::string ckpt_version = "v1"; - Serving serving(ckpt_dir); - ASSERT_TRUE(serving.Init(graph_path, ckpt_version).IsOk()); - Executor::Feeds feeds; - feeds.push_back({"sparse0.ids", TestUtils::MakeTensor({0,988,0,62,0,131,0,635,0,310,0,455,0,336,0,873,0,633,0,518,0,731,0,978,0,17}, {13,2})}); - feeds.push_back({"sparse0.values", TestUtils::MakeTensor({0.462050,0.909760,0.715116,0.845752,0.610643,0.169108,0.953582,0.443327,0.030230,0.622898,0.733503,0.332480,0.573710}, {13})}); - feeds.push_back({"sparse0.segments", TestUtils::MakeTensor({13}, {1})}); - feeds.push_back({"sparse1.ids", TestUtils::MakeTensor({0,480,0,733,0,710,0,914,0,634,0,695,0,729,0,132,0,217,0,494,0,392,0,533,0,211,0,950,0,596,0,230,0,431,0,282,0,341}, {19,2})}); - feeds.push_back({"sparse1.values", TestUtils::MakeTensor({0.263620,0.027927,0.199425,0.903399,0.704284,0.635139,0.524406,0.275044,0.288276,0.807933,0.075038,0.173196,0.021525,0.810449,0.669214,0.471364,0.334187,0.151534,0.793695}, {19})}); - feeds.push_back({"sparse1.segments", TestUtils::MakeTensor({19}, {1})}); - feeds.push_back({"deep0.values", TestUtils::MakeTensor({0.011690,0.072661,0.012773,0.497300,0.656102,0.385087,0.846656,0.048085,0.011000,0.863605,0.275154,0.430491,0.207569,0.544758,0.780895,0.416272,0.858965,0.655775,0.462375,0.077353,0.295894,0.594692,0.438903,0.283392,0.540657,0.869890,0.349668,0.385125,0.329977,0.887843,0.425104,0.579968,0.053477,0.723641,0.289681,0.587159,0.628797,0.968358,0.996349,0.196942,0.875995,0.475879,0.811794,0.291763,0.851498,0.673549,0.070889,0.353601,0.847294,0.188653,0.499241,0.319653,0.796363,0.056922,0.039318,0.449564,0.107104,0.955146,0.860472,0.526347,0.982254,0.655419,0.748709,0.870242,0.874448,0.573869,0.873185,0.268479,0.320429,0.961806,0.673799,0.282271,0.353751,0.425874,0.190134,0.508951,0.444349,0.610549,0.610728,0.414319,0.883142,0.951144,0.262990,0.881435,0.686916,0.056805,0.438482,0.511482,0.650849,0.397393,0.965502,0.905666,0.135603,0.337483,0.118374,0.773380,0.322721,0.809750,0.284590,0.293164,0.731300,0.116791,0.201154,0.204524,0.095560,0.957432,0.818350,0.667117,0.981084,0.417561,0.487987,0.280055,0.315215,0.248960,0.865737,0.484733,0.958408,0.914768,0.910045,0.105318,0.734690,0.807400,0.806441,0.261733,0.872888,0.840520,0.692946,0.841746,0.038020,0.369281,0.500997,0.087760,0.446047,0.368810,0.426557,0.768465,0.395198,0.967053,0.590749,0.262509,0.758114,0.696760,0.151753,0.985716,0.294055,0.581717,0.521879,0.543686,0.756559,0.257276,0.436682,0.197747,0.037379,0.947728,0.383694,0.161544,0.259172,0.984394,0.300147,0.452491,0.911634,0.608224,0.618608,0.225436,0.930741,0.473881,0.300398,0.622700,0.730416,0.398802,0.293478,0.893828,0.278531,0.919002,0.427858,0.718807,0.003702,0.494992,0.310552,0.487752,0.250914,0.766800,0.145656,0.157410,0.298930,0.559552,0.468093,0.474567,0.124676,0.479369,0.782388,0.203840,0.695210,0.466275,0.516355,0.869807,0.183799,0.245824,0.728539,0.733798,0.436823,0.870649,0.121996,0.152889,0.084488,0.003179,0.245625,0.640358,0.373756,0.329289,0.479861,0.981833,0.486936,0.635539,0.354637,0.193547,0.841311,0.024777,0.097900,0.292391,0.663801,0.777566,0.146430,0.925205,0.860497,0.352129,0.342704,0.636091,0.271126,0.233050,0.229509,0.773627,0.805742,0.286443,0.150001,0.916064,0.410454,0.811541,0.222059,0.662017,0.379142,0.845451,0.531727,0.793938,0.576745,0.565500,0.970726,0.782866,0.173878,0.961354,0.955934,0.853337,0.145354,0.234441,0.910444,0.780746}, {1,256})}); - feeds.push_back({"label", TestUtils::MakeTensor({1.0}, {1,1})}); - std::vector results; - ASSERT_TRUE(serving.Predict(feeds, &results).IsOk()); - ASSERT_EQ(1, results.size()); - float* base = results[0].Raw(); - ASSERT_FLOAT_EQ(0.81805933, *base); - } -} - -} - diff --git a/xdl/test/core/lib/any_test.cc b/xdl/test/core/lib/any_test.cc index 1f3462f6..e1c13b65 100644 --- a/xdl/test/core/lib/any_test.cc +++ b/xdl/test/core/lib/any_test.cc @@ -31,8 +31,6 @@ limitations under the License. #include "xdl/core/lib/any.h" #include "gtest/gtest.h" -#include "glog/logging.h" - namespace xdl { TEST(AnyTest, TestAll) { diff --git a/xdl/test/core/lib/atomic_test.cc b/xdl/test/core/lib/atomic_test.cc index e0fa6116..f90c2cd1 100644 --- a/xdl/test/core/lib/atomic_test.cc +++ b/xdl/test/core/lib/atomic_test.cc @@ -14,7 +14,6 @@ limitations under the License. ==============================================================================*/ #include "gtest/gtest.h" -#include "glog/logging.h" #include "xdl/core/lib/atomic.h" using namespace xdl::common; diff --git a/xdl/test/core/lib/refcount_test.cc b/xdl/test/core/lib/refcount_test.cc index 8279f404..6428b249 100644 --- a/xdl/test/core/lib/refcount_test.cc +++ b/xdl/test/core/lib/refcount_test.cc @@ -14,7 +14,6 @@ limitations under the License. ==============================================================================*/ #include "gtest/gtest.h" -#include "glog/logging.h" #include "xdl/core/lib/refcount.h" using xdl::RefCounted; diff --git a/xdl/test/core/lib/threadpool_test.cc b/xdl/test/core/lib/threadpool_test.cc index 09a7adb0..62088865 100644 --- a/xdl/test/core/lib/threadpool_test.cc +++ b/xdl/test/core/lib/threadpool_test.cc @@ -14,21 +14,21 @@ limitations under the License. ==============================================================================*/ #include "gtest/gtest.h" -#include "glog/logging.h" +#include "xdl/core/utils/logging.h" #include "xdl/core/lib/thread_pool.h" namespace xdl { TEST(ThreadPoolTest, ThreadPool) { ThreadPool *pool = new ThreadPool(1); - CHECK(pool != nullptr); + XDL_CHECK(pool != nullptr); pool->Schedule([] () { std::cout << "hello\n"; }); delete pool; pool = ThreadPool::Global(); - CHECK(pool != nullptr); + XDL_CHECK(pool != nullptr); } } diff --git a/xdl/test/core/lib/timer_test.cc b/xdl/test/core/lib/timer_test.cc index 2f207d91..6737b951 100644 --- a/xdl/test/core/lib/timer_test.cc +++ b/xdl/test/core/lib/timer_test.cc @@ -31,16 +31,14 @@ limitations under the License. #include +#include "xdl/core/utils/logging.h" #include "xdl/core/lib/timer.h" #include "gtest/gtest.h" -#include "glog/logging.h" - namespace xdl { TEST(TimerTest, TestTimer) { { - LOG(INFO) << "...."; XDL_TIMER_NOW(t1); XDL_TIMER_START(t1); XDL_TIMER_STOP(t1); @@ -50,9 +48,9 @@ TEST(TimerTest, TestTimer) { tc_keeper::Instance()->ResetAll(); tc_keeper::Instance()->Step(3); TimerCore *tc = tc_keeper::Instance()->Get("hello"); - CHECK(tc != nullptr); + XDL_CHECK(tc != nullptr); Timer *t1 = new Timer("hello", tc); - CHECK(t1 != nullptr); + XDL_CHECK(t1 != nullptr); t1->Start(); sleep(1); t1->Reset(); @@ -64,9 +62,9 @@ TEST(TimerTest, TestTimer) { { TimerCore *tc = tc_keeper::Instance()->Get("hello"); - CHECK(tc != nullptr); + XDL_CHECK(tc != nullptr); TimerScope *ts = new TimerScope("world", tc); - CHECK(ts != nullptr); + XDL_CHECK(ts != nullptr); delete ts; } } diff --git a/xdl/test/core/utils/time_utils_test.cc b/xdl/test/core/utils/time_utils_test.cc index 2fe90e57..3bbe90e7 100644 --- a/xdl/test/core/utils/time_utils_test.cc +++ b/xdl/test/core/utils/time_utils_test.cc @@ -31,8 +31,6 @@ limitations under the License. #include "xdl/core/utils/time_utils.h" #include "gtest/gtest.h" -#include "glog/logging.h" - namespace xdl { TEST(TimeUtilTest, TestAll) { diff --git a/xdl/test/data_io/CMakeLists.txt b/xdl/test/data_io/CMakeLists.txt index a8193008..643a0584 100644 --- a/xdl/test/data_io/CMakeLists.txt +++ b/xdl/test/data_io/CMakeLists.txt @@ -1,8 +1,8 @@ aux_source_directory(op SRC_CORE_LIB_TEST) -xdl_add_test( . ".cc" xdl_io xdl_core rdkafka++ jsoncpp glog libprotobuf gtest gtest_main test_util) -xdl_add_test( op/feature_op ".cc" xdl_io xdl_core rdkafka++ jsoncpp glog libprotobuf gtest gtest_main) -xdl_add_test( parser ".cc" xdl_io xdl_core glog rdkafka++ jsoncpp libprotobuf gtest gtest_main) -xdl_add_test( packer ".cc" xdl_io xdl_core glog jsoncpp libprotobuf gtest gtest_main) -xdl_add_test( merger ".cc" xdl_io xdl_core glog jsoncpp libprotobuf gtest gtest_main) -xdl_add_test( fs ".cc" xdl_io xdl_core glog jsoncpp libprotobuf gtest gtest_main test_util) +xdl_add_test_exclude( . ".cc" "global_scheduler_test" ${XDL_IO_LIB} ${XDL_CORE_LIB} gtest gtest_main test_util) +xdl_add_test( op/feature_op ".cc" ${XDL_IO_LIB} ${XDL_CORE_LIB} gtest gtest_main test_util) +xdl_add_test( parser ".cc" ${XDL_IO_LIB} ${XDL_CORE_LIB} gtest gtest_main test_util) +xdl_add_test( packer ".cc" ${XDL_IO_LIB} ${XDL_CORE_LIB} gtest gtest_main test_util) +xdl_add_test( merger ".cc" ${XDL_IO_LIB} ${XDL_CORE_LIB} gtest gtest_main test_util) +xdl_add_test( fs ".cc" ${XDL_IO_LIB} ${XDL_CORE_LIB} gtest gtest_main test_util) diff --git a/xdl/test/data_io/data_io_hdfs_test.cc b/xdl/test/data_io/data_io_hdfs_test.cc deleted file mode 100644 index 81360169..00000000 --- a/xdl/test/data_io/data_io_hdfs_test.cc +++ /dev/null @@ -1,180 +0,0 @@ -/* Copyright (C) 2016-2018 Alibaba Group Holding Limited - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ - -#include "xdl/data_io/data_io.h" -#include "xdl/data_io/op/debug_op.h" -#include "test/util/hdfs_launcher.h" -#include "xdl/data_io/parser/parser.h" -#include "xdl/data_io/fs/file_system_hdfs.h" -#include "gtest/gtest.h" - -#include - -const char *path = "hdfs://127.0.0.1:9090/test_data/data_io/sample.txt"; -const char *dir = "hdfs://127.0.0.1:9090/test_data/data_io/"; -size_t epochs = 1; - -namespace xdl { -namespace io { - -class DataIOTest: public ::testing::Test { - public: - void SetUp() override { - if (false == ps::HDFSLauncher::Start()) { - skip_ = true; - } - if (skip_) { - GTEST_SKIP(); - return; - } - - DataIO *data_io = new DataIO("test", kTxt, kHdfs, "hdfs://127.0.0.1:9090"); - EXPECT_NE(nullptr, data_io); - - data_io->SetEpochs(10); - data_io->SetBatchSize(kBatchSize); - data_io->SetLabelCount(kLabelCount); - - data_io->AddFeatureOpt("ufav3", kSparse); - data_io->AddFeatureOpt("upv14", kSparse); - data_io->AddFeatureOpt("a", kDense, 0, 3); - data_io->AddFeatureOpt("s", kDense, 0, 1); - - data_io_ = data_io; - } - - void TearDown() override { - if (!skip_) { - ps::HDFSLauncher::Stop(); - } - } - - static void TestRun(const char *); - static void TestHdfs(const char *); - static void TestAnt(const char *); - - static const size_t kBatchSize; - static const size_t kLabelCount; - - static DataIO *data_io_; - -private: - bool skip_ = false; -}; - -const size_t DataIOTest::kBatchSize = 1024; -const size_t DataIOTest::kLabelCount = 2; - - -DataIO *DataIOTest::data_io_ = nullptr; - -void DataIOTest::TestRun(const char *path) { - //data_io_->SetMeta(meta); - data_io_->AddPath(path); - data_io_->SetEpochs(epochs); - - //data_io_->AddOp(new DebugOP); - - data_io_->Startup(); - - const Batch *batch; - do { - batch = data_io_->GetBatch(); - if (batch != nullptr) { - XDL_CHECK(batch->Get("ufav3") !=nullptr); - XDL_CHECK(batch->Get("upv14") !=nullptr); - XDL_CHECK(batch->Get("a") !=nullptr); - XDL_CHECK(batch->Get("s") !=nullptr); - std::cerr << "."; - } - } while(batch != nullptr); - - std::cerr << std::endl; - - data_io_->Shutdown(); -} - -void DataIOTest::TestHdfs(const char *path) { - auto fs = FileSystemHdfs::Get("hdfs://127.0.0.1:9090"); - XDL_CHECK(fs != nullptr); - FileSystemHdfs *hdfs = reinterpret_cast(fs); - XDL_CHECK(hdfs != nullptr); - XDL_CHECK(hdfs->IsReg(path) == true); - XDL_CHECK(hdfs->IsDir(path) == false); - - auto files = hdfs->Dir(dir); - XDL_CHECK(files.size() > 1); - - size_t st = hdfs->Size(path); - XDL_CHECK(st > 1); - - void *fd = hdfs->Open(path, "r"); - XDL_CHECK(fd != nullptr); - - std::string node = hdfs->Path2Node("ftp://192.168.0.1"); - XDL_CHECK(node == ""); - node = hdfs->Path2Node("hdfs://192.168.0.1/hello"); - XDL_CHECK(node == "hdfs://192.168.0.1"); - - std::string content = "What is nature's call?"; - std::string file_name = std::string(dir) + "/write.test"; - HdfsWrite(file_name, content); - XDL_CHECK(HdfsRead(file_name) == content); -} - -void DataIOTest::TestAnt(const char *path) { - auto fs = GetHdfsFileSystem(path); - XDL_CHECK(fs != nullptr); - - std::string file_name = std::string(dir) + "/ioant.test"; - std::string content = "Fire, earth, storm. Hear my call!"; - auto ant = fs->GetAnt(file_name.c_str(), 'w'); - XDL_CHECK(ant != nullptr); - - ssize_t res = ant->Write(content.c_str(), content.length()); - XDL_CHECK(res == content.length()); - - delete ant; /* Need it to sync hdfs ! */ - - fs = GetHdfsFileSystem(path); - XDL_CHECK(fs != nullptr); - - ant = fs->GetAnt(file_name.c_str(), 'r'); - char buff[1024]; - res = ant->Read(buff, content.length()); - XDL_CHECK(res == content.length()); -} - -TEST_F(DataIOTest, Run) { - TestRun(path); -} - -TEST_F(DataIOTest, Hdfs) { - TestHdfs(path); -} - -TEST_F(DataIOTest, Ant) { - TestAnt(path); -} - -} -} - -int main(int argc, char **argv) -{ - ::testing::InitGoogleTest(&argc, argv); - return RUN_ALL_TESTS(); -} - diff --git a/xdl/test/data_io/data_io_kafaka_test.cc b/xdl/test/data_io/data_io_kafaka_test.cc index b37bce51..240a89cb 100644 --- a/xdl/test/data_io/data_io_kafaka_test.cc +++ b/xdl/test/data_io/data_io_kafaka_test.cc @@ -18,6 +18,7 @@ limitations under the License. #include "xdl/data_io/parser/parser.h" #include "xdl/data_io/fs/file_system_kafka.h" #include "gtest/gtest.h" +#include "xdl/core/utils/logging.h" size_t epochs = 1; @@ -113,8 +114,8 @@ void DataIOKafkaTest::TestKafkaAnt(const char *path) { TEST_F(DataIOKafkaTest, Run) { //TestRun("earth:0"); - //TestDir(); - //TestKafkaAnt("earth:0"); + TestDir(); + TestKafkaAnt("earth:0"); } } diff --git a/xdl/test/data_io/data_io_state_test.cc b/xdl/test/data_io/data_io_state_test.cc index bf182b42..d284742b 100644 --- a/xdl/test/data_io/data_io_state_test.cc +++ b/xdl/test/data_io/data_io_state_test.cc @@ -18,6 +18,7 @@ limitations under the License. #include "xdl/data_io/parser/parser.h" #include "xdl/data_io/fs/file_system_local.h" #include "gtest/gtest.h" +#include "xdl/core/utils/logging.h" #include @@ -63,18 +64,13 @@ class DataIOTest: public ::testing::Test { void DataIOTest::TestState(void) { data_io_->Init(); std::string text = data_io_->Store(); - delete data_io_; - data_io_ = nullptr; std::cout << " >>> " << text << std::endl; EXPECT_NE(0, text.size()); - DataIO *data_io = new DataIO("test", kTxt, kLocal, ""); - EXPECT_NE(nullptr, data_io); - - data_io->Restore(text); - data_io->Init(); + data_io_->Restore(text); + data_io_->Init(); } void DataIOTest::TestLocal(void) { diff --git a/xdl/test/data_io/data_io_test.cc b/xdl/test/data_io/data_io_test.cc index 3d268feb..b0cde4e1 100644 --- a/xdl/test/data_io/data_io_test.cc +++ b/xdl/test/data_io/data_io_test.cc @@ -17,6 +17,7 @@ limitations under the License. #include "xdl/data_io/op/debug_op.h" #include "xdl/data_io/parser/parser.h" #include "gtest/gtest.h" +#include "xdl/core/utils/logging.h" #include @@ -102,9 +103,7 @@ void DataIOTest::TestRun(const char *path) { auto blk = batch->Get("skey"); auto sbuf = blk->ts_[Block::kSBuf]; - auto slen = blk->ts_[Block::kIndex]; XDL_CHECK(sbuf != nullptr); - XDL_CHECK(slen != nullptr); auto dims = sbuf->Shape().Dims(); XDL_CHECK(dims.size() == 2); @@ -113,17 +112,12 @@ void DataIOTest::TestRun(const char *path) { size_t max_len = dims[1]; - dims = slen->Shape().Dims(); - XDL_CHECK(dims.size() == 1); - XDL_CHECK(dims[0] == kBatchSize); - auto sbufs = sbuf->Raw(); - auto slens = slen->Raw(); /* for (size_t i = 0; i < kBatchSize; ++i) { - unsigned len = slens[i]; - XDL_CHECK(len <= max_len) << i << " len=" << len << ", max_len=" << max_len; + unsigned len = strlen(&sbufs[i*max_len]); + XDL_CHECK(len < max_len) << i << " len=" << len << ", max_len=" << max_len; char *sk = (char *)&sbufs[i*max_len]; std::cout << ">>> " << std::string(sk, len) << std::endl; } diff --git a/xdl/test/data_io/fs/hdfs_test.cc b/xdl/test/data_io/fs/hdfs_test.cc deleted file mode 100644 index 16ea0ebf..00000000 --- a/xdl/test/data_io/fs/hdfs_test.cc +++ /dev/null @@ -1,68 +0,0 @@ -/* Copyright (C) 2016-2018 Alibaba Group Holding Limited - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ - -#include "xdl/data_io/fs/file_system.h" -#include "test/util/hdfs_launcher.h" -#include "gtest/gtest.h" - -#include -#include - -namespace xdl { -namespace io { - -const char *path = "hdfs://127.0.0.1:9090/test_data/data_io"; - -class HdfsTest : public testing::Test { - public: - void SetUp() override { - if (false == ps::HDFSLauncher::Start()) { - skip_ = true; - } - if (skip_) { - GTEST_SKIP(); - } - } - - void TearDown() override { - if (!skip_) { - ps::HDFSLauncher::Stop(); - } - } - - private: - bool skip_ = false; -}; - -TEST_F(HdfsTest, TestHdfs) { - auto fs = GetFileSystem(kHdfs, "hdfs://127.0.0.1:9090"); - std::cout << "connect" << std::endl; - - auto ret = fs->IsDir(path); - ASSERT_TRUE(ret); - - auto paths = fs->Dir("hdfs://127.0.0.1:9090/test_data/data_io"); - - EXPECT_GT(paths.size(), 0); - for (auto &path: paths) { - std::cout << path << std::endl; - } - - auto size = fs->Size("hdfs://127.0.0.1:9090/test_data/data_io/tdm.dat"); - std::cout << "size=" << size << std::endl; -} - -} -} diff --git a/xdl/test/data_io/fs/zlib_test.cc b/xdl/test/data_io/fs/zlib_test.cc new file mode 100644 index 00000000..ee49c742 --- /dev/null +++ b/xdl/test/data_io/fs/zlib_test.cc @@ -0,0 +1,86 @@ +/* Copyright (C) 2016-2018 Alibaba Group Holding Limited + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "xdl/data_io/data_io.h" +#include "xdl/data_io/op/debug_op.h" +#include "xdl/data_io/parser/parser.h" +#include "xdl/data_io/fs/zlib_ant.h" +#include "xdl/data_io/fs/file_system_local.h" +#include "gtest/gtest.h" +#include "xdl/core/utils/logging.h" + +namespace xdl { +namespace io { + +class FSZlibTest: public ::testing::Test { + public: + static void SetUpTestCase() { + } + + static void TearDownTestCase() { + } + + static void TestZlibAnt(const char *); +}; + +void FSZlibTest::TestZlibAnt(const char *path) { + auto fs = FileSystemLocal::Get(); + XDL_CHECK(fs != nullptr); + // content is "abcdefghijklmnopqrstuvwxyz1234567890" * 10 + IOAnt* local_ant = fs->GetAnt("./zlib_test_data", 'r'); + XDL_CHECK(local_ant != nullptr); + //ZlibCompressionOptions options = ZlibCompressionOptions::DEFAULT(); + //IOAnt* ant = new ZlibAnt(local_ant, options); + IOAnt* ant = new ZlibAnt(local_ant); + + char buff[1024]; + memset(buff, 0, sizeof(buff)); + const char* str = "abcdefghijklmnopqrstuvwxyz1234567890"; + for (size_t i = 0; i < 9; i++) { + ssize_t ret = ant->Read(buff, 36); + EXPECT_EQ(ret, 36); + EXPECT_STREQ(str, buff); + } + ssize_t last = ant->Read(buff, 100); + EXPECT_EQ(last, 36); + EXPECT_STREQ(str, buff); + + //SEEK to begin + XDL_CHECK(ant->Seek(0) == 0); + ssize_t ret = ant->Read(buff, 1000); + EXPECT_EQ(ret, 360); + char tmp[1024]; + for (size_t i = 0; i < 10; i++) { + strncpy(tmp, &buff[i*36], 36); + tmp[36] = 0; + EXPECT_STREQ(str, tmp); + } + EXPECT_EQ(ant->Read(buff, 1000), 0); + + //SEEK to spec + memset(buff, 0, sizeof(buff)); + XDL_CHECK(ant->Seek(36*9) == 36*9); + ret = ant->Read(buff, 1000); + EXPECT_EQ(ret, 36); + EXPECT_STREQ(str, buff); + EXPECT_EQ(ant->Read(buff, 1000), 0); +} + +TEST_F(FSZlibTest, Run) { + TestZlibAnt("earth:0"); +} + +} +} diff --git a/xdl/test/data_io/global_scheduler_test.cc b/xdl/test/data_io/global_scheduler_test.cc new file mode 100644 index 00000000..b9b47922 --- /dev/null +++ b/xdl/test/data_io/global_scheduler_test.cc @@ -0,0 +1,113 @@ +/* Copyright (C) 2016-2018 Alibaba Group Holding Limited + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "xdl/data_io/global_scheduler.h" +#include "gtest/gtest.h" +#include "xdl/core/ops/ps_ops/client.h" + +#include + +namespace xdl { +namespace io { + +static const char *path = "sample.txt"; +static const char *path2 = "sample2.txt"; + +TEST(GlobalSchedulerTest, TestSchedule) { + ConnectToClient("localhost", "./v1"); + GlobalScheduler sched("g1", kLocal); + sched.SetEpochs(2); + sched.AddPath(path); + sched.AddPath(path2); + ASSERT_TRUE(sched.Schedule()); + ReadParam *rparam = nullptr; + for (int i = 0; i < 6; ++i) { + rparam = sched.Acquire(); + if (i >= 4) { + ASSERT_EQ(nullptr, rparam); + continue; + } + ASSERT_NE(nullptr, rparam); + EXPECT_EQ(0, rparam->begin_); + EXPECT_EQ(i<2?0:1, rparam->epoch_); + EXPECT_GE(rparam->end_, 0); + EXPECT_NE(nullptr, rparam->ant_); + } +} + + +TEST(GlobalSchedulerTest, TestRestore) { + ResetClient(); + ConnectToClient("localhost", "./v1"); + GlobalScheduler sched("g1", kLocal); + sched.SetEpochs(2); + + sched.AddPath(path); + sched.AddPath(path2); + + ASSERT_TRUE(sched.Schedule()); + auto rparam = sched.Acquire(); + ASSERT_NE(nullptr, rparam); + EXPECT_EQ(0, rparam->begin_); + EXPECT_EQ(0, rparam->epoch_); + EXPECT_GE(rparam->end_, 0); + EXPECT_STREQ(rparam->path_, path); + EXPECT_NE(nullptr, rparam->ant_); + + rparam->begin_ = 1; + + rparam = sched.Acquire(); + ASSERT_NE(nullptr, rparam); + EXPECT_EQ(0, rparam->begin_); + EXPECT_EQ(0, rparam->epoch_); + EXPECT_GE(rparam->end_, 0); + EXPECT_STREQ(rparam->path_, path2); + EXPECT_NE(nullptr, rparam->ant_); + + rparam->begin_ = 2; + + DSState ds_state; + sched.Store(&ds_state); + + GlobalScheduler sched2("g1", kLocal); + sched2.Restore(ds_state); + + ASSERT_TRUE(sched2.Schedule()); + + for (int i = 0; i < 6; ++i) { + rparam = sched2.Acquire(); + if (i >= 4) { + ASSERT_EQ(nullptr, rparam); + continue; + } + ASSERT_NE(nullptr, rparam); + if (i == 0) { + EXPECT_EQ(2, rparam->begin_); + EXPECT_STREQ(rparam->path_, path2); + } else if (i == 1) { + EXPECT_EQ(1, rparam->begin_); + EXPECT_STREQ(rparam->path_, path); + } else { + EXPECT_EQ(0, rparam->begin_); + } + + EXPECT_EQ(i<2?0:1, rparam->epoch_); + EXPECT_GE(rparam->end_, 0); + EXPECT_NE(nullptr, rparam->ant_); + } +} + +} +} diff --git a/xdl/test/data_io/merger/merger_test.cc b/xdl/test/data_io/merger/merger_test.cc index e0c0723d..629498e6 100644 --- a/xdl/test/data_io/merger/merger_test.cc +++ b/xdl/test/data_io/merger/merger_test.cc @@ -63,6 +63,7 @@ void MergerTest::SetUpTestCase() { merger_ = new Merger(&schema_, dev); auto a = batch_.GetMutable("a"); a->ts_[Block::kKey] = new Tensor(dev, TensorShape({kFeatureCount, 1}), types::kInt64); + a->ts_[Block::kSegment] = new Tensor(dev, TensorShape({kFeatureCount, 1}), types::kInt32); auto keys = a->ts_[Block::kKey]->Raw(); int r = kFeatureCount / 2 + 1; for (size_t i = 0; i < kFeatureCount; ++i) { @@ -74,6 +75,7 @@ void MergerTest::SetUpTestCase() { auto b = batch_.GetMutable("b"); b->ts_[Block::kKey] = new Tensor(dev, TensorShape({kFeatureCount, 2}), types::kInt64); b->ts_[Block::kIndex] = new Tensor(dev, TensorShape({kFeatureCount}), types::kInt32); + b->ts_[Block::kSegment] = new Tensor(dev, TensorShape({kFeatureCount, 1}), types::kInt32); keys = b->ts_[Block::kKey]->Raw(); r = std::sqrt(kFeatureCount) + 1; for (size_t i = 0; i < kFeatureCount; ++i) { @@ -98,16 +100,22 @@ TEST_F(MergerTest, TestRun) { EXPECT_NE(nullptr, a->ts_[Block::kKey]); EXPECT_NE(nullptr, a->ts_[Block::kUKey]); EXPECT_NE(nullptr, a->ts_[Block::kIndex]); + EXPECT_NE(nullptr, a->ts_[Block::kSIndex]); + EXPECT_NE(nullptr, a->ts_[Block::kSSegment]); auto b = batch_.Get("b"); EXPECT_NE(nullptr, b->ts_[Block::kKey]); - EXPECT_NE(nullptr, a->ts_[Block::kUKey]); + EXPECT_NE(nullptr, b->ts_[Block::kUKey]); EXPECT_NE(nullptr, b->ts_[Block::kIndex]); + EXPECT_NE(nullptr, b->ts_[Block::kSIndex]); + EXPECT_NE(nullptr, b->ts_[Block::kSSegment]); auto c = batch_.Get("c"); EXPECT_EQ(nullptr, c->ts_[Block::kKey]); EXPECT_EQ(nullptr, c->ts_[Block::kUKey]); EXPECT_NE(nullptr, c->ts_[Block::kIndex]); + EXPECT_EQ(nullptr, c->ts_[Block::kSIndex]); + EXPECT_EQ(nullptr, c->ts_[Block::kSSegment]); } } // io diff --git a/xdl/test/data_io/packer/pack_cutoff_test.cc b/xdl/test/data_io/packer/pack_cutoff_test.cc new file mode 100644 index 00000000..e44ded4a --- /dev/null +++ b/xdl/test/data_io/packer/pack_cutoff_test.cc @@ -0,0 +1,263 @@ +/* Copyright (C) 2016-2018 Alibaba Group Holding Limited + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "xdl/data_io/packer/pack_feature.h" + +#include +#include +#include +#include +#include +#include + +#include "gtest/gtest.h" + +#include "xdl/data_io/pool.h" +#include "xdl/core/framework/cpu_device.h" + + +namespace xdl { +namespace io { + + +class PackCutoffTest: public ::testing::Test { + static const size_t kBatchSize; + + public: + static void SetUpTestCase(); + static void TearDownTestCase(); + + static void TestStat(); + static void TestSetup(); + static void TestRun(); + + static PackFeature *pack_; + static Batch *batch_; + + + private: + static void CheckFeature(); + + static Device *dev_; + static Schema schema_; + static SampleGroup sg_; +}; + +const size_t PackCutoffTest::kBatchSize = 4; + +Device *PackCutoffTest::dev_ = nullptr; +Schema PackCutoffTest::schema_; + +PackFeature *PackCutoffTest::pack_ = nullptr; +Batch *PackCutoffTest::batch_ = nullptr; + +SampleGroup PackCutoffTest::sg_; + +void PackCutoffTest::SetUpTestCase() { + dev_ = new CpuDevice(); + schema_.batch_size_ = kBatchSize; + + for (auto fn: {"s", "l", "sr", "lr"}) { + FeatureOption *f = new FeatureOption(); + f->set_name(fn); + f->set_type(kSparse); + f->set_table(0); + f->set_serialized(true); + int cutoff; + if (fn[0] == 's') { + cutoff = 3; + } else { + ASSERT_TRUE(fn[0] == 'l'); + cutoff = 5; + } + if (strlen(fn) == 2) { + ASSERT_TRUE(fn[1] == 'r'); + cutoff = -cutoff; + } + f->set_cutoff(cutoff); + schema_.Add(f); + } + + auto ft = sg_.add_feature_tables(); + for (int i = 0; i < kBatchSize; ++i) { + auto fl = ft->add_feature_lines(); + for (auto fn: {"s", "l", "sr", "lr"}) { + auto f = fl->add_features(); + f->set_name(fn); + f->set_type(kSparse); + for (int m = 1; m < 5; ++m) { + auto v = f->add_values(); + v->set_key(m); + v->set_value(m*0.1); + } + } + } + + pack_ = new PackFeature(dev_, &schema_); +} + +void PackCutoffTest::TearDownTestCase() { + BatchPool::Get()->Release(batch_); + batch_ = nullptr; + delete pack_; + pack_ = nullptr; +} + + +void PackCutoffTest::CheckFeature() { + for (auto fn: {"s", "l", "sr", "lr"}) { + auto blk = batch_->Get(fn); + ASSERT_NE(nullptr, blk); + + auto key = blk->ts_[Block::kKey]; + auto value = blk->ts_[Block::kValue]; + auto seg = blk->ts_[Block::kSegment]; + + uint64_t *keys = key->Raw(); + float *vals = value->Raw(); + uint32_t *segs = seg->Raw(); + + int cutoff; + if (fn[0] == 's') { + cutoff = 3; + } else { + ASSERT_TRUE(fn[0] == 'l'); + cutoff = 5; + } + if (strlen(fn) == 2) { + ASSERT_TRUE(fn[1] == 'r'); + cutoff = -cutoff; + } + + //std::cout << fn << " cutoff " << cutoff << std::endl; + for (int i = 0, n = 0, c = segs[n]; i < key->Shape()[0]; ++i, --c) { + if (c == 0) { + //std::cout << std::endl; + if (++ n == kBatchSize) { break; } + c = segs[n] - segs[n-1]; + ASSERT_EQ(std::min(abs(cutoff), 4), c); + //std::cout << std::endl << "[" << n << "]"; + } + //std::cout<< keys[i] << ":" << vals[i] << " "; + if (cutoff > 0) { + EXPECT_EQ(i - segs[n-1] + 1, keys[i]); + EXPECT_FLOAT_EQ((i - segs[n-1] + 1)*0.1, vals[i]); + } else { + //EXPECT_EQ(4 - (i - segs[n-1]), keys[i]); + //EXPECT_FLOAT_EQ((4 - (i - segs[n-1]))*0.1, vals[i]); + EXPECT_EQ((i - segs[n-1]) + std::max(0, 4+cutoff) + 1, keys[i]); + EXPECT_FLOAT_EQ(((i - segs[n-1]) + std::max(0, 4+cutoff) + 1)*0.1, vals[i]); + } + } + //std::cout << std::endl; + } +} + +void PackCutoffTest::TestStat() { + PParam pparam; + + pparam.begin_ = 0; + pparam.end_ = sg_.feature_tables(0).feature_lines_size(); + pparam.ftable_ = &sg_.feature_tables(0); + pparam.ktable_ = 0; + pparam.isgroup_ = 0; + EXPECT_GE(pparam.begin_, 0); + EXPECT_GE(pparam.end_, kBatchSize); + //std::cout << "stat[" << pparam.isgroup_ << ", " << ktable << "] (0)" << pparam.begin_ + // << " -> " << pparam.end_ << "(" << pparam.ftable_->feature_lines_size() << ")" << std::endl; + auto range = pack_->Stat(pparam); + pparam.begin_ = range.first; + pparam.end_ = range.second; +} + +void PackCutoffTest::TestSetup() { + ASSERT_TRUE(pack_->Setup()); + + for (auto &it: schema_.feature_opts()) { + auto opt = it.second; + auto ktable = opt->table(); + + auto blk = batch_->GetMutable(opt->name()); + ASSERT_NE(nullptr, blk); + ASSERT_NE(nullptr, blk->ts_[Block::kValue]); + ASSERT_NE(nullptr, blk->ts_[Block::kKey]); + ASSERT_NE(nullptr, blk->ts_[Block::kSegment]); + auto kdims = blk->ts_[Block::kKey]->Shape().Dims(); + auto sdims = blk->ts_[Block::kSegment]->Shape().Dims(); + auto fn = opt->name().c_str(); + int cutoff; + if (fn[0] == 's') { + cutoff = 3; + } else { + ASSERT_TRUE(fn[0] == 'l'); + cutoff = 5; + } + if (strlen(fn) == 2) { + ASSERT_TRUE(fn[1] == 'r'); + cutoff = -cutoff; + } + ASSERT_EQ(cutoff, opt->cutoff()); + ASSERT_EQ(kSparse, opt->type()); + ASSERT_EQ(std::vector({kBatchSize*std::min(4, abs(cutoff))}), kdims); + ASSERT_EQ(std::vector({kBatchSize}), sdims); + ASSERT_EQ(3, blk->ts_count_); + } + + ASSERT_EQ(12, batch_->ts_count_); +} + +void PackCutoffTest::TestRun() { + PParam pparam; + + pparam.begin_ = 0; + pparam.end_ = sg_.feature_tables(0).feature_lines_size(); + pparam.ftable_ = &sg_.feature_tables(0); + pparam.ktable_ = 0; + pparam.isgroup_ = 0; + //std::cout << "run[" << pparam.isgroup_ << ", " << ktable << "] (0)" << pparam.begin_ + // << " -> " << pparam.end_ << "(" << pparam.ftable_->feature_lines_size() << ")" << std::endl; + auto range = pack_->Run(pparam); + pparam.begin_ = range.first; + pparam.end_ = range.second; + + CheckFeature(); + + EXPECT_EQ(12, batch_->ts_count_); +} + +TEST_F(PackCutoffTest, Run) { + batch_ = BatchPool::Get()->Acquire(); + EXPECT_NE(nullptr, batch_); + + EXPECT_TRUE(pack_->Init(batch_)); + + TestStat(); + TestSetup(); + TestRun(); + + batch_->Reuse(); + batch_ = nullptr; + + //std::cout << "cycles: " << pack_->cycles_ << std::endl; +} + +} // io +} // xdl + +int main(int argc, char **argv) +{ + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/xdl/test/data_io/packer/pack_feature_test.cc b/xdl/test/data_io/packer/pack_feature_test.cc index 2a704290..de82d552 100644 --- a/xdl/test/data_io/packer/pack_feature_test.cc +++ b/xdl/test/data_io/packer/pack_feature_test.cc @@ -34,10 +34,10 @@ namespace xdl { namespace io { -typedef std::map>> SMap; -typedef std::map> DMap; +typedef std::map>> FSMap; +typedef std::map> FDMap; -typedef std::vector> F4SG; +typedef std::vector> FTable; class PackFeatureTest: public ::testing::Test { static const size_t kBatchSize; @@ -49,7 +49,7 @@ class PackFeatureTest: public ::testing::Test { static void SetUpTestCase(); static void TearDownTestCase(); - static size_t sample_count_4_sg(size_t ktable); + static size_t sample_count(size_t ktable); static size_t batch_size(size_t ktable); static void TestStat(); @@ -61,15 +61,15 @@ class PackFeatureTest: public ::testing::Test { private: - static void InitTable(FeatureTable *ft, F4SG &vfs, int c, int ktable); - static void InitSampleGroup(SampleGroup &sg, std::vector &vfs, int sgi); + static void InitTable(FeatureTable *ft, FTable &fft, int c, int ktable); + static void InitSampleGroup(SampleGroup &sg, std::vector &fsg, int sgi); static void CheckIndicator(); static void CheckFeature(); static Device *dev_; static Schema schema_; - static std::vector> vfs_; // [sg][table] + static std::vector> fsgs_; // [sg][table] static std::vector sgs_; }; @@ -86,10 +86,10 @@ Schema PackFeatureTest::schema_; PackFeature *PackFeatureTest::pack_ = nullptr; Batch *PackFeatureTest::batch_ = nullptr; -std::vector> PackFeatureTest::vfs_; +std::vector> PackFeatureTest::fsgs_; std::vector PackFeatureTest::sgs_; -size_t PackFeatureTest::sample_count_4_sg(size_t ktable) { +size_t PackFeatureTest::sample_count(size_t ktable) { size_t c = kBatchSize/kSGCount - 1; for (int k = 0; k < ktable; ++k) { c = c / 2 + 1; @@ -100,9 +100,9 @@ size_t PackFeatureTest::sample_count_4_sg(size_t ktable) { size_t PackFeatureTest::batch_size(size_t ktable) { size_t batch_size = kBatchSize; if (ktable > 0) { - size_t c = sample_count_4_sg(ktable); + size_t c = sample_count(ktable); batch_size = c * kSGCount; - if (sample_count_4_sg(0) * kSGCount < kBatchSize) { + if (sample_count(0) * kSGCount < kBatchSize) { batch_size += 1; } } @@ -130,32 +130,31 @@ void PackFeatureTest::SetUpTestCase() { } } - vfs_.resize(kSGCount); + fsgs_.resize(kSGCount); sgs_.resize(kSGCount); - //std::srand(std::time(nullptr)); - std::srand(0); + std::srand(std::time(nullptr)); for (int i = 0; i < kSGCount; ++i) { - InitSampleGroup(sgs_[i], vfs_[i], i); + InitSampleGroup(sgs_[i], fsgs_[i], i); //std::cout << sgs_[i].DebugString() << std::endl; } pack_ = new PackFeature(dev_, &schema_); } -void PackFeatureTest::InitTable(FeatureTable *ft, F4SG &vfs, int c, int ktable) { +void PackFeatureTest::InitTable(FeatureTable *ft, FTable &fft, int c, int ktable) { EXPECT_LT(ktable, kTableCount); if (times == 1) { - vfs.resize(c); + fft.resize(c); } for (int i = 0; i < c; ++i) { auto fl = ft->add_feature_lines(); // sparse - SMap *smap = nullptr; + FSMap *smap = nullptr; if (times == 1) { - smap = &vfs[i].first; + smap = &fft[i].first; } int cs = std::rand() % 4 + 1; for (int j = 0; j < cs; ++j) { @@ -168,16 +167,16 @@ void PackFeatureTest::InitTable(FeatureTable *ft, F4SG &vfs, int c, int ktable) kv->set_value(0.1*k); } if (times == 1) { - smap->insert(SMap::value_type(std::to_string(ktable)+"u"+std::to_string(j), kvs)); + smap->insert(FSMap::value_type(std::to_string(ktable)+"u"+std::to_string(j), kvs)); } f->set_name(std::to_string(ktable)+"u"+std::to_string(j)); f->set_type(kSparse); } // dense - DMap *dmap = nullptr; + FDMap *dmap = nullptr; if (times == 1) { - dmap = &vfs[i].second; + dmap = &fft[i].second; } int cd = std::rand() % 4 + 1; for (int j = 0; j < cd; ++j) { @@ -189,7 +188,7 @@ void PackFeatureTest::InitTable(FeatureTable *ft, F4SG &vfs, int c, int ktable) v->add_vector(0.1*k); } if (times == 1) { - dmap->insert(DMap::value_type(std::to_string(ktable)+"a"+std::to_string(j), vs)); + dmap->insert(FDMap::value_type(std::to_string(ktable)+"a"+std::to_string(j), vs)); } f->set_name(std::to_string(ktable)+"a"+std::to_string(j)); f->set_type(kDense); @@ -202,15 +201,15 @@ void PackFeatureTest::InitTable(FeatureTable *ft, F4SG &vfs, int c, int ktable) } } -void PackFeatureTest::InitSampleGroup(SampleGroup &sg, std::vector &vfs, int sgi) { +void PackFeatureTest::InitSampleGroup(SampleGroup &sg, std::vector &fsgs, int sgi) { if (times == 1) { - vfs.resize(kTableCount); + fsgs.resize(kTableCount); } for (int ktable = 0; ktable < kTableCount; ++ktable) { auto ft = sg.add_feature_tables(); - int c = sample_count_4_sg(ktable); - InitTable(ft, vfs[ktable], c, ktable); + int c = sample_count(ktable); + InitTable(ft, fsgs[ktable], c, ktable); } } @@ -233,7 +232,7 @@ void PackFeatureTest::TestStat() { pparam.isgroup_ = i; EXPECT_GE(pparam.begin_, 0); if (times == 1) { - EXPECT_LE(pparam.end_, vfs_[i][ktable].size()); + EXPECT_LE(pparam.end_, fsgs_[i][ktable].size()); } //std::cout << "stat[" << pparam.isgroup_ << ", " << ktable << "] (0)" << pparam.begin_ // << " -> " << pparam.end_ << "(" << pparam.ftable_->feature_lines_size() << ")" << std::endl; @@ -242,7 +241,6 @@ void PackFeatureTest::TestStat() { pparam.end_ = range.second; } } - } void PackFeatureTest::TestSetup() { @@ -280,7 +278,7 @@ void PackFeatureTest::CheckIndicator() { if (times > 1) { return; } - ASSERT_EQ(kSGCount, vfs_.size()); + ASSERT_EQ(kSGCount, fsgs_.size()); ASSERT_EQ(kSGCount, sgs_.size()); if (kTableCount <= 1) { @@ -321,7 +319,7 @@ void PackFeatureTest::CheckIndicator() { << " shape=(" << blk->ts_[Block::kIndex]->Shape()[0] << ") bs=" << bs; ASSERT_EQ(1, blk->ts_count_); auto indices = blk->ts_[Block::kIndex]->Raw(); - size_t c = sample_count_4_sg(t) * kSGCount; + size_t c = sample_count(t) * kSGCount; ASSERT_EQ(c, acc[t]); for (int i = acc[t]; i < bs; ++i) { ASSERT_EQ(acc[t+1], indices[i] + 1) << "t=" << t << " i=" << i << " bs=" << bs; // TODO: should be ASSERT_EQ(acc[t+1], indices[i]) @@ -344,16 +342,15 @@ void PackFeatureTest::CheckFeature() { auto segment = blk->ts_[Block::kSegment]; float *values = value->Raw(); - ASSERT_NE(nullptr, values); + //ASSERT_NE(nullptr, values) << "name=" << opt->name() << " table=" << opt->table(); int64_t *keys = nullptr; int32_t *segments = nullptr; - ASSERT_NE(nullptr, value); if (opt->type() == kSparse) { ASSERT_NE(nullptr, key); keys = key->Raw(); - ASSERT_NE(nullptr, keys); + //ASSERT_NE(nullptr, keys); ASSERT_NE(nullptr, segment); segments = segment->Raw(); @@ -369,13 +366,13 @@ void PackFeatureTest::CheckFeature() { int n = 0; // sample count int m = 0; // id count - for (auto vsg: vfs_) { - auto &vfs = vsg[ktable]; - /// each sample group - for (auto &sd: vfs) { + for (auto fsg: fsgs_) { + auto &fft = fsg[ktable]; + /// each table + for (auto &ffl: fft) { /// each feature line - auto &smap = sd.first; - auto &dmap = sd.second; + auto &smap = ffl.first; + auto &dmap = ffl.second; if (opt->type() == kSparse) { auto it = smap.find(opt->name()); if (it != smap.end()) { @@ -415,14 +412,14 @@ void PackFeatureTest::CheckFeature() { } /// for each sample group - int c = sample_count_4_sg(ktable) * kSGCount; + int c = sample_count(ktable) * kSGCount; ASSERT_EQ(c, n) << "ktable=" << ktable; size_t bs = batch_size(ktable); /// padding zero for (; n < bs; ++n) { if (opt->type() == kSparse) { - EXPECT_EQ(m, segments[n]); + EXPECT_EQ(m, segments[n]) << "feature=" << opt->name() << " n=" << n; } else { for (int i = 0; i < opt->nvec(); ++i) { EXPECT_FLOAT_EQ(0, values[m]) << "feature=" << opt->name() @@ -448,6 +445,8 @@ void PackFeatureTest::CheckFeature() { EXPECT_EQ(m, dims[0]); EXPECT_EQ(opt->has_nvec()?opt->nvec():1, dims[1]); + std::cout << "feature=" << opt->name() << " seg" << segment->Shape() << + " idx" << key->Shape() << " val" << value->Shape() << " pass check" << std::endl; //LOG(INFO) << "feature=" << opt->name() << " seg" << segment->Shape() << // " idx" << key->Shape() << " val" << value->Shape() << " pass check"; } else { @@ -512,7 +511,6 @@ TEST_F(PackFeatureTest, Run) { int main(int argc, char **argv) { ::testing::InitGoogleTest(&argc, argv); - for (int i = 1; i < argc; ++i) { printf("arg %2d = %s\n", i, argv[i]); } diff --git a/xdl/test/data_io/packer/pack_mask_test.cc b/xdl/test/data_io/packer/pack_mask_test.cc new file mode 100644 index 00000000..54892b6f --- /dev/null +++ b/xdl/test/data_io/packer/pack_mask_test.cc @@ -0,0 +1,205 @@ +/* Copyright (C) 2016-2018 Alibaba Group Holding Limited + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "xdl/data_io/packer/pack_feature.h" + +#include +#include +#include +#include +#include +#include + +#include "gtest/gtest.h" + +#include "xdl/data_io/pool.h" +#include "xdl/core/framework/cpu_device.h" + + +namespace xdl { +namespace io { + + +class PackMaskTest: public ::testing::Test { + static const size_t kBatchSize; + + public: + static void SetUpTestCase(); + static void TearDownTestCase(); + + static void TestStat(); + static void TestSetup(); + static void TestRun(); + + static PackFeature *pack_; + static Batch *batch_; + + + private: + static void CheckFeature(); + + static Device *dev_; + static Schema schema_; + static SampleGroup sg_; +}; + +const size_t PackMaskTest::kBatchSize = 4; + +Device *PackMaskTest::dev_ = nullptr; +Schema PackMaskTest::schema_; + +PackFeature *PackMaskTest::pack_ = nullptr; +Batch *PackMaskTest::batch_ = nullptr; + +SampleGroup PackMaskTest::sg_; + +void PackMaskTest::SetUpTestCase() { + dev_ = new CpuDevice(); + schema_.batch_size_ = kBatchSize; + + FeatureOption *d = new FeatureOption(); + d->set_name("d"); + d->set_type(kDense); + d->set_nvec(4); + d->set_table(0); + d->set_mask("1110"); + schema_.Add(d); + + auto ft = sg_.add_feature_tables(); + for (int i = 0; i < kBatchSize; ++i) { + auto fl = ft->add_feature_lines(); + auto f = fl->add_features(); + f->set_name("d"); + f->set_type(kDense); + auto v = f->add_values(); + for (int m = 0; m < 4; ++m) { + v->add_vector(0.1*m); + } + } + + pack_ = new PackFeature(dev_, &schema_); +} + +void PackMaskTest::TearDownTestCase() { + BatchPool::Get()->Release(batch_); + batch_ = nullptr; + delete pack_; + pack_ = nullptr; +} + + +void PackMaskTest::CheckFeature() { + for (auto &kv : schema_.feature_opts()) { + auto &opt = kv.second; + auto blk = batch_->Get(opt->name()); + ASSERT_NE(nullptr, blk); + + auto value = blk->ts_[Block::kValue]; + ASSERT_EQ(kBatchSize, value->Shape()[0]); + ASSERT_EQ(3, value->Shape()[1]); + + float *values = value->Raw(); + for (int i = 0; i < value->Shape()[0]; ++i) { + for (int m = 0; m < value->Shape()[1]; ++m) { + std::cout << values[i*value->Shape()[1]+m] << ", "; + } + std::cout << std::endl; + } + } +} + +void PackMaskTest::TestStat() { + PParam pparam; + + pparam.begin_ = 0; + pparam.end_ = sg_.feature_tables(0).feature_lines_size(); + pparam.ftable_ = &sg_.feature_tables(0); + pparam.ktable_ = 0; + pparam.isgroup_ = 0; + EXPECT_GE(pparam.begin_, 0); + EXPECT_GE(pparam.end_, kBatchSize); + //std::cout << "stat[" << pparam.isgroup_ << ", " << ktable << "] (0)" << pparam.begin_ + // << " -> " << pparam.end_ << "(" << pparam.ftable_->feature_lines_size() << ")" << std::endl; + auto range = pack_->Stat(pparam); + pparam.begin_ = range.first; + pparam.end_ = range.second; +} + +void PackMaskTest::TestSetup() { + ASSERT_TRUE(pack_->Setup()); + + for (auto &it: schema_.feature_opts()) { + auto opt = it.second; + + auto blk = batch_->GetMutable(opt->name()); + ASSERT_NE(nullptr, blk); + ASSERT_NE(nullptr, blk->ts_[Block::kValue]); + auto vdims = blk->ts_[Block::kValue]->Shape().Dims(); + + auto ktable = opt->table(); + size_t bs = kBatchSize; + + ASSERT_EQ(kDense, opt->type()); + ASSERT_EQ(2, vdims.size()); + ASSERT_EQ(bs, vdims[0]); + ASSERT_EQ(1, blk->ts_count_); + } + + ASSERT_EQ(1, batch_->ts_count_); +} + +void PackMaskTest::TestRun() { + PParam pparam; + + pparam.begin_ = 0; + pparam.end_ = sg_.feature_tables(0).feature_lines_size(); + pparam.ftable_ = &sg_.feature_tables(0); + pparam.ktable_ = 0; + pparam.isgroup_ = 0; + //std::cout << "run[" << pparam.isgroup_ << ", " << ktable << "] (0)" << pparam.begin_ + // << " -> " << pparam.end_ << "(" << pparam.ftable_->feature_lines_size() << ")" << std::endl; + auto range = pack_->Run(pparam); + pparam.begin_ = range.first; + pparam.end_ = range.second; + + CheckFeature(); + + EXPECT_EQ(1, batch_->ts_count_); +} + +TEST_F(PackMaskTest, Run) { + batch_ = BatchPool::Get()->Acquire(); + EXPECT_NE(nullptr, batch_); + + EXPECT_TRUE(pack_->Init(batch_)); + + TestStat(); + TestSetup(); + TestRun(); + + batch_->Reuse(); + batch_ = nullptr; + + //std::cout << "cycles: " << pack_->cycles_ << std::endl; +} + +} // io +} // xdl + +int main(int argc, char **argv) +{ + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/xdl/test/data_io/packer/pack_padding_test.cc b/xdl/test/data_io/packer/pack_padding_test.cc new file mode 100644 index 00000000..95d685a1 --- /dev/null +++ b/xdl/test/data_io/packer/pack_padding_test.cc @@ -0,0 +1,252 @@ +/* Copyright (C) 2016-2018 Alibaba Group Holding Limited + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "xdl/data_io/packer/pack_feature.h" + +#include +#include +#include +#include +#include +#include + +#include "gtest/gtest.h" + +#include "xdl/data_io/pool.h" +#include "xdl/core/framework/cpu_device.h" + + +namespace xdl { +namespace io { + + +class PackFeatureTest: public ::testing::Test { + static const size_t kBatchSize; + static const size_t kSGCount; + static const size_t kTableCount; + + public: + static void SetUpTestCase(); + static void TearDownTestCase(); + + static size_t sample_count(size_t ktable); + static size_t batch_size(size_t ktable); + + static void TestStat(); + static void TestSetup(); + static void TestRun(); + + static PackFeature *pack_; + static Batch *batch_; + + + private: + static void CheckIndicator(); + static void CheckFeature(); + + static Device *dev_; + static Schema schema_; + + static std::vector sgs_; +}; + +const size_t PackFeatureTest::kBatchSize = 8192; +//const size_t PackFeatureTest::kBatchSize = 4; +const size_t PackFeatureTest::kSGCount = 128; +//const size_t PackFeatureTest::kSGCount = 2; +const size_t PackFeatureTest::kTableCount = 2; + +Device *PackFeatureTest::dev_ = nullptr; +Schema PackFeatureTest::schema_; + +PackFeature *PackFeatureTest::pack_ = nullptr; +Batch *PackFeatureTest::batch_ = nullptr; + +std::vector PackFeatureTest::sgs_; + +size_t PackFeatureTest::sample_count(size_t ktable) { + size_t c = kBatchSize/kSGCount - 1; + for (int k = 0; k < ktable+1; ++k) { + c = c / 2 + 1; + } + return c; +} + +size_t PackFeatureTest::batch_size(size_t ktable) { + size_t c = sample_count(ktable); + return c * kSGCount; +} + +void PackFeatureTest::SetUpTestCase() { + dev_ = new CpuDevice(); + schema_.batch_size_ = kBatchSize; + schema_.padding_ = false; + + for (int ktable = 0; ktable < kTableCount; ++ktable) { + FeatureOption *s = new FeatureOption(); + s->set_name(std::to_string(ktable)+"s"); + s->set_type(kSparse); + s->set_table(ktable); + schema_.Add(s); + + FeatureOption *d = new FeatureOption(); + d->set_name(std::to_string(ktable)+"a"); + d->set_type(kDense); + d->set_nvec(2); + d->set_table(ktable); + schema_.Add(d); + } + + sgs_.resize(kSGCount); + + for (int i = 0; i < kSGCount; ++i) { + auto &sg = sgs_[i]; + int count = kBatchSize/kSGCount - 1; + for (int ktable = 0; ktable < kTableCount; ++ktable) { + count = count / 2 + 1; + auto ft = sg.add_feature_tables(); + for (int n = 0; n < count; ++n) { + auto fl = ft->add_feature_lines(); + auto f = fl->add_features(); + f->set_name(std::to_string(ktable)+"d"); + f->set_type(kDense); + auto v = f->add_values(); + for (int m = 0; m < 2; ++m) { + v->add_vector(0.1*m); + } + f = fl->add_features(); + f->set_name(std::to_string(ktable)+"s"); + f->set_type(kSparse); + v = f->add_values(); + v->set_key(1); + v->set_value(0.6); + /// refer + if (ktable < kTableCount - 1) { + fl->set_refer((n+1)/2); + } + } + } + } + + pack_ = new PackFeature(dev_, &schema_); +} + +void PackFeatureTest::TearDownTestCase() { + BatchPool::Get()->Release(batch_); + batch_ = nullptr; + delete pack_; + pack_ = nullptr; +} + +void PackFeatureTest::TestStat() { + PParam pparam; + + for (int i = 0; i < kSGCount; ++i) { + int count = kBatchSize/kSGCount - 1; + pparam.begin_ = 0; + pparam.end_ = sgs_[i].feature_tables(0).feature_lines_size(); + for (int ktable = 0; ktable < kTableCount; ++ktable) { + count = count / 2 + 1; + pparam.ftable_ = &sgs_[i].feature_tables(ktable); + pparam.ktable_ = ktable; + pparam.isgroup_ = i; + EXPECT_GE(pparam.begin_, 0); + EXPECT_LE(pparam.end_, count); + //std::cout << "stat[" << pparam.isgroup_ << ", " << ktable << "] (0)" << pparam.begin_ + // << " -> " << pparam.end_ << "(" << pparam.ftable_->feature_lines_size() << ")" << std::endl; + auto range = pack_->Stat(pparam); + pparam.begin_ = range.first; + pparam.end_ = range.second; + } + } + +} + +void PackFeatureTest::TestSetup() { + ASSERT_TRUE(pack_->Setup()); + + for (auto &it: schema_.feature_opts()) { + auto opt = it.second; + + auto blk = batch_->GetMutable(opt->name()); + ASSERT_NE(nullptr, blk); + ASSERT_NE(nullptr, blk->ts_[Block::kValue]); + auto vdims = blk->ts_[Block::kValue]->Shape().Dims(); + + auto ktable = opt->table(); + size_t bs = batch_size(ktable); + + if (opt->type() == kSparse) { + ASSERT_NE(nullptr, blk->ts_[Block::kKey]); + auto kdims = blk->ts_[Block::kKey]->Shape().Dims(); + ASSERT_NE(nullptr, blk->ts_[Block::kSegment]); + auto sdims = blk->ts_[Block::kSegment]->Shape().Dims(); + ASSERT_EQ(bs, sdims[0]); + ASSERT_EQ(3, blk->ts_count_); + } else { + ASSERT_EQ(2, vdims.size()); + ASSERT_EQ(bs, vdims[0]); + ASSERT_EQ(1, blk->ts_count_); + } + } + + ASSERT_EQ(kTableCount*(3+1) + kTableCount-1, batch_->ts_count_); +} + + +void PackFeatureTest::TestRun() { + PParam pparam; + + for (int i = 0; i < kSGCount; ++i) { + pparam.begin_ = 0; + pparam.end_ = sgs_[i].feature_tables(0).feature_lines_size(); + for (int ktable = 0; ktable < kTableCount; ++ktable) { + pparam.ftable_ = &sgs_[i].feature_tables(ktable); + pparam.ktable_ = ktable; + pparam.isgroup_ = i; + //std::cout << "run[" << pparam.isgroup_ << ", " << ktable << "] (0)" << pparam.begin_ + // << " -> " << pparam.end_ << "(" << pparam.ftable_->feature_lines_size() << ")" << std::endl; + auto range = pack_->Run(pparam); + pparam.begin_ = range.first; + pparam.end_ = range.second; + } + } +} + +TEST_F(PackFeatureTest, Run) { + + batch_ = BatchPool::Get()->Acquire(); + EXPECT_NE(nullptr, batch_); + + EXPECT_TRUE(pack_->Init(batch_)); + + TestStat(); + TestSetup(); + TestRun(); + + batch_->Reuse(); + batch_ = nullptr; + + //std::cout << "cycles: " << pack_->cycles_ << std::endl; +} + +} // io +} // xdl + +int main(int argc, char **argv) +{ + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/xdl/test/data_io/packer/pack_skey_test.cc b/xdl/test/data_io/packer/pack_skey_test.cc index cd929e71..59573074 100644 --- a/xdl/test/data_io/packer/pack_skey_test.cc +++ b/xdl/test/data_io/packer/pack_skey_test.cc @@ -46,7 +46,7 @@ class PackSKeyTest: public ::testing::Test { int c = std::rand() % 32 + 1; for (int i = 0; i < c; ++i) { auto s = std::to_string(i); - skey_len_max_ = std::max(skey_len_max_, s.size()); + skey_len_max_ = std::max(skey_len_max_, s.size()+1); s1_.push_back(s); sg1_.add_sample_ids(s); } @@ -54,7 +54,7 @@ class PackSKeyTest: public ::testing::Test { c = std::rand() % 32 + 1; for (int i = 0; i < c; ++i) { auto s = std::to_string(i*1000); - skey_len_max_ = std::max(skey_len_max_, s.size()); + skey_len_max_ = std::max(skey_len_max_, s.size()+1); s2_.push_back(s); sg2_.add_sample_ids(s); } @@ -121,20 +121,15 @@ void PackSKeyTest::TestSetup() { auto blk = batch_->GetMutable(kSKeyName); EXPECT_NE(nullptr, blk); - EXPECT_NE(nullptr, blk->ts_[Block::kIndex]); EXPECT_NE(nullptr, blk->ts_[Block::kSBuf]); - auto dims = blk->ts_[Block::kIndex]->Shape().Dims(); - EXPECT_EQ(1, dims.size()); - EXPECT_EQ(kBatchSize, dims[0]); - - dims = blk->ts_[Block::kSBuf]->Shape().Dims(); + auto dims = blk->ts_[Block::kSBuf]->Shape().Dims(); EXPECT_EQ(2, dims.size()); EXPECT_EQ(kBatchSize, dims[0]); EXPECT_EQ(skey_len_max_, dims[1]); - EXPECT_EQ(2, blk->ts_count_); - EXPECT_EQ(2, batch_->ts_count_); + EXPECT_EQ(1, blk->ts_count_); + EXPECT_EQ(1, batch_->ts_count_); } void PackSKeyTest::TestRun() { @@ -153,21 +148,20 @@ void PackSKeyTest::TestRun() { pack_->Run(pparam); auto blk = batch_->GetMutable(kSKeyName); - auto slen = blk->ts_[Block::kIndex]->Raw(); auto sbuf = (char *)blk->ts_[Block::kSBuf]->Raw(); auto dims = blk->ts_[Block::kSBuf]->Shape().Dims(); EXPECT_EQ(2, dims.size()); EXPECT_EQ(kBatchSize, dims[0]); EXPECT_EQ(skey_len_max_, dims[1]); - EXPECT_EQ(2, blk->ts_count_); - EXPECT_EQ(2, batch_->ts_count_); + EXPECT_EQ(1, blk->ts_count_); + EXPECT_EQ(1, batch_->ts_count_); for (int n = 0; n < dims[0]; ++n) { if (n < s1_.size() + s2_.size()) { std::string &s = n < s1_.size() ? s1_[n] : s2_[n-s1_.size()]; - EXPECT_EQ(s.size(), (unsigned)slen[n]); - EXPECT_STREQ(s.c_str(), std::string(&sbuf[n*dims[1]], slen[n]).c_str()); + EXPECT_EQ(s.size(), strlen(&sbuf[n*dims[1]])); + EXPECT_STREQ(s.c_str(), &sbuf[n*dims[1]]); } } } diff --git a/xdl/test/data_io/parser/parse_v4_test.cc b/xdl/test/data_io/parser/parse_v4_test.cc index 48e17151..155cc02f 100644 --- a/xdl/test/data_io/parser/parse_v4_test.cc +++ b/xdl/test/data_io/parser/parse_v4_test.cc @@ -31,23 +31,27 @@ TEST(ParseV4Test, TestRun) { meta.set_data_source_name("XXX"); meta.set_batch_type(v4::kTrainBatch); - auto comm = meta.add_data_block_meta(); - auto ncomm = meta.add_data_block_meta(); + { + auto comm = meta.add_data_block_meta(); + auto ncomm = meta.add_data_block_meta(); - comm->set_data_block_type(v4::kCommonFeature); - ncomm->set_data_block_type(v4::kNCommonFeature); + comm->set_data_block_type(v4::kCommonFeature); + ncomm->set_data_block_type(v4::kNCommonFeature); - auto fgm = comm->add_feature_group_meta(); - fgm->set_feature_group_name("comm1"); - fgm->set_feature_type(v4::kKeyValue); + auto fgm = comm->add_feature_group_meta(); + fgm->set_feature_group_name("comm1"); + fgm->set_feature_type(v4::kKeyValue); - fgm = ncomm->add_feature_group_meta(); - fgm->set_feature_group_name("ncomm1"); - fgm->set_feature_type(v4::kKeyValue); + fgm = ncomm->add_feature_group_meta(); + fgm->set_feature_group_name("ncomm1"); + fgm->set_feature_type(v4::kKeyValue); + } std::string contents; EXPECT_TRUE(meta.SerializeToString(&contents)); + int N = 10; + Schema schema; schema.label_count_ = 2; ParseV4 p(&schema); @@ -55,35 +59,40 @@ TEST(ParseV4Test, TestRun) { v4::SampleGroup v4sg; - auto blk = v4sg.add_data_block(); - blk->set_data_block_type(v4::kCommonFeature); - auto fb = blk->add_feature_block(); + auto ncomm = v4sg.add_data_block(); + ncomm->set_data_block_type(v4::kNCommonFeature); + + auto label = v4sg.add_data_block(); + label->set_data_block_type(v4::kLabel); + + auto skey = v4sg.add_data_block(); + skey->set_data_block_type(v4::kSampleInfo); + + for (int i = 0; i < N; ++i) { + auto fb = ncomm->add_feature_block(); + auto fg = fb->add_feature_group(); + fg->set_feature_index(0); + auto kv = fg->add_kv_feature(); + kv->set_id(i); + kv->set_value(0.2*i); + + auto lb = label->add_label_block(); + lb->add_data(0.1*i); + lb->add_data(0.1*i); + + auto sb = skey->add_sample_info_block(); + sb->set_info(std::to_string(i)); + } + + auto comm= v4sg.add_data_block(); + comm->set_data_block_type(v4::kCommonFeature); + auto fb = comm->add_feature_block(); auto fg = fb->add_feature_group(); fg->set_feature_index(0); auto kv = fg->add_kv_feature(); kv->set_id(1); kv->set_value(0.1); - blk = v4sg.add_data_block(); - blk->set_data_block_type(v4::kNCommonFeature); - fb = blk->add_feature_block(); - fg = fb->add_feature_group(); - fg->set_feature_index(0); - kv = fg->add_kv_feature(); - kv->set_id(2); - kv->set_value(0.2); - - blk = v4sg.add_data_block(); - blk->set_data_block_type(v4::kLabel); - auto lb = blk->add_label_block(); - lb->add_data(0.1); - lb->add_data(0.2); - - blk = v4sg.add_data_block(); - blk->set_data_block_type(v4::kSampleInfo); - auto sb = blk->add_sample_info_block(); - sb->set_info("skey1"); - std::cout << v4sg.ShortDebugString() << std::endl; EXPECT_TRUE(v4sg.SerializeToString(&contents)); @@ -101,44 +110,49 @@ TEST(ParseV4Test, TestRun) { auto sg = sgroup->Get(); std::cout << sg->ShortDebugString() << std::endl; - EXPECT_EQ(1, sg->labels_size()); - EXPECT_EQ(1, sg->sample_ids_size()); + EXPECT_EQ(N, sg->labels_size()); + EXPECT_EQ(N, sg->sample_ids_size()); EXPECT_EQ(2, sg->feature_tables_size()); - EXPECT_EQ(2, sg->labels(0).values_size()); - EXPECT_FLOAT_EQ(0.1, sg->labels(0).values(0)); - EXPECT_FLOAT_EQ(0.2, sg->labels(0).values(1)); + auto ft0 = sg->feature_tables(0); + EXPECT_EQ(N, ft0.feature_lines_size()); - EXPECT_STREQ("skey1", sg->sample_ids(0).c_str()); + auto ft1 = sg->feature_tables(1); + EXPECT_EQ(1, ft1.feature_lines_size()); - /* table0 */ - auto ft = sg->feature_tables(0); - EXPECT_EQ(1, ft.feature_lines_size()); - auto fl = ft.feature_lines(0); - EXPECT_EQ(0, fl.refer()); - EXPECT_EQ(1, fl.features_size()); + for (int i = 0; i < N; ++i) { + EXPECT_EQ(2, sg->labels(i).values_size()); + EXPECT_FLOAT_EQ(0.1*i, sg->labels(i).values(0)); + EXPECT_FLOAT_EQ(0.1*i, sg->labels(i).values(1)); - auto f = fl.features(0); - EXPECT_EQ(kSparse, f.type()); - EXPECT_STREQ("ncomm1", f.name().c_str()); - EXPECT_EQ(1, f.values_size()); + EXPECT_STREQ((std::to_string(i)).c_str(), sg->sample_ids(i).c_str()); - auto fv = f.values(0); - EXPECT_EQ(2, fv.key()); - EXPECT_FLOAT_EQ(0.2, fv.value()); + /* table0 */ + auto fl = ft0.feature_lines(i); + EXPECT_EQ(0, fl.refer()); + EXPECT_EQ(1, fl.features_size()); + + auto f = fl.features(0); + EXPECT_EQ(kSparse, f.type()); + EXPECT_STREQ("ncomm1", f.name().c_str()); + EXPECT_EQ(1, f.values_size()); + + auto fv = f.values(0); + EXPECT_EQ(i, fv.key()); + EXPECT_FLOAT_EQ(0.2*i, fv.value()); + ++i; + } /* table1 */ - ft = sg->feature_tables(1); - EXPECT_EQ(1, ft.feature_lines_size()); - fl = ft.feature_lines(0); + auto fl = ft1.feature_lines(0); EXPECT_EQ(1, fl.features_size()); - f = fl.features(0); + auto f = fl.features(0); EXPECT_EQ(kSparse, f.type()); EXPECT_STREQ("comm1", f.name().c_str()); EXPECT_EQ(1, f.values_size()); - fv = f.values(0); + auto fv = f.values(0); EXPECT_EQ(1, fv.key()); EXPECT_FLOAT_EQ(0.1, fv.value()); } diff --git a/xdl/test/data_io/pause_test.cc b/xdl/test/data_io/pause_test.cc index 75657d97..8c611627 100644 --- a/xdl/test/data_io/pause_test.cc +++ b/xdl/test/data_io/pause_test.cc @@ -17,6 +17,7 @@ limitations under the License. #include "xdl/data_io/op/debug_rebuild_op.h" #include "xdl/data_io/parser/parser.h" #include "gtest/gtest.h" +#include "xdl/core/utils/logging.h" #include diff --git a/xdl/test/data_io/scheduler_test.cc b/xdl/test/data_io/scheduler_test.cc index c82a44d6..814b5108 100644 --- a/xdl/test/data_io/scheduler_test.cc +++ b/xdl/test/data_io/scheduler_test.cc @@ -38,14 +38,17 @@ TEST(DataIOTest, TestSchedule) { for (int i = 0; i < 6; ++i) { rparam = sched.Acquire(); if (i >= 4) { - ASSERT_EQ(nullptr, rparam); + ASSERT_EQ(nullptr, rparam) << "{" << i << "} " << rparam->DebugString(); continue; } ASSERT_NE(nullptr, rparam); EXPECT_EQ(0, rparam->begin_); EXPECT_EQ(i<2?0:1, rparam->epoch_); - EXPECT_GT(rparam->end_, 0); + EXPECT_GE(rparam->end_, 0); EXPECT_NE(nullptr, rparam->ant_); + EXPECT_EQ(rparam->pathid_, i%2); + EXPECT_STREQ(rparam->path_, i%2==0?path:path2); + sched.Release(rparam); } } @@ -63,53 +66,77 @@ TEST(DataIOTest, TestRestore) { ASSERT_NE(nullptr, rparam); EXPECT_EQ(0, rparam->begin_); EXPECT_EQ(0, rparam->epoch_); - EXPECT_GT(rparam->end_, 0); + EXPECT_GE(rparam->end_, 0); + EXPECT_EQ(rparam->pathid_, 0); EXPECT_STREQ(rparam->path_, path); EXPECT_NE(nullptr, rparam->ant_); - rparam->begin_ = 1; + rparam->begin_ = 10; + rparam->parsed_ = 1; + + sched.Release(rparam); rparam = sched.Acquire(); ASSERT_NE(nullptr, rparam); EXPECT_EQ(0, rparam->begin_); EXPECT_EQ(0, rparam->epoch_); - EXPECT_GT(rparam->end_, 0); + EXPECT_GE(rparam->end_, 0); + EXPECT_EQ(rparam->pathid_, 1); EXPECT_STREQ(rparam->path_, path2); EXPECT_NE(nullptr, rparam->ant_); - rparam->begin_ = 1; + rparam->begin_ = 30; + rparam->parsed_ = 3; DSState ds_state; sched.Store(&ds_state); - EXPECT_EQ(4, ds_state.states_size()); + EXPECT_EQ(2, ds_state.states_size()); EXPECT_EQ(2, ds_state.epochs()); for (int i = 0; i < ds_state.states_size(); ++i) { auto state = ds_state.states(i); - EXPECT_EQ(i<2?1:0, state.begin()); - EXPECT_EQ(i<2?0:1, state.epoch()); - EXPECT_GT(state.end(), 0); - //EXPECT_STREQ(state.path().c_str(), i%2==0?path:path2); + EXPECT_EQ(i==0?3:0, state.begin()); + EXPECT_EQ(i==0?0:1, state.epoch()); + EXPECT_GE(state.end(), 0); + EXPECT_FALSE(state.has_path()); + EXPECT_EQ(state.pathid(), i==0?1:0); } std::cout << ds_state.ShortDebugString() << std::endl; - Scheduler sched2(kLocal); - sched2.Restore(ds_state); + sched.Restore(ds_state); - ASSERT_FALSE(sched2.Schedule()); + ASSERT_FALSE(sched.Schedule()); for (int i = 0; i < 6; ++i) { - rparam = sched2.Acquire(); - if (i >= 4) { + rparam = sched.Acquire(); + if (i >= 3) { ASSERT_EQ(nullptr, rparam); continue; } ASSERT_NE(nullptr, rparam); - EXPECT_EQ(i<2?1:0, rparam->begin_); - EXPECT_EQ(i<2?0:1, rparam->epoch_); - EXPECT_GT(rparam->end_, 0); + if (i == 0) { + EXPECT_EQ(3, rparam->begin_); + EXPECT_EQ(3, rparam->parsed_); + EXPECT_EQ(0, rparam->epoch_); + EXPECT_EQ(rparam->pathid_, 1); + EXPECT_STREQ(rparam->path_, path2); + } else if (i == 1) { + EXPECT_EQ(0, rparam->begin_); + EXPECT_EQ(0, rparam->parsed_); + EXPECT_EQ(1, rparam->epoch_); + EXPECT_EQ(rparam->pathid_, 0); + EXPECT_STREQ(rparam->path_, path); + } else { + EXPECT_EQ(0, rparam->begin_); + EXPECT_EQ(0, rparam->parsed_); + EXPECT_EQ(1, rparam->epoch_); + EXPECT_EQ(rparam->pathid_, 1); + EXPECT_STREQ(rparam->path_, path2); + } + EXPECT_GE(rparam->end_, 0); EXPECT_NE(nullptr, rparam->ant_); + sched.Release(rparam); } } diff --git a/xdl/test/data_io/sg_mocker.h b/xdl/test/data_io/sg_mocker.h index 1a916fd8..63f111b7 100644 --- a/xdl/test/data_io/sg_mocker.h +++ b/xdl/test/data_io/sg_mocker.h @@ -1,18 +1,3 @@ -/* Copyright (C) 2016-2018 Alibaba Group Holding Limited - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ - /* * Copyright 1999-2018 Alibaba Group. * @@ -85,7 +70,7 @@ class SGMocker { const size_t SGMocker::kSGCountMax = 128; void SGMocker::InitTable(FeatureTable *ft, FTab &f_tab, int c, int ktable) { - XDL_CHECK(ktable < table_count_); + CHECK(ktable < table_count_); f_tab.resize(c); diff --git a/xdl/test/python/integration_test/test_gradient.py b/xdl/test/python/integration_test/test_gradient.py deleted file mode 100644 index 99aeabcf..00000000 --- a/xdl/test/python/integration_test/test_gradient.py +++ /dev/null @@ -1,84 +0,0 @@ -# Copyright (C) 2016-2018 Alibaba Group Holding Limited -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -import xdl -import unittest -import numpy as np -from xdl.python.lib.datatype import * -from xdl.python.lib.graph import execute -try: - from xdl.python.backend.tf.tf_backend import * -except ImportError: - sys.exit(0) - -def fc(inputs, w_shape): - with tf.variable_scope(name_or_scope='', reuse=tf.AUTO_REUSE): - w = tf.get_variable("weights", - w_shape, - initializer=tf.constant_initializer(0.1), - regularizer=tf.nn.l2_loss) - return tf.matmul(inputs, w) - -def main(): - dense = xdl.mock_dense_op(shape=[1, 16], value=0.01, name_="dense") - labels = xdl.mock_dense_op(shape=[1, 1], value=1.0, name_="label") - ids = xdl.convert_to_tensor(np.array([[0,0], [0,1], [0,2]], dtype=np.int64)) - values = xdl.convert_to_tensor(np.array([1.0, 2.0, 3.0], dtype=np.float32)) - segments = xdl.convert_to_tensor(np.array([3], dtype=np.int32)) - sparse = xdl.SparseTensor(ids, values, segments) - emb = xdl.embedding("sparse", sparse, xdl.Ones(), 1, 16, 'sum', vtype='hash') - loss = model(dense, emb, labels) - train_op = xdl.SGD(0.5).optimize() - sess = xdl.TrainSession() - loss, gradients = sess.run([loss, xdl.get_sparse_grads('sparse').grad]) - return loss, gradients - -@xdl.tf_wrapper(is_training=True) -def model(dense, emb, labels): - fc2 = fc(dense, [16, 1]) - logits = fc2 + emb - cross_entropy = tf.nn.sigmoid_cross_entropy_with_logits( - labels=labels, logits=logits, name='xentropy') - return tf.reduce_mean(cross_entropy, name='xentropy_mean') - -class GradientTest(unittest.TestCase): - def test_all(self): - dense = xdl.mock_dense_op(shape=[1, 16], value=0.01, name_="dense") - labels = xdl.mock_dense_op(shape=[1, 1], value=1.0, name_="label") - ids = xdl.convert_to_tensor(np.array([[0,0], [0,1], [0,2]], dtype=np.int64)) - values = xdl.convert_to_tensor(np.array([1.0, 2.0, 3.0], dtype=np.float32)) - segments = xdl.convert_to_tensor(np.array([3], dtype=np.int32)) - sparse = xdl.SparseTensor(ids, values, segments) - emb = xdl.embedding("sparse", sparse, xdl.Ones(), 1, 16, 'sum', vtype='hash') - loss = model(dense, emb, labels) - train_op = xdl.SGD(0.5).optimize() - sess = xdl.TrainSession() - _, l, g = sess.run([train_op, loss, xdl.get_sparse_grads('sparse').grad]) - self.assertTrue((l==np.array(0.0024364376, dtype=np.float32)).all()) - self.assertTrue((g==np.array([[-0.002433472],[-0.004866944],[-0.007300416]], dtype=np.float32)).all()) - sparse_var = xdl.get_variable_by_name('sparse') - weights = sess.run(sparse_var.gather(np.array([[0,0],[0,1],[0,2]], dtype=np.int64))) - self.assertTrue((weights==np.array([[1.0012168],[1.0024334],[1.0036502]], dtype=np.float32)).all()) - _, l, g = sess.run([train_op, loss, xdl.get_sparse_grads('sparse').grad]) - self.assertTrue((l==np.array(0.002395329, dtype=np.float32)).all()) - self.assertTrue((g==np.array([[-0.0023924622],[-0.0047849244],[-0.0071773864]], dtype=np.float32)).all()) - weights = sess.run(sparse_var.gather(np.array([[0,0],[0,1],[0,2]], dtype=np.int64))) - self.assertTrue((weights==np.array([[1.002413],[1.0048258],[1.0072389]], dtype=np.float32)).all()) - -def suite(): - return unittest.TestLoader().loadTestsFromTestCase(GradientTest) - -if __name__ == '__main__': - unittest.TextTestRunner().run(suite()) diff --git a/xdl/test/python/unit_test/backend/mxnet_backend_test.py b/xdl/test/python/unit_test/backend/mxnet_backend_test.py index c264cdd7..e60a3dc7 100644 --- a/xdl/test/python/unit_test/backend/mxnet_backend_test.py +++ b/xdl/test/python/unit_test/backend/mxnet_backend_test.py @@ -1,11 +1,11 @@ -# Copyright (C) 2016-2018 Alibaba Group Holding Limited -# +# Copyright 2018 Alibaba Group. All Rights Reserved. +# # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -16,13 +16,9 @@ import xdl import unittest import numpy as np -import sys from xdl.python.lib.datatype import * from xdl.python.lib.graph import execute -try: - from xdl.python.backend.mxnet.mxnet_backend import * -except ImportError: - sys.exit(0) +from xdl.python.backend.mxnet.mxnet_backend import * def main(): dense = xdl.mock_dense_op(shape=[1, 16], value=0.01, name_="dense") diff --git a/xdl/test/python/unit_test/def b/xdl/test/python/unit_test/def new file mode 100644 index 00000000..113e6323 --- /dev/null +++ b/xdl/test/python/unit_test/def @@ -0,0 +1,293 @@ +auc=0, pv_num=2 +auc=0.272727, pv_num=12 +auc=0.807692, pv_num=15 +auc=0.333333, pv_num=4 +auc=0.5, pv_num=6 +auc=0.4, pv_num=6 +auc=0.333333, pv_num=4 +1 0 0.0619345 +1 0 0.0619345 +0 1 0.0619345 +1 0 0.0619345 +1 0 0.0619345 +0 1 0.0619345 +1 0 0.0619345 +1 0 0.0619345 +1 0 0.0619345 +1 0 0.0619346 +1 0 0.0619346 +1 0 0.0619346 +1 0 0.0619346 +1 0 0.0619346 +1 0 0.0619347 +1 0 0.0619348 +1 0 0.0619348 +0 1 0.0619348 +1 0 0.0619349 +1 0 0.061935 +0 1 0.0619351 +1 0 0.0619352 +1 0 0.0619354 +1 0 0.0619354 +1 0 0.0619354 +0 1 0.0619355 +auc=0.561905, pv_num=26 +auc=1, pv_num=6 +auc=0.546875, pv_num=20 +auc=0.214286, pv_num=15 +auc=0.5, pv_num=6 +auc=0, pv_num=7 +auc=0.740741, pv_num=12 +auc=0.5, pv_num=3 +auc=0.666667, pv_num=4 +auc=0.769231, pv_num=14 +auc=0.583333, pv_num=8 +auc=0.6, pv_num=6 +auc=0, pv_num=2 +auc=1, pv_num=3 +auc=0.4, pv_num=6 +auc=1, pv_num=6 +auc=0.25, pv_num=9 +auc=0, pv_num=5 +auc=0.5, pv_num=3 +auc=1, pv_num=9 +auc=0, pv_num=3 +auc=0.8, pv_num=6 +auc=0.666667, pv_num=4 +auc=0.25, pv_num=9 +auc=0.5, pv_num=3 +auc=0.5, pv_num=3 +auc=0.75, pv_num=9 +auc=0.0909091, pv_num=12 +auc=0.75, pv_num=6 +auc=0.666667, pv_num=4 +auc=0.375, pv_num=9 +auc=0.5, pv_num=9 +auc=0.5, pv_num=3 +auc=0.8, pv_num=6 +auc=0.666667, pv_num=7 +auc=0.375, pv_num=9 +auc=1, pv_num=3 +auc=0, pv_num=10 +auc=0.25, pv_num=6 +auc=1, pv_num=6 +auc=1, pv_num=3 +auc=0.181818, pv_num=12 +auc=1, pv_num=2 +auc=0.125, pv_num=9 +auc=0.888889, pv_num=10 +auc=0.625, pv_num=9 +auc=0.2, pv_num=6 +auc=0.5, pv_num=3 +auc=0.5, pv_num=3 +auc=0.6, pv_num=6 +auc=0, pv_num=3 +auc=0.2, pv_num=6 +auc=0.444444, pv_num=10 +auc=0, pv_num=3 +auc=0.5, pv_num=3 +auc=0, pv_num=6 +auc=0.666667, pv_num=10 +auc=0.444444, pv_num=10 +auc=1, pv_num=6 +auc=0.375, pv_num=9 +auc=1, pv_num=3 +auc=0, pv_num=3 +auc=0.5, pv_num=3 +auc=1, pv_num=7 +auc=0.9, pv_num=11 +auc=0, pv_num=6 +auc=0.0909091, pv_num=12 +auc=0.8, pv_num=6 +auc=0.714286, pv_num=15 +auc=1, pv_num=2 +auc=0.8, pv_num=6 +auc=0.4, pv_num=6 +auc=0.375, pv_num=9 +auc=1, pv_num=3 +auc=0, pv_num=3 +auc=0.75, pv_num=21 +auc=0.34375, pv_num=12 +auc=0.6, pv_num=6 +auc=0, pv_num=3 +auc=0.8, pv_num=6 +auc=0.875, pv_num=9 +auc=0.727273, pv_num=12 +auc=0.666667, pv_num=5 +auc=0.8, pv_num=6 +auc=1, pv_num=6 +auc=0.4, pv_num=6 +auc=0.916667, pv_num=8 +auc=0, pv_num=3 +auc=0, pv_num=3 +auc=0.6, pv_num=12 +auc=0.5, pv_num=6 +auc=1, pv_num=3 +auc=0.944444, pv_num=9 +auc=0, pv_num=8 +auc=0.25, pv_num=6 +auc=0.5, pv_num=5 +auc=0.4, pv_num=6 +auc=0.2, pv_num=6 +auc=0.285714, pv_num=9 +auc=0.5, pv_num=3 +auc=0, pv_num=6 +auc=0, pv_num=3 +auc=0, pv_num=6 +auc=0.5, pv_num=6 +auc=0.4, pv_num=6 +auc=1, pv_num=5 +auc=1, pv_num=12 +auc=0.875, pv_num=9 +auc=0, pv_num=3 +auc=0, pv_num=3 +auc=1, pv_num=3 +auc=0.4, pv_num=16 +auc=0.571429, pv_num=9 +auc=1, pv_num=18 +auc=1, pv_num=3 +auc=0.5625, pv_num=12 +auc=1, pv_num=3 +auc=1, pv_num=3 +auc=0.5, pv_num=6 +auc=0.777778, pv_num=11 +auc=1, pv_num=3 +auc=0.4, pv_num=6 +auc=0.2, pv_num=6 +auc=0.454545, pv_num=12 +auc=0.5, pv_num=3 +auc=0.5, pv_num=3 +auc=0.5, pv_num=3 +auc=0.625, pv_num=6 +auc=0.5, pv_num=3 +auc=0.3, pv_num=11 +auc=0, pv_num=12 +auc=0, pv_num=3 +auc=1, pv_num=2 +auc=0.6, pv_num=6 +auc=0.541667, pv_num=11 +auc=1, pv_num=3 +auc=0, pv_num=6 +auc=0.411765, pv_num=20 +auc=0.25, pv_num=9 +auc=0, pv_num=3 +auc=1, pv_num=3 +auc=0.363636, pv_num=12 +auc=0.8, pv_num=6 +auc=0.5, pv_num=3 +auc=0, pv_num=6 +auc=0.615385, pv_num=15 +auc=0.909091, pv_num=12 +auc=0.392857, pv_num=11 +auc=1, pv_num=3 +auc=0, pv_num=3 +auc=0.45, pv_num=24 +auc=0, pv_num=3 +auc=0, pv_num=3 +auc=0.5, pv_num=3 +auc=1, pv_num=3 +auc=0.714286, pv_num=8 +auc=1, pv_num=9 +auc=1, pv_num=3 +auc=0.285714, pv_num=10 +auc=0.2, pv_num=6 +auc=0.125, pv_num=9 +auc=0.625, pv_num=9 +auc=0.666667, pv_num=7 +auc=1, pv_num=3 +auc=0, pv_num=3 +auc=0, pv_num=3 +auc=0, pv_num=3 +auc=0.5, pv_num=3 +auc=0.4, pv_num=6 +auc=1, pv_num=3 +auc=0.6, pv_num=6 +auc=0.875, pv_num=9 +auc=0.311111, pv_num=18 +auc=1, pv_num=2 +auc=0, pv_num=3 +auc=0, pv_num=3 +auc=0, pv_num=4 +auc=0.75, pv_num=9 +auc=1, pv_num=3 +auc=0.25, pv_num=5 +auc=0.6875, pv_num=18 +auc=0.5, pv_num=3 +auc=1, pv_num=3 +0 1 0.0619345 +1 0 0.0619345 +1 0 0.0619345 +1 0 0.0619345 +1 0 0.0619345 +1 0 0.0619345 +1 0 0.0619345 +1 0 0.0619345 +1 0 0.0619345 +1 0 0.0619345 +1 0 0.0619345 +1 0 0.0619345 +1 0 0.0619345 +1 0 0.0619345 +1 0 0.0619345 +1 0 0.0619345 +1 0 0.0619345 +1 0 0.0619345 +1 0 0.0619345 +1 0 0.0619345 +1 0 0.0619345 +1 0 0.0619346 +1 0 0.0619346 +1 0 0.0619346 +1 0 0.0619346 +1 0 0.0619346 +auc=0, pv_num=26 +auc=0.571429, pv_num=8 +auc=0, pv_num=8 +auc=1, pv_num=2 +auc=0.416667, pv_num=15 +auc=0, pv_num=3 +auc=0.5, pv_num=3 +auc=1, pv_num=2 +auc=0.5, pv_num=3 +auc=0.111111, pv_num=10 +auc=0.666667, pv_num=4 +auc=0.307692, pv_num=14 +auc=0.714286, pv_num=8 +auc=0.1, pv_num=12 +auc=1, pv_num=3 +auc=1, pv_num=3 +auc=0.909091, pv_num=12 +auc=0.75, pv_num=5 +auc=0.5, pv_num=18 +auc=0.0833333, pv_num=13 +auc=0.5, pv_num=5 +auc=0.2, pv_num=6 +auc=0.75, pv_num=5 +auc=0, pv_num=3 +auc=0.3, pv_num=11 +auc=0.882353, pv_num=18 +auc=1, pv_num=6 +auc=0.85, pv_num=21 +auc=0.5, pv_num=3 +auc=0.75, pv_num=6 +auc=0.125, pv_num=9 +auc=1, pv_num=7 +auc=0.111111, pv_num=9 +auc=0, pv_num=3 +auc=1, pv_num=5 +auc=0, pv_num=3 +auc=1, pv_num=3 +auc=0.791667, pv_num=14 +auc=0.909091, pv_num=12 +auc=0.5, pv_num=3 +auc=0.5, pv_num=3 +auc=0.785714, pv_num=9 +auc=0, pv_num=3 +auc=0.397059, pv_num=36 +auc=0.194444, pv_num=15 +auc=0, pv_num=5 +auc=0.5, pv_num=3 +auc=0, pv_num=14 +auc=0, pv_num=3 +auc=0.111111, pv_num=10 +batch gauc:867.636, pv_num: 1729merged gauc: 0.501814867.6365 1729 0.50181407 diff --git a/xdl/test/python/unit_test/ps_ops/ckpt/ckpt_in/checkpoint_00/__meta__ b/xdl/test/python/unit_test/ps_ops/ckpt/ckpt_in/checkpoint_00/__meta__ new file mode 100644 index 00000000..cf6cbe14 Binary files /dev/null and b/xdl/test/python/unit_test/ps_ops/ckpt/ckpt_in/checkpoint_00/__meta__ differ diff --git a/xdl/test/python/unit_test/ps_ops/ckpt/ckpt_in/checkpoint_00/dense$bias^0 b/xdl/test/python/unit_test/ps_ops/ckpt/ckpt_in/checkpoint_00/dense$bias^0 new file mode 100644 index 00000000..6bba6b90 Binary files /dev/null and b/xdl/test/python/unit_test/ps_ops/ckpt/ckpt_in/checkpoint_00/dense$bias^0 differ diff --git a/xdl/test/python/unit_test/ps_ops/ckpt/ckpt_in/checkpoint_00/dense$kernel^0 b/xdl/test/python/unit_test/ps_ops/ckpt/ckpt_in/checkpoint_00/dense$kernel^0 new file mode 100644 index 00000000..e5f6d4ae Binary files /dev/null and b/xdl/test/python/unit_test/ps_ops/ckpt/ckpt_in/checkpoint_00/dense$kernel^0 differ diff --git a/xdl/test/python/unit_test/ps_ops/ckpt/ckpt_in/checkpoint_00/emb2^0 b/xdl/test/python/unit_test/ps_ops/ckpt/ckpt_in/checkpoint_00/emb2^0 new file mode 100644 index 00000000..c3265ba9 Binary files /dev/null and b/xdl/test/python/unit_test/ps_ops/ckpt/ckpt_in/checkpoint_00/emb2^0 differ diff --git a/xdl/test/python/unit_test/ps_ops/ckpt/ckpt_in/checkpoint_00/xdl_global_step^0 b/xdl/test/python/unit_test/ps_ops/ckpt/ckpt_in/checkpoint_00/xdl_global_step^0 new file mode 100644 index 00000000..50ab58d2 Binary files /dev/null and b/xdl/test/python/unit_test/ps_ops/ckpt/ckpt_in/checkpoint_00/xdl_global_step^0 differ diff --git a/xdl/test/python/unit_test/ps_ops/ckpt/ckpt_in/checkpoints b/xdl/test/python/unit_test/ps_ops/ckpt/ckpt_in/checkpoints new file mode 100644 index 00000000..78979a52 Binary files /dev/null and b/xdl/test/python/unit_test/ps_ops/ckpt/ckpt_in/checkpoints differ diff --git a/xdl/test/python/unit_test/ps_ops/ckpt/ckpt_standard/dense&bias b/xdl/test/python/unit_test/ps_ops/ckpt/ckpt_standard/dense&bias new file mode 100644 index 00000000..01c57cf1 --- /dev/null +++ b/xdl/test/python/unit_test/ps_ops/ckpt/ckpt_standard/dense&bias @@ -0,0 +1 @@ +-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0 diff --git a/xdl/test/python/unit_test/ps_ops/ckpt/ckpt_standard/dense&bias&accumulation b/xdl/test/python/unit_test/ps_ops/ckpt/ckpt_standard/dense&bias&accumulation new file mode 100644 index 00000000..01c57cf1 --- /dev/null +++ b/xdl/test/python/unit_test/ps_ops/ckpt/ckpt_standard/dense&bias&accumulation @@ -0,0 +1 @@ +-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0 diff --git a/xdl/test/python/unit_test/ps_ops/ckpt/ckpt_standard/dense&kernel b/xdl/test/python/unit_test/ps_ops/ckpt/ckpt_standard/dense&kernel new file mode 100644 index 00000000..cec53a43 --- /dev/null +++ b/xdl/test/python/unit_test/ps_ops/ckpt/ckpt_standard/dense&kernel @@ -0,0 +1 @@ +0.0000593432,0.000294756,-0.00170537,-0.0000734445,0.00044994,0.00176328,-0.000524585,0.000537846,-0.00143931,-0.000915714,-0.000155837,0.00018063,-0.000260326,-0.0000755778,0.000439453,-0.00162821,0.000095441,-0.00147991,-0.000969109,-0.000190611,-0.00101292,0.00170309,-0.0000743011,-0.000655983,-0.000381057,-0.0000716263,0.000520369,0.00174444,-0.000143522,-0.000668611,-0.000559025,-0.000104292,-0.000825897,0.000335143,-0.000107083,-0.000414723,0.000852662,0.000722052,0.0015646,0.000177771,0.000756739,-0.00035741,0.00157905,-0.000514344,0.000579142,-0.00168433,0.00136235,0.00193695,-0.00155303,-0.000571171,-0.000880265,0.000044084,0.00040226,0.000139342,-0.00100143,-0.000095964,0.000121769,0.0000334665,-0.000583088,0.000467473,-0.000558637,-0.000224379,-0.000951341,0.00129247,0.000646898,-0.00122314,-0.000580931,0.00149025,0.000462108,-0.000434427,0.00100005,0.000233159,0.000523165,-0.000376856,-0.0000305997,0.000239408,-0.000630372,-0.00102979,-0.000407872,-0.00115596,-0.00133183,-0.000784916,0.000410393,-0.00194366,-0.000357618,-0.00121084,-0.0000583662,0.000162287,-0.00135009,-0.000806318,-0.000589419,-0.00031057,0.000760597,0.000117939,0.0000720855,-0.0019294,0.000455446,0.000221111,0.0015344,0.0000774038,0.000230619,0.0013646,-0.00085012,0.00110946,-0.000500073,0.000412691,-0.000500556,0.000389054,-0.00137879,0.00126228,-0.00163427,-0.000574103,-0.0000521703,0.00170123,-0.000314788,0.00111482,0.000777614,-0.000996055,-0.000859682,0.00100666,0.000553863,-0.0015093,0.000117751,0.0013832,0.0000845181,-0.0011779,0.00183312,0.0000345043,-0.000752842,-0.00106275,-0.000615855,-0.000178208,0.000123227,0.0000778633,0.000757173,-0.0010638,0.000388156,0.00160738,-0.000732776,0.00175135,0.000827629,-0.0018652,0.000116772,0.000249614,0.000241883,0.000167159,-0.0013718,-0.000463339,-0.00111645,-0.00138462,0.000109151,-0.000778406,0.00105865,-0.00049027,0.0000489546,0.000607967,-0.00066597,-0.0000203958,0.00124954,0.0000315867,-0.00043025,-0.00190769,0.000000531007,0.00151344,0.000359007,0.0000450663,-0.00159988,-0.000278991,0.000282722,0.00101481,0.000338634,-0.000114864,-0.000129235,0.00144443,0.0012557,0.000541347,0.000749306,0.00108706,-0.000564901,0.000878978,0.0013042,-0.000143994,-0.0000144854,-0.000160061,0.000210887,-0.000631202,0.000267717,-0.000104092,0.000518102,-0.000169245,0.000879623,-0.000193808,-0.00009772,0.000228807,-0.000812141,0.000593194,-0.000290257,0.00128948,0.000187271,0.0000535644,0.000808218,-0.00180062,0.000847873,-0.000426624,0.000358223,0.000278337,-0.000537512,0.000324106,-0.00070897,0.00000582896,0.000335832,-0.00166802,0.000906117,-0.000295355,-0.00133083,0.0015673,0.00102968,0.000066251,0.000266712,0.0000391335,-0.000899517,-0.000845579,0.000234249,0.000850159,0.000195573,0.00115914,0.000240151,-0.00107295,0.000614631,0.000116929,-0.00011984,-0.000563901,0.00136543,0.000241498,0.00105846,-0.00194088,0.000764513,0.000281062,-0.0004424,0.000395729,0.00119086,-0.00108854,-0.000393745,0.00171319,-0.000111479,0.000844739,-0.000980996,0.000707528,0.00114426,-0.00030048,0.000889055,0.00198381,0.000373283,0.0000307672,0.000152446,-0.000299657,-0.000881584,0.000745867,-0.00128482,-0.00138425,0.000952347,0.0000930227,0.00043808,0.0000818481,-0.0000645624,0.000582474,-0.00164,0.000701752,0.0009497,0.000245388,0.000591238,-0.00180664,0.000740818,-0.00121594,-0.00110504,-0.00140666,0.000196556,-0.000638653,-0.000430541,-0.000530532,0.000414891,0.000757947,-0.00109112,0.0000766426,0.00000693972,0.00114992,0.000469843,-0.000468641,0.000378579,0.000998836,-0.0014593,0.00129207,0.00114939,-0.000194669,-0.000949898,0.00000539302,-0.000514493,0.000439659,0.000580661,-0.00076833,-0.000133765,-0.000256406,-0.000457857,0.000694173,-0.000231473,-0.000371135,0.000478418,0.00101236,-0.0000114161,0.000460127,-0.000202648,-0.000687327,-0.00134394,-0.000119172,0.000729695,0.000108036,0.000518293,-0.000230658,0.000329946,0.00136771,-0.000385043,0.000726705,-0.00000100067,0.00197265,-0.000920802,0.000640016,0.000661739,-0.000215427,-0.000836248,0.000683584,-0.000442804,0.000432209,-0.000078728,0.000164872,-0.00197945,-0.00174336,0.000456854,0.00127,-0.000532717,0.000747755,-0.000669028,-0.00184517,0.00045755,-0.000474785,0.00000226214,0.00103596,-0.000342241,0.00171247,0.00119531,-0.000868235,-0.001937,-0.000060953,0.000234326,0.000703868,-0.000607587,0.0014294,-0.0000801958,0.000289104,0.00085687,-0.0000818269,0.000487365,0.0000453375,0.000726791,0.000395239,-0.000421564,-0.000399961,-0.000558896,-0.000624434,0.000871103,0.00000581981,0.0000204051,-0.000963988,-0.00176153,-0.00106474,-0.000656898,0.000110148,-0.000142412,0.000627514,-0.00153232,0.000174781,-0.000695151,-0.0008397,-0.00036175,-0.00142665,-0.000479631,-0.0000703956,0.00000256666,0.000346393,0.000423183,0.000619206,0.000197312,0.0000488432,-0.000704072,-0.000235963,0.00154663,0.000639032,0.0000999795,-0.000124304,0.000212445,-0.00153912,-0.000531246,0.000333548,-0.0001974,-0.000810499,-0.000222493,-0.00118934,-0.000767651,0.000142226,-0.000243948,-0.000780038,-0.000680516,-0.00108515,0.0015715,-0.00164617,0.000467433,-0.00127426,0.000430589,0.000160641,-0.00030856,0.000202852,0.000335903,-0.000656775,-0.00193162,-0.000706688,0.00154198,-0.000192074,-0.000121925,-0.0000738467,-0.00174135,0.00110334,0.00139296,0.0000574815,0.00037294,-0.000633167,0.00014706,0.000438842,0.00121667,-0.000497442,-0.000988408,0.000311246,0.000805638,-0.00141583,0.000165229,-0.00101419,-0.000772904,0.000856954,0.000319099,0.000860442,-0.000430875,0.0011816,-0.00182736,-0.00102368,-0.00136783,-0.0000178997,0.0000546864,0.00108406,0.000560378,0.000754663,0.00041668,-0.000166494,-0.000531213,-0.00171454,-0.000454428,-0.000576223,0.000429111,-0.000736565,0.000646373,0.00110868,0.000890519,0.000475771,0.00048866,0.000297276,-0.00000627739,0.00150939,0.000776834,-0.00116358,0.000140905,-0.000179952,0.00052651,-0.00109028,-0.0012458,0.00144425,-0.000561927,-0.000143283,0.000602717,0.00154231,-0.000668241,0.0011812,0.000281999,-0.000193177,-0.00156058,-0.00164918,-0.000911561,-0.000888622,-0.000449161,-0.000296743,-0.00142091,0.000470439,-0.00118618,-0.000723711,-0.000870227,-0.0000886689,0.000629491,0.000854166,0.0000576107,-0.00181168,-0.00057099,0.000995991,-0.00187762,0.00049945,0.0000907681,-0.00011164,0.0017058,-0.000782327,-0.000559217,0.000288523,-0.000405185,-0.000642927,0.000952772,-0.000154412,-0.00199102,-0.00132722,-0.000219765,-0.000887952,-0.00107792,0.000594751,0.000544978,0.000335099,0.00000171497,0.000643353,0.000650538,-0.000616355,-0.00115992,-0.000963553,0.0000973592,-0.00156091,0.000414644,0.00170395,0.000409634,-0.000209405,-0.000702135,-0.00187253,0.00107854,0.000666639,0.000852251,-0.00182874,0.000219125,-0.00112166,0.00150888,-0.00149834,-0.00156855,-0.00115097,0.000569113,0.000320835,0.000169327,-0.00092707,-0.000660257,-0.00163002,0.00114788,0.00107299,0.00176355,0.000181829,-0.000899809,-0.000193967,0.00157319,-0.000759568,0.000513568,-0.000917004,0.000659578,-0.000958038,0.00104527,0.00135764,-0.000474609,-0.0000516198,-0.000425529,0.00105703,-0.00111259,-0.000432744,-0.000374592,0.000000838047,-0.00149122,0.000143148,0.000542425,-0.00178028,-0.000239676,-0.00104953,0.00107801,-0.000530332,-0.00160077,-0.000737073,-0.00127569,0.000159636,0.00000475358,-0.00100777,0.000344223,-0.000481293,0.000734948,-0.00071877,0.00056812,-0.000717818,-0.000615095,-0.000120228,-0.00162869,-0.00131714,-0.00141089,0.0010913,0.000256459,-0.000639549,-0.000704717,0.000794223,-0.0000848588,0.0015887,-0.000137887,0.000425673,-0.00122557,0.000492179,-0.000547623,-0.000436998,-0.000359353,0.00067684,-0.0000845688,0.000693238,0.00107694,-0.000307646,0.000279302,-0.00197645,0.000210422,-0.000876285,-0.000630509,-0.00189789,0.000153911,-0.00118198,-0.00188844,-0.000913427,-0.000589297,0.000338868,-0.00111135,-0.000339898,0.000763527,-0.000889322,0.000131178,0.000256506,-0.000510133,0.000689762,0.000739749,0.0000136807,-0.000282639,-0.00123796,0.00103433,-0.000652177,0.000294422,0.000550774,-0.000497342,0.00034028,-0.00142674,0.00138962,-0.000519536,-0.00149307,0.000102473,-0.000791714,-0.00116332,-0.000733457,0.000660915,-0.00101571,0.000384683,0.00152308,-0.00198076,0.000135633,0.00011811,0.000748711,0.0010533,-0.000543168,0.000385866,0.0000690547,-0.000438219,-0.000374012,0.00043452,-0.000216875,-0.000243008,-0.00153253,0.0018931,-0.00161653,0.000475385,-0.0000885506,0.00033958,0.00102093,0.000797395,0.0000691018,0.000313653,-0.000553369,0.000227024,-0.00176911,-0.000495923,-0.00029491,-0.000135735,-0.000383362,0.000847062,-0.00113319,-0.000374691,0.00148443,-0.0000469676,0.000314343,0.00130812,-0.000587488,0.000889603,0.00133724,0.000577222,-0.000201539,0.000960717,-0.000889988,0.0000636553,-0.000860724,-0.000397585,-0.000459119,-0.00120568,-0.000659942,-0.000358271,-0.000619852,-0.000210721,-0.000213926,-0.000675276,-0.00131353,0.000104872,-0.00101257,-0.000429893,0.000494949,-0.000343753,-0.000959707,0.00156356,0.000362586,0.000771298,-0.0000841251,0.000418499,-0.000357144,-0.00018314,-0.00155254,0.000955011,0.0015396,0.0000742918,0.00175152,0.00064047,-0.000941846,0.000611582,-0.000543942,0.00152983,0.000501978,-0.00173373,0.00030223,-0.000241308,0.000420325,-0.00151457,-0.000879524,0.00103359,-0.000658997,0.000944227,-0.00147107,-0.000462594,0.000650442,-0.000875504,-0.000430592,-0.0000208436,0.00005178,-0.000459303,0.00026315,-0.0000378354,-0.000668563,-0.0000653726,0.00123478,-0.0000214442,0.000370141,0.000396011,-0.00126144,0.000699958,-0.00017668,-0.0000599205,0.00152686,-0.000501982,-0.000306216,0.000709138,-0.000815761,0.000747337,-0.00125628,0.000174371,-0.00000258194,-0.00147934,-0.000968402,0.00145492,0.000219481,-0.000000136674,-0.000241103,-0.00104735,-0.000706733,0.000472345,-0.0000285102,0.000816303,0.00174451,0.000177402,0.000270587,0.000722654,0.000383219,0.0000212561,0.000291261,0.0000832566,-0.00138607,0.00109141,-0.00152448,-0.0000172708,0.000527089,0.000365047,0.000454225,0.00112481,-0.00101365,0.000500457,-0.000115585,0.000964553,-0.000662626,0.000419576,0.00111508,0.000164198,-0.000146492,0.000691825,-0.000381091,-0.000856605,0.000271155,-0.000830198,-0.000155017,-0.00141024,0.00107047,-0.000322832,-0.0000452383,0.0011465,0.000419151,0.000243176,0.00023953,-0.000375192,0.000842933,0.000684451,0.000835843,0.00116752,0.00116916,0.000941787,-0.0016785,0.000293616,0.000230648,-0.000426251,0.00155891,-0.000619922,-0.00145459,-0.000356738,0.000942753,0.00174468,-0.00086,-0.000451681,-0.000413836,0.000447466,0.00165991,-0.000188865,0.000104497,0.00193638,0.000380763,-0.000461872,0.000534002,0.000224234,0.00179225,-0.00054926,-0.0000901704,-0.000296872,0.00131367,-0.000304723,0.000255481,0.000123161,0.000951218,-0.0013377,-0.000124912,0.000144734,-0.000269401,-0.0000617447,-0.00000731103,-0.000390715,-0.000752414,0.00144569,0.00111928,-0.00000774574,0.000606547,-0.000932656,-0.000117504,0.00000472945,-0.000074212,-0.000710681,0.00137304,-0.000924282,-0.000122156,-0.000390708,-0.00111407,-0.000453677,-0.0010419,-0.00146223,-0.000493904,-0.000835061,-0.000632072,0.000878948,-0.000957119,0.000567771,0.000465229,0.000908125,0.00145805,-0.00175546,-0.000722687,0.000971123,-0.000538494,-0.00074994,0.000116855,0.000139938,-0.00100941,0.00050353,-0.00112334,-0.00128296,0.000559655,0.00155805,-0.000658456,0.00117151,-0.00121841,0.000116362,0.00100476,-0.000615938,-0.00136363,0.000193791,-0.00130674,-0.0000844449,-0.00072068,-0.000416771,0.000992298,0.000295601,-0.000371772,0.000574204,-0.000296743,0.000098646,-0.000462628,-0.000439277,-0.000835103,0.000298885,-0.000764016,0.00169833,0.000211422,0.000402157,0.00129181,0.00168903,-0.00090266,-0.000362521,-0.00100612,0.00155716,0.000290536,0.0000813515,-0.000712334,0.00075787,-0.0000849264,0.00096827,0.00052356,0.000669401,-0.00146752,-0.000331754,-0.00125778,-0.000349131,0.000762035,0.000123808,-0.000595389,0.000441837,0.000955906,0.000711887,-0.000224649,0.000000852076,0.00100194,-0.000603193,-0.00163297,-0.000319983,-0.000433601,-0.000807895,0.00167422,0.0017494,0.000324316,0.000486419,0.000326252,0.0000851904,0.000575415,0.0000448948,-0.00108626,0.000296104,0.00143263,-0.000108484,0.00144936,0.00125467,-0.000704671,-0.000555167,0.000673187,-0.00111526,-0.00113412,-0.00130148,0.00098061,0.000513605,-0.00192372,-0.000132779,-0.00100201,-0.000632166,-0.00162521,-0.000017805,-0.000704636,-0.000413261,-0.00109712,0.000974105,-0.000478798,-0.000310964,0.000871637,0.000338449,-0.00118093,0.000929325,0.000160954,-0.000931704,-0.00124927,-0.000990225,0.000421999,0.00115948,0.00146666,0.000277109,0.00163502,-0.000200621,-0.00166843,-0.000335768,0.0000989313,-0.000193192,-0.000546206,-0.000539932,0.00016542,0.00069142,-0.000568113,0.00022477,-0.000551242,0.000228421,-0.00049027,0.000391307,0.000530534,0.00100178,0.00199658,-0.000689885,-0.000476974,0.00108525,0.000342914,0.000586045,0.000587408,0.00107351,-0.00157661,0.0000807886,-0.00108402,-0.000237866,-0.000711501,-0.000394268,-0.000227293,0.000829417,-0.000618432,-0.000115189,-0.000184694,-0.00127688,-0.0000858049,0.00097926,-0.000772141,-0.00119617,0.000632735,-0.00154548,0.000201043,-0.0000666088,-0.000171988,-0.00152693,0.000592156,0.000978382,0.000564448,-0.000396538,0.000190587,-0.0000128651,-0.000354783,0.000115861,-0.000748083,-0.000622191,-0.000901784,-0.000939441,-0.000503759,0.0000349028,-0.000354536,0.000620022,0.000545623,0.00121696,-0.000729975,-0.00149531,-0.000836753,0.000405645,-0.00109147,-0.000100164,0.00016577,-0.00191803,0.000825175,0.000448559,-0.000569568,0.000594186,-0.000322929,-0.00182777,0.00123454,-0.000804523,0.000376045,-0.000472865,0.000142025,0.00095943,-0.0000591419,0.00086426,-0.000283488,-0.00140459,-0.00134704,0.0003665,-0.000103285,-0.00171027,0.00137246,0.000696391,-0.000308195,-0.000782331,0.000547429,-0.000892738,-0.0011289,0.000537625,0.00125177,0.000508946,0.00144446,0.00154554,0.000127322,0.00149424,0.000607878,0.00123367,-0.0018102,0.000180462,0.00104213,0.00038406,0.000644214,0.000761833,0.000950273,0.000741944,0.000533028,-0.0000862941,0.000351367,-0.000146674,-0.00029562,0.000175317,-0.000662491,0.00107308,-0.000676965,0.000407542,0.000464628,-0.000761114,-0.000898306,-0.000723664,-0.0002976,-0.000347667,-0.000765845,-0.000533487,-0.000738721,-0.00140015,0.000212754,0.00017579,0.00143569,0.000453712,0.00105525,0.000973838,0.000798782,0.000208604,0.000677838,0.00115327,0.000263503,-0.000309748,-0.000146752,0.000189268,0.00144508,0.000114519,-0.00184417,-0.00186862,0.000710835,-0.0000844774,0.00129561,0.0000327108,0.00119709,-0.000323807,0.0013058,-0.00109482,0.00098181,-0.000112469,0.00127746,-0.000959569,0.00164496,-0.000612534,-0.00168466,0.00084786,-0.000900846,0.000515028,0.000341228,-0.00124795,-0.000769691,0.000370622,-0.000135002,-0.00137487,0.00179986,-0.00111197,0.00189399,0.000280278,-0.00102595,0.000780063,0.000163652,-0.000263317,0.0000730568,0.000131546,0.000835868,0.000174665,-0.00132605,0.000601988,-0.00109172,-0.00054887,0.000338427,0.00158668,0.0000656243,0.0014458,-0.000182581,0.000220098,-0.000150277,-0.00104844,0.000574233,-0.000822215,-0.00190692,0.00109314,0.000250886,-0.000766458,0.000313595,-0.000256631,-0.000785006,0.000413981,0.000692434,-0.000672091,-0.000562502,-0.000639313,0.000886942,-0.00117259,0.0000307349,0.00024278,-0.000987267,0.0000121591,-0.00107007,0.000560948,0.00199689,-0.00199262,0.000464493,-0.00123506,0.0000606341,-0.00114486,0.000764202,-0.000567644,0.000443573,-0.000599528,-0.000326517,0.000177768,0.0000205507,0.000557665,-0.00185025,-0.0013275,0.0018825,-0.00173339,0.00144202,-0.00177051,0.000150006,0.000513513,0.000427477,-0.0000138849,0.000114027,-0.00051452,-0.000134011,-0.000573476,-0.0000740699,0.00000376658,0.000480396,0.000910553,0.00116185,0.000121605,-0.00144124,-0.000525155,0.000526479,0.00174918,-0.000273165,0.000668298,-0.000370211,-0.00025372,-0.00138596,-0.00100834,-0.000973026,0.000668082,-0.000923318,-0.000545734,-0.00116858,-0.000661036,0.000675044,0.000184197,-0.00159657,-0.000861967,-0.00129343,0.000220262,0.0000461003,-0.00130181,0.000137101,-0.00159732,0.000990296,0.000138664,-0.00145218,-0.000745363,-0.000534064,0.00106549,-0.00145182,0.000263936,-0.00197454,0.000261213,0.000982165,0.0012328,-0.0000376852,-0.000568935,0.00126134,0.000767994,-0.000282598,0.000519375,-0.000486061,0.00128684,0.000277451,-0.00121854,0.00139233,0.000428362,0.000488338,-0.00159963,0.000577875,0.00054703,0.000762272,-0.000902457,0.000507923,-0.000537756,0.000895478,0.00132514,-0.00175883,-0.000539129,0.000574571,-0.000761291,-0.00184241,-0.000710004,-0.0000467338,-0.0011741,0.000243128,-0.00159566,0.000155031,-0.00130397,-0.00154906,0.000254422,0.000265015,-0.00166245,-0.00140638,-0.00102053,0.000738595,0.000143741,0.000216583,0.00161111,-0.0000749361,0.000740316,-0.00023406,0.00181774,-0.000254191,-0.00155857,-0.000127973,0.000264865,-0.000163646,-0.000605286,-0.00126869,0.000303167,0.000824123,-0.000857331,0.00159693,0.00116463,-0.00114642,0.00085271,0.00169948,-0.000821866,-0.000556065,-0.000372792,0.000980729,0.000504218,0.000310118,0.000217532,0.000671754,-0.00112566,-0.00157395,-0.000666199,0.000566804,-0.00119043,-0.0000157849,0.000276883,0.00137993,0.000258256,-0.00060611,-0.00126985,0.000321151,0.000177655,-0.00167227,-0.000573653,0.000846023,-0.00102264,0.00129596,-0.00107432,0.0000807601,0.00195434,0.00139578,0.000692533,0.00170397,-0.000349236,0.000464428,0.000169416,0.000924355,0.0000960017,0.000719748,0.000418891,-0.000581824,0.000181595,-0.000565893,-0.00102204,-0.0012243,0.000786173,0.000506518,-0.000516408,0.000540671,-0.00129518,-0.00096826,0.000882028,-0.000879098,-0.00087526,-0.000492055,-0.000770088,-0.000201995,-0.000201735,-0.000306588,0.00140985,0.000769723,0.000441385,-0.000247391,-0.000311792,0.000332767,-0.00103971,-0.00122827,0.0015928,-0.00010327,-0.00115918,-0.000389047,-0.00113752,0.000352339,0.000931826,0.00167083,-0.000789573,-0.00059031,0.0006772,0.00101207,-0.0000994048,-0.00118907,-0.00155186,0.00108071,-0.000623741,-0.00048034,-0.0000446082,-0.00125083,-0.0000941759,-0.00125609,0.00128692,-0.0013168,-0.000153343,0.0012804,-0.00119229,0.000104682,0.000171743,0.00126114,0.0000528622,-0.00172358,0.000725315,0.00113176,0.000679466,0.00147652,-0.000208161,0.000679939,-0.00126232,-0.000690694,0.000570474,0.00165781,-0.0011389,-0.000563189,0.000732539,-0.000779829,0.0000721613,0.000408205,-0.000201071,0.000245457,0.000271987,0.000115652,0.000493102,-0.00170547,0.000204002,0.000735159,0.000227897,-0.000300862,0.0000166392,-0.000866897,0.0000799783,-0.00181246,0.00169138,-0.000222082,0.0000810697,-0.0000878856,0.00115993,0.000465249,-0.000627989,0.000390606,-0.000986884,0.0000937564,0.00104303,0.000446884,0.00112805,-0.000151603,-0.00199901,-0.000305297,-0.000491696,-0.0000335733,-0.0000226862,0.00119609,0.000697543,-0.000878587,0.000962843,-0.000760665,0.000585017,-0.00113566,0.000195258,0.00102341,-0.00185822,-0.000585159,-0.000936912,0.000923785,0.000664872,0.000188701,0.000269402,0.000844322,0.000333088,-0.000632796,-0.000663968,-0.0011441,0.000845226,0.000293947,0.000341118,0.000991625,-0.000408156,-0.000280731,-0.000284255,-0.000759575,-0.0000604187,-0.000946843,0.000762638,-0.000469239,0.000989209,0.000913665,0.00194477,0.0000454538,0.00157887,0.00124058,-0.000166534,0.000379172,-0.000776947,0.00151998,-0.000805771,-0.0008602,-0.000766332,0.000739152,0.000368655,-0.000835059,-0.000711289,0.00199966,-0.00133727,-0.000633972,0.000486751,-0.00125199,-0.000628748,-0.000939906,0.000779781,0.000641663,-0.00107737,0.000587084,-0.000812074,0.000713787,0.000531286,0.000263792,0.00140916,-0.000705169,0.000895514,0.000375244,-0.000297057,0.000930279,-0.000504593,-0.0000946852,-0.000813194,-0.000413908,-0.00134349,0.000112716,-0.00135163,-0.000292193,0.00142764,-0.000149957,-0.000102861,0.000397373,0.000116288,0.0000959132,-0.000236885,-0.00125747,-0.00109205,-0.000744171,-0.000640344,-0.0000173796,0.00114299,0.000316569,-0.000238778,-0.000220888,0.000382723,-0.000608171,0.0011031,-0.00120429,-0.00086663,0.0012586,-0.000862542,0.00102769,-0.000286728,-0.000341975,-0.0000355695,-0.000507051,0.000476886,-0.000131808,0.000383768,-0.0010343,0.00147172,0.000534859,-0.000550704,-0.00094189,0.000303417,0.000374922,0.000912861,-0.0000816096,0.00198946,-0.00121816,-0.000718835,0.000158292,-0.000180539,-0.00100643,-0.000668923,-0.00134461,0.00036634,0.000376613,0.00150476,0.00118861,0.000225148,0.00176182,0.000811199,0.000360277,0.000803469,0.00165191,0.0000958027,0.00019849,-0.00117444,0.000112894,0.000605286,-0.000735064,0.000236957,-0.000320935,-0.000948744,-0.00000569659,0.000477801,-0.000921148,0.000120597,0.000142844,0.0000592269,0.000104999,-0.00000686575,-0.00113475,0.00159361,-0.00120111,0.000590879,-0.000743456,0.000527044,0.00177708,0.00173921,0.00029991,-0.00120444,-0.000900895,-0.00191663,0.000554559,-0.00101286,-0.000522719,0.000655999,-0.000467357,-0.00031306,0.00123499,0.000231107,0.000339029,0.0000799655,0.000987077,0.0011362,-0.000578935,0.000325469,0.000414406,-0.000870948,-0.000396692,-0.000646169,0.000509523,-0.000100286,-0.0011888,-0.00164129,0.000538815,-0.0000181644,-0.0019026,-0.000410035,0.000974954,0.00136706,-0.000498622,0.000714,0.00108155,-0.000739498,0.00198077,-0.00132434,-0.000456959,0.000808239,-0.000449219,-0.0000800929,0.000646439,0.000938788,0.00043216,-0.00145091,-0.000526513,-0.00106586,0.00140568,-0.000961301,-0.00020423,-0.000564515,0.000137579,-0.000381972,0.0005689,-0.000632804,-0.000229557,-0.000312039,-0.00152719,-0.000798893,0.000707755,0.000835819,-0.000725642,-0.000422712,0.00174988,-0.000146099,-0.000221268,0.000921831,0.0018382,-0.00101628,-0.000458376,-0.000394522,-0.000123904,-0.00098667,-0.00168564,-0.00115349,0.00135367,-0.000410337,-0.00128232,0.000308408,-0.00106056,0.0000934496,0.000436902,0.000594863,0.00127231,0.000188832,-0.00106648,0.0000520783,0.0000665456,-0.000471635,0.000152664,0.000331353,-0.000839499,0.000663527,0.00183211,-0.000214565,0.000334025,-0.00102398,0.00107834,0.000163315,-0.000821034,0.00144977,0.000988639,0.00145308,0.000382906,0.00106893,-0.000534772,-0.00170667,0.000480516,-0.000947688,0.000775879,-0.000955366,0.0000380194,-0.000481506,-0.000361946,0.00130144,0.000437561,-0.000379663,0.0000697779,0.000850801,0.000179028,-0.00139805,0.000165397,-0.0000660569,-0.00106245,-0.00009505,-0.000164529,0.000939505,0.00169895,-0.00042465,0.00120849,-0.0000186337,0.000906068,0.000493845,-0.000116244,0.000158065,-0.000366268,0.000321587,-0.000211983,0.000188158,-0.000729659,0.000241998,-0.000795934,-0.000776953,-0.000706462,0.001386,-0.0000345958,-0.000629342,-0.000621856,0.000766112,0.00119527,-0.00105518,0.000246476,0.00102307,-0.0012315,-0.000291959,-0.000307147,-0.000904651,0.00181476,0.000183924,-0.000554212,-0.000503289,0.00121303,-0.00194507,0.000641832,-0.00125791,-0.0000404603,0.000692671,0.000123169,-0.000599522,-0.00117123,-0.000800972,0.000622673,0.000166339,0.000902037,0.000362932,-0.000166122,-0.00175033,-0.000718216,-0.000407456,0.000466901,0.000218372,0.0013124,-0.000933872,0.000293977,0.000105276,-0.00021256,0.000620539,0.000387846,0.000166822,0.00107876,0.000493156,-0.00044901,-0.000472398,0.000926911,0.000619269,0.0000594703,0.000128299,0.000485076,-0.000671414,-0.00179678,0.00128254,0.000957767,0.00068806,-0.0000985514,-0.00170904,-0.000802576,-0.000615518,0.000672837,-0.000614014,-0.0010879,-0.000307167,-0.00143257,0.00106709,0.00133502,-0.00080981,-0.000348099,-0.000361558,-0.000844614,0.00128835,0.000307305,0.00118785,0.000609498,0.000883772,-0.000154976,-0.000349194,-0.000424252,-0.00073453,-0.000268733,-0.00124107,-0.000227781,-0.000377621,-0.000774259,-0.00139603,0.000678696,0.000434486,-0.000462097,-0.000113012,0.000965102,-0.000302762,0.00111265,-0.00132899,-0.000278909,-0.000193944,0.00103151,0.00039617,-0.00102018,0.00135591,-0.000343485,-0.00116086,0.000294413,0.000730895,-0.00090225,0.000132992,0.000282608,-0.000482848,0.000742994,0.000499821,0.001165,0.00151354,-0.000400625,0.00165025,0.000213818,-0.000408756,0.000430545,0.000060793,0.000844694,0.00000989596,0.000569295,0.000890439,0.00102805,-0.00124982,-0.00088899,-0.000917315,-0.000516537,-0.000194367,0.00118298,0.00047375,0.00120196,-0.00082415,0.000662486,0.0000758171,0.000333154,-0.000314238,0.000543803,0.00129045,0.00188072,-0.0019195,0.00140721,0.00153841,0.00124398,-0.0000554565,-0.00096632,0.000357106,-0.0000177512,-0.00117384,-0.000111566,0.000197198,0.00042165,0.0000117364,0.00137579,-0.00147705,0.000344847,-0.00110917,0.00106571,0.00120829,0.000225271,0.000628351,-0.000271521,-0.000862601,0.0000702038,-0.00157916,-0.00101776,0.000419663,-0.000598095,-0.00022337,-0.00114419,-0.000767412,-0.000162656,-0.000877721,-0.000627395,0.000917818,-0.0000378226,-0.000785084,-0.000321633,0.00180964,0.000554544,0.00143455,-0.000184024,0.0017735,0.0016971,0.0000636118,0.00019431,0.000754668,-0.000606254,-0.000320907,0.00105708,0.000715246,0.000722442,-0.000451737,0.0019886,0.000594937,-0.000433461,0.000446295,-0.00157403,-0.00130059,-0.000904993,0.00124505,-0.00124991,-0.0000811837,-0.000635083,0.00105143,-0.0000515842,-0.000414757,-0.000711667,0.0000552653,0.000763717,0.000533647,-0.0000669605,-0.000916666,0.0000835944,0.000333992,0.000881779,0.00103057,-0.000681865,-0.000268332,-0.000493053,-0.000251226,0.000880007,-0.000478183,0.000656268,-0.00177651,0.00120201,-0.000435378,0.000393632,0.00183893,-0.00121387,-0.000335446,-0.00171023,0.000745157,-0.000656559,-0.000165377,0.00185561,0.000606586,-0.000966998,0.0000949432,0.00067499,0.000796806,-0.00170711,-0.00100694,-0.0000885873,0.00143231,-0.000884822,0.000143546,0.00109781,-0.000875377,-0.00123594,0.00134639,-0.000648479,0.00187546,-0.000490973,-0.000929096,-0.000789058,0.0000835391,0.000181123,0.00115184,0.000780813,-0.00122516,0.000560027,-0.000927785,0.00024713,0.00113009,-0.00138293,-0.00137211,0.000475438,-0.000601641,0.0000371315,0.00120668,-0.00057625,0.000842469,-0.000723989,0.000984651,-0.00145157,0.000789329,0.0000893755,0.000362319,-0.00118029,0.00123754,0.00043835,0.00188748,0.00048823,0.00094497,-0.000678026,-0.00159047,0.000373103,0.000799497,0.00119344,-0.000797095,-0.000125877,-0.000783165,0.00137976,0.000623376,0.000305726,0.000210236,0.0000615274,-0.0000990725,-0.000562264,-0.000607697,-0.000352217,0.000979586,0.000190497,0.000079596,0.0010489,-0.0000847856,0.00136876,0.000310886,-0.000637956,0.000520933,-0.0000132705,-0.000109038,-0.000100337,-0.000441034,-0.0016293,-0.000858904,0.0000810327,0.000864704,0.000205618,-0.00083363,0.000309089,0.000209012,0.0000107864,0.00041682,-0.00116606,0.000576069,0.000156981,-0.00130311,0.000368431,0.00024075,-0.00141612,-0.000509157,0.000798609,0.00195595,-0.000182031,-0.000828539,-0.00148783,0.000850905,-0.00137105,-0.000559445,0.00015586,0.000283934,-0.000461727,0.000400181,-0.000300997,0.0015698,0.00154809,0.00097043,0.00140854,-0.00120428,0.000786988,0.000490604,-0.000844241,0.00069906,-0.00164831,-0.00100502,0.00140492,-0.0000177751,0.00183633,0.00031809,0.00197071,0.000500498,0.000777208,-0.00199743,-0.000293014,0.00136454,-0.000421388,0.0000814689,-0.00152789,0.000101213,-0.000704314,0.000638517,0.000874636,-0.000409895,-0.00117886,-0.000801293,-0.00121954,0.0000282741,-0.0000014743,-0.000564779,0.00149262,0.0000184189,0.000401966,0.00163255,-0.00156136,0.000110834,0.000873781,-0.000464806,-0.000513631,-0.00135788,0.000744689,-0.000381013,-0.00148034,-0.000297022,-0.000140362,0.0000663492,0.000844956,0.000927639,0.000537394,0.00101939,0.00139188,0.000152885,-0.000948301,0.000567124,0.000760181,-0.00064821,-0.00154823,0.000267631,-0.000852744,-0.000533825,-0.000116993,0.000200312,-0.000920256,0.0000836137,0.000834699,-0.000852378,0.00025143,-0.00163263,-0.00105321,-0.00103429,0.0013898,-0.000424302,-0.000281446,0.0000977721,0.00122383,0.000190583,-0.00068122,0.0000753709,-0.000087077,0.00127168,-0.00170322,0.000266937,0.0000305331,-0.000841765,-0.00121425,0.00115987,-0.000729763,0.00131991,0.00060747,0.00149062,0.000289016,-0.000741628,0.0006295,-0.00000607886,-0.00127539,-0.00075301,-0.000343108,0.000801057,-0.000708965,-0.00108867,-0.000778758,-0.000364608,0.0000208815,-0.00100613,-0.000747614,0.00083613,-0.0010629,0.000034736,0.000940484,-0.000870603,-0.00140586,-0.00115028,-0.0000561301,0.00114508,0.001103,0.00115156,0.0001372,-0.00164657,-0.000706924,0.000224224,0.0015832,-0.00102241,0.000318569,0.001963,-0.000542867,0.000880772,-0.00115431,-0.00125317,-0.0000590211,0.000272688,0.000420928,-0.000271233,-0.000244631,-0.000484394,0.000665146,-0.000542017,0.000047545,0.000609452,-0.000470989,0.00175522,0.00122378,0.000525691,-0.000193169,0.00139415,0.0018886,-0.0013561,0.0000182331,0.000368791,-0.000754165,-0.000174322,0.00117818,0.0000480085,0.000765356,0.000739546,-0.000812787,0.00107848,-0.000381392,0.00105895,-0.000837381,0.000857341,-0.000109342,-0.000388005,0.000723498,0.00103076,0.000142766,0.000212919,0.0000348105,0.000490924,0.00070194,0.00119572,0.0000797439,0.00163433,0.000153426,-0.000299475,-0.000238133,-0.00040619,0.00117065,-0.00136178,-0.00114551,0.00124694,-0.000327871,-0.000629254,0.000898246,0.000283524,-0.000932505,-0.000971378,0.00071875,-0.0000206963,0.000564772,0.00172571,0.00135648,-0.00115946,0.00188472,0.00124236,-0.000112693,-0.00109301,0.000848234,-0.00109106,0.000741392,-0.00164748,-0.00125012,0.000727065,0.00160105,0.000789458,0.000892776,-0.00132206,-0.00105575,-0.000364901,-0.000126128,-0.0013001,-0.000290803,0.0017786,-0.00155994,0.000247437,-0.0000665478,0.00108681,0.000564148,0.000275311,-0.00091815,0.000784904,-0.0000909532,0.000469334,0.000520673,0.000150514,-0.000449629,-0.00170374,0.000131212,-0.000351283,0.000787517,0.000197542,0.000016975,0.00106271,-0.000772195,0.000324485,-0.00094356,-0.000413235,0.000378634,0.000694203,0.000661324,0.00109271,0.0000653615,-0.000328688,-0.00109621,0.000389559,0.00118554,0.000504721,0.000463636,-0.00131013,0.00168633,-0.00049515,-0.0000438237,-0.0000795722,0.000642953,-0.00055137,0.000844361,0.00112601,0.0000943234,0.00120437,0.00119033,0.00096482,0.00117641,0.001125,-0.00109122,0.00101191,0.0000155837,0.00171464,-0.000635634,0.0000316142,-0.0000364243,-0.000418709,0.000313187,-0.000788713,-0.000600829,0.000453102,0.000622024,0.00085209,0.00113645,-0.000464004,-0.000983016,-0.00177432,-0.000338421,0.000887569,0.00094364,0.000304817,0.00127009,-0.00059238,-0.000849232,0.000362979,0.000458081,-0.00198921,0.00112508,0.0000396685,-0.000545517,0.000573569,0.00140452,0.00000266544,0.00131895,-0.000907357,0.000730805,-0.000262306,0.00000705934,0.0000539947,-0.000465686,-0.00000645036,-0.000100785,0.000746237,-0.000586034,-0.000426089,0.000112185,-0.00111132,-0.00100733,-0.000498491,-0.000435271,0.000458966,0.000333471,0.000395317,-0.000749568,-0.000466619,0.00170195,-0.00055042,-0.000831775,0.000989095,0.000599936,-0.000884943,-0.00178747,0.0000205813,-0.00192764,0.00135343,-0.000147104,0.00075765,0.000631893,0.000943105,0.000511931,0.000987029,0.00074871,-0.000156905,0.000267731,0.000930963,-0.000681316,0.000249558,-0.000880463,-0.000477675,0.000442599,0.00081671,0.000126619,0.00123373,-0.0000681565,-0.00182816,-0.000911759,-0.00116574,0.000628052,-0.00106525,-0.000112637,0.000260982,-0.000806392,-0.0000344926,0.0000594317,-0.000347927,-0.00171273,-0.0000318618,-0.0000642098,0.000125926,0.000180845,-0.00114552,0.00123087,-0.00112225,0.00072205,-0.000744843,0.00145816,0.00127665,-0.000448765,-0.000741424,-0.000378302,0.000107907,0.000551533,0.000481032,0.000182394,0.00168058,0.000288882,-0.000260396,-0.000811719,-0.000164238,0.000399,0.00163824,-0.00154591,0.000998715,0.000566365,-0.00164177,-0.00169987,0.000180686,0.000726289,-0.000184617,-0.000736866,-0.000496329,0.000708275,0.0000319428,-0.000342625,-0.00137402,-0.000788938,0.00123888,0.0018539,0.000946817,0.000913311,-0.000466867,-0.000493367,-0.0000187344,0.00190191,-0.000964128,-0.00140357,0.00166318,-0.000544152,0.0000576756,-0.000134122,-0.000404823,-0.00172517,-0.00194524,0.000955805,-0.000928479,-0.0000424867,0.0014515,0.00160772,-0.000233475,-0.00078783,0.000107552,-0.00146411,0.000621559,0.000516491,0.0003499,-0.00183137,-0.000347315,-0.000917985,-0.000460624,-0.000904789,0.0000841446,-0.00136333,-0.00106718,-0.000610638,-0.000179258,-0.00115016,0.000150699,-0.000594338,-0.00063191,-0.00139592,0.000949471,0.00128394,-0.00119952,0.00111543,0.00188072,0.000181424,-0.000277842,0.00187049,-0.000198427,0.000181943,0.000628263,0.00113204,-0.0000662461,-0.00121496,0.000506187,-0.00115063,0.000170914,-0.000420701,0.00190447,-0.000146212,0.000772844,-0.00100165,-0.000371632,-0.00136117,0.00176933,0.000294051,0.000552573,-0.000447701,0.000560849,-0.00189873,-0.00188135,-0.00141292,-0.000134174,0.000581148,0.000352737,0.00126424,0.000176099,0.000143744,-0.00032452,-0.000225861,0.000455005,0.0000517733,-0.00075806,-0.00104414,-0.000377262,0.00164702,-0.000130255,0.000484148,-0.0006601,-0.0010674,0.000570898,-0.000602672,0.00161254,0.000314509,-0.00130179,0.000107457,-0.000989027,0.000194145,0.0013536,0.00132562,0.000764687,0.00108988,-0.000832984,0.000340259,0.000560542,0.00176634,-0.00153001,-0.000293487,-0.000182559,0.000943847,-0.000391796,-0.00100431,-0.00104001,-0.000825392,0.000729367,-0.00133153,0.00105816,0.00178461,0.000256863,0.00000394006,-0.00162841,0.00165791,0.00108697,0.00105531,0.000205981,0.00184442,-0.00174147,-0.000181045,0.0007273,-0.0000410061,-0.00121157,-0.00109577,0.000551787,0.000425469,-0.00117188,0.00135578,0.000597933,-0.000846981,0.000394291,-0.00106944,0.000510284,-0.000043242,-0.00138932,-0.00166757,0.000206654,-0.00137005,0.00158674,0.000910121,0.000358195,0.000035972,0.00159084,-0.00116366,0.000835133,-0.000868499,0.000442007,-0.00131381,-0.000477329,0.00179652,0.000558016,-0.000662779,-0.000140039,-0.00148818,0.000216168,-0.000484532,0.000168223,-0.000706224,-0.00113236,-0.00130739,0.000109879,0.00126139,-0.000263237,-0.000116522,-0.00105983,-0.000913096,-0.000832278,-0.00192619,0.000395553,0.0013673,-0.00152499,0.00103061,0.000368217,0.000606934,-0.000889021,0.00133381,0.000719571,0.000851202,0.000809252,-0.0000143471,0.00152955,-0.000947223,-0.000845063,0.0000756644,0.000970688,-0.000762909,0.000252243,0.000794778,-0.00119264,0.000303695,-0.000363917,0.00195733,-0.000559252,-0.000279865,0.00133614,-0.000286449,0.000448114,0.00166369,-0.00164825,-0.00111639,0.00116238,0.000222587,-0.00143539,-0.00174822,-0.000926473,-0.000850053,0.00143344,-0.000957269,-0.00056158,-0.0010918,-0.00190244,-0.000716132,-0.000346016,0.00147572,0.000085494,-0.000539184,0.000565355,0.00126157,0.0000439727,-0.00107109,-0.0000507225,0.00107474,0.000497127,0.0000271651,0.00126616,0.000690613,0.000208741,0.00185332,0.00158785,-0.000327603,0.000814938,-0.000917145,-0.000433756,0.0012556,0.000275482,0.000291783,-0.000769291,-0.000571741,-0.00190274,-0.00107944,-0.00181825,0.00107578,0.000733338,-0.000229049,0.00128134,0.000370367,-0.0000148482,-0.000505022,0.000685843,-0.000288551,0.000143441,-0.00138791,-0.00184005,0.00134342,0.000209579,-0.000523474,-0.00075836,0.000669928,-0.00105036,0.000105278,-0.00170772,-0.0000771306,-0.000680523,-0.000225299,-0.000765141,-0.0000305442,0.000560888,-0.00073655,0.000833318,0.000645471,-0.000963177,-0.000486597,-0.00162916,0.0000972358,0.000349947,-0.000491763,-0.00191081,-0.000466241,0.0012196,0.000574767,-0.00081816,-0.00106928,0.000823962,0.000326282,-0.000791626,-0.00120668,0.000792873,-0.000622137,-0.00169504,0.00110397,-0.000817248,0.0018254,0.000927688,0.00116687,-0.00112261,0.000530607,0.00149962,0.000350164,-0.000948429,0.000694513,-0.00192915,0.000884094,-0.000723068,0.000437845,-0.00107683,-0.00152897,-0.000132042,-0.000344759,0.000984549,-0.0000209983,-0.000565704,0.000855812,0.00102686,0.00110959,0.000349328,-0.000384819,-0.000794633,-0.000065824,-0.000711262,0.00167981,-0.00115112,0.000606777,0.000465807,-0.000662833,0.000867198,-0.000801755,0.00115958,0.0000182398,0.0000927973,-0.00139305,-0.000410872,-0.00131559,-0.00110761,0.00168737,-0.000618292,-0.00152538,0.00134845,0.000270085,-0.000970206,-0.000984659,-0.000836864,-0.0019026,0.00045631,0.00143686,0.00101846,0.000588346,-0.000380368,-0.000807185,-0.000866424,-0.000675593,-0.001278,0.00107067,-0.000908163,0.00161384,0.000597095,-0.00116833,-0.000355531,-0.00118707,-0.000330103,-0.000427942,0.000913564,-0.000260882,0.000292317,-0.00127109,0.00154032,0.00123482,0.000653661,0.00030278,-0.000377925,-0.00162664,-0.000383127,0.00131351,-0.0000116911,0.00131487,-0.000400038,0.000531603,0.000130073,0.000779365,0.000682475,0.00113342,0.00131991,-0.000115202,0.00107593,-0.000471717,0.000599221,-0.000307028,0.00111665,0.00160982,0.0000112154,-0.000432106,0.000538159,0.0000774768,0.000250534,-0.00185118,0.0000707568,0.000397385,0.000629682,-0.0000156234,0.000351262,-0.000570065,-0.000309708,0.000730507,-0.000626752,0.000392909,-0.000890005,0.000276155,-0.000878779,-0.000342303,-0.00115772,-0.000949822,0.000211413,-0.000545663,-0.000855933,0.000924334,-0.000723118,0.0000902622,0.00108515,0.00142015,-0.000411359,-0.000445962,0.000428037,-0.00124871,-0.00000898583,0.000839729,-0.000437366,0.000230496,0.00116453,0.000777535,-0.000499624,-0.00068029,-0.00120224,0.000008349,0.000196832,0.00133456,-0.000921907,0.000685214,-0.00140547,-0.000862228,0.000302872,0.000134277,0.00100369,-0.000633127,0.00113806,-0.00154094,-0.000838379,0.000431802,-0.000796791,-0.000499657,0.000123692,0.000905283,0.000335319,0.00135038,-0.000345557,0.00120568,0.000692122,0.00115416,0.0000882781,-0.00147415,-0.00019306,-0.000709341,0.000539039,-0.00087401,-0.000454281,-0.000336929,0.000118025,0.000639857,-0.00114993,0.000230816,0.00107467,-0.00124247,-0.00016508,-0.000464947,0.000264631,-0.0000915401,-0.000475089,-0.00114048,-0.000233869,-0.00107046,-0.00127262,-0.000496886,0.000335778,-0.000298953,0.000491513,-0.0000915012,-0.00046261,0.000203513,0.000775367,-0.00152877,-0.000696869,0.0000950996,-0.00014611,-0.000403759,0.00053341,-0.000450181,0.000229618,-0.000330735,-0.00136,-0.0000282249,0.000166341,-0.0000282613,0.00086158,0.00150775,0.000421058,-0.000702404,0.000884386,-0.000790584,0.000468252,-0.0000790854,0.00047872,-0.0012829,-0.000771587,-0.00111455,0.000625661,-0.00108032,0.00199823,0.000734654,0.000787919,0.000546496,0.00145635,0.0000757096,-0.000714371,-0.000736125,-0.0010301,0.000803119,0.0000592444,-0.00000701908,-0.00148925,0.000166444,0.00119288,0.00088137,-0.000158568,0.000357369,0.000350821,-0.000794765,0.000175558,0.000316202,-0.00023846,0.000161827,-0.000366225,-0.000423036,-0.000838634,-0.00071242,-0.00187332,-0.000534817,0.000359668,-0.00100435,-0.000275164,-0.0000688538,-0.000763804,-0.000804114,-0.000403515,-0.0000820838,0.000000291708,-0.00193422,0.000497139,-0.00110541,0.000542264,0.000623253,-0.00123362,0.000549356,-0.000490761,-0.000292406,-0.00049612,0.000252358,0.000913465,-0.000833298,-0.000354049,-0.000142507,-0.000426139,-0.00119454,0.000754412,0.000795154,0.000260702,0.00025734,-0.00135394,0.00148604,-0.000900371,0.000186778,-0.000133917,-0.0000948175,-0.000220736,-0.00146094,0.00115715,0.000000531089,0.00101129,0.00184128,-0.000852022,0.000664991,-0.00132649,0.0000719696,-0.00178216,-0.000444256,0.000109444,-0.000207913,-0.00115765,-0.000390819,-0.0019012,0.000620158,0.00000387446,-0.00119908,0.00131567,0.000741133,0.00125495,-0.000525187,-0.000413892,-0.0000246129,-0.000983142,-0.000359196,-0.00131969,0.000556228,-0.00151751,-0.000274382,-0.000789336,-0.0000206826,-0.00127906,-0.00104504,0.0000900284,0.000749669,-0.000608516,-0.00137097,-0.000716856,-0.000452431,0.000361206,-0.0004528,0.0000238264,0.000578121,-0.000975836,0.000582167,0.000279634,0.000343095,-0.0000794421,-0.0015287,0.000556506,-0.000602605,-0.00032252,0.000785198,-0.00171489,-0.0016305,-0.000692365,-0.0014792,0.000725055,0.000184024,-0.00196634,-0.00137965,-0.000698258,-0.000142494,-0.000727948,0.000316954,-0.00140025,-0.000276023,0.000825433,0.00090294,0.000929249,0.00118957,0.000644504,-0.000618984,-0.000210287,0.00102894,0.000112943,0.000388875,-0.000520943,0.000903893,-0.000447687,0.000192421,-0.00132232,0.00122901,-0.0000970742,-0.000629892,-0.000759212,-0.0016519,0.00144866,-0.000220616,0.000950852,-0.000409339,0.00121588,0.000684105,-0.000570121,-0.00141838,-0.00139266,-0.000442941,-0.000585609,0.001452,-0.00108242,0.000613249,0.000327156,0.0000290734,-0.000309582,-0.0015633,0.000584728,-0.000317594,0.000405709,-0.0000544906,-0.000290451,0.00158368,-0.000956024,0.00106604,-0.000043751,-0.000419661,0.00174204,0.00110192,-0.000681742,0.0000543862,-0.00035938,-0.000385241,-0.000206368,0.000637748,0.000730296,0.000127701,0.0000470481,-0.00019136,-0.000975788,-0.00165775,0.000705408,0.0000976705,-0.000474436,-0.000891967,-0.00152144,-0.000529701,-0.000122572,-0.00158463,-0.00000318643,-0.000837531,-0.00053541,0.00150418,-0.00143436,0.000846859,0.00172531,0.000566209,0.00104467,0.0000856416,0.000548408,-0.000299534,-0.0000457963,0.0000309151,-0.000295113,0.00132874,0.000106039,0.00101008,0.0000504405,-0.000185164,0.000457797,0.000408846,-0.000586234,0.00162301,0.000605135,-0.000806702,0.000547596,-0.00048679,-0.000792199,-0.000486433,-0.00115722,0.0000652847,-0.000186928,-0.000505072,-0.00190075,0.00157199,-0.000577807,-0.000659906,0.000141998,0.00179658,-0.000303135,0.000491349,-0.000662809,-0.000706141,0.000944921,0.000349254,0.000281244,0.00101288,0.0000890925,0.0011493,-0.0000339172,0.00112855,-0.000335937,-0.000521815,0.000989524,-0.000982707,0.00117741,0.00120886,0.00152219,-0.00106104,-0.000679819,0.00107966,0.000213809,0.0018157,0.00029081,-0.00125446,0.000352615,-0.000760257,-0.00137716,-0.000424146,0.00106249,0.000195447,0.000617639,0.00179663,0.000523943,0.00139249,0.00126885,0.000652193,-0.0017632,0.000141395,-0.00064392,0.000851771,-0.00137246,-0.0000912803,0.000136494,0.00103325,-0.000991926,0.000159014,-0.000241897,-0.000405912,-0.000845527,0.00054192,0.000652147,0.001268,-0.000377544,-0.00120309,-0.000684031,0.000412611,0.000162925,-0.00140459,-0.000635752,-0.0018609,0.000107719,0.000486526,-0.00169329,-0.00095206,-0.000599811,-0.000115909,-0.00133444,0.000449492,0.0000948519,-0.0000668589,-0.00065788,0.000319006,0.000258409,0.00127579,0.000288029,-0.000523989,0.000237143,-0.000696791,0.000516831,-0.000740937,-0.000445979,-0.000138295,0.00128685,-0.000830423,-0.000396736,0.000583881,-0.000764801,-0.00196231,0.00129487,-0.00114604,-0.000384235,0.0000869874,-0.000604744,0.00120732,0.0000437213,-0.000706359,0.000392416,0.00000515911,-0.000373672,0.000277452,0.000449867,-0.000420697,-0.000271852,-0.00049815,-0.00063306,-0.00154687,0.000413028,-0.00108382,0.000219861,-0.0000844018,-0.00117784,0.00152852,0.000227648,0.00162328,-0.000471416,0.00131028,0.00195711,-0.000430201,-0.000340377,-0.00159174,-0.000152468,-0.000108754,0.000282761,-0.000828646,-0.000865574,0.000353956,-0.00151134,-0.00106722,-0.000114246,0.00195681,-0.000552436,-0.00130697,-0.00122818,-0.000639465,-0.000154157,-0.000868132,0.000210413,0.000612169,-0.000995748,0.0014244,-0.000800195,0.000035079,-0.000217599,0.00127629,-0.000897898,0.000678263,0.000329707,-0.000213497,-0.000171616,-0.000201117,-0.0000540642,0.000666779,-0.001057,-0.000263674,-0.000623577,0.00175111,0.000972413,-0.000500537,-0.000763257,0.00189749,-0.000806225,-0.00112213,0.00111333,0.000691828,-0.000950322,0.000462314,0.000157917,-0.00142588,-0.000239033,-0.000485271,0.00134381,-0.000630197,-0.000479645,0.000213606,-0.000998514,0.00054541,-0.00125871,0.000214243,0.000861213,0.000404289,0.0000182668,-0.000483963,0.000173576,-0.000169033,-0.00137027,-0.000438308,-0.00121894,-0.000878148,0.000211329,0.00172999,0.000968848,0.000219852,-0.000578343,0.00114948,0.000487077,0.000928359,-0.00111681,0.000649682,0.000311315,-0.00133758,-0.00129253,0.000738867,-0.00170674,0.000862924,-0.000589121,-0.000613444,-0.00109566,-0.00161147,-0.00111058,0.0000111806,-0.000740794,-0.000109487,-0.000166478,-0.000269917,0.000779049,-0.00087861,0.000663385,-0.000374195,0.000965237,0.00021242,0.000304808,-0.00079507,-0.000962911,0.000300431,0.000124546,0.000311732,0.0012618,0.00137714,-0.0000415091,-0.000764557,-0.000514772,0.00192624,-0.0002172,0.00026968,-0.000662351,-0.000432138,0.000635829,0.00129612,0.000485897,-0.000662355,-0.000601778,0.000298523,-0.000584504,-0.000559412,-0.000747832,0.000527003,0.000108649,-0.00187776,-0.000333549,-0.000405765,0.0000293003,0.0000424332,0.00103973,-0.0000112959,0.000326856,0.000748373,0.000259629,-0.000290877,0.000124915,0.00155883,-0.0000593246,0.000994306,-0.00107631,0.000505683,-0.00164524,-0.00114767,0.00023729,0.000217306,0.000678452,-0.000415023,-0.000917704,0.000504979,0.000829878,0.0018753,-0.0000137044,-0.00142315,0.000403089,0.0010989,0.000343448,-0.00165526,-0.000250821,0.0000269918,0.000659873,-0.0013824,0.000186177,0.000976902,0.00198287,-0.0010075,-0.000162477,0.000109084,0.001386,-0.000874843,0.00135041,-0.00160492,-0.000980962,-0.00000555157,-0.00024731,-0.000965337,0.000738387,-0.000525831,0.000786155,0.00160517,0.00173383,0.000859677,0.000660397,0.000552412,0.0016017,0.0000774009,-0.000417482,-0.000200165,0.000863201,0.00071187,0.000523234,-0.00140793,-0.0010217,-0.00104965,0.0017235,0.000497286,-0.0000574057,0.00146607,0.00108605,-0.0000250603,0.0000242834,-0.00110347,-0.000363223,-0.0000299594,0.00147341,0.000952051,0.000224353,-0.000773026,0.000251217,0.000980367,0.0012821,-0.00061345,0.00122705,0.00124482,-0.000227708,0.00123842,0.000362906,0.000736566,-0.00161876,0.000311366,0.00111612,0.000806983,0.000562165,0.000427246,0.0019207,0.0000757777,-0.000258066,-0.000757437,0.000150722,-0.00014089,0.00180496,-0.000938321,-0.000667967,0.0012795,0.000473066,-0.000707332,0.000745864,0.000311794,0.000451319,0.0000844587,0.000267853,0.000400498,-0.000105204,0.000140962,0.000622981,0.00116579,-0.000499369,0.000553095,0.00196123,-0.000346835,0.000381906,-0.00131287,0.000499266,0.001766,0.000354225,-0.000538097,-0.0000788569,0.00167242,-0.0015191,0.000200823,-0.0012062,-0.000491074,0.000414585,-0.00186811,0.000507771,-0.000100313,-0.000143429,-0.000197278,-0.000815417,-0.0019231,0.000983757,-0.0001969,0.000758664,-0.000296402,0.00147127,0.000159561,0.000800197,0.000567292,0.000296311,-0.000276717,-0.00169398,-0.00087369,0.0000984212,-0.00027583,0.00139879,-0.000172896,-0.0000526918,0.00113494,0.000338046,0.0000832968,0.000144981,-0.000172289,0.00179132,0.000732101,0.00187847,0.000596708,0.00062022,0.000147665,0.00030552,0.00103882,0.000115945,-0.000235778,-0.000557408,0.00141704,-0.00165194,-0.000135928,-0.0000627948,0.0000734273,0.000591787,0.000906248,0.000643562,-0.000413209,0.00022715,0.00106679,-0.00096889,-0.000748923,-0.00112784,-0.000297932,-0.0000132968,-0.00158637,0.000513966,-0.000631843,0.0000140512,0.00157115,-0.000953484,0.00112412,0.000365068,0.000516379,-0.000206073,-0.000252688,-0.00106975,0.00102489,-0.00104689,-0.000179213,-0.000855643,-0.000260429,0.00161857,-0.000788721,0.00032226,-0.00101953,-0.000481844,0.00121485,-0.00116728,-0.0000860029,0.000202633,0.00108336,-0.000415217,0.00000629024,-0.00162079,0.0000474195,-0.000281457,-0.00122546,0.00131465,0.000190536,-0.000699156,0.000259752,-0.00152746,-0.00076818,0.000192269,-0.000308603,-0.00121003,0.000973256,-0.00030358,0.000298157,-0.000463079,-0.0000070762,-0.000378729,0.000615398,0.000530386,-0.000298044,0.000342476,0.000798159,-0.00129617,-0.00158849,-0.000825809,0.00131394,0.000117705,0.00081693,0.000849976,-0.00080337,-0.00113557,0.000226596,0.00183379,-0.00139758,-0.000874509,0.00144538,-0.00149572,0.00145758,0.000482298,0.00166777,0.000549851,-0.00042287,-0.000863371,0.00032533,-0.00150526,0.000608382,-0.000414686,0.000589512,0.00147093,0.000110081,-0.00175336,-0.000222567,-0.000546778,0.00107117,-0.00131266,-0.00171286,0.00000246323,0.000440157,0.000507564,-0.000230983,0.00035509,0.00142293,0.00050732,0.000435498,-0.000220341,0.000610691,-0.000909894,0.000262796,-0.000807597,0.0016871,-0.000465898,-0.00155604,-0.000556522,-0.000449497,0.000217235,-0.000452525,-0.000459539,-0.00151525,-0.000414148,-0.000217448,-0.000336082,0.000263858,-0.00000776613,0.000154556,-0.000633373,-0.000640243,0.00018752,-0.000965933,0.00156754,0.000565166,0.000145232,0.0000963052,-0.000753201,-0.000384688,-0.000421518,-0.000937035,0.000964001,-0.0010023,0.000605706,-0.000990064,-0.000856405,-0.000287689,-0.000727409,0.000885385,-0.000673938,0.0000650234,0.000421309,-0.0016496,-0.000249228,0.000442841,0.000133077,0.000763025,0.0000476686,0.000403729,-0.0012793,-0.000920974,0.00111856,0.00110762,0.00027887,0.000905238,-0.0000447231,0.000666953,0.00179829,-0.00115423,-0.000224531,0.00052044,0.00108055,0.00151637,0.000382174,-0.00041385,0.000347986,-0.0000239178,0.000230887,-0.000564135,0.00104121,-0.000849515,-0.00174914,0.00143284,0.000658141,0.000940764,0.000804477,0.000162055,-0.000503624,-0.000213089,-0.00053873,-0.00092745,0.000165023,-0.000362744,0.000755523,0.0000353056,-0.000879294,0.000247307,-0.000927713,0.000768445,0.0000870618,0.00181782,-0.000290039,0.00142352,0.000538156,-0.000732909,-0.000465884,-0.000169626,0.00148895,0.000576299,-0.000230637,-0.000964344,-0.000495885,0.000348622,0.000476708,0.0011967,-0.000860085,-0.000282544,0.000944767,0.00190149,0.000945153,0.00120346,-0.000418426,0.000141172,-0.0012412,-0.001278,-0.000386179,0.000826595,-0.000821401,-0.000874864,-0.000429585,0.000701666,-0.000338675,0.000422377,0.000391131,-0.000790654,-0.00139702,0.000644025,-0.000233158,0.000856395,-0.000171175,0.000733242,0.000196101,-0.000899756,-0.000247412,0.000330498,-0.000512303,0.000141853,-0.000520636,0.00119233,0.00077719,0.000629317,-0.000255442,0.000251705,-0.000105062,0.000722827,0.00083672,0.000427587,-0.000101833,-0.000192739,0.00149936,-0.00141718,0.000746685,0.00132599,-0.000102218,0.00057621,0.00146625,0.0000741666,0.000984138,0.00118468,0.000632384,-0.000108176,0.000486019,0.000518427,0.00074403,-0.000678334,-0.00128576,0.000980442,0.000889628,0.000707731,-0.0000133301,0.000542935,0.0000923745,0.000679902,0.000552496,0.000288237,-0.000419597,0.000245521,-0.00175478,-0.000298599,0.00165884,0.000626482,-0.000574777,0.000151908,-0.000108734,-0.000156168,0.000193404,0.000740401,0.000257526,0.0010588,0.0000414097,-0.000358953,-0.000916902,0.0001535,0.00021187,-0.000549603,-0.0000414656,0.000443221,-0.000608212,-0.000218711,-0.000307293,0.000572199,0.00018757,-0.00170147,0.000570834,0.000339171,0.00115649,0.00192832,-0.00199723,-0.0011751,-0.000965784,-0.00164018,0.000470572,0.00118195,0.000211104,-0.00182746,-0.00115334,0.00104367,0.000845695,-0.000996515,0.00103567,0.00071671,-0.00152342,0.00147343,-0.00108381,0.00139792,0.000866795,0.000736871,-0.000209478,0.000211396,0.00116242,0.000904698,-0.00124712,-0.00186008,-0.000228569,0.000750715,0.000665599,0.00156803,0.000417939,-0.0000177459,-0.000959715,0.000694107,0.000838621,-0.00000609,-0.000312728,0.00011068,0.000417764,0.000874312,-0.000444313,0.000695947,-0.000164636,0.00150855,-0.00093683,-0.000641713,-0.000537521,0.000750095,0.00110278,-0.0015466,-0.000163919,-0.0000462897,0.000968469,-0.0000877652,0.00116776,0.0000878424,0.000731678,-0.0000152432,-0.0000818802,-0.00065999,-0.000876649,-0.000681841,-0.0000353602,-0.00068574,0.000346784,-0.00134972,0.000555185,0.00153417,-0.000474267,0.0000294386,-0.000588706,0.000840098,-0.000332908,0.00150385,0.000756475,-0.000983008,-0.000798775,0.000121652,0.000339013,0.00102242,-0.000682776,0.000741523,0.00132859,-0.000392416,-0.000909572,-0.00199584,0.00100782,-0.00019463,0.00141363,0.00083462,0.000428612,0.000697083,0.00166333,-0.00046698,0.00105174,0.00099161,-0.000390383,-0.00082798,0.000863824,-0.000610228,0.000698906,0.00109181,0.000732576,-0.000366264,-0.0000595178,-0.00119567,0.00106503,0.00193891,-0.000529072,0.000131873,-0.000800226,0.000093765,-0.000631302,0.000426567,-0.00116813,0.000522675,0.000641719,-0.000112759,0.000592875,0.000675448,0.000148515,0.00183021,-0.000368743,-0.000329136,0.00169794,-0.000586713,-0.00064817,0.00100347,0.000317718,0.00100287,-0.000646726,0.000129036,0.000223137,0.0011916,0.00019562,-0.000229018,-0.000973244,0.000155389,-0.00097065,-0.000434965,0.000195992,-0.000935231,0.000380378,-0.000600374,-0.000945666,-0.000453257,-0.000423424,0.00151131,-0.000903415,-0.000746656,-0.000687205,-0.000867532,-0.000317833,-0.000712091,-0.000303948,0.000053543,-0.000830091,0.000560566,-0.000424266,0.0000496347,0.00140514,0.0005742,-0.0015889,0.000101225,-0.00134297,-0.000168372,-0.00136162,0.000660765,0.00106317,0.00110506,-0.000782461,-0.0000916868,-0.000436002,-0.00017719,0.000379612,-0.000530269,0.00042388,0.00100164,-0.00128668,-0.000016056,-0.000863901,-0.000554707,0.000203787,-0.000512697,-0.00170679,-0.000222476,0.000373217,0.0000275414,0.000200525,-0.000310207,-0.000638462,0.0000688361,-0.000203569,0.00114853,0.0011418,0.00109192,-0.000187628,0.000260428,-0.000549893,0.00121375,0.000590483,0.0000625683,-0.000319531,-0.00182601,0.000100933,0.00103137,0.000256456,-0.000640889,-0.00161348,-0.00087848,0.000707222,-0.0010814,-0.000478225,-0.00145157,-0.000463047,-0.000665419,-0.000815012,-0.00104658,0.0000297576,-0.000428029,-0.000264321,-0.0000395007,0.00147838,-0.000308638,-0.000610696,0.000241693,-0.000288694,-0.00057452,-0.000824705,0.000477662,0.0000749256,0.00029686,-0.0000739789,-0.0000689485,-0.000294446,0.000613665,-0.000173274,0.000277825,0.0000376381,0.00151168,0.00141122,-0.000751368,0.000774617,0.00041537,-0.000606679,0.000417307,0.000461243,-0.000127195,-0.00111202,0.000521803,-0.000753285,0.000494087,0.000471155,0.00107486,-0.00171859,-0.000117226,-0.00142154,-0.000630562,0.000781139,0.000678952,-0.000100232,-0.00140199,-0.000638001,-0.00116742,-0.000693495,-0.000381948,-0.00111743,-0.0000771352,0.0000362823,-0.0000795965,0.000254358,-0.000328029,0.00000274712,-0.00137295,0.00183233,-0.000226269,0.00105289,0.00108036,-0.0000962895,-0.000280689,-0.00182594,-0.000203682,0.000730434,0.0000756088,0.00157865,0.00146009,-0.0013071,-0.000717575,-0.00098059,-0.00165684,-0.000431901,-0.000980172,0.00143928,0.00000763392,0.000828367,-0.0000173141,0.00028086,0.000455864,0.0000917104,-0.0011159,-0.00000748758,-0.000414445,0.0000582903,0.00130849,-0.00185353,-0.000901912,0.000117553,-0.00105308,0.000500234,-0.00144465,-0.000857416,-0.000499988,0.00103761,-0.000101861,0.00114236,0.0013175,-0.000290669,0.000123575,-0.00161306,-0.00141166,0.00166043,0.000268314,-0.00111902,-0.000978697,0.000319887,0.00149886,-0.000218822,-0.000338297,0.000139285,0.00070739,0.000914872,-0.000343848,-0.00127462,-0.000391087,0.000960553,-0.000218095,0.00109321,-0.000933133,-0.0004746,-0.00030828,-0.000973161,0.00000889644,-0.00028741,-0.000323821,-0.000391978,-0.000258875,0.00129943,0.000666686,-0.00156158,-0.00109122,0.0000272371,-0.000589584,0.000591557,-0.000325849,0.000273128,0.000785821,-0.00142901,0.00125421,0.000933695,-0.0000639318,-0.000490453,-0.00029538,0.000110122,-0.000372238,0.00027076,0.00081412,-0.000109122,-0.000438868,0.000659009,-0.00108442,0.000889285,-0.00105473,-0.00166427,-0.00000365067,0.000244164,0.00146239,0.00174015,0.000523376,0.000442955,-0.000262557,-0.000106993,0.00115654,-0.00109358,0.000944057,0.000651354,0.00185946,0.000222886,-0.0018623,0.000100536,0.00196128,0.000971039,0.00143429,-0.000699093,0.00119904,-0.000755935,0.000109677,-0.000292419,0.000722805,-0.0000474021,0.0000704212,-0.00102593,-0.000818389,0.000601149,0.000494765,-0.000114624,-0.000842521,0.000599654,0.000926353,0.0004429,-0.00117026,0.00103829,0.000893692,0.000506463,-0.0017361,0.00071916,-0.000055107,-0.000266695,0.000686698,-0.00126922,-0.00012408,0.001447,0.0000229412,-0.000113235,-0.000814027,-0.000879549,-0.000555868,-0.000555451,0.000483118,-0.00133583,0.00069494,-0.000650568,0.000102778,-0.00180131,-0.000366943,-0.00029145,-0.000279954,-0.0011372,0.000538674,-0.000230185,-0.00105642,-0.000304288,0.0000294067,0.000884452,0.000359548,-0.0000914939,-0.0013411,-0.00012603,-0.0000574054,0.000107448,0.00177423,0.00119582,-0.000668661,-0.000255116,-0.000595878,-0.000051376,-0.000533215,-0.00026512,0.00108736,0.00109208,0.000545731,-0.00134955,-0.000294194,0.00183489,0.00111742,0.0011678,-0.0000128256,-0.00156282,0.000079767,-0.000540778,-0.000415636,-0.00034539,-0.000747182,0.0011184,-0.000132788,0.000451366,-0.000131463,-0.00105874,-0.000295025,0.00182896,-0.000099136,-0.00126156,-0.00180812,0.000233632,0.0000579223,0.00136741,-0.000195327,0.000306431,0.00062124,0.000800135,-0.000320872,0.000875261,-0.000910602,0.00132466,-0.0000334653,-0.000255081,0.000326776,0.00027831,-0.00157868,-0.000259412,-0.000894796,-0.00118365,-0.000160683,-0.000539599,-0.000926157,0.00173889,-0.000160093,-0.000487655,0.00162782,-0.00110354,-0.000114176,0.000282645,-0.0013823,-0.000800145,-0.00070469,-0.000473944,0.00157444,0.000949037,0.000118897,-0.000416602,-0.00140975,-0.000877146,0.000983206,-0.000980535,0.000669326,-0.000326233,0.000299015,0.0000260693,-0.000633155,-0.000323283,-0.00108238,0.00108627,0.000731169,-0.00150689,-0.000491389,-0.0014491,0.000467435,-0.000141346,-0.0010727,-0.000142649,-0.000849304,-0.000399865,-0.00195019,0.00101938,-0.000441476,-0.00107944,-0.000625822,0.000174013,0.00150679,0.00163308,0.0000617553,-0.000320154,0.000853329,-0.00101271,-0.000139274,0.00073256,-0.00117359,-0.000628236,-0.000546835,-0.000215352,0.000214334,0.000253091,-0.00147721,0.0000131799,0.000618219,-0.00112377,-0.00135912,-0.000307403,0.000649234,0.000737057,-0.00142846,-0.00112853,-0.000602808,-0.000746405,0.0017537,-0.000854919,0.00129717,0.00147239,0.000413265,0.000353491,0.00122428,-0.000317446,-0.000657395,-0.000978758,0.00157067,0.00161508,-0.00104853,0.000231616,0.00112161,0.00123876,0.000145325,0.000882283,0.000580278,0.000518019,0.000435312,-0.00143729,0.000121173,0.000132341,-0.0000594037,-0.0000672649,-0.000277291,-0.00197148,-0.00157256,0.000759607,0.000142949,0.0000607945,0.00155832,-0.000217066,0.000922578,0.000320041,0.0000711272,-0.000351442,-0.000379533,0.00161024,-0.000346819,-0.000225162,0.000254018,-0.00103542,-0.000134259,-0.00164171,0.00167768,0.000353347,0.0000561177,-0.000197893,-0.0000265131,0.00112281,0.000387856,-0.000835214,0.00114771,0.00140718,-0.0000788177,-0.00103591,-0.000854061,0.0000910989,-0.000355188,-0.000156486,-0.0000392679,0.00049228,-0.00116127,0.00041041,0.000148403,-0.000423197,0.000596555,0.000258906,0.00095003,-0.000675242,0.000926169,0.000581134,0.0000943845,0.00012841,0.00106825,0.000904235,0.000131016,0.00103887,0.00108722,0.000734396,-0.00132897,-0.00059937,-0.000899434,-0.000291074,-0.000515179,-0.000404689,-0.000991828,0.000436179,0.00109117,0.000649473,-0.00127639,-0.000596652,0.00066498,0.000675603,0.000421042,-0.000711912,0.0010617,0.00059132,0.000541155,-0.0000228522,-0.00026801,0.000274536,0.0000646672,-0.00114436,0.00144211,-0.0000431903,-0.000431332,-0.0013167,0.00102408,-0.00103933,-0.00159237,0.000880251,-0.00145745,0.00102473,-0.000250181,-0.000411472,0.00120608,0.000335234,-0.000269339,0.0000930055,0.00139806,0.000031326,-0.000518876,-0.00000936531,-0.000170473,-0.000154492,0.00182138,-0.00108068,0.00134443,0.000268713,0.00105188,0.000397885,0.00031402,0.000217221,0.000319152,0.000391825,0.00112518,-0.00111818,0.000693246,0.000811613,-0.00162633,-0.00129296,-0.00096868,-0.000110939,0.000212723,0.00151244,-0.00038073,0.00132559,0.000451213,-0.00103039,-0.00114783,0.000562067,-0.0000290008,-0.000381116,0.000287766,0.0000471544,-0.000124729,-0.000379033,-0.000998603,-0.000747696,0.00058541,0.00174897,0.00137744,0.000158092,0.0000417728,0.00126515,0.00109794,0.00051523,0.000274527,0.000116462,-0.000340477,-0.000982705,-0.0000587411,-0.00131163,0.000683597,-0.00153558,-0.000106913,-0.00142452,0.000930913,0.00179315,-0.00016395,0.000201751,0.0009328,0.00129637,-0.000321124,-0.000991492,0.00109253,-0.000211482,0.0000588909,-0.00139231,0.000340837,-0.00182856,-0.000325388,-0.000333251,0.00101659,-0.00166593,0.00041048,-0.000043215,-0.000872061,0.0000592995,-0.000266572,0.00002139,0.000215485,0.000690469,0.000820627,-0.00169857,-0.0001305,0.000601549,-0.00003187,-0.000988778,0.000086243,0.00113939,-0.000480621,0.0000816581,-0.00104133,0.00157657,-0.000479878,0.000515465,-0.00146948,0.000261583,-0.000423702,-0.000957404,-0.00123225,0.00144395,-0.000353246,0.000695201,-0.000387329,0.000468764,-0.00113137,-0.000381609,-0.00147452,0.00127177,0.000289822,0.000217424,0.00167444,-0.000640932,-0.00105845,0.0000982249,0.000969337,0.000138007,0.00139715,-0.000466377,-0.000926614,0.000673432,0.000875061,0.000652144,0.000340191,-0.000294368,0.000228234,0.00146083,0.00125209,-0.000658039,0.000513351,0.000329692,-0.000136052,-0.000330727,-0.000652885,0.000218961,-0.00137445,-0.00159731,0.0000321516,-0.00139759,0.00193184,-0.00103586,-0.0010337,0.00164633,0.00146258,0.000481941,-0.000033557,0.000692905,0.000203655,0.000714761,-0.0019163,0.00108421,0.000286219,0.000857411,-0.00187005,0.0000717431,-0.00109023,0.000648728,0.00141473,-0.000051973,-0.000474288,0.000282212,-0.000469585,0.00186312,-0.000172792,-0.000606728,-0.00121378,0.000132215,0.00065096,-0.000847675,-0.0013015,-0.00137881,0.000214583,-0.00092295,0.0002378,-0.0000363028,0.00111366,-0.00166821,0.0014585,0.000371432,0.0000805575,-0.00188835,-0.0000921919,-0.00186443,0.00108631,0.000359685,0.00168788,-0.000191211,-0.00182441,0.00177666,0.000241357,0.000100658,0.000380076,0.00122793,0.00130513,-0.001396,0.000725865,0.000553059,0.000737719,0.000964056,-0.00137737,-0.0000439494,-0.000530646,-0.00139881,0.0000220961,0.000403548,-0.000909066,-0.000964772,0.000290118,-0.00130434,0.000193102,-0.000706743,-0.000623227,-0.000894886,-0.000639294,-0.000937564,0.00132213,0.000656352,-0.000544667,-0.000697487,0.000356257,0.000162428,0.000459306,-0.000319427,0.00102601,0.000854599,0.000798894,-0.00131556,0.000586178,-0.00138066,0.000710731,0.000935783,-0.000263392,-0.000755257,0.000103879,0.000575146,-0.000149149,0.000384617,0.00146624,-0.0004249,0.0017981,-0.000466283,-0.00103476,-0.000408533,0.00028128,0.000957168,0.0000998357,0.000505402,-0.00143096,0.000291084,0.00111055,-0.000985197,-0.00108193,0.000216657,0.000386013,0.000433058,0.000770129,0.000282728,0.000578998,0.000571448,-0.00197163,0.000159436,0.000160097,0.00136427,0.000152942,-0.00125075,-0.000622275,-0.000892226,0.00119038,0.00119,0.00124722,-0.00110394,-0.000393161,0.0011282,-0.00105664,-0.00177141,0.00147715,-0.00070245,-0.00111638,-0.000317595,0.000378714,0.00162936,-0.00180444,-0.00124261,-0.00180081,0.000230857,0.000823623,0.000979635,-0.00136703,-0.000083065,-0.00129139,0.000573067,-0.000778924,-0.000758528,-0.0010311,-0.000486842,-0.000984181,-0.000494133,-0.00185972,0.000679588,0.00135346,-0.000770978,-0.000694083,0.00116402,0.000132002,-0.000326611,0.00130374,-0.000721903,0.000119915,-0.000879996,-0.00115003,-0.000606554,-0.0018344,-0.000407404,-0.00118985,0.000803013,-0.00115634,0.000495375,0.000191246,0.0000609751,-0.000150434,-0.000122841,0.000172531,-0.000327641,-0.000962881,-0.000972118,-0.000250739,-0.00114977,0.000741262,0.00119321,-0.000706568,-0.00142442,-0.000825062,-0.00109072,0.00028942,-0.000119694,-0.000194066,-0.00131661,0.00142449,-0.00107848,-0.000643522,-0.000198442,-0.000219711,0.0019117,-0.000873618,0.000728855,-0.000107768,-0.000604643,0.000712798,0.000693935,0.000861342,0.00124009,-0.00103855,0.00000782893,0.000302409,0.000665148,0.000767165,0.00126371,-0.00135457,-0.000767018,-0.000806647,-0.000549395,0.000991969,-0.000202379,-0.000566029,0.0000658663,0.00183819,-0.000417962,0.000828733,0.000869981,-0.000526529,0.00149047,0.000163879,0.000190123,-0.00139959,-0.000311541,0.00123678,0.000307321,0.00112152,-0.000302093,0.000587892,-0.00000371897,0.000862943,-0.0000711889,-0.000226542,0.0000331807,0.00114292,-0.000485904,0.00114978,0.000897052,-0.000809602,-0.00061206,0.00145053,-0.000467893,0.000877707,-0.000368292,-0.000413797,0.00120085,0.000221593,-0.000869052,-0.000424285,-0.00092237,-0.000237796,-0.000978612,0.00160006,0.000471077,-0.0000308318,0.000505909,-0.000897031,0.000290801,0.0000635167,-0.00150961,0.000388527,0.000803286,0.00111209,-0.00151419,0.000199164,-0.0000679943,0.000575843,0.000984826,0.000479412,-0.00098224,0.00173436,-0.00116467,0.000662637,0.00145545,0.000199992,-0.00037325,0.000272332,-0.000324078,0.00124769,0.00196693,-0.00188051,0.000456086,-0.000428403,-0.00129869,-0.00114232,-0.00141778,-0.000861931,0.00041812,-0.00103583,-0.000528493,-0.000652534,-0.00128292,0.000447781,0.00115345,-0.000398639,0.000397816,-0.0012897,-0.000795146,0.000180023,0.00130515,0.00113699,-0.00061655,-0.00142289,0.000656952,-0.000810233,0.000311547,0.00105979,-0.000238549,-0.000493912,0.000757381,-0.000408976,-0.000602765,0.00113325,0.00108816,-0.00111423,-0.000637355,0.00131909,-0.000733984,-0.000488793,0.00126577,-0.00124319,-0.000990515,0.00000617651,0.000525757,-0.00190766,-0.000754114,-0.0000524979,0.00017625,-0.000551092,-0.00146833,-0.0000718809,-0.000263356,0.000611511,-0.000388363,-0.000266872,0.000987739,-0.000377574,0.00181435,-0.00179366,-0.000746865,0.000185513,0.00104376,-0.000344725,0.000713505,0.000847415,0.000533589,-0.000549606,-0.000141986,-0.00137147,0.0000407045,0.000529374,0.000260619,-0.000552112,-0.000407358,-0.00097249,-0.00132424,-0.0000627816,0.00109929,-0.00162266,-0.000260773,0.00118992,0.000391117,-0.000942949,-0.000294529,0.000243882,0.00137379,-0.00032161,0.0000180226,0.000795443,-0.000765546,0.00123709,0.00129615,0.000718493,0.000834613,-0.000415844,0.00177189,0.000726701,-0.00143293,-0.00107637,-0.000820753,-0.000664485,-0.000710304,0.000723599,-0.00000137943,0.000022331,-0.000520406,0.000303287,0.000874979,-0.000767878,0.000157059,0.000313744,0.0008448,-0.000635515,0.000120297,0.000261191,-0.000649107,0.000144759,-0.000723828,0.000469911,-0.000156782,-0.000354168,-0.000317356,-0.00155487,-0.000333686,0.000662249,0.00069035,0.000435624,0.00118627,-0.00092607,-0.000765435,0.000142714,0.000285821,0.00030314,-0.000164539,-0.0014108,0.00068051,0.000977608,0.000107585,0.000761527,0.0000523822,-0.000282348,0.000440835,0.000995704,-0.000579311,-0.000324583,-0.000152318,0.0015708,-0.000236045,-0.000519508,0.00110247,-0.00072908,-0.000722978,-0.00140516,0.00162403,-0.0000248734,0.0000783174,0.00125788,-0.000359995,0.000805544,-0.0000913352,-0.000982515,-0.000154503,0.00186921,0.000581467,0.000020889,0.000923707,-0.00105868,0.000274279,-0.000676623,0.00131442,0.000179418,0.000160368,0.00116071,-0.0000258742,0.00117004,0.0015503,-0.000202135,-0.000641569,0.0013048,0.000342877,-0.000712418,-0.0000518171,0.00127819,0.000331183,-0.000557148,0.000580271,-0.000621586,-0.0000219905,0.000185807,0.0007732,-0.000304196,0.000122438,-0.00184603,0.000706093,-0.000954492,-0.0000280965,0.00033617,-0.00100923,-0.00036208,0.0000438265,0.000898261,-0.000555948,-0.000415568,0.000565932,0.00165615,0.0000268153,0.00103853,0.000721612,-0.0000985414,0.0000820652,-0.0000271042,0.00155442,0.001527,-0.00147615,-0.00102644,-0.00189133,0.000148359,0.000293552,0.000448178,0.000835293,-0.000394687,-0.00189981,-0.00144234,0.000428701,-0.00132677,0.000428415,0.000601031,-0.000540341,0.00034964,-0.00129516,-0.0000386046,-0.000363127,0.000549763,0.00133723,-0.000578149,0.00151106,-0.000518875,-0.000929632,-0.000519006,-0.000373024,0.000546367,-0.000855732,-0.00103866,-0.00025162,0.00163321,0.0019098,-0.000174982,0.000478672,0.000117554,-0.000533131,-0.00119463,0.000220387,0.0000669089,0.000673322,0.00159327,-0.000164154,-0.0000948099,-0.000655127,-0.000158196,-0.0000395409,0.000747544,0.000788543,-0.000822938,0.000458778,-0.00168971,0.000115166,0.000294724,-0.000492064,-0.000764305,-0.000251088,0.00073195,0.000115959,0.000619882,0.00147191,0.00192435,0.000702978,-0.000529503,0.000112687,0.00166109,-0.000337337,0.00195894,0.000628173,0.00023494,0.000401437,0.0011267,-0.000103144,-0.00130645,-0.000319391,0.00145203,-0.000977425,0.0000345898,0.000983153,-0.0000468746,-0.000631586,0.00117661,-0.00143916,-0.00124675,-0.00198322,0.00122876,0.00096585,0.00032468,0.000275934,0.000339496,-0.000210531,0.0000568874,-0.00180567,-0.00132589,0.0005949,0.00181677,0.000902797,0.000501442,0.000217374,-0.000059147,0.00096659,0.00111121,-0.000307401,-0.00078498,-0.00138756,0.000595888,-0.000789657,-0.000301292,-0.000712625,0.000683773,0.000498473,0.000235584,-0.000391243,-0.0000765276,0.000743948,0.000905413,-0.00126363,0.0000602608,-0.000641069,0.000344845,-0.00110158,0.000230677,-0.000813426,0.000243222,0.000235899,-0.000181154,0.000585779,0.000574372,-0.000175342,0.000892278,-0.000536847,0.000379865,-0.000593059,-0.000965165,-0.000283518,-0.000196479,-0.000382611,-0.00160422,0.00000193535,0.000465244,-0.00034221,-0.000585603,0.00127605,0.000169882,-0.000423875,-0.000256103,0.000943396,0.0000660302,-0.000193289,-0.00121991,0.00127934,-0.00115551,0.00024653,0.00122711,-0.00109822,-0.000635012,0.00102183,-0.00016627,-0.00053594,0.00144852,-0.000699413,0.00129238,0.000689547,-0.00180303,-0.00150663,0.00128336,-0.00135174,0.000704158,0.000813718,0.000638605,-0.000297498,0.000847428,-0.000554406,0.0000953092,-0.00136071,-0.000113181,-0.000035199,0.0012428,0.00124456,-0.000948423,-0.00139469,0.000175379,0.000519019,0.00162163,-0.0000599734,-0.000358118,-0.000387417,-0.00110226,-0.000985785,0.000549287,-0.000737177,0.000117743,0.000717154,-0.00157101,-0.000263545,-0.00177069,0.000230439,0.000114158,0.000549756,-0.0000408498,0.000745921,0.00127681,0.000141714,-0.0000794039,0.000155166,-0.000380407,-0.00115587,-0.000726743,-0.000617766,-0.0000964048,-0.00067224,0.00052826,0.00120131,-0.000955732,-0.00074396,-0.00159381,-0.00073139,0.0013403,0.00154135,0.000825191,0.000593233,-0.000668959,-0.000944731,-0.00161634,0.000481018,-0.00129059,-0.0000356158,0.00151094,-0.000877565,0.000113688,0.000440646,0.000621926,-0.000565662,0.000634736,0.000704767,0.00103791,-0.000343157,-0.000807154,0.00026478,0.000865677,0.000817583,-0.00151723,-0.000043388,-0.000777438,-0.0000984766,0.000115324,-0.00109225,0.000880792,0.00149158,0.00066587,0.000340773,0.00034649,-0.000370267,-0.000617668,0.00062403,-0.0000233033,-0.000697297,-0.000525954,-0.00000796512,-0.00154927,-0.000848771,0.00102735,0.000328789,-0.0000262097,0.000294053,-0.00133519,-0.000170996,-0.000185207,-0.000589278,-0.0000144157,-0.00019813,-0.000179243,0.000469615,-0.000189812,-0.0011035,0.000435507,-0.00148716,0.000436113,-0.000706272,-0.000630334,0.0000313331,0.000291297,0.000242017,-0.000211822,-0.00193828,-0.000825173,0.0000593127,-0.0004331,0.00176437,-0.00131747,-0.00133123,0.000138315,-0.0000505759,-0.00000371882,0.000498927,0.00102401,0.000144363,0.00111969,-0.000953693,-0.00034442,0.000369212,-0.001548,0.0000210534,-0.00137544,-0.000222995,0.000485851,-0.000738832,-0.000483132,0.000464123,0.00147634,-0.00116761,0.000078575,-0.00126224,0.000243692,0.000828838,0.000104182,-0.00128294,0.000897984,-0.000823593,0.00152253,0.0000927536,0.000911312,-0.000442209,-0.000217022,-0.0010674,0.0000367874,0.000211206,0.000317422,-0.000596599,0.000376284,-0.00116642,0.000693285,0.0013202,-0.000323476,-0.000907112,-0.00105138,0.000461194,-0.000784645,-0.00188641,-0.000293805,-0.00032511,0.0000493529,-0.00073099,-0.000637533,-0.000815874,-0.00142612,0.000600806,0.00146641,0.000145022,-0.000606631,0.0004319,0.00136909,0.001558,0.000878838,-0.000895452,0.000676561,0.000019486,-0.000208775,0.000364871,0.00194504,0.000207856,-0.000544298,0.0000121247,0.000930453,0.000871615,0.000239238,0.000648824,0.00136978,-0.000537043,0.000237104,-0.00100429,-0.000439204,0.000243563,-0.000244987,-0.000332935,0.000355422,0.000987612,-0.0011997,-0.00126781,0.000681987,0.000539835,0.000903086,-0.000689082,0.000148958,-0.000399744,-0.00030855,-0.00140725,0.000375639,-0.00112386,-0.00176054,-0.000362517,0.00006176,-0.00130321,0.000917462,0.00110309,-0.0000785817,0.000158715,0.000255819,0.000200316,0.000184556,-0.000490586,0.000315159,0.000560947,0.00196398,-0.0000407039,0.000620323,-0.000323192,0.000504226,0.000157924,-0.000547211,-0.000573201,0.000159083,0.00180196,-0.00104152,0.000259635,-0.000291398,0.000101246,-0.000132153,-0.0000217596,-0.00132563,-0.00057118,-0.00048311,-0.00120082,-0.0000210233,-0.000589208,-0.00120908,-0.00161409,-0.00030837,0.000450945,-0.000157229,-0.000292507,-0.000422712,-0.00106514,-0.00097724,-0.000226153,0.000392154,0.000791583,0.000180654,-0.000843089,-0.000810598,-0.000939613,-0.000230822,0.000439049,0.00175152,-0.000138792,0.000915985,-0.00133386,0.0000306653,-0.000511187,0.000445595,-0.00136637,-0.000809797,0.000848228,0.0000578965,-0.00105622,-0.000284286,-0.000227573,0.000440756,0.000124799,-0.000624536,-0.0007808,-0.0000342053,0.00177879,0.000575996,0.000994555,0.000425356,0.000496361,0.000908213,-0.000962018,0.000282449,-0.00179947,0.000415398,-0.000730946,0.0000840116,-0.000687534,0.000916453,-0.000401876,0.000985043,-0.00142229,-0.0000819256,0.00122297,-0.00071933,-0.000149462,0.00173477,-0.000951934,-0.000465903,0.00117684,-0.000615832,-0.000123394,0.00126219,0.000245152,0.00110546,-0.00111919,-0.000393184,-0.000524488,0.00106212,0.000701622,-0.000361469,-0.00152133,-0.000470576,0.000539089,-0.000355342,0.000765517,-0.000603749,0.000381801,-0.000459921,-0.00142853,0.0012607,0.000991536,0.000316165,-0.00102348,0.0000182907,0.0013134,0.00157265,-0.00110883,0.0000025099,-0.000491759,-0.00168792,-0.00165965,-0.00192104,-0.000907407,-0.000226571,0.000268134,-0.0001408,0.00133957,-0.00117323,0.0000510049,-0.000571717,-0.000852672,0.0000850007,-0.000177047,0.00139523,-0.00116124,0.000967101,-0.00138031,-0.000653229,0.000331158,0.00140086,-0.00175761,-0.00152788,-0.000926845,-0.000301842,0.000731401,0.00121892,-0.00116154,0.000375729,0.0000173693,0.000958299,-0.000459605,-0.00101153,-0.00127821,0.00069653,0.0013635,-0.000264963,-0.00130835,0.00169313,-0.0000190584,0.00151181,-0.000837412,0.000154108,0.000670344,0.000640271,-0.000471441,-0.00124671,0.00104213,0.000311487,0.00157463,-0.00148929,-0.000447387,-0.000176857,0.00164732,-0.000777159,-0.000604311,-0.000545062,0.0000702528,-0.0014713,-0.00136693,-0.00135387,0.000912967,-0.000221907,0.00105383,0.000431993,-0.000850394,0.00000410705,-0.00119835,0.00129852,-0.000703924,-0.00054643,-0.00123399,0.000740143,0.000749096,0.0000447541,0.0000451707,-0.0015711,0.00000461427,-0.000315969,0.00050843,-0.00139164,-0.000377633,0.000213272,0.000899525,-0.000134789,0.00157321,0.000517488,-0.000931094,0.00017325,0.00177861,0.000480221,0.00123174,0.0009217,0.000777036,0.000554,0.000368198,-0.00191293,0.000265563,0.0011569,-0.000312051,-0.000231018,-0.00115171,0.000589754,0.00124116,0.000634918,-0.000319423,0.00109127,-0.000029953,-0.000465953,-0.000784489,-0.000134251,0.00145896,0.000189561,-0.000636285,-0.000336976,-0.00132227,-0.000246316,-0.000944154,0.00115361,-0.0000488349,0.000661147,-0.000602233,0.00100458,-0.000935989,-0.000991644,0.000770074,-0.00000153991,-0.00134116,0.000753173,0.000667449,-0.000277731,-0.000410443,0.0000517257,-0.000433074,-0.000021094,0.000170045,-0.00018108,-0.00176254,-0.000711191,-0.000102276,0.000565756,-0.00194005,0.0000925055,-0.00148231,0.00137595,-0.00108657,0.000800805,0.00034087,0.00134628,-0.00136538,-0.00108507,-0.00102704,-0.000833968,-0.000400275,0.000478345,-0.000505955,0.000559654,-0.000341551,0.000306429,0.000509794,-0.000509525,0.000541517,-0.000629014,0.000582888,-0.000255818,0.00109658,-0.00100176,0.000569695,-0.000822575,-0.00135019,-0.000182453,0.00100847,-0.000631548,0.000295518,0.000462453,-0.00159886,0.000297433,-0.000722315,0.00080609,0.0008478,0.00145831,-0.00124925,-0.00103401,-0.00100848,0.00128163,0.0000482665,-0.000573305,0.00104247,-0.00177492,-0.00175023,-0.0014438,-0.00136755,-0.00177451,-0.000542333,-0.000522744,-0.00111108,0.00123428,0.00190827,-0.000533903,0.00139931,0.000477185,-0.000341363,-0.00101962,0.000725321,0.000344332,-0.000914684,0.000638169,0.0012687,0.000235998,-0.000350388,0.0000202021,-0.000256384,0.000561023,0.00103832,-0.000118421,0.000242335,0.00158728,0.000664799,-0.000795173,0.000934902,0.000906765,0.000984353,0.000406647,0.000423727,0.00165617,-0.00061877,-0.00166996,-0.000344656,-0.000905839,0.00154156,0.000454211,-0.0000121129,0.000312508,-0.000192653,-0.000766526,0.000143884,0.000833615,0.000479713,-0.00158418,-0.000671552,0.000323127,0.000118932,0.000424284,0.000945198,-0.000526289,0.000272698,0.000388865,-0.00167086,0.00168912,-0.000846544,0.00105723,-0.000402521,-0.000377132,-0.000931692,0.000429357,0.00188436,0.000182466,0.00187693,-0.000576073,0.000518648,-0.000625906,-0.00118221,-0.000311846,0.0000842099,0.0000749578,0.000503536,-0.00131957,0.001757,0.000584443,-0.00199042,0.000676391,-0.00120482,0.0000776998,0.000235415,0.0000148911,-0.000963329,0.00015904,0.000813761,0.000159614,0.000738882,-0.00182375,-0.00195858,0.000532456,-0.000799291,0.000588445,0.00022849,0.00182088,0.000352791,0.000746591,0.000299158,-0.00009754,0.00124554,-0.00063915,-0.000336967,-0.000791247,-0.00144046,0.000552085,0.0000254738,-0.00149901,0.00105077,-0.000468758,0.00142384,0.00056499,-0.0005598,-0.000574885,-0.00152291,-0.0014867,0.000505181,-0.000740589,0.001437,0.000490568,-0.000377456,0.000219058,0.000232134,0.000136811,-0.00106267,-0.0000516795,0.00035417,-0.000141771,-0.000300172,-0.000205333,0.00138907,0.000386398,0.00184326,-0.00123523,-0.00117761,0.000788198,0.000572441,0.000562167,-0.000522371,-0.000263947,0.000276499,0.00104178,0.00175287,0.000978704,0.000832698,0.000587162,0.00114316,0.000727183,0.000869958,-0.000470417,0.000211158,-0.000519508,-0.0009677,-0.000181626,0.000413833,0.000597707,0.00098227,0.000106018,-0.00119463,-0.00126595,-0.00198254,0.00177309,0.00177187,0.00093741,0.000424072,-0.00180746,-0.000109059,0.000563146,-0.000204088,0.0000452921,-0.0000767109,0.0010412,0.00017006,0.000954717,-0.0000144049,-0.00146844,-0.000543191,-0.00102268,0.000996689,0.000335016,-0.00135836,0.000820846,-0.000281905,0.00121058,0.000299546,0.00153399,-0.00019964,-0.000522148,0.000483927,-0.0000825967,0.000135843,0.000335676,0.000604144,-0.0000649868,-0.000702845,-0.000705247,-0.00117252,-0.000873802,-0.000450694,-0.000226593,0.000213695,-0.000156981,0.000503533,0.000998351,-0.00152479,-0.000271574,0.000491321,0.00113843,-0.00123775,-0.000850298,0.0000252334,0.0000563025,0.000507935,-0.000401229,-0.000677141,-0.000606722,-0.000915591,-0.000148659,0.0000999675,-0.00119665,0.000364116,-0.000949306,0.00199596,-0.00104688,0.000955687,0.000337893,0.00053632,-0.000551833,0.000483738,-0.000719166,0.00119371,-0.00055115,-0.00185049,0.000692318,-0.000252124,-0.000632539,0.000493462,0.000679369,-0.00129408,-0.000223803,-0.000933372,0.000182156,-0.000621965,0.000697546,0.00131751,-0.000677155,0.00191807,0.00113163,-0.000305771,-0.00123905,0.000225098,0.000873983,0.000923888,0.00151946,-0.000540863,0.00141942,0.00141601,-0.000248031,0.000559089,-0.000829759,0.000539671,0.00131248,0.000977431,-0.000490784,-0.0011942,0.00000387624,0.0014502,-0.000350412,0.00157466,-0.000402949,0.000497027,0.000580367,-0.000222721,0.0000139038,0.00156337,-0.0000534384,-0.000868624,0.00036026,0.00042732,0.00103519,0.000259432,0.00132622,-0.0000869656,-0.000256326,0.000325757,-0.00089612,0.00161117,-0.0000143851,-0.000373558,-0.000751495,0.000767057,0.000869094,-0.00000509754,-0.00166699,0.0011443,0.000149965,0.00078256,0.00115956,0.000360544,0.000802726,-0.000287157,-0.000751555,-0.000331491,0.00159423,-0.000996357,0.000504301,0.000838487,-0.000761751,-0.000672875,-0.000135305,0.00146244,0.00119473,0.000056763,-0.000683766,-0.000139796,0.000848836,0.00142903,-0.00120823,-0.000529798,-0.000198007,-0.00130591,0.000315463,-0.00115633,-0.000269101,0.000318885,0.000672052,0.00176464,-0.00190532,0.000832108,-0.000924944,0.000145201,-0.000971219,-0.000538274,0.0000101742,0.0000264181,-0.000704579,-0.00163709,-0.000175673,-0.0000202441,-0.000467392,0.000441241,0.000551438,0.000828501,-0.0000321225,-0.00103919,0.000250756,-0.0000513573,0.000358546,-0.000370881,-0.000401492,0.00176863,0.00100351,0.0012612,-0.0011569,0.00168662,-0.00173128,-0.000354907,0.000249204,-0.0000190067,-0.000265773,-0.00115178,-0.000552151,-0.00085795,-0.00110604,-0.000475664,-0.00144695,0.00197218,-0.000528232,-0.00150595,0.0000275048,0.000811739,-0.000230107,0.000139271,-0.0000461402,0.0000569281,0.000459679,-0.000472931,-0.000712886,0.000185737,-0.000558791,0.0018792,0.00149096,-0.00154007,-0.00150299,-0.00072069,0.000469617,-0.000924297,-0.00127358,-0.0000729841,-0.000101289,0.00050321,-0.000477413,-0.000827325,0.000621254,0.000171609,-0.000219758,0.0000213105,0.00115484,0.000956126,-0.00160244,-0.000853504,-0.00168903,-0.000770417,-0.000640814,0.000588741,-0.0012359,0.00042265,0.000564816,0.00101267,-0.000967017,0.0000858154,-0.000457594,-0.00050109,0.00138909,-0.00171291,-0.000276336,-0.000294699,0.00146046,-0.000137095,0.00145293,0.00070692,0.000450187,0.000431529,-0.000429021,-0.000612502,0.000320478,-0.00153589,-0.000666121,-0.000837544,0.000839799,-0.00067344,0.000444807,0.000461247,-0.0000936531,0.000124899,-0.000109693,-0.00083574,-0.000501311,-0.000170426,-0.000514431,-0.000536729,0.000117929,0.000732338,0.000408865,-0.000073341,-0.000527212,0.00018993,0.000265813,0.000292705,0.0018286,-0.000368359,-0.00018119,0.000103037,-0.0000325062,-0.00124432,0.000208547,-0.00000596399,-0.00103109,-0.00128798,0.00114181,0.000119839,0.00100164,-0.00133912,0.00124796,0.00192633,-0.000495973,-0.00032878,-0.000080213,0.000289776,0.000403087,-0.0000543942,0.000934617,-0.00100213,0.000330856,0.000473295,-0.000576993,0.000635397,-0.000496132,0.00063678,0.00092454,0.0000699745,0.000312364,-0.0000627232,-0.000484025,-0.000370429,0.00170633,-0.0012218,-0.00152079,0.00136105,0.000240395,-0.00053891,-0.0000792129,0.00030977,0.000249106,-0.000223724,-0.000439703,-0.0000184399,-0.000962043,-0.000555571,0.00104207,-0.00086825,0.0010545,0.000768339,-0.000783411,0.00102644,0.000401897,-0.00044936,-0.000504731,0.000711944,-0.000630346,0.00101486,-0.00000752552,-0.000867874,0.000114006,0.00182706,0.000435663,0.00037511,-0.000956238,-0.00113057,-0.0017058,0.000641035,-0.0000762726,0.00113967,0.00125116,0.00050254,-0.000254077,0.000460096,-0.000831247,0.000896919,0.000811563,0.0011469,-0.000895984,0.00115643,-0.0009041,-0.0000942902,-0.000690806,-0.000576328,0.000977714,0.000365233,0.000195953,-0.00063273,0.000919898,-0.000170007,-0.00111665,-0.000387817,-0.00113826,0.00112572,0.000827349,-0.000487037,0.00167818,0.00146286,-0.000754706,0.0000503575,-0.00147006,-0.00109195,0.000230989,0.000910085,0.000290898,-0.000341241,-0.000696278,0.00182328,0.00117619,-0.00176466,0.000474901,-0.00105951,0.000849468,0.000310202,0.000561934,0.000736378,-0.000671468,0.000337412,0.000209281,0.000497117,0.000199618,-0.000828277,-0.00019811,0.000690144,0.00181879,0.00042049,-0.00193422,0.00144206,0.00120858,0.000618459,-0.00065648,-0.000100114,-0.000534856,-0.00158641,-0.000440783,0.000297486,0.000903809,0.000172627,0.00115437,0.000965746,0.000921842,-0.00126457,0.000730606,0.00048418,-0.00101178,-0.000274247,-0.00103108,-0.00176259,-0.00151679,-0.0013138,-0.00191234,-0.000345327,-0.000945848,0.0000117571,-0.00103384,-0.000128806,-0.00173089,0.000191576,-0.000484424,-0.00196561,0.0014753,0.00120829,-0.00117875,0.000339339,-0.000706349,-0.00101533,-0.000785491,-0.000119072,-0.00051497,0.00116122,-0.00009031,0.000427374,-0.000152731,0.000685559,0.00108857,-0.000662243,0.000664696,-0.000509295,-0.0000595917,-0.000293593,-0.000924556,0.000695649,0.00118526,-0.000529102,0.00182817,0.000589684,0.000980815,0.000956411,-0.0000349257,-0.000698599,-0.000197909,0.00160825,0.000991853,0.00165387,-0.000567143,-0.000801655,0.00127584,-0.00170708,-0.00124798,0.00000129333,-0.000215967,-0.00152554,-0.000820475,-0.00123284,-0.0000672545,-0.000531224,0.00078052,-0.000633594,0.000963152,0.000571998,-0.0000686565,-0.0000179958,0.000282974,0.000569691,0.000564879,-0.000394542,-0.00115139,0.000188401,-0.000412016,-0.000220309,-0.00158459,0.000697498,-0.000862934,0.000670665,-0.0019524,-0.00117189,-0.00145257,0.000368256,0.00115817,-0.000368614,0.0000206023,-0.00165964,0.00105676,0.000671345,0.00169956,0.000732646,0.000656292,0.00161657,0.000708912,-0.000992932,-0.000881279,0.0010492,0.000713774,-0.000046923,-0.000811558,-0.000340193,-0.000925344,0.0000245139,-0.000842506,-0.00117196,0.000203865,0.00081172,-0.000250871,-0.000861889,0.000835154,-0.000127579,0.000161865,-0.00169701,-0.0000347345,0.00103055,-0.000774106,-0.000385477,-0.000275707,-0.000536795,-0.000915909,-0.000591568,-0.00150832,0.000956712,-0.000366817,-0.000151714,0.000712441,-0.000312061,-0.000402743,-0.00111415,0.00027689,-0.000541619,-0.000706761,-0.000235475,-0.000861021,0.0000112852,-0.000716552,-0.000550796,-0.000600348,-0.000805801,-0.000633733,-0.000732635,0.000120802,0.000379358,-0.000261525,0.000396423,0.000337871,0.00161646,-0.000989259,-0.000372174,0.00112611,-0.000238012,-0.000168961,0.0000245718,-0.000343594,-0.000154868,-0.000220056,-0.000349746,0.00118252,0.000902311,0.000145938,0.00150286,-0.0003955,-0.000260834,-0.000987681,-0.000233983,0.00102677,-0.0011063,-0.000598322,-0.000361645,0.00112087,-0.0000473218,-0.00125227,-0.0000320241,0.00160514,-0.00087412,-0.000250645,-0.000135844,-0.00194216,-0.000487585,0.000479665,0.000361462,-0.000704039,-0.000141703,0.000365189,-0.00108527,0.000350665,0.000891708,0.000333134,-0.000631533,-0.000492728,-0.000474885,-0.00180576,0.00118514,0.000475831,0.000477575,0.0014501,0.000278494,0.000301443,0.000953938,-0.000360516,-0.000321311,-0.00153364,0.000602837,0.000715914,-0.0017088,0.0019405,0.00000323534,0.0014745,0.00155244,-0.00125294,-0.000109023,-0.00091689,-0.00171845,-0.00021326,0.000959964,-0.00137342,0.0000788326,0.000249129,-0.00183309,-0.000328688,0.000816545,-0.000698564,-0.00138306,0.000851392,0.00101635,0.00129603,-0.000226102,-0.00136565,-0.00149536,0.00143922,-0.000657248,0.000176635,-0.000345766,-0.0000407411,-0.000566798,-0.00121643,0.0000252802,0.000447827,0.0000157634,-0.000655133,-0.00068409,0.000405253,0.00172024,0.000261356,-0.000654868,0.0000764904,-0.000487578,0.000883034,-0.000436083,-0.0000630782,-0.000490675,0.000878618,-0.000414037,0.000500821,0.000343774,0.00133693,0.00104072,0.00109978,-0.00183315,-0.000286791,-0.000495644,0.00097423,-0.00104954,0.00169717,-0.000949669,0.000400959,-0.000849834,0.000642281,-0.000583694,-0.000130512,-0.000718666,-0.0000184635,0.000330852,0.000184671,-0.00145807,0.0000389827,-0.0000806425,0.0011708,-0.001223,-0.000067637,0.000788326,0.000479764,-0.00054895,-0.000159538,-0.00092432,-0.0014238,0.00157987,-0.0019684,-0.000112704,0.000441085,-0.00136028,-0.000788699,0.000931869,-0.000657726,0.00000667395,-0.00170393,-0.000918064,0.00187772,-0.00189936,-0.000612031,-0.000364795,0.000585821,-0.00114663,0.00104857,-0.0000673508,-0.00149869,-0.00189413,0.00079189,0.000378545,-0.000765371,0.000613884,-0.00101505,-0.000650186,-0.000588677,-0.00147337,0.000921066,-0.000525313,0.000603183,0.00142041,0.000396534,-0.00179583,0.0011359,-0.00176704,0.00101779,-0.000955556,-0.00191655,0.000396662,-0.00123784,-0.000132112,0.00104173,-0.000514438,0.000180237,0.000741351,-0.000953884,-0.00168576,0.0000724998,-0.00105279,0.000949228,0.000704821,0.000353518,-0.000187811,0.00152953,0.00107338,-0.00187518,-0.000857041,-0.00171457,0.0000677245,-0.000838693,0.00168827,0.00156134,-0.000433852,0.00156075,-0.000161939,-0.000152239,0.000707901,-0.000166305,-0.000244733,-0.00109659,0.000047919,0.00169236,0.000742199,-0.000420732,0.000794104,0.0015749,-0.000527956,-0.000595098,0.000933594,-0.000191641,-0.00102837,-0.000243085,0.00100883,0.000194732,-0.00128568,0.0018436,0.00146792,0.00118352,-0.000233604,-0.00153627,-0.000247138,0.000308802,-0.000747986,-0.000596488,0.000432159,0.000706614,-0.00193245,-0.000344731,0.00172637,-0.000363731,-0.000419306,-0.00131917,0.00185171,-0.000935806,-0.000263763,0.000118703,-0.00124594,0.00111237,-0.000526376,-0.0000181247,-0.000984251,-0.000469415,0.000243662,-0.00195302,0.00100339,0.000729284,0.00138932,-0.000271105,0.000237159,-0.00110792,-0.000359973,0.000160741,-0.000535267,0.000932225,-0.000739294,-0.000945861,-0.000515158,-0.00146557,-0.0000633413,0.00119904,-0.00124886,0.00122093,0.000189251,0.000165589,0.000567057,-0.00110605,0.000840732,-0.000661469,0.00113887,0.0000417416,-0.00139292,-0.000857762,0.000663898,-0.000881988,0.00100159,0.00145601,0.0019009,0.000318142,0.00122538,0.00158692,-0.00105336,-0.00101942,0.000300529,-0.000999473,0.00183143,0.000762682,0.0000036516,-0.000708313,0.000219708,-0.0000336538,-0.000509932,-0.000647769,-0.000959283,-0.00158253,-0.00193821,0.000382855,0.000350653,-0.000749733,0.000563886,0.000342115,-0.000685623,-0.000452415,0.000209508,0.0000618202,0.000688397,0.000967265,-0.00066905,-0.000356484,0.000590234,-0.0000772595,-0.000370639,-0.00010867,0.00043013,0.000578363,-0.00104313,0.00112403,0.00122715,-0.000126968,0.00140956,0.0008971,0.00103348,0.00194469,-0.000790173,-0.000833114,0.00155235,-0.00023106,0.000304341,-0.000307906,0.000380157,0.000643741,-0.00045594,-0.00101778,-0.000279212,0.000736811,0.0012347,0.00069885,0.000323671,0.000683269,-0.00152812,0.000145711,-0.000131074,-0.0000949959,0.000446645,-0.00105532,-0.000213545,0.00130434,0.0010675,0.00142864,-0.00126577,0.0000725874,-0.000213446,0.000124403,0.00117964,0.000193754,0.000163943,-0.000182307,-0.000653793,0.000112173,0.000318171,0.000754512,-0.00091251,0.000296195,-0.000392415,-0.000347985,-0.000833399,-0.00104237,0.000861778,0.000403768,-0.000754151,0.0000787885,0.000368252,-0.000548201,-0.000249693,-0.000280872,-0.000243721,0.00116432,-0.000192307,0.000552307,-0.000668779,0.000226648,-0.000157636,0.000906279,-0.000469749,-0.000491144,-0.000619653,-0.000609424,0.000461556,-0.000246933,-0.000238968,0.00147272,0.000985597,-0.000302048,-0.00125442,-0.000559673,-0.00113465,0.000880045,0.000312337,-0.000197311,-0.000282816,0.000548975,-0.00108945,0.0001135,-0.00138296,-0.000719026,-0.00110262,0.00122691,0.000208717,0.000335042,-0.000850347,0.000526098,0.000512823,0.000512245,0.000888617,-0.00174009,0.000584642,0.000407582,-0.00117106,0.000588272,0.00156529,0.00115077,0.000619976,0.000352065,0.000926557,-0.000986929,-0.000892177,-0.00097356,-0.000309134,0.000541173,0.00037235,0.000638002,0.00107016,0.000118003,-0.00000538743,0.00075436,0.000151195,0.000312439,0.000323654,-0.0000521293,0.000230384,-0.000817691,-0.000832279,0.00166326,-0.000739671,0.000070324,-0.000564707,0.000558121,-0.00110286,-0.0014652,-0.000483152,0.00113592,0.000579018,-0.000246869,0.00064685,-0.000453952,-0.00182498,0.000564135,-0.000570303,-0.00127177,0.0000220757,0.0000490771,0.000363927,-0.000409781,-0.000707022,0.000248388,-0.00071678,0.000497393,-0.00071826,0.000224975,-0.000494923,-0.00164604,-0.0014039,-0.000180145,-0.00113258,0.00107454,-0.000709966,0.000771935,0.000247117,0.00076266,0.000188767,-0.000469117,-0.000180606,-0.00119556,-0.00114469,-0.000815741,0.00048483,-0.000171373,-0.000180462,-0.000322778,0.000167284,-0.000307838,0.000496999,0.00134152,0.000582286,-0.000200736,-0.00033487,0.000270991,-0.00100822,-0.000840267,-0.000115437,0.000883725,-0.000776304,0.000459491,0.000304374,-0.00094973,0.000840143,0.000751069,0.00174369,-0.000222359,0.000619814,-0.0000493162,0.000737625,0.000473862,-0.000471873,0.00156454,-0.000748039,0.000461791,0.00112553,-0.00059735,0.000133435,0.000958943,-0.00131976,-0.00015458,0.000464901,-0.000179007,0.00061035,-0.0000540078,0.000981845,-0.00139107,0.00163424,-0.000830213,-0.000152121,0.00103806,-0.000560454,0.000829366,0.00159674,0.000324344,0.000327968,-0.00009094,0.000614696,-0.00188142,0.001148,-0.000859214,0.000548569,0.000724736,-0.000997577,0.000972488,-0.000676789,-0.00119933,0.000850883,-0.000573202,0.000752933,0.00039471,0.000552257,0.000930338,0.00167689,-0.000931146,0.00025796,-0.000274866,0.00181537,0.00100095,-0.000574272,-0.00130445,-0.000122586,0.0000959004,-0.000313552,-0.00194409,-0.00146124,0.00107413,-0.000580427,0.000347775,0.00118867,-0.000272107,-0.00053915,0.00175645,0.00171545,-0.000453437,0.000114079,-0.000966373,-0.000929513,-0.0013332,0.000862183,0.001609,-0.000924944,0.000636111,-0.000937812,0.000122219,-0.0018181,0.00196202,-0.00121539,-0.000382029,-0.0003035,-0.000242971,-0.00046191,-0.000905269,0.00106832,0.000301422,-0.00106923,-0.00158923,-0.00144523,0.000658374,-0.000568576,0.000341821,-0.000606859,-0.00129392,-0.000513187,-0.000270928,0.00151825,0.000968029,-0.000250748,0.000233771,0.00118974,0.0002688,0.000270737,-0.000841127,-0.000894352,0.000303076,-0.000145269,0.00109075,-0.00167791,-0.00176869,-0.000579843,0.00156755,0.00180949,-0.0019415,0.00133516,-0.00059473,0.000133644,-0.00057498,-0.000445697,0.000353876,-0.000690548,-0.00118666,-0.000369264,0.000620476,-0.0000958923,-0.0011835,0.000836619,-0.0000535934,-0.000242799,0.00103176,0.000447859,0.00170134,0.00134098,-0.000736169,0.000314255,0.00153862,0.00024283,0.00162295,0.0000291522,-0.00146606,0.00021171,0.0000752761,-0.000715572,-0.000904918,0.000575588,-0.000713815,-0.00131237,0.000137528,0.000118859,-0.000229333,-0.000263533,0.0000742068,-0.000106831,-0.000406548,0.00184235,0.000405978,-0.000198994,0.000488085,0.00105597,-0.000222377,-0.00102761,-0.000102733,0.0000507709,-0.00039943,-0.000374904,0.000109195,-0.000432138,-0.00168761,0.000171,-0.00102785,0.00193216,-0.000209788,0.00120434,-0.00130229,0.00110181,0.0018336,-0.00191747,-0.000427448,-0.00119389,0.00047118,0.0000904099,0.000309275,-0.0000872673,0.000854701,-0.00177683,0.000511782,0.000528996,-0.000654227,-0.00101269,0.000420965,-0.00011173,-0.000165892,0.000698035,-0.00108891,-0.000513206,0.00169148,-0.00164201,-0.000847627,-0.00133901,-0.000845962,0.00140896,-0.000629633,0.000835577,0.000803762,0.000712655,-0.00102332,0.000551509,-0.000196945,0.000157242,-0.000180614,0.0000134523,-0.000657985,0.00126132,-0.000937799,-0.0000986462,-0.00044339,0.000261553,-0.00110321,0.000796007,-0.000252667,-0.00156152,-0.000412314,-0.000836338,-0.000279012,0.00116227,0.000199492,0.000204589,0.000650233,-0.000697776,0.000215267,0.000462186,-0.00135172,-0.000877087,-0.000715319,0.00131644,0.00109244,-0.000683991,-0.00141868,-0.000748303,-0.000963104,-0.00109295,-0.000430974,-0.000509752,0.00117152,-0.000933542,-0.00154329,0.00061871,0.00111553,0.000118368,0.00104753,0.000224672,0.000844024,0.000276461,-0.000594641,-0.00135717,0.00121894,0.000622164,-0.00132693,-0.00130404,-0.00015942,0.000217528,0.0000550876,-0.00110397,0.0000831952,-0.000716039,0.000309068,-0.00111651,-0.000775242,0.000765648,0.0010638,-0.000219481,-0.00118644,-0.000020346,-0.0011258,0.000598567,0.00100887,-0.000646497,0.0000668472,0.0014947,0.00114262,-0.0000362833,0.00172427,0.000328374,0.000801076,0.000633075,0.000268713,-0.000969651,-0.000245419,0.000995446,0.00167694,0.000805213,0.000885509,-0.000323941,0.000531857,-0.00091729,0.000851446,-0.00070152,0.00139195,0.00143768,-0.000571515,-0.000879807,-0.000135901,0.000662099,-0.00130352,-0.000102296,0.000973448,-0.00000942309,0.000191204,-0.0001208,0.00126013,0.00156985,-0.000393681,-0.00100124,-0.00104896,-0.000168126,0.000899269,-0.00147272,0.00145366,0.00107015,-0.00107956,0.000823934,-0.000972847,0.000976554,-0.000576031,0.000604272,0.000621163,0.000242377,0.000435564,0.00139058,-0.00121205,0.000304303,0.000817276,-0.000209427,-0.00059598,0.00114596,0.00139493,0.00173335,0.0000398504,-0.000436912,0.00109401,0.000344578,0.000766934,-0.000377124,-0.00116058,-0.000136174,0.0014923,-0.00164199,0.000601325,0.000567711,-0.000335743,-0.00000974097,-0.0000242577,-0.000190399,-0.00154724,0.0000127479,0.000946942,-0.000651769,-0.00113885,-0.0015019,-0.000955123,-0.00106286,0.000190379,-0.00128983,-0.000255531,0.00135837,0.000994778,-0.000833373,-0.000713187,-0.000548733,-0.000839862,0.000580149,0.000520101,-0.000170765,-0.00122797,-0.00147258,-0.000303029,-0.00142385,0.00122373,-0.00107743,0.00106872,-0.00000768799,0.000807091,0.00045157,0.000797679,-0.00016478,-0.000639597,-0.0000405799,0.000296069,-0.000778821,-0.0000686837,-0.00109056,-0.000573044,-0.000521007,0.000859072,0.000482464,0.000146464,0.000536319,-0.000468817,-0.000465067,-0.00101641,0.000353171,-0.00152244,-0.00139049,0.00170625,0.00135574,-0.00133614,-0.00020848,0.00086156,-0.000314966,-0.00136264,0.00107844,0.000385741,-0.00153133,0.000794595,-0.000687484,-0.0000228194,-0.000535258,0.00066378,-0.0005788,0.00112945,0.0000142542,-0.000781396,0.000367436,0.000218192,0.000481195,0.000685989,-0.00165738,0.0000217995,-0.000240452,0.000373503,-0.000860273,-0.000734496,-0.0000184622,0.0000287177,-0.000829082,0.000107622,-0.00153331,0.00183568,-0.00190025,0.00170263,0.00140442,-0.000992925,0.000549985,0.000428616,-0.00192829,-0.000401202,-0.000342706,-0.00095067,0.000860027,-0.000115017,0.000050841,0.00057274,0.000894883,-0.000124506,-0.000156906,0.000673813,0.000157301,-0.000965143,0.00123032,0.000512987,-0.000189816,-0.000721868,-0.000697749,-0.00138515,-0.00147306,0.000444135,0.0000619352,0.00066392,0.000352995,-0.000367953,-0.00107218,0.000972336,-0.000593609,-0.000518848,0.00111382,-0.000677732,0.00013633,0.000595859,0.00105757,-0.00129627,0.00195083,-0.000215955,-0.000272647,0.000572322,-0.000246014,0.000521834,0.000345064,-0.000744207,-0.000644855,0.000010472,-0.000034254,0.00180755,0.00064052,-0.000574167,-0.00167601,0.00140677,0.000391335,-0.00083331,-0.0000932903,0.00102805,-0.000547829,0.000641465,0.00145531,0.000127039,-0.000247393,-0.000170753,-0.00161784,-0.00133604,-0.000376399,-0.0002603,0.00104465,0.000579579,0.000837311,0.000473897,0.000354929,0.000499539,-0.00180239,-0.000937929,-0.00110293,-0.000319349,-0.00170217,0.000621525,-0.000836682,-0.000147887,0.0000363822,-0.000108333,-0.00190743,0.000350803,-0.000968675,-0.000599038,-0.000121736,-0.000379644,0.00017311,-0.00109903,-0.000991338,0.000986659,0.000205473,-0.000719426,0.00119919,-0.000194603,0.00107936,-0.00147919,0.000520222,-0.000822328,-0.000851953,0.0012095,0.0000989479,0.000283158,0.00074941,0.000842122,0.0000886344,0.00133693,-0.000119775,0.00149792,0.000765817,0.000707927,0.000230629,-0.000920002,0.000545787,0.000534198,-0.00036354,0.000148503,0.000727689,-0.000349699,0.00140127,0.000405418,-0.000444919,0.000570011,-0.000245525,0.000761731,0.000331688,-0.000240192,0.000660757,-0.00116372,-0.00141749,0.00116655,0.0000635388,-0.00137764,0.000475985,0.00123828,-0.000165827,0.000381358,-0.000431265,-0.000136802,-0.00127707,-0.000267984,-0.000190199,-0.000100166,0.000815377,-0.000640883,0.000884458,-0.000030429,-0.0015967,0.00050708,-0.00108688,-0.00121278,-0.0000310078,0.000408917,0.00178626,0.000940222,-0.000168498,0.0017299,0.000482684,0.000256855,0.000269046,-0.000344197,0.00186896,0.00192702,0.00159357,0.000174941,0.000244982,0.000265205,0.00198461,0.0000777265,-0.00152588,-0.00157682,-0.00162704,0.000517782,-0.000199201,-0.000933316,-0.00110928,-0.000320802,-0.00102054,-0.000906615,0.000601301,0.00000668281,0.0013943,-0.0000689028,-0.00100196,-0.00054595,0.000529667,-0.000707999,-0.000219734,0.000755871,-0.000376967,0.00020193,-0.000263053,0.000263448,0.000195427,-0.000384817,-0.000506116,-0.0000713512,0.0000547198,0.00109255,-0.000666833,-0.0000660172,0.000255128,0.00113224,0.00136887,0.0013731,0.00168872,0.0000174414,0.000668273,-0.000233847,0.000672044,-0.000500807,-0.000748358,0.000263943,0.00136057,-0.000506842,-0.000502368,-0.000659251,-0.0012353,-0.000829595,-0.00094228,-0.000652192,-0.00137519,-0.000493657,-0.000628901,-0.00138874,-0.000871151,-0.000953899,-0.00118917,-0.000481021,0.0000860401,-0.00140958,-0.000107558,-0.00101629,0.000803551,0.00000941662,0.00122202,-0.000739517,0.0000651613,0.000184533,-0.000111986,-0.000473814,0.000262325,-0.00121381,-0.00110339,0.0000331986,-0.00110988,0.000308403,-0.000874752,0.000546684,-0.000918331,-0.00118535,-0.000461708,-0.0000865321,0.000305739,0.00000728393,0.000736783,0.000893393,-0.00126878,-0.0000595554,0.0001013,0.000046491,0.000917027,0.000306536,-0.00147064,0.000205304,-0.00197163,-0.00148611,0.00193064,0.00100846,-0.0000830072,-0.0000537279,-0.000759604,0.000938664,-0.00030362,0.000898732,-0.00115338,-0.00184513,-0.000259989,-0.000626708,-0.000209983,-0.000345106,0.00023768,0.000466212,-0.000258121,0.000705845,-0.000800862,0.000800448,0.000641735,0.000735401,0.00092383,0.000361353,-0.000771553,0.00023845,0.00153655,0.00127597,-0.000266924,-0.000123492,-0.0011069,0.000394971,-0.000753819,-0.000894187,-0.0000427671,0.000721687,0.000326268,0.00156459,-0.00196586,-0.000396184,-0.0000276028,0.000381884,-0.000169339,-0.00111395,-0.000150526,-0.000653024,-0.000617149,-0.00077381,0.000274001,-0.00186594,0.000847861,0.000114754,0.00149832,-0.000363201,0.0000930884,-0.00113369,-0.000418125,-0.00105015,0.000528329,-0.001038,0.000360933,0.00126549,-0.000666592,0.000111166,-0.00138358,-0.000481832,0.000267092,-0.00072625,-0.00153073,-0.000638665,0.000278631,0.000100267,-0.000836535,-0.000786712,-0.00151935,-0.000677837,-0.000037012,-0.00101161,-0.000334392,0.00052103,-0.00141263,-0.00141465,-0.00094972,0.00108479,0.000642,-0.00165432,-0.000854473,0.00120588,0.00169426,-0.000837886,-0.000831265,-0.00110048,-0.000866173,0.000337617,-0.0000958714,-0.00143575,0.000193504,-0.00086101,0.000270535,0.0000733137,0.00130529,-0.00155956,0.00170095,0.0000116693,-0.00129413,0.000736015,-0.000833115,-0.00031271,0.000264654,-0.000314398,0.0000320655,-0.000389591,-0.000726211,-0.000252882,-0.000670527,0.000611434,0.000632509,0.000455593,0.000362994,0.00136523,0.00149442,0.000706997,0.000674179,-0.00176992,-0.000469212,-0.000953923,-0.00170165,0.000107472,-0.00014727,0.00163185,-0.0012646,0.0000925784,0.000280461,0.000077654,0.000403243,-0.00141805,-0.000552423,0.000584238,0.0000948501,0.00114478,0.000636376,-0.000108508,-0.00100323,-0.000327652,0.0000784443,0.00188481,-0.000838822,-0.00124644,-0.00135634,-0.0000580533,-0.000255938,-0.000226112,-0.00138036,0.00085233,-0.000189191,-0.000395298,-0.0000735012,-0.000393437,-0.00099225,0.00154931,0.000915983,0.000269529,0.00143511,0.000102447,-0.000514834,-0.00179498,0.000397602,-0.000955899,0.000623397,0.000210043,-0.000209068,-0.000643825,0.00104078,-0.000289051,0.00105134,-0.00125195,-0.000390863,0.000232097,-0.000215728,-0.00161437,0.000441493,0.000806861,-0.00129657,-0.000648293,-0.000782538,0.000495196,-0.000951896,0.000407561,-0.000552788,0.000398441,-0.00043066,-0.00119969,-0.00149915,-0.000188046,0.00119922,0.000148768,-0.000151694,0.000868192,0.00167288,0.000325992,0.00100876,-0.000962184,-0.00107525,0.000112261,0.00174092,0.000331153,-0.00150868,-0.00159022,0.0000202121,0.000644031,-0.000881656,0.000900332,0.00195644,0.0000113298,-0.00157271,-0.00144028,0.00100277,-0.000169205,-0.000189411,0.0000480666,0.000561523,-0.000494788,0.0006929,-0.000133189,-0.000250137,0.000341892,-0.00101556,-0.00180365,0.000653994,0.00135112,0.000281189,-0.000262408,-0.000439612,-0.000880863,0.000941063,-0.000342505,-0.00100893,0.000489277,0.000620331,0.00196136,0.00160977,-0.00196572,-0.00123751,0.000506392,-0.000133523,-0.00145323,0.000167626,0.000155673,0.000281321,0.0000106579,-0.000434735,0.000256204,-0.000849051,0.000462243,0.000613642,-0.00123125,0.0000538552,-0.000196752,0.00127104,-0.0000610352,0.000964427,0.00031884,0.000466105,0.00132759,-0.000916863,0.00028365,-0.0000372261,-0.000901024,-0.00079704,-0.000494411,0.0000888111,0.0000246864,-0.00136212,0.000596547,0.00107819,-0.00130294,0.00155606,0.000127924,-0.000204827,0.000359335,-0.00115133,0.000642867,0.00146013,0.000135538,0.000280181,0.000250723,0.000334791,0.000233539,0.00107051,-0.00160814,0.000774875,0.000210784,0.000106369,0.000234683,-0.000348902,-0.000340698,-0.00068017,0.00056468,0.00148529,0.000323129,0.000852813,0.000378544,0.000659884,0.000566116,0.00153093,0.000691296,-0.000849743,-0.00100052,-0.000303666,-0.00134728,0.000604759,-0.00132135,-0.00100841,-0.000659188,-0.00019298,0.000704265,0.000292227,0.000268056,0.000705536,0.000231234,-0.00118746,-0.000414897,0.000519059,0.000882436,0.00107546,0.000355636,-0.000120374,-0.00129847,-0.000892537,0.000635537,-0.000214852,0.000272494,-0.0000500104,-0.0010415,-0.000601394,-0.0000754863,-0.000868417,-0.0000509634,0.00111284,0.00000878604,0.0000740782,-0.0000416469,-0.000121631,-0.000311444,0.00124958,0.000326882,-0.000553974,-0.000525276,-0.000575995,-0.00109977,0.0004612,0.000189757,0.000121791,0.000189613,0.0000893412,0.000171231,-0.00095869,-0.000571017,0.00117069,-0.00147173,0.000471925,-0.00100871,0.000995345,0.000442586,-0.000130577,-0.0003467,0.000735892,0.000927119,-0.000294243,0.000740244,0.0000111768,0.000228105,0.000514389,0.000101264,0.000163848,0.00119391,-0.000785631,0.00121621,-0.000316259,0.000912109,0.000576585,0.00190444,0.00172528,0.0000855821,-0.00152367,0.000223057,-0.0000786743,0.00065523,-0.000340997,0.000783808,0.000374654,-0.000486771,0.000344006,0.00030268,-0.000204069,-0.00169384,0.0012845,0.0015221,0.000507161,0.000050597,0.000185825,0.000348438,-0.00137347,0.00033153,0.00157116,0.000333036,0.00049558,0.00135684,0.000227211,0.000152264,0.00178553,-0.0000328272,-0.00104001,-0.0000688662,-0.000945515,0.00164414,-0.000288786,0.00044677,0.000128085,-0.0000205813,0.000354875,-0.00120656,-0.000816857,-0.000319183,0.000771262,-0.0000742099,0.000709813,-0.000932331,0.0000608081,0.0010833,-0.000891247,-0.000701762,-0.000211599,0.000799057,0.000952201,-0.000247455,0.0016122,-0.00125754,0.000548425,0.00011775,-0.00163717,-0.00132796,0.000258306,-0.000184393,0.0003284,-0.000354042,-0.000786886,-0.000919055,-0.000049792,0.00019582,0.000689818,0.00137139,0.000256953,-0.000308182,0.00122208,-0.00177684,-0.000017443,-0.00185311,0.00114358,0.000673418,-0.000570441,0.000132014,-0.000912864,-0.000424716,-0.00143379,0.000981861,-0.000730336,-0.000892369,-0.000770609,0.00110979,-0.00108772,-0.00191778,-0.000804004,0.000492926,0.000742284,0.000131821,0.000372786,0.00145961,0.00148453,-0.0000380568,-0.000621795,-0.00166415,0.000057259,0.000665262,-0.000201742,0.000423383,-0.000541495,0.00024972,0.000121928,-0.000554179,0.00178718,-0.000492522,-0.000489979,-0.000626861,0.000402628,0.00120308,-0.00174139,0.000452453,-0.00156957,-0.000222463,0.000284827,0.00144078,0.0000686203,-0.000557597,0.000669866,-0.000639376,0.000576631,-0.000595081,-0.00131812,-0.000851512,-0.00173157,-0.000943571,0.000249619,0.00199256,0.000348574,0.00170129,0.000163503,-0.0000391827,-0.000644326,-0.000649812,0.000414118,0.000625801,-0.00018776,-0.00185892,-0.000511142,-0.00102854,-0.000273975,-0.00120122,0.000236723,-0.000548552,0.00128953,-0.00113639,0.0000167254,0.00119668,0.0000886267,-0.00124974,0.000340594,-0.0000813608,0.0000806586,0.000328149,0.00111734,-0.000196856,-0.00130259,-0.00037552,-0.00133751,0.000616538,0.000709724,-0.000252457,0.000395859,-0.000664124,-0.00133635,-0.000482345,0.000298297,0.000174231,-0.000290904,-0.000529802,0.000159592,-0.00105043,0.0000884819,0.00106279,-0.000605623,-0.000298964,0.00182066,0.000912344,0.00102889,-0.000852565,0.00152189,-0.00143294,0.000444165,-0.00119207,0.00165549,0.00123562,-0.00177663,-0.00111612,-0.00022489,0.00047089,0.000498472,0.000639335,0.000172573,0.00168229,-0.000652784,0.0000187721,0.000217013,-0.000389116,0.00178442,-0.000834781,0.00076206,-0.00015697,-0.000440606,-0.000578425,-0.000688549,0.000776971,0.000731052,0.000933606,0.000728536,0.000384046,0.00159058,-0.000236641,0.000331825,0.00142027,-0.000455597,0.000247467,-0.000368709,0.000859049,-0.00185713,0.00107162,0.00103104,-0.0015502,0.00099618,0.00133762,-0.00013396,0.000613251,0.00140917,0.00106826,-0.00148843,0.00180693,-0.000115629,-0.000889974,0.00149402,0.00124565,-0.000788677,-0.000669536,-0.000630551,0.00157295,0.000984129,-0.000401379,0.00060554,0.000343693,0.000963028,-0.000376449,0.000630243,0.000571561,-0.00130098,-0.00164377,-0.000678719,-0.00195825,-0.00124166,0.0011161,0.000906073,0.000937133,-0.0000191371,-0.000855169,-0.000528848,-0.00110466,-0.00122047,0.00170362,0.00143181,0.000353247,-0.000712617,0.000773497,0.000245867,0.000217075,-0.000752263,-0.000058767,-0.00142637,0.000369715,-0.000708836,-0.00197457,0.000783319,0.00197756,-0.000832828,0.000982789,-0.000744747,-0.00141164,-0.00123167,-0.000560144,-0.00136856,-0.00117094,0.000143253,-0.000975281,-0.000169428,-0.000406057,-0.000548264,0.00192366,0.000784862,0.00150077,0.00117481,-0.000220289,-0.000493721,-0.000414377,-0.000790233,0.000351994,-0.0011557,-0.000647626,0.000955616,-0.000950603,-0.00180789,0.00127041,0.000983281,-0.0000713693,0.000425788,-0.000864423,0.00011835,-0.000062871,0.0000639238,-0.00000604182,0.00112283,0.00153311,-0.00182829,-0.0000528389,0.000750848,0.000269028,0.000028537,0.000909433,0.00141845,0.000181678,-0.000436827,0.00129642,0.000791312,-0.000470178,0.000132019,-0.00106619,-0.00130361,-0.000629317,-0.000578178,0,-0.00131928,0.000413439,-0.000323007,-0.000821665,0.000290235,-0.000777638,0.000862458,0.00162941,0.000794756,0.00123824,0.000771829,0.000922717,-0.00101741,0.0008237,-0.000379004,0.00167649,0.00145821,-0.000561317,0.000398891,0.00111922,0.000777505,-0.000850048,-0.000840549,0.00159725,0.000317218,-0.000628899,0.00132821,0.000374995,0.000951901,0.000451001,-0.000621362,-0.00101423,0.000557958,-0.000134854,-0.000087123,0.000518217,0.00134539,-0.00143381,0.00125015,-0.000382438,0.00168737,0.000909244,-0.000879161,0.000154328,-0.000344767,0.000952464,0.0014408,0.000543424,-0.0008066,0.000175942,-0.000621324,-0.00034949,0.00106859,-0.00146198,0.000792835,0.00117073,-0.00112054,0.00196809,-0.000521925,-0.000713571,0.000811112,0.000419607,0.000288939,0.000291949,-0.000809164,-0.00124776,0.0000947372,-0.00140904,0.0000190149,-0.000676427,-0.00103446,0.00141721,0.00135428,0.00172248,0.000158805,0.00187406,-0.00188543,0.000737429,-0.00150885,0.000472871,0.000158553,0.00133132,0.00125356,0.00133394,0.00065774,0.00147034,-0.000438595,-0.00163265,-0.00105606,0.000382161,-0.00119068,0.000511031,-0.000663195,-0.00103964,-0.000149034,0.000270977,-0.000167338,0.000185597,0.000722196,-0.000403805,-0.0012354,-0.000062649,0.000941789,-0.000784201,-0.000157213,-0.000949754,0.0000932586,0.000199718,-0.00068802,0.00102559,-0.000805725,-0.000261131,0.000209452,-0.000194744,0.000662254,0.00178629,-0.000188921,0.0011532,0.000642431,0.00107165,-0.000858572,-0.000815571,0.000479553,0.00171882,0.00185251,-0.00119061,0.000903244,-0.000391477,0.000197727,0.00105221,0.000597401,-0.000523825,-0.000019365,-0.000654176,0.0002585,-0.0000344767,-0.000658469,0.000796413,-0.0000389308,-0.000028919,0.00138911,-0.00130668,-0.000314222,-0.00117137,-0.000868894,-0.00123812,-0.000193028,-0.00176206,0.00161859,0.000403326,0.0000191611,0.00187936,-0.00110534,-0.00139845,-0.000543486,-0.00143254,-0.000249474,0.000417519,-0.000185021,-0.000191111,-0.000681535,0.000435193,0.0000776214,0.00146852,-0.0000692524,-0.00106198,-0.000863204,-0.00139583,-0.00111218,-0.00169604,0.0000641097,0.000261817,-0.000203632,-0.00121072,-0.00110017,-0.000164794,0.000522037,-0.00175501,0.000299437,0.000122664,-0.00152024,-0.000789638,0.000343469,-0.00164049,-0.00162314,-0.00096489,0.000976761,-0.0000351687,0.000878769,0.000327617,-0.000611197,0.000369538,0.000443302,0.00100649,-0.000590227,-0.000561605,0.000866033,0.0000355111,0.00106857,-0.000457478,0.000229339,0.000544698,-0.00154679,-0.000401049,-0.0000199176,0.000112984,-0.000826849,-0.000847295,0.0012523,-0.0000876382,0.000412541,0.000974022,-0.000110439,-0.00122314,0.0014363,-0.000154573,0.000700794,0.00117085,-0.00157521,-0.000448924,0.000179597,0.000496384,-0.000208264,-0.000804201,-0.000271643,0.00161576,0.000292929,0.00124261,-0.000237138,0.00123273,0.000407324,0.000986845,0.0012027,0.00107957,-0.0000470206,0.000759815,-0.000979509,-0.00121541,-0.000158756,0.000545848,-0.00094269,-0.000332812,-0.000458361,0.00104717,-0.00128903,0.000321147,0.0010151,0.00156438,-0.000684698,-0.000313466,-0.000199553,0.00178417,-0.000419999,-0.00107107,0.000787546,0.000918468,0.0000423585,0.000575434,-0.00155054,-0.0000415344,0.000747162,-0.000792087,0.000722017,0.00197697,-0.000535929,-0.000630191,0.00107062,0.00146501,-0.000186679,-0.000574273,-0.00157911,0.000765494,-0.000677037,-0.000956397,-0.000150138,-0.000891207,0.000317854,-0.0000408415,-0.000147437,0.000283082,0.00187468,0.00047465,0.00172984,0.000448264,-0.000531756,-0.000542302,-0.000221002,-0.0000676514,-0.00108732,-0.00166438,-0.000742067,-0.000405484,0.000250005,-0.000747779,0.0000778442,-0.00046172,0.00133453,-0.000693994,-0.000862645,-0.0002345,-0.000289792,0.000551904,0.000434445,0.000553614,0.000689307,0.000090886,-0.000904941,0.00039435,0.000223818,-0.000729817,0.000757557,-0.000129609,0.0018662,-0.000722303,-0.00097721,0.00177086,-0.000253112,0.000312611,-0.000442251,0.00148019,-0.000103163,0.00120388,0.001679,-0.000502269,-0.000844355,0.000750822,-0.000447858,0.000480135,-0.000880511,-0.00130391,-0.00153592,-0.00199788,-0.000498829,0.000379644,0.00110889,-0.00170923,0.000221845,0.00013133,0.000168495,0.00048416,0.000113057,0.000779525,0.00111678,0.00128843,0.00148252,-0.000676085,-0.000252619,0.00101241,0.00020314,-0.00154682,-0.0012234,0.00134038,0.00000544166,-0.00130844,-0.000969745,-0.000712346,0.00157725,0.000355689,0.000804581,0.000287322,0.000333135,0.00103922,0.0004945,-0.000390912,-0.00172593,-0.000827838,0.000481671,0.00000556732,-0.000451399,-0.00130793,0.000477262,0.000238632,0.0000198992,0.00127278,-0.00153644,0.00187632,-0.00127829,0.000692852,-0.000294985,0.00105807,-0.000241142,-0.000538701,-0.000454701,0.00118462,-0.000489908,-0.000112285,-0.00019023,0.000718476,-0.00169522,-0.000056072,0.00196017,0.000616036,-0.00127293,0.000832226,0.000307203,0.00104098,0.000182988,-0.000493574,-0.000965892,0.00151674,-0.000787662,-0.000960994,-0.000944879,-0.000936855,-0.000398034,0.00166396,-0.0000388831,-0.0011934,0.000234283,0.000797606,-0.000983235,0.00164421,0.00121526,0.000153483,0.000251587,-0.00108028,0.00163648,0.000741987,-0.0000222673,0.00137673,0.0000373777,0.000475294,0.00116421,0.000122542,0.00141369,0.001082,-0.00115745,0.000301764,-0.00153303,-0.00029785,0.0015127,-0.000623193,-0.000883737,0.000662871,0.0000856131,-0.000874275,-0.000465028,0.00176236,-0.000064315,0.00143394,0.00074442,0.0000934158,0.000166713,0.000760291,0.000547566,-0.0000524945,0.000565395,0.000186808,0.000437853,0.0007637,0.000918661,0.00115717,0.000427009,0.00152999,-0.000845823,0.000689006,-0.000866872,0.000441328,-0.00135343,0.000565347,-0.000645745,0.000192439,-0.00152834,0.000375764,0.000991566,-0.00137204,-0.00020164,-0.00136335,0.00190608,0.0000403122,-0.00111279,-0.000602952,-0.00114097,0.00140739,-0.00110903,-0.00140532,0.000278001,-0.000427966,0.000740778,0.000515329,0.000569275,-0.000932041,0.00168143,-0.000485363,-0.0000317644,0.00047005,0.000203639,0.000961553,0.000772956,0.000200017,-0.00031365,0.000656395,-0.000250698,-0.000446746,-0.000647483,-0.00105494,0.000906257,0.0000638707,0.00171435,0.000194081,0.000487261,-0.00107143,-0.000419431,0.000968221,0.00015468,-0.00163872,0.000666769,-0.000483719,0.000118086,0.00157382,0.000779029,-0.000321054,-0.000763992,-0.000337333,-0.000422958,0.000339942,0.00109433,0.000089299,0.000796753,0.000335533,0.00167851,0.000424173,0.00124828,-0.000562425,-0.000128528,0.000301804,-0.00108608,0.000479261,0.00042512,0.00129394,0.000571535,0.00102082,0.000376985,0.000618294,-0.000859185,-0.000427826,0.000525413,-0.00148898,-0.000249533,0.00151879,0.000411471,0.00028775,-0.00108676,0.000984334,-0.00151307,-0.000693218,-0.000604509,0.00109433,0.00109882,-0.00178494,-0.00046076,-0.00104599,-0.000671641,0.00137425,0.00029115,0.00098542,-0.000575106,0.000417596,-0.00103203,0.000488116,-0.000568087,0.00144343,0.00133407,0.000882601,0.00120568,-0.000385312,0.000265382,0.000362977,0.00141031,0.000295895,0.00177103,-0.000238951,-0.000875254,-0.000866566,-0.000951496,-0.000729408,-0.00076547,-0.000863589,-0.00112526,-0.000449082,0.000144624,0.000681351,0.000281295,-0.00121061,0.000174428,0.0000638892,0.00120198,-0.00116822,-0.000790204,-0.000387736,0.000325264,0.00033679,0.000600946,0.00144935,0.0011109,0.000163358,0.00121024,0.000295372,0.000829555,-0.000024248,0.000187232,0.00108991,0.000134438,0.000915994,-0.000556871,0.000819755,0.000054444,-0.000498726,0.000334835,-0.000642816,-0.0000880453,-0.0000783458,0.000624037,0.000461049,-0.000563986,0.000946539,-0.000443505,0.0000514644,-0.000196339,0.000963555,-0.00163679,0.00103871,-0.00112727,0.000423299,0.000940342,0.000224686,0.000793289,-0.000804473,-0.0000407374,-0.000365969,-0.00049174,-0.000325797,0.0000717476,0.000209738,0.00120879,0.000578453,-0.000413216,-0.00135204,-0.000334432,0.000145632,0.000245666,0.000504629,0.00119494,0.000305423,-0.000951286,-0.0000774163,0.000407826,-0.000109472,-0.000400744,0.0000330491,-0.00135911,0.00129307,-0.000529429,0.00165333,-0.000686809,0.000982968,0.00101036,-0.000941967,-0.000909221,0.000130727,-0.00147864,0.000779327,-0.00149888,0.0000723375,0.000447784,0.000503778,0.00123071,0.000847378,0.0000945704,-0.000882671,0.000218071,-0.000974152,-0.00165603,-0.00086905,-0.0000333478,0.000773682,-0.000318336,0.001062,0.0000133562,0.000840017,0.00000853348,-0.00141281,0.0000317353,0.000257338,-0.00106247,-0.000885524,0.00091871,-0.000138844,-0.000603696,-0.00101711,0.000702109,0.00091689,0.000187292,-0.00138856,0.0000879859,0.000519244,0.000794086,0.000442427,-0.000174204,-0.000900202,-0.0000168585,0.00191295,-0.000838649,-0.00103583,-0.000911698,0.00049044,0.00162334,-0.00140649,-0.00112875,0.000614908,0.000956634,-0.000403745,0.000305636,0.00146209,0.000118014,-0.000603462,0.00136304,-0.000135084,0.000184899,-0.0009137,0.00139458,-0.00120283,0.000905801,-0.00110946,-0.00000635834,-0.00125677,0.0011542,-0.0010164,0.000980168,0.00125466,-0.000273479,0.000364378,0.000781183,-0.000437237,-0.000957006,-0.00100244,0.00173541,0.000203229,0.000646346,0.000263061,-0.000368439,0.000349198,0.000939986,-0.00115525,0.00115559,-0.00105731,0.00139263,-0.0010973,0.00042576,0.00146764,0.000903773,0.000636623,0.00084533,0.000107737,0.000136965,-0.0000223148,0.0000356726,0.00174719,0.000410884,-0.000174079,-0.00010827,-0.000458692,0.0010009,-0.000242663,-0.000635029,-0.000356168,0.000306254,0.000268443,0.00117696,0.00164204,0.000346399,0.000593057,-0.000091133,-0.00161352,0.000546372,0.00116843,0.000175907,-0.00190619,0.0000267173,-0.000878948,-0.00185821,-0.000222793,0.000563173,-0.000677264,0.000828716,0.000671934,0.000168349,-0.00155766,-0.000133826,-0.000668458,0.000533989,0.000695863,-0.000511511,-0.00088023,0.000429898,-0.00172138,0.000778888,0.000599407,-0.000988086,0.0000485566,0.000966897,0.00117874,0.00035104,0.000714627,0.0000660673,0.000256112,-0.00138769,0.000002663,0.000825036,0.000408835,-0.00126746,0.000655101,-0.0000479161,0.000396351,-0.00042716,-0.0000067965,0.000712972,-0.000863879,-0.000662876,-0.00183468,0.000373168,-0.000779241,-0.000549755,0.000199918,-0.000724137,-0.000329498,0.000398355,-0.0000123491,0.00100244,0.0000855455,0.000596527,0.000800507,-0.000823536,0.00160924,0.000110389,0.000215917,0.000610188,0.000142472,0.000551699,0.000667207,0.000664856,-0.000560923,0.000382591,-0.000392449,0.0000363048,-0.000031871,0.000461273,-0.00188501,-0.00106505,0.0000579349,-0.000484709,0.000190605,0.000280534,-0.00118802,0.0006107,-0.000753158,-0.000229342,-0.000739806,0.00146566,0.000975198,0.000942694,-0.00139748,0.00085469,0.000529352,0.000310679,-0.000491079,-0.00149037,0.000558212,0.000479637,-0.000375916,-0.000866094,-0.00149845,0.00102506,-0.000493275,-0.00173712,-0.000044677,0.00022324,0.000309899,0.000783425,0.000271945,-0.00122849,-0.00107321,0.000448433,0.00134541,0.000888388,-0.00131332,0.00142069,-0.00170327,-0.000962678,0.0000886614,0.000209863,0.000529424,-0.00193021,0.00124965,-0.000354656,-0.0000820563,0.00124563,0.000181362,0.00119974,-0.000881374,0.00131123,-0.000442437,0.00108337,-0.000532613,-0.000240373,0.00109932,0.0014755,0.000999567,-0.00083319,-0.000708854,-0.000344156,0.000445209,-0.00000285074,0.000484887,-0.00119542,-0.000340339,0.000452588,-0.000478631,0.000175577,-0.000282171,-0.00193168,-0.00122434,-0.000321944,-0.000220017,0.00145706,0.000562253,0.000297897,0.000015478,0.0017242,0.000318296,-0.0014415,0.000781999,-0.000744979,0.00158974,-0.000131379,-0.000472689,-0.00102973,0.000314544,-0.00110053,0.000270544,-0.00173179,0.000687674,-0.000071565,0.000715626,0.000513698,-0.000497409,-0.000578089,0.000821655,0.000436292,-0.000734728,-0.00112925,-0.000526151,-0.000207114,0.000320393,-0.000813718,0.0000838429,-0.000066303,-0.000011818,0.000644083,-0.000682633,-0.0000185247,0.000658004,-0.00109214,0.0000489362,-0.0007424,0.00132383,0.00131571,0.0014326,0.00112485,0.000788,-0.0000931909,0.000419128,0.000808679,-0.000924983,0.00128142,-0.00046603,0.00123771,-0.000383178,0.00106004,0.00071474,-0.00194014,-0.00139503,-0.000161754,0.00140092,-0.0000359979,-0.0000456438,0.00166824,-0.000680828,-0.00101185,0.000194662,0.00131511,0.0006663,0.0000764315,-0.000397818,-0.000845023,0.0000271519,0.000734041,-0.000612722,-0.000076863,0.00107158,0.00130728,0.00040716,-0.000191616,0.000637779,0.000748832,-0.0010853,-0.000359282,-0.000631131,-0.000026536,-0.00016962,0.000840047,-0.000415771,0.000249715,0.000819309,-0.0016274,0.000864438,-0.00104955,-0.000833697,0.000199068,-0.000636464,0.00103385,-0.00146444,0.000494866,-0.000747388,-0.000976409,0.00120455,0.000552037,-0.00106414,0.000385728,-0.00055989,0.000141856,0.00124781,-0.00123776,-0.0000545615,0.000871977,0.000574254,0.000125246,-0.0007645,-0.00141861,-0.000711526,-0.00118947,0.000202717,0.000138771,-0.0013475,0.0000165045,-0.0013322,-0.000246496,-0.000874795,-0.00014516,0.000306621,0.000825725,0.000207433,-0.0000716538,0.000768073,0.00000109415,-0.00154696,-0.000376491,0.000606953,0.000372637,-0.000159948,-0.000468072,0.000253321,0.000278649,-0.0010709,0.000223941,-0.000561408,-0.00101335,-0.000432064,0.000442564,0.000362751,-0.000643572,0.000810446,-0.00000335818,-0.0011032,-0.000462562,0.00111872,-0.0000384036,-0.000410718,0.000926332,0.000538917,-0.000646848,-0.000014008,-0.00176189,-0.000355392,-0.0000085469,-0.00129632,0.00185647,0.00120383,0.000943838,-0.000732335,0.000913155,0.00114788,-0.00134039,0.0011853,0.00143367,0.000618882,0.000210519,-0.000774774,0.000586916,0.000296078,0.000727866,-0.000275174,0.000317451,0.000896896,0.000366223,0.000184306,-0.000122058,0.00037301,0.00163864,-0.000917838,-0.00170223,0.00099448,0.000607762,0.000216104,-0.000579343,-0.00021322,0.000210271,0.00122917,-0.000038417,0.00113148,0.00146175,0.000410145,0.000151158,0.00122,0.00117347,0.000063449,-0.00121888,0.000528649,0.000890939,0.0011261,-0.000711145,0.000258015,0.000095177,0.0000167361,0.00164901,0.000756979,0.0012023,0.00038299,-0.000587755,-0.000605246,0.000499487,-0.000200722,-0.00168847,0.000756952,-0.00105369,-0.000455794,0.000388133,-0.00152164,0.00115261,0.000833395,0.0000887737,0.00110565,-0.000641417,0.000631118,0.0013575,-0.00148666,0.00105702,0.000427386,0.000363754,-0.000594689,-0.00169196,0.000308128,-0.000210503,0.000950012,0.000651129,0.000272591,-0.000432456,-0.00169216,-0.00155997,0.000115198,0.00111589,0.000944881,-0.0000251125,-0.00117443,0.00152737,-0.00104816,-0.00129401,-0.00119642,-0.000263219,0.000215165,-0.000853757,-0.000547985,-0.000985576,0.000204258,-0.000324595,-0.00126308,-0.00171163,0.000807454,0.000677714,0.0000699848,-0.000236724,-0.000422329,-0.00105955,0.000818449,0.00174315,0.000178382,-0.00119124,-0.00137103,-0.000477189,-0.000710044,0.000893218,0.00120815,0.000406185,-0.000578206,-0.000246682,0.00132984,0.000737254,-0.000522471,0.000765243,-0.000727439,0.000287666,-0.00102406,0.00028104,-0.0010721,0.000353081,0.00121435,-0.000124017,0.0000905482,0.0000669302,-0.0000183902,0.00141855,0.00026888,-0.000395494,-0.000415596,-0.0000265152,-0.000265057,-0.000332785,-0.00144411,0.00036931,-0.000347418,0.00139602,0.000204334,0.000428987,0.00082562,-0.00095224,-0.00145917,0.000747615,-0.00042249,0.00112696,0.000381873,0.00190111,-0.00156313,-0.000830449,-0.000543477,-0.000539528,0.00148326,-0.000184093,-0.00036223,0.000597317,0.000225444,-0.000642147,0.000459193,0.000496222,-0.00176234,-0.000373301,0.000717377,0.00133344,-0.00146935,0.00100478,-0.001291,0.0012425,0.000600512,0.000228293,-0.000704312,0.000715983,0.00184304,0.000249642,-0.000789709,0.00128766,-0.000436885,0.000717421,0.00152275,0.000487063,0.00000277682,-0.000275897,0.000593735,0.000203172,0.00199697,0.000630937,0.00000442162,-0.000906326,-0.00159563,-0.000688265,-0.00194293,0.00137479,-0.00123136,0.000941333,-0.00123772,0.0000266813,0.000296804,-0.000544584,-0.000885833,0.000358303,-0.000266394,-0.00140117,0.00030871,-0.000200781,-0.0000355469,0.000849495,-0.000582045,-0.000725097,-0.00139008,0.00054366,-0.000203816,0.000349304,-0.000686328,-0.000907678,0.000145352,0.00107121,0.0000730875,0.000104947,0.000520673,0.00138229,0.000465404,-0.000492989,-0.000493245,0.000361899,0.00106426,-0.000677845,-0.000708359,-0.00121142,0.000605303,0.00104585,-0.00140407,-0.00133432,0.000293299,-0.000891179,0.000371732,-0.000900097,0.000988281,-0.000646114,0.00175067,-0.0007522,-0.000246487,0.000853296,-0.000294349,0.000542638,-0.00041812,-0.000451981,-0.00125972,-0.000687952,0.00180586,0.00133013,0.00173058,-0.00160673,-0.000286491,-0.000583809,0.00090232,0.000761359,0.00087059,-0.00136311,-0.000481839,0.00130826,0.000272645,0.000364485,-0.00136773,0.000829364,0.000445845,-0.000121293,0.00143602,0.00100697,-0.000207228,0.000693075,-0.000489167,-0.0000676801,-0.000175081,0.000130427,0.000994084,-0.000246764,0.0011654,0.000119769,-0.000605841,-0.000650611,-0.000215701,-0.000766936,-0.000478123,-0.000968452,-0.00128135,0.000954675,0.000543884,-0.00137102,0.0010613,-0.000165401,0.00014716,0.00105336,0.000135388,0.000570212,0.000254812,0.00157157,0.000390211,-0.000372421,0.00128445,0.000307198,-0.000101687,-0.00124361,-0.000632554,-0.000656101,0.000876854,0.000704664,-0.00129533,-0.000769698,0.000687303,0.00105071,0.000250207,-0.00199666,-0.00128068,0.00171826,0.0000104519,0.000433111,0.00168187,0.000798044,-0.00068512,-0.000786129,-0.000955945,0.000477474,-0.000202916,0.000304624,0.00129457,-0.000156293,0.0000480954,-0.00000271659,0.000257432,0.00162938,-0.00198472,-0.000372577,-0.000730933,0.000615462,-0.000353681,0.00055135,0.00146122,-0.00182068,0.0000125863,0.00116697,-0.000471812,-0.0014497,0.000247718,0.000755185,0.000513141,-0.00126959,-0.000780815,0.00109437,-0.000643421,-0.000463173,0.000311569,-0.000163455,-0.0000567492,0.000713644,-0.0011079,-0.00135956,0.000528606,-0.000211181,-0.00071056,0.000195223,-0.0000633729,0.000527921,0.000401769,0.000269773,0.00101391,-0.0013942,0.000998212,-0.000482461,-0.000559141,0.000520704,-0.0017023,-0.000508234,-0.00173481,-0.00081505,0.0000773451,-0.000337329,-0.00135754,-0.000385247,-0.000100155,0.00154698,0.0000827084,-0.000173757,-0.000193406,0.00147057,0.00128592,-0.00079332,-0.000668148,-0.00187839,-0.00125156,-0.00181461,0.00134044,-0.0000713728,-0.000515426,-0.000127606,-0.0000214274,-0.0000620023,0.0000524838,0.000112674,-0.00139534,-0.000020889,-0.000341175,-0.00012268,-0.00147527,0.000989377,0.00144799,-0.000340496,0.00115141,-0.000477846,-0.000369167,0.0000907474,-0.000884911,-0.000715599,-0.000390869,-0.000965633,-0.000664181,-0.000062331,0.00082491,0.0000987527,0.00119715,0.00110529,0.000804667,-0.000201198,0.00104551,-0.000728525,-0.000619836,-0.000197288,-0.00100485,-0.00131814,-0.000527642,-0.0000309032,-0.000468114,0.000750457,0.000341645,-0.00091758,0.000500443,-0.00137282,0.00133485,0.0000647138,-0.00000493365,-0.00114069,-0.000733751,-0.000370477,-0.00115095,-0.000353218,-0.00142102,-0.00114414,0.000307656,0.00120385,-0.000592957,-0.000394065,-0.000133329,0.00051333,0.000102149,-0.000205176,-0.000498192,-0.00171479,0.000404605,0.00103795,0.0013265,0.000681473,-0.0000495511,0.000306852,-0.000260057,0.000544611,-0.00110687,-0.000155605,0.0000944888,-0.0000913899,0.0000675573,-0.000385634,-0.000506258,0.00088886,-0.000441065,0.00157469,0.000890979,0.0012886,-0.000024363,0.000270301,0.000839581,-0.00130357,0.000165595,0.00108776,0.000549453,0.000122094,0.000385301,0.00103725,0.000190272,0.00110488,-0.000693002,-0.000891976,-0.00111151,0.000738899,0.000137712,0.000280681,0.000544462,-0.0000269395,0.00111951,0.000521762,0.000982846,0.000817772,0.00158682,-0.000184066,-0.000354684,0.00110143,0.000396352,-0.00174857,-0.00049454,-0.000233365,0.000229734,-0.000514977,-0.00126978,-0.000545221,-0.00129169,-0.0000997739,-0.0000184074,0.000962247,0.000824207,-0.00115278,-0.000351444,0.0016127,-0.00101115,-0.000527503,-0.000342822,0.00131143,-0.000078669,0.000909662,0.0000675657,0.0011493,0.000118625,0.00123277,0.00100709,-0.00189578,-0.0000245245,0.000936591,0.000914167,0.000543838,0.000829643,0.000360082,0.000374473,-0.00105467,0.00040675,0.000640899,0.0000611399,-0.000670982,-0.000390117,-0.000350498,0.00145223,0.00149511,0.000152287,-0.00144546,0.000795932,-0.00138653,-0.000202733,-0.000608306,0.0016028,-0.000971227,0.000802969,-0.000142111,0.000420497,-0.00114105,0.000794612,0.000714615,0.0000926347,0.0000733936,-0.00131917,-0.000771679,0.0012677,-0.000142896,0.0000172872,-0.000785425,0.000344442,-0.000313792,-0.00114732,0.00108,0.000675714,0.00188908,0.000530984,-0.000332925,-0.0000417673,0.000261863,-0.000254857,-0.000738005,-0.0000909124,-0.00136526,0.000669771,-0.000739097,0.000540088,-0.00131763,-0.00114492,-0.000581581,0.000218814,-0.0001163,0.0000352851,-0.00019784,0.00193881,0.000293732,0.0000404308,-0.000287982,-0.00101974,0.00106289,-0.000311859,-0.00154077,0.000647439,-0.000519463,-0.00161482,-0.000266345,-0.000302583,0.000790605,0.0000691638,0.000427521,-0.000902857,-0.000626616,-0.000680182,-0.0007947,-0.000340464,0.00100032,0.000834185,0.00103689,0.000306901,-0.000699,-0.00110655,-0.000799575,0.0019455,0.000594613,0.000655318,0.00183307,0.00113068,0.000985537,-0.00155661,0.000331506,-0.000305611,-0.000409875,0.00182546,-0.000297013,-0.000891118,-0.00089259,0.00128668,0.00080374,-0.00136218,0.000304723,-0.000549113,-0.00153944,0.000156072,0.000749411,0.000288915,-0.000386465,-0.000403354,0.00197693,0.000296408,0.000689316,0.000646139,-0.000238397,0.00184486,0.00117137,0.000115299,-0.000576186,0.000592849,-0.00118953,0.00140964,0.000403923,0.000514369,0.000412289,0.00128688,0.000676481,0.0000402985,-0.0000451613,-0.000463253,-0.00141443,-0.00000672497,-0.00143324,0.000204201,-0.000568028,0.000155704,-0.00141185,0.000905164,-0.000717252,0.00185039,-0.00000650478,-0.000428804,0.000357104,-0.000885472,-0.0000613653,0.000690895,-0.000879984,-0.00159291,0.000198644,0.00111581,-0.000407826,-0.000607368,0.000349474,0.000252631,0.000125876,0.000265397,0.00040013,0.00108653,-0.000626394,0.00168198,0.000195712,-0.000347259,-0.00110892,-0.000497256,0.000572394,0.00137763,-0.000211163,0.00109401,-0.0000537874,-0.00117542,0.000193424,0.000745036,0.000649148,0.000327507,0.000966098,0.000351775,-0.00111368,-0.00000815125,-0.000686647,-0.00000502774,0.00138997,0.000304236,0.00105909,0.0001128,0.00129319,-0.000472,0.000119775,-0.000109012,-0.00034944,-0.000207528,0.00016755,0.00155369,-0.0000210417,-0.000432414,0.0000141953,-0.000169838,-0.00051631,0.00166006,-0.00026223,-0.000661263,-0.000249651,0.0002931,-0.00026869,0.00131059,0.000194814,-0.000172901,0.00171096,0.000568432,-0.0012251,-0.0003225,-0.00100013,0.000164178,0.0000851436,-0.000193697,-0.0000482061,-0.000507625,-0.00135829,-0.000533449,-0.000608175,-0.0000147373,-0.000705985,0.0000948006,-0.000324078,0.00139999,-0.00132568,-0.000706733,0.0000555104,0.00189271,0.000668492,0.0014735,0.00109529,-0.000215741,0.00046804,-0.000563229,0.000166546,0.000102571,-0.0010023,-0.000518423,0.0000820853,-0.0000394002,-0.000660557,-0.00118199,-0.000719021,-0.000685169,0.0011513,-0.00158019,-0.000580896,-0.000384513,0.00111027,-0.000365475,0.000829105,0.000521565,0.00115513,0.0000734939,0.00058919,0.000334494,0.000853478,-0.000596576,0.00113175,-0.000601095,0.00115752,0.0015377,-0.000546143,0.00101732,-0.000485908,0.000611659,-0.000442799,0.000237085,0.000283023,0.000127135,-0.000177415,0.000227517,-0.000457824,0.000846745,0.000206144,-0.0013838,0.000262888,0.00021331,-0.000724611,-0.00164149,0.00102928,0.00029595,0.000280375,-0.0000189518,-0.000506882,0.000410031,0.00101062,0.000837332,0.0000943077,-0.000839207,0.000919561,0.00164463,0.000816018,-0.00106852,-0.0000144051,0.00067476,-0.000695347,0.000198525,-0.000378907,0.000182786,-0.00143567,-0.00166393,0.000444677,0.000828359,0.00112498,0.000682225,-0.00118513,0.000430071,0.000578832,0.000110367,-0.000401137,0.000460303,-0.000826508,0.000360862,-0.000539331,-0.0000167744,0.000271052,-0.00106048,0.000870803,0.000818926,-0.00016035,-0.00117284,0.00163059,0.00130999,0.00097613,0.000660847,0.00130705,0.00191363,0.000465223,0.000174551,0.000195407,-0.00121906,0.000385689,-0.00125224,0.000480898,-0.000900672,-0.000127625,-0.000154365,-0.00125916,0.000220653,-0.00197619,0.000243178,0.00119612,-0.000373803,-0.000765995,-0.00141596,-0.00181343,0.000792329,0.000158429,-0.000718414,0.000674546,-0.00181108,-0.00034066,-0.00170283,-0.00074864,-0.000760241,-0.0011983,-0.00079975,-0.000189572,0.00157348,0.00111234,-0.0000619229,0.0000881863,0.00117599,-0.000561843,-0.000032105,0.000680275,-0.000834571,-0.000372857,0.00013182,0.000788398,-0.0000958745,-0.000515918,0.000836191,-0.000958927,0.00129856,0.0000972146,0.000152052,0.000373722,-0.000658974,0.000722693,-0.000250608,-0.000101787,0.000786371,0.000425315,0.0000674397,-0.000500511,0.000262162,-0.0000761867,0.00045625,-0.000561497,-0.00128136,0.00102715,-0.000604677,0.000342435,-0.00133902,-0.00118701,0.00115674,-0.000472417,0.00107125,-0.000679028,-0.00199634,0.000385639,0.00149323,-0.000764161,0.000476147,-0.00121089,-0.000937854,0.000156183,0.00116821,0.000232785,0.00182365,0.000304607,-0.00122216,-0.000294644,-0.0000936795,0.000205076,0.000660672,-0.00000920632,0.000607792,0.000145483,-0.000820456,0.000105339,-0.00138399,-0.000139123,0.000529957,0.00130582,0.000217465,0.000576953,-0.000461298,0.000249988,-0.00152079,0.000878563,-0.0009547,-0.000216939,0.0000436908,-0.000636546,-0.000116848,-0.00060156,-0.00190289,0.00083026,-0.000214797,0.000420474,-0.000222832,0.000580258,0.0000527409,-0.000317945,-0.00137568,-0.0000825005,0.00133107,-0.0017628,-0.000124188,-0.00176217,0.000338583,0.000738155,-0.000359773,-0.000425157,0.00000381183,-0.000312962,0.000347885,-0.00105434,0.00000496134,0.000449337,-0.000113635,-0.000209486,-0.00074006,-0.000537762,0.00125915,-0.00197577,-0.00045607,0.000801687,-0.000887325,-0.00175533,0.00137619,-0.0000613076,-0.000848965,-0.00172542,0.000453987,0.000202095,-0.000212642,-0.00041181,0.000317205,0.000488017,0.00131804,-0.0000230657,-0.000527623,-0.000145378,-0.00099574,-0.00041684,-0.0010976,0.00119836,0.000671263,-0.00136153,-0.00157937,-0.000217204,-0.0000614119,-0.000646924,0.000106328,-0.000254391,0.00153176,-0.000198419,-0.00160604,0.0000528972,-0.00124327,0.00067288,-0.000598487,0.000790586,-0.000331787,0.000887662,-0.000751262,-0.000148593,0.00132589,-0.00141748,0.0017111,0.00134562,0.00128068,-0.00140415,-0.000765426,0.000463174,0.000137954,0.0000530601,-0.000036188,-0.00162283,0.000936654,-0.00000520555,0.00170876,0.0012696,0.000837271,0.00109699,-0.000300746,0.000147785,0.000878256,0.000228096,0.000353954,-0.00066568,-0.000119928,-0.00194437,-0.0016217,0.00166377,-0.00101772,-0.000787262,-0.000680647,0.000988754,-0.00113593,-0.00150042,-0.000199425,-0.00146946,0.000344631,-0.00091908,0.000727849,0.000446769,0.00110464,0.000168707,-0.000323545,0.000101194,0.000733136,-0.000432461,-0.000373709,0.00015354,0.00172559,0.00187587,0.000165498,-0.00105589,0.00117664,0.000216774,-0.000905885,0.000511637,0.000198325,-0.000142439,0.00142738,0.000858884,0.0000870345,0.00112718,-0.000592544,-0.000423263,-0.000731662,0.00133676,0.0000138418,-0.000936174,0.000551732,-0.000931486,-0.000697107,0.000188385,0.000856435,-0.000756726,-0.00174546,0.000553801,-0.000574227,0.00103209,0.00105381,-0.00103138,-0.00142384,-0.00019701,0.000551268,-0.00146731,0.000493154,0.000614613,0.0000434379,0.000226491,-0.000840528,0.000158777,-0.000340775,-0.000177498,0.000532151,0.000559289,0.000836732,-0.000276556,-0.000491263,-0.0000698971,-0.000638822,-0.00135095,-0.000724506,-0.0017784,-0.000579911,-0.000446844,-0.000609038,0.000192432,0.00103495,-0.00056949,-0.00164318,0.000944289,0.000723383,0.00156051,-0.00101799,-0.00120792,0.00101899,-0.0010529,-0.000500201,0.000414723,-0.000581412,-0.0010348,0.000870606,-0.000075396,0.00026405,0.000167778,-0.00132336,0.000178828,-0.00179406,0.000979547,0.0000758297,-0.00181941,-0.0004959,-0.000890529,0.000258521,-0.0016128,0.00140317,-0.000378791,-0.000209604,0.000196608,0.000635951,0.000113969,-0.00188167,-0.0000385945,-0.00128164,0.000177247,0.000343773,0.00138486,-0.000288546,-0.00198591,-0.000712219,-0.000476634,0.0000692192,-0.0014753,-0.000762969,-0.000490088,-0.000231497,0.000460567,0.000603921,0.000934681,-0.00113036,-0.000495621,0.00089834,-0.000494167,-0.000896765,-0.000212621,0.000341949,0.00104188,-0.00000797356,0.000479886,-0.000257154,-0.00117925,-0.000435011,0.000430338,-0.00128544,0.00160979,0.000845325,0.00105812,-0.000480987,-0.000289352,-0.000404508,0.00103555,-0.000488947,-0.00058018,0.000202792,-0.00103236,0.00146728,0.000490729,-0.00184861,-0.000283356,-0.00153792,0.000473989,0.00106829,-0.0011206,-0.00091716,-0.000327085,-0.000323221,0.000667246,0.000159766,0.00027947,-0.000128004,-0.000405272,-0.000308892,0.000659043,0.000530202,-0.00186044,-0.000109572,-0.000202726,-0.000776114,0.00178043,0.000857597,-0.000543157,0.000989968,-0.000822749,-0.000627246,0.00113506,0.000000954976,-0.000817976,-0.00102409,0.000731815,0.00083918,-0.00166528,0.00177531,0.000756218,-0.00187935,0.0012358,0.0010262,-0.000639803,0.000604895,0.00117672,0.000915022,0.00113535,0.000536723,0.00120249,0.000281991,-0.000444085,-0.00059919,-0.000516639,0.000966158,0.000690779,0.000634464,0.00132654,0.000888163,-0.000653482,-0.000428467,0.000202332,-0.000132838,0.00077706,0.000625502,0.00122621,0.00139404,-0.000301421,-0.000289323,-0.0012246,0.00109786,0.000457668,-0.0000986718,-0.00163628,0.000591118,-0.000138025,-0.000165118,0.0015623,-0.00199093,-0.0011478,-0.000482878,0.000559206,0.000849385,-0.0017038,-0.0000607913,0.000681872,-0.00113894,0.000308994,0.000865334,0.000819327,-0.000315685,-0.00067244,0.000775974,-0.000684996,-0.000664496,-0.00163461,-0.00191461,-0.000121327,-0.000155106,-0.000689665,-0.00149102,-0.000159793,-0.000709631,0.000900059,0.000797759,0.0015728,-0.000691701,0.000513342,-0.000126837,0.00122955,0.000223469,0.000129051,0.00161355,0.000237862,0.00158262,-0.00144019,-0.000474407,-0.000162169,-0.000799128,0.000642682,-0.000124351,0.000797156,0.00116908,-0.0000108501,-0.000662247,-0.000683781,-0.0013605,-0.00185936,0.000490786,0.000399857,0.00110658,-0.000137188,-0.000321904,-0.00156653,-0.000801979,0.00127473,0.00146742,0.000492542,0.00127639,0.000191537,-0.0017116,-0.00146928,0.000417903,-0.00185175,0.000215787,-0.000434515,-0.000172753,-0.00081271,-0.00099971,-0.00104575,0.00051593,0.000219034,0.000676299,0.000191331,-0.000114705,-0.0000815407,0.000923674,-0.0000263909,-0.0000844693,-0.00196235,0.00152456,0.00146476,-0.00130575,-0.00168984,-0.00122903,0.000936701,0.00113441,0.00138318,-0.00158507,0.0010316,-0.0000470909,0.000131508,0.000585311,0.00149533,0.000456218,-0.00163088,0.000194937,0.000790518,0.000723047,-0.00093686,-0.000334648,0.000221846,-0.000500731,0.0000284936,0.000356909,-0.00042733,-0.000153946,-0.00183828,-0.000391975,0.000829723,-0.0000402172,-0.000424118,0.00138794,-0.00156792,-0.000452795,0.000977296,-0.000344881,-0.000673458,-0.00024836,0.000256197,-0.000424619,-0.00103478,0.000623287,-0.00130331,0.000869641,-0.00188975,-0.000306039,-0.000230257,0.000886442,-0.00142024,0.00055689,-0.000357737,-0.000133723,-0.00116967,-0.00026622,-0.00130193,-0.000607729,-0.000596017,-0.000197219,0.00142503,0.000689041,-0.000752317,-0.000277752,0.00143779,0.000388053,0.000856829,0.000391187,-0.00163869,0.00146586,0.000834865,-0.00131326,-0.00105076,-0.0000729599,0.000337112,0.00163422,0.000150369,-0.000125973,0.0000201547,0.0000794395,-0.000582057,0.00185572,0.00109725,-0.00183246,-0.000168812,-0.0000993179,0.00147113,0.0000541772,0.000535882,-0.000509508,0.000865246,0.000572556,0.000675814,0.00127622,0.000612851,0.0000352717,0.0017068,0.00129173,0.000510208,0.000225057,0.00131304,-0.000414234,-0.00051037,-0.00074791,-0.000959379,0.00134233,-0.000390692,-0.000704675,-0.00126919,-0.000801144,0.000127407,-0.000401147,-0.00145648,0.000667777,0.000264538,0.00183469,-0.00103774,0.000230293,-0.000868263,-0.00052612,-0.000182058,-0.000395337,-0.0000113347,-0.000167268,-0.000743084,0.00170382,0.000356301,0.000997937,0.000265366,0.000932683,-0.00107953,0.000164098,-0.000135418,0.000426706,0.00149141,-0.000338482,0.000872666,-0.000935409,-0.000751422,0.000455872,0.000552427,-0.000199924,-0.000500709,-0.000737566,-0.0000694708,0.000782672,-0.000586479,0.00137206,0.000451206,-0.0000847094,-0.000190593,0.000612043,0.000400899,0.000209991,-0.00131483,0.000077784,0.000681518,0.00139331,-0.000605101,-0.0000265356,0.00109815,0.000337436,0.00124317,-0.000625724,-0.000071811,-0.000944082,0.00081943,-0.000579081,-0.00105556,-0.000336412,-0.000599124,0.00140532,-0.000615776,-0.000747628,-0.000276184,-0.00124923,0.000741601,0.000608988,-0.00104854,0.000108387,0.000632106,-0.001377,-0.000256606,-0.000218401,0.00136649,0.000353603,-0.000580004,-0.0012085,0.00125278,-0.0001871,-0.00106956,0.000342758,0.000340154,0.00081265,-0.00139186,-0.000474718,-0.00073386,-0.000332311,-0.00176291,-0.000294476,0.00171383,0.000900915,0.00116386,-0.0000407572,0.0000319591,0.00052598,-0.00149999,0.0000405803,-0.00149192,0.000571898,-0.0000114666,0.000917214,0.00089122,0.000751888,0.000270452,-0.000195001,0.000504884,-0.00047851,-0.001386,-0.000932423,-0.000746767,0.000269773,0.00114406,-0.0000998507,-0.000126252,0.00015319,0.00104101,-0.00101721,-0.00022469,-0.0000460088,-0.0000297357,0.000964557,0.00072388,0.000684404,0.000287399,0.000267846,0.00071344,0.000325277,-0.00152639,0.000714314,0.000717735,0.00104141,-0.000803354,0.00162244,-0.0000550423,0.000577201,-0.000858173,0.000141732,0.000653563,0.000132162,-0.00144232,0.000420498,0.00100801,0.000873994,0.000422117,0.00040275,0.000177472,0.000233084,0.000980021,0.000747146,0.000425422,-0.000586484,-0.00100779,0.00128541,-0.00157494,-0.00169785,0.00020274,0.000384708,-0.000224195,0.000667968,0.000465863,0.00171667,0.000872054,0.00137791,0.00033489,0.00126405,0.000210445,-0.000980522,-0.000248283,-0.0000344193,0.000788248,0.000649724,-0.000631358,-0.00106026,-0.000281862,0.0011643,-0.00105293,0.000791428,-0.00192865,-0.00110641,-0.000497396,0.000377691,-0.000623877,0.000303352,-0.00037529,-0.00099049,-0.000806658,0.000129827,-0.000805928,0.000305933,0.000188884,-0.000922714,-0.0011131,-0.000607967,-0.00123972,0.000394611,-0.000570618,-0.000917079,-0.000844643,0.00084522,0.00120415,0.00194736,-0.000322311,0.000629106,0.00170432,-0.000417265,0.00111989,-0.000058676,0.00112505,0.000745276,0.000582083,0.00116585,-0.000579957,-0.000581476,0.000447053,0.00000467427,0.000998823,-0.000291533,-0.00166017,-0.000232399,-0.00021604,-0.000203657,0.000207617,-0.00165636,-0.000812487,0.00184466,-0.00191152,0.000179164,-0.000754653,-0.0019156,0.00165307,-0.000258285,0.000575623,0.000177699,0.000584719,-0.00123754,0.000291439,-0.000377688,-0.000626593,0.0007735,-0.00139477,-0.000831778,0.00104171,0.000577313,0.000138264,0.000153967,0.000776327,0.0000135649,0.000412395,0.0007484,-0.000179707,-0.000707908,0.00150716,0.000747815,0.00166191,0.00107142,0.00102277,-0.000944291,0.0000635744,0.000881904,0.00114816,0.00115602,0.000620958,0.000575325,-0.000492137,-0.000094446,0.000928883,-0.000491708,-0.00143053,0.000948873,0.0000800113,0.000773923,0.000214864,0.0000151234,0.000690331,0.00118549,0.000593861,-0.00145269,0.00123073,-0.0000618662,-0.000156072,0.00121778,-0.00028543,0.001085,0.00178124,0.000326253,0.00031101,-0.000996804,0.000664127,0.000158086,0.00034673,-0.000513681,0.000211941,0.000330179,-0.000196905,-0.00151895,-0.00118773,-0.000890508,0.00055831,-0.000228517,-0.000643073,-0.00125831,0.0000313996,-0.00166294,0.000746105,-0.000223412,0.00123586,-0.0000904346,0.00089889,-0.00000411974,-0.00124851,0.0000829108,-0.00094009,-0.000571096,0.000660191,0.00169751,-0.00198313,0.00015874,0.000444874,-0.00182807,0.00168734,-0.000216583,0.000615531,0.000227721,-0.00146039,0.00142546,0.000111865,0.00106647,-0.000473734,-0.000335767,-0.0000596175,-0.000104571,-0.00139321,0.0010144,0.0005572,0.000521626,-0.00156186,-0.000990747,0.000728013,0.00118194,-0.00172176,0.000911361,0.00180919,-0.000502271,-0.0000028162,0.000591965,-0.0000862684,-0.000846311,-0.000873672,-0.000282826,0.000169244,-0.000550781,-0.000425953,-0.00167691,0.00138666,-0.000318733,0.000995153,0.000450162,-0.000915585,-0.000642828,0.000417842,-0.000285829,0.00109445,0.000997317,-0.000301746,-0.000463695,-0.00184048,-0.000478417,0.000475132,-0.0000154338,0.0010671,0.00148825,-0.00105596,-0.00112434,-0.000660729,-0.000769683,0.000158718,0.00193225,-0.0000901079,0.000326364,-0.00036871,0.00096305,0.000303451,0.000112784,-0.0000512894,-0.00112232,0.000898595,0.000692881,-0.0000858528,-0.000841828,0.000351574,-0.00114405,0.000119964,0.00158025,-0.00130685,0.0015235,0.000124668,0.00170428,0.000838648,-0.000312139,0.000228055,-0.000898027,0.000896749,0.00156337,0.001306,0.00144219,0.0000200656,-0.00000711471,0.0000969204,-0.000809394,0.00160191,0.0000358877,-0.00132283,-0.00188435,0.000410419,-0.000382497,-0.00198985,0.000514256,-0.000352727,-0.0000633149,-0.000105415,0.00122459,0.0000638783,0.000461293,-0.000809332,-0.000835755,0.00106869,0.0000275176,-0.000648805,0.000529068,0.000923825,0.000378463,-0.000850551,0.000220863,-0.000377158,0.00029906,0.000614893,-0.00152775,-0.00133945,-0.000853789,-0.0012939,-0.000023909,0.00038736,0.000933828,-0.000385983,-0.000100812,0.00150135,0.00125698,-0.000656461,0.00105872,-0.0000512526,-0.000699983,-0.000737413,-0.000460363,-0.000393773,0.00126744,0.000368249,-0.000707782,0.000809405,0.00146262,-0.00146948,0.00122829,0.00000837047,0.000120718,-0.00115025,0.000910861,-0.000627958,-0.000894118,-0.000693426,-0.0000337093,0.000500796,-0.000954105,-0.000620818,0.000830238,-0.00107495,-0.00150868,-0.000760857,-0.0000513719,0.000776119,-0.000892311,0.00116812,0.000987506,-0.000976825,-0.000530453,-0.000341008,-0.00180594,0.0000232828,-0.000918878,-0.000173487,0.00132868,0.000636936,-0.000781243,0.000637363,0.000556582,0.00169164,0.00128458,0.000491276,0.000858622,0.00029701,-0.000471733,0.000533182,0.000060331,-0.00012267,0.000135196,-0.000439163,-0.00135428,-0.000338152,0.0019551,-0.000190188,-0.00054284,0.000758005,0.00047104,-0.000386031,-0.000966087,0.00014503,0.00119697,-0.000476424,0.000984976,-0.000115729,-0.000810881,-0.000131474,0.000434488,0.000103205,-0.000716192,0.00109848,-0.000969435,-0.00016364,-0.00129959,0.000162043,0.000527734,0.0014968,-0.00189977,0.00151067,0.000521177,0.000377817,-0.00103916,-0.00060962,-0.000925261,-0.000569145,0.000167126,0.00016375,-0.00145022,0.000184995,0.000688953,0.000133444,0.000799639,0.00024318,-0.00123004,-0.000586585,0.00171408,-0.000596794,0.000521096,-0.0011105,0.000034173,-0.00136267,0.000537804,-0.000623235,0.000545902,-0.00132186,0.000709965,-0.000101034,0.000654577,-0.000199019,0.000757201,-0.000242022,-0.000351306,0.000684518,-0.00141644,0.000018461,0.000439018,0.001494,-0.000805213,0.00170169,0.000266833,0.000408478,0.000257704,0.001079,0.00157547,-0.00134507,-0.000770393,-0.000408903,0.00106496,0.000589133,0.00007388,-0.00109491,0.000914005,0.0000140588,-0.0000505991,-0.0000829942,-0.00145316,-0.000884505,0.000841138,-0.00010288,0.00142435,0.00180712,0.0000218122,-0.00109588,-0.00101458,-0.000683629,-0.00123302,0.0000868031,0.00129206,-0.000484961,0.00163242,-0.00010852,-0.0000309027,-0.0019838,0.00042234,0.00061345,0.00046748,-0.00116812,0.00163968,0.000915049,0.00134339,-0.000623617,0.0000693791,-0.00103196,-0.000132082,-0.000679393,0.000137416,-0.000513604,0.0000353812,-0.000595892,0.00167782,0.000697033,-0.0014334,-0.00162469,0.00120881,-0.000680819,0.000704334,0.00174101,-0.00072861,-0.000235765,-0.0000423474,-0.000990515,0.000136969,-0.00103941,-0.00066146,-0.000422091,-0.00119102,0.00148917,0.00103548,0.000918873,-0.0000916673,-0.000651643,-0.000311017,0.00161515,0.000404591,-0.000280217,-0.000401233,-0.00026291,-0.00120639,-0.00109483,-0.000698872,-0.000917465,-0.000163268,0.00018368,0.000486602,-0.00135604,0.000246836,-0.00065195,-0.0000145485,0.000457368,0.000794791,-0.000275326,-0.0000404395,-0.000702624,0.000185064,-0.0000663649,-0.000715284,-0.00138397,0.000517631,-0.000617068,-0.000056325,-0.000436929,-0.000820163,0.000660975,0.00109012,-0.000321021,0.000191756,-0.000604218,-0.000998815,0.000367891,0.000553954,-0.000337617,0.00191516,0.00039766,-0.000231796,-0.00102788,-0.000554286,-0.000448954,0.000603025,-0.000726366,0.000101564,0.00125273,0.000523287,-0.000131292,-0.00106357,-0.000223265,-0.000810158,0.00173914,-0.00046421,0.000335458,0.000878296,-0.000508877,0.00112034,0.000903518,-0.00026147,0.000655714,-0.000781166,0.00175404,-0.00182492,-0.000000807279,0.000616612,-0.000152079,-0.000117429,0.00136971,-0.000182873,-0.00108822,0.0013191,-0.000597573,0.000100028,-0.0016813,0.00100304,-0.000200713,-0.000684366,-0.000478257,0.00106545,0.000233654,-0.00153367,0.000133563,-0.000675624,0.00167053,-0.000758999,-0.00180556,-0.00111022,-0.00018326,-0.0000201224,-0.000606589,0.000880183,-0.000287112,-0.0000554531,-0.00114833,-0.00115771,-0.000168101,0.000941385,-0.000100538,-0.00100071,0.000576673,0.00151221,0.000234656,0.00048289,0.000664663,-0.000918304,-0.000249712,0.00127356,0.000250703,-0.000629836,0.000610123,-0.00114854,0.000791458,0.000189924,0.0000586069,-0.00132855,-0.000930842,-0.00162024,0.000201701,-0.0000248748,-0.000522702,-0.00068461,-0.00185148,0.00195562,-0.000136718,-0.00130339,0.00046013,-0.000436582,-0.0000310673,0.000318679,0.000387705,-0.000077786,-0.00123982,-0.00061049,-0.0006223,-0.000364537,-0.000594575,-0.00162714,0.000631552,-0.00085853,0.000051058,0.000325664,-0.00110964,-0.000850605,-0.000980117,0.000212289,-0.000979211,-0.00091192,0.000606142,0.0011311,-0.00018467,0.000314335,-0.000625089,0.00154583,-0.00116169,-0.000098189,0.000353125,-0.000581432,0.000260714,0.000204423,-0.00182731,0.00146954,0.00111073,0.000941453,-0.00114926,0.00153212,0.00167377,0.000361507,0.000454696,-0.000729378,-0.00117281,0.00135714,-0.000855218,0.000634889,-0.00029611,0.000782123,-0.000806695,0.00152511,0.00070917,0.00173505,-0.000903799,-0.000996419,0.000177817,-0.00153604,-0.00102316,0.000607947,0.000168447,0.0000443626,0.000780039,-0.000151349,0.000273278,0.000386984,0.00119731,-0.000745259,-0.00105668,0.0012445,0.000600829,0.000652814,-0.000337926,0.00150126,-0.0011063,-0.0000211373,0.00173242,0.000736991,0.000757673,-0.000324569,-0.000986879,-0.000716319,-0.000277141,0.000273154,0.00165214,-0.000328855,0.000459333,-0.00134021,0.00194833,-0.000678525,0.000666502,-0.0000627609,-0.000648737,-0.000233839,-0.00112563,0.00189597,-0.000114213,0.000329775,0.00156099,-0.00136656,-0.000947407,0.00150734,-0.00137668,-0.000275181,0.00137168,0.000540967,-0.000734884,0.00160576,-0.000700885,-0.000655325,-0.000873329,-0.00012882,0.0000216957,0.000482043,0.00105837,-0.000152351,0.000686392,-0.0000222155,-0.000170144,-0.000727728,0.00117608,0.000719617,-0.00018589,-0.000474828,0.000830388,-0.00105233,0.000411852,0.0014488,0.000142224,-0.000280512,0.000477139,-0.00195479,0.00138224,0.000585845,0.0000402115,-0.000420252,0.000858502,0.000712032,0.000703943,0.00104502,-0.0000473053,0.00131982,-0.000636027,-0.0000324511,-0.00116786,0.0000914047,-0.00170021,-0.00061269,0.00133428,-0.00130072,0.00123221,-0.0012518,0.00129402,-0.000208805,0.00114634,0.000348376,-0.000324346,-0.000668437,0.00173191,0.00149424,0.00014457,-0.000505646,0.000155125,0.000912936,-0.0000363412,0.000408218,-0.000168362,0.00104714,-0.000228651,-0.000642016,0.000675426,0.000308125,-0.00158586,-0.000988733,0.000568317,-0.00102406,0.000943768,-0.000908936,0.000516958,-0.000512098,0.000384916,0.000596721,0.00129458,0.0000552411,-0.000528332,0.000336559,-0.00124409,-0.00145634,-0.000859582,0.0000252506,-0.000242063,-0.00130563,0.00192273,0.00190787,-0.00112568,0.00181178,-0.000301345,0.00121803,0.000379543,-0.000350218,-0.000550765,0.00021473,-0.000745941,-0.0000557084,0.000338337,0.000603474,0.000685579,0.000628856,0.00017725,-0.0015303,0.00173811,-0.000734592,-0.00161546,0.0000792043,-0.000644923,-0.0017206,0.000688294,-0.000934275,-0.000798884,0.000108957,0.000995145,0.00146456,0.000074139,0.000132795,-0.000178435,0.000813104,-0.0000616656,0.00115806,0.000440722,-0.000824036,0.00159327,0.000402526,0.000842837,-0.00110419,-0.00109482,0.00183244,-0.0000702979,0.0000443972,0.000740006,-0.00109157,-0.00152154,-0.000405885,0.000322719,0.00098301,0.00110077,0.00149254,-0.000396129,-0.00164954,-0.00000121585,-0.00182501,0.000815779,-0.000764843,0.000833353,-0.000208732,-0.0013266,0.001085,0.000138863,-0.000613836,-0.00034098,-0.00161316,-0.00106942,-0.00097214,0.00142291,0.000279535,-0.00174114,0.000730688,-0.000569229,0.000515409,-0.000913184,0.000816926,0.000550922,-0.00054653,0.000374796,0.000660005,0.0013726,0.000391429,-0.000130438,0.00107349,-0.000835644,-0.00072753,-0.0000600481,0.00157345,-0.00127913,0.00129257,-0.00124992,0.00073558,-0.000778833,0.000584319,-0.00179709,0.000782835,0.000581763,0.000171285,-0.00130539,-0.000929543,-0.00172123,0.00144649,0.000132832,0.000312227,0.0000771008,-0.00103391,0.000865514,-0.000661339,-0.000751528,0.000368027,0.000127339,0.00135966,0.0010501,0.00000866169,0.0014567,-0.00136328,0.000454275,-0.000244344,-0.000114828,-0.00057423,-0.000197763,-0.000598095,-0.000582545,0.000764002,-0.00108365,0.00157141,0.000501952,-0.00105388,0.000445202,0.00180052,-0.000267727,-0.000791298,-0.000976791,-0.0000250635,-0.000348298,-0.000541375,0.000461454,0.000794175,0.00185755,-0.00102717,-0.000252364,0.00133438,0.000793033,-0.0012503,0.000142903,-0.00115643,-0.000674148,-0.0000467423,0.000443354,-0.00105705,-0.000581705,0.000832561,0.000836305,0.000383932,0.00015777,-0.00110229,-0.000478986,0.00019786,-0.000267283,0.000801557,0.0000391327,0.000511887,-0.000439042,-0.00148681,-0.000370147,0.000719858,0.000466086,0.000440189,0.00117814,-0.000732392,0.00014229,-0.000193126,0.000107387,-0.0000184074,-0.000612091,0.00012339,0.000169336,0.0000771362,-0.00100128,0.000208875,0.000323585,-0.00163473,-0.00130138,-0.00134198,-0.0000408443,0.00107475,-0.000136432,-0.000986871,-0.000623634,0.000961366,-0.000568883,-0.00117501,0.00141346,0.000538964,-0.000504362,-0.0000493294,0.000248878,-0.0012807,-0.000691568,0.00133343,-0.000222173,0.000529877,-0.00102509,-0.00125096,-0.00103769,0.00144737,0.000928499,0.0013525,-0.000192017,0.0010641,-0.00077387,0.000327529,0.00113557,0.0000810137,0.000682058,0.000939055,0.00119769,0.000695319,0.000004454,0.00000791585,-0.00175048,0.000148769,-0.00139204,-0.000218616,0.00010658,-0.00167249,0.000576276,-0.00155756,-0.00094911,-0.00114735,-0.000266193,0.0000287388,0.000349097,0.000078196,-0.00144582,-0.00148511,0.00170506,-0.000397372,0.000250374,-0.0011094,-0.00107546,0.000781522,0.000545364,0.00116251,0.000846076,-0.000621097,-0.000106003,0.000679184,-0.000566989,-0.000716455,0.000592464,0.00135333,0.00180868,-0.000179298,0.0019958,-0.00027308,0.0000892189,0.0000280765,0.000659376,0.00135728,-0.000750159,-0.000948042,-0.00127146,0.000669073,-0.000570383,-0.000140824,-0.00026315,0.00108228,0.0000603913,0.000902851,0.00146021,0.000410996,0.000420142,-0.000803055,0.000664008,0.000363639,0.0000419015,-0.000191177,0.0000083131,0.000475638,0.000676729,-0.000943765,0.00083759,-0.000358434,-0.000835194,-0.00010729,-0.000154282,0.000346666,-0.0000481491,0.000331845,0.000788435,-0.000945131,-0.00135751,-0.000754271,-0.0000377347,-0.00121364,0.000594145,0.00139745,-0.000458391,-0.00153903,-0.000788667,0.000948956,0.000708612,0.000397765,0.000590769,0.0000923949,-0.0000578643,-0.000991584,-0.000896218,0.000490684,-0.0000821768,-0.00155112,-0.000693083,0.000351888,0.000933871,-0.000831719,0.00164199,-0.000490668,-0.000243391,0.00115458,-0.000205448,-0.00151766,-0.000536501,0.000668443,0.0000951995,-0.00066936,-0.000665631,-0.000105257,-0.000663862,-0.00169691,-0.00052475,0.000368794,0.000688599,-0.000863875,-0.000240037,0.000620261,0.000768537,0.000946015,0.00144381,0.00122006,-0.000811699,0.0000786374,0.000278186,0.000350728,-0.000836361,0.00158724,0.00127332,0.000425432,0.00178756,0.000991303,-0.000545676,-0.00135197,0.000443718,-0.00127946,-0.000914979,-0.00129041,-0.00106848,0.0000874809,-0.000230466,-0.000307472,-0.000786899,-0.000912665,-0.0000125199,-0.000239898,0.00122751,-0.0010216,0.000386955,-0.000943037,-0.00014578,0.00113271,0.000760379,0.00112834,-0.00131424,0.0011779,-0.0012488,-0.00088635,-0.00090313,0.00111781,-0.000261467,-0.00139795,0.00107816,-0.00162638,0.00171048,0.00016384,-0.00132405,-0.000068029,-0.000527107,0.000772368,-0.000341853,0.000846001,0.000649433,0.000248394,0.000728319,0.00106221,-0.00120104,0.00166036,0.000580642,-0.0006361,-0.00142023,-0.000409479,0.00028304,-0.00155414,-0.000448988,-0.00178961,0.00101831,-0.00112991,0.000136429,0.0000364508,0.00115786,0.00187982,0.000545692,0.000547408,0.0012925,-0.000162669,-0.000658708,-0.0000169359,-0.0000388092,0.000840087,0.000206787,0.000598517,-0.00174803,0.00112215,-0.000215333,0.000138384,0.00110271,-0.00100113,0.000726638,-0.000205527,0.000337505,0.00130785,0.00049593,0.00168827,0.00056047,0.00123732,-0.0000906481,0.00127724,0.0010297,0.00189365,-0.000112129,0.00140626,0.000394381,-0.00172074,-0.000315299,-0.000832594,0.0000183249,0.000996044,-0.000660373,0.00100945,0.0000981722,-0.000702346,0.000228472,-0.000648312,-0.000686066,-0.000283532,0.000519309,0.00124245,0.000643665,0.000180163,0.000157591,0.00196959,-0.000723407,0.000989972,0.000421896,0.000610813,-0.000213516,-0.000858141,0.00143507,0.00042617,0.000721029,0.00120876,0.000229369,-0.000495263,0.00101874,-0.000938914,0.00101411,-0.00113004,0.00196997,-0.00146193,0.00104305,-0.000328508,-0.000417628,0.00124552,-0.000287923,-0.000357843,0.00120573,0.000326036,-0.00138273,-0.000263679,-0.00158505,-0.0010831,0.000137975,-0.000980206,-0.0000202597,0.0000231281,-0.000412393,0.0010851,-0.000906558,0.000801453,0.00196109,-0.00066566,-0.000768439,-0.000940372,0.00153089,-0.000436782,-0.00100501,0.00128228,-0.000676903,-0.000328391,-0.000520096,-0.000209707,-0.00160247,0.000774181,0.0000586903,0.0000493538,-0.000663734,0.00124815,0.000147929,-0.00100904,-0.000887416,0.000469223,0.000136652,0.000405744,0.0000597866,-0.0014215,-0.000748003,0.00119165,0.00069462,0.00111058,-0.000401187,-0.00108441,-0.000431919,0.00164216,-0.000478552,0.000857236,-0.000194478,-0.000629416,0.00104162,-0.000500183,-0.000377306,-0.00183175,0.001051,0.000824537,-0.000892749,0.000885003,-0.00104762,-0.000860279,0.000396728,-0.000259396,-0.00116603,0.000861805,-0.00032168,0.0001215,-0.000255151,-0.000337026,0.00012643,0.000219489,0.00011829,-0.0000731705,-0.00163692,-0.000404646,0.000761414,-0.000770575,0.0000806782,0.0000951042,-0.000503076,0.0016881,0.000498809,-0.0000267354,0.0000789362,-0.00116023,0.000119471,-0.000240665,-0.00149409,0.00131087,0.00121881,-0.000790119,0.00135216,0.00104451,0.000411191,0.0010943,-0.00193847,-0.00159153,0.00107968,0.00000794868,-0.00136038,-0.00013617,-0.000578984,-0.000288057,0.0014811,-0.000695982,-0.00181652,0.00141063,0.000267099,0.000660545,0.00180867,-0.00108181,0.000525885,-0.000744097,-0.00111905,0.000876786,0.000312923,-0.000921127,0.000110081,-0.00115895,-0.00110558,0.000367163,-0.000395776,0.000381472,0.000283351,-0.00146451,0.00121355,0.000261018,-0.000536652,-0.00035411,-0.000490975,-0.000945185,0.000710313,0.00115369,-0.0000416837,-0.000212686,0.000201782,0.000175163,-0.000491939,-0.00123302,-0.00104311,-0.000430077,-0.000380133,-0.000576586,0.000379758,0.00154505,0.000590419,-0.000696074,-0.000867994,0.000717283,-0.000243085,-0.000174937,-0.00116256,-0.000568947,-0.000498931,-0.000105818,-0.000762304,0.000546525,0.00046563,-0.000589198,0.001045,-0.000499771,-0.00179994,-0.00142787,-0.000353477,0.000279446,0.000249127,-0.00179773,0.00072488,-0.00141482,-0.000336944,-0.000513069,0.000266153,-0.000520329,0.0000339701,0.00108122,0.000915644,-0.00108095,-0.000524485,0.0000854543,0.000522763,0.000921407,-0.000400263,0.000554315,0.00102513,-0.00195637,0.000151307,-0.00186693,-0.0000979703,-0.00125864,-0.000101074,-0.000352422,-0.0000410197,0.00178983,0.000259194,-0.00147791,0.000239791,-0.000567894,-0.000637028,0.0000930114,-0.0000956615,-0.000527878,0.000917173,0.000092197,0.000480428,-0.0000872462,0.000210928,0.00125761,0.000671667,0.000234541,0.00105534,0.00176895,0.000970974,0.000377821,0.000869925,0.000420916,0.000716571,-0.000693841,-0.000792556,0.000712344,0.000525028,-0.00125059,0.00141417,-0.000971212,0.00188451,-0.000210777,-0.00172716,-0.000288278,0.000428977,0.00102572,-0.000541231,-0.00114403,-0.000825047,0.00147,-0.000920221,-0.000439217,0.00143901,0.000145017,-0.000873361,-0.0000279196,-0.00157225,-0.0000813775,-0.00115482,0.000599939,0.00016991,0.000159109,-0.000469298,0.00160732,0.0000248341,0.00151712,0.000183046,-0.0008891,-0.00198806,-0.00141663,0.000135903,0.000548693,0.000679699,0.000272878,0.000369093,0.000905121,-0.000829268,-0.00126009,-0.000106621,-0.00052729,0.0000573377,0.00070181,-0.000169995,-0.000558047,0.00126192,-0.000572713,-0.0012496,0.000221027,0.00145705,0.00140753,0.000360106,-0.000961753,-0.00128442,0.0006449,0.000543443,-0.000627483,0.00032834,-0.0000960698,0.000981676,0.00166672,-0.000077145,0.000611739,-0.000641083,0.000100078,-0.000226361,-0.000748153,-0.000961947,0.00101905,-0.000370275,0.000656034,0.000165626,-0.00071636,0.000316922,-0.00180786,0.000337602,0.000326012,0.000735168,-0.00136905,0.000197364,-0.000125102,-0.0005041,0.00147855,0.000254456,-0.000702037,-0.00025635,0.000885374,-0.00104272,0.00100422,0.0000644562,0.000201383,0.000760514,0.000906168,0.000405578,0.00113247,0.00029781,-0.000414627,0.000412126,0.000582467,0.0013709,-0.000741279,-0.0013861,0.0000303931,-0.00154736,0.000412736,0.0000972909,0.00149912,0.000663194,-0.00172688,0.000298382,0.000891928,0.000217385,0.000330133,-0.00186184,-0.000242217,0.000463659,0.000524375,0.000599542,-0.000234902,0.000307486,0.0000849776,-0.000195252,0.00132425,-0.00000309058,-0.00097057,0.000382662,-0.000351966,0.000690262,-0.00105284,-0.000753435,0.000645881,-0.000170759,-0.000415011,0.00122049,0.000264773,0.00145387,-0.0000341969,-0.000852492,0.000783016,0.00057324,0.000403258,-0.000953651,0.00105304,-0.000949206,0.000384096,-0.00105809,-0.000295705,0.000905184,-0.000877483,0.000563441,0.000079556,0.000549553,-0.000864941,0.000394112,-0.000652952,-0.00151364,-0.000240519,-0.00139437,0.000326499,-0.00160787,0.000200149,0.00134402,0.00096168,0.000727506,-0.000210441,0.000282735,-0.00151006,-0.0000274307,0.00188931,0.00146184,0.00163479,0.000628524,0.0000431304,-0.000728994,-0.000410466,0.000670602,-0.000464189,0.000703524,0.000607836,0.00104219,-0.00123474,0.000285991,-0.000701559,-0.00177876,-0.000160411,0.000821618,-0.000456834,-0.0015938,0.00112935,-0.00188265,0.000627034,-0.000103641,0.000785049,-0.000453362,0.00017177,0.00155237,-0.000378342,0.000304584,0.00172625,0.000100392,0.000255066,0.0000729655,0.00182527,-0.00158802,-0.000763545,-0.00114137,0.000650101,0.00185121,0.000321829,0.00088054,-0.000538285,0.0000741434,0.000268256,0.00196362,0.000894603,-0.000689958,-0.00066328,0.00137496,-0.000764731,-0.000353203,-0.000547083,0.00146116,-0.0000481612,-0.00188011,-0.000672524,-0.000903234,0.000883462,-0.000366268,0.000569295,0.000195114,0.00009146,-0.000185254,-0.00121078,0.000211812,-0.00165822,-0.000862385,-0.000427635,0.000436833,-0.000771605,-0.00197339,-0.000212398,0.000332669,-0.000272222,-0.000297948,0.000932738,-0.000743227,0.000149969,0.000279455,0.0000144956,0.000223142,0.000485828,-0.00147614,0.000259044,0.000920163,0.000837179,0.000495887,0.000129108,0.0011237,0.00137125,-0.000221029,0.000886383,0.0000840663,-0.000322165,0.000409649,0.000888322,0.00050441,0.000268925,0.000113579,0.000882121,0.000535996,-0.000738281,0.00130599,-0.00084508,-0.000109154,0.00101358,-0.000300408,0.000337634,0.000911048,0.000651863,0.000588209,0.0013579,0.000403891,-0.000238146,-0.00028919,-0.00181823,0.000985768,-0.000272013,-0.0000704991,0.00123367,0.0000417685,0.0000176931,0.000466115,-0.000137163,0.00113884,-0.00142704,0.00181996,-0.000447947,0.000662081,-0.000798366,0.000492935,-0.000905294,-0.00121522,-0.000401814,-0.00175104,-0.00100609,-0.000340016,0.000181776,-0.00158569,-0.000356177,-0.00124399,-0.000026441,-0.000374146,-0.000542821,-0.000537457,0.000932082,-0.00187366,0.00184242,-0.00053402,-0.0000893292,-0.000120516,0.000308187,0.000789646,-0.0000329432,0.000173095,0.000843413,-0.0000344258,0.00158028,-0.000476273,0.00042988,0.000420148,-0.000399298,-0.000673015,-0.0000305465,-0.00103189,-0.000227994,0.00179586,0.000459738,-0.00143901,0.000778549,-0.00177701,-0.00125899,-0.000447345,0.00022718,-0.0000056111,0.000306571,-0.000918156,-0.00166553,-0.000141865,0.00169877,0.000386384,0.000342741,-0.00079804,0.000638868,0.000389602,-0.00126818,0.000267745,-0.000977505,0.000464771,-0.000100519,0.00140059,0.000390858,-0.000290578,-0.000400904,-0.00199071,0.0000713871,-0.00151327,0.00113915,-0.00024605,0.00115884,0.000100131,0.000391801,-0.00158089,0.00140066,-0.000260569,-0.00160792,0.0000753176,-0.000956742,0.00140091,0.000882176,0.00139168,0.00107613,-0.000780737,-0.000276088,0.000116107,0.00015181,0.000735181,0.000627832,-0.000852845,-0.000775986,-0.00177461,0.000033407,0.000420935,-0.000384266,-0.00106489,-0.00100734,0.000497878,-0.000994173,0.000289805,-0.000464674,0.000115462,0.000228405,-0.000808942,0.00145318,0.00112343,0.000564158,0.000414498,-0.000649222,0.000501192,-0.00112085,-0.000442679,0.0000150345,-0.000092606,0.00195828,0.0000554964,0.000489074,-0.000278367,-0.00112974,0.000695624,-0.00166786,-0.00070057,-0.000173436,0.0000859134,-0.00025288,-0.000350198,0.0019918,0.000836905,0.00040427,-0.000749636,-0.000913002,0.000979544,-0.00112361,0.000808794,0.00121568,-0.00024806,-0.00084283,0.000127959,0.000245354,0.000504918,-0.000152111,-0.000524339,0.000552071,-0.000435886,-0.000307726,-0.000175522,-0.00015165,-0.00024015,-0.00150056,0.000414475,-0.000775395,-0.000472575,-0.000727755,0.00102653,0.00126407,0.000183896,0.000363325,0.000493601,-0.000308592,-0.00179484,0.000119461,-0.000188284,-0.00182769,0.00034276,0.000343687,-0.00137639,-0.00125625,0.000142738,0.000644055,-0.000847369,0.0000693367,-0.000597471,-0.00184729,0.00089455,-0.0000625059,-0.000856655,0.000395221,-0.000718837,0.000204924,-0.00124888,0.00111343,0.000484864,-0.000416893,0.00053644,-0.000932638,-0.000888107,0.00134208,-0.000797647,0.000258419,-0.0010453,-0.0000350831,-0.0000360301,-0.00156953,-0.000118543,-0.000575667,-0.000159332,0.000630231,0.000666226,-0.000836768,-0.00173902,0.000599253,-0.00110528,0.000702069,-0.000493063,-0.000483406,-0.000205771,-0.000229411,0.000602424,0.00035314,-0.00021502,-0.000103029,-0.0000698705,0.000857573,-0.00054978,0.00132421,0.00167996,0.00178824,0.0000830739,0.000757378,-0.000390211,0.00168512,-0.000135574,-0.000122864,0.0000965459,-0.00192489,-0.000727318,-0.000568405,0.000728115,-0.00114787,0.000923799,0.00104059,-0.00113664,0.000487129,-0.00145394,0.000913261,-0.00163658,-0.00198334,0.000875406,0.0000712342,-0.000352746,0.0000233679,-0.000270166,-0.000457298,0.000762335,-0.00118361,0.00120334,-0.00117926,-0.00164703,-0.000264515,0.000495476,0.00091293,-0.0014182,-0.000993264,0.00112938,0.00116491,0.00196228,0.00018009,0.000264124,0.000439837,-0.00111409,-0.00103511,-0.000845248,0.00169893,0.000958454,-0.000335418,-0.000881194,0.000436952,-0.00138952,-0.000584558,0.000270977,0.000678669,0.000111152,-0.000946939,0.000623368,-0.000843836,0.000283648,0.000077513,-0.000809931,-0.00133933,0.000157846,0.000845842,-0.000285175,0.000254064,-0.000864769,0.0000720032,-0.000631097,0.00123257,0.00100707,0.000731961,-0.0000753853,-0.000652642,-0.000306055,0.0000484548,-0.000279359,0.00157726,0.00065055,0.00115553,-0.000276528,0.000164265,0.000354862,-0.000282253,-0.000919056,-0.000934503,-0.00120502,-0.000459331,0.000557781,-0.000442592,-0.000270988,-0.000854331,0.00143907,0.00155676,0.000833611,-0.000307993,0.000419174,0.000336356,-0.00113059,0.000287631,0.00020807,0.00112212,0.00136602,0.000428184,-0.00129716,-0.00124294,0.00123861,0.00151405,-0.00155841,0.00032445,-0.000118814,-0.00146745,0.000422966,0.00137602,0.000276974,-0.000392133,0.000814477,0.000970563,-0.00195213,-0.0000310778,-0.000744991,0.00029539,0.000600839,-0.00023869,0.000454171,0.000937698,-0.001344,-0.000467719,0.000203299,-0.0001374,0.0000868971,0.000894633,0.000962288,-0.00163944,0.00124407,0.000736778,0.000719082,-0.00139021,-0.00112703,-0.000674363,0.000405068,0.000374772,0.00112935,-0.000185051,0.000621951,-0.000232581,-0.000987373,-0.000383755,-0.00128311,0.00103182,-0.00136845,0.000808526,-0.000186613,-0.00151687,-0.000389787,0.000358786,-0.000521197,-0.000020873,-0.000139041,0.000319676,-0.00140836,0.000181411,-0.000185937,-0.000164465,0.000279269,-0.000690135,-0.000478211,0.000358977,-0.000105809,-0.001122,0.000902372,0.000341502,0.000817052,0.00178076,-0.000600224,-0.000189849,-0.000543365,-0.00148873,0.000582805,0.00126132,-0.00038664,-0.000948511,0.000304007,0.000393351,-0.00123682,-0.00167542,-0.0018744,-0.000232921,-0.000180511,-0.0010472,-0.000331111,-0.000907882,-0.000554432,0.00191998,0.00092475,-0.0016112,-0.000888088,-0.000248673,0.000587937,-0.000484801,-0.000547335,0.000949143,0.000401901,-0.000263549,0.00104498,0.00130169,0.00063831,0.000643698,0.0000271649,0.0000012353,-0.00021521,-0.000229254,0.00126014,-0.000442324,-0.000844028,-0.00181926,0.0000506345,-0.000165406,0.0000378779,-0.000801053,-0.0000142515,0.000414116,0.00185574,-0.000469452,0.00020219,0.000554992,-0.00107263,0.000580024,0.000751239,-0.000155495,-0.000482472,-0.00105456,0.000803855,-0.00118618,-0.000849275,-0.00097502,-0.00149013,0.00174491,-0.000270663,0.000402495,0.000152502,-0.00103679,-0.0000779575,-0.0014185,-0.000606081,-0.000410012,-0.0011538,0.00194523,-0.00118373,0.000572819,-0.000524872,0.00152167,-0.000460491,-0.000295193,-0.00118649,-0.0000196746,0.000509585,0.000341322,0.00144437,0.00118468,-0.00154324,0.00160105,-0.000133525,-0.00129722,-0.00048195,0.000142854,-0.00111473,0.000824405,-0.0000875005,0.000355379,0.000332144,0.000195954,-0.0000574557,0.000779676,0.00167099,-0.00191417,-0.000961738,-0.000801629,0.00126133,-0.000234884,0.00100092,0.000608225,0.000544493,-0.000283676,-0.000811883,0.000642966,0.00134819,0.00122121,-0.000388503,0.000383917,0.000791354,0.000403638,0.000462176,-0.0000317387,0.000897451,0.00045665,0.000262076,-0.000446505,0.000919759,0.000549169,-0.000107292,0.000685149,-0.000601491,0.00152088,0.00000493253,0.000413273,0.00157734,0.00170114,-0.000928982,0.0000140137,0.00100115,-0.000924661,-0.000176561,-0.00146089,-0.000618532,-0.000568402,0.00101337,-0.000192409,0.000262231,-0.00050679,0.000625059,-0.00120164,0.00107973,-0.000601404,0.000263237,0.000432677,-0.00108833,-0.000563513,0.000186971,-0.000275944,0.00125584,0.000645727,0.00115909,-0.00133527,-0.00120845,-0.000148075,-0.00142888,0.00116964,0.0014282,0.000459292,0.0000900469,-0.000954324,0.00129147,0.000657015,0.000946471,-0.000579053,-0.00163568,-0.000101427,0.000937073,0.0000460703,0.000302328,-0.00000433077,-0.000690914,-0.000930594,0.00117231,-0.000219221,0.00149138,0.000864639,-0.000785717,-0.000563765,0.00073772,-0.00122093,-0.000908137,-0.00122492,-0.000353915,-0.00116681,-0.00071591,-0.000019702,0.00173375,-0.000848236,0.00116066,0.000632739,-0.000875877,-0.000851126,0.00013108,0.00059212,0.000829751,-0.000159362,0.00194919,-0.00139632,-0.0009035,-0.00178037,0.000332915,-0.000225589,0.000844625,0.00111295,-0.000424646,-0.00108086,0.000167104,-0.00147767,-0.000814856,0.000264799,0.000447139,0.000932043,-0.00160062,0.000318711,-0.000685765,0.000153313,-0.00057932,-0.000139329,0.00189696,-0.000340912,0.0000639247,0.00105315,0.0000405185,0.00102194,0.00116442,-0.000395976,-0.000714746,-0.000787228,-0.00176945,0.00185375,-0.000835497,-0.000120808,-0.00123639,-0.0000561234,0.000566791,-0.000553857,0.000377163,0.000483667,0.000211611,-0.00143819,0.00151236,-0.000481975,0.000515788,-0.000113394,-0.00154065,-0.000766094,-0.000289154,-0.00128095,0.00139132,-0.00143181,0.000381127,-0.000229902,0.00000761113,0.000746582,-0.0000853155,0.000746915,-0.000396719,-0.00132439,0.000139432,-0.00104047,-0.000880818,0.000320838,0.000536662,-0.00165312,0.00018253,0.00136209,0.0000552172,-0.000377592,-0.000647251,-0.000171257,-0.000545661,-0.000963848,-0.00052457,0.000825215,0.000241948,0.0000993794,-0.000105174,-0.000212137,-0.000870091,0.00166516,-0.00113759,-0.000336184,0.000203315,-0.0002331,-0.000804286,-0.00121731,-0.000131784,0.000339404,-0.0000676272,-0.000997901,0.000762558,-0.00152577,-0.0013178,-0.000678955,-0.00188726,0.00179973,0.000323372,0.000371039,-0.000298842,0.0000601413,0.00112409,-0.00147279,-0.00112282,-0.0000263057,-0.000444859,0.000887832,0.00198624,0.00125919,0.000554379,-0.000844711,-0.00189474,-0.000158935,0.00019959,-0.000223174,0.00128385,0.00143056,0.00164738,-0.000197508,0.000105062,0.00113001,-0.000103218,-0.0000484749,0.000844513,-0.000934531,-0.000332756,-0.0000734081,0.00110465,-0.00129437,0.000235699,0.000178619,-0.00110221,-0.00136805,-0.000577184,0.000309747,0.000986526,0.00101517,-0.00102532,-0.000646815,-0.000329042,-0.000264352,0.00024765,-0.000232189,-0.000392022,0.000586664,0.00024675,0.00000314468,-0.0003878,0.0000601515,-0.00114847,0.00124175,0.00134776,-0.000281578,0.000230151,0.000436494,0.000805847,0.000702545,-0.000635745,0.0000687457,0.000271165,-0.0011801,0.000427273,0.000134001,0.00059246,-0.00138957,-0.000240149,-0.0002108,0.000548805,0.00130878,-0.0000769231,-0.000326651,0.000782259,0.00198182,-0.000228823,0.00121948,-0.00118413,0.000279679,0.000392539,-0.000337471,0.0000165654,0.00118186,-0.000426177,-0.000375799,-0.00106525,0.00132041,-0.00179801,-0.000443728,-0.000579095,-0.00139892,0.000335269,-0.000130564,0.000997336,0.000564246,0.000744631,-0.000509503,0.00178358,-0.000775645,0.00122048,-0.000645229,0.00161291,-0.000431332,-0.000666697,-0.000117535,0.000230473,-0.000146285,-0.000595545,0.000113144,-0.000919159,0.000322749,-0.000260295,-0.000702458,-0.000428365,-0.0010346,0.00145067,0.000250371,-0.00049222,-0.00157264,-0.000249278,-0.00041264,0.00135673,-0.000278179,-0.00140036,0.000560893,-0.000566477,0.000155248,-0.000327889,0.00148394,-0.001782,-0.00013774,-0.00132113,-0.000309242,0.00100146,-0.000756641,0.0000425362,-0.00180983,-0.00129808,-0.00047365,-0.000826818,-0.0000610188,0.000265298,-0.000652788,0.000137514,0.000605371,0.000271503,-0.00122214,0.0014352,0.000519096,0.00108131,0.000853511,-0.000569086,0.0000217805,-0.00171915,0.000294443,-0.000824512,0.0000924953,0.00122234,-0.000170632,-0.000240283,-0.000925477,0.000474913,-0.000366935,-0.000839414,0.00027964,-0.0011463,0.0000440475,-0.000223963,-0.00087383,0.000615388,-0.000808992,-0.000828398,-0.0010574,-0.000322071,-0.0000282855,-0.00040879,0.000809362,-0.000898862,0.0012788,-0.000278327,-0.00134595,-0.000151775,0.000231908,-0.000205208,-0.00135141,0.00123956,-0.000796691,0.00103532,0.0000752493,0.0000882588,0.000501155,0.000828477,-0.0010062,-0.000350693,0.000388642,-0.00156486,0.000017009,-0.000235092,0.000859027,0.00169023,0.000360845,-0.000566869,-0.000406982,0.000834382,0.00127983,-0.00128333,-0.000760929,-0.000378786,0.00151481,-0.000297058,-0.000293793,-0.000349521,0.00137931,0.00033829,0.000239873,0.00130944,0.000836532,-0.0000960783,-0.000365859,-0.000467518,-0.000714282,-0.00106073,0.000649876,0.00039175,-0.0019115,-0.0010425,0.000279079,-0.00120569,-0.000692057,0.00140245,-0.000305717,-0.000148243,-0.0000637522,-0.00143341,0.000304508,-0.000906336,0.000877291,-0.000783095,-0.000928676,0.000114346,-0.00123177,-0.000546067,-0.000240443,-0.000492956,0.00081209,0.000832776,0.000210722,-0.000987163,-0.00140223,-0.00183333,-0.00157323,0.00145353,0.000238593,0.000874524,-0.0000997719,-0.00186671,0.00119905,-0.000492222,0.000706897,0.00164025,0.000739159,0.000612005,0.000386568,0.0000352954,0.00146112,0.000265611,0.000757846,-0.00159844,0.000493825,0.00135881,0.00123448,-0.000387349,-0.000461424,0.000768799,-0.000223229,0.00127566,0.00132279,0.00145588,0.000175741,-0.000469375,0.000618008,-0.000319672,-0.00191349,0.00109044,0.000327398,-0.00146933,0.000259091,-0.000463925,0.00154632,-0.000711485,0.000144362,-0.000247816,0.000901453,-0.00101524,0.000452605,-0.00191365,-0.00167773,-0.00139786,-0.000890651,0.00132729,0.00029316,0.000727593,-0.000299568,0.000221106,0.00114734,0.00123809,-0.00165839,-0.000341868,0.00025048,-0.000734907,0.000950936,-0.00117199,-0.000101159,0.00079538,0.00109598,-0.000818258,-0.000652689,0.000329753,0.000515097,0.000915595,-0.00140058,-0.000597163,0.000152242,-0.00142508,-0.000403303,-0.000529889,0.00104623,0.000673591,0.000515539,-0.000102782,0.0018459,0.000273276,0.000525706,0.0000565154,-0.00075052,-0.000958103,-0.00129694,0.000131564,-0.000406702,-0.000847901,-0.000132524,-0.000856772,-0.000849853,0.0000794221,0.00156131,-0.00000648958,-0.000424245,-0.00130834,-0.000158629,-0.000315746,0.000280603,0.00170586,-0.000934531,-0.000596982,0.000549324,0.0000631653,-0.000966544,-0.000191758,0.000451649,0.000168638,0.00175549,-0.00130812,0.000468674,-0.00137816,-0.000774772,0.0012502,0.0000419442,0.00165165,-0.00165566,-0.0000479978,0.000953411,-0.000886754,0.000219091,-0.0000129275,-0.00192146,0.000240002,0.000599197,0.0000270508,-0.00129037,0.000924079,0.000564185,0.000484454,0.000712537,0.000387331,-0.000773305,-0.000260891,-0.000614465,0.000443432,0.0000610067,-0.000514402,0.0000375932,0.00037349,0.00138314,0.00189241,-0.00112917,0.00120622,-0.000718917,0.000395568,0.000686246,0.000449516,-0.000583422,0.000151865,-0.00138166,-0.000116452,0.000209385,0.00192287,0.00167897,0.000447406,0.000148681,-0.00117564,0.000436863,-0.000285238,-0.00072646,0.00146298,0.000445551,0.000577698,-0.0000282338,-0.00016157,-0.000628864,0.00108377,-0.00144643,-0.000463391,-0.000259694,0.00151106,-0.0000998184,-0.000523448,-0.0000366533,0.000193615,-0.000465162,0.000770105,-0.0000515459,-0.000668863,0.0000471034,0.000623318,0.00126526,-0.00108532,-0.000303919,-0.0000185091,-0.000312082,0.00167095,0.000503357,-0.000178325,0.00138873,0.000332718,0.000262694,0.000324928,0.000193832,-0.000569708,0.000296848,0.000255045,-0.000157973,0.0011343,-0.000111151,0.000508223,-0.000274618,-0.000646862,-0.000834142,-0.000732039,0.00000705448,-0.000431241,-0.000501241,0.00100553,0.000192988,0.000881204,0.000988492,0.000429367,0.0000782704,0.000768182,-0.00123629,0.00114726,-0.0011092,-0.0000516249,0.000560237,0.000204363,-0.000483003,0.00122174,0.000641321,0.00142521,-0.00020783,0.000268735,-0.00119318,-0.0016958,-0.000176647,-0.0000725078,0.000410716,-0.00164627,0.00116715,0.000378077,-0.00174153,-0.000071866,0.00168053,-0.0000641512,-0.000288967,-0.000905902,-0.000873348,-0.000530712,-0.00108649,-0.00010327,-0.0000974137,-0.000651173,-0.0015299,0.0000248205,0.000241726,-0.000441446,-0.00117343,-0.0000260631,0.0000224351,0.000182374,0.000729576,0.000992988,0.00110455,0.00128422,0.0000244956,-0.000448164,-0.00156535,-0.0000904787,-0.000803654,0.0000605207,-0.00101672,0.000158165,0.000562012,-0.000529174,0.000648781,0.000546037,-0.000991299,-0.000206914,0.000195427,0.000330724,-0.000855768,-0.000746693,-0.000484108,0.000140306,-0.00197769,0.0000757481,0.00155846,0.00029284,0.00114178,0.00112405,-0.000090504,0.000512895,0.0000226939,0.000263575,0.0000787832,-0.00109448,-0.00168453,-0.000826684,-0.00132792,0.000496213,0.000494869,-0.00039848,0.000242939,0.000726579,0.000496938,0.000620831,0.00186358,0.000739218,-0.00178584,0.000289255,0.000693111,0.000165066,-0.000915845,0.000746561,-0.000960618,-0.000181079,0.000925227,0.00171508,0.000550174,0.000193868,-0.000862604,0.000170161,0.000377406,0.000435566,0.000317481,0.00123969,-0.0000439648,0.000480029,-0.000567714,0.0010925,-0.000335138,-0.00171033,0.000928752,-0.000570737,-0.000023233,0.00129715,0.000401905,-0.000353243,-0.000534997,-0.0000954155,-0.00189808,-0.000270488,-0.00073841,0.000800324,0.00114951,0.0000953527,-0.00017462,0.000470971,0.0000296344,0.000174506,-0.00104513,0.00123113,-0.000695182,0.000185912,0.00089713,-0.000320971,0.000597943,-0.0019886,-0.000535056,0.000430753,-0.000285414,0.000318134,-0.0000451383,-0.000723014,0.000187819,-0.00101679,0.00132433,-0.00110597,-0.000155965,0.000110081,0.000704317,0.00102107,-0.00145087,0.00135731,0.000619,0.00173646,0.000891587,-0.000527122,-0.00155011,0.00154279,0.0000758635,0.0012097,0.000646149,0.000632494,-0.00159763,0.000647738,-0.000874009,-0.000369356,0.000743635,-0.000485988,0.000947757,-0.000395184,0.000604083,0.000676266,-0.00081157,-0.0000529706,-0.00096411,-0.0000727427,-0.000814134,0.000698012,-0.000598682,-0.000672674,0.00078364,0.000447759,0.000761514,0.00108905,-0.000157292,0.000771398,0.00102767,0.000453984,-0.00109825,0.000924583,-0.000231792,0.00023225,0.000694727,-0.000265401,-0.000140196,0.000635811,0.00154074,0.000395463,-0.000984501,0.000952491,0.00103135,-0.00107965,0.00138198,0.00152651,0.000224345,-0.00158032,0.00111675,-0.0000904658,0.00117647,0.000911401,-0.000177678,-0.000614304,0.00109461,0.00146184,-0.000518954,-0.0001361,-0.000859822,-0.00162226,-0.000437034,0.0010563,-0.000689703,-0.00120357,-0.000242569,-0.000735461,-0.000179599,-0.000942138,0.000813008,0.00134607,-0.00101864,0.000387934,-0.000505708,-0.00125417,-0.000921074,0.000275543,-0.000165411,-0.000904,-0.000464159,-0.000597866,0.000626556,0.0012233,-0.000443311,-0.0000589913,0.000530797,0.00150423,-0.00113733,-0.000164884,-0.000408799,-0.00188755,-0.00142411,-0.000175494,-0.000217645,-0.000691146,-0.000388262,-0.000010359,-0.00177606,-0.000309739,-0.00141314,0.0000289577,0.00100051,-0.000426744,0.00173268,0.000288295,0.00150676,0.000937729,0.000514794,-0.000320615,-0.00129036,0.00104254,-0.000407872,0.00135039,0.00000819025,0.00140965,-0.000554259,-0.000282945,0.000227776,-0.0000644618,0.0013974,-0.000524619,-0.00181734,0.00025734,-0.000054376,0.00156362,0.00165742,0.000473188,0.0010817,0.000203905,-0.0002297,-0.00127866,0.0000353583,0.0010198,-0.00195503,-0.000645243,0.000317661,0.0001152,0.0000479586,-0.00143382,-0.0000833683,0.000954663,0.00115098,-0.000310587,0.00148239,0.0000721869,0.000291623,0.000451209,0.000826025,-0.000296863,-0.000462503,0.000793884,0.000469609,0.000969926,0.000250618,0.00159141,0.00164695,-0.000195714,0.00041337,-0.000357054,0.00125891,-0.000524943,-0.000172864,-0.000280487,-0.0014853,0.000452599,0.00145953,-0.00025346,0.000906752,-0.00186258,-0.000630208,-0.000730494,-0.00120481,0.000655155,0.000429507,-0.000563375,-0.000504433,-0.00167152,-0.000822478,-0.000378756,-0.000457138,-0.00052709,-0.000243136,-0.000472391,-0.000426212,0.00167797,-0.000604941,-0.000870882,-0.000561473,-0.000650154,-0.000898772,-0.00163832,-0.00132207,0.000148638,-0.0011825,-0.00152862,0.000982149,0.000575793,0.000402631,0.000859946,-0.000729734,0.00100442,-0.00114007,-0.000193381,0.00132085,-0.000933135,-0.000375352,-0.000410198,0.0001741,0.000310413,-0.000121371,0.000822858,0.00122321,-0.00100578,0.000432362,-0.0000304766,-0.000478912,-0.000632578,0.00012366,0.00131072,-0.000543991,0.000834346,0.00124405,-0.000334711,0.00136733,0.000634022,-0.000252271,0.00110206,-0.000426105,0.00135425,-0.000896375,0.000482477,0.000915721,-0.000335471,-0.000444325,0.00194319,0.00103116,0.00165358,-0.000899966,0.000381124,-0.000599407,0.000185124,-0.000141498,0.000254989,-0.000764795,0.00020727,-0.000984414,0.000447528,-0.000722179,0.000904474,0.000172152,0.00173974,-0.0017525,0.00104547,0.0000220024,-0.00155439,0.000239116,-0.000550802,0.000428571,-0.000154949,0.00000454015,-0.000851169,0.000262948,-0.00046202,-0.000520633,-0.00106252,-0.000226063,-0.000866892,0.000188246,-0.00109813,0.00174377,0.000488492,-0.000125039,0.00110663,-0.000660131,0.000218544,0.0000500738,0.000616004,-0.000868939,-0.000475998,0.000393856,0.00166155,0.000512491,-0.000226832,0.000231021,-0.0012074,0.000200562,-0.0000892164,-0.00106612,-0.00106123,-0.000800665,0.000979707,0.00153798,-0.000953322,-0.00119139,-0.00195019,0.00191531,-0.000451349,-0.000407611,-0.000852218,-0.0000281523,0.000618641,-0.00144725,-0.000688013,0.00192916,0.0000914093,-0.0000245444,-0.0000319689,-0.0000682794,0.00068078,-0.00146305,-0.000546488,-0.000587285,0.00156628,-0.000844488,0.00155175,-0.00084771,0.000819907,0.000565667,-0.000256577,-0.000546557,-0.00087266,0.00103422,-0.000382667,0.000198793,-0.000624732,0.000983677,-0.000713457,0.00138667,-0.000740483,-0.000892483,-0.00110074,-0.0000828631,-0.000687297,0.000115522,-0.00026262,0.000780078,0.00100319,0.00097886,-0.000132105,-0.000615395,0.000335588,-0.000469531,0.00141274,-0.0012371,0.0000571262,-0.00136672,-0.000658033,0.000759933,-0.000430554,-0.000594078,0.000596447,-0.000287878,0.000711943,-0.000414061,0.00169284,-0.000151316,0.000824377,0.000287895,0.000954958,-0.000323383,-0.000153618,0.000981457,-0.0000893895,-0.000123981,-0.00113104,-0.000684651,-0.000464674,-0.00135722,0.00045576,-0.000814144,-0.000812649,0.000170071,-0.000175347,0.000538392,0.000218232,0.000236871,-0.000965343,-0.000795282,0.000784289,0.000867439,-0.000194697,0.000266969,-0.000802496,0.00114418,0.00125486,-0.000444198,0.00000871605,0.000631788,0.000373974,-0.000840501,-0.000232216,-0.00176507,-0.000381987,0.00119264,0.000475272,0.000138222,0.0014289,0.000576866,-0.000925783,-0.00182238,-0.000411168,0.00168477,0.000117804,0.000756127,-0.000506435,-0.000395366,-0.00102275,0.000405249,-0.000402831,-0.000256021,-0.000815446,-0.00100548,-0.000837359,0.00159835,0.00030288,0.00164777,0.000763814,-0.000382479,-0.000154058,0.00101677,-0.000185625,0.000860296,0.00172579,-0.000183357,0.00115608,-0.00113058,-0.00119608,-0.000510886,-0.000316813,0.00157109,0.00108952,-0.000612814,0.00024653,0.000614205,0.000435044,0.000601808,-0.000297195,-0.000222022,-0.000152605,-0.000791276,-0.000329918,-0.00109395,0.000353857,0.001557,-0.000728598,0.000434267,-0.000537237,-0.000815142,0.0017725,-0.000197364,0.000498994,0.000881248,-0.000898551,-0.00126018,-0.000494752,-0.000394494,-0.00017548,-0.000784978,0.000177333,-0.00152855,-0.00056349,0.00000187382,0.000842314,-0.00132828,0.0000232835,0.000237593,0.000548569,0.00114156,-0.000899192,-0.00115862,0.00144666,-0.000307844,-0.000973069,-0.000414158,0.00130248,-0.000625776,-0.000314514,0.000428328,-0.000738037,-0.000759149,-0.00100605,-0.00146156,-0.000196212,-0.000653541,-0.000209401,0.000394137,0.000068537,-0.000672475,-0.000866485,0.00000616439,-0.00175641,0.000194742,-0.00102087,-0.000184978,-0.000600247,0.000986633,0.000549774,0.00105369,-0.0000709943,0.00155761,0.000688408,0.000658072,0.000565481,0.000563493,0.0000587229,0.000184609,0.000644142,-0.000436359,-0.00108666,0.000727581,-0.000118274,0.000465522,-0.0015171,0.0000559181,0.0000147294,0.00132431,0.00154605,-0.000675583,0.000349057,-0.000292902,0.0000232221,0.0000233353,0.00162038,-0.000416928,0.000235926,-0.00112982,0.000789978,-0.00106827,-0.0000730668,-0.00134239,-0.00096404,0.00169915,0.000366107,0.000847201,-0.00102842,-0.0000544109,-0.000706634,-0.00131035,-0.000158869,-0.000749024,-0.000823413,-0.00018637,-0.000129705,0.000796425,-0.00106374,0.000616497,0.000619241,-0.000864297,0.000149879,0.00017962,0.00014772,0.001304,-0.00148985,-0.0000122595,-0.00124246,0.00103704,-0.00103093,0.00197881,-0.00165392,-0.000286649,-0.00161227,0.00128159,0.000835201,-0.000495689,-0.00121988,0.00000162527,0.000670596,0.000450899,0.000634898,0.000839929,-0.00104994,-0.000124797,0.000421395,0.000132644,0.000206296,0.000600437,-0.000654359,0.00109999,0.00133857,0.00191902,0.000370345,-0.000142558,0.00151804,0.000635982,0.00145243,0.000786529,0.000879764,-0.000806208,0.00105125,0.000348464,0.00140656,-0.000726725,0.000432913,0.000291315,0.0000407046,-0.00126767,-0.000347149,-0.00117224,-0.00145742,0.000615188,-0.00139202,-0.00148395,0.000861995,0.00111626,-0.000798899,0.00140097,0.00123559,0.000209455,0.000111265,0.000480102,-0.00173848,0.000024578,0.0000386905,0.000350352,-0.000765864,-0.0000836203,0.000164946,0.00088783,-0.000924412,-0.00146659,-0.00183041,-0.000581483,0.000383277,0.00102288,-0.000862574,-0.000491092,-0.00120252,-0.000827928,0.000486093,0.0000572705,-0.00134703,-0.000177906,0.000274785,0.00110529,-0.000100319,0.000207065,0.000949529,0.000408558,0.000313078,0.00157114,0.00000193314,0.000953675,0.00169735,-0.000695763,0.000484334,-0.000107386,0.000244442,-0.00128556,-0.00066494,0.0000225642,-0.00054451,-0.00105731,0.000616271,0.000364704,0.0000713117,0.00134782,-0.00064998,0.000384346,-0.000106449,0.000241091,-0.000066531,0.0000879869,0.000822584,-0.000428952,-0.000252217,-0.00030173,-0.00191946,0.000316064,0.000877066,0.000692409,0.00173886,0.000244334,0.000698803,-0.0000738404,0.000767519,-0.00109501,-0.000065706,0.000040938,0.000108911,-0.000649463,-0.000983565,-0.000132801,-0.00112226,0.00113207,-0.0011103,0.000737058,-0.000110387,-0.00028406,-0.000332666,-0.000589113,-0.000376272,-0.00198009,-0.00137757,-0.00097863,-0.000178174,-0.00038688,-0.00123701,0.000567231,-0.000276406,-0.0000200928,-0.0000286491,0.00133579,-0.000546068,0.000196948,0.000953433,0.0000224716,-0.00136722,-0.000992542,-0.000545864,-0.00180846,0.000250078,-0.0000486679,0.00126797,-0.000420205,0.000357403,-0.000579274,-0.000104212,0.000601504,-0.00105254,-0.00104125,-0.000195055,0.00051132,0.000612827,0.00147687,-0.000227456,-0.0011611,-0.000972662,0.000385939,-0.0000750182,0.000836287,0.0000556426,0.000763725,0.00103017,0.000389623,0.00165943,-0.00123875,0.000162963,-0.000151917,-0.00171627,0.000347021,0.00104967,0.00131481,-0.00159929,-0.000647711,0.000377131,-0.0000310975,-0.000424386,-0.000416762,0.000323481,-0.00115557,-0.00021222,0.00196058,-0.00123667,-0.00136833,-0.000917673,0.00194469,-0.000345834,-0.00188474,-0.000387366,0.000545507,-0.000270191,0.000581136,0.000958594,-0.000594726,0.000884927,0.000855906,-0.000506131,0.00117752,0.00149571,0.000979948,-0.000189519,0.00152361,0.000575871,0.000245821,0.000807659,-0.000661313,0.00138662,0.000824301,0.000816915,0.00116741,0.000197194,0.00193991,0.000325879,0.000933115,0.0000813774,-0.000443361,-0.0000714531,0.00157474,-0.00126672,0.00187095,-0.000461205,0.000427672,0.00145994,-0.00120305,0.000473697,0.000704392,-0.000927981,-0.0000664966,-0.000727808,-0.000865504,0.00181686,-0.000996391,-0.000314321,-0.0019707,0.000313231,-0.00146126,0.000160641,-0.000270222,-0.000411787,-0.000648077,-0.00041673,0.00100211,0.000469685,0.000264984,0.00070332,-0.000234955,-0.000403761,-0.00104065,0.0000498519,0.000222341,0.0000690801,-0.000572582,-0.000404115,0.000472226,-0.000876014,0.00125216,-0.000898848,-0.000583324,-0.000644573,0.000904683,-0.000284119,-0.000498212,-0.000772072,0.000731314,-0.000493967,-0.00025196,0.00196914,0.000572202,-0.0013851,-0.000774036,-0.000519284,-0.0000447236,0.000167933,-0.000124956,0.000223285,-0.00136814,0.000736912,0.000311822,0.000222244,0.000984057,0.000350397,-0.000368689,-0.000690988,-0.000217876,-0.00098879,-0.000976995,0.000736159,0.0000852597,-0.000629344,0.000963857,0.000519444,0.000305283,0.000509323,0.000738985,-0.00112924,-0.000901414,0.000316948,0.000170765,-0.000453017,0.0000427655,-0.00120045,-0.00108001,-0.00053458,0.00123525,-0.000210408,-0.000408917,-0.000594994,-0.000537644,-0.00023946,-0.00145516,-0.000716629,0.00061825,0.000588083,-0.000185837,0.000362633,0.000303302,-0.000629507,0.00150725,0.000589504,0.00150812,0.00160066,0.000234988,0.000803933,-0.000529236,0.000162958,-0.00116637,0.00117885,-0.000965818,-0.000898477,0.000953111,-0.00126248,0.00124417,0.00112754,-0.00137033,0.000603441,0.000536401,-0.000526362,-0.000710517,0.000349932,0.000181199,0.000242779,0.00097173,-0.000583844,0.000127317,-0.00106316,0.00152316,-0.00104917,-0.00110136,-0.000744203,-0.00181388,0.000385475,-0.000339474,-0.000249364,-0.00108447,-0.000751751,0.00148751,-0.00115839,-0.00112976,-0.00183571,0.000950216,-0.000401697,-0.000204245,-0.000793617,0.000740017,0.000116544,0.00113584,0.00037713,0.000499252,0.00152568,-0.000345676,0.000303521,0.000899077,-0.000144224,-0.00148301,0.000153824,0.00122704,-0.0000793525,-0.000227755,0.000136804,-0.0000115524,0.00102082,-0.00115351,0.0000348716,0.000512491,0.000199027,0.00118706,0.00122177,-0.00146289,0.00111768,-0.00131447,-0.000300979,0.000658146,0.00065974,-0.00037709,0.000153347,0.000927924,0.0000323477,-0.00162657,0.0000696207,0.000654866,-0.00119951,-0.000289305,-0.00191114,-0.00136468,-0.000636951,-0.000913748,0.000676386,0.000827167,0.00106591,0.000965269,0.000386169,-0.0000989526,-0.000107735,-0.000964021,-0.000397022,0.00101755,0.000449878,-0.0000354871,-0.0000923,-0.00082905,0.000128409,-0.00129252,-0.000703716,0.000606435,-0.000255444,0.00107881,0.00141924,0.000586682,0.000631918,-0.000209997,0.00135891,0.000086039,0.00195265,-0.000824542,-0.00117705,-0.000307958,-0.000283828,0.000678146,-0.00172568,0.000736735,0.00101643,-0.00064704,-0.0000759413,0.000496766,-0.00079879,-0.000322285,0.000565141,-0.000954877,0.00043199,-0.00172867,-0.000935061,-0.000474799,0.000328315,0.000253534,-0.000668868,0.00049194,-0.00101276,0.000985028,0.000765849,-0.00106162,0.0000841037,0.00148955,0.00020554,0.000441413,-0.0000503101,-0.000922396,0.000694739,-0.000283634,0.00105672,-0.0001911,-0.000693279,0.0000583923,0.00171059,-0.000504794,-0.0000650499,0.00079372,-0.000180882,-0.000620533,-0.0000533948,0.000504557,0.000435496,0.00146487,-0.000193317,0.00023828,-0.00114206,0.00162171,-0.000724989,0.00150642,0.000221074,-0.000448279,-0.00105467,0.000710444,-0.000197602,-0.00100432,0.000114041,0.000359351,-0.00166578,0.000204138,0.000445522,-0.000418726,0.00155611,0.000675489,0.000730634,-0.000361743,0.000392995,0.00140109,-0.00122038,-0.0000946007,0.00163546,0.000790491,-0.000748126,0.000764458,-0.000720975,-0.000324888,0.000959579,0.00054185,-0.000351073,0.000522494,-0.000284988,-0.000424539,0.00127799,-0.000479086,0.000488096,0.000425783,0.000920027,-0.000842606,-0.000126452,-0.00107343,-0.000514014,-0.00138122,0.0006144,-0.00110823,-0.00159463,-0.000107095,0.000297385,0.00146204,0.00030098,0.000184786,-0.00000381369,-0.000589778,-0.000858668,-0.00022313,-0.00107183,-0.000979656,0.000026859,0.0014846,0.000632808,0.000384989,0.000229253,-0.000568258,0.000896503,-0.00076835,-0.000838591,0.00018077,0.00181993,0.00162581,0.0013679,-0.000314855,0.000684726,-0.000404891,-0.000352555,-0.000132491,-0.000849058,-0.00053069,0.0000517448,0.000323049,-0.000587932,-0.000321478,-0.00070869,-0.000111672,0.000515905,-0.000471794,-0.00118588,-0.0000165937,0.000504013,0.000945543,0.00162276,0.000874292,-0.0000577561,-0.000885126,0.000671775,-0.000515597,-0.000221332,-0.000453752,0.0000168139,0.00126582,-0.00138002,-0.00171086,-0.000983465,-0.00155424,-0.000028407,0.000119005,0.00105757,-0.00066864,-0.0010042,0.000267497,-0.000528973,0.000611536,0.0015777,0.000743254,-0.000470646,-0.00173269,-0.000521047,-0.00147129,-0.0011624,-0.0000213225,-0.000333118,-0.000451353,-0.0009048,0.00137883,-0.000533597,-0.000192291,0.0012812,0.00122224,0.000596486,0.00139831,-0.0010178,0.00076519,0.00014249,-0.000261267,0.00000407996,-0.000228622,-0.000165672,-0.00043968,-0.000951835,-0.000186546,-0.000156325,0.00132425,-0.000701797,-0.0016886,-0.00052398,-0.000781233,-0.000270479,0.000746742,0.000173946,0.00132645,-0.00096329,-0.00178159,-0.000336211,-0.00101349,0.000626736,-0.00130256,-0.00148293,0.000641062,-0.00151651,-0.000203309,0.000338443,0.000553371,0.000344072,0.000834026,-0.00103027,-0.00138366,0.0000191045,0.000457263,0.00113039,0.00133765,0.0017618,0.00140338,-0.00107654,-0.00098891,-0.00136714,0.00125058,0.00150805,-0.000625312,-0.000753173,-0.000870196,0.000724322,0.000954971,-0.000448537,-0.000842379,0.000168919,0.00103234,-0.000376626,0.00124621,-0.00036364,0.000708537,-0.00169136,0.00103215,-0.000603327,-0.0013324,-0.000567831,0.000898435,0.00139549,-0.00139219,0.000978484,-0.000283742,0.0009828,0.000875301,-0.00163198,-0.00155167,0.00109588,0.000619162,-0.000210922,-0.000997593,0.000284201,0.00112327,0.0000592617,-0.000877501,-0.000221395,-0.000776811,0.000561779,0.000911452,-0.000774409,-0.000354009,0.00055116,-0.00122407,-0.00185883,-0.000111297,0.00168809,0.00135712,-0.000626534,-0.000955328,-0.000281403,-0.000100509,-0.000354183,-0.000206116,0.000401243,0.00049041,-0.000893552,0.000587822,-0.000295242,0.000595776,-0.00148693,0.000823953,-0.000350862,0.000519601,-0.000927132,0.00144464,-0.000511396,0.000215214,0.00152461,0.00110099,0.00109723,0.000357437,0.0000636473,0.000276464,-0.000427527,0.000241347,0.000215597,-0.00189324,0.000650919,-0.000863642,-0.00182507,0.000462316,0.000802909,-0.000438277,-0.00145155,-0.000207844,-0.00139669,0.000292893,-0.000393792,-0.00104428,0.000787107,-0.0000816481,-0.000388693,-0.000964095,-0.000634321,0.000361094,-0.00147299,0.000683625,0.00111226,-0.00119939,0.00141648,0.000787036,-0.00087641,-0.00036196,-0.000202912,0.000239975,-0.000573008,0.000333326,0.0012028,0.00173718,-0.000530896,-0.000720517,0.000494491,-0.000759404,-0.00193318,0.000565706,-0.0000329727,0.00123801,-0.000790607,0.000260031,-0.000450901,-0.00106866,0.00120149,-0.00110988,0.0000761029,-0.00061477,0.000587858,-0.00113377,-0.000256707,0.000640059,0.000212472,0.000358244,-0.000264892,-0.00183502,0.00107972,0.00183062,0.00162225,0.0002718,-0.000600114,-0.000407288,0.000615352,-0.000709438,0.000912243,-0.0000690623,0.000209224,-0.00150937,-0.000416182,0.000778367,0.000277833,0.000102046,0.00165944,0.0007714,-0.00173639,-0.00101346,-0.000474835,0.000722346,-0.000252839,-0.000843693,0.00136328,0.000649451,0.000155311,-0.000801987,-0.00075319,0.0019534,0.00129978,-0.000397804,-0.00139824,0.00122416,-0.000838648,-0.000871203,-0.000362323,-0.00018118,-0.00101575,0.000340312,-0.000392278,0.000303896,0.000310979,0.000270922,0.00140293,-0.000578079,-0.000789998,-0.000936063,0.000577808,-0.00191617,0.000258411,-0.00137818,-0.00150758,-0.000336214,-0.00127137,0.000502013,-0.00152704,0.000625245,0.000415726,0.00115386,-0.000144097,-0.00131095,0.000734877,-0.000169807,0.00150238,-0.000880194,-0.000560395,0.000649892,0.00045652,-0.00112231,-0.00190014,-0.00142243,-0.00101673,0.00084214,-0.00114606,-0.0000602576,-0.00135454,-0.000885395,0.000246876,0.00114146,0.000237333,-0.000502692,0.00108516,-0.000863405,0.00153449,-0.000637827,0.000874049,0.000697601,-0.00120396,-0.00188556,-0.000219085,0.00109623,0.000222533,-0.00124133,0.00173289,-0.00113521,-0.000133632,0.000900179,0.001783,-0.000888622,0.0014785,-0.000360604,0.000467706,-0.0010345,-0.000572995,-0.000192694,0.000865734,0.000640241,-0.000566875,-0.000473723,-0.00176274,0.000453921,-0.000487768,0.00117947,-0.000291481,-0.000844175,-0.0017196,-0.000828841,0.000364835,-0.000296939,0.00132753,-0.000242416,-0.00110001,0.0000109643,-0.000264741,-0.00161894,0.00183477,-0.000559816,0.000177002,-0.00171082,0.000479019,0.00054262,0.00083629,0.000106227,0.000762312,0.000468648,-0.000242039,-0.000278045,0.00145919,-0.00101212,-0.000572774,0.0000496577,-0.00051168,0.000504844,-0.000134517,0.000682231,-0.000967631,-0.000785956,0.00167603,0.000187837,-0.000254599,0.000755095,-0.0000485757,0.000239365,0.00108742,-0.000146234,-0.000618695,0.000542601,-0.00006741,0.00022842,0.000451151,0.000689462,-0.000646006,0.000947111,-0.000670391,-0.00133805,0.00190036,0.00114663,0.000937102,0.000216562,-0.000856902,0.00183685,-0.000302115,-0.000457109,-0.0000607909,0.000811616,0.0000247182,-0.00104487,-0.000447381,0.000985039,-0.000961207,0.000393781,-0.000455594,-0.00147234,-0.000369627,0.00041039,0.000246356,-0.00101084,0.00033793,-0.000662215,0.00162009,-0.000153982,0.000291803,-0.000519646,0.000355739,-0.000916932,0.000475673,-0.00123898,0.0000829176,-0.000998642,0.00135036,0.00102926,0.000379972,-0.000238524,-0.000105152,-0.000605075,0.00129739,-0.00158159,0.000854484,0.000726568,-0.0006276,-0.000356121,-0.000592869,0.000612108,-0.00063264,-0.00122293,0.000764135,-0.000346385,0.00171385,-0.0012913,-0.000384063,0.000499073,0.000781839,0.000963881,-0.000834234,0.0000707033,0.000747243,0.00196815,-0.00025389,-0.00059469,-0.0000753421,-0.00194838,0.00064288,-0.000675823,-0.000886326,0.0000559652,-0.00112261,0.000796682,0.000766874,-0.000229028,-0.000789507,-0.0000472824,0.000224359,0.00174658,-0.0000433616,0.00161252,0.0000601742,0.0000498228,0.000204961,0.000177457,0.00157909,-0.0000556862,0.00135795,-0.000490685,0.000452761,-0.00138273,-0.00171463,-0.000551309,0.000581413,0.0000225003,0.000655141,0.000138763,-0.00152507,0.000927717,-0.000601068,-0.000879473,0.000159395,-0.000214194,0.0000446526,-0.000850845,0.000345909,-0.000837985,-0.00116796,-0.000179333,0.0000975313,-0.000999128,0.00119233,0.0000510703,-0.00138349,0.000940204,0.000670083,-0.00000774469,0.000220714,-0.000244677,0.000632611,-0.000734202,0.000503604,-0.000122304,-0.000005052,-0.00103659,0.000876975,0.000835688,-0.000864221,-0.000362784,-0.000361973,0.00116641,-0.00139704,-0.000586733,-0.000574739,0.0002493,-0.000774267,-0.000528071,0.000846752,-0.000806001,0.000464874,-0.000923023,0.000432294,-0.000591614,0.000957321,0.000927916,-0.000280238,0.00147161,-0.000811332,0.00148173,0.00171636,0.00136463,0.000023292,0.000420147,-0.000733657,-0.00131681,0.00136911,0.00150495,-0.000422608,-0.0013046,0.00119921,-0.000779625,0.000957705,-0.00109994,0.000486891,-0.000537866,0.000684833,-0.000276238,-0.000825778,-0.000260831,-0.000491519,-0.000791273,0.000425398,-0.000571072,0.0000500212,0.000659568,-0.000097868,-0.000431356,-0.000359211,0.000243923,-0.00172741,0.000787316,0.00112928,0.00116173,0.000638687,-0.0000821032,0.00078531,0.000641355,0.000538299,-0.000814737,-0.00197798,0.00153197,0.000318888,0.000285724,-0.000656774,-0.000695385,0.000826988,-0.000251032,-0.00165542,-0.000149803,-0.000957113,0.00119015,0.000196424,0.000244666,0.00148404,0.000482936,-0.00137414,0.00178339,0.000642298,0.000167122,-0.000591587,0.000442147,-0.0000168818,0.00178661,0.00173411,-0.000338651,0.00150088,-0.00103232,-0.000172669,-0.000824517,-0.0015639,-0.000377694,-0.000963588,-0.00122479,0.000712413,-0.000658874,-0.000517535,0.000647468,-0.000912735,0.0000473274,0.000294588,-0.000897855,-0.000648183,-0.000817356,0.000554335,0.000862341,-0.00185978,-0.000559784,-0.000767625,0.00145146,-0.000560764,0.000500399,0.000360982,0.000968794,0.00013891,0.00123229,0.000147865,-0.000184268,-0.000136468,-0.00155974,0.00145992,0.000474411,-0.000454741,-0.000880565,-0.00109798,-0.000247308,-0.00114959,-0.000134698,0.000970663,-0.000149706,-0.000815034,0.000768889,-0.00159846,-0.000643669,-0.000546833,0.000278231,0.000843837,-0.000758109,0.000451767,-0.00128008,0.00038437,-0.00035009,-0.000524975,-0.000298564,-0.000364409,-0.00103297,0.00178994,0.00152678,0.000231591,-0.000964237,-0.000301189,0.000087809,-0.000194848,-0.00047062,-0.000723941,0.000860268,-0.000604083,-0.000654588,-0.00143378,-0.000126361,0.00100261,-0.000370712,0.000381835,0.0015918,-0.00118756,-0.00166202,-0.00108761,0.000265251,-0.000571541,-0.000756972,0.00137431,-0.000685524,-0.000582585,-0.00131851,-0.000761144,0.00137134,0.00102468,0.00060052,0.000175883,-0.00196136,0.0013201,0.000374708,-0.000261053,-0.000439428,0.00114141,-0.000884836,0.00153999,-0.00061054,-0.00113842,0.00197554,-0.000123195,0.0010863,0.00149398,0.000748525,-0.00101698,-0.000695844,-0.00131753,-0.000155043,-0.000500419,-0.000911647,0.00146698,0.00112842,-0.000652257,-0.000395081,0.000598116,-0.00161478,-0.000524351,-0.00148516,-0.00033056,0.00114696,-0.00150528,0.000102058,-0.00170893,0.000339451,0.00062719,-0.000768249,-0.0014602,0.000998127,-0.00152918,-0.0000208894,0.000739512,-0.000387767,-0.000247678,-0.0010465,-0.000574847,0.0000784296,0.000158247,0.00110865,-0.00132626,0.000709441,-0.0000301099,-0.000103462,-0.000771531,0.00117398,0.000425078,-0.000537131,-0.00135709,-0.000624022,0.00115706,0.0018741,0.000245641,-0.00109876,-0.000474376,-0.000724711,-0.00107782,-0.00136107,-0.00023977,0.000531754,-0.000758145,-0.000942544,0.00053928,-0.000433278,-0.00114987,0.000553448,-0.000695671,-0.000835219,0.0000648513,-0.00136627,0.00192155,0.00199589,0.000552003,-0.000703239,0.000129842,-0.00165936,-0.000622707,-0.00062792,0.000910618,0.00130748,0.000461312,0.000693995,0.000767964,-0.000000161238,-0.000701238,-0.00114928,-0.000385446,0.000976954,0.000306605,0.000473546,-0.000744842,-0.00045803,0.00048415,0.000023348,-0.000368454,0.000377881,-0.00042572,0.000996909,-0.000144085,0.000811955,-0.000470455,-0.00123463,-0.00174631,-0.00149294,0.000614828,0.000670116,0.0013006,0.00189942,0.000207821,-0.00050684,0.00130161,0.000223371,-0.00132455,0.00101231,0.000530691,-0.000914335,0.000475818,0.000581576,-0.000290132,-0.000252357,0.00105726,0.000698537,0.000173823,-0.0000978198,0.000230127,-0.000654123,-0.000109047,0.000135525,0.00123984,-0.000805473,-0.00101579,0.000919973,-0.000801463,0.00016174,-0.000487985,0.00135867,0.000276011,-0.000210848,0.000137822,-0.000558317,-0.000429748,-0.000539942,-0.000169848,0.000350592,0.000803684,0.000716045,-0.00125648,0.000582386,-0.000431295,0.000152428,0.000666846,0.000351937,0.000283189,-0.00052327,0.0000767621,0.000675818,0.00106638,-0.00164356,-0.00152082,-0.000330423,-0.000718231,0.00118446,0.000294322,-0.00016215,0.0000222838,-0.00172529,-0.0013469,-0.000572369,0.000211351,0.000584324,0.000199883,0.000885368,0.000672615,-0.00153913,-0.0000863367,-0.00110966,0.000554307,-0.0011292,0.000622555,-0.000882693,-0.000895752,0.000594303,0.000355856,0.00105858,-0.00045262,-0.000805194,-0.00067163,0.0000432185,-0.00102125,-0.000686662,-0.000678341,-0.000394887,0.000743003,0.000698385,0.00170866,0.000924683,0.00117242,0.000418869,0.000489621,-0.000207151,-0.000148783,0.000392113,-0.00152693,-0.000699403,-0.0017078,-0.000945407,-0.000026715,-0.000182845,-0.000192165,0.00126507,0.00111951,-0.0000362708,0.00145862,-0.000264106,0.000374735,0.00128667,0.00125045,0.000637988,0.000183495,-0.0000737561,0.00111219,0.000629296,0.00134908,-0.000520503,0.000316485,-0.000656213,0.000340853,0.00186918,-0.000192438,0.00125708,-0.00184246,0.00135213,-0.000793383,-0.00147664,0.0000502473,0.0000522953,-0.000252482,0.000176483,-0.000465956,0.000947153,0.0000209438,-0.00158401,-0.00179739,-0.00191722,-0.000287287,0.000112189,0.000988819,-0.00000184972,-0.00143218,0.000272372,-0.000136143,0.0000048758,0.00110015,0.00176704,0.00117721,0.000520461,-0.000121643,-0.000676481,0.00154629,-0.00082528,-0.000961629,-0.000474376,-0.000172556,-0.000742514,0.000411809,0.00151668,0.000678692,0.000142543,-0.000266862,0.00125403,-0.000712541,-0.000490594,-0.0000325945,-0.00169837,-0.00104941,-0.000987461,0.000495482,-0.00163953,-0.00158137,0.000668357,0.00113388,0.00103013,0.000757311,-0.000151636,-0.00123943,0.0000837011,-0.0012408,0.000891051,0.00006581,-0.000100815,-0.000196074,-0.000165273,-0.000559208,0.00147685,-0.0000429797,-0.00129011,-0.000603686,0.000568842,0.000575682,-0.000434782,-0.000860116,-0.000591592,0.0000298867,-0.000666799,-0.000885289,0.000910043,0.0000675131,0.00169024,0.000593807,0.000512986,-0.00187284,0.0000413536,-0.00135627,0.000632931,-0.000362188,-0.00143977,-0.00044956,-0.000391839,-0.000787423,-0.000377076,0.000917384,0.000513688,-0.00125239,-0.000861619,-0.000386423,0.00174999,-0.000130314,-0.000512428,0.00116234,0.0012038,0.00124728,-0.000807514,0.000722762,-0.00186328,0.00032086,-0.00178287,-0.000168196,-0.00038868,0.000333896,0.00087997,-0.00169895,0.00124599,0.00148621,-0.000785898,0.000142371,0.00031315,0.00072065,-0.00075032,-0.0000867288,0.000481515,0.000947059,-0.000560162,0.00142288,-0.0000161746,0.000807123,-0.00168722,-0.00100455,-0.00130051,0.000465081,-0.0000677177,0.0016866,-0.000225953,-0.00105727,0.000283553,0.000123022,-0.0010517,0.0000488276,-0.0006214,-0.000767511,-0.000887629,-0.00128075,0.000109624,-0.000509775,0.00133939,-0.000347002,0.000690564,-0.000461361,-0.00058761,0.000858033,-0.000537682,-0.000566214,-0.000296383,0.00148654,-0.000821137,-0.000638145,-0.00125129,-0.00082412,0.000175659,0.00132948,0.000448032,-0.000961979,0.001093,0.000238839,-0.000193341,0.000717699,-0.000737626,-0.00023442,-0.00146831,-0.0000578056,-0.000531361,0.00106067,0.000136663,-0.00126253,0.000233674,0.0000958291,-0.000531511,0.000131647,0.00143089,-0.000924349,-0.000822194,-0.00198839,0.000760262,-0.000771829,0.000598682,-0.000790391,-0.000756625,-0.000989291,0.00123208,0.00106504,-0.00148551,0.00059522,-0.000142786,-0.000366103,-0.00100204,0.000599934,0.000124728,0.00151134,0.000618212,0.00119795,-0.00059981,0.000093232,0.000545203,0.000509724,-0.00072217,0.00182391,0.000724677,0.00108005,0.000191416,0.0019307,0.000114157,0.00197766,-0.00149091,0.00151912,-0.000204641,-0.00160508,0.000188323,-0.00165481,0.000543575,0.00146381,-0.000729517,0.00159621,0.00104292,-0.00113329,-0.000044381,-0.00061364,-0.000216507,0.000963005,-0.000550403,0.000336252,0.000431675,-0.00137636,0.000546037,-0.000582397,-0.000863402,-0.000725367,-0.00148257,0.000762668,0.0000406268,-0.00158662,-0.000850781,0.000957734,0.0000985271,0.0000550581,0.00119981,0.00176945,-0.0016512,0.00139954,-0.000278902,-0.00189133,-0.0000405702,-0.000984179,0.000830829,-0.00179171,0.000581877,0.000155203,-0.00156841,-0.00000155026,-0.0000244106,0.000329513,0.000464424,-0.000837239,-0.00000052537,-0.00103838,0.00142036,-0.000125994,-0.000695103,-0.000695437,0.000556352,0.000140432,-0.000765222,0.000893554,-0.00127098,0.000108109,0.000126938,0.000678992,0.000252874,-0.000555608,-0.000103032,-0.00107293,-0.000345197,-0.000449375,0.00136192,-0.000311143,0.0000770707,-0.00062711,-0.000887122,-0.000160744,-0.000710373,0.000187321,0.000557583,0.000845886,0.000700755,-0.00126209,0.00017617,0.000923816,0.0012162,0.00131397,-0.000358472,-0.00097199,-0.000351871,0.00100273,0.0015031,-0.00167488,0.000377613,-0.000766072,-0.000115935,-0.000803975,-0.000243751,0.000116981,-0.000287364,0.00109006,0.00165742,-0.0000618557,-0.000306239,0.000900149,0.0000755027,0.000250252,0.000280229,-0.00100493,0.00129139,0.00146904,0.00107704,0.000636247,-0.0012248,-0.000990201,0.000331236,-0.000336328,0.00150569,-0.00160807,0.000775683,0.000378983,0.000060694,-0.000505863,0.000550259,0.00155071,-0.000350495,0.000118934,-0.00102321,0.00174323,0.000198533,0.00115449,0.000718578,-0.000175813,-0.0000527193,-0.000139049,0.000285827,0.00157219,-0.0000338533,-0.0000740733,-0.000256605,0.00021148,-0.000581839,-0.000277637,-0.00063612,-0.00123201,-0.000372597,0.00107837,-0.00038244,-0.000429284,-0.000824134,-0.000972514,0.000609289,0.000383846,-0.00100518,-0.00126962,-0.0000079813,0.000704128,0.000980041,-0.00056152,0.000172477,0.000241159,-0.000515213,-0.000644303,0.0000117224,0.000069116,0.000443972,-0.000706865,-0.000393308,0.00160034,0.00154419,0.000654163,0.000236748,0.000269971,0.000849805,0.0015051,0.00172191,-0.00128896,-0.000632552,0.000352832,-0.000270213,-0.000569675,0.000312506,-0.00107246,-0.0000964239,0.000389037,0.000539336,0.000157023,0.000712603,0.000235108,-0.000224787,-0.000733278,0.00180618,0.000181605,0.000214856,-0.000894082,0.0000981057,-0.000971362,-0.0000392292,-0.000538433,-0.000316192,-0.000440598,-0.000657191,-0.00110667,0.000568862,-0.000234238,-0.0003616,0.000211418,-0.000237666,-0.000739433,-0.000140401,0.00191055,0.000167145,-0.00107954,-0.000634185,0.000402705,0.000477948,-0.000137163,-0.000538319,0.000285787,0.000810311,-0.00132675,-0.000225319,0.000421324,0.000242565,-0.000478156,0.000353839,-0.000401492,0.00198975,-0.000712577,0.000469073,0.00160279,-0.00165895,-0.000714649,-0.000197304,-0.00106464,-0.000230606,0.000376611,-0.00137537,0.000846763,0.00123295,0.000727111,-0.000363936,0.00148999,-0.000193653,0.00118493,-0.00113528,-0.00194457,-0.000129619,-0.00140819,-0.00147695,0.00128196,-0.000320744,-0.00137604,0.000390288,-0.00117376,-0.000189542,0.000419247,0.00030972,-0.00160821,0.000610601,0.000620275,0.000176957,-0.000608637,-0.00027717,-0.000404766,-0.000140141,0.00160703,0.00018387,-0.000244789,-0.000276623,-0.000357417,-0.000922184,0.000454443,0.000962229,-0.000422927,0.00145801,0.00134222,-0.00177714,-0.0000138916,-0.000750611,-0.00119846,-0.00199022,-0.00131712,-0.000647209,0.0000326106,0.000800315,0.00142114,0.000953773,0.000693373,-0.000510659,-0.000746056,0.000311423,-0.000789173,0.000151245,-0.000456289,-0.000851957,0.000445872,-0.000300609,0.00160472,-0.000427785,-0.00066575,-0.0000540941,-0.000804425,-0.000291199,-0.000673075,-0.0000237292,0.0000145458,-0.000633767,-0.00153462,-0.000155893,-0.00106261,-0.000147414,-0.00033636,0.00179341,-0.001457,0.000187272,0.00163812,0.0000886762,0.00113548,-0.000550294,0.0010339,0.00128366,0.00128899,0.000747922,0.00137869,-0.000819443,0.0000754709,-0.00109901,-0.00110349,-0.000886365,-0.000831829,-0.00188941,0.0011952,0.000480983,-0.000732805,-0.000658146,0.00133007,0.000437455,-0.00120534,0.000241692,-0.000472871,-0.0010922,0.00182751,-0.00180938,0.00103563,-0.000669608,0.0000270235,0.0000468826,0.000517492,-0.000520741,0.000599021,-0.000388358,-0.00173743,0.000255982,-0.000858418,0.00168668,0.000597602,-0.00038312,-0.0012729,0.000127293,0.0000512249,-0.0000484961,0.000290135,0.000538632,0.0000468406,0.00056403,-0.00159166,0.0011249,0.000313192,0.000332794,0.00146631,-0.000321698,-0.00139968,-0.00133353,-0.00107569,0.000207496,-0.000246495,0.000572811,0.000492361,-0.000808831,0.000537127,-0.000370091,-0.000442222,0.000579011,0.000217169,0.000538975,-0.000797195,-0.000414298,0.00130853,-0.000592578,0.00059262,0.000554265,-0.000853951,0.000152057,0.000648936,-0.0005763,0.00125611,0.000676685,0.0000714373,-0.00120048,0.000736263,-0.000789348,0.000556819,-0.000237295,-0.000300427,-0.00084132,-0.000330926,0.00171701,0.000320926,-0.000546222,-0.000814136,0.0006415,0.000743188,-0.000168201,-0.0000612706,-0.000217368,0.000191223,0.00159815,-0.00112316,0.00181926,0.000866913,0.000297745,-0.000684124,-0.000138823,0.0011191,-0.00127905,0.000179299,0.000477319,-0.0000821993,-0.00121956,0.00011562,-0.00126286,0.000127924,0.000170471,-0.00127492,-0.00127669,-0.000540502,0.00104613,-0.00124106,-0.000041746,0.000423351,0.00128491,-0.000228298,-0.00110238,0.000265036,0.00136717,-0.00067487,-0.0000441604,-0.000355938,-0.00114167,-0.00100646,0.000948558,0.000741798,-0.000947318,0.00178881,-0.000364309,-0.000817958,-0.0010846,0.000748615,-0.000300002,0.000971787,-0.000613325,-0.000678466,-0.000390569,0.000350583,0.000277456,0.000223984,-0.000688175,-0.000723453,-0.00139173,-0.000543953,-0.0000826789,0.000380132,-0.00106345,-0.000317691,0.00015461,0.00109766,0.000975019,0.00194765,-0.000135062,0.000885452,-0.0008311,-0.000110829,0.000698428,0.00102845,-0.000430333,-0.000827516,0.00130956,0.000854447,-0.00114698,-0.00131128,0.000850856,0.00112116,-0.000373071,0.000974738,-0.00132823,-0.0000579207,0.000808791,0.00134271,0.0000830541,-0.00005293,0.000282854,-0.000640385,-0.000971453,-0.000808332,-0.000968634,0.000363186,-0.00107588,0.000469393,-0.000133308,-0.0000572085,0.00100475,-0.000192224,0.000580092,0.000888209,-0.000781746,0.000683113,-0.000423176,0.00137447,0.000337371,0.000225429,0.000319686,0.000636855,0.0000428319,-0.00136468,0.000389894,-0.00105165,0.000731973,-0.000775435,-0.000673065,-0.000138586,0.000333407,-0.000854799,0.0001937,-0.00000467561,0.00177759,0.000627335,0.000516666,0.00120039,-0.00122816,-0.000185747,0.00061212,0.00150625,0.00111103,0.000823231,0.00089914,-0.000674489,0.000743787,0.000239331,-0.000907447,-0.00100932,0.0000652264,0.000559916,0.00141228,0.00018965,0.000174781,0.000237577,-0.000286508,-0.000607327,0.000915547,-0.00155628,0.00040293,0.0000216714,-0.0000885276,0.00000174085,-0.0000910605,0.00134242,-0.000850138,0.0000481132,-0.000493519,0.0000627026,0.00068284,0.000302449,-0.000632332,0.0000868426,0.000329693,-0.000643219,-0.00132721,-0.00186413,0.000883434,0.000839271,0.0000885285,0.000728081,0.0006696,0.000295328,0.000828312,0.000332399,-0.00101801,-0.000133459,0.000439871,0.0017098,-0.000151936,0.000135129,-0.0003841,0.00171866,-0.000887521,0.00092097,0.00058584,-0.0000716035,0.000296984,0.00060726,0.000178972,-0.000396985,0.000171825,-0.000602815,0.000276345,0.000670421,0.00183283,0.0017581,0.000505217,0.000610168,-0.00118422,-0.00184509,0.000351022,-0.00107453,-0.00144752,0.000504814,-0.00120606,0.00103273,-0.00147134,0.000502379,0.000703017,-0.000977489,-0.00128426,0.000906477,-0.00152667,0.000760441,-0.000440277,-0.00199314,0.0000405908,-0.00140006,-0.000377449,0.000442808,-0.000123653,0.000377431,0.000230427,0.00159873,0.00112758,-0.00150649,0.00164914,-0.00148818,-0.00187901,-0.000355828,0.000483309,0.00136866,-0.000943744,-0.000434454,0.000340735,0.000582598,0.00198527,0.000400286,0.00127928,-0.0000253953,-0.0013148,0.0000319269,0.00151066,0.00102741,0.000194145,-0.000252539,-0.00123383,0.000866156,-0.00144379,-0.00119846,-0.000863487,-0.000165989,0.00000465648,0.000432887,0.000476429,-0.00122955,0.00151488,0.000714182,0.000461582,-0.000304639,0.000486312,-0.00147795,-0.0000648756,0.000140629,0.000487574,-0.000415743,0.000897534,0.00130429,0.000578931,0.00169562,0.00192175,0.00079073,-0.00073771,-0.000980748,-0.00167431,0.000889585,0.000639606,0.000902949,0.000953748,-0.00065174,0.00130231,0.000187618,0.000125834,0.000278513,0.00150384,0.000863251,-0.000223186,0.000571993,0.000201282,-0.000333196,0.00166436,-0.00192668,0.000936012,0.000499472,-0.000814945,0.0000438624,-0.00112282,-0.00101052,-0.000274336,-0.000421093,-0.00082524,-0.0000244954,-0.00060593,0.000210454,-0.000514739,0.000705498,-0.00187643,-0.000753662,-0.000269278,0.00107719,0.00130335,-0.00108068,0.000689673,-0.00102811,-0.00000792218,-0.000669822,-0.000359325,0.00168367,0.00062867,0.000561274,0.000364588,-0.000162607,0.000952926,0.000390985,-0.00013232,-0.00114484,0.00179491,0.000366503,-0.00038433,0.000755032,0.000918272,-0.000136838,-0.000786574,0.000870364,-0.000996091,0.0000944039,-0.001044,0.000217289,-0.000726401,-0.0000274291,-0.000171956,-0.000760811,0.00105405,-0.000552736,-0.000247508,0.0000817825,-0.00104947,-0.00155632,0.00151989,0.00072523,0.000388816,0.000658866,-0.000829575,-0.000260388,-0.000145639,-0.000966797,0.0000717024,-0.000389626,-0.000626635,0.0000629191,-0.00110074,0.000331064,-0.000190364,0.000250582,-0.00138654,0.000994172,-0.000260518,0.000182755,-0.0005771,0.0000633435,-0.000111731,-0.000196602,-0.00109029,-0.000428667,-0.00030929,-0.00188705,0.000513974,-0.000725416,-0.000824998,-0.000972782,-0.000972965,0.000497867,0.00050344,0.000696249,0.0018352,0.000248849,0.00175502,-0.00109591,-0.00176795,-0.00119607,-0.000962534,0.000623336,0.00152465,-0.000275031,0.00176568,0.000441467,0.000573364,0.000945879,-0.00193756,-0.00132232,0.000533189,-0.00106451,0.0010184,-0.000162504,-0.000866471,-0.000637557,-0.000551655,0.000504067,0.00126942,-0.000139295,-0.0000832823,-0.000564265,0.00142746,0.000899426,0.000180515,0.00123275,0.00143712,0.00103647,0.000853348,-0.00147367,-0.000215517,0.0000652177,-0.000426196,-0.000176153,0.00140145,-0.000135838,0.00160946,0.000659299,-0.000870985,-0.00106474,0.000931839,-0.00147744,-0.000872798,-0.000445011,-0.000066052,0.000407709,-0.0000149319,0.000843395,0.000311827,-0.00102222,-0.00139901,-0.000123451,-0.0000785452,0.0000700665,-0.00105917,-0.00122374,0.000956545,-0.0007004,-0.000643417,-0.000875679,-0.0015035,-0.000153871,-0.00011959,0.000573829,-0.000220966,0.00133061,-0.000886889,-0.00165156,0.000791226,-0.000572805,-0.000866035,0.000751754,0.000712419,-0.00133284,0.00118209,0.000234418,0.00158097,-0.00105795,-0.000569049,-0.000940986,-0.000466494,0.00133941,-0.00020222,0.000603281,-0.000766864,0.00165034,-0.000400873,-0.000439414,0.000188861,0.000152185,-0.000430414,0.000752955,-0.0000265176,0.00140829,-0.000293225,0.000408139,-0.000332186,0.00164715,0.00104548,0.00178665,-0.000630764,-0.0000567694,-0.000463299,-0.00060017,0.000505497,-0.000385137,-0.00149713,-0.000907852,0.00083157,0.00194644,0.00156675,-0.000158618,-0.000788745,-0.000355093,0.000212454,-0.00032925,-0.000649162,-0.000158236,0.000126817,0.000487123,-0.000633699,0.000276021,-0.00126003,-0.000188075,-0.000240872,0.000119619,-0.00142189,0.00000655944,-0.0012682,0.00027378,0.00199821,0.000386892,0.00010578,0.000167356,0.000724614,-0.000563968,-0.000364823,-0.00140282,0.00101246,-0.00120123,0.00193407,0.00135546,-0.000208751,0.00132585,0.000858463,-0.000522012,-0.000856916,-0.00108314,0.000127537,0.00119896,-0.00182601,-0.000549486,-0.000878612,-0.00151478,-0.000721651,0.00110932,-0.000618523,0.000566593,0.0000789469,0.0000211106,-0.000374704,-0.00162256,0.000425292,-0.000267191,-0.000284765,-0.00121642,-0.000556212,0.000705134,0.000694906,0.0000631192,-0.000866849,-0.0000631492,-0.000254831,0.000568965,0.000642933,0.000622152,0.00128465,-0.0000796762,0.000751217,-0.000718766,0.0016244,0.000328166,-0.000105694,-0.000971072,0.000428802,0.000906071,-0.00116683,-0.000339896,-0.0012475,-0.0014136,0.000550864,-0.000700866,0.000141247,0.0014282,-0.000439275,-0.00101059,-0.000543585,-0.00126819,0.0000145276,0.00117568,0.000222961,0.00115431,0.000447294,0.000188283,-0.000868933,0.00104638,0.000397107,-0.00066209,0.0000540325,0.000743959,-0.000207932,-0.000949759,0.000377273,0.000398425,0.000137145,0.000774402,-0.00083134,-0.000288112,-0.0016768,-0.00143247,-0.000186175,0.000382167,0.000194533,0.000770479,-0.00179712,-0.00151519,0.0000681836,-0.000218,0.00151061,-0.00178239,-0.000578118,0.0000702413,-0.00118457,-0.00165603,0.00136516,0.000160276,-0.00114431,-0.000941698,-0.0013214,-0.001349,-0.000942948,-0.000981545,-0.000154295,-0.000976332,0.00120582,-0.000333135,-0.000286802,-0.00119618,-0.000209912,-0.0016806,0.00108576,-0.00109445,0.000900693,-0.00089297,-0.000615253,0.000548267,-0.000514023,-0.000902267,0.000171811,0.0010358,0.000701757,0.00129339,0.000422237,-0.00134274,0.00114513,0.000209607,-0.0000680246,-0.000357876,-0.000862909,-0.000356871,0.000710171,-0.00120675,0.000130576,-0.000642949,0.0000243551,-0.000482704,-0.00109906,-0.00134841,-0.000300535,-0.000133141,0.000339454,0.00105239,0.000320343,0.000189048,0.00112147,-0.000842238,-0.000681115,-0.0000407773,0.00137605,-0.000599645,-0.00149291,0.000659132,0.0000955099,-0.000671112,-0.000606153,0.00103429,0.0000563182,-0.00030449,0.00130928,0.000779866,-0.00020013,0.00031887,-0.00046221,0.000464797,0.000249671,0.00131583,0.000980545,-0.0000122535,-0.000777391,0.000204646,0.00127833,0.000381027,0.00073341,0.000952819,0.00138788,-0.000552069,0.000303286,0.000536412,-0.000149839,0.00013788,-0.0010207,-0.000755284,-0.000470403,0.000381816,0.000788928,0.000432074,-0.000184173,0.0000995494,0.00125102,-0.000729003,-0.000177814,0.000360932,-0.00090587,0.000645361,-0.000789713,0.00150481,-0.00110518,0.0010808,0.00107315,-0.000443794,0.00114153,0.000225116,0.000384776,-0.000499249,-0.00057068,-0.00115481,-0.000206647,-0.000570941,-0.00163009,-0.000747651,-0.00161248,0.000198605,0.00122665,-0.000592575,-0.0013566,0.000385551,-0.000902454,-0.000612792,0.000464581,0.00192036,0.000813618,0.00142692,-0.000369305,-0.00103421,-0.000731577,-0.000799962,0.000983454,0.000831149,0.000602489,-0.000100031,-0.000227175,-0.00031051,-0.00115513,0.000993693,0.000529984,0.00146637,0.00148069,0.000793514,0.000626158,0.0000821805,-0.000857056,0.00125444,0.000210147,-0.00102201,-0.0014607,0.001047,0.000644671,-0.000906978,-0.00135692,-0.000690491,-0.000318631,-0.00128425,-0.000511318,0.00184484,-0.000551181,-0.000385185,-0.00126128,0.000425775,0.000900381,-0.0000676109,0.00151634,-0.000507445,-0.000447331,0.0000254245,-0.000830932,0.000360662,0.00182158,0.000344482,0.000465034,0.00126429,0.00132148,-0.00177092,-0.00041,-0.000741469,0.000129445,-0.00145321,-0.00143166,0.000917608,0.000250052,0.000493341,0.00181216,-0.000142421,-0.00133758,-0.000258783,-0.000355855,-0.000444105,-0.0017376,-0.00175257,0.00170965,0.000469599,0.000572908,0.000342711,-0.000557033,-0.000570965,-0.000725214,-0.00170195,-0.000475888,-0.000354207,0.000128432,0.00122471,0.00105473,-0.000103823,0.000875135,-0.000102514,-0.000638163,0.000174633,0.000649024,-0.000348908,-0.00138041,0.000526294,-0.000365713,-0.00100838,0.000258038,-0.000986936,0.00177178,0.000658551,0.001365,-0.000210993,0.00043073,-0.00015453,-0.00114184,0.000223673,0.000111936,0.000828332,-0.00106471,-0.000180741,0.000456632,-0.0000935684,0.000366552,-0.00138113,0.000246057,-0.000687529,0.00106893,-0.000818525,0.000113542,0.00120158,0.00152696,0.000191773,0.00117747,-0.000255426,-0.00140875,0.000469037,-0.000628065,-0.000326268,0.00101012,-0.000163138,-0.00162671,-0.000119508,0.000113583,0.0011239,-0.00046278,0.0012661,0.000500799,0.00104083,0.000995036,-0.00155899,-0.000481449,0.000209753,-0.000202335,0.000101532,-0.000298814,-0.00140398,0.00111153,-0.000555299,-0.000118151,-0.000652053,0.000292334,0.000981416,-0.000491106,-0.0000259701,0.000833292,-0.000521199,0.00101141,0.00163102,-0.0000938849,0.00102972,-0.00134378,-0.000668365,-0.00128965,-0.000502579,0.00063652,0.000127177,0.000841439,-0.00112093,-0.000907524,-0.000600996,0.000651475,-0.000324698,0.00067066,-0.000694646,-0.00137941,-0.00190132,-0.000126281,-0.000160337,-0.0010063,0.000199117,0.000114793,0.000951909,0.000224962,-0.000249712,0.000387191,0.000357731,0.0000969701,0.000779851,-0.00196009,-0.00193639,0.000437059,-0.000144207,-0.000101307,0.00117766,-0.0000105162,0.000157789,-0.000739958,-0.000516552,0.000415937,0.00161448,0.000722824,0.000122966,0.00108337,-0.00033345,-0.00114414,-0.00169884,0.000838837,0.000652189,-0.000651642,0.00197292,-0.000535703,-0.000316794,0.00146363,-0.000967782,0.000478991,0.000913994,-0.0000302231,-0.000712922,0.00090936,-0.0017302,0.000355257,0.000247263,0.000987502,-0.0000097429,0.00086271,0.000443359,-0.000585328,0.0010771,-0.000368108,-0.00138474,0.00109461,0.00153644,0.000340124,-0.00102467,0.000839736,-0.000328045,-0.000632098,-0.00063849,0.000698816,0.00100363,-0.000897216,0.000329572,0.000304754,0.000151247,-0.000479838,-0.00188104,0.000710108,-0.000238521,-0.00133635,-0.000679476,-0.00177434,0.00141934,-0.0010314,0.000926915,0.0000531316,-0.00159507,0.000894586,-0.00139787,-0.000880166,-0.000146065,-0.000365829,-0.000602091,-0.000553928,0.000197631,-0.00103597,0.000642502,-0.0009905,-0.0000798996,-0.0000471458,0.00013205,-0.000325851,-0.000587177,-0.00121516,0.0013554,0.00125511,0.000175504,-0.000989159,-0.000300058,0.00128934,0.000914399,0.000631338,0.00101705,0.00168505,0.00155639,0.0000451462,-0.000281425,0.000667046,0.000260057,-0.000294485,-0.00129719,0.000690089,-0.000505545,0.000137127,-0.000225977,-0.000242071,-0.00113043,-0.000844231,0.000123537,-0.000884133,-0.000890697,0.000868568,0.00121793,-0.00125635,0.00192978,0.0000590295,-0.000115182,0.000515781,0.000949773,-0.00101609,0.00138305,0.000506826,0.000491038,-0.000588344,0.00163657,-0.00050778,-0.000747487,0.001467,-0.000394578,-0.0017356,0.000204251,-0.000161704,0.000646329,0.00095945,0.000774836,-0.000440062,-0.0000327667,-0.000221171,0.00154915,0.000532331,-0.00134439,0.000216787,-0.00009543,-0.000994147,-0.00164463,-0.00114352,0.00139343,0.000555183,0.00171086,-0.00037851,-0.00142675,-0.00152613,0.000322681,0.00114353,0.000531971,0.000382766,0.000754727,0.0000654189,0.000709423,0.00156951,-0.00108454,0.000980854,0.00150803,-0.000597821,-0.000246615,-0.000640872,-0.00100005,0.000214603,-0.001448,-0.000344792,-0.00131554,0.000331589,-0.000519299,-0.000365262,-0.000177908,-0.00140789,-0.00103126,-0.00044027,0.000629168,-0.0000757146,0.00044374,-0.00130864,0.000348071,-0.000527885,0.00199165,0.00101944,0.00108074,-0.000160032,0.00195631,0.000362133,-0.000147954,-0.000690355,0.00103583,0.00111381,-0.000737743,0.0000750282,-0.00062965,-0.00047504,-0.000521751,0.00145296,0.000557881,0.00110137,-0.000116377,0.000402113,0.000504917,-0.000704363,0.000618938,0.0000212101,0.00109522,0.00137395,0.000702473,-0.000759435,-0.00159285,-0.000781899,-0.0000854839,-0.000406203,-0.000762842,0.000534255,-0.00072187,0.000752342,0.00106312,-0.0012884,-0.000176763,-0.0000715585,0.000452275,0.000368119,0.000740601,0.0000532073,0.000484038,0.000974941,0.000239539,-0.000219619,-0.00000849165,-0.000118107,0.00146123,-0.000909033,0.000460371,0.00024006,-0.000668462,0.000869123,0.0000227569,-0.00000715214,0.00133765,-0.000128151,0.000350006,-0.000987029,0.0009833,-0.000462771,-0.00118308,-0.000949168,0.00168348,-0.00103431,0.00175333,0.000105066,0.000157219,0.000498842,-0.000361863,0.000173214,-0.000334621,-0.000580873,-0.00138785,0.00148891,-0.00087261,0.000734539,-0.000242364,0.00174875,0.00105671,0.000913175,-0.000392344,-0.001934,-0.000461378,0.000208657,0.000374601,-0.00116916,0.00165857,0.00185664,0.000830083,-0.0000455042,0.00109897,0.00101162,0.000242446,-0.00151534,-0.0000734747,-0.00106847,0.00124907,-0.000711593,0.000291757,0.000111633,0.0000480486,0.00105623,0.000684415,0.00104823,-0.00126838,0.000594414,-0.000304244,0.000229121,-0.00160646,-0.000806956,-0.000660882,-0.000441217,-0.000977566,0.000797003,-0.000585558,-0.00112922,-0.000688406,-0.000116756,-0.00190095,0.000132114,-0.000251474,0.000664179,-0.000778889,-0.000189238,0.0000378202,0.000583111,0.000163001,-0.00161141,-0.000507353,-0.000175144,0.00101949,-0.00000555123,0.000442108,-0.000128489,-0.0000431152,0.00176877,0.000413205,-0.00024559,-0.000537744,-0.000309962,-0.000528839,0.00176142,0.00143792,0.00127317,-0.0000684284,-0.00022163,-0.00042256,0.0013493,0.000692235,-0.000000707091,-0.00158773,0.00138344,-0.000627801,-0.00171963,-0.000603593,-0.00118441,0.000279658,-0.000944472,-0.000697435,0.00103723,0.00139753,-0.00152883,0.000621646,0.0000776635,0.00000625983,-0.00110651,0.000516875,-0.00140372,0.000288825,0.000504126,-0.000481697,-0.000632872,0.000637513,-0.000900623,-0.00031404,0.000931889,-0.0000401107,-0.00116648,-0.000746063,0.000198501,-0.0000583914,0.000314715,-0.000317942,0.000480265,0.000323286,-0.000674735,-0.00173082,-0.00137926,0.00140577,0.000400611,-0.000391664,0.00123914,0.00166822,0.000933412,0.000386424,0.000399231,-0.000406445,-0.000900248,0.000989207,0.0000383135,0.000839171,-0.000670077,0.00106209,-0.00121331,0.00132431,-0.000880041,0.00118845,-0.000881828,-0.00000726684,0.00049077,-0.00143659,-0.00130932,-0.00147882,0.00156774,-0.000646794,-0.00114104,0.00041874,0.000577262,0.000565653,0.000209454,-0.000175768,-0.000778087,0.000517675,-0.000850268,0.000119186,-0.00141994,0.000676344,0.00100459,-0.00148485,-0.00107232,0.00035905,-0.000969881,-0.0012518,0.000271153,0.000041136,-0.000649992,-0.00143691,-0.000579526,0.0000291309,-0.00128235,-0.000222651,0.00045398,0.00197677,0.00152101,0.000689454,-0.00071957,0.000768896,0.000802692,-0.00064769,-0.00126674,0.000708138,0.000422841,-0.0012428,-0.000655953,-0.000977793,-0.000090221,0.00122925,-0.00105735,-0.00157343,0.000501776,0.000678937,-0.00055095,0.00103062,0.0000498874,0.00015925,0.001238,0.000680159,-0.000196411,0.00151784,0.000030781,0.000779421,0.000987257,0.000752056,-0.000181139,0.0000746465,0.000771655,-0.000399102,0.0000893647,-0.0000130943,-0.000142602,0.000494299,-0.000117465,0.000203276,-0.00171962,0.00146999,0.00193343,0.00145578,0.00023685,-0.000548337,-0.000486315,-0.000812127,0.000784519,-0.000411604,0.000687379,-0.000793015,0.000716332,0.000357714,-0.00168637,0.000561315,-0.000278611,0.000349944,-0.000650852,-0.00167834,-0.0000423328,0.00126621,0.000296887,-0.00113789,0.000843653,-0.000846106,-0.000157127,0.00115487,0.00135395,0.000413619,-0.0012215,0.0014121,0.000308812,-0.0003317,-0.000790681,-0.000256929,-0.0000809832,-0.00151791,-0.000207561,-0.0000807536,-0.0000876477,-0.00039315,-0.000354297,0.0014363,0.000300705,0.000219112,0.00103586,0.00127924,-0.000478586,-0.000203836,0.0000226088,-0.000379011,0.0000804073,0.000585863,0.000318798,-0.00137449,-0.00117091,-0.00117468,-0.000256107,0.00139293,0.000979026,-0.000271061,0.000172857,0.00106975,0.000320242,-0.000366641,-0.000066436,-0.000470296,0.000778467,0.00119748,0.000178524,-0.000163112,-0.00116195,0.000506542,-0.000255195,-0.00122325,0.000803644,0.000219443,0.00170181,0.00167976,-0.000402091,-0.000729757,0.00103528,-0.00154715,-0.000232158,-0.000803478,-0.000628845,0.000139428,-0.00168394,-0.000214366,-0.000873196,0.00186829,-0.0000872793,-0.0000256778,-0.000943252,-0.000474474,-0.000270119,0.000605914,-0.000920838,0.000789023,0.00001446,-0.000581763,0.000100321,0.000168135,-0.000782536,-0.0015432,-0.000663903,-0.000409957,0.000179051,0.000634857,0.000522944,-0.0000319004,0.0000616505,0.000610797,0.000278612,-0.0000860141,0.000634469,-0.00103751,0.000715663,-0.00105281,-0.00160775,0.000110873,0.00190213,0.0000970895,0.000704097,-0.00189571,0.00182299,-0.000833013,0.00119577,0.000390117,0.000139812,-0.000423377,0.000977007,-0.000888723,-0.000941842,0.00025293,0.000882417,0.000278144,0.000612585,0.00142647,0.000995246,0.000586326,-0.000711763,0.0000758899,-0.00102504,0.00131979,-0.00195074,0.000718048,-0.000126021,-0.000146165,0.000661904,0.000587102,-0.00156443,0.000151893,-0.000901117,-0.000292804,-0.000928673,0.000938734,0.000331032,-0.00130336,0.00152443,-0.000510758,-0.000857788,0.00018262,-0.0000425735,-0.0000682787,-0.000929316,0.0000257312,0.0013052,-0.000413022,-0.00108157,0.00036943,-0.00120388,0.00118361,-0.00164559,-0.00158933,-0.00114828,0.000375844,0.000880593,-0.0000669608,-0.000461977,-0.000891337,-0.000790712,-0.0016616,-0.00154962,-0.00111988,0.00125786,-0.000317778,0.000389853,-0.000855355,0.000566791,0.000879887,-0.000515043,0.000233408,-0.000918978,0.00108228,-0.00122081,0.0000223683,0.000351937,0.00117651,-0.000681096,-0.00129288,-0.00130122,0.000182988,-0.00149815,-0.00152236,-0.0014016,-0.000895501,-0.000944016,-0.000154622,-0.000146337,-0.00138553,0.000140315,0.0000771831,-0.00107183,-0.000540414,-0.000811569,0.000675401,0.000641231,0.000133076,0.00131049,-0.000401427,-0.00125949,-0.00167554,0.000226633,-0.000953657,-0.000011256,0.0000932189,-0.000595596,0.000374324,-0.000573759,-0.00125057,-0.000230787,-0.000448654,0.000775937,0.000773457,-0.0000672549,0.000866676,-0.000913667,-0.000458362,0.0000964471,0.00108121,-0.000241323,-0.000697078,0.000260928,-0.000764594,-0.000401882,-0.000554439,-0.00128688,0.0012498,0.000712335,-0.000882129,0.00108589,-0.00168073,0.00115561,0.000335847,-0.000928975,-0.000757459,-0.000568124,0.000201701,-0.000739638,0.00154093,-0.000418793,-0.0000463864,0.00065931,-0.00168841,0.00114237,-0.00028609,-0.000484372,-0.000127186,-0.000367526,-0.000253853,0.0012475,-0.000287587,-0.000844661,0.000123372,-0.000386738,0.00173541,0.000140488,-0.0000489216,0.0010769,-0.000573221,0.0000283733,0.0010982,0.000544813,0.000539744,-0.00154152,-0.000666345,0.00120149,-0.00106607,0.000856492,-0.000422378,0.000407384,0.0000966026,0.000759491,-0.00108072,-0.00116069,-0.000483912,-0.000509278,0.0000530343,0.000430481,-0.000318635,0.00128473,0.00151271,0.000951302,0.000729086,0.0000325211,0.000599189,-0.000542685,0.000292761,0.00111588,-0.000717291,-0.000719292,-0.000104948,0.00130806,0.000843093,-0.000734176,0.000544488,0.000175078,-0.00148751,0.000120678,0.000821987,-0.000347378,-0.0000291375,0.000517989,0.00074382,-0.000704787,0.000187218,-0.00160026,-0.00144495,-0.000241179,-0.000406592,0.00198494,0.000910479,0.00105927,-0.00142982,-0.000863278,-0.000430299,-0.000141448,0.000747236,0.000590532,-0.00146381,0.0000718071,-0.000300771,0.000356615,-0.000960828,-0.000677901,-0.00179973,-0.00156557,0.00116429,-0.000831745,-0.000349114,0.000693066,-0.000369156,-0.000197531,0.00138278,-0.000320641,0.000186976,0.000272212,-0.000726098,0.000138147,0.0011326,0.000790994,-0.00090791,-0.000272367,0.000212453,-0.000222371,0.00132612,0.0010272,-0.000580987,-0.000695295,0.000484059,-0.00142829,0.00008162,-0.00185307,-0.000775668,-0.000161941,-0.00019473,-0.0000659566,-0.00119252,0.0000601074,0.00139063,-0.000403281,0.000135413,0.00148663,0.000711613,-0.000234109,-0.000969027,0.0000799059,-0.000086077,0.00053831,-0.000344587,-0.00180316,0.00102246,0.0000289997,0.000527111,0.000679524,-0.000150872,0.000660226,0.00113399,0.000933548,-0.000578995,-0.00051973,0.000224347,-0.00127061,-0.000872377,0.000823176,0.00140462,-0.000671645,0.000647303,0.00105344,0.00147365,0.000988741,-0.00162104,0.0000678099,-0.000767015,-0.00170647,0.00127668,0.00120863,-0.00119072,-0.000835016,0.000927195,0.000458337,-0.000468567,-0.00128856,0.000942021,-0.000588508,-0.00107351,0.0000752566,-0.000188954,-0.00114791,-0.00010963,0.00102653,0.00018605,-0.000178064,0.000758929,-0.000138813,0.000789185,0.000149757,-0.0000175456,-0.0000723106,0.000165055,0.000788927,-0.000237613,-0.00108457,0.000675601,0.00155023,0.000533973,0.000411685,-0.000652047,0.00150864,-0.000854586,-0.00194628,-0.00162219,-0.000697717,-0.0000993822,0.000801422,0.00199072,0.0000817023,-0.000594426,-0.000710362,0.000545561,-0.000300458,-0.000836767,0.000795771,-0.00163791,0.00021446,-0.0012725,0.000732455,-0.00011271,-0.000296394,0.00106266,0.00135401,-0.000631887,-0.00015657,0.00121778,-0.000284759,-0.000340677,0.00162903,0.00198334,0.000686512,0.00089799,0.00156455,-0.000834919,0.000232427,0.00142822,0.000403677,-0.00100911,0.000990873,0.0000707823,0.000776564,0.000160616,0.00105791,-0.00182218,-0.0000731089,-0.000120772,0.000023658,-0.000429185,0.0000695688,0.000638882,0.000251888,-0.000295323,-0.00036761,-0.000224153,-0.0000308518,-0.00122502,0.000710251,-0.000855413,-0.000843591,-0.000515206,-0.00146017,0.000205281,0.000468522,0.000816966,0.001091,-0.00104819,0.000353519,-0.000446762,-0.000454996,0.00196944,0.000859978,0.000128527,0.000395811,0.0016487,0.0008039,-0.000840665,-0.0016841,-0.000793964,-0.000377029,-0.000983055,-0.00189412,-0.000157536,0.000619551,-0.00163626,0.00106932,0.000790039,-0.000144004,-0.0011839,-0.00125482,0.00149478,-0.00103383,-0.000471093,0.00130229,-0.00042853,-0.00030987,0.0000515155,-0.00017063,0.00120256,-0.00112301,-0.0012307,0.0000509965,-0.00197865,-0.000446067,0.00147437,0.00191843,-0.000843264,-0.00141315,-0.000480798,0.0010579,0.00146141,-0.00122762,0.000921855,0.000403988,0.000235879,-0.0000147367,-0.00188593,0.00180359,0.00126023,-0.00117119,0.00023174,0.00135992,0.000321424,0.000769917,-0.000618283,0.000905872,-0.000440532,-0.000886984,0.000187283,-0.000181395,0.000279043,-0.000207072,-0.000484367,0.00100704,0.000572686,0.000359368,0.00141213,0.0000170335,-0.00102889,0.000019384,-0.00052567,0.000458852,-0.000273227,-0.0000993676,0.000480693,0.0011694,0.00023044,0.00179178,-0.0000542944,0.000213019,0.00158746,0.00182753,0.00118854,-0.000104298,-0.000813337,0.000657909,0.000956623,-0.000183719,0.00153834,-0.00118292,0.00098147,-0.000764687,0.00109794,-0.00115359,0.00163315,-0.0011591,-0.000596467,-0.000951912,-0.00100473,-0.0000654095,0.000525549,-0.000138844,0.00105971,0.000101061,0.000601267,0.000179063,-0.0000962197,0.000368043,-0.000553367,-0.00183954,-0.000500717,0.00157539,-0.000756738,0.00112361,-0.00170469,0.00105061,0.00024957,0.000512454,-0.000636753,0.000140133,-0.00127773,-0.000614583,-0.000414145,-0.00139233,0.000213223,-0.000544369,-0.0000793841,-0.00161624,0.000849171,0.0000681145,0.000387296,-0.00161011,0.00190211,0.00171898,-0.000194919,0.0000585788,-0.000489162,0.000602103,0.00111019,0.0000885901,-0.000107409,-0.000151297,0.00111722,-0.00118616,0.000259761,-0.00123397,-0.000993168,-0.00062712,-0.000385915,0.00112258,0.000721087,-0.00159903,-0.000864305,0.000645174,0.00156229,-0.00135062,-0.000450366,0.000203465,0.00190523,0.0000919673,-0.000336619,-0.000814153,-0.000880708,-0.000994182,0.00112924,0.000445979,-0.000433669,-0.000622127,0.000562232,0.000745458,-0.00169017,0.000715195,0.000141325,-0.0000780149,-0.0000217626,-0.000799649,-0.0000199594,0.000027971,0.000129787,-0.000141571,-0.000762869,0.000709572,0.000123182,-0.0000754477,0.000248942,0.000310554,-0.000174395,-0.00137647,0.0013321,-0.00156089,0.00091495,0.0000378404,-0.00099866,-0.000648101,-0.000343978,0.000248793,-0.00176139,0.00108193,0.000192789,0.000688794,0.000503313,-0.000666696,-0.000959053,0.000693579,0.000745546,0.00164885,-0.000635156,0.000626746,0.000360652,0.00122043,-0.000634115,0.00127406,0.000727181,-0.000527157,-0.000337256,-0.000327014,-0.000943344,0.00100884,-0.00184295,0.000783266,0.000873156,0.00105016,-0.000265284,-0.00115802,-0.000206182,-0.000897179,0.00133249,-0.000884856,-0.00172443,0.000929681,0.00141452,0.0000410592,-0.000858481,-0.000577519,0.00179786,0.0004863,-0.00130649,-0.000903336,-0.00189117,-0.000604586,-0.000793329,0.000768223,0.000913875,0.000475175,0.000643733,0.000667505,0.000715929,0.000753606,0.000265975,0.0019968,0.000381379,0.00013119,-0.000535979,0.000611367,0.000306209,-0.000383208,-0.000725337,-0.000758564,0.000801435,0.0000707652,-0.000519076,-0.000051656,-0.00116027,0.000255303,-0.00154978,-0.000118458,-0.000303054,-0.00189364,0.000380735,0.000570501,-0.000726961,0.00073667,-0.0000665543,0.00107214,0.000819866,0.00135712,-0.00185684,0.00155656,-0.00101762,-0.00018645,0.000488884,-0.000141308,0.0015288,-0.000963729,-0.000918324,0.00064815,-0.00056448,-0.000200636,-0.00142252,0.0009668,-0.00036689,0.00137176,0.000636587,0.000142309,0.000887902,0.000698265,0.000263981,0.000897659,-0.000484427,-0.00150621,0.00084962,0.00101783,0.00125243,0.000735617,-0.000203118,-0.000511082,-0.000924354,0.0011506,0.00188397,0.00174929,-0.00105065,-0.000149283,-0.000552912,-0.000389549,0.00026665,-0.000221754,0.00123205,0.000965925,-0.000466531,-0.000823419,0.000462792,0.000208385,-0.00162052,-0.000177833,0.000531455,0.000154001,-0.00109147,0.000337158,-0.000665977,0.000175891,0.000246046,-0.0003065,-0.00027362,-0.0000853759,-0.000806854,0.000525837,-0.000906859,-0.00137202,-0.00116331,-0.000700147,-0.000821073,-0.000803987,0.000507226,0.00171682,0.000392979,0.000472849,-0.000070249,0.000612413,-0.000328005,0.000706153,0.000637604,0.000538928,-0.000710624,0.00177847,-0.000738577,0.00111847,0.00016983,0.000654133,0.000180918,-0.00161187,0.00117287,0.00117005,-0.0016845,0.00188756,0.000240727,-0.000125875,-0.00158266,-0.000827227,0.000924559,-0.000633985,-0.000147259,-0.000240536,-0.00088609,0.000281454,0.000869415,0.0000165228,-0.000116874,0.000167029,-0.000218828,0.0010353,-0.000606691,0.00133952,0.0000546545,-0.00130795,0.000671884,0.000612276,-0.000692952,-0.0000779731,-0.000100505,-0.000671415,-0.00103377,-0.00151563,-0.000515027,0.000935559,-0.00171652,0.000102293,-0.000730082,0.0000691329,-0.000529275,-0.00033102,0.00156551,-0.000124897,-0.0000784797,0.000142452,0.000317824,-0.000415814,-0.000554989,0.000182273,0.000689985,0.000320175,-0.000387075,-0.00115866,-0.000281684,0.000909045,-0.00117099,-0.000635972,-0.00117869,-0.0000511691,-0.00191872,-0.000179971,0.000244972,0.000145113,-0.000383125,-0.0000873866,-0.00109724,-0.00108265,-0.00154038,-0.000366424,0.00112477,0.0000625393,-0.0000652369,0.00130013,-0.000164819,-0.0000686726,-0.000755303,0.000643161,0.001337,-0.000867818,-0.000480266,-0.000510306,0.000623962,0.000125587,0.000012965,-0.000656084,0.00148622,0.0018142,0.000852745,-0.000214414,-0.00159149,0.000898512,-0.000665649,-0.00147916,0.000763403,0.0000139865,-0.00131433,0.000303835,0.000947552,-0.000588453,-0.0000174431,0.000915152,0.00105631,-0.000556435,-0.000225757,0.000225258,0.00176908,-0.000740145,0.000525131,0.000532074,-0.000297856,-0.000331476,-0.000955411,-0.00015666,-0.0000664009,0.00163378,0.0000906923,-0.000101502,0.000903761,-0.000474674,-0.00116596,-0.000665223,-0.000358699,0.000920161,-0.00053369,-0.000545069,-0.000693341,-0.000803547,-0.000504516,0.00198681,0.000252584,-0.000199206,0.0000162005,0.0000858841,-0.000774794,-0.00116307,0.000220006,-0.000306983,0.00082354,-0.000420446,0.00120833,0.00113464,0.0000475691,0.00139635,0.0001161,0.0000434449,-0.00000637857,0.000755139,-0.000907362,0.000534091,0.000451975,-0.000837384,0.000994083,-0.00102934,-0.000362965,0.0010393,-0.000173114,0.0009147,0.000617766,0.000935719,0.000811761,0.000184844,-0.000691837,-0.00135735,0.0000427982,0.000623958,-0.00156083,-0.000981156,0.000186413,0.000645166,0.00107993,-0.00109391,0.00115328,0.00119238,0.0000529251,0.000347863,-0.000672,0.00162732,-0.000246647,0.000803303,-0.000539642,0.00140243,-0.00102008,0.000000807418,0.00146416,0.00183853,-0.00168334,0.00101907,0.00151386,-0.000132495,0.000180434,-0.00197964,0.00121943,-0.000762874,-0.0000556697,0.000504452,-0.0010585,-0.00127312,-0.00198837,-0.00169983,0.000732248,-0.00114153,-0.000289967,-0.000951054,-0.00119659,0.0000445827,0.000894357,-0.000873144,-0.000622803,0.0000259074,-0.000486192,-0.0000948832,-0.0015358,-0.00058985,0.00124304,-0.00159566,-0.000316053,0.00159423,0.00105794,-0.000305872,0.000995916,-0.00112203,0.000415825,0.000251377,-0.000600538,0.000038579,-0.00000832602,-0.00130387,-0.000937653,-0.000331405,-0.000595219,-0.00094968,-0.00049372,-0.00179629,0.000390333,-0.00167207,0.00184488,0.000307196,0.00122292,-0.000488578,0.00086664,-0.00116165,0.001009,0.000150835,0.000702026,-0.000385974,-0.00138591,0.000200555,-0.000387652,0.00057204,0.000763749,0.000337657,0.000911588,0.000761579,0.00131204,0.000286869,0.000641994,-0.000861535,0.000597999,0.000754098,-0.00120798,-0.00098655,0.000486763,0.000492371,0.000120531,-0.000595694,0.000136395,0.000619905,0.0002689,0.0000742896,-0.000609738,-0.000566226,0.00127477,-0.00159655,0.00144285,0.000602454,-0.00152831,0.000124775,0.000574455,0.0000242968,-0.000205071,-0.00136805,-0.00188103,0.00105176,0.00152635,0.00151088,-0.000708937,0.0000438486,-0.000762444,-0.000895718,-0.000994548,-0.000983062,0.000746865,-0.0000208613,0.00127611,-0.000563585,0.000655929,0.000203107,-0.000700396,-0.00167037,-0.0010705,0.00102036,-0.000935876,0.0000777493,0.000208114,-0.0000725165,0.00154173,-0.00128523,-0.00038969,0.000291925,-0.00160846,0.00081963,0.0000576639,0.00143584,0.0000714264,0.00109077,-0.000605535,-0.000658794,0.000353919,-0.000591688,-0.0000914209,0.000852801,0.00038272,0.000647349,-0.000593662,-0.000408856,0.00082469,0.00121369,0.0010478,0.000862615,-0.0019327,0.000975888,0.000391155,0.000420911,-0.000273481,-0.00107805,-0.000202975,-0.000225527,-0.000266293,-0.00185612,0.00063899,0.00160592,-0.0010686,0.000755917,0.000909739,0.000167381,-0.000508576,0.00134584,-0.00151801,-0.00103559,0.000969642,-0.000013624,-0.000424924,-0.000875397,-0.00062805,0.0000150583,0.000739217,0.00121013,0.000269873,-0.000924539,0.00140904,-0.000774723,0.000563127,-0.000541837,0.0000788511,0.000173433,-0.00127203,0.00156251,0.000259305,-0.00105604,-0.000386714,-0.00000262178,-0.000140358,0.000408087,0.000476691,-0.000795968,-0.000912194,0.00145068,0.000774622,0.000517036,-0.000919313,0.00000272233,0.0000201933,0.00178246,0.00077041,-0.00117398,0.000402588,0.000198504,-0.000625799,-0.000208217,0.00111743,0.00118281,0.000902215,0.000233886,0.000473873,0.00100981,0.000169804,-0.00126166,0.000513572,0.0016747,-0.000547134,0.000642416,0.00169637,-0.000710892,0.000912992,-0.000142897,-0.000885651,-0.000273198,0.000355938,-0.000732422,0.000418829,-0.0014183,0.000496644,-0.000755225,0.000953593,-0.000942453,-0.000573257,0.0000516134,-0.00013815,-0.000460957,0.000947778,-0.00125652,-0.000589404,0.000560024,0.000995947,0.000812855,-0.000612228,0.000536282,-0.000795906,0.000470647,-0.000141176,0.000855418,-0.000888666,0.00045147,0.000584934,-0.000127195,-0.000687122,-0.000102379,-0.0000292063,-0.000615403,-0.00175038,0.000530338,-0.000521713,-0.000183423,0.000272224,0.000615424,0.000864145,-0.000151811,0.000147488,-0.00095098,0.00157819,-0.00056977,-0.000536093,-0.00100756,0.0012233,-0.0000860982,0.0010375,0.000982005,0.00072883,0.00150791,-0.000442772,0.000958534,0.00107231,0.000551897,0.000428275,0.00068055,-0.00125525,0.000941992,-0.000693176,-0.000445885,-0.000962315,0.000189057,0.00012235,0.000172288,-0.000321478,0.000701296,-0.000806054,0.000467524,-0.00024011,0.00174057,-0.00131733,0.00157813,-0.000538381,-0.000496077,-0.000288731,0.00129801,0.000286578,0.000115442,-0.000155452,0.00140236,0.00000305822,-0.0000964326,-0.00167435,-0.000763243,-0.000191531,-0.000802551,-0.000797727,0.000639007,0.0000201908,-0.00123566,0.0014323,-0.0000246077,0.0000115595,0.000345252,-0.00144295,-0.0000194254,-0.000052978,0.00122078,-0.00104009,0.000566502,0.00168698,0.00183881,0.000646569,-0.00083138,-0.000276847,0.000427019,-0.000417019,-0.000598453,0.000280634,0.000406459,0.000504031,-0.000309387,-0.0000342454,-0.000974993,0.00161933,-0.00100617,0.00016089,0.000252543,0.00138916,0.000545602,0.000908721,-0.000330267,-0.00125505,0.00109068,0.000554437,-0.00125967,0.000675985,0.00061823,-0.000351166,0.000118309,-0.000886943,0.00156211,0.00142158,0.000302327,-0.0000410321,-0.00020137,-0.00197369,0.000982519,-0.0000573997,-0.000352056,0.000882719,-0.0013544,-0.000527741,0.000000237573,0.000182777,-0.000271595,0.00109137,0.00128494,0.000626406,-0.00105658,-0.00151499,-0.000559211,-0.000363759,-0.0000267001,-0.000679946,-0.000506721,-0.00128847,-0.000624122,-0.000684841,0.0000286826,0.000464906,-0.000375188,-0.000459034,0.00136429,-0.000411834,-0.000544603,-0.000246729,0.000880355,0.000853667,-0.00150638,0.000666132,0.00129642,-0.00182543,0.000297735,-0.00031915,-0.000378809,0.000964939,-0.000743506,-0.00152053,-0.00134618,-0.00145224,-0.000232837,0.000673215,-0.00134387,0.00188873,0.000794609,-0.000291914,0.000258691,0.000514006,-0.000123913,-0.00090116,0.000562919,-0.000186379,-0.000410714,0.0000993146,-0.000451559,-0.000132432,0.000310323,-0.00107947,-0.00119463,0.000110592,0.00120002,-0.000550115,0.000862441,0.000423979,0.00162345,0.00113067,0.000869715,-0.0011526,0.000430006,0.000134093,0.000566584,-0.00131575,-0.0000684888,-0.0011998,0.000339154,0.00101207,-0.000517827,-0.00151853,-0.000741035,0.000732346,0.00012827,0.0012017,-0.000538229,-0.000538589,0.000669856,-0.00127033,-0.000348013,-0.000142202,0.00000729129,-0.000643318,0.000846451,0.000590474,0.000616003,-0.000521241,0.00108259,-0.000287548,-0.00061111,0.000948375,0.00121373,-0.00163191,0.00110983,-0.0000680837,-0.0000168547,0.0000577638,-0.00186765,-0.000172419,-0.000560391,0.000127449,0.000382456,-0.000372612,-0.0000551872,0.0000542807,0.0000272091,-0.000587391,0.00140284,-0.00106786,-0.0011284,-0.000949925,-0.000415549,-0.00080017,-0.000536365,-0.000334531,0.00187344,-0.000599542,-0.000595889,-0.000301919,-0.000451092,0.000786108,0.000818254,-0.00125003,-0.00132116,-0.000149572,-0.000232781,-0.000739884,0.000451163,-0.000755047,-0.000512326,-0.000439269,0.000098149,-0.0000564748,-0.000549478,-0.000844787,-0.000300787,-0.000633253,0.00141444,0.00109055,-0.000740559,-0.000103082,0.000718016,0.0000802796,0.000762605,0.000684894,0.00120618,-0.000630136,0.00139036,0.000565794,0.000716378,0.000845053,0.000703003,-0.000746175,-0.000324415,-0.000910016,-0.000458656,-0.00101888,0.0010806,-0.00115207,0.00085255,-0.000614043,-0.000640062,0.00041576,-0.0000211001,0.000117607,-0.00176975,-0.000474091,-0.000310436,-0.0000904056,-0.000727125,0.000154607,0.000149904,0.000125386,-0.000374098,-0.00110035,0.000832771,0.00108597,-0.00147903,0.000232728,-0.000875649,-0.000543692,-0.0000765037,0.00134421,-0.000164802,-0.00108501,0.000350464,-0.000245445,-0.000085656,0.000431902,-0.00142934,0.000334438,-0.000041833,0.000333403,-0.000232097,-0.000492198,-0.000319426,0.000173502,-0.000300904,-0.00096613,-0.000475417,-0.000693835,0.000842754,-0.00007938,-0.00111456,0.000866211,0.0000437214,0.000208595,0.000961046,-0.000179202,-0.00108062,-0.000846507,-0.00016235,0.00170921,-0.000669011,0.000732141,-0.0000826396,0.00145133,0.000912806,0.000171483,0.0000291617,-0.00169504,0.000761671,-0.00052647,0.000911782,0.00102042,0.000584039,0.00101285,-0.000456834,-0.000273589,0.00107666,0.000117437,0.000209721,0.000843981,0.000936109,-0.00024364,0.00167143,0.000136212,-0.00146704,0.00110411,0.0004009,0.00100735,0.000676054,-0.000490933,-0.000915051,-0.000132253,0.00198238,0.00166333,-0.000674041,0.00111439,0.000816678,-0.000509016,-0.00100613,-0.000110101,-0.000761069,0.00000139997,0.000168607,-0.00096287,-0.00107281,-0.00031421,0.000310831,-0.0007672,-0.000346945,0.0000303487,0.000846693,0.00106397,0.000736702,-0.000236792,-0.000343752,-0.000533844,0.000938609,0.00117816,0.000948744,0.000690729,-0.00143815,0.000672122,0.00082659,0.000924281,0.0012793,-0.000236622,0.000491017,0.00028548,0.00136938,-0.000172153,0.00071291,-0.000507072,-0.00173211,0.000239179,-0.000928608,0.000224178,0.00183075,0.000235217,-0.000550683,-0.00183398,-0.000161173,0.000185579,0.000869517,0.000494622,-0.0007059,-0.000388363,-0.000558445,0.00123647,-0.000266574,0.000375829,0.000991279,0.0016386,0.00162609,0.000662972,0.0000585979,0.000279305,0.00122729,0.000999763,-0.00107894,-0.00114173,-0.000805777,0.00193038,0.000350163,-0.0000679923,0.000127257,0.00063957,-0.000430451,-0.000098172,-0.0000526079,-0.0000326945,0.00168674,-0.00153122,0.00028469,0.000843319,-0.000966343,0.00147391,-0.00151143,-0.000918863,-0.00183176,0.00083367,0.00196316,0.000831159,-0.000910889,-0.00154979,-0.00000595366,-0.00100571,-0.00127284,0.00076265,0.00110756,0.00145764,0.00166089,-0.000269752,-0.000227301,-0.0000444632,-0.00023514,0.000269156,-0.000469988,0.00111281,0.000167962,-0.00144874,-0.00143971,-0.000566432,0.00110733,-0.0019366,-0.000272193,0.000052267,0.000065926,0.0000893807,0.000794733,-0.000831829,-0.00147989,0.000177873,-0.0000384809,-0.00127563,-0.000509443,-0.000670605,0.000103763,-0.0000574895,-0.00140249,-0.0000116707,0.000245325,-0.000794286,0.00114584,0.000788599,-0.000871041,-0.00174771,0.0011873,-0.00142443,-0.00017131,-0.000456707,-0.000106301,-0.000632554,-0.000443171,-0.000628397,-0.00184051,-0.000357105,0.000203239,0.00112337,-0.000331754,-0.00105095,-0.000572581,-0.000650244,-0.0000921613,-0.000863891,-0.00162989,-0.000680095,-0.00156574,-0.000124565,-0.00000835104,0.00173858,-0.000873279,-0.00108788,-0.00146264,-0.000480657,0.00112709,-0.00129674,0.000929399,0.0000298675,-0.000652404,0.000124398,-0.000258499,-0.0000973581,0.000726072,-0.000448489,-0.000417071,0.000492756,0.00121309,-0.0010379,0.00150889,-0.000347399,0.000672868,0.000282346,-0.000820381,-0.00109066,-0.000937673,-0.000575604,-0.000439227,0.00081721,0.000231673,0.00114353,0.000124568,-0.000589226,0.0001338,-0.0012239,-0.00177894,-0.000642461,-0.000806607,0.000257719,-0.000351927,-0.000407206,0.000665406,0.000834843,-0.000615283,0.000400379,0.000473994,0.00000242595,-0.00186754,-0.00188049,-0.000800177,-0.00105924,0.000045641,0.001321,0.000451335,-0.000931572,-0.000596846,-0.00106934,-0.0000453354,-0.0000258001,-0.000193018,0.00139729,0.00141638,-0.000112106,-0.000194896,0.00148164,0.000313086,-0.000301849,-0.0000495672,-0.00120971,0.000534599,-0.00105981,0.000120916,0.00166345,0.000567247,0.000145402,0.00113515,-0.00106973,0.000706074,0.000091163,-0.000986014,0.000301681,-0.0017091,-0.0017227,-0.0011921,0.000059315,-0.00103682,0.000276416,-0.000392327,-0.000542839,-0.00074248,-0.000226737,0.00135193,0.000747974,0.00151078,0.000464175,-0.00154567,0.00152405,0.000140251,-0.000569071,-0.000526494,0.00191055,-0.00134619,-0.000127449,0.000136268,-0.0000351869,-0.000088397,-0.00176117,0.000597006,-0.000250834,-0.00115977,-0.000330829,0.000136761,0.00133496,-0.00111508,0.00098224,0.000695533,-0.0000271685,0.0000639446,0.00109357,0.00187876,0.000114047,0.000276378,0.00146872,0.000786063,-0.0000451062,-0.000856884,0.000643486,-0.000203687,0.000341753,0.000334859,-0.000302239,0.000138836,-0.00000793728,-0.000948383,-0.000885798,0.000158056,-0.00111228,0.0010942,0.00118165,0.000300158,-0.000158439,0.000243361,0.00170079,0.000968191,-0.00148578,-0.00133197,0.0000798421,0.00132953,-0.000436042,-0.00067044,-0.00000539866,0.00018528,0.000215901,-0.0000239136,0.00028919,0.00154344,0.00141007,-0.000451346,-0.00108266,0.00125516,0.000405056,-0.0004381,-0.00141533,0.000845212,-0.00161365,-0.00155945,-0.00118477,-0.00160924,-0.000894911,0.000813065,-0.000482214,0.00121065,-0.000632861,0.00176611,0.00099151,-0.000389934,0.000611423,-0.00115154,0.000322233,-0.000956151,0.000541724,0.000561831,-0.000556218,0.000340012,0.00015887,0.00047056,0.000153416,0.000290406,-0.000539708,-0.000698179,-0.000286846,-0.000748154,0.000498428,0.00000464493,0.000394531,-0.000308056,0.000909767,-0.000882798,-0.000248063,-0.000263408,0.000897806,-0.00130487,0.000478412,0.00057623,-0.000843701,0.000376132,-0.0000474505,-0.00065415,-0.000218983,0.000968658,0.000915954,0.000893451,0.00155696,0.000855268,0.00000925971,0.000628432,-0.000494395,-0.000605939,0.00108731,0.000312756,-0.000293009,-0.000122374,0.00174707,-0.00122898,0.000559601,0.000574148,0.00166831,0.00111184,0.000475879,0.000381004,-0.000428656,-0.000281372,0.00131846,-0.000245593,-0.000403475,-0.000356213,0.00159483,0.000371065,0.000294711,-0.00124936,0.00014018,-0.0010262,0.000901647,-0.000527081,0.000127581,-0.000520671,-0.0000590322,-0.00108878,0.00069773,-0.000630501,0.0003696,-0.0010187,0.000831548,0.00169983,-0.000436015,0.00136808,-0.00149437,0.00159135,-0.00175122,-0.000773452,0.00147884,-0.00155423,-0.000297986,0.000181215,-0.000427827,-0.000453914,-0.00001039,0.00194704,0.00117868,0.000218581,-0.000731476,-0.00106037,0.000357336,-0.000508838,0.0000974012,-0.000374244,0.000941799,0.000606344,-0.00151092,-0.000301472,-0.000473373,0.001134,0.00143967,0.0000762573,-0.000769642,0.000667735,0.00115737,-0.000783119,-0.000815976,0.000149933,0.000898607,0.000283868,-0.000601347,0.000913664,0.000815617,-0.000149095,-0.000447208,-0.000494984,0.00110414,-0.000185435,-0.00105683,-0.000346478,-0.00110876,-0.000582435,-0.000217119,0.000286078,0.000846174,0.000482408,-0.00124262,-0.0000569729,0.00090198,0.000194972,0.00120885,-0.000815406,-0.000656788,-0.000131933,0.000332393,0.0000412553,-0.000248858,-0.000981778,0.0000137248,-0.00132608,-0.000582425,0.00120252,-0.000575386,-0.00169879,0.00147695,0.000723468,0.000276154,-0.00155143,0.00114478,-0.000795771,0.00122933,-0.0011654,0.0012551,-0.00044132,-0.00114404,-0.00160585,0.000492869,-0.00101089,-0.000408167,-0.000845331,-0.0000712857,0.00105084,0.000632972,0.00144686,-0.00121552,-0.000275097,0.0000933722,0.000928574,0.000920011,0.000683944,0.000248375,0.000765212,0.000742706,-0.00119443,-0.00147179,-0.000818919,-0.000376668,0.00110776,0.00151989,-0.00111451,0.0008594,0.000675858,-0.0000330307,0.000352864,-0.000364374,0.00141282,-0.00120322,-0.00171063,0.000388934,-0.00023153,0.000506975,-0.000443232,0.000465472,0.000467924,0.000114883,0.000598409,-0.00166022,0.00122876,0.000213743,-0.00132525,0.0010846,-0.000990292,-0.0000957595,-0.00025465,-0.00127711,-0.0000194031,-0.000477531,-0.000761119,-0.00130927,-0.0001537,-0.00027441,0.0000426227,0.00055591,0.000987081,-0.000146996,-0.00155783,-0.00102692,-0.000271533,-0.000287036,0.00167168,-0.000386687,0.000526463,-0.00114478,-0.000851666,-0.000919667,-0.00125239,0.0011208,0.00134076,-0.00126031,-0.000713903,0.00110026,-0.00076708,0.00130953,-0.000175377,-0.000686941,-0.000284679,-0.0000701566,0.000694369,0.000266375,0.00123808,-0.000362977,-0.00029335,-0.0010371,0.000296803,0.000233869,0.000922014,-0.000373594,-0.000036378,-0.00190395,-0.0000227794,0.00142573,-0.00029408,0.000740207,-0.000265835,-0.00169566,-0.000590073,0.000602402,0.0013049,-0.000202298,0.00127153,-0.000189939,0.000375557,-0.00112103,0.000850732,0.000927818,-0.0007049,-0.0016292,-0.00069723,0.000879966,0.00123935,0.000337963,0.000811389,0.000497551,-0.000902223,0.00133111,0.00124862,0.00012585,0.00124381,-0.000283016,0.0014863,0.000217757,0.0000329029,0.00107148,0.000898809,-0.00114151,0.00046429,-0.000658522,0.00062835,0.000675047,-0.000850041,-0.000438568,0.000742585,-0.0000208749,-0.000632903,0.000100416,0.000593751,0.00154151,0.000858026,0.00187186,0.00012161,-0.000588871,-0.000892682,-0.000645998,-0.00132017,-0.0000959663,-0.000330983,0.00123479,0.00161201,-0.000965814,-0.0000688347,-0.00044836,0.0000535499,0.000317976,-0.000194833,0.0005277,-0.000662029,-0.000611552,-0.00135721,-0.000268369,0.000543263,-0.00105326,-0.00155134,-0.00104523,0.000186415,0.000236757,-0.000923079,-0.00117322,0.00160353,0.00131681,-0.000693928,-0.000130783,0.00174004,0.00129264,0.00126921,0.00154733,0.00167541,0.000440209,0.0000296227,0.000781929,-0.000141162,-0.00161346,-0.00135406,0.00107161,-0.000240529,0.000076817,0.00055892,-0.000186961,0.00139302,-0.000510538,0.000150945,0.000638428,-0.00151667,-0.00072139,0.000488569,0.000952493,0.000387288,-0.000466817,-0.000187759,-0.000114105,-0.000482141,-0.00116274,-0.000246505,-0.000275552,0.000764466,0.000669669,0.00107959,0.000802531,-0.000107631,0.00114153,0.000586614,-0.00116149,0.000971632,-0.000108561,0.000454411,0.00130098,0.000118215,-0.000366948,0.000606952,-0.000113953,0.000734748,0.000578023,-0.000484005,0.000508987,-0.000597833,-0.000173302,0.000539857,-0.0008853,-0.000026043,-0.000963799,0.000117664,-0.000469579,0.000158941,0.000818138,-0.000317238,-0.00147452,-0.000824098,0.00192418,0.00167665,-0.000632647,-0.00048872,0.000321129,0.000391928,-0.000551031,0.000222498,-0.000738243,0.000126353,-0.0012702,-0.00123918,0.000768652,0.000153356,0.00175079,0.000874628,0.00124523,0.00066978,-0.00178004,0.000560858,0.000402499,-0.00111115,0.00138901,-0.00011803,0.00055181,-0.00106894,-0.00108934,-0.00127015,-0.000886546,-0.000747765,-0.00125896,-0.000414755,-0.000108591,-0.000413392,0.000614798,-0.00190616,-0.00178187,0.000353129,0.0000140771,-0.000113309,0.000509283,0.000925473,0.00134821,-0.0008414,-0.000129822,-0.00145847,-0.00157606,0.001024,-0.000215901,-0.000975683,-0.00123143,-0.00000574846,0.00124207,-0.000793181,-0.000558093,-0.0000058991,0.000407052,0.000951704,-0.00119065,-0.0000737759,-0.000486601,0.000118764,-0.00188318,0.00116977,0.00157115,0.00013673,0.000138821,0.0018726,0.000353863,-0.000506536,-0.000396585,-0.00154792,0.00102142,-0.00128367,-0.000508538,-0.000209182,-0.000319007,0.000207139,0.000179982,0.000797584,-0.00189821,-0.000638396,-0.00165687,0.00192932,-0.000289529,-0.00123743,-0.000262943,-0.00131335,0.0000037018,0.000503867,-0.000959988,0.000810201,-0.000279687,-0.000134951,-0.00143663,0.00165875,-0.00104727,-0.00160563,0.0010426,-0.00131236,-0.000471816,0.000381421,0.000311645,0.00101231,-0.000212408,-0.00146774,-0.00101302,-0.000192205,0.000582007,-0.000229789,-0.000281199,-0.00114161,-0.00125505,0.000741321,0.00189931,-0.00183351,0.000771486,-0.00060454,0.00113391,0.00102083,0.000534169,0.00145262,-0.00028586,-0.00096695,0.000508138,-0.000501527,0.000867742,-0.00194176,-0.000522029,0.000267683,0.00127887,-0.000199837,0.000855029,-0.00000334849,-0.0000131306,0.000940161,-0.00000385862,0.000209183,-0.000829988,0.000106268,-0.000513774,0.000553233,0.00173523,-0.00115531,-0.000856849,-0.00168573,0.000350205,0.00143522,0.0001773,0.000734307,0.000600922,0.000894979,0.000344769,-0.000498495,0.00126996,-0.000260972,0.000349595,0.000408386,0.000204421,-0.000792252,-0.00196191,0.00169059,-0.000747282,0.0000964617,0.000257997,-0.000954171,0.000433083,0.00050373,0.00125762,0.000879463,-0.000466812,0.000324984,0.00128527,0.000334013,0.000483818,-0.00111548,0.00127601,-0.000467827,-0.00112178,0.00144268,-0.00166474,-0.000450774,0.000807053,-0.000265792,0.000761878,-0.0000522767,-0.00075507,-0.000244933,0.000377279,-0.00148974,-0.00038231,-0.00107336,-0.000749849,0.000758071,0.000329534,-0.000420979,-0.00148322,0.00143645,-0.00014748,-0.00068993,0.000675007,0.0000919093,-0.000833066,0.00145735,0.000469536,-0.000114209,-0.000509931,-0.000269669,-0.000637428,0.00127081,-0.00194439,0.000341056,0.00010402,-0.000541392,0.000755839,-0.00000833283,0.000326158,-0.000645982,0.00108474,0.000866448,0.00108998,0.000822017,0.000933234,0.00117216,0.000322307,0.000474449,0.00106704,0.000666904,0.000391124,-0.00029216,0.00014506,-0.000485088,-0.000239763,-0.00101466,-0.000752682,0.000348364,0.00107086,0.0000697963,-0.0000407116,-0.000627548,-0.000123153,-0.000431088,0.000298085,0.00176339,0.00180084,-0.000786972,-0.000195107,0.000583366,0.00111623,-0.00051551,0.00111402,0.000434677,-0.000111996,0.00111263,-0.000527413,-0.000533244,-0.0000401902,-0.000732368,0.000899756,-0.0000164859,-0.000223284,0.000217673,-0.000321445,0.000682657,0.000194876,0.00000768445,-0.000431664,0.000380112,-0.000622261,0.000407774,0.00000795478,0.000617816,0.000705179,0.00110847,0.000524475,0.0000771649,0.000187307,0.00129998,-0.000643033,-0.000931516,0.00120623,0.000242088,0.000323746,0.00148855,0.00157118,-0.00184458,-0.00117009,-0.000477221,0.000177334,-0.000538374,-0.000192397,0.000521077,-0.000294126,-0.000662292,0.000017274,-0.00111828,0.00190658,0.0010673,0.000851187,-0.000808245,0.00082828,-0.000561239,-0.00128518,-0.00109036,-0.000926938,-0.00025722,-0.0000643371,0.00105431,-0.000925322,-0.00160221,0.000902804,0.000701003,0.000417659,0.000333467,-0.000910054,-0.00113201,-0.000131107,0.0006495,0.00122534,0.000413537,-0.0011087,0.00133816,0.000634419,-0.000689048,-0.000142568,-0.0000789831,-0.00110788,-0.00192211,-0.000407558,-0.000542939,-0.00123601,-0.00107088,-0.000518355,0.000439416,-0.000179469,0.000636129,0.000478498,0.000330149,0.00100408,0.0013636,0.000357151,-0.00137527,-0.00184872,0.00142575,-0.00155778,0.0014559,0.000223484,-0.00106535,-0.000721987,-0.000244366,0.000759175,-0.000196732,0.0015246,-0.000688205,-0.000385123,-0.00000436154,0.000977732,-0.0000089107,0.000623774,0.000575841,0.000230397,-0.000679017,-0.000437788,-0.000268172,0.000731177,0.000835289,0.000731201,0.0000712315,-0.000296204,-0.000400441,0.000174816,0.000905003,0.00177366,0.000232942,-0.000469937,0.000186959,0.000139736,0.00149932,0.00051894,0.0000773784,-0.000147819,0.000339624,0.000619721,-0.000683172,0.000520481,0.000126689,-0.000356946,-0.00197361,-0.00119003,0.000407774,0.000117493,0.00107155,-0.000510127,0.000814496,0.000768795,-0.000416214,-0.000587937,0.000882508,-0.00024153,0.00161706,-0.000265701,0.000162635,0.000189857,0.000130573,0.00113939,-0.000363403,0.000788794,-0.0006477,-0.000423206,0.000154564,-0.000235909,-0.000598158,-0.000624176,0.000126756,0.000154774,-0.00127058,0.00019287,-0.00135607,0.00019502,-0.000419249,0.000103601,-0.00106226,-0.000948643,-0.000487021,0.000084251,0.00178183,-0.000630472,0.000197823,-0.000157947,-0.00114719,-0.000255586,-0.00196182,-0.000304829,-0.000840088,0.00163482,-0.000108821,-0.000307724,0.00177821,0.000212986,0.000699965,0.000275379,0.000332588,0.000316309,0.000389782,0.00000751403,0.000476655,0.000711818,-0.000432891,-0.000672043,-0.000842001,0.00108951,-0.00117472,0.00137887,-0.00107003,-0.00177464,-0.000484646,-0.000432477,0.000282827,0.000830522,0.000562201,0.000355123,-0.000302133,0.000433291,0.000154443,0.0000313146,0.00181823,0.000848855,0.00110215,0.000684424,-0.00122754,0.00011905,0.0000334175,-0.000623768,-0.000902067,-0.00129292,-0.00088616,-0.000514336,-0.00146209,-0.00177009,0.00144764,0.000440328,0.000224679,0.000888101,0.000333877,-0.00169398,-0.000374868,0.00084307,0.00138439,-0.000876752,-0.00167081,-0.00183006,0.000132733,0.0000362738,0.000214646,0.000228906,-0.000120811,0.000495814,-0.000232298,0.000642517,0.000423256,0.000558399,-0.000560979,0.000137283,-0.00158166,0.0000944979,0.0000157705,0.001054,0.000656256,-0.000432687,0.000725864,0.00127346,-0.000467358,-0.000610688,-0.00149659,0.0017074,-0.000355493,-0.000844531,0.000233806,-0.00103295,0.000471212,-0.000835798,0.0000250656,-0.00182403,-0.00100945,0.000127779,-0.00091001,0.000848537,-0.000406957,0.000329441,-0.000432698,0.000470878,0.00150579,-0.00102841,-0.000800046,-0.00104238,-0.00028888,0.0011953,-0.000769801,-0.000700907,-0.00189241,0.000219913,-0.000406775,-0.000551643,-0.000204152,0.000608219,0.00120393,-0.000950181,0.000711434,-0.00099223,0.00116666,0.000810657,-0.00016292,-0.000438331,0.000250828,0.000681807,0.000132488,-0.000240282,-0.000561025,0.00154501,-0.00118216,-0.00130762,0.000413384,-0.000791029,-0.00138886,-0.000188765,-0.000160237,0.000786533,-0.00182212,-0.000466175,0.000150338,-0.00020107,-0.000703179,-0.000993425,0.000715128,0.000599201,-0.000423842,-0.00000398807,-0.00121332,-0.000355874,0.000828345,-0.000291294,-0.00130903,-0.000281318,-0.000544281,0.000217144,0.000473379,0.000243029,-0.00016137,-0.000817769,0.00172457,-0.00149542,0.00135869,0.00047067,-0.000592457,0.000169037,0.00169141,0.00154339,-0.000612825,-0.000563134,0.00036452,0.000956856,0.000620268,-0.000278093,0.000647985,-0.000228592,0.00125961,0.000431022,-0.00123821,-0.0000952723,0.00134731,0.00117141,-0.000920242,0.000033997,0.000903201,-0.00127165,-0.000103701,-0.000988785,-0.00139954,-0.000939243,0.000592537,0.00161046,-0.000490508,-0.000467206,-0.000447487,-0.00102366,0.00056293,-0.00118469,0.000856399,-0.00104415,0.0011745,0.00124842,-0.000715122,-0.000178415,0.000454481,0.00152331,-0.000260315,-0.000213876,-0.000369091,0.0000417015,0.000796647,-0.000374361,-0.00097413,-0.00022756,0.000407016,-0.00182408,0.00104943,0.00136315,0.000973597,-0.00154441,-0.000343925,0.000222447,-0.000450984,-0.00139367,-0.00127099,0.000931497,0.000925246,0.000681866,-0.000176685,-0.0000896157,0.000359426,-0.000373526,0.000338532,0.000924226,-0.00108125,0.000681004,0.00148338,0.000254782,0.000128708,-0.000223395,0.000701785,0.00107732,0.000577975,0.000379839,-0.000354466,0.00080659,-0.000304501,-0.00156919,-0.000966553,0.000364494,-0.00103426,-0.000298698,0.000491157,-0.00159814,0.00126016,-0.000628514,0.000421736,-0.000244843,0.0000851215,0.000813966,0.000109007,-0.000279762,-0.000962223,0.000345436,0.000338442,0.00127393,0.000912882,-0.0000135172,0.00135519,-0.00091542,-0.000392767,0.000648456,-0.00125462,0.000643661,-0.00157381,0.000636149,0.000847755,-0.00110062,0.000513878,0.00152874,0.000556521,0.000519332,-0.000876539,-0.000737599,-0.000353568,0.000602306,-0.00158762,0.00167837,-0.00075204,-0.000275911,0.000158137,-0.00145551,0.000195,0.00164456,-0.00040417,0.000458581,0.000485754,-0.000286603,0.000899804,-0.000633211,-0.000564465,0.000662236,-0.000592863,0.000103472,0.00194377,0.000748359,0.00142088,0.000556239,-0.000713003,-0.000440125,0.00110107,0.00019763,0.000435792,-0.000494196,0.00118522,-0.00108469,0.000428004,0.0011541,-0.000348155,-0.000978358,0.0000530264,0.000534197,0.000634922,-0.00157046,0.00034977,-0.0000645745,0.00110167,-0.00173966,-0.000518027,0.0010377,-0.00111558,-0.00125548,-0.0000703719,0.00192234,-0.000398875,-0.000587563,-0.00133173,0.00157395,0.000903328,-0.000512914,-0.000566409,-0.000186789,-0.00135089,-0.000318595,-0.000408899,0.000315805,0.00109775,0.000706581,0.00167686,0.00192465,-0.000247367,-0.000287298,-0.000176708,-0.00099258,0.00106886,-0.000556719,0.000862722,-0.0000605792,-0.000487716,-0.00030889,-0.000674176,-0.00165853,-0.00161155,-0.00137041,-0.000199489,-0.0014886,-0.000246995,0.000622459,0.000481954,-0.000345669,0.00107781,-0.0011648,-0.00132833,0.000040454,-0.000118715,0.00120567,-0.00130361,0.000791802,-0.00185501,-0.0000042537,0.000819287,0.000751263,-0.00102459,0.000622523,0.000186594,0.000724726,-0.000471859,0.000346502,0.000354089,-0.00104936,0.00107123,0.00038525,0.0017702,0.000632264,-0.00122198,-0.000454673,-0.0000369561,-0.00110378,0.0010372,-0.000213163,0.000443562,0.000278761,0.000854021,-0.000473197,-0.000972655,-0.00131776,0.00023991,-0.000110452,0.0017732,0.000769507,-0.00166272,-0.00131303,0.0000804608,0.000519591,-0.000549186,-0.000258152,-0.000966721,-0.000854323,-0.00183026,0.00191824,0.000119239,-0.00164676,0.00133118,0.000722608,0.00127706,0.000764906,-0.000774618,0.000890781,0.00021376,0.00130506,-0.000248705,0.00094212,-0.00158292,-0.000151605,-0.000795766,0.000311518,0.00111895,-0.000196071,0.00166452,-0.000736775,0.000532171,-0.000567965,0.000673764,-0.000591759,-0.000647979,0.00113282,-0.000810055,0.00144217,-0.00120362,-0.00082963,-0.000290047,0.000624591,0.000654706,0.000147247,-0.000118742,-0.000813608,0.000280529,-0.00195518,-0.000376347,0.00185769,0.000320694,-0.000729131,0.00120151,0.000545709,0.00156645,-0.0012906,0.000426123,-0.000513238,-0.000649585,-0.000624555,0.00108756,0.00104328,-0.000628823,0.000201089,-0.000963099,0.000514333,-0.00111705,0.000134571,0.000534733,0.00028423,0.000280049,-0.000295727,0.000882438,-0.00038739,-0.0013745,-0.000372206,0.00160132,0.00174729,-0.000752837,0.000288846,-0.00012206,-0.00148929,0.00146266,0.000201794,0.000115419,-0.00118276,0.000297361,0.000167907,0.000461038,0.000249914,0.000063531,0.00170353,0.000160163,-0.000377169,0.000187835,0.00029076,0.000774693,0.000872422,-0.000744091,-0.00123289,-0.000308648,0.000203833,-0.00121285,-0.00134069,0.0000535291,-0.00110233,0.00174229,0.000611187,0.000351423,0.000972135,-0.00131586,0.000665763,0.000619051,-0.000987294,0.000452453,0.000687932,-0.000318432,0.00127117,-0.000936155,0.00100216,-0.000156829,0.000465544,-0.000270454,0.000558132,-0.000346753,0.000578975,-0.00119578,0.00190034,-0.000887639,-0.000722558,-0.0000382724,-0.000658358,0.00040724,0.000760862,0.0012669,0.0004593,-0.0000465823,0.00119066,0.000427067,0.000377523,0.00154682,0.000161093,0.000808169,0.000345132,-0.0000257689,0.000475874,-0.00127891,-0.000217681,-0.0000462093,-0.000079818,-0.000177192,0.00121705,0.00160349,-0.000517488,-0.00132872,-0.000579385,0.00100518,-0.000644819,-0.000592986,-0.000558854,-0.00159906,-0.000529731,0.0000827514,0.000205652,-0.0016302,-0.000710683,0.000382391,-0.000907957,0.00100636,-0.0010405,0.000678306,-0.000707257,-0.00132837,-0.000188575,-0.00095816,-0.00085339,-0.00178716,0.000621747,0.000229724,-0.000972873,0.000719934,0.00168654,-0.000861388,0.00169889,0.000673212,-0.000320266,-0.000135281,-0.000394673,0.000703202,-0.00145791,0.000428602,-0.000119586,-0.000529752,0.000432802,-0.000573767,0.00009133,-0.00138105,-0.000667639,-0.00115607,-0.000125768,-0.000406595,-0.000468525,-0.000544326,-0.000651838,0.000466046,0.0000340823,-0.000128175,0.00159407,0.00111252,0.00116307,0.000770076,0.000793303,-0.00144613,-0.000427805,0.0000472193,-0.000818582,0.00013457,-0.000801391,0.000633075,-0.000496504,0.000844581,0.000970947,0.001323,0.000554826,-0.000822747,0.000669732,0.00120084,0.000588134,-0.00012553,-0.00051679,0.000664282,-0.000125291,0.000784243,-0.000177431,-0.000673953,-0.000489214,0.000233419,0.000632494,0.00072452,-0.00174747,0.00170664,-0.00184682,0.00129819,-0.000546686,-0.00123676,-0.000342657,-0.000544924,0.000867712,0.00136057,-0.000484082,0.000299754,-0.000466439,0.00116326,0.000525173,-0.000673582,-0.000510127,-0.000388195,-0.000907863,0.000125782,-0.0005119,-0.000102842,-0.000719317,-0.000586833,0.0000995001,-0.000692525,0.000795879,-0.000914915,-0.000482344,0.0000325979,0.000158566,-0.00113671,0.000174576,0.000712219,0.0000128249,-0.000512463,0.00132352,0.00119929,-0.000559078,-0.000705344,0.00104522,-0.000685854,-0.0000970576,-0.000296275,0.00031283,-0.000360147,-0.000314381,0.000982128,-0.000201796,0.000074486,0.00101822,0.00116511,-0.00107499,-0.000318663,-0.000182277,0.000182263,0.00107612,0.000933917,0.00111248,0.00131825,-0.00140872,0.0000879419,0.00116176,-0.000753763,0.000748231,0.000366694,-0.000394573,0.000175692,-0.0000207261,0.0017059,0.00181674,-0.000370591,-0.00079605,-0.000311457,-0.000440674,0.00019798,-0.00152147,0.00132498,0.000261635,0.000192849,0.00122704,-0.000899285,-0.000887519,0.0018785,-0.000927345,-0.000475745,-0.0000921714,-0.000449621,0.000383185,-0.000297433,-0.00108639,-0.00013329,-0.000419327,-0.000805314,0.00168334,0.00185814,0.000451516,-0.00150134,-0.000329944,-0.00124767,-0.000325974,0.00169081,-0.000234364,-0.00168871,0.000141025,0.00103988,-0.00116708,-0.000887556,-0.000806152,-0.000843746,-0.0019166,0.000609178,0.00142747,0.000366882,-0.000504865,-0.000515035,0.0017732,-0.00168008,0.00196324,-0.000268369,-0.00162584,0.00130363,0.000673628,0.000622072,0.00176031,0.00101198,-0.000371114,-0.0006215,-0.00136667,0.00100814,0.000227421,-0.00000362074,0.00137677,0.000300398,-0.000111867,0.000328726,0.000256603,-0.000587023,0.00070275,0.00010267,0.00122684,-0.00166631,-0.0000492438,0.0000478703,0.00129566,-0.000855203,0.00131228,0.00122303,-0.000408238,0.00165781,-0.000219697,-0.000390654,-0.000132574,0.0000606671,0.000994698,-0.000430406,0.00139594,-0.00157107,-0.000984422,0.000522655,0.000348005,-0.000160505,0.000742813,0.000992775,-0.0004482,0.000679951,-0.000422159,-0.0011098,-0.000538478,-0.000804472,0.000476188,-0.000152743,0.000791037,0.000102948,0.000933367,0.00119022,0.000250337,-0.000382266,-0.00166471,-0.0000102367,-0.00059811,0.0000352954,0.00178631,0.00198754,0.000451339,-0.0000728126,-0.000052557,0.000366566,0.000272247,0.00176019,0.000775749,0.00130232,0.000843404,-0.00057748,0.00114496,0.00138457,0.000714929,-0.000562685,0.00178533,0.000647793,-0.000381174,-0.000822885,0.000698116,0.000927857,-0.000216609,0.000799989,-0.000301,0.00141731,-0.00144014,0.0000458878,-0.000473006,-0.00053015,0.0012044,-0.00177131,-0.000842885,-0.000302339,-0.00156291,0.000692476,0.00118824,0.000796432,-0.0016915,0.000169023,-0.000791199,0.000225154,0.0000356371,0.000835681,-0.000806972,0.000755629,-0.001883,-0.000255751,0.0000359802,-0.000445098,-0.00142863,-0.00133292,0.00168688,-0.000683972,0.00130548,-0.000989042,0.000759594,0.000786698,-0.00028179,0.00103068,-0.00116406,-0.00151198,-0.000565358,-0.00058306,0.00198587,0.00199272,0.0000360934,-0.000341816,0.000426614,0.00097603,-0.00162099,0.00103877,-0.000377482,0.000536973,0.000198683,0.00125644,-0.00039999,-0.000656008,0.00163299,0.000963443,-0.000802031,0.00106617,-0.000476016,-0.000803576,-0.000777354,-0.000241262,-0.000529211,-0.000720531,0.000700617,0.000576645,0.000351544,-0.00080435,0.00141092,-0.00114626,-0.000898897,0.000718933,-0.000129497,0.00031943,0.000369982,0.000253044,0.000903508,0.000800872,-0.000597389,0.00106203,0.000503374,0.000670414,-0.000396418,0.000953297,-0.000729954,-0.0000949123,-0.000642909,0.00035406,0.000543856,-0.000970951,-0.0000914765,-0.000905238,-0.000198087,-0.00136901,0.00080854,0.000165634,-0.000243651,-0.000467981,-0.000861995,0.00125773,-0.000323026,0.000396677,-0.0006686,0.000395894,0.000869542,0.000058824,0.000627586,0.000751788,0.000901806,-0.000499609,0.000516246,0.0019679,-0.000629359,0.000851392,-0.000794855,-0.00175912,-0.00106467,-0.000290506,0.00151352,0.00113432,-0.000571416,-0.0000655937,0.000295579,-0.00121462,-0.00129512,0.00125278,0.000133272,-0.000351233,0.00141404,-0.00128578,-0.000545471,0.000262219,-0.0000110122,-0.00168592,0.000277147,-0.000308882,-0.0000548254,-0.000198219,-0.000151248,0.000107709,0.00145574,0.0000331254,0.0000353531,-0.000267206,-0.000600972,0.000347719,0.000100859,-0.00131763,0.000260065,0.00172586,0.000250763,-0.000562149,-0.00102007,0.000428388,-0.00111576,-0.0000444462,0.000260038,-0.0000856467,0.000937791,0.000164626,-0.000740346,-0.0011298,-0.00066783,-0.000521038,0.000403151,0.000320357,-0.00171942,-0.00164455,0.000541254,-0.00046367,0.000364773,0.00122137,-0.000742678,-0.000318098,-0.000232625,0.00168845,0.00095512,0.00122318,0.000298799,0.000328688,0.000469428,0.0000873453,-0.0000864635,-0.000675237,-0.00177151,-0.0000473491,-0.00120488,-0.000967574,0.000285635,-0.000307505,-0.000393629,-0.000323095,0.00109192,0.0011113,-0.000466686,0.000947247,0.000489249,0.000918446,0.00020114,-0.0000453082,-0.000858524,-0.00103401,-0.000619224,0.000158765,0.000402546,-0.0012737,0.000537265,-0.000467239,-0.00115544,-0.00135007,0.00153067,-0.000728962,-0.00125519,0.00195425,-0.00067652,-0.000508438,0.00108368,0.00152587,-0.000161024,0.000493063,-0.000709661,-0.00078999,-0.000664312,-0.000165277,0.000724736,-0.000191003,-0.0000742684,0.00115264,-0.000875375,-0.000189098,-0.0010764,0.00154088,0.000117583,0.000520011,-0.00106583,0.000000797268,-0.000240298,-0.000332317,0.000414947,0.000229053,0.00165532,0.00178608,0.000471028,-0.000292085,-0.00033733,0.000392288,0.000648427,-0.00149834,0.000939604,-0.000439858,0.00110237,-0.000146234,0.0000271596,0.000886927,-0.0000440176,0.00142006,0.000198106,-0.000462276,0.000299101,-0.000848971,-0.00034504,-0.00077815,0.0000886044,0.0000114126,-0.000113248,0.0014466,0.00165502,0.000276319,0.000810343,0.00109353,0.000960788,-0.00135843,0.000202574,-0.000444669,0.00117143,0.00119601,0.0000869523,-0.0000725198,0.00129193,-0.000135613,0.00114245,-0.000573527,-0.00041096,-0.00113722,-0.00181075,0.00104488,0.000341559,0.000530227,-0.00076892,-0.000891685,-0.00143262,0.000608074,0.0019056,-0.0000839331,-0.00104957,0.000185248,0.000459316,-0.000292026,0.00199381,-0.000702067,-0.000758415,0.000228737,0.000300346,0.000675203,0.00121087,0.00199363,0.0000242407,0.00055355,-0.000648433,-0.000486351,-0.000328883,-0.00192322,0.0000569243,0.000297804,0.000633938,0.000977696,0.000081638,-0.000491138,0.00107203,0.000835569,0.00148619,-0.000464228,0.000732285,-0.0014248,0.0010972,0.000465126,0.000150858,-0.0012586,-0.000412986,0.000127835,-0.000699777,-0.00154975,0.00136515,-0.000246737,0.000600402,-0.000105552,0.0000986039,0.000275367,-0.000883678,-0.000233837,-0.000145832,-0.000266358,0.00164442,0.000173327,0.000773005,-0.00176856,-0.00130256,-0.0000527354,0.000776816,-0.000863504,-0.000000180332,0.000281983,0.000445399,0.00136521,-0.0000250483,-0.000284252,0.00114025,0.00124035,0.000277123,0.000409136,0.000436282,0.000101712,-0.00000777521,-0.000387073,0.00131129,-0.00118032,0.000211498,0.000694229,0.00019303,0.000417775,-0.0000459894,-0.000471081,0.00030507,0.000904351,-0.000881592,-0.000311494,0.000747041,0.00129334,0.000329084,-0.000134519,-0.0000596863,-0.000426297,-0.000988893,-0.000620055,-0.00165655,-0.000690909,-0.000429158,-0.000414932,-0.0000580591,-0.000202909,-0.0012468,0.000834388,0.000190414,-0.000532582,-0.000471361,0.00130348,-0.000550042,-0.000693306,0.000710627,-0.00193599,0.000549309,0.000222455,0.00108475,-0.00062762,0.0000496892,-0.000162355,-0.00110139,0.000612262,0.0000415979,0.000246404,-0.000237481,0.000386943,0.00074565,0.00137719,0.0000634811,0.0000820933,0.00113254,0.00128449,-0.00150352,-0.000614875,0.0000535115,-0.000117284,-0.00158139,-0.000437809,-0.0000214462,0.0000594912,0.000134555,0.000714332,-0.000681267,-0.000265946,-0.000708974,-0.000366056,-0.0000442201,0.000712699,0.000603338,-0.000804112,0.000871151,-0.00192352,-0.000722665,-0.000836639,0.000743532,0.000986821,-0.000128588,-0.000380683,-0.000410089,0.000122218,0.0000721759,0.000159328,0.00176557,-0.00170369,0.0000779255,0.000132254,-0.000892816,0.0000981028,-0.000703845,-0.0000824385,-0.0000710947,-0.000729067,0.000704997,0.000757896,-0.000438027,0.000251646,-0.000621259,0.000846969,-0.00123031,-0.000935506,0.0000249999,-0.000945378,-0.000017802,0.000923317,0.00107958,0.0019172,0.00025486,0.000971833,0.000816686,0.000530189,-0.000667176,-0.00061186,0.00040357,0.00123869,0.000159845,0.000122839,0.000543938,0.0013212,-0.000983668,-0.000876283,0.00157939,-0.00144885,-0.0000455562,-0.000941354,-0.000566202,0.0000814232,-0.000766108,0.000403637,0.000800838,0.000645515,0.00114739,0.00115829,-0.000256834,0.00105459,-0.000253171,-0.00109755,-0.00000873269,0.00188464,0.000822624,0.00118653,-0.000243271,-0.00149084,-0.000056072,-0.000125333,-0.0012816,0.000296657,0.000360052,0.000277898,0.000610176,-0.0000180149,-0.000430202,0.000240394,0.000349146,-0.00177337,0.000880444,0.000553769,-0.000433149,0.000107966,-0.000431052,-0.00134291,-0.000746882,0.000158262,0.000000268174,0.000770418,0.00113901,-0.000817501,0.000934793,0.000846722,0.00132959,-0.00122724,-0.000216499,-0.0010482,-0.00191699,0.000270473,0.000990646,0.000276028,0.000268258,0.000662025,-0.00112481,-0.000507674,-0.000754997,-0.000700226,-0.000461357,0.000746349,0.00110848,-0.000149315,0.00109381,0.000872476,-0.000434963,-0.00108096,0.000878264,-0.000191957,-0.00114406,-0.000180952,0.0000700803,0.000799047,-0.000368722,-0.00115878,0.000364854,-0.000726946,0.000614854,-0.000318728,-0.000342941,0.000408098,-0.00110198,0.0000730848,0.00044281,0.000244412,-0.000311859,-0.000486213,0.000318328,-0.000453802,0.000239346,-0.00102535,0.00106381,-0.0000265616,0.00173596,-0.0000925888,-0.00125369,0.000146842,-0.000349503,0.000767374,-0.00122766,-0.000432284,0.000396001,0.000694172,-0.00115524,-0.00123439,0.000157902,-0.000619166,-0.000335933,-0.000671465,-0.00065354,0.00144644,0.000991968,-0.000356869,-0.00025622,0.0000454213,-0.000998424,0.000291333,-0.00109668,0.00161108,-0.00156776,0.000269125,-0.0015351,0.00163734,-0.00130958,0.0000668316,-0.00070992,0.000665144,0.000655773,-0.00104449,0.00022877,-0.00143585,-0.000110916,-0.000327103,0.000187729,0.000921126,0.000933958,0.00123107,0.00195398,0.0000448436,-0.000221223,-0.000037007,0.000694744,0.000745542,-0.000513722,-0.00126116,0.00123396,-0.00154231,-0.00183154,0.00199362,0.000674936,-0.000253553,0.000598683,0.000608982,-0.000504331,0.00126812,0.0000877271,0.000682759,-0.00154297,-0.00021319,-0.00102329,0.000365086,0.00059781,-0.000141029,0.0000181517,-0.00166529,0.00046255,-0.00134973,-0.00124788,0.000319948,0.000574771,0.000798623,-0.000849555,0.000130277,0.00001123,-0.000406034,0.00153171,-0.000229656,-0.000199929,-0.00164318,-0.00159703,0.000851167,0.00108723,0.00125269,-0.00129389,0.0000655937,-0.00184294,-0.000872114,-0.000902364,0.000228977,0.000972053,0.000926715,-0.00105697,-0.000440059,-0.00176597,0.000109967,0.000787754,-0.00121817,-0.00187697,-0.000923564,0.000574068,0.000215642,0.00178581,0.000191726,0.000298771,0.00082702,-0.0000157859,0.000607139,-0.00180745,-0.000432098,-0.000358446,-0.000546702,0.00136676,-0.000382772,-0.000814552,0.000410588,-0.000638253,0.00051872,0.00154266,-0.000114187,0.00109293,-0.00158473,0.000466303,-0.000472165,-0.00186106,0.0000859795,0.000499341,0.00117583,-0.000291118,0.000815206,0.000017029,-0.000993982,0.00114267,-0.00168819,-0.000667672,0.000613952,-0.00160969,-0.000807537,0.000345463,-0.000611069,-0.000414108,0.00066571,0.000543285,0.000728868,0.00102441,-0.000712495,0.000247474,-0.000331242,-0.000264425,0.0012278,0.00158153,0.0011716,0.0010308,0.00104394,0.00121944,-0.00115474,0.000934614,-0.00036174,0.000955997,-0.000243317,-0.0000582999,0.000998425,-0.000359835,0.000447226,-0.000454401,0.000684791,-0.000980722,0.000646328,0.00064076,0.00110861,-0.000769828,0.000146244,-0.00013853,-0.000438992,-0.00164355,-0.00117006,0.000200781,-0.000982962,0.000221488,-0.00106974,-0.00122769,0.000826568,0.000352193,0.000210999,0.000131221,0.000837192,-0.000214274,-0.000808667,0.000426104,0.00018289,0.000862678,-0.00148993,-0.000988819,-0.0000743318,0.0014125,-0.000980588,-0.00107003,-0.00116173,0.00138685,-0.000849707,-0.000650707,-0.000390185,0.000349277,-0.000288187,-0.000198516,0.00120125,0.00143957,0.0000746833,0.000399007,0.000316488,-0.00093279,-0.000772904,0.00163032,-0.0015388,-0.0000574428,-0.000153584,-0.000842479,-0.000974769,-0.000491213,-0.00198754,-0.0000326053,0.000171669,-0.00112344,0.000519691,-0.000490373,0.000132198,0.000601947,-0.000843208,-0.000456324,-0.00100182,0.000605557,0.000685446,-0.00062266,0.00127465,-0.0000347332,-0.00181018,0.000171188,0.00106259,0.00000649427,-0.0015466,-0.00157513,-0.00110179,0.000354534,-0.000360345,0.000724603,-0.00182918,0.000510562,-0.000887026,0.00082382,-0.00111774,-0.00031186,0.0000515023,-0.000167547,-0.0000266811,0.00113295,0.000429885,-0.00048785,0.000554118,0.00132813,0.000426966,-0.00159416,0.000277596,-0.000226348,-0.000762182,0.000838233,-0.00051265,-0.000277794,-0.000892211,0.000191379,-0.00168784,0.000333455,0.000393885,-0.000655777,0.0000143305,0.000811719,-0.00179246,-0.000138564,0.000337398,-0.00129603,0.000989485,0.000179694,-0.000207885,-0.000361752,-0.00104165,0.00106047,0.0000152954,-0.00105018,-0.000131808,0.000804918,-0.000628038,-0.000611844,-0.000125442,0.000218451,0.00156519,-0.000112784,-0.000302252,-0.000648267,0.00176672,0.000180701,-0.00170569,0.00183332,0.000211622,0.000133575,0.000750785,-0.000524938,-0.000741142,-0.0000574015,-0.000501482,-0.00144589,-0.0011959,0.000757398,-0.00114963,-0.0000511725,0.000699347,-0.00169252,-0.000169294,-0.000166429,0.00101363,-0.000123858,0.000865133,-0.000822292,0.00120359,-0.00199817,-0.000479164,-0.000848861,0.00145606,0.00118197,0.00129053,-0.000744439,0.00152138,0.000741304,0.000685118,-0.00174029,-0.00042916,0.00054879,0.000431368,-0.00138686,-0.000310886,-0.000967075,0.000161452,0.00121107,-0.000111499,-0.000476574,0.000136353,0.000103121,0.00026999,0.0000309904,-0.000593634,0.000292815,-0.000158208,0.000795784,0.00141988,-0.000371748,-0.000317214,0.00188,-0.00123063,-0.00173872,0.000241043,-0.000534429,-0.000449987,-0.00110205,0.00161448,0.00021781,0.000445524,0.000278992,0.0000693673,-0.000126334,0.000718091,-0.00102833,0.0000881374,0.000106176,-0.00149118,-0.00137593,-0.000348196,0.000654343,-0.00107733,0.00112868,0.000585105,0.000917819,-0.00124903,0.0000613187,0.000409404,0.000224764,0.000387958,0.0000876242,0.00028767,0.000158268,-0.000278426,-0.000515006,0.000317779,0.000960775,-0.00158105,-0.000153128,0.00139898,-0.00102558,-0.0000404412,-0.0012973,-0.000677368,-0.00133387,0.000307551,-0.00120737,0.000172025,0.0000738403,0.00117314,0.00157521,-0.0000325031,0.0000747858,-0.000477279,-0.000159516,-0.00136944,0.000184845,-0.00138523,0.00177599,-0.00134143,0.00149533,-0.000943281,0.000863607,0.00142152,-0.000300659,0.00123692,-0.0014131,-0.000594199,0.000602814,0.000464212,0.000961228,-0.0011901,0.000105185,-0.000543589,0.000810331,0.000748754,-0.000417689,-0.000283242,-0.000948353,0.00166176,-0.00123167,-0.000372335,0.000117968,0.00181716,-0.000604977,-0.000631144,-0.000662241,0.00152117,-0.00009781,0.000666673,-0.000489008,0.00092254,-0.000389414,0.000401755,-0.0000679867,-0.000729177,0.000441909,-0.000731453,-0.000280212,-0.00136138,0.000147653,-0.000558561,-0.0000754203,0.000500048,-0.00113493,-0.00126525,0.00150509,0.0000764318,0.00063848,-0.000233124,-0.000419526,0.001713,0.00015598,0.00187283,-0.000916167,-0.000308072,-0.00176522,0.000511903,-0.00131874,-0.000761546,-0.000168045,-0.000270812,0.000567945,-0.00050286,-0.0008182,-0.000550123,-0.000387651,-0.000743605,-0.000135446,-0.000356148,0.000304262,-0.0010272,-0.0014682,-0.000583567,0.00000989403,-0.000133393,0.000419135,0.00147118,-0.000233512,-0.000561051,-0.000722628,0.000652257,0.000844152,-0.00101595,0.000992556,0.00129494,0.00109797,0.000591207,-0.00116568,0.000393113,0.000108882,0.00112452,-0.000911117,0.000367715,0.000709161,-0.000548305,-0.000097641,0.000979732,-0.000207344,0.000448447,0.000185098,-0.000743342,0.000907962,0.00166526,-0.00126464,-0.00039074,0.000305078,-0.00000289868,0.0014384,-0.000621067,0.000363308,-0.00093402,0.000120711,-0.000312797,-0.000372696,0.000670825,0.000347136,-0.000586705,-0.00138919,-0.00043205,-0.000352232,0.0001229,0.000960643,0.000749723,-0.00149071,-0.00130839,-0.000295048,-0.000120556,0.000614615,-0.00198135,-0.000636807,0.000641916,0.0011466,0.000150338,0.000698704,-0.00062767,0.000739886,0.00035944,-0.000326962,-0.001372,-0.0000559648,-0.000867997,0.000247104,0.000625435,-0.0013879,-0.00119403,-0.00112125,0.000881638,0.000349474,0.000429574,0.000988893,0.00078027,0.000300445,-0.000929895,0.00149176,0.000883696,0.000271089,-0.000616993,0.000149687,-0.0000971701,-0.000863315,-0.000648308,0.000956654,0.000589864,-0.000248717,-0.000898797,-0.000142111,-0.000750792,0.00198396,0.000260597,0.000242769,-0.000470954,-0.00157324,-0.000311858,-0.000635815,-0.000230792,-0.000615294,-0.000479245,-0.00047117,0.00036587,-0.000661066,0.000116936,0.000179505,-0.000729631,0.00153224,0.000123882,0.000778696,0.000237956,-0.000776357,-0.000517075,0.0000816982,0.000411998,0.000554388,0.000588542,-0.0000240068,-0.000103317,0.000432972,0.000683828,-0.000125214,-0.000904427,-0.00018598,-0.000225818,0.00103124,0.000334414,-0.000602258,-0.00163067,0.000213121,0.000078276,-0.000897465,-0.000359089,0.000176059,-0.000934983,0.000417554,-0.00125186,0.00157923,0.000959965,0.000486997,0.000903602,0.00083499,0.000529103,-0.000750441,0.00178348,0.000176105,-0.000326164,0.000626915,-0.000615488,0.00150689,-0.000626899,-0.000784372,-0.00129132,-0.000231875,-0.000788897,0.000698694,0.000217075,-0.00113311,0.00180939,0.00121527,-0.000699887,0.000491232,-0.000268756,-0.00137743,-0.000510496,-0.0000598925,0.000245005,0.000738227,0.00149805,-0.00015295,-0.0000576925,0.00079861,0.000110507,0.000134656,-0.00115566,-0.000552571,-0.000512448,-0.000464188,-0.000457421,-0.000344289,-0.000327292,-0.00197219,-0.000268248,0.000350862,-0.000352491,-0.0000479484,0.000599618,-0.000666399,0.0001324,-0.000217792,-0.00129682,0.00055497,0.000970214,-0.000432409,0.000111149,0.000290408,0.000186366,-0.000880406,-0.000261775,0.000307309,-0.00101468,-0.00173146,0.000573932,-0.0000779967,0.000491077,-0.0000625441,-0.00083958,-0.000122303,-0.000248369,0.00110642,-0.000589712,-0.000270444,-0.000617682,-0.00107658,-0.00129105,0.000587887,0.000252085,0.000978821,0.000240491,0.000260986,-0.0000888333,-0.000839109,0.000639003,-0.000731918,0.000918746,-0.000833531,0.000289604,-0.00195982,0.0019574,-0.000911227,0.00143212,-0.00068558,-0.000365808,0.000629087,0.00136618,0.000216647,0.000730136,0.00132238,-0.000253494,-0.00167401,0.00070419,-0.0000656363,-0.00043481,0.00187937,0.00163508,0.0012565,0.00049529,-0.00142094,0.000104382,0.000688962,0.000836975,-0.000635108,0.000956554,-0.000208997,0.000787247,0.00178811,0.000789133,-0.00114467,0.000355836,0.00145437,-0.000716486,-0.000243204,-0.000842614,0.0000421117,0.000130091,0.000411854,0.000946485,-0.000226768,-0.00012327,0.00041688,-0.000307611,-0.00163352,-0.000552038,-0.0000654218,0.0000923428,-0.00187549,-0.000405511,-0.00092338,-0.000371032,-0.00147525,0.000143504,-0.00127328,-0.00140678,0.00189482,0.000150994,-0.000658135,-0.000469662,0.00114044,-0.00120833,0.000360491,0.000610785,-0.00131098,0.00100975,-0.000204162,-0.000360245,0.000888731,0.00187171,-0.000790346,0.000035833,-0.00120849,0.0014942,0.000255822,-0.00114256,0.0000268749,-0.00143196,-0.000401603,0.00184018,0.000487396,-0.000868156,0.00187525,0.000325744,-0.000199945,0.000326901,0.000401219,0.000655509,-0.000518099,0.00159588,-0.000433104,-0.00145112,-0.000535692,-0.0000517196,0.000524237,0.00125259,0.00129339,0.000316407,-0.00000316146,0.000599001,0.000737946,0.001315,-0.000424427,0.0000814552,-0.000364505,0.00124074,0.00123599,-0.00125732,0.00162628,0.000840576,-0.000825915,-0.0000266514,0.000312438,-0.000102814,0.000427157,-0.00114473,0.000598552,0.00135934,0.000569388,-0.00100324,0.0000446044,0.000831602,-0.000913882,-0.00114165,-0.00033404,-0.000147352,-0.000562384,0.000826865,-0.00146179,0.00126564,0.00094667,-0.000954381,-0.000933525,-0.000591031,0.0017807,-0.000288816,-0.000714568,0.000384066,-0.00167503,0.000732585,-0.000438612,-0.000343319,0.00103931,0.000671922,-0.00185339,0.00088108,-0.00115338,-0.000131769,0.000181724,0.000826878,0.001193,-0.000525606,0.000519993,-0.000318135,0.0000642517,0.000482665,0.000238474,-0.00026305,-0.000223518,-0.000157462,0.0000336327,-0.000000711658,0.000557857,-0.000362691,0.000573631,0.000283103,0.000251324,-0.000475559,0.001504,-0.0018722,0.000487354,-0.00128341,0.0000331005,-0.00169758,-0.00017504,0.000241595,-0.000648098,0.0000852847,0.0019076,0.000401929,0.00150571,0.000608981,-0.000311596,0.000622269,0.000154584,0.00179675,0.000598014,-0.00189359,0.00116259,-0.000400285,-0.0000164223,0.000519133,0.00153323,0.000883032,-0.000342217,0.000959364,-0.000281758,-0.000978142,-0.00113602,-0.000227063,-0.00118259,0.0000176,-0.0010032,-0.00143408,0.000723225,-0.0013087,0.000390434,0.000742375,0.00087079,0.000668014,-0.00145921,-0.000782407,-0.000442237,0.00178962,-0.00182262,-0.00152117,-0.000601935,0.00174228,0.000365309,0.00029306,-0.0003649,0.0000716903,0.000936882,0.0000658267,-0.00113373,-0.000123259,-0.0000737159,-0.00012716,-0.000285102,-0.000933183,0.000257369,-0.000325192,0.000150414,-0.000356534,-0.000809926,0.0012638,-0.0000310375,0.00128512,0.00132469,-0.001975,-0.000542672,-0.000300925,-0.000456202,-0.000798354,0.000551355,0.00154259,0.00140816,-0.000906041,0.00119252,0.0000845102,-0.00174683,0.000531697,-0.00144033,-0.000422275,0.000252745,0.0000652468,-0.000277573,-0.000662999,0.000317819,-0.000684778,-0.000849575,0.000400339,0.00000693377,-0.00081823,-0.00124987,-0.0000708673,-0.0000711753,-0.00101308,-0.000420283,-0.000183547,-0.000060101,0.00134121,0.000427904,0.000934219,0.00182168,-0.000270422,0.0000545672,-0.000776027,-0.00156224,-0.000579386,-0.00056683,0.000237162,0.000227489,0.00000160739,-0.000213029,-0.00101644,-0.0012131,0.000351712,-0.00138342,-0.00120595,0.000883205,0.00077622,0.000778898,-0.00141174,0.000704706,-0.0000148986,-0.000197516,0.000338197,-0.000523767,0.0000616515,0.0017511,-0.000676419,-0.000413971,0.001679,-0.0000989211,-0.0000713734,-0.000305195,0.000830606,-0.000943596,-0.00118767,-0.000280349,-0.00113788,0.0000595596,0.000101952,-0.000850838,0.000892078,-0.000485558,-0.00161745,0.000932981,-0.00110686,-0.00147889,-0.000543578,-0.00000583434,0.000138253,0.00034397,0.00106922,-0.00135994,-0.000167984,-0.000207979,-0.00190592,-0.0000959921,-0.00157373,-0.000045455,0.0000158781,-0.00044578,0.000687233,-0.0000459941,0.000552007,-0.000314576,0.0013909,0.00082739,0.000517868,0.000558841,0.000753633,-0.0000248891,0.000134822,0.00108513,0.000846604,0.0000884853,-0.0000371699,-0.000213653,-0.00194619,-0.000853664,-0.00110351,0.0000430824,-0.00136909,0.000293044,0.000113821,-0.0000786221,0.0000477695,-0.000540653,0.000493285,0.000305325,-0.00128608,-0.000340442,-0.00168734,0.000779153,-0.000587339,0.00144682,-0.000220081,-0.000264646,0.00000719365,-0.00110339,0.000248093,-0.000305184,0.000680453,-0.000278662,0.000510361,0.0000448848,0.0011344,-0.000172128,0.000471874,-0.000745343,-0.00024903,0.000201193,-0.000552016,-0.000883979,0.00099323,0.000499725,-0.000278942,0.000055201,-0.000637485,-0.000769117,0.0000252687,0.00149063,-0.000914684,-0.000604669,0.0002713,0.000456566,-0.0000243493,0.00121902,0.00117651,0.00068785,-0.000434079,0.000833697,0.000997296,-0.000769544,0.00136777,0.00130398,0.000417747,0.000343274,-0.000782109,0.000159037,0.000346462,0.00103761,0.00158768,0.00185682,0.000374424,-0.000138077,-0.000406345,0.00112371,0.00100337,-0.000771169,0.00139879,0.00122464,-0.00171164,-0.00192159,0.00154937,-0.000019017,-0.00110282,0.00111931,-0.000392578,-0.000750448,-0.000846897,0.000963967,-0.00127189,0.00117233,0.000119048,0.0000970952,-0.000883959,0.000635897,0.0000383008,0.000404173,0.000700791,-0.000640449,-0.00139303,0.00165753,-0.000780937,0.000709936,-0.00120117,-0.00114583,-0.00060655,0.00140075,0.000432443,-0.000864421,-0.00047688,0.000901631,-0.000636237,0.000415848,0.0012146,0.00159918,-0.000921887,-0.000229112,-0.000538771,-0.000423985,0.00088843,0.000197871,0.000694635,-0.00144029,0.00055364,0.00181026,0.000463039,0.000136437,0.000966596,0.000344927,-0.000779664,0.000247051,0.00147819,0.000591372,-0.000536542,0.00165465,0.000747552,0.000830249,0.00154768,-0.000905265,0.00114125,-0.00153313,0.000536495,-0.0000927223,0.0000956855,-0.00085565,0.000460914,0.0000765542,0.000709364,-0.000843981,0.000357422,0.00043557,-0.00138568,0.00124002,-0.000797473,-0.00139818,-0.0000464951,0.0000572381,0.00141204,0.000790375,0.000638241,-0.00169708,-0.000403602,-0.00136265,0.000244162,-0.00149483,0.000629228,-0.00163289,-0.000435322,0.00121346,0.000737271,0.000126772,0.000552836,-0.000139193,0.00038442,0.000620966,0.00140908,0.000153474,0.00108688,0.0000669436,0.00015723,0.00092656,0.00119914,0.0005778,0.000487493,-0.000098132,0.000147733,-0.00109161,0.000570795,-0.0000946793,0.00000536258,0.000512899,-0.000659143,-0.000523765,-0.0000937476,0.00147112,0.000637757,-0.000618401,-0.000624237,-0.000412884,0.00158827,-0.0012811,0.000158039,0.00140484,0.00102097,0.0015698,0.000579367,0.000494841,-0.000038153,-0.000523891,-0.0000121097,-0.000403109,0.0000858818,-0.0000789319,0.000085497,0.00017349,0.000183362,-0.00143198,0.00176541,0.00177716,0.00124221,-0.000801609,-0.000353332,-0.000649944,0.0000833512,0.00194675,0.000445109,0.0009371,0.00047177,0.00125371,0.000345696,0.001153,-0.00198403,0.00135268,0.000321198,-0.000460139,-0.000217617,0.00130636,0.000396672,-0.000418412,-0.000286202,-0.000961744,0.00120717,-0.000992218,-0.000894886,0.0000691185,0.000253996,-0.000516927,0.000882929,0.000873841,0.00112653,0.000415689,-0.000737803,0.00014427,-0.00170682,0.000314955,0.000326297,-0.00115995,-0.00121404,-0.00199826,0.00171441,-0.00102303,-0.000034434,0.00127322,-0.000553161,-0.000783227,-0.000896439,0.00000464676,-0.00110213,-0.000947034,0.000951349,-0.00112614,-0.00108039,0.000864702,0.000239213,0.000405472,-0.000335525,0.00133141,0.000185194,0.000227799,0.000848334,-0.000824659,-0.000600764,0.00125022,-0.000534689,0.00112885,0.000582044,0.00116543,0.000877215,-0.000315029,0.00014919,0.00188828,0.000106377,-0.000145429,-0.00137336,-0.00088905,-0.00101939,-0.00152834,-0.000219826,-0.000408778,0.00102494,0.00092557,-0.000978449,0.0000650489,0.000137883,-0.000449695,-0.00149665,0.00160653,0.000204995,-0.000665366,-0.000252242,-0.000458759,0.00146062,-0.00016632,-0.000679728,-0.00000863599,0.000862985,-0.000998112,0.00186152,-0.00126338,-0.00146102,-0.00126533,-0.000397974,0.000917829,-0.000280545,-0.000610128,0.000660788,0.000999213,0.000118196,-0.000908974,0.000113456,-0.000250863,0.00184084,-0.000789732,0.000625124,0.000484698,-0.0000212152,0.000223928,-0.000835068,-0.000410335,-0.000694486,-0.0000991313,0.000908282,-0.000660007,-0.000730988,-0.000183879,0.00010308,-0.0000363599,-0.00147872,0.000655706,0.0000217281,0.000754501,0.00122773,0.000640118,-0.000491073,-0.0000552928,0.000200087,0.000163683,0.00145084,-0.000671473,0.000804593,-0.000252143,-0.0000915106,-0.00160026,0.000679885,0.000336161,-0.0011338,0.00112492,-0.000270019,-0.00110765,0.00118384,-0.000234709,-0.00109037,0.000418394,0.00114204,0.00103935,-0.000255242,-0.000320579,-0.000484793,-0.000511468,-0.00000875159,0.000652506,-0.000803534,0.000181338,-0.000318302,-0.000257713,-0.0015401,0.00119511,0.000208205,0.000951493,0.00132352,0.00169667,0.000515363,0.000328607,0.00166399,-0.000998757,-0.00085736,-0.000524229,-0.000581296,0.000431154,-0.00118757,0.000391541,-0.000404627,0.00142049,-0.00175369,-0.000121307,-0.000615235,-0.001419,-0.00157864,-0.000562978,-0.00115437,-0.000219521,0.000631975,0.0000472602,0.000235953,0.00131338,-0.00144072,-0.00153332,-0.00153522,-0.00138972,-0.00044155,0.000288675,0.000912233,-0.000378808,0.00199636,-0.000899281,0.0000984729,0.0015584,0.000969791,-0.0000851564,0.000203656,-0.000923316,-0.000390051,-0.000159876,-0.000515874,-0.000772257,-0.00117031,0.000414953,-0.000757331,0.00020288,0.000426053,0.0000188018,-0.0000308783,-0.000483485,-0.0014309,-0.00158097,-0.00191652,0.000855057,0.000295792,0.00151418,-0.000580584,-0.000708102,-0.00000537999,0.0007062,0.00146848,0.000747154,0.00118077,0.000153989,-0.00195677,-0.000191152,0.00060731,-0.00168902,-0.000391029,-0.000595638,-0.0017627,0.00157282,-0.00106411,-0.000425262,0.000185751,0.00014608,0.000500637,0.000498701,-0.00183122,0.00113819,0.000675202,0.000351668,0.000223599,-0.0000428374,-0.000633403,-0.00125142,0.000934072,0.000165394,-0.000842271,0.00132998,0.000884812,0.00195699,-0.00136275,0.00153401,-0.00085695,0.0000753369,-0.000459138,-0.000872915,0.0000250893,-0.0019301,0.000738923,-0.00128134,-0.00194718,0.00166816,0.00120494,0.00110525,0.00134903,0.000936344,-0.0005915,0.0000575697,0.00000431103,0.00120036,-0.000323903,0.0000520404,-0.00122725,0.00090703,-0.00182697,0.00103895,0.000912994,-0.000886824,-0.0000786469,0.000644651,0.000691181,0.000380386,-0.00017093,0.000413953,0.000146818,0.000127234,0.000213364,-0.00148732,-0.000558335,0.0000109791,0.000152815,0.00160043,0.0000537598,0.00118447,-0.000333204,0.000115214,-0.000693737,-0.00140535,0.00121189,-0.00019078,-0.000692397,-0.00112532,-0.000481331,-0.000841416,0.000107985,0.000789146,-0.000580926,-0.000226246,-0.000982434,0.000222394,0.000273591,-0.000735243,-0.00146575,-0.000212016,-0.000237466,-0.0000995795,-0.00101475,-0.00184138,0.00100024,-0.00103569,-0.000935501,-0.000989503,0.000249736,-0.00061671,0.000479829,0.000111702,-0.00157945,0.000243342,0.000225699,0.000415273,-0.000246688,0.000340809,0.00108333,0.000444703,0.000849013,0.00057337,0.000280407,-0.000137038,0.000316931,0.00103112,0.00067735,-0.000738999,0.00111121,-0.000288063,0.000841615,0.0000884051,-0.00184758,0.000617085,0.000130844,0.000523545,0.0000351335,0.000209283,0.000833135,0.00197833,0.000272819,-0.0000942372,-0.000253362,0.0010237,-0.000115955,-0.000411801,-0.00106826,-0.000998951,0.000453063,0.000566877,-0.000835792,0.000458607,0.0000137305,0.0000550506,-0.0000430953,-0.000135474,0.00184706,0.00061249,0.000920593,-0.000905142,-0.0000399661,-0.000398189,0.00161031,-0.0000484751,0.000984885,-0.000911906,0.00111469,0.000254149,-0.000139282,0.000214954,0.00119968,-0.000495448,-0.00107535,-0.000758226,0.000170277,0.00167598,0.000545439,0.00150009,-0.000262393,-0.00085595,0.000384736,0.0000980766,0.00141158,0.000523621,-0.0000548346,-0.000406351,-0.00107455,-0.000682685,0.000554937,0.000751471,-0.000121189,0.000881081,0.000280947,-0.00130255,0.000095494,0.00112737,0.000218552,-0.000520896,-0.000921578,0.000701133,0.000943329,-0.000188803,0.000551383,-0.00101974,0.000014913,0.00108916,-0.00158079,0.00115154,-0.00167195,0.00136151,0.00067629,-0.0017319,-0.000670923,-0.000683051,-0.000412886,-0.00151126,-0.00061547,0.000840588,0.00118618,-0.00105604,0.00101903,-0.000838982,0.00132103,0.000243351,-0.000749008,-0.000186795,0.000430582,-0.00159584,-0.000162618,-0.0000392553,-0.00052523,-0.00125606,0.00011036,-0.00137454,0.00121672,0.00140643,-0.000725197,0.00130683,0.000374635,-0.000105567,-0.00105724,0.000880279,0.000489708,0.000980377,-0.0000529132,-0.00081757,-0.000755819,-0.00146441,0.0013101,0.000634949,-0.000475981,-0.000284719,-0.000479783,-0.000324551,-0.00000839611,0.00089664,0.0000859283,-0.0000820854,-0.0000473217,-0.000975384,-0.00086332,0.000628388,-0.00180851,0.000115197,0.000411849,-0.000789069,0.00151139,0.000534888,-0.00034259,-0.00121098,0.000952066,-0.000670757,0.000762309,-0.000134839,-0.000718288,-0.00119491,0.00018058,0.000661313,0.000830683,0.000702234,0.000983697,0.00111487,-0.0000451966,0.00151916,0.000922855,-0.00039578,-0.000608181,0.00162135,-0.000207713,-0.000860879,-0.0000263621,-0.000328009,0.000817737,-0.00129985,-0.000265006,-0.00146138,-0.000260784,0.000694217,0.000451646,-0.000554883,0.00181591,0.00105716,0.000749222,0.00141434,0.000562037,-0.0008483,-0.000374409,-0.000384982,0.00173762,0.00000862615,0.000835405,-0.000447592,-0.000882658,0.000570751,-0.000116759,-0.00029248,-0.000520386,-0.00123627,-0.00026711,-0.000309822,0.000616886,-0.00120681,-0.000767156,-0.000182237,-0.00071847,0.000924845,-0.000900015,0.00184879,0.000241299,-0.00124324,-0.000717868,0.00096671,-0.00146525,0.000293025,0.0013312,0.000400244,0.000165196,0.000118643,0.000728493,-0.00177155,0.00104225,-0.00145171,-0.0000498344,0.000969055,0.00101445,-0.000958353,-0.00171128,-0.00135776,0.00130785,0.000551974,-0.000174334,0.000900673,0.000504337,-0.000190992,-0.00166244,0.00115158,-0.00106647,-0.00147914,-0.00166808,0.00100696,0.000476731,0.000741538,0.000191106,-0.000288143,0.0000141991,0.0000511997,0.00132233,-0.000205744,0.000676272,-0.00121233,0.00150262,-0.0000448407,-0.00123054,0.000821747,0.000321651,-0.000740997,-0.000226183,0.0000714352,0.000468716,-0.000405154,0.00125437,0.000145818,0.000872232,0.00116955,-0.00020108,-0.00174423,-0.00158379,-0.000473495,0.00102605,-0.00132237,-0.00087804,-0.000185004,-0.000925787,-0.00037735,-0.0000324632,-0.0010551,0.000502786,0.0000144665,-0.000375618,0.000486061,-0.0000958388,0.0000323086,-0.000365035,0.000706316,-0.00179847,0.000764424,-0.000652336,0.000431229,0.000805071,-0.000967613,0.000380518,-0.00046329,-0.000136402,0.000434585,-0.000278515,-0.000454043,0.000456303,-0.00026066,-0.00112116,-0.000451313,0.00146829,0.0000293963,-0.00128476,-0.00117151,0.000341377,-0.000550169,-0.00032971,0.0014285,-0.0000474384,-0.00046568,-0.00133777,-0.00171796,0.000164668,0.000613605,-0.000606739,-0.000178881,-0.0000795503,-0.00182976,0.000529543,-0.000533669,-0.0000254811,0.00028308,-0.000100633,0.000533273,0.0012283,0.000132214,-0.00166369,-0.000434617,0.00120838,-0.00168012,0.00000948802,-0.000934478,-0.00148111,0.000495705,0.00121673,0.000996678,0.000829839,-0.000269332,-0.00129568,0.000146551,-0.00142573,-0.000297121,0.000544529,0.000400491,0.0000828713,0.000569606,-0.000634387,-0.00117179,0.000829484,-0.0000129551,-0.000459582,-0.000648181,0.00119353,0.00105856,0.000231265,0.000405189,-0.000550965,-0.0011683,0.00109119,-0.000423464,-0.000832783,-0.0000879268,0.000706682,0.00151245,0.000050665,0.000263655,-0.00156076,0.000195532,-0.000212029,0.00105935,-0.000755841,0.00166486,-0.000713679,-0.000966031,0.000627068,0.000142826,-0.00031311,-0.00178542,-0.00175301,-0.000323439,-0.000942356,0.00021833,0.00073662,-0.000653562,0.000387565,-0.00134664,-0.000428948,0.0000362096,-0.000177584,0.000774518,0.00101558,0.0000279553,0.000213885,-0.0017024,0.000514085,-0.000121169,0.000169268,-0.00112969,-0.0011668,-0.000453989,-0.000412417,-0.000204808,-0.0000316611,-0.0000846379,0.00021428,-0.000482869,-0.000784476,-0.000066044,0.00108488,-0.000530798,-0.000084307,-0.000337134,0.000946304,0.000195951,0.00104527,-0.00160141,-0.00140338,-0.000300411,-0.00020714,0.000585484,0.00143573,0.00118222,-0.000391245,0.000748086,-0.0014092,0.000176525,-0.0003869,0.000445085,-0.000897522,0.000557702,-0.00156793,-0.000958796,0.0000528288,-0.00112298,-0.0013423,0.0008821,0.000524309,-0.000793943,-0.000155529,0.000760473,-0.000166278,0.00000979501,0.000805821,0.000430974,0.00035935,-0.00104465,-0.0010404,0.000908364,0.000779165,0.0000896871,0.000863052,0.00031025,-0.00129018,0.0011547,-0.000722847,-0.000252111,0.0000799254,0.000778543,-0.00148526,-0.000576445,-0.000770514,0.00139866,0.0010385,-0.000716096,0.000772167,-0.000809627,-0.000474374,0.00139723,-0.00112394,0.000269525,0.00165772,-0.000657088,0.000316449,-0.000521789,0.00172479,0.00152874,-0.000437741,0.000612285,0.000743119,-0.00197276,0.000522165,0.00174573,0.000404425,0.000590093,0.00131194,0.000920615,-0.000399913,0.000559724,-0.000274022,-0.00110627,-0.000939007,0.000913073,-0.000185852,-0.00118615,0.000353997,0.000661027,0.000618421,-0.00124796,-0.000664342,-0.000383993,0.000019844,0.000746776,0.00058907,0.000805529,-0.0000395174,0.00156525,0.00107818,0.00192487,-0.00139731,0.000368568,-0.000815664,0.00096275,0.000931881,-0.000693229,0.000440054,-0.000701443,0.000361797,0.000987671,-0.000558497,-0.000174914,-0.000115567,-0.000272987,0.000720388,0.00103486,-0.00113736,0.000940891,-0.00158106,-0.000889139,-0.000499548,-0.000527273,0.000893576,0.000529194,0.00086438,0.000357977,-0.00117892,-0.00158984,-0.000555759,0.000363197,-0.00126273,-0.000393658,-0.00178567,0.00136319,-0.00123092,-0.0000942864,-0.000887671,0.000499116,-0.0000667493,-0.0016997,-0.00104136,-0.0016038,-0.000187722,0.000199458,0.000168808,-0.00012916,-0.00151626,0.000445931,-0.000322217,0.000339875,-0.000745851,-0.00136622,-0.000407787,0.0000175274,0.000806227,0.000132672,0.000117037,-0.000413335,-0.000829505,-0.000627658,-0.0000942099,-0.000871998,0.000959186,0.00055513,-0.000369181,-0.00130349,-0.00108448,0.000131909,0.00123118,-0.00104116,-0.00181585,-0.001216,-0.000319493,0.00019165,0.000528346,-0.000132748,0.00056076,0.000988056,-0.000457284,0.000872412,0.000399488,-0.00103949,-0.000126095,0.0000276171,0.000401261,0.00165149,-0.00184802,-0.00181076,0.000211152,-0.000970486,-0.00127033,0.000717351,0.000420005,-0.00006382,0.000203382,-0.00100851,0.000323758,0.0000109344,-0.000316047,-0.00087553,0.000451779,0.000716018,0.000782044,0.000924477,-0.00177772,0.00102663,-0.000288184,0.0017373,0.000328272,-0.00194049,-0.000415871,0.000241611,-0.00160836,-0.00117097,-0.000289775,-0.000136346,0.0000229783,0.000571032,0.0000759795,-0.0000719883,0.000220309,-0.000108884,-0.0000833285,0.000245044,0.000191332,0.000929248,-0.000543624,0.000467639,-0.0000366637,0.00148717,0.000526376,0.000775702,0.00048006,-0.00113884,-0.00151492,-0.00104535,-0.000893032,-0.0000147303,-0.00158131,-0.000658668,-0.000618738,-0.000620678,-0.000133246,-0.00148046,-0.00056378,-0.00196971,-0.00135656,-0.000516165,-0.000246144,-0.00038566,-0.00033631,-0.000689372,0.00012636,0.00135355,0.000712394,0.000112509,0.000954789,0.000678832,0.00110516,-0.000582806,-0.0011386,0.000142028,-0.00159712,0.000457565,0.000861618,-0.000270596,0.000779026,-0.000916564,-0.000771141,0.0013412,0.000411903,-0.000308149,-0.0000668436,0.0016661,-0.00108891,0.000316916,0.000338851,-0.000451148,-0.000545107,-0.00113432,0.000116386,-0.000265416,0.00189662,0.000288865,0.0000808272,0.000718063,-0.000435176,0.0000697525,-0.000372391,-0.000406147,0.000796479,0.000387298,0.000152625,-0.00132586,-0.000212003,-0.00154159,-0.0000924122,-0.000494103,-0.000067826,0.00109077,-0.000395726,-0.00068537,0.000769523,-0.000626963,-0.000260446,-0.00109582,-0.00053582,0.000586405,0.000237273,-0.000459285,-0.000317515,-0.0000132198,0.000467006,-0.000175748,-0.00180747,0.000493152,-0.000452482,-0.000381547,-0.0000679886,-0.000613915,0.00115585,-0.00136607,-0.000147111,0.000575,-0.000384823,-0.000123036,-0.000731739,-0.00059203,-0.000489122,-0.000131828,0.0000273103,0.00114262,0.000296937,-0.00112601,0.0000364737,0.000947446,-0.000361116,0.00163515,-0.000573138,-0.000313336,-0.000179394,0.000969214,0.00043407,-0.000696778,-0.000532518,-0.0011704,0.0000661542,-0.00194757,0.000953017,-0.000844046,-0.000796205,0.00174813,-0.0000455016,0.00139801,0.00132202,-0.000905118,-0.00120364,0.00166238,0.000641334,-0.000240323,-0.000626302,-0.000140235,0.000376607,0.000286187,0.00000414905,0.00121379,-0.000967955,-0.000417083,-0.00141921,-0.000973029,-0.000377434,-0.000825255,-0.00066166,-0.000794886,-0.000140379,0.000426274,-0.0000955514,-0.000594372,-0.000406096,-0.000957558,-0.000816105,0.0004498,-0.000369411,0.000829163,0.000745864,-0.00128994,-0.000139394,-0.000712989,0.00086823,-0.00108234,0.000841009,-0.000984667,0.00104114,-0.00175536,-0.000585907,0.000230837,-0.000170349,0.00059901,-0.00153686,-0.000696986,0.00140516,-0.000967038,-0.000341631,0.0017911,0.000983749,0.000313147,0.0000262642,0.00043441,-0.000132795,-0.000869794,0.0000873045,-0.000981119,0.000632224,0.000412174,0.00102886,-0.000701834,0.000967644,0.0000963473,0.000501495,0.000687245,-0.00105287,0.00032975,-0.0003263,-0.000389963,0.00108528,0.00000114567,0.0000614648,-0.000525761,-0.000311936,-0.00174441,-0.000688206,0.000910947,0.000286433,0.00149967,0.000680615,-0.000393932,0.000208953,-0.0000189259,0.00167408,-0.000699124,0.0011877,-0.000453068,-0.00151555,-0.00192794,-0.000118079,-0.0000687601,-0.00110625,0.0000172393,0.000214893,0.0000940031,0.00178377,0.000897409,-0.000234647,-0.00124465,-0.000104125,0.000181228,0.000110384,0.000771221,0.00021905,0.000287422,-0.00148126,0.000721069,-0.000929155,0.00113304,-0.00181262,0.000456831,-0.000521171,-0.0000802467,0.000982758,0.0010142,-0.000163676,-0.00139769,0.00144127,-0.000316927,-0.00173262,-0.000367368,-0.000106146,-0.000115132,-0.00141925,-0.000641694,0.0014762,-0.000339103,-0.00039713,-0.000571024,0.000654091,-0.00122305,-0.000225771,0.000961856,-0.000873623,-0.000567056,-0.000816992,0.000633936,0.000747598,-0.000577115,0.000513346,-0.000292815,-0.00150572,-0.00154969,0.000677918,0.000103477,0.000166643,0.00126268,-0.000764231,-0.000759339,0.000359356,0.000216121,0.00103929,0.000669339,0.000277577,-0.000318564,0.0000142235,0.0013478,0.000465575,-0.000737109,0.00125998,-0.000273199,-0.000593677,-0.000398691,0.000280313,0.000196516,-0.000955018,0.000155525,-0.00060889,-0.00172375,0.00010417,-0.000812573,0.0015012,0.00000559191,0.000471924,0.000655152,0.0013881,-0.000847107,0.000763501,-0.000661858,-0.0010588,0.00031774,-0.000514311,0.000541654,0.0000310465,0.000366631,-0.000379048,0.000162123,0.000287096,-0.000210137,0.00117159,0.00112491,0.000841634,-0.000106632,0.000273112,0.000350665,-0.000629694,0.000352842,-0.00055302,0.00097654,-0.00161673,0.000871777,-0.000302523,-0.00116089,-0.00133294,0.000218511,0.000240725,0.000736799,-0.00137758,0.000625109,-0.000130585,-0.000994292,0.000393552,0.000316293,-0.00194852,-0.000166201,-0.000999011,-0.00100038,-0.000586387,0.000181749,0.000761443,0.000785582,-0.00188822,-0.000946857,0.0000131643,-0.0000699133,-0.00137715,-0.000322303,-0.000539914,0.00142151,-0.00175897,0.00052959,-0.00186934,0.00053915,0.000644444,0.000949353,0.000254388,0.000171469,0.000286127,-0.000283431,0.000268068,0.0000922801,0.000748166,0.00107551,-0.00108071,-0.000203507,-0.000722897,-0.00171548,0.0010061,0.000444127,-0.000892398,0.00158651,-0.000831807,0.000108065,-0.000324145,0.000617154,-0.000257718,-0.000868099,-0.00136715,-0.000916796,0.00110208,-0.00158164,-0.00112906,-0.000124443,0.00151976,-0.00159946,-0.000920685,0.000373591,-0.00150754,0.0000400107,0.0005047,-0.000219429,-0.000873263,0.000292848,0.000562057,-0.000526426,-0.00039518,0.000705777,-0.000260994,-0.000301355,-0.0016874,-0.00130605,-0.00112627,0.000524502,-0.0000820242,-0.00000119078,-0.00191866,0.000217815,0.000332296,-0.000484622,-0.000190451,0.000280121,-0.000501139,-0.00095177,-0.000821324,-0.000886146,-0.000481051,0.00101427,-0.000236685,-0.000390119,-0.000720937,-0.000207542,-0.0000550454,-0.000105579,-0.00088439,0.00047957,0.000225185,0.00067005,-0.000195049,0.000481325,-0.000237096,0.00174741,-0.0000806832,-0.000965189,0.00186199,0.00115132,0.000987983,-0.000119842,0.000486625,-0.000206765,0.00089589,-0.0012084,-0.00165105,-0.000322273,-0.000421137,0.000392133,0.000153577,0.000856015,-0.00142639,0.00182536,-0.00130717,0.00036587,-0.00127534,-0.0000851178,-0.00120407,0.000673303,-0.000304155,0.000198094,0.000591173,-0.000816301,-0.00100836,0.000166726,0.00106024,-0.0000771788,-0.00162147,-0.000736781,-0.00111422,0.00000686624,0.000174428,0.000667601,-0.000758423,-0.000208653,0.0000100465,-0.000608647,0.00139167,-0.00102729,-0.00153482,-0.000363223,0.00142666,-0.00170925,-0.000831361,0.000545369,-0.00146665,-0.000939784,0.000813645,0.000114572,-0.00107213,-0.000172234,0.000977222,0.000525996,0.000265126,0.000713792,-0.000187568,-0.00184579,0.00103811,0.00166172,-0.00105957,0.000362666,-0.00080116,-0.000490903,0.000809483,0.00103835,0.000483128,-0.000678745,-0.000506617,-0.000712944,0.000271265,-0.00118887,-0.000615484,0.0000693495,0.000858575,-0.00108766,-0.000728753,-0.00110848,-0.000163577,-0.000434835,-0.000482903,0.000842481,0.000943382,0.0014772,-0.000362777,-0.000444046,-0.000305495,-0.000071569,-0.000492563,-0.000279182,-0.000793115,-0.000823153,-0.00169039,-0.000854385,-0.00110864,0.000222392,0.000190518,-0.0013444,0.000132404,0.000756802,0.00068863,0.00172173,-0.00170328,0.000129802,0.000394073,-0.00114615,0.000623532,0.000326964,-0.000203989,0.000839986,0.000241216,0.000781495,-0.0000765141,0.000171411,-0.000769897,0.000072316,-0.000838596,-0.000109839,-0.000981209,-0.000696876,0.0000903179,0.000476286,-0.000136711,0.00183477,0.000115485,0.00100632,-0.00132083,0.0001822,-0.00021244,-0.000299343,0.00112453,0.0000681377,-0.000497476,0.000727053,0.00156733,-0.000595601,-0.000505113,0.000725025,-0.000187958,-0.000476451,-0.000553799,0.0011558,-0.0013154,-0.00117894,-0.00161362,0.00136554,0.000746121,-0.000638663,0.00141564,0.000392803,-0.000262949,-0.000923086,0.0011488,-0.00102172,-0.000927583,0.000969834,0.000220333,0.0013778,0.000493107,-0.000345822,0.000209557,0.000241134,-0.000886324,-0.000627274,0.000157819,0.00056219,-0.00105546,0.000363821,0.000279814,-0.000273526,0.000541838,0.000232575,0.00156135,-0.00134831,-0.000453736,-0.000226457,-0.00131044,-0.000642286,0.000359408,0.000355497,-0.00176861,0.0000694277,0.000472373,0.00191545,-0.000335203,-0.00051372,-0.000510794,-0.000469159,0.000311943,0.000316482,-0.000447226,-0.00000912403,0.000857072,-0.00100078,-0.00110063,0.000444454,-0.0013022,-0.00104485,-0.00152762,0.000564381,-0.000923541,-0.00137041,-0.000328579,-0.00131183,-0.0007573,0.00027067,0.000721294,0.000130549,0.000208844,0.000225459,-0.000323156,-0.000523051,-0.000147872,-0.00032,-0.000909585,0.000299842,0.000131603,-0.000779257,-0.00100164,0.00112649,0.000589042,0.0010489,0.00153213,-0.00176843,0.000794125,-0.00191364,0.000386182,-0.000355411,-0.00184355,0.000900016,-0.000842004,0.000750384,0.00119395,-0.000664983,-0.000841714,0.00043739,0.00129041,-0.00059814,0.000391477,0.000493713,0.000600186,-0.000341603,-0.000273551,0.000285745,0.000167255,-0.00124852,0.000482929,-0.000152466,0.000561706,-0.000321989,-0.0012071,0.0000534531,-0.000464806,0.000117773,0.000803653,-0.000418611,0.00115523,0.00117086,0.000471404,-0.0000901382,0.000576895,-0.000279161,0.000912737,0.000192283,0.00134684,-0.000431466,0.000286476,0.00136205,0.000585043,0.000928146,0.00101987,0.000680422,-0.00133406,0.00074442,0.000568495,-0.00104252,-0.000771168,-0.00139718,-0.000387466,0.000332847,-0.000148182,-0.00174665,0.000498085,-0.00153904,0.000389195,-0.00179171,-0.000765631,0.000359521,0.000391637,0.000805011,0.000253861,0.000430321,-0.000993027,0.000609772,-0.00106248,0.000511106,-0.00000538805,-0.000649387,0.00000421559,0.0000509807,0.000864105,-0.00037232,0.000663639,0.000434344,0.000509045,0.0016749,0.000954829,0.00114248,0.000766521,0.0000861566,0.00108412,-0.000995963,-0.00100929,-0.000936926,0.00109313,-0.000367855,-0.000639119,0.00050467,-0.000729248,0.000641434,0.000244571,0.000622247,0.00100476,-0.000273229,-0.000508866,-0.000455294,-0.00147997,-0.000475807,-0.00163594,0.000428148,0.00102741,-0.000926765,0.00124842,-0.000901651,0.000721072,0.000347837,-0.000650237,-0.000425329,-0.000391809,-0.00146317,0.000439885,0.000685102,-0.000429067,0.000440234,-0.000729259,0.00013223,-0.00143405,-0.000998624,-0.000573303,-0.000173015,-0.00141092,0.00063033,-0.000297446,0.000265581,0.00113253,-0.00118361,0.000310737,-0.000898206,-0.00116746,-0.000111906,-0.00167369,-0.00113557,-0.000458337,-0.000335186,0.000773642,-0.000499704,-0.000103638,0.00113601,0.000554491,0.000416233,-0.000396094,0.000654314,0.000468143,0.000334054,0.000916036,-0.000110937,0.000623302,-0.0000209669,0.000479604,0.00140415,-0.000428986,0.00175649,-0.00176955,-0.00125626,0.00192547,-0.000237461,0.000555193,-0.000691765,0.000180319,-0.000704104,0.000358427,-0.00100792,-0.00106332,-0.000288791,-0.0000796109,-0.000476137,-0.00110841,0.000184396,0.000636688,0.0000608705,0.00162248,0.000326665,-0.001348,-0.000479672,0.000177488,0.000737678,0.000696978,0.0000861369,-0.000262297,0.000121094,0.000459213,0.000640788,-0.0000387206,0.000358865,0.000202404,-0.00130987,-0.0000386397,-0.000149151,0.000749701,0.00103686,0.000198098,0.00185431,-0.000543248,-0.000038519,-0.000186927,0.000229413,-0.00036551,-0.000653784,0.00157717,-0.00151258,-0.000161981,-0.000475071,0.000786041,0.00130826,0.00126255,-0.000520403,0.00181155,0.000879535,0.0014296,0.000138433,-0.000567683,-0.000467233,-0.00130834,-0.000791532,-0.000223153,0.000196144,0.000677198,0.0005521,0.000552916,0.000326486,0.00164074,-0.0000654926,0.000105789,0.000556734,0.00126561,0.000586439,0.000126392,-0.000366172,-0.000148522,0.000743529,0.000275771,0.000632947,0.00120283,-0.00131189,0.000155215,0.00107291,0.000778489,0.000587031,-0.00107642,0.000709412,0.00000750425,-0.00165922,-0.00187994,0.000793368,0.00137259,0.00119862,0.000364194,0.0000165948,0.00143106,-0.000666986,-0.000251881,-0.000520369,-0.000642312,0.00090816,0.000620518,-0.000945944,-0.00125968,0.000979859,-0.000440928,0.0000900117,-0.00138705,0.000326396,0.00186984,0.000102959,0.000737829,0.000709399,0.000360004,-0.00190109,0.000250655,-0.000933902,-0.000700267,-0.00144373,-0.000967698,-0.0000107699,-0.000617405,0.00169743,-0.00137269,0.00124254,-0.00127093,-0.000125306,-0.000598618,-0.000297111,-0.000370405,-0.000103729,0.000905003,-0.000116349,0.0000472274,-0.000475148,0.000278478,-0.000165622,-0.000563264,0.00110901,0.000459698,0.00157737,0.000424498,0.000342521,-0.000301874,-0.000737802,-0.00184075,-0.000338319,-0.0000350082,-0.00111384,-0.00175231,0.000716195,-0.000185238,-0.000572398,-0.000554454,0.0013836,-0.000993375,0.00153758,0.00180379,0.000811644,0.0013693,-0.000985425,0.000347475,-0.000309134,-0.000419752,-0.0000741782,0.00116659,-0.000547412,0.000383247,0.000183138,-0.000504744,0.000644692,-0.000737844,-0.00104911,-0.000279726,0.00172646,-0.000111122,0.000655303,-0.00122457,-0.000479744,0.0014744,-0.000912949,-0.00103004,-0.00173677,-0.000305313,0.00126526,0.000181397,-0.000540526,0.000377493,0.00194154,0.000145715,0.000867916,-0.00138809,-0.000818867,-0.00196512,-0.00105239,0.000800269,0.000412604,0.000981964,0.000101881,0.000137793,-0.000793593,-0.00137923,0.000507219,0.000808968,-0.0015974,-0.000355486,-0.000427891,-0.00014919,-0.0000659512,-0.00180127,-0.0000248288,0.000222499,-0.00159264,0.000478588,0.000714947,0.000649978,0.000910604,0.000254013,-0.000191568,-0.00121499,-0.00015842,0.000892823,0.00149571,-0.000774344,0.0000883292,-0.000292186,-0.000243252,0.000809735,-0.000306123,-0.00136737,0.000839087,0.00013321,0.00144341,-0.000103577,0.00139875,0.00114436,0.000396397,-0.000565546,0.000597169,-0.000300298,-0.000268035,-0.000168457,-0.000635515,-0.0010817,-0.000230517,0.000289591,0.000469553,0.000471116,-0.000550903,0.000268682,-0.000291973,-0.00104563,-0.00093327,0.000958964,0.00109176,0.000109128,0.000445651,0.000825393,-0.000693389,0.000813062,0.000772789,-0.000924062,0.00149618,-0.000418395,0.0000104104,-0.00087425,-0.00179228,-0.00065495,0.0000863516,-0.000656411,0.00121906,-0.000293375,-0.000848356,0.000350841,0.00154513,0.000281335,0.000194843,-0.000526458,-0.000114623,0.000498226,-0.0000428166,0.00115753,-0.000187757,0.000000748742,0.000310577,-0.000984797,0.000555184,0.00134314,-0.00140774,0.000406885,0.00153516,-0.000391937,0.000882678,-0.000925252,0.000460385,-0.00194814,0.000943522,-0.00117285,-0.0015037,-0.000423272,0.000487655,0.000391749,0.000656222,0.0000954345,0.0014707,0.0000704411,-0.000946728,-0.00138644,-0.000459514,0.000231498,0.000388173,0.000580706,0.0000922316,0.00172686,0.000486265,-0.000654873,0.0000427206,0.000966617,-0.000351683,0.000466587,0.000877605,-0.000956132,-0.000111797,0.000624134,-0.000650957,-0.000957086,0.000661188,0.00125387,0.000971118,0.0006905,-0.00132017,-0.000946003,0.000832651,-0.00139185,-0.000169359,0.00078308,0.00127758,-0.0000284138,-0.000491582,-0.000775822,0.00118842,-0.000303553,0.000594844,0.000488716,0.00111996,0.00166537,0.000687577,0.000264978,-0.00182866,-0.000749875,0.0000435887,-0.000670895,0.000464878,0.00103158,0.000609149,0.00126966,-0.000825493,0.000221184,0.000314173,0.000789397,-0.000565913,-0.0015903,0.000403289,-0.00055817,-0.000754139,-0.000320905,0.0017781,-0.00078514,0.000268798,-0.0000680287,-0.000385768,0.000543047,0.00106068,-0.000519108,-0.00150997,0.00128312,-0.000503187,-0.00126428,0.00169691,-0.00110018,-0.00125651,-0.000602799,-0.000154273,0.00167594,0.00114151,0.0018792,-0.00131241,-0.000000682857,-0.000147438,-0.0013798,-0.00031191,0.000698385,0.000484574,-0.00157254,0.000378599,0.000541823,-0.000984384,0.00109791,0.00069351,0.000388784,-0.000818458,-0.00133914,-0.00066447,-0.000156457,0.00158348,-0.000341933,0.00172152,0.000380611,-0.000514209,0.00127566,-0.000943796,0.000850929,0.000182523,-0.000151372,0.000654007,-0.00127024,0.000603775,-0.00102976,0.000558088,-0.00113135,-0.000691711,0.000632953,-0.000986753,-0.0000884527,-0.000982571,0.000628443,-0.00153419,0.00137728,0.00126419,-0.000795151,-0.0013555,0.000960693,0.000950097,-0.000310883,0.00111095,-0.00123972,-0.000495777,-0.000038828,0.00045214,0.0000758724,0.000691423,-0.00129059,0.000619639,-0.000982058,0.000591075,0.000188209,-0.000488009,-0.000596811,0.000205372,0.000310936,-0.00100881,0.000792325,-0.000930825,-0.00115342,0.00118532,-0.000248027,0.000475036,-0.00134683,0.00185494,-0.00158196,-0.000672667,0.000415423,0.000733981,-0.00091992,0.000764159,-0.000968777,0.000503384,-0.000185603,-0.00174748,0.000290934,0.00108837,0.00133938,-0.00051132,0.000754877,0.000793016,0.00038938,0.00188317,-0.00116223,-0.0000088513,0.00114516,0.000143706,-0.000863831,0.000681262,0.00154293,0.00138702,-0.000879461,-0.000411259,0.0000447673,-0.000780941,-0.000501186,0.000759535,-0.00116886,0.000277251,0.000661274,0.00102696,0.000875018,-0.000342364,0.00103228,-0.00149203,-0.00151545,-0.00077095,0.000759125,-0.000907411,-0.00107804,0.000142562,-0.000869663,-0.0000866122,0.0000535565,-0.00146972,-0.000611629,-0.000242692,0.0016932,0.0000311867,-0.000196704,0.00134623,0.00136787,-0.000531715,0.00088381,0.00118659,0.000659974,-0.000390482,-0.00186198,0.000550919,-0.000343443,0.000285486,-0.000523525,0.0000847295,0.000652893,0.000873445,-0.000381007,-0.000405031,-0.000334961,-0.000518612,-0.000791265,0.000367843,-0.000920293,0.00103887,-0.000623237,-0.00000153508,-0.000722547,0.0000450692,-0.000562192,-0.00039981,0.00126477,0.000572612,0.000198508,0.000507957,0.00125025,-0.00081755,-0.000315928,0.00117797,-0.000821866,-0.00154608,-0.000538265,0.000615598,-0.000701319,0.000235318,-0.0000890969,0.000612536,0.00188433,0.000906803,-0.000232324,0.000678499,-0.000560464,-0.000811561,-0.000244796,0.0000450838,0.0000554395,-0.00128625,-0.000395521,-0.000178446,-0.00176507,0.000167214,-0.000540542,0.0000017267,-0.0000194597,0.000678254,0.000360677,-0.00147694,-0.000170295,-0.000485705,-0.00029152,-0.00101391,0.000914771,0.000556508,0.000495344,0.000755772,0.000293975,0.0000846592,-0.000791094,0.000912108,0.000128295,0.000686757,0.000664552,0.00100269,0.000247264,0.000337093,-0.000622079,-0.00111949,0.0000409416,-0.000288874,0.00144234,0.00118833,0.000203059,0.00130298,0.000369728,0.00107538,-0.000974176,0.00007335,0.000578402,0.0000608163,0.000464541,-0.000252563,-0.000662611,0.00185568,0.00144804,-0.000522317,-0.000110546,-0.000120759,0.000861334,-0.000551025,0.00166684,-0.00024493,-0.000651698,0.0000420927,0.000446707,0.000191519,-0.00115705,-0.000638094,-0.00069593,-0.000598785,0.000869849,-0.000984113,-0.00152418,0.000374408,0.000176019,-0.00057696,-0.0000243188,0.00182544,0.00143953,-0.000272846,0.00109521,0.00172882,-0.000253392,-0.000168765,0.00156377,-0.0000541966,0.000121441,-0.000541529,0.0000524351,-0.00091427,-0.000787387,0.00113648,-0.000660556,0.00115876,0.000190378,0.00102969,-0.00103456,0.00100777,0.000234154,-0.00192555,0.000208918,0.000117679,0.000260582,-0.000745721,0.000569639,-0.00131701,-0.00142216,-0.0000255826,0.0017629,-0.000112467,-0.00111201,-0.000924796,0.000101151,-0.000709977,0.00100254,-0.0000395416,-0.000494176,-0.000345199,-0.00032136,0.00024929,-0.000753443,0.000967307,-0.000255709,-0.000594642,0.00119936,-0.000879841,-0.000616853,0.00163589,0.000255291,-0.00119471,-0.00112394,0.0012919,0.000390657,-0.00191921,-0.000196437,0.0000748251,0.000457262,-0.00148747,-0.00116355,-0.000296129,-0.000168411,0.00180956,0.000495974,-0.000459665,0.000936484,-0.000383904,0.000926829,-0.000318577,-0.00131904,0.000738769,0.00111507,0.000297428,0.000766476,0.000965673,0.00107339,-0.00114807,-0.00173787,0.000367508,0.00196647,-0.000143751,0.0000830818,0.00113065,0.000880991,0.000481852,-0.000636687,0.000336136,0.00122948,-0.000203802,0.000653794,0.000970766,0.00010464,0.000762337,0.00183129,-0.000276013,-0.000849064,-0.000644003,-0.000790042,0.000925678,0.000680163,0.000668918,-0.000978907,0.00143763,0.000537852,0.000118587,-0.000134841,0.00064436,0.000322637,0.00126127,-0.0015787,-0.000461035,0.000226539,0.0000547674,-0.000005894,0.000219764,-0.00137298,-0.000441425,-0.00000408452,0.00130139,0.00151111,-0.000180862,0.00114,-0.000724786,-0.00122803,-0.0014716,0.000358832,0.000405526,0.00135358,0.00135962,-0.000756374,0.00114643,-0.00107208,0.00147384,0.00121282,-0.000104584,-0.00109181,0.000952179,-0.0014418,0.0000624404,-0.00108967,-0.000495738,-0.000961299,-0.000244843,0.00107937,0.00062726,-0.000342883,0.000727778,-0.000630631,-0.000103012,-0.000483134,-0.000890047,-0.00147733,0.00128251,0.00180243,0.00161712,-0.000226807,0.0000624434,0.00104179,0.000255871,0.000881469,0.000604033,0.000537127,-0.0000476207,-0.00119754,-0.000114547,0.000848105,-0.00136046,-0.000486056,-0.00071415,-0.000784648,0.000503367,0.000965134,0.000190814,0.000615458,-0.000241873,0.00126023,0.00111923,-0.000290162,-0.000103851,-0.0000696956,0.0000213832,0.000955473,-0.00066167,-0.000271184,0.00186231,0.000998063,0.000667784,-0.00108199,-0.00179653,0.000601849,0.00122741,0.000244986,0.00146419,-0.000242242,0.0000292378,0.0000334308,-0.000470347,-0.000858839,0.00108666,0.00100506,0.000242711,0.000425972,0.000517212,0.000311854,0.00165391,0.000521527,0.00111695,0.000931106,-0.000365468,-0.00138383,0.000873506,0.000568182,-0.0000239143,-0.000248037,0.0010131,0.000313327,0.000899656,-0.00030322,-0.00167446,0.000276722,0.00107089,0.00140186,-0.0012862,-0.0000189285,-0.00031829,-0.000935643,0.000102136,0.000338502,-0.000895558,-0.00164155,0.000176572,-0.00121125,0.000361326,0.000016852,-0.00029682,-0.000218278,-0.00022275,-0.00170332,-0.000730914,-0.000330375,0.00175967,-0.000120961,-0.000143855,0.00170794,-0.000498437,-0.00079655,0.000549451,-0.000081404,-0.000876809,0.000148027,0.000746375,0.00024022,-0.00021608,-0.000303593,0.000346064,0.00133548,-0.000363328,0.0000259907,0.00148619,-0.000991273,0.000862335,0.000103344,0.000305181,0.000897507,-0.00192311,0.000897707,0.000632465,-0.000589009,-0.000964709,0.00169552,-0.00111999,-0.00129679,-0.00110556,-0.00067698,0.000615718,0.000273684,0.0000955932,-0.000830966,0.000240884,0.0000677611,0.000525235,-0.00101711,0.000286534,-0.00088005,-0.0000137055,0.00108433,0.000870091,0.00125294,-0.000066723,0.000991336,-0.000488487,-0.00075521,-0.00185927,-0.00120099,0.00076999,0.00023536,-0.00101623,0.0000945972,-0.000178714,0.000254422,-0.0000148497,-0.00107731,-0.00023268,0.000345289,-0.000373825,-0.000616874,-0.000323743,0.00114369,0.000299626,0.000186171,-0.00121497,-0.000498846,-0.0010126,0.0015689,-0.00098196,-0.00148839,-0.00138602,0.001576,-0.00115578,0.000328228,0.000301959,0.000522182,0.000901873,-0.000460058,-0.000643693,0.00115875,0.000743834,0.00015068,-0.0000456636,0.000929144,0.000443941,-0.0013795,0.000611007,-0.0000838385,0.00105139,-0.000625378,0.000259354,-0.000254148,0.00102374,0.0011431,0.000395523,-0.000596181,-0.000215528,-0.000572007,-0.000637189,-0.00128862,0.000324635,0.00114712,0.000260904,0.000834326,0.00182398,-0.000711082,-0.000903719,0.000338929,-0.000689924,-0.000134082,0.000373292,0.00113303,0.00189005,0.00130374,-0.000206447,-0.0000610911,-0.00106942,0.00096493,-0.00106811,0.000392231,0.00119025,-0.000721541,-0.000809569,-0.000691065,-0.000557517,0.00091518,-0.000770293,-0.000855703,-0.000121695,0.000697188,0.00191696,-0.00116178,-0.000457892,-0.000350486,0.000449136,0.000211769,-0.000299392,-0.00143432,-0.000971804,-0.000648821,0.00199751,0.000557734,0.00196874,0.000470376,0.000869937,-0.000698217,0.00069113,-0.0000333096,0.00132709,-0.00140646,-0.00128722,0.000960672,0.00058554,-0.00121345,-0.00178515,0.0000196595,-0.00037071,0.00046376,-0.0000190136,0.00034535,-0.000956661,-0.000608078,-0.00130444,0.000060638,0.00119785,-0.000431143,0.000061624,0.000694349,0.000493107,0.000426439,-0.000622909,-0.0000304096,0.000246132,-0.000794828,0.0000779659,0.000786794,-0.000443143,0.000823385,0.000722676,0.000269036,-0.000210572,0.00110971,0.000723783,-0.000087979,0.000886386,0.00122923,0.000592873,0.00120653,0.0010292,-0.000337389,-0.00104982,0.00127845,-0.00104385,0.000777597,0.000670562,0.00132625,0.000366397,0.000952003,-0.00000314737,-0.00138668,0.000426276,-0.0000343264,0.000392976,-0.000383289,0.00124015,0.000470916,0.000942403,-0.000271157,-0.000431094,0.000364063,0.00029742,-0.000913716,-0.000083278,-0.000338319,-0.000132543,-0.000267758,0.000278742,0.000435904,-0.000930952,0.00105696,-0.00168741,-0.0013281,-0.000421362,0.00186472,-0.00139585,0.000311926,-0.000556584,-0.000478919,-0.000789261,0.000651271,0.00198651,0.00027966,0.0000981495,-0.000236913,-0.00127704,-0.000231704,0.000648638,-0.000865234,0.00105564,0.000132066,-0.000912275,-0.000931073,0.00109764,-0.000844499,0.00120654,0.000549069,0.000434101,-0.000343426,0.00161994,-0.000202058,-0.00110667,-0.000419687,-0.000381327,-0.000610248,0.000575572,0.000751442,0.00135313,-0.000624334,-0.000575681,0.00187652,-0.000667462,0.000170774,-0.00080422,0.000433446,0.000989244,-0.00146026,0.00144934,0.000604583,0.0000068381,0.000372868,-0.00103372,0.000321175,-0.00159553,-0.000777476,-0.000168414,-0.0015334,0.000459265,-0.00000675901,0.000137722,0.000423195,0.00124928,0.000231928,-0.000732951,0.000441003,-0.000316554,-0.00122384,0.000701619,0.000643564,-0.000663679,0.00109877,0.000825008,0.00130745,0.00000110506,-0.0000839147,-0.000381594,-0.000710666,-0.000344619,0.0000741054,-0.000288893,0.0000696986,0.000836108,0.0000409478,-0.000495514,0.000929753,-0.00042998,-0.000342708,0.000591305,-0.000263406,-0.00157386,-0.000777151,-0.000872744,0.000411285,-0.000154702,-0.000874666,-0.00151608,-0.0000688035,0.000776713,0.000706674,0.000350919,-0.000186457,0.0000369156,-0.00089862,0.00132961,0.000564711,0.00183406,-0.000442554,0.000553236,-0.00177428,0.00182894,0.000641658,0.00145632,0.00100853,0.0000721857,-0.00126566,0.000512736,-0.000836378,0.0000494874,-0.000880181,-0.000927303,-0.000242543,0.00084681,-0.000745622,-0.000192284,0.00159407,0.0000868943,0.00160404,-0.000862006,-0.000402507,-0.0000899651,-0.00117171,-0.00126918,-0.000677157,-0.0002702,-0.000117368,0.00033959,-0.00125154,0.000443314,-0.00115803,0.000707564,-0.000465475,0.00000600081,-0.0000862343,0.000793267,0.000313713,0.0000744304,0.000188086,-0.000247801,0.000370886,0.000164136,0.000795292,0.000558931,0.0011183,-0.000168975,-0.00182531,0.000324593,0.000321025,0.000214856,0.000398959,0.00109321,-0.000739375,-0.00190575,-0.000750199,-0.00150149,0.0000333961,-0.00105703,-0.0007125,0.000130663,0.000306016,0.000616541,0.0000418467,-0.000264105,-0.000117792,0.00091502,-0.00196167,0.000313839,0.000281687,-0.000316429,0.00122343,-0.00048285,0.000206012,-0.000272195,-0.000223154,-0.000579185,-0.000421018,0.000335535,0.00137137,-0.00143718,-0.00192868,0.000657622,-0.000276434,-0.000521761,0.000627787,0.000993005,0.0011158,-0.00193069,-0.000103554,0.000687881,-0.000266249,-0.000566819,-0.000742501,0.0000713198,0.000719413,-0.0013244,-0.000640556,0.000899182,-0.0000521976,0.000750962,-0.00051409,0.000174547,0.00191977,-0.00117148,0.00126201,-0.000456236,0.000187504,-0.000207831,0.00127054,0.000150461,-0.00102424,0.000149386,-0.000812929,-0.000862891,0.000678325,-0.000416522,-0.0000244023,-0.000730325,0.00081909,0.000083711,-0.00153188,-0.000120959,0.00061061,0.000988209,-0.00133466,-0.000655249,-0.000441425,-0.000885218,-0.000698938,0.00158561,-0.00125216,-0.0000294467,-0.000771484,-0.000695725,0.00167242,0.000519937,0.000419423,0.000507984,0.000683571,-0.00139011,0.000634583,-0.000163526,-0.000225351,0.000520542,0.00108229,-0.000683071,-0.00111724,-0.000483019,0.000703687,-0.000111918,0.0016683,0.000514771,-0.00127508,-0.00101299,-0.00122348,0.00116867,0.000567026,-0.000654297,0.000128168,0.000378161,-0.000876675,-0.00029493,-0.00090934,-0.000167138,0.0000208153,0.000187253,0.000366212,-0.0000564339,-0.000930221,0.00165306,0.000175872,-0.000785034,-0.000274931,0.000312406,0.0000407302,-0.00112726,0.000455866,-0.00149704,-0.000411649,-0.000174475,0.000433699,-0.000794258,0.000193657,-0.000206137,-0.00082913,-0.00102113,0.00127275,-0.000944885,-0.000734692,-0.0000981842,0.00131166,0.000300786,-0.000275682,0.000113887,0.000145588,0.0000104002,0.00111708,-0.000841735,-0.00114268,-0.00115241,-0.0000543831,-0.000253203,-0.00142502,0.000577326,0.000425227,-0.000057235,0.00137721,0.00108223,-0.00000350435,0.000869753,-0.000065457,0.0000477098,-0.000698308,0.00107063,-0.00065953,0.000778053,-0.000912817,0.0000829269,-0.00037031,-0.000483921,0.000389426,0.0000811531,-0.000221166,-0.000159323,-0.000493824,-0.000880705,-0.00105969,0.00135639,0.0012965,0.000787799,-0.000461429,0.00010145,-0.000996877,-0.000461512,-0.00177919,-0.0000913334,-0.000752974,0.000365347,0.000382276,0.00156831,-0.00118653,0.000283216,0.000296331,0.000443071,-0.000553211,0.00114401,-0.00162365,0.000746182,0.000449647,0.000839088,0.000824165,0.000895743,0.00044758,-0.000327168,-0.00052741,0.000204146,0.000760763,-0.000133246,0.00112645,0.000959032,0.000688654,0.000153584,0.0000875539,0.00101862,-0.000393361,-0.000347173,-0.000390588,-0.000770313,0.00137234,0.00169596,-0.000789592,-0.00131369,0.000664559,0.00070259,0.000588972,-0.000394061,0.000407907,-0.000539243,-0.000683243,0.0004912,0.000340859,0.00033163,-0.00136068,-0.00113937,0.000246058,0.00110676,0.00126314,0.00130005,-0.0011353,-0.0000866611,0.0011014,0.000513478,-0.00167885,0.000304941,0.00135161,-0.00130807,-0.000746257,-0.00149225,-0.000450636,-0.00052517,0.000985257,-0.00117529,0.000618306,0.00073486,-0.0014367,0.000882271,-0.000358339,0.0008042,0.000262567,0.000600466,-0.000360483,-0.000807837,-0.00118203,-0.000593154,-0.000231287,-0.000103088,0.000859086,0.000233684,0.000252488,-0.0000560295,0.00135442,0.000514659,0.000476179,-0.000146954,-0.0000674657,-0.000424069,0.00155015,-0.000143232,0.000673651,0.00141985,-0.00147035,0.000921838,0.000515997,-0.000911806,0.000877075,0.00074135,-0.000602494,-0.000576095,-0.000463776,-0.000393155,-0.000680284,-0.000587552,-0.00116837,-0.00116917,0.000269257,-0.00019186,0.000870695,0.000596715,0.0000687357,-0.000314432,0.000539536,-0.00128194,0.000555091,-0.00127846,-0.000583015,-0.000737931,0.00047308,-0.00096626,0.000690935,0.000501313,-0.000536433,0.00118407,-0.000732398,-0.00164891,-0.00193124,0.000520933,0.00175177,-0.000159484,-0.0003403,0.000460469,-0.000833911,-0.0017992,0.0000496041,0.00111534,0.000241429,-0.0000650995,-0.000340643,-0.00050723,0.000129399,-0.0000913402,-0.00191654,-0.00128093,0.00119512,-0.00097093,-0.0000787979,-0.00126541,-0.00133884,0.000363435,0.000944653,0.00102341,0.000496673,-0.0010426,0.00188632,0.000935347,-0.000804225,-0.00129836,-0.000439963,0.00168614,0.00139139,0.00143342,0.000616751,-0.000914584,-0.000576227,-0.000265002,-0.000000486452,-0.00101573,-0.00108388,0.000560685,-0.00100896,-0.000553817,-0.00181512,-0.000806423,0.000901651,0.00076878,-0.00123968,0.000281109,-0.000877509,0.000422955,0.000349919,-0.000280869,-0.000304932,-0.00092393,0.00125494,0.00140616,-0.000403946,-0.00125836,0.00000674142,-0.000525551,0.000763057,-0.00026793,0.000313727,-0.000811759,0.000777078,-0.000141434,-0.000495324,-0.000683889,-0.000100829,-0.000136137,-0.000243263,0.000202032,-0.000597636,-0.000446111,0.00056964,0.0000572923,0.00151663,0.000866366,-0.000349071,0.000292246,0.000517539,0.00170907,0.000645935,0.00162483,-0.00182985,-0.00181097,0.00129354,0.000812805,-0.000142997,0.00116856,-0.000983512,-0.000250785,-0.000467926,-0.00113555,-0.0015496,0.0000574753,-0.000571496,-0.000436351,0.00163014,-0.00151654,0.000107915,-0.000369689,-0.000906486,0.000330364,-0.00112883,0.000281031,-0.000818741,0.0000221662,0.000399357,0.000242894,0.000079047,0.00144971,-0.000536557,0.00149371,-0.000262696,-0.000561282,0.000625042,0.0010762,-0.00112453,0.000336067,0.0000605084,-0.00051437,0.000153327,0.000734754,-0.000246584,-0.000403903,0.000809583,-0.0000199964,-0.00120205,0.0000816381,-0.00144474,-0.000146423,0.00136962,0.00118032,0.00051214,-0.00135263,-0.00111075,-0.000339919,0.000181865,0.000710024,0.00024875,0.00175254,0.00014257,-0.000666146,0.00180726,-0.00156411,-0.000872141,0.00138696,-0.000433438,0.000402402,0.0000459717,0.000645604,-0.000542179,0.000744222,0.000786431,-0.00055494,0.000925309,0.00187267,-0.000815912,0.000998222,-0.00101233,0.00155572,-0.000755121,-0.00149554,-0.000485095,-0.000211984,0.000299225,0.000256191,0.000284085,0.00133022,-0.00111259,-0.00083619,-0.000156655,-0.00178099,0.00105713,-0.00117565,-0.000170494,0.0010276,0.000794545,0.000747615,-0.0000718296,-0.000651606,0.000741617,0.00139197,0.00000265668,-0.000121912,-0.000694228,0.000318215,-0.000614392,0.00108507,0.000843089,0.000344723,0.00130153,-0.00058219,-0.000379332,-0.00119035,-0.000146498,0.000945051,0.000321269,0.00036082,0.000776104,-0.0000688879,0.000220665,0.000870951,-0.000337161,-0.000727216,0.000997172,-0.00151683,0.000577266,0.00113336,-0.00173889,0.00107956,0.0000320297,-0.000383453,-0.000869249,0.000504532,0.000605123,0.000327023,-0.00138745,0.00019313,-0.000772554,0.000760531,-0.000432114,0.00100007,-0.000800059,0.0017612,-0.000356956,0.000335665,-0.00160988,0.000874169,-0.000836229,-0.000100105,-0.000419602,0.000222049,-0.000430242,-0.00130451,-0.000510137,0.00113522,-0.000053265,0.000943448,0.0000146728,-0.000464444,-0.000948991,0.000643471,-0.001264,0.0000484513,-0.000409706,-0.000319517,0.0000526827,0.00142315,0.000633561,0.00042234,0.000662447,0.000254065,0.00130192,-0.000529854,0.0000984869,-0.000592715,0.0000820282,0.00101548,-0.00166687,0.00033583,-0.0016578,0.00103254,-0.000929635,0.000453337,-0.000495479,0.00160935,0.00117475,0.000132539,-0.00033564,-0.000404863,-0.00187145,0.000487569,-0.000698975,-0.0000830163,-0.00067829,0.00108593,0.0000182266,0.00121851,-0.000849038,0.00037922,-0.0000970454,-0.000793915,-0.00190327,0.000769834,0.0013631,0.000557941,0.00113789,0.000858009,0.000204373,-0.000345377,-0.000840806,0.00105442,-0.0000265867,-0.000717894,-0.000814991,0.000416826,-0.000262865,-0.000421538,-0.00161409,-0.000472906,0.000259133,0.000407764,-0.000987238,-0.00079765,-0.000311041,-0.00160877,0.000938293,0.000360734,0.0000848861,-0.000434561,0.000359287,-0.000217871,-0.0000290821,-0.000031535,-0.000515343,-0.000882659,-0.0011449,-0.000132545,-0.000545733,-0.000545807,0.000168992,-0.00082779,-0.000932886,-0.000546122,-0.000436843,0.000143476,-0.000532799,-0.00118009,0.000349846,-0.000311671,-0.000214273,-0.000640242,-0.00161871,0.000648799,0.00105993,0.000408081,0.00135962,-0.00196698,0.000491378,-0.00103324,-0.000253695,-0.00114956,-0.000315739,0.00187954,0.0000122439,0.00192047,-0.00025559,-0.000474972,0.00141619,0.000237998,0.00190546,-0.000111606,0.00128312,-0.000478809,0.000372807,-0.00113183,0.000309624,0.000918538,-0.000409586,-0.0000651856,-0.00148024,0.00113107,-0.000679838,0.000604513,-0.000436723,-0.000614757,-0.000920837,-0.000740829,0.00114656,0.000550562,0.000762987,-0.000758171,0.0000228064,0.000254905,-0.000855723,0.00134446,0.000480246,0.0010276,0.00154403,0.0012522,0.000666075,-0.000282293,0.000204389,-0.000126424,-0.00056348,-0.00107192,0.000483815,-0.000156708,0.00133587,-0.000757119,0.00140696,-0.000544921,-0.00133599,0.000621034,0.000519893,-0.000753066,0.000764523,-0.0000750696,-0.000421075,-0.00132264,-0.000541751,0.00020206,-0.000591986,-0.000418666,0.000399396,0.00103851,0.000346016,-0.000534028,-0.0000937873,0.000531078,-0.00101891,0.00014369,-0.00156254,0.0000116538,0.00138984,0.00102549,0.000773059,-0.0000638003,0.0000703334,-0.000000166741,0.000034642,-0.00199941,-0.00142408,-0.00165869,0.0000387641,0.000493296,0.00125566,-0.000426775,0.00155076,-0.00018834,-0.0000935217,-0.00103418,0.000539052,-0.000283097,-0.000430552,0.00076763,-0.000702797,-0.000220469,-0.000490959,0.0013067,0.00113154,0.00046344,0.00198501,0.000889749,0.000831818,0.0006807,0.000645208,0.000790603,0.000682904,-0.00000268313,-0.0000761801,0.000159211,0.000475464,0.000039434,0.000234755,0.000501222,-0.000575132,0.000675856,0.000342368,-0.000777262,-0.00132596,-0.00090697,0.000498854,0.000579155,-0.000761049,0.00146147,-0.000620366,0.000662744,-0.000101088,0.000580802,0.00000829124,-0.000677143,0.0000271404,-0.00111949,-0.000858558,-0.00117831,-0.00164686,0.00124556,0.00017634,-0.000680846,-0.000282133,-0.000307533,0.00140686,0.00170594,0.00122215,0.000221792,0.00117472,0.000551714,0.00193034,0.00145052,-0.000720192,0.00160849,0.00136419,-0.000936799,-0.000879939,-0.000216344,-0.00104293,-0.000490137,-0.000476491,-0.000778927,-0.000195416,-0.000694591,-0.0000884017,-0.000900201,-0.00184939,-0.000943469,0.000243172,-0.000661642,-0.00159174,-0.000123191,0.00122094,-0.000950301,-0.00145686,0.00198892,0.000604786,-0.000322333,0.000755935,-0.000592615,-0.000467843,0.000243247,-0.00010443,-0.000150785,-0.00075442,-0.00168442,-0.000380452,-0.000661536,-0.0016723,-0.000683963,0.000678278,0.00114009,-0.00101524,-0.00128396,-0.00033022,-0.00048544,0.00199539,0.00143287,-0.000940306,0.000814773,-0.000296784,-0.000624324,-0.000592816,0.00149269,0.000208278,0.00088622,0.00106821,0.00121995,-0.000540703,-0.00136146,-0.0000232232,0.000884565,-0.000537359,-0.000113715,-0.000716918,-0.00139766,0.000284503,-0.000603936,-0.0000875087,-0.000931179,0.000889491,-0.000989575,0.000612818,-0.000578837,-0.00103146,0.00122704,0.00119036,0.00154867,-0.000638468,0.000819874,0.000373149,0.000859291,-0.000195205,-0.00038847,-0.000644156,-0.00175463,-0.000156872,-0.0011055,0.0000489549,0.000518616,0.00079958,0.000528715,-0.000194493,0.00127922,0.000438488,0.00125259,0.000167544,0.000812928,-0.000279586,0.00103724,0.00169295,-0.000480283,0.000325377,-0.0014699,0.000110702,0.000801954,-0.00147755,0.000351965,-0.00022405,-0.000535976,0.00080379,0.000387029,-0.000241334,-0.000151935,-0.000992909,0.00116506,0.000427582,-0.00194368,-0.000187994,-0.000227706,0.00127636,-0.0000269618,0.000463389,-0.00095996,-0.00159688,-0.000932704,-0.00074478,-0.00000302986,-0.00098362,-0.000288439,-0.00118897,-0.000920797,-0.000830767,0.000580172,-0.000681533,-0.000285368,0.000690842,0.00147099,-0.000236187,-0.000608034,0.000811518,0.00122723,-0.0010118,0.000387628,0.0000475218,0.0000855626,0.000851919,0.00094796,0.000854671,0.00000582967,0.000207071,0.000669848,-0.00183346,0.000417847,-0.000993021,0.00102904,-0.00125315,0.00015337,-0.000635852,-0.00148758,-0.000537553,0.000547986,0.000354959,-0.000566855,0.000299206,-0.00171241,-0.00157076,0.000111544,0.000724403,0.000217502,0.0010773,-0.000692834,-0.000904748,-0.000113574,-0.00165173,-0.000680983,0.00173562,-0.000102933,0.00114866,0.00135684,-0.000293787,0.000754996,-0.000684622,0.000732916,-0.0017841,0.00109156,0.0000434911,-0.0000779962,0.00000031229,-0.00138083,-0.00118102,0.000986092,-0.0002378,-0.00098327,0.00030822,0.000103922,0.00114252,0.0002156,-0.000131269,0.000192872,0.000135255,0.000691917,0.000278886,-0.000850284,-0.0000934792,0.00107435,0.0005291,0.0000729766,0.00159138,0.00104475,0.000164289,-0.0000740981,-0.000296505,-0.00110235,0.00135394,0.000482867,0.000116612,0.0014453,0.00157938,0.000723799,0.000248019,0.0000273,0.00185595,0.000624545,0.00115418,0.000400525,-0.000429199,0.0000138758,-0.000177167,-0.000157554,0.00107241,-0.000526066,0.00000422087,-0.000541383,-0.000457822,-0.00000594777,-0.000165932,-0.000720823,-0.000383427,0.000968809,0.000655332,-0.0000254834,0.000455945,-0.000573488,0.000849367,0.00151962,-0.000587299,-0.00106924,0.0000282854,0.000531694,-0.000888246,-0.000272938,0.00128041,-0.000548892,0.000517245,0.000711643,-0.000245408,-0.00154077,0.00127747,0.00118989,-0.00158092,-0.000321,-0.0000875083,0.0000575909,0.00081356,0.00158814,-0.00121969,-0.0000518965,0.000738919,0.00136533,-0.000964985,0.000916111,0.000493048,0.000439784,0.00159546,-0.00183975,0.000764811,0.000285472,0.000378847,0.00144249,-0.000335702,-0.00191447,0.000414939,-0.000136902,-0.00121058,0.00101474,-0.00182338,0.0000450955,0.00058093,-0.00103711,-0.00087692,-0.000217778,0.000303639,-0.000116624,0.000515151,-0.000790842,-0.000540929,-0.000062131,-0.00118088,-0.00104326,-0.000588625,-0.00117762,0.0013397,-0.00120383,0.000844672,-0.000126357,-0.000910398,0.00123974,0.00106891,-0.00123015,-0.00105538,0.00112933,-0.000342266,-0.00198694,-0.000250145,0.000507466,0.000172971,-0.00040521,0.00106074,0.000625319,0.000466767,0.00072548,0.000940908,-0.000952126,-0.00109123,-0.000862857,0.00103309,-0.00138119,0.000415798,0.000978506,-0.000277359,0.00164874,-0.00098917,0.000355697,0.000974219,-0.000609874,-0.000223358,-0.00155864,-0.00114575,-0.000712115,-0.000446506,0.000416922,0.000539135,0.00119932,0.000237298,0.00115946,-0.000468763,-0.000640042,0.00109177,-0.000632024,-0.000321564,-0.0012282,-0.000384623,0.000291314,-0.000520562,0.000704841,0.000521288,-0.00161944,-0.000191448,0.000758967,0.000030883,0.000320336,0.00049016,-0.000708725,0.000319612,-0.000938326,-0.00192076,0.000775404,0.000431893,0.000925309,0.00024005,-0.000210446,-0.00113459,0.000679675,-0.000554332,-0.000718949,-0.000109164,0.000104395,0.000118359,-0.000168659,0.000131147,0.00035699,0.000888364,0.000256244,0.00106819,-0.000887978,0.000268564,-0.00165157,0.000496613,0.00105009,-0.00100316,-0.000351029,0.00150707,0.000995645,-0.00113442,0.000722291,-0.000744639,0.000692883,0.00123167,-0.000412259,0.000706072,0.000517644,0.00130293,-0.000731392,-0.000843428,0.000571493,0.000304728,-0.000193462,-0.000369125,0.000216401,0.00124855,0.000874549,0.000163469,-0.0000179583,0.0002783,0.000886777,-0.00049349,-0.00125282,0.000012501,0.000958499,-0.000176652,-0.00066568,0.00141218,0.000364301,0.000478116,-0.00193075,-0.000096094,-0.00129522,0.000755155,-0.0000907631,-0.000940004,0.000746618,0.0014504,0.000434573,-0.000192895,-0.00126655,0.00107346,0.000861768,-0.000387103,0.0000569272,-0.000543294,-0.000903652,0.000447329,-0.00104014,0.00151007,0.000370592,0.000379279,0.00125836,-0.000693096,-0.000618509,-0.000911872,-0.00104272,-0.000185565,-0.000191543,-0.00114738,0.00107306,0.00140211,0.000904241,-0.0017706,0.00040275,-0.000765767,0.00113248,-0.00120524,-0.000259222,-0.00175238,0.00151294,-0.0000686303,-0.0010187,0.00081583,0.00131541,-0.00017406,-0.000512428,0.000474652,-0.000618996,-0.000665986,-0.00152494,-0.00118311,0.000737858,-0.0000614078,0.000490969,-0.000739295,0.000323549,-0.000158341,-0.000501071,-0.000259018,-0.00120974,0.000738965,0.000491099,0.0019123,0.000943138,0.0000682114,0.00199926,0.000179392,-0.000100576,-0.000859386,0.00103486,0.000583024,-0.00156459,0.00185488,0.000745384,0.000163991,-0.00118952,-0.000297083,-0.00148425,-0.000830862,-0.00133788,-0.000312622,-0.000977313,-0.000794373,-0.000497391,0.000293197,-0.000949475,0.00134484,0.000197068,-0.00141236,0.00026258,-0.0000754768,0.00123519,0.00136457,0.000483114,0.000420811,-0.000272509,-0.00108694,-0.0013688,-0.000679005,-0.000297881,-0.00042778,0.00071646,0.000349572,-0.00109942,-0.000247871,0.000609186,-0.000401935,-0.000791724,0.000863575,0.000708433,0.00135194,-0.00188284,0.000974936,0.00122636,0.000397093,-0.000931295,0.00139394,-0.001858,-0.00198549,0.000332466,0.000673131,0.0014809,0.000162176,0.000502924,0.000391471,-0.00110219,-0.0000616457,0.00021257,0.00199582,0.000604555,0.00056743,0.00120476,-0.00112049,0.000567602,0.000477213,0.000914017,-0.000913073,0.000000481442,-0.000817725,0.000385828,-0.000634129,0.000812107,0.000391131,-0.000981396,-0.000487205,-0.000216513,-0.00157562,-0.000576556,0.000766507,-0.00113491,0.000845853,-0.000860142,0.0000733885,-0.000781568,-0.0000367514,0.00153622,-0.000754393,-0.000764828,0.00030126,-0.00145686,-0.00178948,0.000213479,-0.000702133,-0.001118,-0.0000545326,-0.000535247,0.0000652696,-0.000443331,0.0000258152,0.0000508137,-0.000549534,-0.00133857,-0.000271374,-0.00105,-0.00051812,0.0000545408,0.00141159,0.000283232,-0.000783393,-0.000783657,-0.000731451,-0.000188178,-0.000753436,0.000546294,0.000581596,-0.000110088,0.00157107,0.00127525,0.0000938977,0.00173095,0.00106426,-0.00085288,-0.00122956,-0.000749563,-0.00107897,0.000217213,0.000550261,0.0000319412,0.000208003,-0.0013114,-0.00041432,-0.000917068,0.000352973,-0.000691498,-0.000254599,0.000812202,-0.000144353,-0.000214462,-0.00111723,0.0000775759,0.000992469,-0.00186311,0.0000089056,-0.00000848564,-0.000590214,-0.00105389,0.000867537,-0.000959555,0.000115472,-0.000724623,0.0000392406,0.00111087,0.00089502,-0.00019173,-0.00132584,-0.000887208,-0.00077592,-0.0000232259,0.000967609,-0.000492094,-0.00112441,0.00114973,-0.000265645,0.000603884,0.000440417,-0.00109247,-0.000989534,0.000194172,-0.000349068,-0.00000369431,-0.00113161,-0.000817056,-0.000387766,0.00121768,0.00169644,-0.000213952,-0.000773263,0.00105189,0.000211905,-0.00045609,-0.00137606,0.00110383,-0.000907926,-0.000823886,-0.00139734,-0.00118454,-0.00153718,-0.000259576,-0.000328502,0.000114985,-0.000447108,-0.000100285,0.00183567,0.00149599,0.00196918,-0.000831161,-0.000458926,0.00002389,0.00030515,0.00130439,0.000744037,0.00136699,-0.000614535,-0.000555489,0.00019735,-0.00158887,0.000539902,-0.000278459,-0.000740248,0.00124896,-0.000615011,-0.000410201,0.0000804943,0.00111384,-0.000701205,0.000244095,0.00122047,-0.00169643,0.000941794,-0.000538341,0.000353965,0.00135562,-0.0010069,0.00014633,0.00108758,-0.00101959,-0.000130869,-0.000670555,-0.00115167,-0.00107776,-0.00050982,0.0000384694,0.000396646,0.00130468,-0.0000173611,0.00149785,0.00182259,0.00104619,0.00192678,0.00162885,-0.0011868,-0.000487746,-0.0000491593,-0.00150467,0.000986142,-0.000691443,-0.00192846,-0.0000403703,0.0000306671,-0.00112065,0.000134846,0.00190624,0.000194683,-0.000617274,0.000168141,-0.00058843,0.0000716468,-0.000877344,-0.00100912,0.0000989853,-0.0005248,-0.00000962224,0.000403647,-0.000437993,-0.00142841,-0.00122418,0.000236815,-0.000660468,-0.00135147,-0.00119608,-0.000622839,0.000990055,0.0002452,-0.000684948,0.00130681,0.000720611,-0.000587418,0.000841329,-0.00131953,0.000203955,-0.000749387,-0.00130903,0.00100251,0.000629768,0.0007757,0.000911233,-0.000664211,0.00155628,0.0000344208,-0.000546923,0.000185722,-0.000618294,0.00010645,-0.00104918,0.000918082,-0.000550081,-0.000109924,0.00030147,-0.00085997,0.000796782,0.000640404,-0.000170127,0.000687903,-0.000010356,-0.000271534,0.000462421,-0.000137921,0.00110677,0.00119226,0.00151829,-0.00100114,0.00113878,-0.000381626,-0.000369073,-0.000926563,0.000730334,-0.000878221,-0.000654622,-0.000972588,0.00158443,0.0010087,0.000202129,-0.00119317,-0.000339189,-0.00140978,0.000870101,0.000565321,0.000236308,-0.000369793,0.000618335,-0.0016856,0.000228321,0.000428017,-0.000391736,-0.000148529,0.000497411,-0.0013521,0.00102461,0.00142752,-0.000348895,0.000823911,-0.000379496,0.000494028,0.000701222,-0.0000768327,-0.0000602204,-0.000571797,0.000332081,0.000958598,0.000507021,-0.000280098,0.000494772,0.000466925,0.00000833247,-0.000206974,0.000734839,0.000228462,-0.000366055,0.00166054,-0.00185388,0.000821944,0.000597682,0.00192754,0.0000643373,0.000988378,0.000529836,0.000220358,-0.0004106,-0.00112921,0.00180713,-0.000583319,-0.0010844,-0.000725509,-0.000239748,0.000764237,-0.000856576,0.00112597,0.00136265,-0.0000486175,0.000865774,0.0011508,0.000628556,-0.000736296,0.00139189,-0.0000348149,-0.000228857,0.00104866,0.000422164,0.000482041,-0.000386005,0.00130734,-0.00114122,0.000818657,-0.000682293,-0.00165585,0.000168988,-0.00100603,-0.000390315,0.00035621,-0.000746814,0.000874956,0.00082329,-0.000732103,-0.0012765,0.000170202,0.000234071,-0.00125018,-0.00021033,0.000602306,0.00105645,0.00117242,-0.000715862,0.000506445,0.000667936,0.00163324,-0.000495394,-0.0000588172,0.000245321,0.00108318,-0.000467376,-0.000425171,-0.000405259,0.00183639,-0.000645681,0.000950988,0.00112182,-0.000284214,0.000365426,-0.00170257,0.000797751,0.000329362,-0.000498105,-0.000192522,-0.000274392,0.000477818,-0.000328843,-0.000272434,0.000976992,-0.000401891,0.00129172,-0.000905999,0.000000486714,-0.000486968,-0.000714139,-0.000163741,-0.000114943,0.0001474,0.000857158,0.000804768,0.000228259,-0.000342321,0.000155346,-0.000204557,0.0000764565,-0.000925872,-0.00115839,-0.000536291,-0.0000315923,0.00000476578,-0.000553405,-0.000630925,0.00072392,0.000881984,0.0000577304,0.000472407,-0.000785996,-0.00149602,-0.00159549,-0.000217044,-0.000555884,-0.00017296,0.000134793,-0.00156664,-0.000314043,-0.000546115,-0.000486212,0.000149849,0.00195225,-0.00100081,0.00109454,-0.000953081,0.0000143782,-0.0000245176,0.0000713503,0.00168033,-0.000371461,-0.00145549,0.000566486,-0.000310272,0.000950225,-0.00069271,-0.00128016,-0.000316526,0.0012321,-0.00101486,0.00185329,0.000216121,-0.000585889,0.000839271,0.000783589,-0.000916145,-0.0000927936,0.000808215,-0.00088799,-0.000547573,0.000385028,0.000571582,-0.00118875,-0.00148061,-0.0006401,-0.0003353,-0.00157044,0.000308628,0.00179458,-0.00132619,0.00119213,-0.00120072,-0.0000234313,0.0000967715,-0.000979045,-0.000118768,0.00051811,0.0009594,-0.000193351,0.000674965,0.000280524,-0.000407514,0.000832279,0.00120482,0.000387469,0.00145452,0.000204701,-0.000976541,-0.00139832,0.00102626,0.00032785,0.000736223,0.000574233,0.000486636,0.000814405,-0.00132685,0.00109103,-0.000797192,-0.00185581,0.000328563,-0.000600984,0.00131572,0.00119505,-0.000221552,-0.00114855,0.00168587,0.000890979,-0.000925666,-0.000372589,0.000873452,0.00157534,-0.0000126937,0.00142741,-0.00090729,0.00137848,0.000648355,-0.000165559,0.00188544,0.0000654763,0.000890556,-0.00000656571,-0.00167092,-0.0000246936,-0.00100266,0.00115625,-0.00000649762,-0.000847742,0.00107207,-0.000361488,0.00129242,-0.00188994,-0.000735987,-0.00059169,-0.000808286,-0.00144986,0.000713267,-0.000144515,0.00141085,-0.000383666,-0.000283957,0.000624879,-0.000756157,0.0000101961,-0.00106754,0.000929989,0.00119766,-0.00108684,0.0000897493,0.000559005,0.00182188,0.000060007,-0.000641049,-0.000402638,-0.00183475,0.000857921,-0.000428003,0.0013863,-0.000118459,-0.00134984,0.0000374013,0.0011114,-0.000156416,0.000595224,0.000401404,0.000479444,0.000623424,0.0000187392,0.000774962,-0.000509175,0.000181132,0.000660327,0.001599,-0.00130565,0.00103223,0.0012209,0.000300731,0.000248057,-0.000612279,0.000765314,0.000482533,0.00019808,0.000927754,-0.000816642,0.000235269,-0.000484221,-0.0015921,0.000166092,0.000251901,0.000682317,-0.0000267257,-0.00101994,0.00110694,0.00112415,0.0012788,-0.00124792,0.000096597,0.00156173,-0.000213157,0.0000341458,-0.000183434,0.000992257,-0.00015566,-0.00109288,0.000186544,0.00129804,0.000376946,0.00174772,0.00105158,-0.000482402,-0.000273853,-0.000147798,-0.000673506,-0.000943254,0.000540491,0.000944589,-0.000273146,0.000536889,-0.00043933,0.00134555,0.0017843,0.000409524,0.00023399,-0.000459484,-0.000249075,-0.000227756,0.00190367,-0.000725541,-0.000812389,-0.000232477,-0.000648041,0.000184844,-0.000242002,-0.000777085,0.000849926,-0.0000933877,0.0000989039,-0.000923806,-0.000211131,-0.0000181111,0.000968715,0.000851814,0.000870734,0.000587656,0.000709896,0.0000334443,0.00105256,-0.00158234,-0.000630738,0.0001051,0.00122467,0.00161342,0.00111426,0.000152418,0.000298442,0.0000641715,-0.000799874,0.0010949,-0.000819293,0.00199588,0.000964092,0.0000952061,0.00110163,0.00100187,0.00141776,0.00063971,0.000560005,0.000914803,-0.00135088,-0.000394063,-0.000765072,-0.000444134,0.000570051,-0.000548524,0.0000968381,0.00164759,-0.000834781,0.000233029,0.000652802,0.000042032,0.000164885,-0.000477911,-0.000953111,-0.000926082,-0.000545903,-0.000663107,-0.0000355752,0.00134062,0.00126542,-0.000438444,-0.000164421,0.000540362,0.000107185,-0.00095855,-0.00105295,0.000457647,0.000591506,0.000142602,-0.00144688,-0.00058604,-0.000333275,-0.000475472,-0.000973241,0.000149734,-0.000277033,-0.000978478,-0.00172465,0.000891883,-0.00158245,0.00193902,-0.00144716,0.000326626,-0.00107654,0.000733701,-0.000231389,-0.00188522,-0.00123907,0.000184733,0.00036936,0.000315193,-0.00000404445,0.000333032,0.000958061,0.000959381,-0.000923731,-0.00129501,0.000145731,0.000808937,-0.000208473,0.00147664,-0.000108368,-0.000457499,-0.000163517,-0.000329899,-0.0000345054,0.000463095,0.000601253,0.000970202,0.00102179,-0.000441895,-0.000225443,0.000162211,0.000982766,-0.000113036,-0.000111356,-0.00174751,0.000700303,-0.0000717643,-0.000699527,-0.00132894,0.00166351,-0.000755138,-0.00141641,0.00133104,0.000817178,0.00080697,-0.000224505,-0.000752243,-0.000184859,0.000964434,0.000882999,0.000430386,-0.00108925,0.000654492,-0.000344563,0.000220787,0.000433912,0.000388254,0.00182833,-0.00090888,-0.000900596,0.00142224,0.000329076,0.00110824,0.00174397,0.00111203,-0.000668839,-0.000460152,-0.00117353,-0.000112606,0.000229593,-0.0000254277,0.000756871,0.00143581,-0.000282758,0.000900489,0.00118234,-0.00104258,0.000287386,-0.00064898,-0.000409349,0.000453879,-0.00103723,-0.000485395,-0.000632474,0.00109743,-0.000047049,-0.0011441,0.000260675,-0.00111553,0.00117252,0.00110248,0.000214002,-0.000430743,0.000616612,0.000238075,0.00135482,-0.00057152,0.000164795,0.000409103,0.00067594,0.0000924761,-0.00044889,0.00033905,0.000711886,-0.000184377,0.00047351,-0.00046466,-0.000927411,-0.000253665,0.000892022,0.000438304,0.000467859,0.000831161,-0.00186465,-0.000690785,-0.00125792,-0.000973491,-0.00141109,-0.000650413,-0.000152668,0.000986432,0.000830119,0.00150662,-0.000208718,-0.00149497,0.000351778,0.00157859,-0.000890799,0.000661367,0.0010007,0.000275509,0.00130994,0.00103295,-0.000121317,0.000571964,-0.000711905,-0.000694902,-0.00163583,0.000335394,0.000806703,-0.00099405,0.00088228,0.000289298,0.000443015,0.00132445,-0.00123786,0.000749227,-0.00141357,-0.000109452,0.000140573,0.000479996,0.000255998,0.000666653,-0.000460261,-0.000241451,-0.00153775,-0.000788802,0.00160898,-0.00105686,0.000169743,0.000925577,0.000427857,0.00115021,0.00123446,0.000123439,0.000630713,0.00121308,0.00115967,-0.000069536,0.000861808,-0.000593418,-0.0009532,0.00087519,0.000247402,0.000309404,-0.000421186,-0.00123311,0.0000902793,0.0000628727,0.000822032,0.00192692,-0.000886292,0.000972055,-0.000978942,0.000497315,0.00131519,0.000117119,0.00104716,0.000544873,-0.0000133248,0.000210401,0.000178643,0.000696124,-0.000111012,-0.00140738,0.000718294,0.000482854,-0.0000226135,-0.00101148,0.00194419,-0.00067397,-0.000566034,-0.000715631,0.000576041,-0.000175695,-0.00137365,0.000850381,-0.000690868,-0.000908299,-0.000330731,-0.00103916,-0.0000478281,0.000855403,0.000956913,0.000180862,0.00118424,-0.00090617,0.00102693,0.000991666,0.000700725,-0.00085196,-0.0000349259,-0.00117893,-0.000610529,0.000860852,0.000312366,0.000111179,0.000096613,-0.000236132,0.000968169,0.000494817,-0.000208363,0.000448645,0.00197104,-0.000971883,-0.000120108,0.00168404,0.0000381094,-0.00008737,-0.000132408,0.00159107,-0.00114973,0.000142276,0.000638935,-0.000168067,-0.000162717,0.000582904,0.000477963,0.0000626343,0.000695014,-0.00126819,-0.000490566,-0.00120853,0.000420469,0.000350612,0.000595001,0.000570116,0.000771335,-0.00147544,-0.000837711,0.00000705841,0.000127918,0.00114357,-0.000469954,0.00160747,0.000459359,0.000441016,-0.000461188,0.00191124,0.000896134,0.00071513,-0.000560078,-0.00015981,-0.000673816,0.000424602,0.000269001,0.0000615073,0.00144401,0.0000626085,-0.00136272,-0.000043549,-0.0006519,-0.000588946,-0.0014112,-0.0000978921,0.0000671882,-0.000108253,-0.000503178,-0.0000615739,0.00123006,0.000917102,-0.000816901,-0.000437609,0.000843393,0.000305228,0.00116988,-0.00145933,-0.00117408,0.000165525,-0.000588718,-0.000938124,-0.000804293,0.00176082,0.000176532,0.000650561,0.0000509292,-0.00193361,-0.00103302,-0.000566773,-0.000079,-0.0000666497,0.00139977,0.000836197,-0.000647227,0.000393367,-0.000866452,-0.000708535,-0.00136864,0.001302,0.00113908,0.000234217,0.000690459,-0.000380222,-0.00117651,0.000769677,-0.000474727,0.00128532,0.00142281,0.00106876,0.000290869,-0.00052885,0.00122332,0.000878944,-0.000603624,-0.00086881,0.00105249,0.000887443,-0.000606993,-0.00134856,0.00163713,-0.000517859,-0.000817725,-0.000880878,-0.000521244,0.000666852,-0.0000108971,0.000511673,-0.00024367,-0.00031606,0.0000971916,-0.00040303,0.000795496,0.00193618,-0.0000739557,0.000215112,-0.000971561,-0.000231245,0.000504865,-0.000427372,0.000728979,0.00123077,-0.0000782154,-0.00021181,0.000318787,0.000331067,-0.000863936,0.00110738,-0.000313808,0.0000375186,-0.000184127,0.000771297,0.000518464,-0.0019122,0.000276734,-0.000150561,0.0000752487,-0.00102426,-0.000142256,0.000212747,0.0000940332,-0.000416093,-0.000232232,-0.000394907,-0.000680678,0.00115622,0.000471285,-0.000490097,0.000210202,0.000592958,0.0000477915,-0.000869701,0.000973264,0.0000258431,0.000476944,0.000741596,0.000531835,-0.000250705,0.000272045,0.000766925,0.000355352,-0.00173022,0.0000252007,0.000414227,-0.000589665,-0.00113658,0.000301252,-0.00007908,-0.001222,0.00187502,0.000536821,0.00000575232,0.00047537,0.000200574,-0.000328857,-0.000511719,0.000532748,-0.000901649,-0.000667508,0.000642343,0.00120331,0.000428535,0.000350168,-0.00151507,-0.00174652,0.000988499,-0.000367248,-0.000918636,0.000821497,0.000743938,0.000635271,-0.000348084,0.000416283,0.0010944,-0.00000749459,0.000428621,-0.000387579,0.000570812,-0.00164485,0.0000944111,-0.000196155,-0.00128018,-0.0000103509,0.000550792,-0.00111001,0.00108265,-0.000887818,-0.00157784,-0.00115226,-0.000147826,-0.0000193328,-0.000139536,-0.00140555,-0.00109001,0.00116029,0.000564484,0.00113889,-0.000808234,0.00119157,-0.000789982,0.00013455,-0.00127644,0.000528068,0.00119168,-0.000645098,0.000216655,-0.000449617,0.000097325,-0.0010525,0.000391593,-0.00141362,-0.000369861,-0.000724072,-0.00081459,-0.000709582,0.000226755,0.00181002,-0.00114434,-0.0000435357,-0.00119956,0.000629266,-0.000986454,-0.00111292,-0.00108146,0.000424741,0.000102824,0.00168199,-0.00106801,-0.00119969,-0.000463734,-0.0000207407,-0.000165196,0.000062013,0.0010484,-0.00167064,0.00108079,0.000962932,0.000938564,0.000732561,0.00114453,0.0000658357,0.000818814,-0.000212905,-0.0012706,0.000109311,0.0000608044,0.000524508,0.00129179,-0.000444147,-0.0000980393,-0.00139217,0.00072626,0.000396101,-0.000386155,0.000705838,0.000925478,-0.00105174,0.0000528,0.000548307,0.000538486,-0.000503852,0.000797318,-0.00162772,-0.00119801,-0.000234154,-0.000259543,-0.000381262,-0.00123938,0.0000673405,-0.000929838,0.0000915427,0.000767182,-0.000495405,-0.00151471,0.00160308,0.000568784,-0.000255255,-0.00164459,0.000985487,-0.00035249,-0.000860874,-0.00110065,-0.000210316,-0.000326402,-0.00122094,-0.000659826,-0.000283804,-0.0000942566,-0.000567928,0.0014251,0.000630895,-0.000588082,0.00152302,-0.000530603,-0.000785592,-0.0000937984,-0.00126289,0.000601951,0.0008184,0.000227062,0.0000370091,-0.000456358,-0.00158329,-0.000788197,-0.0010384,0.00129582,-0.000793838,0.000125808,0.000290204,-0.00158599,-0.001697,0.000525435,0.000239766,0.00116005,-0.000155782,0.00170944,-0.000506994,-0.000281055,-0.000438239,-0.000808782,0.00129538,0.000829414,-0.00177507,-0.0000256263,0.000419748,-0.000392169,0.00130959,0.000692331,0.000601704,-0.000294103,-0.00129256,-0.00084022,0.000805316,0.000598235,-0.000667262,-0.0000231306,-0.000502845,0.000625791,0.000270519,-0.00125675,-0.00197584,0.00165211,0.000700811,-0.00138827,-0.000297958,-0.00129471,-0.00127159,0.000360936,-0.00178218,-0.000641788,-0.00120583,0.00123658,-0.000908994,-0.000850765,-0.00101779,0.00148806,0.00127762,-0.00122214,-0.00134522,-0.000483764,-0.00128704,0.000159708,-0.00112323,-0.000244867,0.00021382,-0.0000988563,0.000216576,-0.000361702,-0.000352545,-0.000363975,0.0012154,0.0000123932,-0.00036035,0.00141744,-0.0000374977,0.000540869,-0.000886678,-0.000852651,0.000469911,0.00183305,-0.000538075,0.000190104,-0.00051606,-0.000537663,0.00181682,-0.00126845,-0.0003267,-0.00126466,0.000871263,-0.000744011,0.000180057,0.000634327,-0.000666512,-0.00120007,0.00127178,-0.000478333,-0.000399304,-0.000665337,0.000341263,0.00083168,-0.000314194,-0.000047185,0.000634256,0.00132148,0.00049321,0.000189369,-0.00169887,-0.000745591,0.000656334,0.00155426,-0.000240223,0.000884384,-0.000178185,-0.00121652,-0.000683451,0.000661469,0.000841945,0.000935941,0.000196224,-0.00152435,-0.000448378,0.000900539,-0.000163699,-0.000393153,0.0014108,0.000954223,-0.000633187,-0.000976294,-0.00177125,0.00103896,-0.00110552,0.0012533,0.000345841,0.000504628,-0.000852832,-0.000647377,-0.00001479,-0.000263649,-0.000194773,0.000377311,-0.00105877,0.000895548,0.000771326,-0.000597437,-0.000448526,0.00120116,0.00165618,-0.00112702,0.000558661,-0.00116045,-0.000510678,0.00167726,-0.00091111,-0.00107358,0.00103578,-0.00189153,-0.00114338,-0.00118907,-0.00108337,0.00132918,-0.00049083,0.00091673,0.000632137,-0.00168306,-0.000263599,0.000364306,0.000180637,-0.000169645,0.000714238,-0.000915744,0.00125802,-0.000336682,0.00102606,-0.000368724,-0.00040179,0.000417851,-0.000790305,0.000817468,-0.000211928,0.000630054,0.000345331,-0.000730457,0.000347355,-0.00110995,0.000623741,-0.000355359,0.000924409,0.000211159,-0.00110499,-0.000109504,0.000174557,-0.00164862,0.0007866,-0.000818835,0.00114219,0.000631401,-0.000355816,-0.00147896,0.000000301397,-0.000205155,0.0000538252,-0.0000990286,-0.000975885,0.000270712,0.000808676,0.0000636363,0.000522189,0.000439534,0.000152569,0.00195119,-0.000388773,0.00136087,0.0000698656,-0.00113003,0.000434347,-0.0000365695,0.000233812,0.000240832,-0.000113666,-0.00116665,0.000741839,-0.00029579,0.000136828,-0.000393395,-0.00120879,0.00020164,-0.00118868,-0.000914544,0.000969479,0.000885649,-0.000683022,-0.000253276,-0.000110255,-0.000560859,0.00109333,-0.00058125,0.0000597532,-0.000336788,0.000271633,0.000223436,0.00134168,0.00111027,-0.000661554,0.0000613318,0.000219294,0.00161443,-0.0000699156,0.000556804,-0.000331165,-0.0000150632,0.000099693,-0.000357476,-0.00135756,0.00123715,0.00178783,0.000332035,-0.000449759,0.000361893,0.00178796,-0.000782719,0.000177382,0.000218179,0.000642805,0.000969622,-0.0016487,-0.000490809,-0.000299636,-0.000192991,0.00178866,-0.00028344,-0.000369095,0.0000075497,-0.0000821893,-0.00106336,-0.000539278,0.000144787,-0.00109783,0.000924659,-0.00134641,0.00174012,0.0000455396,-0.0008671,0.00110479,0.000480184,-0.000460568,-0.000141243,-0.00108062,-0.000599101,0.000131857,-0.00136391,-0.000672565,0.00132074,0.000174016,0.000488652,0.00149669,0.0000611672,-0.00120225,0.000559803,-0.00048928,0.0012078,-0.000228061,-0.000624109,0.000527395,0.000210683,-0.000581569,0.000905798,-0.00129145,-0.000704524,-0.000169511,0.00090508,-0.00164412,0.000166831,0.0000341435,0.0000722343,-0.00108738,-0.00132628,-0.000614503,0.000155817,-0.00136366,0.00104239,-0.000733317,-0.000438574,-0.000637854,0.000243132,-0.000325741,-0.000606379,-0.000922216,-0.000716851,0.00141975,0.00163566,0.000655298,-0.00124772,-0.000638793,0.000381843,-0.00172888,0.000291018,-0.00107716,-0.000854767,-0.000168066,-0.00056945,-0.00148784,-0.000573174,0.0015909,-0.000026581,-0.00152918,-0.000165005,0.000111369,-0.000524226,0.000069593,0.000604349,-0.000297588,0.000134182,-0.000706234,-0.00049721,0.000529315,0.000935346,-0.000724235,0.000370177,-0.000581237,0.000945413,0.000200457,-0.00074476,-0.00193482,-0.00139244,-0.000484525,0.00110523,0.000600964,0.00155252,-0.000206156,0.000790694,0.00120003,-0.000329377,-0.000657784,-0.00135831,0.00100224,-0.000640373,0.00109978,0.00152453,-0.000879829,-0.000749658,-0.00155854,0.00101457,0.000213376,-0.000219384,-0.00027022,0.000767502,-0.000864426,0.000148197,0.000239855,-0.0013203,0.000685713,-0.00149959,0.000282756,-0.000780204,0.000171609,0.0000619758,-0.000798253,-0.00179111,0.00159732,0.000690885,-0.00115293,-0.000145392,0.000490637,-0.0000379926,0.00114686,0.00030987,0.00127889,0.000573525,-0.00048032,0.00186815,-0.0000417708,0.00109068,0.000836466,0.000359486,-0.000528606,0.00047708,-0.000643783,0.000220969,0.000676405,-0.000129697,-0.0011453,0.000167345,-0.00000965817,0.00122458,0.000052005,-0.0010667,0.00132902,0.000244823,0.000193869,0.00113245,0.000263146,0.00159936,-0.000458352,0.000870754,0.00165372,0.000368481,-0.000710329,-0.000263616,0.00131053,-0.000495651,-0.0010026,0.0000933121,0.0016201,-0.00136837,-0.00130894,-0.00122055,0.000218733,0.000509207,-0.000696994,0.00130934,0.000598126,0.00154324,-0.00122216,0.00145724,-0.000421189,-0.00174189,-0.00039387,-0.000992362,0.0000764464,0.000353005,-0.00125181,0.000367559,0.000910795,0.00127423,-0.00136227,0.000849364,-0.00182424,0.000913881,-0.000488684,0.000280453,0.000770724,0.000465065,-0.00152246,0.000909207,-0.000773829,-0.000101506,0.0000975168,-0.00167256,0.00117622,0.00123515,-0.0018048,-0.000693674,-0.000844864,-0.00036801,0.000445887,0.00111684,-0.0000233604,-0.00137639,0.000360723,-0.00034465,0.000340797,0.000435806,-0.000500443,-0.000890077,-0.000396716,-0.000554288,0.000204296,0.000673874,0.000966101,0.000858,-0.000958858,-0.0000815698,0.000887304,0.000551895,-0.000961182,0.000621669,-0.000313485,0.00133691,0.000755488,-0.000779764,0.00112762,-0.000922396,-0.00199007,-0.000306339,-0.0000912623,0.000403466,0.000110122,-0.0000176374,-0.00139154,0.000291145,-0.000815246,0.000422306,0.0000969384,-0.00146966,0.00024078,0.000527332,-0.00141692,-0.000497196,0.00150758,-0.000416177,0.00181092,0.000241473,0.000450269,-0.00024299,0.000524367,0.000917077,0.000961812,0.00125345,-0.000459852,-0.000283909,0.000321833,-0.00199419,-0.00109623,0.0000400128,-0.000894657,-0.000769656,0.000369203,0.0000591213,0.00196592,0.000126481,0.000030246,0.000850286,0.00175654,0.0000548677,-0.000254399,0.000605372,0.00108021,0.00062985,0.00167241,0.0007632,0.0000684014,0.0000249903,0.00117721,-0.0000494645,-0.000704489,0.00135594,-0.000536929,0.000507326,-0.00156846,0.00191034,-0.0000688335,0.00105131,0.000117344,-0.00140148,-0.0000275384,0.000808232,0.00109778,0.00109673,0.000274409,-0.000351422,-0.00114693,0.00106872,-0.00039886,-0.000714289,-0.000891438,0.000267267,0.000343225,-0.000164857,-0.000258971,-0.000783844,0.00135161,-0.000128253,0.000327902,-0.00118567,-0.000234147,0.000160532,0.000152423,-0.000690506,-0.000409225,-0.0000299235,0.000430777,0.000415492,-0.00111152,-0.000267148,-0.0000675747,-0.000540497,0.000355223,-0.000778238,0.00103562,0.00124639,-0.00000381738,0.00119541,-0.000517732,-0.00198982,0.00115674,-0.00158019,0.000198934,-0.00138195,0.00123773,-0.00151812,0.00098835,-0.00198566,0.000419692,0.000252677,0.0000330254,0.000991851,0.000399392,0.000548461,0.000886948,-0.000795393,-0.000645264,0.00162408,0.000571386,0.000836664,0.000255057,-0.000219031,-0.00161169,-0.000246196,-0.000371164,-0.0000255767,-0.00159371,0.000390009,0.000580707,0.000135621,-0.0000748179,0.000429676,-0.000358854,0.000640208,0.000740043,0.00165616,-0.0000518613,0.00160995,0.0016807,0.00031726,0.0000940658,-0.00152942,-0.000223636,-0.0010497,-0.000199392,-0.00122363,-0.000844292,-0.000272434,0.000909678,0.00113269,0.000374518,0.000141161,0.000700439,-0.000247209,0.000592149,-0.00126623,-0.000547241,0.000395558,-0.000431703,0.000633959,-0.00109738,0.000320071,-0.00129768,0.0000237255,0.000791343,0.00072971,0.00178768,-0.00067527,0.000201487,0.000336974,-0.0013074,-0.0000772533,-0.00163357,-0.000339086,-0.000963305,0.000846215,0.000844723,-0.000358025,-0.000369793,-0.000290614,-0.000257819,-0.00105762,0.000737922,-0.000771608,0.0000927785,-0.00080624,0.0003187,-0.00113156,0.000154829,0.00134845,-0.000545292,-0.00111253,-0.000187949,-0.00128068,0.00034665,0.000349303,-0.0000750887,-0.000443896,-0.00141785,0.00021038,-0.000258658,-0.000228914,0.000683763,-0.000596122,0.000141786,-0.00109768,-0.00066445,-0.0011849,-0.000685238,0.000248787,0.00000488591,0.00088525,0.00193038,0.000677432,0.00025832,-0.000318405,-0.000230639,0.000839793,0.000470257,0.000928364,0.000737281,0.000954299,-0.000568164,-0.00000956978,-0.000213025,0.000441154,-0.000326871,-0.000446739,0.000385734,0.000840325,0.000000627269,0.000350703,-0.00105251,0.00150811,-0.000817299,-0.000361517,0.0000319027,0.000510064,-0.000848577,0.000952674,-0.000448097,-0.000952948,0.00151195,0.000982702,-0.0000816896,-0.000607677,-0.000683411,-0.000263797,-0.000652134,-0.00119055,-0.00000880898,0.00124087,-0.000495743,-0.000399402,0.00196364,-0.000107472,-0.00167538,0.0000195496,0.000284243,0.000194831,-0.0000109658,0.000646433,-0.00106889,0.00129046,-0.000166695,0.000385178,-0.000485961,-0.000793029,-0.0000631984,0.00047508,0.0010396,-0.0015475,0.000122855,0.0000566913,-0.000103265,-0.000222197,0.0017061,-0.000604673,0.000658522,-0.00112604,-0.000132232,0.00156942,-0.000922674,0.000248385,-0.000252734,0.0000282294,-0.000181947,0.000124182,0.000356352,-0.000423561,-0.00078726,0.000514248,0.000844742,0.000411934,-0.00159559,-0.000779423,0.000505192,0.000441053,0.0014416,0.000500349,0.000393769,-0.000554806,0.00195002,-0.000576156,0.000662972,-0.000934901,-0.000569878,0.000272618,-0.0000468928,-0.000722238,0.00119986,-0.000515163,0.000843738,-0.00138741,0.000871109,0.000481863,0.00129273,-0.000218006,-0.00053753,-0.000173346,-0.000279463,-0.00159973,0.0000145089,0.000546619,-0.000475459,-0.000746847,0.0000264031,0.000162854,-0.0000890746,0.000470153,-0.00120789,0.000530902,-0.0000842524,0.0013955,-0.00020763,-0.00164114,-0.000655053,-0.0000541323,0.000577821,-0.00108232,0.000933146,0.000450141,-0.00174247,0.000383375,-0.000124185,-0.000753258,0.00139082,-0.000895826,0.00000801208,0.00150076,0.00156564,-0.000345058,-0.000972383,0.00105012,0.000948532,-0.00107431,-0.000876718,-0.000043571,0.000587762,0.00126392,-0.000771958,0.00175306,-0.000758654,0.000739978,0.000998522,0.000475975,-0.000907981,0.00033042,0.00147773,-0.00116706,-0.00174035,-0.00104834,0.000263791,0.0000322315,0.00177343,0.000139534,0.000282968,-0.000273222,-0.000968641,0.00136322,-0.00065142,0.000542336,-0.00132155,-0.000558748,0.000601561,-0.00112233,0.00000625044,0.000674633,-0.000726301,-0.000380837,0.000791673,-0.000128279,0.00148702,-0.000642115,0.00135041,-0.000593877,-0.0012454,0.000536055,-0.000814183,-0.000103824,-0.00119198,-0.000452197,-0.000588093,0.000924646,0.0011552,-0.000185869,-0.000807313,0.00111241,-0.000103901,-0.000813971,0.00082068,-0.00113269,-0.000778223,0.000200598,0.000621249,-0.0000271394,0.000440252,0.000770284,-0.000451168,-0.000331429,-0.00134742,-0.000591107,0.000675717,0.00100951,-0.000165766,-0.000827589,-0.0017673,0.000724072,-0.000223919,-0.0000220882,-0.00107616,0.000896315,-0.00123636,-0.000656599,0.000441098,-0.000823363,0.0000762804,-0.000480904,0.000099443,0.000897329,-0.000653686,-0.0004327,0.0000575201,0.00140975,-0.000755411,-0.000304561,-0.00128046,-0.000721405,0.0000715065,-0.000324388,-0.000580722,0.00150192,-0.000487047,0.000252266,0.000285114,-0.000859414,0.000657236,0.00114798,-0.000796614,0.000925622,-0.000382095,0.000143211,0.000642044,-0.00116572,-0.000221358,-0.00092218,-0.000688178,-0.000682379,-0.00172186,-0.00159923,0.000113639,-0.00126776,0.000513206,-0.0000919288,-0.000700747,-0.000768517,0.00098819,-0.000366558,0.000964631,-0.00180795,0.000633695,0.00127851,-0.000555687,0.00145285,0.000239306,-0.000504081,0.000255063,0.000573702,-0.00127129,-0.00000212248,0.00175412,0.00187854,-0.00173014,0.000505179,0.00124777,0.000720432,0.000908775,0.00162698,0.000110521,0.000213437,-0.000308006,-0.00019028,-0.00182053,0.000313435,-0.00021638,0.00073784,-0.0010758,-0.000659717,0.00123867,-0.000406572,0.0000167189,-0.000925997,0.00036208,0.00028073,0.000557473,-0.00068627,-0.000334279,-0.00098814,-0.000361919,-0.000734227,0.000877732,0.000694066,0.000614615,-0.00116725,0.00174515,-0.000612908,0.00026588,-0.0000197154,0.00166389,0.00165555,-0.00126277,0.00105878,0.00141889,-0.00122366,0.000948275,-0.00194735,0.000897837,-0.00121907,-0.00102203,0.0011036,-0.000733119,0.000869351,0.000759245,-0.000946537,0.000187656,-0.00133438,0.00126866,-0.000308035,0.000585914,0.000485283,0.000243374,0.000412308,0.00163081,0.000315406,0.00104749,-0.000159652,0.000540012,-0.000663128,-0.0010159,-0.00020698,-0.00154044,-0.000112841,-0.000349778,0.000940252,0.000172806,0.00122366,0.0000201922,0.000431144,-0.00055491,0.000493646,0.000378744,-0.0000527187,-0.000778379,-0.000114452,0.000388631,0.000292784,-0.000525801,-0.000175539,0.000685563,-0.000930304,0.00155303,-0.00102216,-0.00125675,-0.000169785,0.0000977846,-0.000723164,0.000124692,-0.00138903,0.0013607,-0.000439218,0.000225758,-0.000531353,0.000739112,-0.000309554,-0.00131197,0.000205358,-0.000471608,-0.0005559,0.00105473,-0.000542278,-0.000738147,0.000335224,-0.000367478,0.0000888615,0.000200324,0.0000736732,0.000752006,0.00152082,0.000417721,-0.000848871,0.00112787,0.000551357,-0.00179522,-0.0000551825,-0.00137118,0.000261823,0.00175315,-0.000102964,-0.000803525,-0.00118529,-0.000550332,0.000161083,-0.000766095,-0.00170502,0.000342368,-0.0000100937,-0.000215572,0.000988035,0.000868527,0.000673699,0.00045149,0.000452862,0.00156505,0.000568299,-0.0000313361,0.00172489,-0.000682266,-0.00137696,-0.00116123,-0.000956315,-0.00062064,0.0000520741,0.000952632,-0.00027886,-0.00125621,-0.00022535,-0.000833967,-0.000219566,-0.00180285,0.0003406,-0.000595621,0.00141098,-0.000615353,-0.00119825,0.0000866263,-0.000326858,0.000664756,-0.00185317,-0.00139501,-0.00105545,0.00126421,0.00107688,-0.00180566,0.000831637,-0.000130988,-0.00113916,0.000443157,-0.000807385,-0.0010028,-0.000289526,-0.00145762,-0.000221196,0.00173891,-0.000540936,0.00153484,-0.00125119,0.000141158,-0.000151633,-0.00082546,-0.000182351,-0.000671915,0.000720988,-0.0000558569,0.00168416,0.000471036,0.000607445,0.00159046,-0.000361302,-0.00137167,-0.000319756,0.000781026,-0.0000617868,-0.0000200451,0.00115536,-0.000453332,-0.000722111,0.000602053,-0.00010311,-0.000288225,-0.000968465,-0.000356077,-0.00126346,0.00104297,-0.000747307,-0.00091169,0.00175242,-0.00030389,-0.000431852,-0.000984991,0.00131798,0.00064096,-0.000541012,0.00146998,0.000518712,-0.000773941,0.00015362,-0.000465274,0.000760845,-0.0000902818,0.000529122,-0.000159545,-0.000448914,-0.000459454,0.00119395,0.00101294,-0.000280659,0.000678982,0.00142252,-0.0000856495,0.000501044,-0.000956019,-0.000304522,0.000783471,0.00137313,0.00120346,0.00139375,-0.00175935,-0.000959927,-0.000932558,0.000856087,-0.000711334,0.0000702684,-0.000120824,0.00141097,-0.000987449,0.000498033,0.00152276,0.00189446,0.000124134,-0.000580519,-0.000438893,0.00110322,-0.00101749,0.00199604,-0.000813827,0.0000505357,-0.0000153321,-0.0014664,0.000335863,0.00111088,0.0000306418,0.000731605,-0.000524197,0.000876101,-0.0013848,-0.000984063,-0.000980494,-0.00104976,0.000722013,-0.000175196,0.000551896,0.000494272,0.000112566,0.00145058,0.000703616,-0.000111431,0.000597734,0.0012913,-0.00051146,0.000677603,-0.000260219,0.000576599,-0.00161186,0.000416715,0.000573983,-0.000985301,0.000559778,0.0000488815,0.000386019,-0.000735126,0.000701683,0.000536641,0.000166845,0.00108327,-0.000174384,-0.00122237,0.00021485,0.00132859,0.0000559432,-0.000495631,-0.000125548,-0.00094599,0.000216618,0.00157035,0.00124059,0.000239022,-0.000392976,0.00145621,-0.000692275,-0.000251597,0.000178633,0.000900098,-0.0002883,-0.000926857,0.000146691,0.000365895,0.00093777,-0.00105156,0.000194432,0.000502947,-0.0011221,-0.000453525,-0.000019639,0.00115093,0.00032829,0.0000125012,0.00089134,-0.000031698,0.000481837,-0.0000237022,0.00075674,-0.0010968,-0.0013142,0.000384825,0.000301647,-0.00123243,0.00142328,-0.000268748,0.00184279,0.000768065,-0.00188307,0.00114754,0.000376401,0.000107122,-0.000662934,-0.000176501,-0.000271688,-0.000795678,-0.000173041,0.000133835,-0.000570366,0.000281556,0.0015508,0.00101949,0.000645903,-0.000285115,-0.000523052,-0.00158777,-0.000311204,0.00124891,-0.000780466,0.000264359,0.0000177712,0.000206273,0.000173427,0.000933268,0.00117384,-0.000730438,-0.00181904,-0.000117574,-0.00060138,-0.000784466,-0.0019773,0.000898283,0.000368581,-0.00182591,-0.000727045,-0.00119489,-0.000130229,0.000587203,-0.00197995,0.000645413,-0.000238462,-0.000700864,-0.000853329,-0.000760316,-0.000348712,-0.000636972,0.000259565,0.000198787,-0.000109799,-0.000475591,0.00032901,-0.000579365,0.000512196,-0.00000990874,0.000511134,0.000556079,-0.00179034,0.00129936,0.00168361,0.000547154,0.000785439,-0.0000252366,-0.00139193,0.000773377,0.000364856,-0.00107162,0.000735202,0.000479313,-0.000840097,-0.000393046,-0.000459588,-0.00000814502,-0.0000627014,0.000181351,-0.000294499,0.000636947,0.00180897,-0.0017894,0.00107518,-0.00124142,-0.00058558,-0.0000529189,-0.0000225612,0.000712674,0.00165153,-0.00110507,-0.000269745,0.000921224,-0.000167559,-0.000324536,0.00161987,-0.000304976,-0.0000634628,-0.000624194,0.000238784,-0.001233,-0.000482917,-0.000477498,-0.00059944,0.000122122,0.000328745,-0.00055061,0.000195,-0.00034817,0.000419133,-0.000500148,0.00039271,-0.000126813,-0.0000363133,-0.00138568,-0.000287321,-0.000179966,0.000240984,0.00021216,-0.0000434935,0.000794585,0.00136079,-0.000341968,-0.000185019,-0.000749252,-0.0019158,0.00056567,-0.000379882,-0.000012827,0.000230858,-0.00072726,0.000346717,0.0012913,-0.000374666,0.000780581,-0.000674156,-0.00188688,-0.00110595,0.000221026,0.000815019,0.00084204,-0.000803691,0.000930704,0.00102285,0.0008797,0.00108671,-0.0000523726,0.000428309,0.0015778,0.000233021,0.0000596151,0.000209925,0.000249177,0.00152698,0.000691292,0.00152183,0.000329266,0.000469698,-0.000526702,0.000172039,0.0015053,0.000271801,0.00076903,-0.000996757,0.00147046,0.000042359,0.000505758,0.000624638,-0.000682859,0.000188383,-0.000731562,-0.000665321,0.00132453,0.00116033,-0.000960048,0.0000260845,0.000575812,-0.00125837,-0.000737049,0.000166483,-0.000174306,0.00160504,0.000602029,0.000462177,-0.000658716,-0.0000981746,-0.00100506,-0.000654552,0.00155722,0.000198035,0.00171058,0.000205528,0.000215474,-0.0000106332,0.00153037,0.000641372,0.000463793,-0.000201959,-0.000546464,0.000540113,0.000634744,-0.000278462,-0.0000932465,0.000948252,-0.000173196,-0.000177391,-0.000145341,-0.000382325,0.0004771,-0.000699851,-0.00121827,-0.000609555,-0.000154638,0.00103218,0.00015954,-0.00102361,-0.000337733,0.00125629,-0.00145896,0.000849464,0.000117038,0.001017,-0.000231819,0.000588337,-0.000964741,-0.00131404,-0.000898569,0.000149266,0.0000186352,0.000797929,-0.00159395,0.000311082,-0.000759716,0.000156416,0.000638832,0.000152741,0.00121456,-0.000015433,-0.000379617,-0.000470608,-0.000316777,-0.000283829,-0.00167396,0.00136372,-0.000264353,0.00111056,-0.000130568,-0.0000683997,-0.000247752,0.000202153,-0.000771305,-0.000448794,0.00038181,-0.000257023,-0.000146722,-0.000355926,0.000328346,0.000628677,0.000347192,-0.00180161,0.000756039,-0.000262617,0.000260576,0.000518406,-0.000330613,0.00180226,0.0000440553,0.000122993,-0.000230674,0.00131032,-0.000312899,-0.000773891,-0.000716369,-0.0017235,0.00038148,0.000403409,0.000432281,-0.00139449,-0.00161705,-0.00171212,-0.000553818,-0.000421393,-0.000202954,0.000282401,0.000309617,-0.000545661,-0.000190065,0.000337335,-0.000746593,0.000720039,-0.000249121,0.000756543,0.00173411,-0.000879969,-0.00149003,0.00176724,0.000104595,-0.00124674,0.000551226,-0.00126428,-0.000411542,-0.00175778,0.000458574,-0.00113339,-0.000771321,0.00025034,-0.000521373,0.00010458,0.000306834,-0.00127931,-0.00163018,0.000155818,-0.000175349,0.00000707149,0.000638716,0.000161131,0.000386473,0.00114213,-0.00112224,0.00171492,-0.000456152,0.000777016,0.000929958,0.000531208,0.000403512,-0.00121256,-0.00127512,-0.00194752,0.000619085,0.000385742,-0.00076353,0.000925992,0.000345348,0.00124557,0.000355906,-0.000337753,0.00115844,-0.000514181,-0.000955948,-0.000969187,0.00103562,-0.000524195,0.000162407,-0.000549089,-0.0000881644,0.000818543,0.000909193,-0.00139779,0.00152205,0.00015416,-0.00183913,0.000947709,-0.000796177,0.000491099,0.00108199,0.00105632,-0.000340074,-0.000708979,0.0000892247,-0.0005516,-0.000575426,-0.000672723,0.00076753,0.00148036,-0.000980174,-0.000989649,0.00113538,0.000462648,0.00153007,0.000542005,0.000479191,0.000777653,0.00102019,0.00168462,-0.000205994,-0.000064732,0.000472261,-0.000960271,0.00192243,0.000401384,-0.00105145,-0.00028142,0.000529543,0.00109128,0.00000690544,-0.00037787,0.000128784,0.000243728,0.000619587,0.00047751,0.000995934,-0.000229524,-0.00157074,0.000890243,0.00108478,0.000968663,0.000625631,0.00120044,-0.00116308,0.000626536,-0.00155432,-0.000033579,0.000376259,-0.00166889,0.000479649,-0.00064825,0.00187571,-0.00157162,0.000735776,-0.000471959,0.000281119,-0.000971012,0.000335551,0.000912298,-0.000993073,0.00024655,0.000193918,-0.0000659779,-0.000969139,0.000454821,0.000635723,0.000524741,-0.000829728,-0.000644773,-0.000380492,-0.0000468828,0.000391611,-0.00111972,0.00042566,-0.00042143,-0.00112158,0.000632354,0.000397723,-0.00115454,0.000397522,-0.00113539,-0.000996085,-0.00157418,-0.000497377,0.000978652,-0.00106377,-0.000336684,-0.0010473,0.000646376,-0.00176277,0.0000121363,0.000715576,-0.00137744,-0.000251332,-0.0000397553,-0.000251627,0.000102272,-0.000477223,0.000840599,0.0000200561,-0.000528866,-0.00042937,-0.00000542081,0.00116993,-0.000607216,0.00146963,0.000696883,0.0000385611,0.000980103,-0.000405468,-0.00175665,0.000169963,-0.000265987,0.000739446,-0.00045395,-0.000648843,0.00138149,-0.000540854,0.00100066,0.000843632,-0.000368735,0.000608366,0.000213111,-0.000153618,-0.000817938,0.00040999,0.000623853,0.000467039,-0.000155242,-0.00144591,0.000946219,-0.00168388,-0.000590648,-0.00114934,-0.000317724,0.00122104,0.000686456,-0.000104671,0.000315731,-0.0015026,-0.000795826,0.000236279,0.000696565,0.00179343,0.001758,0.000363008,-0.00073598,-0.000133035,-0.0000627466,0.0000684428,-0.000816602,0.000316254,0.00100614,0.000505498,0.0000498298,0.00155538,0.000401026,-0.00058222,0.000765003,-0.0000062434,0.00105963,-0.00165166,-0.00134632,-0.000626163,0.0000318749,0.00187401,0.00107674,0.000753886,0.000110325,0.00127801,-0.00165079,-0.000285052,-0.000572163,-0.000300772,0.000113793,0.000614312,0.00194941,-0.00134208,0.000316228,0.000211721,-0.000995934,0.000204979,-0.000853902,-0.00141087,-0.000674793,0.000145622,0.000423329,0.00103489,-0.0000644296,-0.000372544,-0.000746849,0.00145536,0.000255563,0.000902754,0.00105762,0.00026687,-0.000295396,-0.000119892,-0.000693642,0.0000845214,0.000469691,0.00172796,0.0000345388,0.0000725586,-0.0010147,-0.000530742,-0.000358678,-0.0000816326,0.00133943,0.00160364,-0.000730429,0.000658046,-0.00134733,0.00104465,-0.0000173523,0.000496229,0.00108057,-0.00142744,-0.000147778,-0.000475106,0.000554172,-0.000492307,0.0012253,-0.0014568,-0.000881065,-0.000174937,-0.0013869,-0.000758789,0.000373692,-0.000912377,0.00131981,-0.000145237,-0.00104635,0.000458471,0.00039078,0.000751664,0.00116704,0.00150154,0.000328273,0.0000459578,0.000262737,0.0012585,-0.000687263,0.000704218,0.000992163,-0.000769604,-0.00099971,-0.00178412,-0.00120248,-0.000378764,0.000486732,0.0000845768,0.000105739,-0.000286163,0.000943782,-0.000998132,-0.000174812,-0.000277291,-0.00124469,-0.000224175,-0.000911334,-0.0000232016,-0.000777197,0.000329085,0.00093281,0.00161902,-0.00133238,0.00106607,-0.000519596,-0.000627021,0.000176869,-0.000506978,-0.00029301,-0.000893472,0.000394988,-0.00125327,-0.00100588,-0.0000664747,0.000673145,0.000938768,-0.00135114,-0.000263631,-0.000348011,0.000142363,0.00135206,-0.000451481,-0.000316786,-0.00182035,-0.00127337,-0.000468523,0.000225511,0.00017019,0.0000592708,0.000984432,-0.00161096,0.00132278,0.00131223,-0.00074629,-0.000465575,0.000146749,0.00039158,0.000961104,0.000639711,-0.0000658409,-0.00149168,-0.000708607,-0.00052805,-0.0014407,0.000577628,-0.000126917,-0.000233031,-0.000750575,-0.00126362,-0.00066503,0.000861159,0.000039426,0.000798678,-0.000431199,0.0016072,-0.00139225,-0.000417182,-0.000657752,0.0000578777,0.000169422,0.000201342,-0.00130835,-0.0006159,-0.000577795,-0.00022312,-0.000339532,0.00103314,-0.000312594,0.000617913,-0.0000813945,0.00187635,-0.00043009,0.0018363,0.00143326,-0.00111033,-0.000869041,0.000469751,0.000429019,0.000333019,0.001804,-0.000495563,-0.000315189,0.00113761,0.000140276,0.00093615,0.0019316,0.00124015,0.00179964,0.000467863,-0.00127654,0.00077554,0.000172978,0.000431125,0.00111634,-0.000138111,-0.000273391,-0.00151449,-0.000727958,-0.000100728,-0.000158911,0.000316212,0.000301036,-0.000906029,0.000507052,0.000620096,0.0000123868,-0.00141099,0.000523388,0.000926962,-0.0000280954,-0.000177303,0.000642923,-0.000107886,-0.00000367713,0.000851805,0.00037345,0.000873155,0.000133346,0.000286306,0.000626373,-0.000983092,-0.00104846,0.000210187,-0.00107299,-0.000733472,0.00029351,0.000988864,-0.000635458,-0.000045442,-0.00177312,0.000366242,0.00100729,-0.000799497,0.000964234,0.000379033,-0.000670347,-0.00131943,-0.00131985,0.000736207,0.00097816,0.000141429,-0.000978718,-0.000483187,-0.00113347,0.0018559,-0.000906112,0.00150533,-0.000312231,-0.00024583,0.000340016,-0.00144509,0.000938292,-0.00140624,-0.00149625,0.00020336,0.000942423,-0.000147814,0.000666239,0.00113011,-0.000905123,-0.000467858,0.000643678,-0.000406202,0.00163353,0.000987023,-0.00116877,-0.000223064,-0.0000150656,-0.000798934,0.000240445,0.000972653,-0.000522757,0.000789951,-0.00119636,-0.0000678479,-0.0000820836,-0.0000102203,0.0002297,0.000791436,0.000480668,0.00101698,0.000379745,-0.00126852,0.000342914,0.000750468,0.00097311,-0.00158727,-0.00102811,0.000628931,-0.00060321,0.000108756,0.000722213,-0.000257073,-0.00114059,-0.000503251,-0.000476621,0.000862522,-0.00146537,0.0000663373,0.000279572,0.000622133,-0.000229769,0.0012042,-0.000358071,-0.00140594,0.000355494,0.000412592,0.00021915,-0.00112523,0.000621881,-0.000130894,0.000142086,-0.000951857,-0.000103429,-0.00138515,-0.000395982,-0.000675386,0.00026928,0.000236451,-0.000792017,-0.000261352,-0.00136619,0.000721878,-0.00153108,-0.000145738,0.0006138,0.00111337,0.000902865,0.00025405,-0.00061703,-0.0000371132,-0.000631128,0.000341772,0.000471726,-0.000715019,0.0017303,-0.00110949,-0.000688004,-0.00153632,-0.000177224,0.000306615,0.000447214,-0.00135379,-0.00163426,-0.00118231,-0.000401016,0.00121186,0.000625505,-0.000267149,-0.000176298,-0.00057314,0.000449983,0.0018643,0.00035559,0.000213668,-0.000167472,-0.000722818,-0.000287562,-0.000460396,-0.00101992,-0.000484138,-0.000319407,0.00101565,-0.0000166181,0.00105059,-0.0018557,0.000999407,0.000483924,0.00162007,0.00118793,0.000174739,-0.000281987,0.00120331,-0.0018223,-0.00192442,0.000427649,-0.000173848,0.000762569,0.00031212,0.00136848,0.000590481,0.00133185,-0.00104601,0.00100467,-0.000384295,-0.00180633,-0.000395321,-0.000467463,-0.0010474,0.000531894,-0.000745086,0.000554771,0.000709554,-0.000238289,-0.0000920221,-0.00084848,0.0018243,0.00134075,-0.00115196,-0.000189815,-0.000338737,0.00147221,0.00151696,-0.000993254,-0.000872247,0.00125505,-0.000169512,0.00131613,0.0000494955,-0.000766876,-0.000444721,-0.000288814,-0.000722109,-0.00024275,0.000278757,0.000804961,0.000706867,0.00118623,-0.00147699,-0.000901899,-0.00111067,0.000522672,0.00072929,-0.000516842,0.000482862,0.000518075,-0.000911765,-0.000164803,0.00164303,-0.000790601,0.000827643,0.0000792295,-0.000643416,0.00052443,0.00185522,-0.0000979591,0.000433918,-0.000705352,-0.000981673,-0.0000781859,-0.00138663,-0.000580909,-0.000379275,-0.000558149,0.000211726,0.0000438334,0.000305792,-0.00148644,0.000835431,-0.00105572,-0.00120724,-0.00054301,-0.000116879,0.00140904,-0.000381636,0.00102357,0.000425674,-0.001044,-0.000620459,0.0000577196,-0.00141963,0.00017831,0.000427881,-0.0013886,0.00122665,-0.000834669,0.000900877,-0.000585278,0.00136823,0.0014363,-0.00160976,-0.000917307,-0.000371714,-0.000614029,-0.00129232,0.000269139,-0.000973724,-0.00089353,-0.000206574,-0.000332718,-0.000245886,0.00027202,-0.000343771,-0.000880844,0.00134858,0.000814512,-0.000107707,-0.0010412,0.000277714,0.000139965,0.000188917,0.000123815,0.000763661,0.00138525,0.000232975,0.00136392,0.000503906,-0.00084186,0.00129833,0.000568237,-0.000129403,-0.000577676,-0.000898565,0.00174865,0.000154733,0.000600447,0.000270443,-0.0000845625,0.0000830085,0.000814206,0.000957394,0.000844427,-0.000928527,0.00123055,-0.000832806,0.00159776,-0.00160695,-0.000272658,0.00115311,-0.00155057,-0.000552295,0.00135394,0.000820118,-0.000500733,0.000384561,-0.000539277,0.000625998,-0.000568159,0.000639027,0.000125631,-0.000591612,-0.00103495,-0.000942282,-0.000651971,0.00149652,0.000307746,-0.000194177,0.0000389646,0.00124966,-0.000107,-0.000253807,-0.00059313,-0.000391429,-0.00127296,0.000308893,0.000337721,-0.000966486,0.000604307,-0.00110415,-0.000440671,0.00034689,0.000313103,0.00123528,-0.000652229,0.000370868,0.00170217,-0.0018575,0.0013135,-0.001467,0.000532727,0.000559225,0.00103781,0.0012506,0.00154036,0.000670466,-0.000354978,-0.00046532,0.000759993,0.00132472,-0.000296559,0.000212728,-0.0000950172,-0.000645985,-0.000796598,0.000282314,0.000394892,-0.00152392,0.000651287,-0.000431173,0.00195762,-0.00142888,0.00152804,0.000139052,-0.00137277,0.000329661,0.0000127365,0.000980541,-0.000251174,0.000592287,0.000829048,-0.00129071,-0.0016037,-0.000728379,-0.00172322,-0.000158835,0.000180782,0.00135618,0.000821178,0.00116613,0.000624802,-0.00017424,0.0000869573,0.000138873,-0.000418967,0.000948223,0.000121391,0.00151257,-0.00151597,-0.000742752,0.0000508763,0.000997986,-0.0000883201,0.000232089,-0.000578038,0.000515657,0.000176336,-0.000152732,-0.000573089,-0.000727601,-0.00123572,-0.000810324,0.000118953,-0.000483471,-0.000522524,-0.00106668,0.000137162,0.000593891,-0.00182251,0.000879273,-0.00143911,-0.00123984,-0.00106334,0.000556743,0.00115817,0.00113871,-0.000990406,0.000700468,0.000684256,-0.00151751,-0.00034379,0.00126042,0.000160925,-0.00186606,0.00148629,-0.00164395,-0.000173527,0.000287298,-0.000495255,-0.0000507129,-0.000487023,-0.00176829,0.00146063,0.00022304,0.00107002,-0.000704442,-0.00069735,-0.000275484,0.00000334104,-0.0011071,-0.00162827,-0.000968338,0.00141846,0.000534514,-0.000386101,-0.000549535,-0.000491702,0.000770775,-0.00193153,-0.000904868,0.00104019,-0.00115257,0.00114598,0.0000486004,-0.000318937,0.000443513,-0.000719462,-0.00101989,0.000867826,0.000910676,-0.00142855,-0.00128167,0.00123698,0.000292353,0.000413979,-0.00148625,-0.0000140189,-0.000770293,-0.00119055,-0.000239113,0.000110386,-0.00114624,0.000308313,0.000577218,-0.00175047,0.000439158,0.000149828,0.000456471,0.00110349,-0.0005425,-0.000103914,-0.00114717,-0.000916977,-0.00114121,0.00134138,0.00152267,0.00120398,0.00023804,-0.000268974,0.000109642,0.000443662,-0.000553261,-0.000943386,0.0019699,0.00102977,-0.000373206,0.00110698,-0.000156268,0.000211951,0.000662003,-0.000512639,0.000480579,0.000298012,0.0017466,-0.000190626,0.00124931,0.000170202,0.00102478,0.00075322,0.0010847,-0.00154325,0.00134482,0.000868192,-0.000689233,-0.000814676,0.000600894,-0.000705331,-0.00113713,-0.000316,-0.000758568,0.00057475,0.000659029,0.000849917,0.0019501,0.000147008,0.00104021,-0.000534548,0.0000932226,-0.000441588,0.000815126,-0.000760266,-0.00137283,0.000707989,-0.00015389,-0.00127912,-0.000991693,-0.00108284,-0.0000412031,-0.000579267,0.000452506,0.00116305,-0.00102323,-0.000262146,0.0000966782,-0.000430689,0.000283435,0.000485098,0.000524988,0.000339995,-0.00163581,0.000199352,0.000629822,-0.000215392,-0.000610397,-0.0000526736,-0.000863954,-0.000468422,-0.00156257,-0.0000918781,-0.000468736,-0.000114512,-0.000476814,-0.000702649,-0.000774779,-0.00108202,0.0000291034,-0.00104284,-0.00148949,0.000536316,-0.000256104,0.000135786,0.00103956,-0.00024275,0.0014419,-0.000253892,-0.0016567,0.00155616,-0.000626118,0.000460849,-0.000955666,-0.000204096,-0.000433452,-0.000118673,-0.00018709,-0.0000769648,0.00038564,0.00102756,-0.000535687,-0.000336301,0.000889589,-0.000505531,-0.000269337,-0.00000548184,-0.000577041,-0.000141721,0.000402235,-0.00042564,-0.0000749254,0.000452065,-0.000762636,-0.000564985,-0.00123249,-0.000863392,-0.00143964,-0.00124459,-0.000709453,-0.00122352,0.000843663,0.000118534,-0.000659886,0.000214548,-0.000603404,0.00145183,-0.00146616,-0.000545033,0.000436487,-0.000327384,-0.000731294,-0.00097432,-0.00181972,-0.000782672,-0.00169271,-0.000334323,-0.0000912017,-0.00163937,0.000875917,-0.000620811,0.000682655,-0.00117192,-0.00014109,-0.000220694,0.000620791,0.000493393,0.000780411,0.000419035,0.000488672,0.000889538,-0.000243186,0.00104174,-0.000436418,-0.00142332,-0.000915942,-0.0004724,-0.000866591,0.00114129,0.000854608,-0.000801037,0.000714884,-0.000237317,-0.000212644,-0.00106797,-0.000804628,-0.000778105,0.00105807,-0.0011143,0.00111049,-0.00194035,0.00127543,0.000613007,0.000279682,0.00117934,-0.00154151,-0.000236622,-0.00105575,-0.000385093,0.0000787364,-0.00165798,0.000185885,0.000386475,-0.000601215,0.0011461,-0.00154357,0.000623065,-0.000979208,-0.000387546,-0.00082184,-0.0000571145,-0.000737233,-0.000528414,-0.000343038,0.000463283,-0.000278836,0.000657338,0.0000605211,0.0000358479,-0.000903245,0.000322288,0.000178469,0.00167638,-0.000103923,-0.000242562,-0.00164701,0.000482544,0.00160555,-0.000278847,-0.00153437,-0.000786364,0.000131658,0.00107568,0.000416543,-0.000254942,0.00133402,0.00103809,-0.000377027,-0.0000179782,0.000761048,-0.000255001,0.000622879,0.000317307,-0.000925899,0.000810963,0.00105608,-0.000323256,-0.00137105,-0.000906892,-0.000650909,0.000621539,-0.000936356,0.00037711,0.000855576,-0.00113134,-0.000821985,0.00141391,-0.00184947,-0.00139785,0.000399872,-0.000151622,-0.000295563,-0.00144248,-0.000552317,-0.000437224,-0.000760953,-0.000915569,0.0000632197,-0.000169278,-0.00145482,0.000551227,0.00026898,0.0000422655,-0.0010349,-0.0000439012,-0.00052903,0.000866656,0.00183256,-0.000253413,0.00145269,0.000163828,-0.0008058,-0.000109322,0.000175419,0.00147384,0.000619758,0.000526692,0.00189114,-0.000983147,-0.000473734,0.000449566,0.0000756913,0.00102348,0.000357663,0.000931734,0.00041872,0.000292519,0.000821153,0.000736767,0.000613585,-0.000759166,-0.000813049,-0.000576361,0.000140534,0.000164552,0.000261305,-0.000402899,0.00156838,-0.000979844,-0.000754583,0.00182386,0.00142329,0.000573821,-0.00191587,0.00158607,-0.00157814,-0.00086076,-0.000985947,-0.000408036,-0.00104341,0.0000445341,0.00148602,-0.000253449,0.000200914,-0.00123332,-0.000484131,0.000603266,-0.00182473,0.000455381,-0.000521255,0.000260382,0.00126057,0.000634549,0.000857316,-0.000559154,-0.00122457,-0.000029897,0.00103287,0.000973643,0.00124724,0.00149262,-0.000388658,-0.000197778,0.00176271,-0.000485996,0.000449468,-0.000751395,-0.00153662,0.00091205,-0.000269398,-0.00112666,-0.00118338,0.000313526,-0.00101465,-0.0000460064,0.00062215,-0.000076016,-0.00124598,0.00124339,0.000401524,-0.0010816,-0.000227721,-0.000707228,-0.000873148,-0.000650414,0.000516797,-0.00144122,-0.000195895,-0.00103256,-0.000384333,-0.0000158464,-0.000400279,0.000619502,-0.000874681,-0.000911568,0.00107358,0.000191265,-0.00107209,0.000988467,-0.00175633,-0.00173522,0.00081043,0.000281002,0.000070399,0.000316459,0.000115645,-0.000570716,0.00036183,-0.00128529,-0.00000810713,-0.0000285936,-0.00172754,0.000499589,0.000535775,-0.000531498,0.000584143,0.000616634,0.00019513,-0.000329162,-0.000445892,0.0000552104,-0.000243383,-0.000361395,0.00143203,-0.000364297,-0.000446448,-0.00169847,0.00103016,0.00189422,-0.000806884,-0.0014934,-0.0000862255,-0.00054325,-0.000209758,0.00171301,0.000735221,-0.000607691,-0.000192457,0.000540225,-0.00142909,-0.00163123,0.001237,0.000916847,0.00127712,0.00104731,0.000838621,-0.000300664,-0.000847235,0.000862952,0.000556562,0.000374489,-0.00000585109,-0.00161439,-0.0000848407,-0.000904311,0.00141944,0.00084311,-0.00125204,0.000190653,0.00134913,-0.000306791,0.00117819,0.000428835,-0.0000306989,0.000965843,-0.0012634,-0.000738676,-0.00176191,0.00133103,-0.000873766,-0.00046642,0.000611451,0.000250283,0.000428084,0.000387647,-0.000801565,-0.000684122,0.00107782,0.000997867,0.000676072,-0.000547683,-0.000240944,-0.0016789,-0.00168149,-0.0012056,-0.00081598,0.00165,0.0000112887,0.000616444,0.000222937,-0.00111875,0.000775163,0.000739631,0.000244728,0.000379906,0.000485592,0.000838266,-0.00081533,-0.00105748,0.00106988,-0.000379474,-0.0000756902,-0.000864956,0.00104497,0.00109097,-0.000426142,-0.000537457,-0.00149955,-0.000572951,-0.000167594,0.0000694944,-0.0016952,-0.000203923,0.0000158944,-0.000638863,-0.000822198,-0.000970163,-0.000780489,-0.0000400384,0.000661161,-0.00161297,-0.0000915492,-0.000265562,0.00131028,0.000551546,0.00146218,-0.00154674,0.000336709,-0.000341483,-0.000120245,-0.00129957,-0.0012905,-0.00132078,-0.000377302,0.000699337,-0.00100129,0.000000583906,0.000987733,0.000510969,-0.0000122477,0.00138425,0.000706825,0.000872245,-0.000383135,0.000157721,-0.0000594394,-0.00104422,-0.000739543,0.00058503,0.00134528,0.00144573,-0.00116483,-0.000505568,0.00128497,0.000559013,-0.000759636,0.00112601,-0.0016261,0.000505485,0.000351301,0.00108034,-0.000716723,-0.000614312,0.000933617,-0.000573704,-0.000547409,0.000776068,-0.000820084,-0.00118156,-0.00139495,-0.000791413,-0.00139639,0.00133619,-0.000371391,0.000182732,-0.000464993,-0.000862989,0.0014628,-0.000114459,0.000492524,-0.000766428,-0.000858428,-0.00131525,0.00165774,-0.00155359,-0.000163729,-0.000451702,0.00117818,-0.000249279,-0.00108691,0.000761196,0.000842095,0.00041127,0.000439563,0.000337691,-0.00125935,0.000532749,0.000766814,0.000344392,0.000298177,-0.00022887,-0.000462456,0.000425605,0.00018314,-0.000839005,-0.000439154,-0.000374426,0.000433794,-0.00188029,-0.00177296,-0.00025216,0.00063594,-0.00177209,-0.000177448,-0.0017759,-0.000480836,0.000129695,-0.000727038,0.000508668,-0.000953554,-0.00138666,0.000541941,-0.00134071,-0.00146621,0.000573098,-0.000614116,-0.00000827201,0.000499119,0.00095074,0.000299005,-0.000226469,0.000332263,-0.00127032,-0.000604712,0.000805977,-0.00143511,0.0000380121,-0.00182277,0.00077834,-0.00144847,0.00155921,-0.00102347,-0.000460448,0.00184013,0.0000454136,0.000194526,-0.00138829,-0.00102278,0.0017572,-0.00144822,-0.000954886,-0.000360329,0.000483696,-0.00198729,0.00198072,-0.00178487,-0.0013632,0.000459548,-0.000905874,-0.0000461679,-0.000108745,-0.0000906467,-0.000771287,0.00149328,0.000427689,0.00060147,-0.000468994,-0.000858951,-0.0000721488,0.00133395,-0.000152285,0.000665414,-0.00181344,-0.000599171,-0.00144709,0.00029703,0.000166888,0.00187503,0.00151005,-0.00131149,0.00133962,0.000528417,0.000163138,0.000593217,-0.000869396,0.000205041,0.000219837,0.000424081,0.00142638,0.000687466,-0.00141793,-0.000387587,0.000915669,-0.000675895,-0.000863452,-0.00130204,-0.0000908364,0.00133648,-0.00105121,-0.00182548,0.0016282,0.00108876,0.0000680453,0.000612969,0.000755708,0.0000972196,-0.000317543,0.000720181,0.000659973,0.000263037,-0.000553058,-0.000085564,-0.000100584,-0.000666685,-0.00092811,-0.000278812,0.000147446,0.000791149,0.00036123,0.00126459,0.0000777658,-0.000927822,-0.0000678246,-0.00051761,0.00089908,-0.00112772,-0.000044697,-0.00046911,0.00011585,-0.000376428,-0.0012972,-0.000236919,0.00074675,0.000208782,0.0000369707,0.000567393,0.000191373,0.00127047,-0.00108738,-0.000286577,-0.00148712,-0.0000893481,0.00000772781,0.000996339,-0.000546245,-0.00108663,-0.000766729,-0.00056852,-0.00119992,0.00184486,-0.000109443,-0.00168998,0.00141607,-0.000155824,-0.00120775,-0.00135257,0.000921985,-0.000213967,0.00124408,0.00052461,0.00015112,0.000785456,-0.00138667,-0.00149316,-0.000912378,-0.000110243,-0.000559397,-0.000171464,-0.000315927,0.000496543,-0.000763088,0.000189308,-0.000591784,0.00159265,0.0000750013,0.000866723,-0.000548827,0.000797506,-0.0000303072,-0.000561625,0.0013245,0.000126934,-0.00105693,0.000250843,-0.000984871,0.00117891,0.000866169,0.00122868,0.00125743,0.000682502,-0.0016037,-0.000496252,-0.00158213,-0.000614311,-0.000794046,-0.000402041,-0.00141687,-0.000571249,-0.00116676,-0.00122571,0.00107363,0.000392774,0.000386828,0.000146878,-0.000220165,0.00129833,-0.0000751256,-0.00103615,0.0000739561,-0.00121088,0.000691386,-0.0000489851,0.000854895,-0.000919023,-0.000904041,0.000214717,0.000418586,0.00119518,-0.000762138,0.00022506,0.00132839,0.000757146,0.000446036,0.000296732,0.000205617,0.000542597,-0.000353727,-0.000855342,0.001699,0.000815525,0.000653486,0.000377756,0.000316789,0.0011222,0.0000518933,0.00139433,0.000244118,-0.000671749,-0.000123779,0.000146528,-0.000262157,0.000498138,0.000418123,0.000764505,-0.000222487,0.00108477,0.00031247,-0.00175839,0.00139422,-0.000738649,-0.000799908,0.00115848,0.000638477,0.00163242,-0.000243235,-0.000627879,-0.000979334,0.0000222351,0.000573425,-0.000589454,-0.000307196,-0.0000897342,0.000276418,-0.000272142,0.000152796,-0.000716625,-0.000535439,0.0000157086,-0.00130846,0.000406622,0.00106954,0.000169139,-0.000813948,-0.00155898,0.00106471,-0.00113029,-0.000297487,0.00035213,0.000137745,-0.000586007,0.00135602,-0.000191648,-0.000365665,0.0000413402,0.00110963,-0.00177295,-0.0013425,0.000599696,-0.000347425,-0.000210662,0.000644164,-0.000748795,0.000485639,0.000619728,-0.000548306,-0.0015784,-0.000484071,-0.000869527,-0.000851974,-0.000732538,0.000843084,-0.00180503,0.0012888,0.000872764,-0.000578362,0.00137741,-0.000483133,-0.000957807,-0.000412508,0.0000738669,0.000944047,-0.000627961,0.000475539,0.00166872,-0.000454477,-0.00140529,-0.000827439,0.000673014,0.000780615,-0.000127097,-0.00141974,0.000097219,0.000972341,0.00144239,0.000023984,0.00105372,0.00120803,-0.000129929,-0.000324521,0.0000952581,0.000194997,0.000264232,0.00151465,-0.000770467,0.000802126,0.0000462041,0.00150416,0.0000543951,0.000863304,0.000419873,0.000714565,0.000951528,-0.000576175,-0.000596579,0.00146991,-0.000241297,-0.0005968,0.00164089,0.000845509,0.000840769,0.00012285,-0.000011433,-0.000147766,0.00182018,0.000516473,-0.000644173,-0.0000586754,0.0015328,-0.0000208886,0.0000732931,0.000589584,-0.000335088,-0.00143045,0.000554937,-0.00096301,-0.00166242,-0.000386631,-0.00086874,0.000159626,-0.000479474,-0.000685944,0.000481829,0.000117146,-0.00127372,-0.000735156,0.000698247,-0.00102411,0.000384961,-0.0014125,-0.00114148,0.000944026,-0.000442698,0.00151474,0.000500018,-0.000109018,0.000622183,-0.000511941,0.00127919,0.000844674,0.000667926,0.000389043,-0.00146462,0.000502366,0.00137303,0.000426913,-0.000984097,-0.000652429,0.00000829288,0.000365468,0.000331696,-0.000458545,0.000858744,-0.00109765,0.000491422,0.0000535394,-0.000503437,0.000153346,0.000144418,0.000746811,0.000283991,-0.00000911525,0.00102531,-0.0000262874,0.00104934,-0.000641378,-0.000221275,0.00135131,-0.00123408,0.000556832,-0.00163512,-0.0000505854,-0.000131919,-0.000213541,-0.000626107,0.000770053,0.000526937,-0.000181425,-0.000730335,-0.0013186,0.000472422,-0.00087447,0.000197435,0.000959083,-0.000402998,-0.00143979,-0.000631136,-0.000518899,-0.00091341,0.000478105,-0.00147525,0.00111098,-0.00174259,-0.00086621,-0.000108231,0.000179965,-0.000271595,-0.00106298,-0.000838457,0.000819881,0.00115559,0.00115672,0.000829813,-0.00023918,-0.0000720705,0.000635563,0.00133472,0.000791445,0.000610656,-0.000588665,0.00015016,-0.000509586,-0.00115092,-0.0012976,-0.000903431,-0.00000990146,0.000832837,0.000633739,0.000467477,-0.00153921,0.00059832,0.000746117,0.00119224,-0.000899614,-0.000742296,0.000587864,0.00059445,0.0000108863,0.00158064,0.000721953,-0.000381668,0.00111884,-0.00048427,-0.00122091,-0.000964495,0.00151331,0.00193214,0.00037228,-0.00152694,0.000578259,-0.00145543,0.000346135,0.00147202,-0.00165288,0.000345248,0.000197841,0.0000284741,0.0004362,-0.000225613,0.000966689,-0.000992802,0.000637621,0.00199061,0.00108915,0.000665645,-0.000706964,-0.00121876,-0.000389831,-0.000642693,-0.000659883,0.000583156,0.000329895,-0.000502622,0.000926254,-0.000235739,0.000421345,-0.000778119,0.00114239,0.000430024,-0.000396856,-0.00000721441,0.00131387,-0.000613428,0.000714212,0.000704923,-0.000199002,0.000793715,-0.000596292,0.000270821,-0.000517786,0.0000193019,0.000155777,0.000507548,-0.000353846,0.00108673,0.0017158,-0.000547866,0.000293103,-0.00132409,0.0000972416,-0.00149845,0.000194513,0.000497203,0.00100959,0.00111201,0.000467173,-0.00180766,-0.000187819,0.000558349,-0.000262507,0.000488376,-0.00058048,-0.000395189,-0.0018787,0.000194596,-0.000283038,0.00184203,0.00062118,0.000646641,0.000137441,-0.000426463,0.00106138,-0.000703934,-0.000308602,-0.00075392,0.00179154,-0.000242178,0.000768542,-0.00105308,0.000856469,0.000218168,-0.000624358,0.00049483,-0.000547579,-0.000100098,0.000443505,-0.000269695,0.000330818,-0.0000630613,-0.000575493,-0.00131682,0.000248397,0.00121571,0.000120586,0.000368631,-0.000958557,0.000480949,0.00097203,-0.00172612,-0.00107382,0.0000879149,-0.00150172,-0.00107988,0.00166161,-0.000726475,-0.00110783,0.00118247,-0.000114714,-0.00077166,-0.00131677,-0.00168809,-0.000183499,-0.00127072,-0.00050214,0.000976988,0.000846963,-0.00144719,-0.000751526,0.000173432,0.000570352,0.000379241,0.0000187881,-0.000552049,0.00176858,-0.000936725,0.000488343,-0.000196773,-0.000449852,-0.000570876,0.000439568,-0.00167496,-0.00142697,-0.000584731,0.000569473,0.000683319,0.00110831,-0.00027135,-0.00188002,0.000630017,-0.000499208,0.00103235,0.0013193,0.000819444,-0.00102462,0.000285934,0.000850072,-0.000690617,-0.00000108533,-0.000112232,-0.00153078,-0.000164975,0.00080176,0.000140671,-0.000289367,0.000521458,-0.000849152,-0.000581803,0.000606704,-0.000650693,-0.00157437,0.000695884,0.0000502164,0.000941814,0.000566696,0.000194385,0.000672844,0.000214569,-0.0000296184,-0.00138624,-0.00191053,0.000418739,-0.000166792,0.000418172,0.00147527,-0.00170489,-0.000454804,0.000658062,0.000821247,0.0000283624,-0.000483513,-0.000656752,-0.0000728043,-0.00111828,0.000604134,-0.00106569,0.00139272,0.000318641,-0.00190488,-0.000726551,-0.00116447,0.00191044,-0.00136207,0.000943788,0.000316086,0.00158451,-0.0010302,0.00049886,0.00126194,0.00154007,-0.00104536,0.000725628,0.000142824,0.000193622,-0.000119172,0.000757862,0.000605199,-0.00104209,-0.000163592,0.000623378,-0.00139504,0.00107046,0.00120148,-0.00115552,0.000612059,0.00148334,-0.000642311,-0.00147131,-0.00125226,0.000307525,-0.000855298,-0.000478332,-0.00153829,0.0003948,0.00152105,-0.000289918,-0.00168499,0.000459671,-0.0000792957,-0.000203926,-0.000218365,-0.000882849,-0.000227429,0.000623745,0.00112671,0.000464568,0.000589925,0.00128338,-0.00196492,-0.00169723,-0.000468642,0.00143138,-0.00148412,0.00165426,0.00110461,0.000528256,0.00106778,0.00110807,-0.000751084,0.00116893,0.000647737,0.000301772,-0.000527149,0.000376911,0.00115928,-0.0011041,0.000794648,-0.00138776,0.000518104,-0.0000779474,-0.000122372,0.000482519,0.000367164,0.000979204,-0.000281425,0.0007812,0.000741399,0.000637811,-0.0000653093,0.000346136,-0.0000697918,0.00137211,0.000422744,0.000605772,-0.00084956,-0.0000828168,-0.000269587,-0.000320831,-0.000544082,0.00170604,0.00112239,0.000322925,0.00184348,-0.0000918005,0.000198243,0.0011329,-0.00035544,0.000446142,-0.000782264,0.000226241,0.000435403,0.00110409,-0.0009129,0.000240597,-0.000456963,0.000767099,-0.00102002,0.000258573,-0.00188433,-0.00159278,0.000469508,0.000525662,0.00021512,0.00117409,0.00143813,0.0000574444,0.0000449568,-0.000288549,-0.00105491,-0.000968236,0.000241559,0.00100798,0.00140431,-0.00160884,-0.00057689,-0.000243285,-0.000825044,0.0018581,0.000753857,0.00142299,-0.000517805,-0.000892435,0.000049001,0.000867522,-0.000535191,0.00124564,-0.000996084,0.000817795,-0.00166854,-0.0000269151,-0.000556804,0.000364017,0.000116464,-0.00071379,-0.000353046,-0.00120625,0.00101447,-0.000848804,0.00110068,0.000561882,-0.000431663,0.000519466,-0.00055859,0.000951604,-0.00101846,-0.00123051,0.00069334,0.000406394,-0.000181202,-0.00118464,-0.000623832,0.00111546,0.000838498,-0.000446559,0.000726261,0.000469838,-0.000756694,0.000509681,0.00100307,-0.000561561,0.000230863,0.000485945,-0.00123647,-0.000248417,0.000452712,0.000829469,0.00146137,0.000604679,0.000413907,-0.000705154,0.000534838,0.000444148,0.000491913,0.000977125,0.000955249,0.00120779,0.0000360333,-0.000707476,-0.00130906,0.000111318,0.00171459,0.0017601,0.0010625,0.000790412,-0.00101907,-0.000582916,-0.000150896,0.000558434,-0.00031832,0.0000418735,0.00163373,0.000990448,-0.00130772,0.000685195,-0.00109613,-0.000218519,-0.000924948,-0.00157462,-0.001042,0.0000233269,0.000483113,-0.000253645,-0.00155675,0.000326294,-0.00022758,-0.000421171,-0.000735471,0.00175213,-0.000891948,-0.000112995,-0.000385041,0.00109004,0.00195035,0.00173167,-0.000901752,0.00169012,0.000392234,-0.0006568,0.0000744693,0.000911733,-0.00100798,-0.000201265,0.00129911,0.00124096,-0.00140045,0.0000587845,0.000572333,0.0014333,0.00114032,-0.000589335,-0.000593066,0.00112973,0.00180252,0.000366482,0.000171273,-0.0000330948,-0.00169791,-0.000521908,0.000416335,0.000479849,-0.0011595,0.000111558,0.000683798,-0.000208834,0.000841485,-0.00101265,-0.000670407,-0.000634865,-0.0000882544,0.000130753,-0.00132608,0.000756946,-0.00162854,-0.000362472,0.000400712,-0.000471443,0.000266596,-0.00155684,-0.0000490013,0.000587123,-0.0000477372,0.000396185,0.00134433,0.000603601,-0.000123524,-0.000115242,0.000503412,0.00142005,-0.00194746,0.000504903,0.000676835,0.000661855,-0.000587876,0.0000184646,0.000621909,-0.000173279,-0.0000242639,-0.000294901,-0.000430941,0.000628443,0.0006093,-0.00129419,0.000185719,-0.00034895,0.000523165,-0.000761852,0.000835593,-0.00104574,0.000814026,0.000773988,0.000934417,0.00103406,0.000799445,0.000115083,0.000961943,-0.00072446,-0.00041519,-0.00109711,0.00199981,0.000688966,-0.000647404,0.00143632,-0.00173683,-0.00019238,-0.000533952,0.00182861,0.00116927,-0.000516094,-0.000505018,-0.0000883187,0.000372084,0.000911309,-0.00114748,0.000817753,0.00146443,0.000625702,0.00151586,0.00149732,0.00074505,0.000181628,-0.000419116,0.000160039,0.000753031,-0.000716747,0.00121593,-0.000451191,0.00179885,-0.000349842,-0.00059344,0.000384329,-0.000368638,-0.000656732,-0.000660884,0.000667036,0.000460016,-0.00143225,0.00105491,-0.000668276,-0.00126977,-0.000101993,-0.000180918,-0.0014508,-0.000195902,0.0000793958,-0.000215557,0.00159855,0.000389122,0.000184523,0.00128923,-0.00127203,0.0000210356,-0.000482792,-0.000679966,0.000452869,-0.0011122,0.0000129764,0.00124412,-0.000192537,-0.000186412,0.000262082,0.000655599,-0.000698264,0.00155599,0.000429579,-0.00026071,0.0000280027,0.000361446,0.000428111,0.000300118,-0.000499238,-0.00105623,-0.00150002,-0.000392977,0.00171273,-0.00158388,0.00141726,0.0011361,0.00102618,0.00181492,-0.000267936,0.0000994752,0.000735187,-0.000139117,-0.000956087,-0.00150572,0.00000284755,0.000955783,-0.000125165,0.0000985409,-0.00025031,-0.000289716,0.0000543263,0.000615201,0.000973981,-0.000645678,0.00146709,-0.00185424,0.000286985,0.000308483,-0.000500723,-0.000134695,0.000545503,0.000914869,0.00164598,0.000648387,-0.0000977849,0.000685045,-0.000751616,0.000199263,-0.000524184,0.000117625,0.000227081,-0.000182785,0.000677549,0.0000888383,0.000204967,-0.00129818,0.000675685,0.00146508,-0.000104855,-0.00136736,0.000887201,-0.00136708,0.000212693,0.000209418,-0.00144735,0.00152683,-0.000583272,0.00169839,-0.00138029,0.00102198,0.000201231,0.000278975,-0.000472288,-0.00101918,-0.0000699201,0.000547555,0.000306102,0.000244082,0.00155456,0.000541133,0.0000680261,-0.000353245,0.000300315,0.00168104,0.00129523,0.00133915,-0.00106951,0.00157235,-0.000246775,0.00168635,-0.000515484,-0.000580013,-0.00159606,-0.000420822,-0.0000389577,-0.00115415,0.00155775,-0.000729676,-0.000533396,0.000988238,-0.000929894,0.000658631,0.00181003,0.000542837,-0.0000309181,-0.000562021,0.000738509,0.0000702001,-0.000478389,0.000284481,-0.00134789,-0.00129027,0.0000690662,0.000356586,-0.0018575,0.000886439,0.00115505,-0.000752113,-0.00102689,-0.000846187,-0.000991992,-0.000229449,-0.00152941,-0.00119887,-0.00118212,-0.000403296,0.00190204,0.00113671,0.000324711,-0.00101669,-0.00066162,-0.0000790495,-0.000965021,-0.00082345,-0.000742582,-0.000246446,-0.00115569,0.000911109,-0.0000691248,0.000982884,0.000998638,-0.00130299,0.00174999,-0.00104283,-0.000387173,-0.000748101,-0.000733227,0.00165661,0.0000898117,-0.00113511,-0.000485817,-0.00181865,-0.000179618,0.000230764,-0.00043628,-0.000262215,0.000875482,0.000429736,-0.000746051,0.00193962,-0.000512408,0.000165035,0.00121899,0.00128704,-0.00107981,-0.000713993,0.000698837,-0.000902781,0.000241041,0.00174197,-0.00160716,0.000296965,-0.000120568,-0.000897505,0.000238757,0.000211976,-0.0000650325,0.00126447,0.00133645,0.000700816,0.0019461,-0.000653153,-0.00168956,0.000208957,-0.00151078,0.00154943,0.000541723,0.000717083,0.000614508,-0.000211659,-0.00112469,0.000311393,0.000621611,-0.000588322,-0.000133933,0.000393509,-0.000232454,0.000106238,0.000183431,-0.000769438,-0.000679372,-0.000537327,-0.000492326,0.000967272,-0.00168897,0.000578019,0.000209275,-0.000699961,0.000462684,0.000268871,-0.00120633,0.000256088,-0.000847421,0.000705915,-0.00074269,-0.000535087,0.000702573,-0.00058507,0.000531562,-0.00141313,0.00069873,-0.000587609,-0.00117427,0.00101815,-0.00104073,-0.000614904,-0.0000417074,0.000186648,0.000386038,0.00100142,0.000553001,0.000915099,0.00186296,-0.00105942,0.000315044,-0.00113786,0.000485299,0.000483543,-0.00000967587,-0.00034586,-0.0016043,0.000616051,-0.000809165,0.000035457,0.00133102,-0.00000465516,-0.000504167,-0.000399523,0.000873967,0.00124535,-0.000615577,0.000243873,-0.000868728,-0.000213266,0.000362377,0.00022537,0.0000459785,0.000229116,-0.000602967,-0.000995784,-0.000250045,-0.000928476,-0.000681834,0.0000321446,-0.000829871,0.0000942275,-0.000587721,0.000433417,-0.000910126,0.000345171,-0.000538764,-0.000245089,-0.00154389,0.00105317,-0.000597704,0.00157788,0.0000433118,-0.000505589,0.00096493,0.000701301,-0.0000897253,0.00105498,0.00180869,-0.000137591,0.000588566,-0.000309959,0.00126238,-0.000909134,-0.000342973,-0.00152853,-0.00178474,-0.00185668,-0.000323809,0.0000304968,0.000564438,0.000302956,-0.00111997,0.00139036,-0.000957689,-0.000783282,0.00140322,0.000463635,0.000530494,-0.00114338,0.000488018,-0.000430149,-0.00109346,-0.000252427,0.000952627,0.00146563,0.00001044,-0.00183669,0.000746569,-0.00143944,-0.000799937,-0.000100299,-0.000981503,-0.0019682,-0.000608892,-0.00094777,-0.00155452,-0.0000196544,-0.000740638,0.000408205,0.000341424,0.000383496,0.000318533,-0.000526835,0.000621896,-0.000640448,-0.00169931,-0.00186949,-0.000263991,-0.000778379,-0.000372746,0.00072085,0.000123317,-0.00039604,-0.00154628,0.000829595,0.00131273,-0.00136583,-0.000149691,0.00123432,0.00150986,-0.00167992,-0.000963511,-0.000130273,0.000548776,0.00012495,0.000442952,-0.000315579,-0.000212349,-0.000406264,-0.000377979,0.000171824,-0.0008989,-0.000718202,-0.0013607,-0.00026456,-0.000486039,-0.000907156,-0.00184912,0.000837827,-0.0000820068,0.00105961,-0.000399373,0.00128598,0.000259086,0.000569885,-0.00194374,0.00126389,0.000953763,-0.0011601,-0.000947108,0.000877291,0.00000429881,-0.00119686,0.00134673,-0.000339338,0.000743316,-0.00147352,-0.000324524,0.0000393489,-0.000663433,-0.000639543,-0.000866555,0.000273769,0.000605397,0.000331879,0.000770423,0.00102507,-0.000271956,-0.00107971,0.000820763,0.000449778,-0.000505182,0.00112763,-0.00130973,-0.000331107,0.000819896,-0.0000630934,-0.000754355,-0.00112304,-0.000329958,-0.0000941328,0.000175927,-0.000233565,0.000216514,0.000133227,0.00143126,-0.000164945,-0.000909532,0.00083691,-0.0016549,-0.000302275,0.000120975,-0.000861028,-0.000316521,-0.000426046,0.000240013,-0.000385531,0.00104011,0.000118602,-0.000736767,-0.000966167,-0.00107778,-0.000203622,0.0000353216,-0.000807679,0.00142519,0.00117039,0.000529697,0.000670893,-0.000943445,0.00175397,0.000256471,0.000157694,0.000444396,-0.0000786863,-0.000850713,-0.00133958,0.000563236,-0.00156028,-0.000789026,0.000945565,-0.0000140243,0.000195249,-0.000219786,-0.000234031,0.00008298,-0.000834757,-0.000670047,-0.00085721,-0.00057077,-0.00026598,0.0009946,0.00118418,0.000956345,0.000245625,0.00105173,0.00107052,0.000775546,0.000764146,0.000474389,0.000295376,0.000961817,0.000347967,0.000734468,0.000134494,0.000478386,-0.00135265,0.000797635,0.00065321,-0.00186063,0.0000821238,0.00026947,0.00011574,-0.000210625,0.00100538,0.0000591205,0.000166876,0.000493023,-0.000472772,0.00109271,-0.00184224,-0.00152752,0.000243308,-0.00140697,-0.000574283,-0.000939465,-0.00184681,0.000263084,0.00154878,-0.000260596,0.000366846,0.000638629,0.0000229923,0.000801805,0.000921115,0.000711024,0.000768379,-0.00193132,0.000697772,0.000552211,-0.000652121,0.000456549,0.0000324426,-0.000161238,-0.00118687,-0.00136208,-0.000440629,-0.00166943,0.000221933,-0.00000879034,0.000438116,-0.000663809,0.000465276,-0.000213502,0.000731207,0.000282544,-0.00174634,0.00135031 diff --git a/xdl/test/python/unit_test/ps_ops/ckpt/ckpt_standard/dense&kernel&accumulation b/xdl/test/python/unit_test/ps_ops/ckpt/ckpt_standard/dense&kernel&accumulation new file mode 100644 index 00000000..95f2be83 --- /dev/null +++ b/xdl/test/python/unit_test/ps_ops/ckpt/ckpt_standard/dense&kernel&accumulation @@ -0,0 +1 @@ +-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,0,0,-0,0,-0,-0,-0,-0,-0,-0,-0,0,-0,-0,0,-0,0,0,-0,0,-0,-0,-0,-0,0,-0,0,0,-0,0,0,-0,-0,0,0,0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,0,-0,-0,-0,0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,-0,-0,-0,-0,0,-0,0,-0,0,0,-0,-0,-0,0,-0,0,-0,-0,-0,0,0,-0,-0,0,-0,-0,0,0,-0,0,-0,0,-0,0,-0,-0,-0,0,-0,0,0,-0,-0,0,0,-0,0,-0,0,0,0,0,-0,-0,-0,-0,0,-0,0,0,0,0,0,0,0,-0,0,0,-0,0,-0,-0,0,-0,0,0,0,0,-0,0,-0,-0,0,-0,-0,0,0,-0,-0,-0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,-0,0,0,0,-0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,0,0,0,0,-0,0,-0,0,0,0,0,0,-0,0,-0,0,-0,-0,0,0,0,-0,0,-0,0,0,0,-0,-0,0,0,-0,0,0,-0,-0,0,-0,0,-0,0,-0,0,0,0,-0,0,-0,-0,0,0,-0,-0,0,-0,0,-0,-0,-0,-0,0,0 diff --git a/xdl/test/python/unit_test/ps_ops/ckpt/ckpt_standard/emb2 b/xdl/test/python/unit_test/ps_ops/ckpt/ckpt_standard/emb2 new file mode 100644 index 00000000..f3f72e9f --- /dev/null +++ b/xdl/test/python/unit_test/ps_ops/ckpt/ckpt_standard/emb2 @@ -0,0 +1,49 @@ +0,8,-0.00122064,0.000786952,-0.00130245,0.00067982,-0.000719293,0.000513744,0.00058648,0.00000735173 +0,36,-0.000333569,-0.000402242,0.000631229,0.00170233,0.000961394,-0.0014132,-0.000656905,0.000165634 +0,48,0.000360543,0.000442801,-0.000357308,-0.000212897,0.00161441,-0.000339376,-0.000785099,0.000949445 +0,16,-0.000626772,-0.000739705,0.0000855334,-0.000831555,0.00172617,0.000748104,-0.000659167,0.000634341 +0,32,-0.000849079,-0.00170433,-0.000955112,-0.00170322,-0.000843388,0.000671623,-0.000437592,-0.000946085 +0,28,-0.000565935,0.000615678,-0.000726944,-0.00158319,-0.000186041,-0.000500402,-0.000879545,0.00055097 +0,20,0.00195215,0.000447417,0.00095067,0.0010152,-0.000571456,0.00132048,-0.000876266,0.000975916 +0,12,-0.000214213,0.000380639,0.00105054,-0.00139965,-0.000902571,0.00114655,-0.000479975,-0.00165699 +0,44,0.00000563833,0.000454858,-0.00065734,-0.000135377,-0.00055496,-0.00174822,-0.000226461,-0.000160685 +0,10,0.000710857,0.000426823,0.001154,0.000579382,-0.000284535,-0.00138646,-0.000877801,0.000475955 +0,2,-0.000147199,-0.00188124,0.000460898,-0.00049024,-0.0009496,0.0015914,-0.000248668,0.00121112 +0,34,0.000942517,0.00155599,-0.00191155,0.000811014,0.00105028,-0.00022994,0.000115965,-0.0013638 +0,18,0.000613628,-0.00152867,-0.000507273,0.0000575028,0.00155677,-0.000102919,0.000370329,0.00124317 +0,38,0.00051539,-0.000305181,-0.00123245,0.00166845,-0.000381066,0.00102506,-0.0000865528,0.000890616 +0,42,0.000108827,-0.00106936,-0.000198147,0.000444506,0.000774812,-0.000605076,0.0000164686,-0.000763695 +0,26,-0.00100088,0.000622186,-0.00178689,0.000575404,-0.000261924,0.00146113,0.000458893,0.000509167 +0,6,-0.000253681,-0.00083373,0.000615356,0.000532619,0.000144336,0.000257915,0.00043903,-0.000779675 +0,4,0.00043616,-0.000167231,0.00159501,-0.0000915569,0.000247062,-0.00106867,-0.000583421,-0.000403892 +0,24,-0.000672695,0.000278957,-0.00146487,0.0000792318,0.000245195,-0.000766711,-0.00138131,0.0000929452 +0,30,-0.00167353,0.00071295,-0.000230719,0.000897446,0.000571516,0.000117238,0.000452728,-0.00173582 +0,46,-0.000533684,-0.00040086,-0.00144291,0.000853643,0.00109643,0.00020963,-0.000615997,-0.000797766 +0,14,0.000585399,0.0000268727,0.00146024,-0.00041227,0.0000791869,-0.00088814,-0.000608854,-0.00115769 +0,22,-0.000407623,-0.0007978,-0.000515678,-0.000688702,0.00133291,0.00141403,-0.00124564,0.00113773 +0,49,0.00024599,-0.00139885,-0.00134118,0.000680574,0.000822545,0.000205223,-0.00199289,-0.00160549 +0,5,0.000252519,0.00172277,-0.000774048,0.00105482,0.00157968,0.00068246,0.000302345,0.000272061 +0,17,0.000332206,0.000850077,-0.000113361,0.000799429,-0.0000131923,-0.00127533,-0.000825769,-0.000156705 +0,33,0.00152963,0.000841445,-0.00112162,-0.000973657,-0.00128374,0.000422527,0.000950569,0.000195189 +0,1,0.00075814,-0.000587209,0.000903484,-0.000108747,-0.00140954,-0.000315132,0.000294968,0.0000869167 +0,40,0.00101958,-0.000410531,-0.000989156,0.000498749,-0.000804316,0.00051152,0.000895026,0.000341662 +0,45,-0.000322203,0.0000955498,-0.000413361,-0.000395182,0.000295093,0.000364574,0.000224402,0.000822664 +0,19,-0.00103563,0.000662192,-0.00182366,-0.000496727,-0.000350139,0.000385288,0.00037764,-0.000342287 +0,13,0.000889658,0.00136757,0.000250672,0.000811663,0.000141562,0.00149958,0.000337377,0.000791678 +0,7,-0.000627439,0.000323514,-0.000889976,0.00166839,0.000941792,-0.000283746,0.00134405,-0.000332387 +0,47,0.000368997,-0.00131334,-0.000671208,-0.0000709974,-0.000811614,0.000872083,-0.00110866,0.00124579 +0,35,0.000377375,0.0000575534,0.00024383,0.00188709,-0.00109969,-0.000526684,-0.000810978,0.000859606 +0,3,-0.000269341,-0.000681135,0.00158194,0.000673177,-0.00012071,-0.00107477,-0.00196249,0.00057643 +0,21,-0.000545799,0.000363359,-0.000996135,-0.000979275,0.000245788,-0.00164952,0.00131344,0.000241195 +0,29,0.000508612,0.000855692,0.0000443237,-0.000381697,-0.000195357,0.00040877,0.0000891462,-0.000385841 +0,27,0.00151015,-0.0013355,0.00156885,0.000183032,-0.0010015,0.000260447,0.00131999,0.0014149 +0,31,-0.00107524,0.000457745,0.00163474,-0.0014891,-0.00165544,-0.000383712,0.000736342,0.000219888 +0,43,0.000863689,-0.000485066,-0.00125901,0.000764543,-0.000576094,-0.000440971,0.000580035,0.000936413 +0,25,-0.00104292,-0.00010936,-0.00171131,0.000323557,0.00170108,-0.000816313,0.00104121,0.000373546 +0,15,0.000512246,-0.000333859,0.0000884758,-0.000320762,0.0000200917,0.000244293,0.000270312,0.000420948 +0,37,-0.000201442,0.00125545,0.0000383429,-0.00014956,-0.000201054,0.00131812,0.000207073,-0.000348482 +0,41,-0.000598096,0.00010944,0.000883715,-0.00121188,-0.0010052,0.0013767,-0.000230849,-0.000218533 +0,9,-0.000567076,0.000245513,0.00184858,0.000126402,0.00160834,-0.0016991,-0.000958186,0.00037194 +0,23,-0.000915858,-0.000524326,-0.000131364,-0.000292422,0.000963874,0.000375571,0.000735867,0.0000996958 +0,39,0.000189471,-0.000719253,-0.00124747,-0.00125807,0.000524775,-0.0010452,0.000551221,-0.0000534098 +0,11,0.000532252,0.0000307481,0.00065371,-0.000223169,-0.00148284,-0.000368691,0.000253769,0.00112011 diff --git a/xdl/test/python/unit_test/ps_ops/ckpt/ckpt_standard/emb2&accumulation b/xdl/test/python/unit_test/ps_ops/ckpt/ckpt_standard/emb2&accumulation new file mode 100644 index 00000000..62a2f121 --- /dev/null +++ b/xdl/test/python/unit_test/ps_ops/ckpt/ckpt_standard/emb2&accumulation @@ -0,0 +1,49 @@ +0,8,0,0,-0,-0,-0,0,0,-0 +0,36,-0,-0,0,0,0,-0,-0,0 +0,48,-0,-0,0,0,0,-0,-0,0 +0,16,0,0,-0,-0,-0,0,0,-0 +0,32,0,0,-0,-0,-0,0,0,-0 +0,28,0,0,-0,-0,-0,0,0,-0 +0,20,-0,-0,0,0,0,-0,-0,0 +0,12,0,0,-0,-0,-0,0,0,-0 +0,44,-0,-0,0,0,0,-0,-0,0 +0,10,0,0,-0,-0,-0,0,0,-0 +0,2,0,0,-0,-0,-0,0,0,-0 +0,34,0,0,-0,-0,-0,0,0,-0 +0,18,0,0,-0,-0,-0,0,0,-0 +0,38,0,0,-0,-0,-0,0,0,-0 +0,42,0,0,-0,-0,-0,0,0,-0 +0,26,0,0,-0,-0,-0,0,0,-0 +0,6,0,0,-0,-0,-0,0,0,-0 +0,4,0,0,-0,-0,-0,0,0,-0 +0,24,0,0,-0,-0,-0,0,0,-0 +0,30,0,0,-0,-0,-0,0,0,-0 +0,46,-0,-0,0,0,0,-0,-0,0 +0,14,0,0,-0,-0,-0,0,0,-0 +0,22,0,0,-0,-0,-0,0,0,-0 +0,49,-0,-0,0,0,0,-0,-0,0 +0,5,0,0,-0,-0,-0,0,0,-0 +0,17,0,0,-0,-0,-0,0,0,-0 +0,33,-0,-0,0,0,0,-0,-0,0 +0,1,-0,-0,0,0,0,-0,-0,0 +0,40,-0,-0,0,0,0,-0,-0,0 +0,45,0,0,-0,-0,-0,0,0,-0 +0,19,-0,-0,0,0,0,-0,-0,0 +0,13,0,0,-0,-0,-0,0,0,-0 +0,7,0,0,-0,-0,-0,0,0,-0 +0,47,-0,-0,0,0,0,-0,-0,0 +0,35,-0,-0,0,0,0,-0,-0,0 +0,3,0,0,-0,-0,-0,0,0,-0 +0,21,0,0,-0,-0,-0,0,0,-0 +0,29,0,0,-0,-0,-0,0,0,-0 +0,27,0,0,-0,-0,-0,0,0,-0 +0,31,-0,-0,0,0,0,-0,-0,0 +0,43,0,0,-0,-0,-0,0,0,-0 +0,25,-0,-0,0,0,0,-0,-0,0 +0,15,0,0,-0,-0,-0,0,0,-0 +0,37,0,0,-0,-0,-0,0,0,-0 +0,41,-0,-0,0,0,0,-0,-0,0 +0,9,0,0,-0,-0,-0,0,0,-0 +0,23,0,0,-0,-0,-0,0,0,-0 +0,39,0,0,-0,-0,-0,0,0,-0 +0,11,-0,-0,0,0,0,-0,-0,0 diff --git a/xdl/test/python/unit_test/ps_ops/test_ps_apply_moving_average_op.py b/xdl/test/python/unit_test/ps_ops/test_ps_apply_moving_average_op.py index 733743ce..61117c29 100644 --- a/xdl/test/python/unit_test/ps_ops/test_ps_apply_moving_average_op.py +++ b/xdl/test/python/unit_test/ps_ops/test_ps_apply_moving_average_op.py @@ -1,11 +1,11 @@ -# Copyright (C) 2016-2018 Alibaba Group Holding Limited -# +# Copyright 2018 Alibaba Group. All Rights Reserved. +# # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. diff --git a/xdl/test/python/unit_test/ps_ops/test_ps_assign_add_op.py b/xdl/test/python/unit_test/ps_ops/test_ps_assign_add_op.py index d9729d48..22da6159 100644 --- a/xdl/test/python/unit_test/ps_ops/test_ps_assign_add_op.py +++ b/xdl/test/python/unit_test/ps_ops/test_ps_assign_add_op.py @@ -1,11 +1,11 @@ -# Copyright (C) 2016-2018 Alibaba Group Holding Limited -# +# Copyright 2018 Alibaba Group. All Rights Reserved. +# # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. diff --git a/xdl/test/python/unit_test/ps_ops/test_ps_assign_op.py b/xdl/test/python/unit_test/ps_ops/test_ps_assign_op.py index 74175c8c..095d6f4d 100644 --- a/xdl/test/python/unit_test/ps_ops/test_ps_assign_op.py +++ b/xdl/test/python/unit_test/ps_ops/test_ps_assign_op.py @@ -1,11 +1,11 @@ -# Copyright (C) 2016-2018 Alibaba Group Holding Limited -# +# Copyright 2018 Alibaba Group. All Rights Reserved. +# # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. diff --git a/xdl/test/python/unit_test/ps_ops/test_ps_assign_sub_op.py b/xdl/test/python/unit_test/ps_ops/test_ps_assign_sub_op.py index 810a2e0c..5caa96e4 100644 --- a/xdl/test/python/unit_test/ps_ops/test_ps_assign_sub_op.py +++ b/xdl/test/python/unit_test/ps_ops/test_ps_assign_sub_op.py @@ -1,11 +1,11 @@ -# Copyright (C) 2016-2018 Alibaba Group Holding Limited -# +# Copyright 2018 Alibaba Group. All Rights Reserved. +# # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. diff --git a/xdl/test/python/unit_test/ps_ops/test_ps_constant_initializer_op.py b/xdl/test/python/unit_test/ps_ops/test_ps_constant_initializer_op.py index 41843f06..925e2058 100644 --- a/xdl/test/python/unit_test/ps_ops/test_ps_constant_initializer_op.py +++ b/xdl/test/python/unit_test/ps_ops/test_ps_constant_initializer_op.py @@ -1,11 +1,11 @@ -# Copyright (C) 2016-2018 Alibaba Group Holding Limited -# +# Copyright 2018 Alibaba Group. All Rights Reserved. +# # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. diff --git a/xdl/test/python/unit_test/ps_ops/test_ps_convert_ckpt_variable_op.py b/xdl/test/python/unit_test/ps_ops/test_ps_convert_ckpt_variable_op.py new file mode 100644 index 00000000..e9e841cd --- /dev/null +++ b/xdl/test/python/unit_test/ps_ops/test_ps_convert_ckpt_variable_op.py @@ -0,0 +1,50 @@ +# Copyright 2018 Alibaba Group. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +import xdl +import unittest +import numpy as np +from xdl.python.lib.datatype import * +from xdl.python.lib.graph import execute +import filecmp +import sys, os + +def cmp_file(file1_str, file2_str): + with open(file1_str, 'r') as file1: + content1 = file1.read().splitlines() + with open(file2_str, 'r') as file2: + content2 = file2.read().splitlines() + return content1 == content2 + +class TestPsSaveAndRestoreOp(unittest.TestCase): + def test_all(self): + pwd = sys.path[0] + variables=['emb2', 'dense/kernel', 'dense/bias'] + with xdl.model_scope('train'): + xdl.convert_ps_variable([x for x in variables], pwd + "/ckpt/ckpt_in", pwd + "/ckpt/ckpt_out", True) + self.assertTrue(cmp_file(pwd + "/ckpt/ckpt_standard/emb2", pwd + "/ckpt/ckpt_out/emb2")) + self.assertTrue(cmp_file(pwd + "/ckpt/ckpt_standard/emb2&accumulation", pwd + "/ckpt/ckpt_out/emb2&accumulation")) + self.assertTrue(cmp_file(pwd + "/ckpt/ckpt_standard/dense&kernel", pwd + "/ckpt/ckpt_out/dense&kernel")) + self.assertTrue(cmp_file(pwd + "/ckpt/ckpt_standard/dense&kernel&accumulation", pwd + "/ckpt/ckpt_out/dense&kernel&accumulation")) + self.assertTrue(cmp_file(pwd + "/ckpt/ckpt_standard/dense&bias", pwd + "/ckpt/ckpt_out/dense&bias")) + self.assertTrue(cmp_file(pwd + "/ckpt/ckpt_standard/dense&bias&accumulation", pwd + "/ckpt/ckpt_out/dense&bias&accumulation")) + os.system("rm -r " + pwd + "/ckpt/ckpt_out") + +def suite(): + return unittest.TestLoader().loadTestsFromTestCase(TestPsSaveAndRestoreOp) + +if __name__ == '__main__': + unittest.TextTestRunner().run(suite()) + diff --git a/xdl/test/python/unit_test/ps_ops/test_ps_dense_apply_adagrad_op.py b/xdl/test/python/unit_test/ps_ops/test_ps_dense_apply_adagrad_op.py index b04a910c..187892fc 100644 --- a/xdl/test/python/unit_test/ps_ops/test_ps_dense_apply_adagrad_op.py +++ b/xdl/test/python/unit_test/ps_ops/test_ps_dense_apply_adagrad_op.py @@ -1,11 +1,11 @@ -# Copyright (C) 2016-2018 Alibaba Group Holding Limited -# +# Copyright 2018 Alibaba Group. All Rights Reserved. +# # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. diff --git a/xdl/test/python/unit_test/ps_ops/test_ps_dense_apply_adam_op.py b/xdl/test/python/unit_test/ps_ops/test_ps_dense_apply_adam_op.py index fc4365fd..4a9c9bbf 100644 --- a/xdl/test/python/unit_test/ps_ops/test_ps_dense_apply_adam_op.py +++ b/xdl/test/python/unit_test/ps_ops/test_ps_dense_apply_adam_op.py @@ -1,11 +1,11 @@ -# Copyright (C) 2016-2018 Alibaba Group Holding Limited -# +# Copyright 2018 Alibaba Group. All Rights Reserved. +# # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -35,6 +35,7 @@ def test_all(self): var_type="index") execute(op) ret = execute(var.value) + print(ret) self.assertTrue((ret == np.array([0.90000004,0.90000004,0.90000004,0.90000004], dtype=np.float32)).all()) execute(op) ret = execute(var.value) diff --git a/xdl/test/python/unit_test/ps_ops/test_ps_dense_apply_ftrl_op.py b/xdl/test/python/unit_test/ps_ops/test_ps_dense_apply_ftrl_op.py index 70265ce3..49d63c58 100644 --- a/xdl/test/python/unit_test/ps_ops/test_ps_dense_apply_ftrl_op.py +++ b/xdl/test/python/unit_test/ps_ops/test_ps_dense_apply_ftrl_op.py @@ -1,11 +1,11 @@ -# Copyright (C) 2016-2018 Alibaba Group Holding Limited -# +# Copyright 2018 Alibaba Group. All Rights Reserved. +# # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. diff --git a/xdl/test/python/unit_test/ps_ops/test_ps_dense_apply_momentum_op.py b/xdl/test/python/unit_test/ps_ops/test_ps_dense_apply_momentum_op.py index 4a315bf7..f064753c 100644 --- a/xdl/test/python/unit_test/ps_ops/test_ps_dense_apply_momentum_op.py +++ b/xdl/test/python/unit_test/ps_ops/test_ps_dense_apply_momentum_op.py @@ -1,11 +1,11 @@ -# Copyright (C) 2016-2018 Alibaba Group Holding Limited -# +# Copyright 2018 Alibaba Group. All Rights Reserved. +# # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. diff --git a/xdl/test/python/unit_test/ps_ops/test_ps_identity_initializer_op.py b/xdl/test/python/unit_test/ps_ops/test_ps_identity_initializer_op.py index 2cae4cdc..1918a19e 100644 --- a/xdl/test/python/unit_test/ps_ops/test_ps_identity_initializer_op.py +++ b/xdl/test/python/unit_test/ps_ops/test_ps_identity_initializer_op.py @@ -1,11 +1,11 @@ -# Copyright (C) 2016-2018 Alibaba Group Holding Limited -# +# Copyright 2018 Alibaba Group. All Rights Reserved. +# # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. diff --git a/xdl/test/python/unit_test/ps_ops/test_ps_is_initialized_op.py b/xdl/test/python/unit_test/ps_ops/test_ps_is_initialized_op.py index 6f5a84f8..71e8de98 100644 --- a/xdl/test/python/unit_test/ps_ops/test_ps_is_initialized_op.py +++ b/xdl/test/python/unit_test/ps_ops/test_ps_is_initialized_op.py @@ -1,11 +1,11 @@ -# Copyright (C) 2016-2018 Alibaba Group Holding Limited -# +# Copyright 2018 Alibaba Group. All Rights Reserved. +# # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. diff --git a/xdl/test/python/unit_test/ps_ops/test_ps_mark_and_filter_op.py b/xdl/test/python/unit_test/ps_ops/test_ps_mark_and_filter_op.py deleted file mode 100644 index 2f3806e8..00000000 --- a/xdl/test/python/unit_test/ps_ops/test_ps_mark_and_filter_op.py +++ /dev/null @@ -1,46 +0,0 @@ -# Copyright (C) 2016-2018 Alibaba Group Holding Limited -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -import xdl -import unittest -import numpy as np -from xdl.python.lib.datatype import * -from xdl.python.lib.graph import execute -from xdl.python.framework.variable import VarType - -class TestPsMarkAndFilterOp(unittest.TestCase): - def test_all(self): - var = xdl.Variable(name="w", dtype=DataType.int64, shape=[4,8], - vtype = VarType.Hash, initializer=xdl.Ones()) - execute(xdl.variable_registers()) - execute(xdl.global_initializers()) - mark_op = xdl.ps_mark_op( - var_name = "w", - ids = np.array([[10,10],[10,10],[12,12]], dtype=np.int64), - pattern = "g", - i = 12) - execute(mark_op) - filter_op = xdl.ps_filter_op( - var_name = "w", - pattern = "i==g", - i = 12, d = 0.5) - execute(filter_op) - -def suite(): - return unittest.TestLoader().loadTestsFromTestCase(TestPsMarkAndFilterOp) - -if __name__ == '__main__': - unittest.TextTestRunner().run(suite()) - diff --git a/xdl/test/python/unit_test/ps_ops/test_ps_pull_op.py b/xdl/test/python/unit_test/ps_ops/test_ps_pull_op.py index dfa1f106..1393b6af 100644 --- a/xdl/test/python/unit_test/ps_ops/test_ps_pull_op.py +++ b/xdl/test/python/unit_test/ps_ops/test_ps_pull_op.py @@ -1,11 +1,11 @@ -# Copyright (C) 2016-2018 Alibaba Group Holding Limited -# +# Copyright 2018 Alibaba Group. All Rights Reserved. +# # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. diff --git a/xdl/test/python/unit_test/ps_ops/test_ps_save_and_restore_op.py b/xdl/test/python/unit_test/ps_ops/test_ps_save_and_restore_op.py index f0e8eac1..7a6b4891 100644 --- a/xdl/test/python/unit_test/ps_ops/test_ps_save_and_restore_op.py +++ b/xdl/test/python/unit_test/ps_ops/test_ps_save_and_restore_op.py @@ -1,11 +1,11 @@ -# Copyright (C) 2016-2018 Alibaba Group Holding Limited -# +# Copyright 2018 Alibaba Group. All Rights Reserved. +# # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. diff --git a/xdl/test/python/unit_test/ps_ops/test_ps_sparse_apply_adagrad_op.py b/xdl/test/python/unit_test/ps_ops/test_ps_sparse_apply_adagrad_op.py index 6ae26b93..e657b3b1 100644 --- a/xdl/test/python/unit_test/ps_ops/test_ps_sparse_apply_adagrad_op.py +++ b/xdl/test/python/unit_test/ps_ops/test_ps_sparse_apply_adagrad_op.py @@ -1,11 +1,11 @@ -# Copyright (C) 2016-2018 Alibaba Group Holding Limited -# +# Copyright 2018 Alibaba Group. All Rights Reserved. +# # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. diff --git a/xdl/test/python/unit_test/ps_ops/test_ps_sparse_apply_adam_op.py b/xdl/test/python/unit_test/ps_ops/test_ps_sparse_apply_adam_op.py index 80fc57bc..640ef052 100644 --- a/xdl/test/python/unit_test/ps_ops/test_ps_sparse_apply_adam_op.py +++ b/xdl/test/python/unit_test/ps_ops/test_ps_sparse_apply_adam_op.py @@ -1,11 +1,11 @@ -# Copyright (C) 2016-2018 Alibaba Group Holding Limited -# +# Copyright 2018 Alibaba Group. All Rights Reserved. +# # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -31,11 +31,12 @@ def test_all(self): learning_rate=np.array(0.1, dtype=np.float), grad=np.array([[1],[2]], dtype=np.float32), indices=np.array([1,2], dtype=np.int32), - lr_decay=True, var_name="w", + lr_decay=True, var_type="index") execute(op) ret = execute(var.value) + print(ret) self.assertTrue((ret == np.array([[1],[0.90000004],[0.90000004],[1]], dtype=np.float32)).all()) execute(op) ret = execute(var.value) diff --git a/xdl/test/python/unit_test/ps_ops/test_ps_sparse_apply_ftrl_op.py b/xdl/test/python/unit_test/ps_ops/test_ps_sparse_apply_ftrl_op.py index a8bb9760..0e79fa8d 100644 --- a/xdl/test/python/unit_test/ps_ops/test_ps_sparse_apply_ftrl_op.py +++ b/xdl/test/python/unit_test/ps_ops/test_ps_sparse_apply_ftrl_op.py @@ -1,11 +1,11 @@ -# Copyright (C) 2016-2018 Alibaba Group Holding Limited -# +# Copyright 2018 Alibaba Group. All Rights Reserved. +# # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. diff --git a/xdl/test/python/unit_test/ps_ops/test_ps_sparse_apply_momentum_op.py b/xdl/test/python/unit_test/ps_ops/test_ps_sparse_apply_momentum_op.py index f2b7c7ef..4592b822 100644 --- a/xdl/test/python/unit_test/ps_ops/test_ps_sparse_apply_momentum_op.py +++ b/xdl/test/python/unit_test/ps_ops/test_ps_sparse_apply_momentum_op.py @@ -1,11 +1,11 @@ -# Copyright (C) 2016-2018 Alibaba Group Holding Limited -# +# Copyright 2018 Alibaba Group. All Rights Reserved. +# # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. diff --git a/xdl/test/python/unit_test/ps_ops/test_ps_sparse_assign_op.py b/xdl/test/python/unit_test/ps_ops/test_ps_sparse_assign_op.py index 827acea0..a68756d4 100644 --- a/xdl/test/python/unit_test/ps_ops/test_ps_sparse_assign_op.py +++ b/xdl/test/python/unit_test/ps_ops/test_ps_sparse_assign_op.py @@ -1,11 +1,11 @@ -# Copyright (C) 2016-2018 Alibaba Group Holding Limited -# +# Copyright 2018 Alibaba Group. All Rights Reserved. +# # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. diff --git a/xdl/test/python/unit_test/ps_ops/test_ps_sparse_pull_op.py b/xdl/test/python/unit_test/ps_ops/test_ps_sparse_pull_op.py index 72c8e896..2b4cef6d 100644 --- a/xdl/test/python/unit_test/ps_ops/test_ps_sparse_pull_op.py +++ b/xdl/test/python/unit_test/ps_ops/test_ps_sparse_pull_op.py @@ -1,11 +1,11 @@ -# Copyright (C) 2016-2018 Alibaba Group Holding Limited -# +# Copyright 2018 Alibaba Group. All Rights Reserved. +# # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -26,9 +26,9 @@ def test_all(self): execute(xdl.variable_registers()) execute(xdl.global_initializers()) op = xdl.ps_sparse_pull_op(var_name="w", - var_type="index", - save_ratio=1.0, + var_type="index", otype=DataType.int32, + save_ratio=np.array(1.0, dtype=np.float32), ids=np.array([1,3], dtype=np.int32)) ret = execute(op) self.assertTrue((ret == np.array([[1,1],[1,1]])).all()) diff --git a/xdl/test/python/unit_test/ps_ops/test_ps_streaming_trigger_dense_op.py b/xdl/test/python/unit_test/ps_ops/test_ps_streaming_trigger_dense_op.py index dd1ec4f8..951096c8 100644 --- a/xdl/test/python/unit_test/ps_ops/test_ps_streaming_trigger_dense_op.py +++ b/xdl/test/python/unit_test/ps_ops/test_ps_streaming_trigger_dense_op.py @@ -1,11 +1,11 @@ -# Copyright (C) 2016-2018 Alibaba Group Holding Limited -# +# Copyright 2018 Alibaba Group. All Rights Reserved. +# # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -19,9 +19,12 @@ from xdl.python.lib.datatype import * from xdl.python.lib.graph import execute +def _string_to_int8(src): + return np.array([ord(ch) for ch in src], dtype=np.int8) + class TestPsStreamingTriggerDenseOp(unittest.TestCase): def test_all(self): - op = xdl.ps_streaming_trigger_dense_op() + op = xdl.ps_streaming_trigger_dense_op(_string_to_int8("inc-1234")) execute(op) def suite(): diff --git a/xdl/test/python/unit_test/ps_ops/test_ps_streaming_trigger_hash_op.py b/xdl/test/python/unit_test/ps_ops/test_ps_streaming_trigger_hash_op.py index 26dddd69..c585edcc 100644 --- a/xdl/test/python/unit_test/ps_ops/test_ps_streaming_trigger_hash_op.py +++ b/xdl/test/python/unit_test/ps_ops/test_ps_streaming_trigger_hash_op.py @@ -1,11 +1,11 @@ -# Copyright (C) 2016-2018 Alibaba Group Holding Limited -# +# Copyright 2018 Alibaba Group. All Rights Reserved. +# # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -19,9 +19,13 @@ from xdl.python.lib.datatype import * from xdl.python.lib.graph import execute + +def _string_to_int8(src): + return np.array([ord(ch) for ch in src], dtype=np.int8) + class TestPsStreamingTriggerHashOp(unittest.TestCase): def test_all(self): - op = xdl.ps_streaming_trigger_hash_op() + op = xdl.ps_streaming_trigger_hash_op(_string_to_int8("inc-1234")) execute(op) def suite(): diff --git a/xdl/test/python/unit_test/ps_ops/test_ps_streaming_trigger_sparse_op.py b/xdl/test/python/unit_test/ps_ops/test_ps_streaming_trigger_sparse_op.py index 58fd29d1..0343d79c 100644 --- a/xdl/test/python/unit_test/ps_ops/test_ps_streaming_trigger_sparse_op.py +++ b/xdl/test/python/unit_test/ps_ops/test_ps_streaming_trigger_sparse_op.py @@ -1,11 +1,11 @@ -# Copyright (C) 2016-2018 Alibaba Group Holding Limited -# +# Copyright 2018 Alibaba Group. All Rights Reserved. +# # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -19,9 +19,12 @@ from xdl.python.lib.datatype import * from xdl.python.lib.graph import execute +def _string_to_int8(src): + return np.array([ord(ch) for ch in src], dtype=np.int8) + class TestPsStreamingTriggerSparseOp(unittest.TestCase): def test_all(self): - op = xdl.ps_streaming_trigger_sparse_op() + op = xdl.ps_streaming_trigger_sparse_op(_string_to_int8("inc-1234")) execute(op) def suite(): diff --git a/xdl/test/python/unit_test/ps_ops/test_ps_synchronizer_ops.py b/xdl/test/python/unit_test/ps_ops/test_ps_synchronizer_ops.py index f8364a21..255cc5e4 100644 --- a/xdl/test/python/unit_test/ps_ops/test_ps_synchronizer_ops.py +++ b/xdl/test/python/unit_test/ps_ops/test_ps_synchronizer_ops.py @@ -1,11 +1,11 @@ -# Copyright (C) 2016-2018 Alibaba Group Holding Limited -# +# Copyright 2018 Alibaba Group. All Rights Reserved. +# # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -20,21 +20,24 @@ from xdl.python.lib.graph import execute class TestPsSynchronizerOps(unittest.TestCase): - def test_all(self): + def test_async(self): as_enter_op = xdl.ps_asynchronize_enter_op( id = np.array(0, dtype=np.int32), staleness = np.array(32, dtype=np.int32), worker_count = np.array(10, dtype=np.int32)) + s_leave_op = xdl.worker_report_finish_op(id = np.array(0, dtype=np.int32)) + execute(as_enter_op) + execute(s_leave_op) + + def test_sync(self): s_enter_op = xdl.ps_synchronize_enter_op( id = np.array(0, dtype=np.int32), worker_count = np.array(10, dtype=np.int32)) - s_leave_op = xdl.ps_synchronize_leave_op(id = np.array(0, dtype=np.int32)) - finish_op = xdl.ps_semi_synchronize_leave_op(id = np.array(0, dtype=np.int32)) - execute(as_enter_op) + finish_op = xdl.worker_report_finish_op(id = np.array(0, dtype=np.int32)) execute(s_enter_op) - execute(s_leave_op) execute(finish_op) + def suite(): return unittest.TestLoader().loadTestsFromTestCase(TestPsSynchronizerOps) diff --git a/xdl/test/python/unit_test/run.sh b/xdl/test/python/unit_test/run.sh new file mode 100644 index 00000000..499a1a3d --- /dev/null +++ b/xdl/test/python/unit_test/run.sh @@ -0,0 +1 @@ +find . -name "*.py" | awk '{cmd="python "$0" --run_mode=local";print(cmd);system(cmd)}' diff --git a/xdl/test/python/unit_test/test_add_sparse_gradient.py b/xdl/test/python/unit_test/test_add_sparse_gradient.py index 8be19678..31a76006 100644 --- a/xdl/test/python/unit_test/test_add_sparse_gradient.py +++ b/xdl/test/python/unit_test/test_add_sparse_gradient.py @@ -1,11 +1,11 @@ -# Copyright (C) 2016-2018 Alibaba Group Holding Limited -# +# Copyright 2018 Alibaba Group. All Rights Reserved. +# # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. diff --git a/xdl/test/python/unit_test/test_all.py b/xdl/test/python/unit_test/test_all.py index 2cc9758e..58c201e9 100644 --- a/xdl/test/python/unit_test/test_all.py +++ b/xdl/test/python/unit_test/test_all.py @@ -1,11 +1,11 @@ -# Copyright (C) 2016-2018 Alibaba Group Holding Limited -# +# Copyright 2018 Alibaba Group. All Rights Reserved. +# # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. diff --git a/xdl/test/python/unit_test/test_auc.py b/xdl/test/python/unit_test/test_auc.py index d5e74d01..95a88259 100644 --- a/xdl/test/python/unit_test/test_auc.py +++ b/xdl/test/python/unit_test/test_auc.py @@ -1,11 +1,11 @@ -# Copyright (C) 2016-2018 Alibaba Group Holding Limited -# +# Copyright 2018 Alibaba Group. All Rights Reserved. +# # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. diff --git a/xdl/test/python/unit_test/test_concat.py b/xdl/test/python/unit_test/test_concat.py new file mode 100644 index 00000000..19369966 --- /dev/null +++ b/xdl/test/python/unit_test/test_concat.py @@ -0,0 +1,74 @@ +# Copyright 2018 Alibaba Group. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +import xdl +import unittest +import numpy as np +from xdl.python.lib.datatype import * + +class TestConcat(unittest.TestCase): + def test_concat_0(self): + a = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]]) + b = np.array([[[11, 12], [13, 14]], [[15, 16], [17, 18]]]) + c = np.array([[[21, 22], [23, 24]], [[25, 26], [27, 28]]]) + r = xdl.concat([a, b, c], axis=0) + r = xdl.execute(r) + self.assertTrue(np.alltrue(r == np.concatenate([a, b, c], axis=0))) + + def test_concat_1(self): + a = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]]) + b = np.array([[[11, 12], [13, 14]], [[15, 16], [17, 18]]]) + c = np.array([[[21, 22], [23, 24]], [[25, 26], [27, 28]]]) + r = xdl.concat([a, b, c], axis=1) + r = xdl.execute(r) + self.assertTrue(np.alltrue(r == np.concatenate([a, b, c], axis=1))) + + def test_concat_2(self): + a = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]]) + b = np.array([[[11, 12], [13, 14]], [[15, 16], [17, 18]]]) + c = np.array([[[21, 22], [23, 24]], [[25, 26], [27, 28]]]) + r = xdl.concat([a, b, c], axis=2) + r = xdl.execute(r) + self.assertTrue(np.alltrue(r == np.concatenate([a, b, c], axis=2))) + + def test_concat_x1(self): + a = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]]) + b = np.array([[[11, 12], [13, 14]], [[15, 16], [17, 18]]]) + c = np.array([[[21, 22], [23, 24]], [[25, 26], [27, 28]]]) + r = xdl.concat([a, b, c], axis=-1) + r = xdl.execute(r) + self.assertTrue(np.alltrue(r == np.concatenate([a, b, c], axis=-1))) + + def test_concat_x2(self): + a = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]]) + b = np.array([[[11, 12], [13, 14]], [[15, 16], [17, 18]]]) + c = np.array([[[21, 22], [23, 24]], [[25, 26], [27, 28]]]) + r = xdl.concat([a, b, c], axis=-2) + r = xdl.execute(r) + self.assertTrue(np.alltrue(r == np.concatenate([a, b, c], axis=-2))) + + def test_concat_x3(self): + a = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]]) + b = np.array([[[11, 12], [13, 14]], [[15, 16], [17, 18]]]) + c = np.array([[[21, 22], [23, 24]], [[25, 26], [27, 28]]]) + r = xdl.concat([a, b, c], axis=-3) + r = xdl.execute(r) + self.assertTrue(np.alltrue(r == np.concatenate([a, b, c], axis=-3))) + +def suite(): + return unittest.TestLoader().loadTestsFromTestCase(TestConcat) + +if __name__ == '__main__': + unittest.TextTestRunner().run(suite()) diff --git a/xdl/test/python/unit_test/test_constant.py b/xdl/test/python/unit_test/test_constant.py index 467ce8a2..ff494229 100644 --- a/xdl/test/python/unit_test/test_constant.py +++ b/xdl/test/python/unit_test/test_constant.py @@ -1,11 +1,11 @@ -# Copyright (C) 2016-2018 Alibaba Group Holding Limited -# +# Copyright 2018 Alibaba Group. All Rights Reserved. +# # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. diff --git a/xdl/test/python/unit_test/test_constant.pyc b/xdl/test/python/unit_test/test_constant.pyc deleted file mode 100644 index 50e1fc31..00000000 Binary files a/xdl/test/python/unit_test/test_constant.pyc and /dev/null differ diff --git a/xdl/test/python/unit_test/test_expand_dims.py b/xdl/test/python/unit_test/test_expand_dims.py new file mode 100644 index 00000000..e8419e32 --- /dev/null +++ b/xdl/test/python/unit_test/test_expand_dims.py @@ -0,0 +1,62 @@ +# Copyright 2018 Alibaba Group. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +import xdl +import unittest +import numpy as np +from xdl.python.lib.datatype import * + +class TestExpandDims(unittest.TestCase): + def test_expand_dims_0(self): + value = np.array([[1, 2], [3, 4]]) + a = xdl.expand_dims(value, 0) + a = xdl.execute(a) + self.assertTrue(np.alltrue(a == [[1, 2], [3, 4]])) + + def test_expand_dims_1(self): + value = np.array([[1, 2], [3, 4]]) + a = xdl.expand_dims(value, 1) + a = xdl.execute(a) + self.assertTrue(np.alltrue(a == [[[1, 2]], [[3, 4]]])) + + def test_expand_dims_2(self): + value = np.array([[1, 2], [3, 4]]) + a = xdl.expand_dims(value, 2) + a = xdl.execute(a) + self.assertTrue(np.alltrue(a == [[[1], [2]], [[3], [4]]])) + + def test_expand_dims_x3(self): + value = np.array([[1, 2], [3, 4]]) + a = xdl.expand_dims(value, -3) + a = xdl.execute(a) + self.assertTrue(np.alltrue(a == [[1, 2], [3, 4]])) + + def test_expand_dims_x2(self): + value = np.array([[1, 2], [3, 4]]) + a = xdl.expand_dims(value, -2) + a = xdl.execute(a) + self.assertTrue(np.alltrue(a == [[[1, 2]], [[3, 4]]])) + + def test_expand_dims_x1(self): + value = np.array([[1, 2], [3, 4]]) + a = xdl.expand_dims(value, -1) + a = xdl.execute(a) + self.assertTrue(np.alltrue(a == [[[1], [2]], [[3], [4]]])) + +def suite(): + return unittest.TestLoader().loadTestsFromTestCase(TestExpandDims) + +if __name__ == '__main__': + unittest.TextTestRunner().run(suite()) diff --git a/xdl/test/python/unit_test/test_gauc.py b/xdl/test/python/unit_test/test_gauc.py index 2d60ba38..3c6c33e6 100644 --- a/xdl/test/python/unit_test/test_gauc.py +++ b/xdl/test/python/unit_test/test_gauc.py @@ -1,19 +1,4 @@ -# Copyright (C) 2016-2018 Alibaba Group Holding Limited -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -# Copyright (C) 2016-2018 Alibaba Group Holding Limited +# Copyright 2018 Alibaba Group. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/xdl/test/python/unit_test/test_graident_aggregation.py b/xdl/test/python/unit_test/test_graident_aggregation.py index cfff52b2..bfb79b69 100644 --- a/xdl/test/python/unit_test/test_graident_aggregation.py +++ b/xdl/test/python/unit_test/test_graident_aggregation.py @@ -1,11 +1,11 @@ -# Copyright (C) 2016-2018 Alibaba Group Holding Limited -# +# Copyright 2018 Alibaba Group. All Rights Reserved. +# # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -24,7 +24,7 @@ from xdl.python.utils.collections import READER_HOOKS, get_collection from xdl.python.utils.metrics import add_metrics from xdl.python.training.train_session import QpsMetricsHook, MetricsPrinterHook -from xdl.python.framework.variable import trainable_variables +from xdl.python.framework.variable import trainable_variables_with_scope from xdl.python.sparse_engine.embedding import is_embedding_var from xdl.python.backend.model_scope import cur_model_scope from xdl.python.training.gradient_utils import get_gradient, get_var_mapping @@ -48,7 +48,7 @@ def mock_embedding(name1, name2): emb = xdl.embedding(name1, sparse, xdl.Ones(), embed_dim, 16, 'sum', vtype='hash') emb.set_shape((1,3)) - ids2 = xdl.convert_to_tensor(np.array([[0,1], [1,1], [0,2]], dtype=np.int64)) + ids2 = xdl.convert_to_tensor(np.array([[0,1], [0,2], [1,1]], dtype=np.int64)) values2 = xdl.convert_to_tensor(np.array([1.0, 2.0, 3.0], dtype=np.float32)) segments2 = xdl.convert_to_tensor(np.array([3], dtype=np.int32)) sparse2 = xdl.SparseTensor(ids2, values2, segments2) @@ -56,18 +56,31 @@ def mock_embedding(name1, name2): emb2.set_shape((1,3)) return [emb, emb2] -def run(name1, name2, scope): +def run(name1, name2, scope, optimizer): with xdl.model_scope(scope): labels = xdl.mock_dense_op(shape=[1, 1], value=1.0) mock_embs = mock_embedding(name1, name2) loss = model(mock_embs,labels) - train_op = xdl.SGD(lr).optimize() + if optimizer == 'sgd': + train_op = xdl.SGD(0.5).optimize() + elif optimizer == 'momentum': + train_op = xdl.Momentum(0.005, 0.99).optimize() + elif optimizer == 'ftrl': + train_op = xdl.Ftrl(0.01).optimize() + elif optimizer == 'adam': + train_op = xdl.Adam(0.001).optimize() + elif optimizer == 'adagrad': + train_op = xdl.Adagrad(0.04, 0.1).optimize() + elif optimizer == 'rmsprop': + train_op = xdl.RMSProp(0.001).optimize() + else: + train_op = xdl.SGD(0.5).optimize() hooks = [] sess = xdl.TrainSession(hooks) run_ops = [train_op, loss] op_names = ['none', 'loss'] - embed_vars = [var for var in trainable_variables() if is_embedding_var(var)] + embed_vars = [var for var in trainable_variables_with_scope(scope) if is_embedding_var(var)] sparse_embed_grads = [] for var in embed_vars: sparse_embed_grads.append(xdl.get_sparse_grads(var.name)) @@ -85,15 +98,49 @@ class GradientAggregationTest(unittest.TestCase): def test(self): id1 = [[0,0],[0,1],[0,2]] id2 = [[0,1],[1,1],[0,2]] - grad1, grad2 = run("853", "861", "normal") - grad3 = run("872", "872", "aggregate") - self.assertTrue(np.allclose(grad1[0], grad3[0])) - self.assertTrue(np.allclose(grad1[1] + grad2[0], grad3[1])) - self.assertTrue(np.allclose(grad1[2] + grad2[2], grad3[2])) - self.assertTrue(np.allclose(grad2[1], grad3[3])) + grad1, grad2 = run("853", "861", "normal", "sgd") + grad3 = run("872", "872", "aggregate", "sgd") + print 'grad1: ', grad1 + print 'grad2: ', grad2 + print 'grad3: ', grad3 + self.assertTrue(np.allclose(grad1[1], grad3[1])) + self.assertTrue(np.allclose(grad1[2] + grad2[1], grad3[2])) + self.assertTrue(np.allclose(grad1[0] + grad2[2], grad3[0])) + self.assertTrue(np.allclose(grad2[0], grad3[3])) + grad1, grad2 = run("1", "2", "normal1", "momentum") + grad3 = run("3", "3", "aggregate1", "momentum") + self.assertTrue(np.allclose(grad1[1], grad3[1])) + self.assertTrue(np.allclose(grad1[2] + grad2[1], grad3[2])) + self.assertTrue(np.allclose(grad1[0] + grad2[2], grad3[0])) + self.assertTrue(np.allclose(grad2[0], grad3[3])) + grad1, grad2 = run("4", "5", "normal2", "ftrl") + grad3 = run("6", "6", "aggregate2", "ftrl") + self.assertTrue(np.allclose(grad1[1], grad3[1])) + self.assertTrue(np.allclose(grad1[2] + grad2[1], grad3[2])) + self.assertTrue(np.allclose(grad1[0] + grad2[2], grad3[0])) + self.assertTrue(np.allclose(grad2[0], grad3[3])) + grad1, grad2 = run("7", "8", "normal3", "adam") + grad3 = run("9", "9", "aggregate3", "adam") + self.assertTrue(np.allclose(grad1[1], grad3[1])) + self.assertTrue(np.allclose(grad1[2] + grad2[1], grad3[2])) + self.assertTrue(np.allclose(grad1[0] + grad2[2], grad3[0])) + self.assertTrue(np.allclose(grad2[0], grad3[3])) + grad1, grad2 = run("10", "11", "normal4", "adagrad") + grad3 = run("12", "12", "aggregate4", "adagrad") + self.assertTrue(np.allclose(grad1[1], grad3[1])) + self.assertTrue(np.allclose(grad1[2] + grad2[1], grad3[2])) + self.assertTrue(np.allclose(grad1[0] + grad2[2], grad3[0])) + self.assertTrue(np.allclose(grad2[0], grad3[3])) + grad1, grad2 = run("13", "14", "normal5", "rmsprop") + grad3 = run("15", "15", "aggregate5", "rmsprop") + self.assertTrue(np.allclose(grad1[1], grad3[1])) + self.assertTrue(np.allclose(grad1[2] + grad2[1], grad3[2])) + self.assertTrue(np.allclose(grad1[0] + grad2[2], grad3[0])) + self.assertTrue(np.allclose(grad2[0], grad3[3])) def suite(): return unittest.TestLoader().loadTestsFromTestCase(GradientAggregationTest) if __name__ == '__main__': unittest.TextTestRunner().run(suite()) + diff --git a/xdl/test/python/unit_test/test_ksum.py b/xdl/test/python/unit_test/test_ksum.py index c71d67be..5a9cd3a6 100644 --- a/xdl/test/python/unit_test/test_ksum.py +++ b/xdl/test/python/unit_test/test_ksum.py @@ -1,11 +1,11 @@ -# Copyright (C) 2016-2018 Alibaba Group Holding Limited -# +# Copyright 2018 Alibaba Group. All Rights Reserved. +# # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -23,11 +23,13 @@ segs = np.array([3,6,10],dtype=np.int32) grps = np.array([2,3,4,6,7,10],dtype=np.int32) embeds = np.array([[0.1],[0.2],[0.3],[0.4],[0.5],[0.6]],dtype=np.float) +sidx = np.array([],dtype=np.int32) +sseg = np.array([],dtype=np.int32) class TestKsum(unittest.TestCase): def test_cpu_ksum(self): grps = np.array([],dtype=np.int32) - ksum = xdl.ksum(embeds, idx, values, segs, grps) + ksum = xdl.ksum(embeds, idx, values, segs, grps, sidx, sseg) ksum = xdl.execute(ksum) res = np.array([[0.06],[0.09],[0.15]], dtype=np.float) self.assertTrue(np.allclose(ksum, res)) @@ -35,14 +37,14 @@ def test_cpu_ksum(self): def test_gpu_ksum(self): with xdl.device("GPU"): grps = np.array([],dtype=np.int32) - ksum = xdl.ksum(embeds, idx, values, segs, grps) + ksum = xdl.ksum(embeds, idx, values, segs, grps, sidx, sseg) ksum = xdl.execute(ksum) res = np.array([[0.06],[0.09],[0.15]], dtype=np.float) self.assertTrue(np.allclose(ksum, res)) - + def test_cpu_kavg(self): grps = np.array([],dtype=np.int32) - ksum = xdl.ksum(embeds, idx, values, segs, grps, average=True) + ksum = xdl.ksum(embeds, idx, values, segs, grps, sidx, sseg, average=True) ksum = xdl.execute(ksum) res = np.array([[0.02],[0.03],[0.0375]], dtype=np.float) self.assertTrue(np.allclose(ksum, res)) @@ -50,13 +52,13 @@ def test_cpu_kavg(self): def test_gpu_kavg(self): with xdl.device("GPU"): grps = np.array([],dtype=np.int32) - ksum = xdl.ksum(embeds, idx, values, segs, grps, average=True) + ksum = xdl.ksum(embeds, idx, values, segs, grps, sidx, sseg, average=True) ksum = xdl.execute(ksum) res = np.array([[0.02],[0.03],[0.0375]], dtype=np.float) self.assertTrue(np.allclose(ksum, res)) def test_cpu_merged_ksum(self): - ksum = xdl.ksum(embeds, idx, values, segs, grps) + ksum = xdl.ksum(embeds, idx, values, segs, grps, sidx, sseg) ksum = xdl.execute(ksum) res = np.array([[0.03, 0.03],[0.04,0.05],[0.05,0.1]], dtype=np.float) @@ -64,14 +66,14 @@ def test_cpu_merged_ksum(self): def test_gpu_merged_ksum(self): with xdl.device("GPU"): - ksum = xdl.ksum(embeds, idx, values, segs, grps) + ksum = xdl.ksum(embeds, idx, values, segs, grps, sidx, sseg) ksum = xdl.execute(ksum) res = np.array([[0.03, 0.03],[0.04,0.05],[0.05,0.1]], dtype=np.float) self.assertTrue(np.allclose(ksum, res)) def test_cpu_merged_kavg(self): - ksum = xdl.ksum(embeds, idx, values, segs, grps, average=True) + ksum = xdl.ksum(embeds, idx, values, segs, grps, sidx, sseg, average=True) ksum = xdl.execute(ksum) res = np.array([[0.015,0.03],[0.04,0.025],[0.05,0.03333333]], dtype=np.float) @@ -79,7 +81,7 @@ def test_cpu_merged_kavg(self): def test_gpu_merged_kavg(self): with xdl.device("GPU"): - ksum = xdl.ksum(embeds, idx, values, segs, grps, average=True) + ksum = xdl.ksum(embeds, idx, values, segs, grps, sidx, sseg, average=True) ksum = xdl.execute(ksum) res = np.array([[0.015,0.03],[0.04,0.025],[0.05,0.03333333]], dtype=np.float) diff --git a/xdl/test/python/unit_test/test_ksum_grad.py b/xdl/test/python/unit_test/test_ksum_grad.py index 4b538c21..c1adcb5e 100644 --- a/xdl/test/python/unit_test/test_ksum_grad.py +++ b/xdl/test/python/unit_test/test_ksum_grad.py @@ -1,11 +1,11 @@ -# Copyright (C) 2016-2018 Alibaba Group Holding Limited -# +# Copyright 2018 Alibaba Group. All Rights Reserved. +# # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -19,40 +19,83 @@ from xdl.python.lib.datatype import * idx = np.array([0,1,2,3,2,1,4,5,0,2],dtype=np.int32) -values = np.array([0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1],dtype=np.float) +values = np.array([1,1,1,1,1,1,1,1,1,1],dtype=np.float) segs = np.array([3,6,10],dtype=np.int32) grps = np.array([2,3,4,6,7,10],dtype=np.int32) embeds = np.array([[0.1],[0.2],[0.3],[0.4],[0.5],[0.6]],dtype=np.float) +with xdl.device('CPU'): + embeds_shape = xdl.shape_op(embeds) grads = np.array([[1],[2],[3]], dtype=np.float) merged_grads = np.array([[1,2],[3,4],[5,6]],dtype=np.float) +sidx = np.array([0,5,0,3,1,3,5,2,4,5],dtype=np.int32) +sseg = np.array([2,4,7,8,9,10],dtype=np.int32) + +sidx_nogrp = np.array([0,2,0,1,0,1,2,1,2,2],dtype=np.int32) class TestKsumGrad(unittest.TestCase): - def test_cpu(self): - grps = np.array([],dtype=np.int32) - ksum_grad = xdl.ksum_grad(embeds, idx, values, segs, grps, grads) - ksum_grad = xdl.execute(ksum_grad) - res = np.array([[0.4],[0.3],[0.6],[0.2],[0.3],[0.3]],dtype=np.float) - self.assertTrue(np.allclose(ksum_grad, res)) + #old_fashion_way + def test_cpu_with_values(self): + grps = np.array([],dtype=np.int32) + ksum_grad = xdl.ksum_grad(embeds_shape, idx, values, segs, grps, sidx_nogrp, sseg, grads) + ksum_grad = xdl.execute(ksum_grad) + res = np.array([[4],[3],[6],[2],[3],[3]],dtype=np.float) + self.assertTrue(np.allclose(ksum_grad, res)) + ksum_grad = xdl.ksum_grad(embeds_shape, idx, values, segs, grps, sidx_nogrp, sseg, grads, average=True) + ksum_grad = xdl.execute(ksum_grad) + res = np.array([[1.0833333],[1],[1.75],[0.66666666],[0.75],[0.75]],dtype=np.float) + self.assertTrue(np.allclose(ksum_grad, res)) + + #new_way + def test_cpu_no_values(self): + grps = np.array([],dtype=np.int32) + values = np.array([],dtype=np.float) + ksum_grad = xdl.ksum_grad(embeds_shape, idx, values, segs, grps, sidx_nogrp, sseg, grads) + ksum_grad = xdl.execute(ksum_grad) + res = np.array([[4],[3],[6],[2],[3],[3]],dtype=np.float) + self.assertTrue(np.allclose(ksum_grad, res)) + + ksum_grad = xdl.ksum_grad(embeds_shape, idx, values, segs, grps, sidx_nogrp, sseg, grads, average=True) + ksum_grad = xdl.execute(ksum_grad) + res = np.array([[1.0833333],[1],[1.75],[0.66666666],[0.75],[0.75]],dtype=np.float) + self.assertTrue(np.allclose(ksum_grad, res)) + def test_gpu(self): with xdl.device("GPU"): grps = np.array([],dtype=np.int32) - ksum_grad = xdl.ksum_grad(embeds, idx, values, segs, grps, grads) + ksum_grad = xdl.ksum_grad(embeds_shape, idx, values, segs, grps, sidx_nogrp, sseg, grads) ksum_grad = xdl.execute(ksum_grad) - res = np.array([[0.4],[0.3],[0.6],[0.2],[0.3],[0.3]],dtype=np.float) + res = np.array([[4],[3],[6],[2],[3],[3]],dtype=np.float) self.assertTrue(np.allclose(ksum_grad, res)) - def test_merged_cpu(self): - ksum_grad = xdl.ksum_grad(embeds, idx, values, segs, grps, merged_grads) + def test_merged_cpu_with_values(self): + ksum_grad = xdl.ksum_grad(embeds_shape, idx, values, segs, grps, sidx, sseg, merged_grads) + ksum_grad = xdl.execute(ksum_grad) + res = np.array([[7],[5],[12],[3],[5],[6]],dtype=np.float) + self.assertTrue(np.allclose(ksum_grad, res)) + + ksum_grad = xdl.ksum_grad(embeds_shape, idx, values, segs, grps, sidx, sseg, merged_grads, average=True) + ksum_grad = xdl.execute(ksum_grad) + res = np.array([[2.5],[2.5],[6],[3],[5],[2]],dtype=np.float) + self.assertTrue(np.allclose(ksum_grad, res)) + + def test_merged_cpu_no_values(self): + values = np.array([],dtype=np.float) + ksum_grad = xdl.ksum_grad(embeds_shape, idx, values, segs, grps, sidx, sseg, merged_grads) ksum_grad = xdl.execute(ksum_grad) - res = np.array([[0.7],[0.5],[1.2],[0.3],[0.5],[0.6]],dtype=np.float) + res = np.array([[7],[5],[12],[3],[5],[6]],dtype=np.float) self.assertTrue(np.allclose(ksum_grad, res)) + ksum_grad = xdl.ksum_grad(embeds_shape, idx, values, segs, grps, sidx, sseg, merged_grads, average=True) + ksum_grad = xdl.execute(ksum_grad) + res = np.array([[2.5],[2.5],[6],[3],[5],[2]],dtype=np.float) + self.assertTrue(np.allclose(ksum_grad, res)) + def test_merged_gpu(self): with xdl.device("GPU"): - ksum_grad = xdl.ksum_grad(embeds, idx, values, segs, grps, merged_grads) + ksum_grad = xdl.ksum_grad(embeds_shape, idx, values, segs, grps, sidx_nogrp, sseg, merged_grads) ksum_grad = xdl.execute(ksum_grad) - res = np.array([[0.7],[0.5],[1.2],[0.3],[0.5],[0.6]],dtype=np.float) + res = np.array([[7],[5],[12],[3],[5],[6]],dtype=np.float) self.assertTrue(np.allclose(ksum_grad, res)) def suite(): diff --git a/xdl/test/python/unit_test/test_merge_sparse.py b/xdl/test/python/unit_test/test_merge_sparse.py index dada651e..4fd348a6 100644 --- a/xdl/test/python/unit_test/test_merge_sparse.py +++ b/xdl/test/python/unit_test/test_merge_sparse.py @@ -1,11 +1,11 @@ -# Copyright (C) 2016-2018 Alibaba Group Holding Limited -# +# Copyright 2018 Alibaba Group. All Rights Reserved. +# # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. diff --git a/xdl/test/python/unit_test/test_merged_tile.py b/xdl/test/python/unit_test/test_merged_tile.py index a4c44cf4..32afc6d1 100644 --- a/xdl/test/python/unit_test/test_merged_tile.py +++ b/xdl/test/python/unit_test/test_merged_tile.py @@ -1,11 +1,11 @@ -# Copyright (C) 2016-2018 Alibaba Group Holding Limited -# +# Copyright 2018 Alibaba Group. All Rights Reserved. +# # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. diff --git a/xdl/test/python/unit_test/test_py_func.py b/xdl/test/python/unit_test/test_py_func.py index 230eb28f..1077d8ae 100644 --- a/xdl/test/python/unit_test/test_py_func.py +++ b/xdl/test/python/unit_test/test_py_func.py @@ -1,11 +1,11 @@ -# Copyright (C) 2016-2018 Alibaba Group Holding Limited -# +# Copyright 2018 Alibaba Group. All Rights Reserved. +# # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. diff --git a/xdl/test/python/unit_test/test_reshape.py b/xdl/test/python/unit_test/test_reshape.py new file mode 100644 index 00000000..15aad8c8 --- /dev/null +++ b/xdl/test/python/unit_test/test_reshape.py @@ -0,0 +1,38 @@ +# Copyright 2018 Alibaba Group. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +import xdl +import unittest +import numpy as np +from xdl.python.lib.datatype import * + +class TestReshape(unittest.TestCase): + def test_reshape(self): + value = np.array([[1, 2], [3, 4]]) + a = xdl.reshape(value, [4]) + a = xdl.execute(a) + self.assertTrue(np.alltrue(a == [1, 2, 3, 4])) + + def test_reshape_x(self): + value = np.array([[1, 2], [3, 4]]) + a = xdl.reshape(value, [1, -1]) + a = xdl.execute(a) + self.assertTrue(np.alltrue(a == [[1, 2, 3, 4]])) + +def suite(): + return unittest.TestLoader().loadTestsFromTestCase(TestReshape) + +if __name__ == '__main__': + unittest.TextTestRunner().run(suite()) diff --git a/xdl/test/python/unit_test/test_split.py b/xdl/test/python/unit_test/test_split.py new file mode 100644 index 00000000..66602cbf --- /dev/null +++ b/xdl/test/python/unit_test/test_split.py @@ -0,0 +1,58 @@ +# Copyright 2018 Alibaba Group. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +import xdl +import unittest +import numpy as np +from xdl.python.lib.datatype import * + +class TestSplit(unittest.TestCase): + def test_split_0_dim(self): + value = np.array([[10, 20], [30, 40], [50, 60], [70, 80]]) + num_or_size_splits = np.array([1, 3]) + a, b = xdl.split(value, num_or_size_splits, 0, 2) + a, b = xdl.execute([a, b]) + self.assertTrue(np.alltrue(a == [[10, 20]])) + self.assertTrue(np.alltrue(b == [[30, 40], [50, 60], [70, 80]])) + + def test_split_0_dim_x(self): + value = np.array([[10, 20], [30, 40], [50, 60], [70, 80]]) + num_or_size_splits = np.array(2) + a, b = xdl.split(value, num_or_size_splits, 0, 2) + a, b = xdl.execute([a, b]) + self.assertTrue(np.alltrue(a == [[10, 20], [30, 40]])) + self.assertTrue(np.alltrue(b == [[50, 60], [70, 80]])) + + def test_split_neg_dim(self): + value = np.array([[10, 20, 1], [30, 40, 1], [50, 60, 1], [70, 80, 1]]) + num_or_size_splits = np.array([1, 2]) + a, b = xdl.split(value, num_or_size_splits, -1, 2) + a, b = xdl.execute([a, b]) + self.assertTrue(np.alltrue(a == [[10], [30], [50], [70]])) + self.assertTrue(np.alltrue(b == [[20, 1], [40, 1], [60, 1], [80, 1]])) + + def test_split_neg_dim_x(self): + value = np.array([[10, 20], [30, 40], [50, 60], [70, 80]]) + num_or_size_splits = np.array(2) + a, b = xdl.split(value, num_or_size_splits, -1, 2) + a, b = xdl.execute([a, b]) + self.assertTrue(np.alltrue(a == [[10], [30], [50], [70]])) + self.assertTrue(np.alltrue(b == [[20], [40], [60], [80]])) + +def suite(): + return unittest.TestLoader().loadTestsFromTestCase(TestSplit) + +if __name__ == '__main__': + unittest.TextTestRunner().run(suite()) diff --git a/xdl/test/python/unit_test/test_stack.py b/xdl/test/python/unit_test/test_stack.py new file mode 100644 index 00000000..62391fe7 --- /dev/null +++ b/xdl/test/python/unit_test/test_stack.py @@ -0,0 +1,91 @@ +# Copyright 2018 Alibaba Group. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +import xdl +import unittest +import numpy as np +from xdl.python.lib.datatype import * + +class TestStack(unittest.TestCase): + def test_stack_0(self): + a = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]]) + b = np.array([[[11, 12], [13, 14]], [[15, 16], [17, 18]]]) + c = np.array([[[21, 22], [23, 24]], [[25, 26], [27, 28]]]) + r = xdl.stack([a, b, c], axis=0) + r = xdl.execute(r) + self.assertTrue(np.alltrue(r == np.stack([a, b, c], axis=0))) + + def test_stack_1(self): + a = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]]) + b = np.array([[[11, 12], [13, 14]], [[15, 16], [17, 18]]]) + c = np.array([[[21, 22], [23, 24]], [[25, 26], [27, 28]]]) + r = xdl.stack([a, b, c], axis=1) + r = xdl.execute(r) + self.assertTrue(np.alltrue(r == np.stack([a, b, c], axis=1))) + + def test_stack_2(self): + a = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]]) + b = np.array([[[11, 12], [13, 14]], [[15, 16], [17, 18]]]) + c = np.array([[[21, 22], [23, 24]], [[25, 26], [27, 28]]]) + r = xdl.stack([a, b, c], axis=2) + r = xdl.execute(r) + self.assertTrue(np.alltrue(r == np.stack([a, b, c], axis=2))) + + def test_stack_3(self): + a = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]]) + b = np.array([[[11, 12], [13, 14]], [[15, 16], [17, 18]]]) + c = np.array([[[21, 22], [23, 24]], [[25, 26], [27, 28]]]) + r = xdl.stack([a, b, c], axis=3) + r = xdl.execute(r) + self.assertTrue(np.alltrue(r == np.stack([a, b, c], axis=3))) + + def test_stack_x1(self): + a = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]]) + b = np.array([[[11, 12], [13, 14]], [[15, 16], [17, 18]]]) + c = np.array([[[21, 22], [23, 24]], [[25, 26], [27, 28]]]) + r = xdl.stack([a, b, c], axis=-1) + r = xdl.execute(r) + self.assertTrue(np.alltrue(r == np.stack([a, b, c], axis=-1))) + + def test_stack_x2(self): + a = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]]) + b = np.array([[[11, 12], [13, 14]], [[15, 16], [17, 18]]]) + c = np.array([[[21, 22], [23, 24]], [[25, 26], [27, 28]]]) + r = xdl.stack([a, b, c], axis=-2) + r = xdl.execute(r) + self.assertTrue(np.alltrue(r == np.stack([a, b, c], axis=-2))) + + def test_stack_x3(self): + a = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]]) + b = np.array([[[11, 12], [13, 14]], [[15, 16], [17, 18]]]) + c = np.array([[[21, 22], [23, 24]], [[25, 26], [27, 28]]]) + r = xdl.stack([a, b, c], axis=-3) + r = xdl.execute(r) + self.assertTrue(np.alltrue(r == np.stack([a, b, c], axis=-3))) + + def test_stack_x4(self): + a = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]]) + b = np.array([[[11, 12], [13, 14]], [[15, 16], [17, 18]]]) + c = np.array([[[21, 22], [23, 24]], [[25, 26], [27, 28]]]) + r = xdl.stack([a, b, c], axis=-4) + r = xdl.execute(r) + self.assertTrue(np.alltrue(r == np.stack([a, b, c], axis=-4))) + +def suite(): + return unittest.TestLoader().loadTestsFromTestCase(TestStack) + +if __name__ == '__main__': + unittest.TextTestRunner().run(suite()) + diff --git a/xdl/test/python/unit_test/test_take.py b/xdl/test/python/unit_test/test_take.py index aa01b588..37117664 100644 --- a/xdl/test/python/unit_test/test_take.py +++ b/xdl/test/python/unit_test/test_take.py @@ -1,11 +1,11 @@ -# Copyright (C) 2016-2018 Alibaba Group Holding Limited -# +# Copyright 2018 Alibaba Group. All Rights Reserved. +# # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. diff --git a/xdl/test/python/unit_test/test_take_grad.py b/xdl/test/python/unit_test/test_take_grad.py index 4306e68a..dbfbb444 100644 --- a/xdl/test/python/unit_test/test_take_grad.py +++ b/xdl/test/python/unit_test/test_take_grad.py @@ -1,11 +1,11 @@ -# Copyright (C) 2016-2018 Alibaba Group Holding Limited -# +# Copyright 2018 Alibaba Group. All Rights Reserved. +# # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -19,20 +19,22 @@ from xdl.python.lib.datatype import * comm = np.array([[0.1,0.2,0.3],[0.4,0.5,0.6],[0.7,0.8,0.9]],dtype=np.float) +with xdl.device('CPU'): + comm_shape = xdl.shape_op(comm) comm_grad = np.array([[0.1,0.2,0.3],[0.4,0.5,0.6],[0.7,0.8,0.9], [0.1,0.2,0.3],[0.4,0.5,0.6]],dtype=np.float) indicator = np.array([0,0,1,1,2],dtype=np.int32) class TestTakeGrad(unittest.TestCase): def test_cpu(self): - out = xdl.take_grad(comm_grad, indicator,comm) + out = xdl.take_grad(comm_grad, indicator,comm_shape) out = xdl.execute(out) res = np.array([[0.5,0.7,0.9],[0.8,1.0,1.2],[0.4,0.5,0.6]],dtype=np.float) self.assertTrue(np.allclose(out, res)) def test_gpu(self): with xdl.device("GPU"): - out = xdl.take_grad(comm_grad, indicator,comm) + out = xdl.take_grad(comm_grad, indicator,comm_shape) out = xdl.execute(out) res = np.array([[0.5,0.7,0.9],[0.8,1.0,1.2],[0.4,0.5,0.6]],dtype=np.float) self.assertTrue(np.allclose(out, res)) diff --git a/xdl/test/python/unit_test/test_tile.py b/xdl/test/python/unit_test/test_tile.py index 611e84d4..5e8319a2 100644 --- a/xdl/test/python/unit_test/test_tile.py +++ b/xdl/test/python/unit_test/test_tile.py @@ -1,11 +1,11 @@ -# Copyright (C) 2016-2018 Alibaba Group Holding Limited -# +# Copyright 2018 Alibaba Group. All Rights Reserved. +# # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. diff --git a/xdl/test/python/unit_test/test_tile_grad.py b/xdl/test/python/unit_test/test_tile_grad.py index 7cfe2c88..3a7f742d 100644 --- a/xdl/test/python/unit_test/test_tile_grad.py +++ b/xdl/test/python/unit_test/test_tile_grad.py @@ -1,11 +1,11 @@ -# Copyright (C) 2016-2018 Alibaba Group Holding Limited -# +# Copyright 2018 Alibaba Group. All Rights Reserved. +# # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. diff --git a/xdl/test/python/unit_test/test_unique.py b/xdl/test/python/unit_test/test_unique.py index e1eff471..f1e97f63 100644 --- a/xdl/test/python/unit_test/test_unique.py +++ b/xdl/test/python/unit_test/test_unique.py @@ -1,11 +1,11 @@ -# Copyright (C) 2016-2018 Alibaba Group Holding Limited -# +# Copyright 2018 Alibaba Group. All Rights Reserved. +# # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -17,45 +17,87 @@ import unittest import numpy as np from xdl.python.lib.datatype import * +from xdl.python.ops.constant_converter import * data = np.array([3,1,2,1,3,1,2,0,1,3,1,1,2,0,1,3,3,2,3,2,2,1,2,0]) - + class TestUnique(unittest.TestCase): def test_unique_cpu_1d(self): - res_uniq = np.array([3,1,2,0]) - res_idx = np.array([0,1,2,1,0,1,2,3,1,0,1,1, - 2,3,1,0,0,2,0,2,2,1,2,3]) - uniq, idx = xdl.unique(data, itype=DataType.int32) - uniq, idx = xdl.execute([uniq, idx]) + res_uniq = np.array([0,2,1,3]) + res_idx = np.array([3,2,1,2,3,2,1,0,2,3,2,2, + 1,0,2,3,3,1,3,1,1,2,1,0]) + res_sidx = np.array([2,6,10,0,2,6,7,8,9,10,0,1,2,3,4,5,6,9,0,1,3,6,7,8]) + res_sseg = np.array([3,10,18,24]) + + segment = np.array([3,5,8,10,11,12,16,18,20,22,24], np.int32) + uniq, idx, sidx, sseg = xdl.unique(input=data, segment=segment, itype=DataType.int32) + uniq, idx, sidx, sseg = xdl.execute([uniq, idx, sidx, sseg]) + self.assertTrue((uniq == res_uniq).all()) + self.assertTrue((idx == res_idx).all()) + self.assertTrue((sidx == res_sidx).all()) + self.assertTrue((sseg == res_sseg).all()) + + segment = np.array([3,5,8,10,11,12,16,18,20,22,24], np.int64) + uniq, idx, sidx, sseg = xdl.unique(input=data, segment=segment, itype=DataType.int64) + uniq, idx, sidx, sseg = xdl.execute([uniq, idx, sidx, sseg]) self.assertTrue((uniq == res_uniq).all()) self.assertTrue((idx == res_idx).all()) + self.assertTrue((sidx == res_sidx).all()) + self.assertTrue((sseg == res_sseg).all()) + + segment2 = np.array([3,5,5,8,10,11,12,12,16,18,20,22,24], np.int32) + uniq, idx, sidx, sseg = xdl.unique(input=data, segment=segment2, itype=DataType.int32) + uniq, idx, sidx, sseg = xdl.execute([uniq, idx, sidx, sseg]) + res_sidx = np.array([3,8,12,0,3,8,9,10,11,12,0,1,3,4,5,6,8,11,0,1,4,8,9,10]) + self.assertTrue((uniq == res_uniq).all()) + self.assertTrue((idx == res_idx).all()) + self.assertTrue((sidx == res_sidx).all()) + self.assertTrue((sseg == res_sseg).all()) def test_unique_gpu_1d(self): with xdl.device("GPU"): res_uniq = np.array([0,1,2,3]) res_idx = np.array([3,1,2,1,3,1,2,0,1,3,1,1, 2,0,1,3,3,2,3,2,2,1,2,0]) - uniq, idx = xdl.unique(data, itype=DataType.int32) - uniq, idx = xdl.execute([uniq, idx]) + res_sidx = np.array([2,6,10, 0,1,2,3,4,5,6,9, 0,2,6,7,8,9,10, 0,1,3,6,7,8]) + res_sseg = np.array([3,11,18,24]) + segment = np.array([3,5,8,10,11,12,16,18,20,22,24], np.int32) + uniq, idx, sidx, sseg = xdl.unique(data, segment=segment, itype=DataType.int32) + uniq, idx, sidx, sseg = xdl.execute([uniq, idx, sidx, sseg]) self.assertTrue((uniq == res_uniq).all()) self.assertTrue((idx == res_idx).all()) + self.assertTrue((sidx == res_sidx).all()) + self.assertTrue((sseg == res_sseg).all()) def test_unique_cpu_2d(self): - res_uniq = np.array([[3,1],[2,1],[2,0],[1,3],[1,1],[3,2]]) - res_idx = np.array([0,1,0,2,3,4,2,3,5,5,1,2]) - uniq, idx = xdl.unique(data.reshape((data.size/2, 2)),itype=DataType.int32) - uniq, idx = xdl.execute([uniq, idx]) + data = np.array([3,1,2,1,3,1,2,0,1,3,1,1,2,0,1,3,3,2,3,2,2,1,2,0]) + res_uniq = np.array([[3,2],[1,1],[1,3],[2,0],[2,1],[3,1]]) + res_idx = np.array([5,4,5,3,2,1,3,2,0,0,4,3]) + res_sidx = np.array([4,5,3,2,4,2,4,5,0,5,0,2]) + res_sseg = np.array([2,3,5,8,10,12]) + + segment = np.array([2,2,5,6,9,12], np.int32) + uniq, idx, sidx, sseg = xdl.unique(data.reshape((data.size/2, 2)), segment, itype=DataType.int32) + uniq, idx, sidx, sseg = xdl.execute([uniq, idx, sidx, sseg]) + self.assertTrue((uniq == res_uniq).all()) self.assertTrue((idx == res_idx).all()) + self.assertTrue((sidx == res_sidx).all()) + self.assertTrue((sseg == res_sseg).all()) def test_unique_gpu_2d(self): with xdl.device("GPU"): res_uniq = np.array([[1,1],[1,3],[2,0],[2,1],[3,1],[3,2]]) res_idx = np.array([4,3,4,2,1,0,2,1,5,5,3,2]) - uniq, idx = xdl.unique(data.reshape((data.size/2, 2)),itype=DataType.int32) - uniq, idx = xdl.execute([uniq, idx]) + segment = np.array([2,2,5,6,9,12], np.int32) + res_sidx = np.array([3, 2,4, 2,4,5, 0,5, 0,2, 4,5]) + res_sseg = np.array([1,3,6,8,10,12]) + uniq, idx, sidx, sseg = xdl.unique(data.reshape((data.size/2, 2)), segment, itype=DataType.int32) + uniq, idx, sidx, sseg = xdl.execute([uniq, idx, sidx, sseg]) self.assertTrue((uniq == res_uniq).all()) self.assertTrue((idx == res_idx).all()) + self.assertTrue((sidx == res_sidx).all()) + self.assertTrue((sseg == res_sseg).all()) def suite(): return unittest.TestLoader().loadTestsFromTestCase(TestUnique) diff --git a/xdl/test/python/unit_test/test_zeros.py b/xdl/test/python/unit_test/test_zeros.py new file mode 100644 index 00000000..84242fb8 --- /dev/null +++ b/xdl/test/python/unit_test/test_zeros.py @@ -0,0 +1,47 @@ +# Copyright 2018 Alibaba Group. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +import xdl +import unittest +import numpy as np +from xdl.python.lib.datatype import * + +class TestZeros(unittest.TestCase): + def test_zeros_0(self): + a = xdl.zeros(np.array([], np.int64), xdl.DataType.float) + a = xdl.execute(a) + self.assertTrue(np.alltrue(a == 0)) + self.assertTrue(a.shape == ()) + self.assertTrue(a.dtype == np.float32) + + def test_zeros_1(self): + a = xdl.zeros([100], xdl.DataType.float) + a = xdl.execute(a) + self.assertTrue(np.alltrue(a == 0)) + self.assertTrue(a.shape == (100,)) + self.assertTrue(a.dtype == np.float32) + + def test_zeros_int64(self): + a = xdl.zeros([100], xdl.DataType.int64) + a = xdl.execute(a) + self.assertTrue(np.alltrue(a == 0)) + self.assertTrue(a.shape == (100,)) + self.assertTrue(a.dtype == np.int64) + +def suite(): + return unittest.TestLoader().loadTestsFromTestCase(TestZeros) + +if __name__ == '__main__': + unittest.TextTestRunner().run(suite()) diff --git a/xdl/test/test_data/data_io/zlib_test_data b/xdl/test/test_data/data_io/zlib_test_data new file mode 100644 index 00000000..864d66a3 Binary files /dev/null and b/xdl/test/test_data/data_io/zlib_test_data differ diff --git a/xdl/test/util/hdfs_define.h b/xdl/test/util/hdfs_define.h deleted file mode 100644 index 8ea6df67..00000000 --- a/xdl/test/util/hdfs_define.h +++ /dev/null @@ -1 +0,0 @@ -const char *XDL_HADOOP_PATH = "/home/yue.song/x-deeplearning/xdl/test/binary/hadoop-2.8.5/"; diff --git a/xdl/test/util/hdfs_launcher.cpp b/xdl/test/util/hdfs_launcher.cpp index c9b8e10d..385c5ac8 100644 --- a/xdl/test/util/hdfs_launcher.cpp +++ b/xdl/test/util/hdfs_launcher.cpp @@ -12,7 +12,7 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ==============================================================================*/ -#include + #include #include #include @@ -20,14 +20,70 @@ limitations under the License. #include #include #include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include -#include "hdfs_launcher.h" #include "hdfs_define.h" +#include "hdfs_launcher.h" using namespace std; -namespace ps { +namespace xdl { + +HDFSLauncher::HDFSLauncher() { + config_path_ = std::string(XDL_HADOOP_PATH) + "etc/hadoop/core-site.xml"; + hdfs_config_path_ = std::string(XDL_HADOOP_PATH) + "etc/hadoop/hdfs-site.xml"; + Start(); +} + +HDFSLauncher::~HDFSLauncher() { + Stop(); +} + +int HDFSLauncher::GetAvailablePort() { + struct sockaddr_in addr; + addr.sin_port = htons(0); // have system pick up a random port available for me + addr.sin_family = AF_INET; // IPV4 + addr.sin_addr.s_addr = htonl(INADDR_ANY); // set our addr to any interface + + int sock = socket(AF_INET, SOCK_STREAM, 0); + if (0 != bind(sock, (struct sockaddr*)&addr, sizeof(struct sockaddr_in))) { + return -1; + } + + socklen_t addr_len = sizeof(struct sockaddr_in); + if (0 != getsockname(sock, (struct sockaddr*)&addr, &addr_len)) { + return -1; + } + + int ret_port = ntohs(addr.sin_port); + close(sock); + return ret_port; +} + +void HDFSLauncher::GetAvailablePorts(int num, std::vector* ports) { + std::set uniq_ports; + while (uniq_ports.size() < num) { + int port = GetAvailablePort(); + if (port == -1) { + continue; + } + + if (uniq_ports.find(port) == uniq_ports.end()) { + uniq_ports.insert(port); + } + } + + ports->insert(ports->end(), uniq_ports.begin(), uniq_ports.end()); +} std::string HDFSLauncher::Exec(const char* cmd) { std::array buffer; @@ -41,30 +97,26 @@ std::string HDFSLauncher::Exec(const char* cmd) { return result; } -bool HDFSLauncher::Start(void) { - /* Run hdfs test case need four environment variable: - * JAVA_HOME, HADOOP_HDFS_HOME, CLASSPATH, LD_LIBRARY_PATH */ - char *hdfs_home = getenv("HADOOP_HDFS_HOME"); - char *java_home = getenv("JAVA_HOME"); - char *classpath = getenv("CLASSPATH"); - char *ld_path = getenv("LD_LIBRARY_PATH"); - - if (hdfs_home == NULL || java_home == NULL || classpath == NULL || ld_path == NULL) { - return false; - } - +void HDFSLauncher::Start() { + port_ = GetAvailablePort(); + UpdateCoreSiteConfig(port_); + std::vector ports; + GetAvailablePorts(5, &ports); + UpdateHdfsSiteConfig(ports); stringstream ss; - ss << "cd " << XDL_HADOOP_PATH << "; sh run.sh"; + ss << "cd " << XDL_HADOOP_PATH << "; sh run.sh " << \ + std::to_string(port_) << "; sleep 26"; string out = Exec(ss.str().c_str()); cout << out << std::endl; - return true; } -void HDFSLauncher::Stop(void) { +void HDFSLauncher::Stop() { stringstream ss; ss << "cd " << XDL_HADOOP_PATH << "; sh stop.sh"; string out = Exec(ss.str().c_str()); cout << out << std::endl; + RestoreCoreSiteConfig(); + RestoreHdfsSiteConfig(); } } diff --git a/xdl/test/util/hdfs_launcher.h b/xdl/test/util/hdfs_launcher.h index 558c4f2a..19cf8869 100644 --- a/xdl/test/util/hdfs_launcher.h +++ b/xdl/test/util/hdfs_launcher.h @@ -17,16 +17,104 @@ limitations under the License. #define HDFS_LAUNCHER_H_ #include +#include +#include +#include +#include +#include +#include +#include +#include +#include -namespace ps { +namespace xdl { class HDFSLauncher { public: - static bool Start(void); - static void Stop(void); + void Start(); + void Stop(); + static HDFSLauncher* Instance() { + static HDFSLauncher launch; + return &launch; + } + + int GetPort() { + return port_; + } private: + HDFSLauncher(); + ~HDFSLauncher(); + + std::string ReadLocalFile(const std::string &filePath) { + std::ifstream in(filePath.c_str()); + std::stringstream ss; + std::string line; + if (!in) { + return std::string(""); + } + while (std::getline(in, line)) { + ss << line; + } + in.close(); + return ss.str(); + } + + bool WriteLocalFile(const std::string &filePath, + const std::string &content) { + std::ofstream file(filePath.c_str()); + if (!file) { + return false; + } + file.write(content.c_str(), content.length()); + file.flush(); + file.close(); + return true; + } + + int GetAvailablePort(); + void GetAvailablePorts(int num, std::vector* ports); + + void UpdateCoreSiteConfig(int port) { + raw_config_ = ReadLocalFile(config_path_); + std::string new_config = raw_config_; + size_t pos = new_config.find("${port}"); + if (pos != std::string::npos) { + new_config.replace(pos, 7, std::to_string(port)); + } + + WriteLocalFile(config_path_, new_config); + } + + void RestoreCoreSiteConfig() { + WriteLocalFile(config_path_, raw_config_); + } + + void UpdateHdfsSiteConfig(const std::vector& port_list) { + raw_hdfs_config_ = ReadLocalFile(hdfs_config_path_); + std::string hdfs_config = raw_hdfs_config_; + for (size_t i = 1; i <= port_list.size(); ++i) { + std::string placeholder = "${port" + std::to_string(i) + "}"; + std::string value = "0.0.0.0:" + std::to_string(port_list[i]); + size_t pos = hdfs_config.find(placeholder); + if (pos != std::string::npos) { + hdfs_config.replace(pos, placeholder.size(), value); + } + } + + WriteLocalFile(hdfs_config_path_, hdfs_config); + } + + void RestoreHdfsSiteConfig() { + WriteLocalFile(hdfs_config_path_, raw_hdfs_config_); + } + static std::string Exec(const char *cmd); + int port_; + std::string config_path_; + std::string raw_config_; + std::string hdfs_config_path_; + std::string raw_hdfs_config_; }; } diff --git a/xdl/test/util/zookeeper_define.h b/xdl/test/util/zookeeper_define.h deleted file mode 100644 index 35affb44..00000000 --- a/xdl/test/util/zookeeper_define.h +++ /dev/null @@ -1 +0,0 @@ -const char *XDL_ZOOKEEPER_PATH = "/home/yue.song/x-deeplearning/xdl/test/binary/zookeeper-3.4.13/"; diff --git a/xdl/test/util/zookeeper_launcher.cpp b/xdl/test/util/zookeeper_launcher.cpp index bf561f36..392689b0 100644 --- a/xdl/test/util/zookeeper_launcher.cpp +++ b/xdl/test/util/zookeeper_launcher.cpp @@ -21,13 +21,52 @@ limitations under the License. #include #include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include "zookeeper_launcher.h" #include "zookeeper_define.h" using namespace std; -namespace ps { +namespace xdl { + +ZookeeperLauncher::ZookeeperLauncher() { + config_path_ = std::string(XDL_ZOOKEEPER_PATH) + "conf/zoo.cfg"; + Start(); +} + +ZookeeperLauncher::~ZookeeperLauncher() { + Stop(); +} + +int ZookeeperLauncher::GetAvailablePort() { + struct sockaddr_in addr; + addr.sin_port = htons(0); // have system pick up a random port available for me + addr.sin_family = AF_INET; // IPV4 + addr.sin_addr.s_addr = htonl(INADDR_ANY); // set our addr to any interface + + int sock = socket(AF_INET, SOCK_STREAM, 0); + if (0 != bind(sock, (struct sockaddr*)&addr, sizeof(struct sockaddr_in))) { + return -1; + } + + socklen_t addr_len = sizeof(struct sockaddr_in); + if (0 != getsockname(sock, (struct sockaddr*)&addr, &addr_len)) { + return -1; + } + + int ret_port = ntohs(addr.sin_port); + close(sock); + return ret_port; +} std::string ZookeeperLauncher::Exec(const char* cmd) { std::array buffer; @@ -42,19 +81,23 @@ std::string ZookeeperLauncher::Exec(const char* cmd) { } void ZookeeperLauncher::Start(void) { + port_ = GetAvailablePort(); + UpdateCoreSiteConfig(port_); stringstream ss; - ss << "cd " << XDL_ZOOKEEPER_PATH << "; bin/zkServer.sh start"; + ss << "cd " << XDL_ZOOKEEPER_PATH << "; bin/zkServer.sh start; sleep 26"; string out = Exec(ss.str().c_str()); cout << out << std::endl; } void ZookeeperLauncher::Stop(void) { + std::cout << "Stop zookeeeper!\n\n\n"; stringstream ss; ss << "cd " << XDL_ZOOKEEPER_PATH << "; bin/zkServer.sh stop; rm -rf zookeeper.out"; string out = Exec(ss.str().c_str()); cout << out << std::endl; out = Exec("rm -rf /tmp/xdl_zookeeper"); cout << out << std::endl; + RestoreCoreSiteConfig(); } } diff --git a/xdl/test/util/zookeeper_launcher.h b/xdl/test/util/zookeeper_launcher.h index 8f1772f2..9c583f3c 100644 --- a/xdl/test/util/zookeeper_launcher.h +++ b/xdl/test/util/zookeeper_launcher.h @@ -17,16 +17,81 @@ limitations under the License. #define ZOOKEEPER_LAUNCHER_H_ #include +#include +#include +#include +#include +#include +#include +#include -namespace ps { +namespace xdl { class ZookeeperLauncher { public: - static void Start(void); - static void Stop(void); + void Start(void); + void Stop(void); + static ZookeeperLauncher* Instance() { + static ZookeeperLauncher launch; + return &launch; + } + + int GetPort() { + return port_; + } private: + ZookeeperLauncher(); + ~ZookeeperLauncher(); + + std::string ReadLocalFile(const std::string &filePath) { + std::ifstream in(filePath.c_str()); + std::stringstream ss; + std::string line; + if (!in) { + return std::string(""); + } + while (std::getline(in, line)) { + ss << line << "\n"; + } + in.close(); + return ss.str(); + } + + bool WriteLocalFile(const std::string &filePath, + const std::string &content) { + std::ofstream file(filePath.c_str()); + if (!file) { + return false; + } + file.write(content.c_str(), content.length()); + file.flush(); + file.close(); + return true; + } + + int GetAvailablePort(); + + void UpdateCoreSiteConfig(int port) { + raw_config_ = ReadLocalFile(config_path_); + std::string new_config = raw_config_; + size_t pos = new_config.find("${port}"); + if (pos != std::string::npos) { + new_config.replace(pos, 7, std::to_string(port)); + } + + WriteLocalFile(config_path_, new_config); + } + + void RestoreCoreSiteConfig() { + WriteLocalFile(config_path_, raw_config_); + } + static std::string Exec(const char *cmd); + + int port_; + std::string config_path_; + std::string raw_config_; }; } diff --git a/xdl/third_party/tbb/.gitattributes b/xdl/third_party/tbb/.gitattributes new file mode 100644 index 00000000..039edb3a --- /dev/null +++ b/xdl/third_party/tbb/.gitattributes @@ -0,0 +1,45 @@ +# Set the default behavior, in case people don't have core.autocrlf set. +* text=auto + +# Explicitly declare text files you want to always be normalized and converted +# to native line endings on checkout. +*.c text +*.h text +*.cpp text +*.def text +*.rc text +*.i text +*.sh text +*.csh text +*.mk text +*.java text +*.csv text +*.lst text +*.asm text +*.cfg text +*.css text +*.inc text +*.js text +*.rb text +*.strings text +*.txt text +*export.lst text +*.xml text +*.py text +*.md text +*.classpath text +*.cproject text +*.project text +*.properties text +*.java text +*.gradle text + +# Declare files that will always have CRLF line endings on checkout. +*.sln text eol=crlf +*.bat text eol=crlf + +# Denote all files that are truly binary and should not be modified. +*.png binary +*.jpg binary +*.ico binary +*.spir binary diff --git a/xdl/third_party/tbb/.gitignore b/xdl/third_party/tbb/.gitignore new file mode 100644 index 00000000..0182b141 --- /dev/null +++ b/xdl/third_party/tbb/.gitignore @@ -0,0 +1,86 @@ +# Ignore the debug and release directories created with Makefile builds # +######################################################################### +build/*_debug/ +build/*_release/ + +# Compiled source # +################### +*.com +*.class +*.dll +*.lib +*.pdb +*.exe +*.o +*.so +*.so.1 +*.so.2 +*.dylib +*.a +*.obj +*.pyc + +*.orig +*.raw +*.sample +*.slo +*.swp +*.config +*.la +*.lai +*.lo +*.nhdr +*.nii.gz +*.nrrd + +# Packages # +############ +# it's better to unpack these files and commit the raw source +# git has its own built in compression methods +*.7z +*.dmg +*.gz +*.iso +*.jar +*.rar +*.tar +*.tgz +*.zip + +# Logs and databases # +###################### +*.log +*.sql +*.sqlite + +# OS generated files # +###################### +.DS_Store +.DS_Store? +._* +.Spotlight-V100 +.Trashes +ehthumbs.db +Thumbs.db + +# IDE generated files # +###################### +/.ninja_deps +/.ninja_log +/build.ninja +/rules.ninja +*~ +.emacs.desktop + +# Build system generated files # +################################ +CMakeCache.txt +CMakeFiles/ + +# Other # +######### +.clang_complete +.idea +.svn +crash* +*.tmp diff --git a/xdl/third_party/tbb/CHANGES b/xdl/third_party/tbb/CHANGES new file mode 100644 index 00000000..2a02117f --- /dev/null +++ b/xdl/third_party/tbb/CHANGES @@ -0,0 +1,2650 @@ +------------------------------------------------------------------------ +The list of most significant changes made over time in +Intel(R) Threading Building Blocks (Intel(R) TBB). + +Intel TBB 2019 Update 3 +TBB_INTERFACE_VERSION == 11003 + +Changes (w.r.t. Intel TBB 2019 Update 2): + +- Added tbb::transform_iterator. +- Added new Makefile target 'profile' to flow graph examples enabling + additional support for Intel(R) Parallel Studio XE tools. +- Added TBB_MALLOC_DISABLE_REPLACEMENT environment variable to switch off + dynamic memory allocation replacement on Windows*. Inspired by + a contribution from Edward Lam. + +Preview Features: + +- Extended flow graph API to support relative priorities for functional + nodes, specified as an optional parameter to the node constructors. + +Open-source contributions integrated: + +- Enabled using process-local futex operations + (https://github.com/01org/tbb/pull/58) by Andrey Semashev. + +------------------------------------------------------------------------ +Intel TBB 2019 Update 2 +TBB_INTERFACE_VERSION == 11002 + +Changes (w.r.t. Intel TBB 2019 Update 1): + +- Added overloads for parallel_reduce with default partitioner and + user-supplied context. +- Added deduction guides for tbb containers: concurrent_vector, + concurrent_queue, concurrent_bounded_queue, + concurrent_priority_queue. +- Reallocation of memory objects >1MB now copies and frees memory if + the size is decreased twice or more, trading performance off for + reduced memory usage. +- After a period of sleep, TBB worker threads now prefer returning to + their last used task arena. + +Bugs fixed: + +- Fixed compilation of task_group.h when targeting macOS* 10.11 or + earlier (https://github.com/conda-forge/tbb-feedstock/issues/42). + +Open-source contributions integrated: + +- Added constructors with HashCompare argument to concurrent_hash_map + (https://github.com/01org/tbb/pull/63) by arewedancer. + +------------------------------------------------------------------------ +Intel TBB 2019 Update 1 +TBB_INTERFACE_VERSION == 11001 + +Changes (w.r.t. Intel TBB 2019): + +- Doxygen documentation could be built with 'make doxygen' command now. + +Changes affecting backward compatibility: + +- Enforced 8 byte alignment for tbb::atomic and + tbb::atomic. On IA-32 architecture it may cause layout + changes in structures that use these types. + +Bugs fixed: + +- Fixed an issue with dynamic memory allocation replacement on Windows* + occurred for some versions of ucrtbase.dll. +- Fixed possible deadlock in tbbmalloc cleanup procedure during process + shutdown. Inspired by a contribution from Edward Lam. +- Fixed usage of std::uncaught_exception() deprecated in C++17 + (https://github.com/01org/tbb/issues/67). +- Fixed a crash when a local observer is activated after an arena + observer. +- Fixed compilation of task_group.h by Visual C++* 15.7 with + /permissive- option (https://github.com/01org/tbb/issues/53). +- Fixed tbb4py to avoid dependency on Intel(R) C++ Compiler shared + libraries. +- Fixed compilation for Anaconda environment with GCC 7.3 and higher. + +Open-source contributions integrated: + +- Fix various warnings when building with Visual C++ + (https://github.com/01org/tbb/pull/70) by Edward Lam. + +------------------------------------------------------------------------ +Intel TBB 2019 +TBB_INTERFACE_VERSION == 11000 + +Changes (w.r.t. Intel TBB 2018 Update 5): + +- Lightweight policy for functional nodes in the flow graph is now + a fully supported feature. +- Reservation support in flow::write_once_node and flow::overwrite_node + is now a fully supported feature. +- Support for Flow Graph Analyzer and improvements for + Intel(R) VTune(TM) Amplifier become a regular feature enabled by + TBB_USE_THREADING_TOOLS macro. +- Added support for std::new_handler in the replacement functions for + global operator new. +- Added C++14 constructors to concurrent unordered containers. +- Added tbb::counting_iterator and tbb::zip_iterator. +- Fixed multiple -Wextra warnings in TBB source files. + +Preview Features: + +- Extracting nodes from a flow graph is deprecated and disabled by + default. To enable, use TBB_DEPRECATED_FLOW_NODE_EXTRACTION macro. + +Changes affecting backward compatibility: + +- Due to internal changes in the flow graph classes, recompilation is + recommended for all binaries that use the flow graph. + +Open-source contributions integrated: + +- Added support for OpenBSD by Anthony J. Bentley. + +------------------------------------------------------------------------ +Intel TBB 2018 Update 5 +TBB_INTERFACE_VERSION == 10005 + +Changes (w.r.t. Intel TBB 2018 Update 4): + +Preview Features: + +- Added user event tracing API for Intel(R) VTune(TM) Amplifier and + Flow Graph Analyzer. + +Bugs fixed: + +- Fixed the memory allocator to properly support transparent huge pages. +- Removed dynamic exception specifications in tbbmalloc_proxy for C++11 + and later (https://github.com/01org/tbb/issues/41). +- Added -flifetime-dse=1 option when building with GCC on macOS* + (https://github.com/01org/tbb/issues/60). + +Open-source contributions integrated: + +- Added ARMv8 support by Siddhesh Poyarekar. +- Avoid GCC warnings for clearing an object of non-trivial type + (https://github.com/01org/tbb/issues/54) by Daniel Arndt. + +------------------------------------------------------------------------ +Intel TBB 2018 Update 4 +TBB_INTERFACE_VERSION == 10004 + +Changes (w.r.t. Intel TBB 2018 Update 3): + +Preview Features: + +- Improved support for Flow Graph Analyzer and Intel(R) VTune(TM) + Amplifier in the task scheduler and generic parallel algorithms. +- Default device set for opencl_node now includes all the devices from + the first available OpenCL* platform. +- Added lightweight policy for functional nodes in the flow graph. It + indicates that the node body has little work and should, if possible, + be executed immediately upon receiving a message, avoiding task + scheduling overhead. + +------------------------------------------------------------------------ +Intel TBB 2018 Update 3 +TBB_INTERFACE_VERSION == 10003 + +Changes (w.r.t. Intel TBB 2018 Update 2): + +Preview Features: + +- Added template class blocked_rangeNd for a generic multi-dimensional + range (requires C++11). Inspired by a contribution from Jeff Hammond. + +Bugs fixed: + +- Fixed a crash with dynamic memory allocation replacement on + Windows* for applications using system() function. +- Fixed parallel_deterministic_reduce to split range correctly when used + with static_partitioner. +- Fixed a synchronization issue in task_group::run_and_wait() which + caused a simultaneous call to task_group::wait() to return + prematurely. + +------------------------------------------------------------------------ +Intel TBB 2018 Update 2 +TBB_INTERFACE_VERSION == 10002 + +Changes (w.r.t. Intel TBB 2018 Update 1): + +- Added support for Android* NDK r16, macOS* 10.13, Fedora* 26. +- Binaries for Universal Windows Driver (vc14_uwd) now link with static + Microsoft* runtime libraries, and are only available in commercial + releases. +- Extended flow graph documentation with more code samples. + +Preview Features: + +- Added a Python* module for multi-processing computations in numeric + Python* libraries. + +Bugs fixed: + +- Fixed constructors of concurrent_hash_map to be exception-safe. +- Fixed auto-initialization in the main thread to be cleaned up at + shutdown. +- Fixed a crash when tbbmalloc_proxy is used together with dbghelp. +- Fixed static_partitioner to assign tasks properly in case of nested + parallelism. + +------------------------------------------------------------------------ +Intel TBB 2018 Update 1 +TBB_INTERFACE_VERSION == 10001 + +Changes (w.r.t. Intel TBB 2018): + +- Added lambda-friendly overloads for parallel_scan. +- Added support of static and simple partitioners in + parallel_deterministic_reduce. + +Preview Features: + +- Added initial support for Flow Graph Analyzer to parallel_for. +- Added reservation support in overwrite_node and write_once_node. + +Bugs fixed: + +- Fixed a potential deadlock scenario in the flow graph that affected + Intel TBB 2018. + +------------------------------------------------------------------------ +Intel TBB 2018 +TBB_INTERFACE_VERSION == 10000 + +Changes (w.r.t. Intel TBB 2017 Update 7): + +- Introduced Parallel STL, an implementation of the C++ standard + library algorithms with support for execution policies. For more + information, see Getting Started with Parallel STL + (https://software.intel.com/en-us/get-started-with-pstl). +- this_task_arena::isolate() function is now a fully supported feature. +- this_task_arena::isolate() function and task_arena::execute() method + were extended to pass on the value returned by the executed functor + (requires C++11). +- task_arena::enqueue() and task_group::run() methods extended to accept + move-only functors. +- A flow graph now spawns all tasks into the same task arena, + and waiting for graph completion also happens in that arena. +- Improved support for Flow Graph Analyzer in async_node, opencl_node, + and composite_node. +- Added support for Android* NDK r15, r15b. +- Added support for Universal Windows Platform. +- Increased minimally supported version of macOS* + (MACOSX_DEPLOYMENT_TARGET) to 10.11. + +Changes affecting backward compatibility: + +- Internal layout changes in some flow graph classes; +- Several undocumented methods are removed from class graph, + including set_active() and is_active(). +- Due to incompatible changes, the namespace version is updated + for the flow graph; recompilation is recommended for all + binaries that use the flow graph classes. + +Preview Features: + +- opencl_node can be used with any graph object; class opencl_graph + is removed. +- graph::wait_for_all() now automatically waits for all not yet consumed + async_msg objects. +- Improved concurrent_lru_cache::handle_object to support C++11 move + semantics, default construction, and conversion to bool. + +Bugs fixed: + +- Fixed a bug preventing use of streaming_node and opencl_node with + Clang; inspired by a contribution from Francisco Facioni. +- Fixed this_task_arena::isolate() function to work correctly with + parallel_invoke and parallel_do algorithms. +- Fixed a memory leak in composite_node. +- Fixed an assertion failure in debug tbbmalloc binaries when + TBBMALLOC_CLEAN_ALL_BUFFERS is used. + +------------------------------------------------------------------------ +Intel TBB 2017 Update 8 +TBB_INTERFACE_VERSION == 9108 + +Changes (w.r.t. Intel TBB 2017 Update 7): + +Bugs fixed: + +- Fixed an assertion failure in debug tbbmalloc binaries when + TBBMALLOC_CLEAN_ALL_BUFFERS is used. + +------------------------------------------------------------------------ +Intel TBB 2017 Update 7 +TBB_INTERFACE_VERSION == 9107 + +Changes (w.r.t. Intel TBB 2017 Update 6): + +- In the huge pages mode, the memory allocator now is also able to use + transparent huge pages. + +Preview Features: + +- Added support for Intel TBB integration into CMake-aware + projects, with valuable guidance and feedback provided by Brad King + (Kitware). + +Bugs fixed: + +- Fixed scalable_allocation_command(TBBMALLOC_CLEAN_ALL_BUFFERS, 0) + to process memory left after exited threads. + +------------------------------------------------------------------------ +Intel TBB 2017 Update 6 +TBB_INTERFACE_VERSION == 9106 + +Changes (w.r.t. Intel TBB 2017 Update 5): + +- Added support for Android* NDK r14. + +Preview Features: + +- Added a blocking terminate extension to the task_scheduler_init class + that allows an object to wait for termination of worker threads. + +Bugs fixed: + +- Fixed compilation and testing issues with MinGW (GCC 6). +- Fixed compilation with /std:c++latest option of VS 2017 + (https://github.com/01org/tbb/issues/13). + +------------------------------------------------------------------------ +Intel TBB 2017 Update 5 +TBB_INTERFACE_VERSION == 9105 + +Changes (w.r.t. Intel TBB 2017 Update 4): + +- Added support for Microsoft* Visual Studio* 2017. +- Added graph/matmult example to demonstrate support for compute offload + to Intel(R) Graphics Technology in the flow graph API. +- The "compiler" build option now allows to specify a full path to the + compiler. + +Changes affecting backward compatibility: + +- Constructors for many classes, including graph nodes, concurrent + containers, thread-local containers, etc., are declared explicit and + cannot be used for implicit conversions anymore. + +Bugs fixed: + +- Added a workaround for bug 16657 in the GNU C Library (glibc) + affecting the debug version of tbb::mutex. +- Fixed a crash in pool_identify() called for an object allocated in + another thread. + +------------------------------------------------------------------------ +Intel TBB 2017 Update 4 +TBB_INTERFACE_VERSION == 9104 + +Changes (w.r.t. Intel TBB 2017 Update 3): + +- Added support for C++11 move semantics in parallel_do. +- Added support for FreeBSD* 11. + +Changes affecting backward compatibility: + +- Minimal compiler versions required for support of C++11 move semantics + raised to GCC 4.5, VS 2012, and Intel(R) C++ Compiler 14.0. + +Bugs fixed: + +- The workaround for crashes in the library compiled with GCC 6 + (-flifetime-dse=1) was extended to Windows*. + +------------------------------------------------------------------------ +Intel TBB 2017 Update 3 +TBB_INTERFACE_VERSION == 9103 + +Changes (w.r.t. Intel TBB 2017 Update 2): + +- Added support for Android* 7.0 and Android* NDK r13, r13b. + +Preview Features: + +- Added template class gfx_factory to the flow graph API. It implements + the Factory concept for streaming_node to offload computations to + Intel(R) processor graphics. + +Bugs fixed: + +- Fixed a possible deadlock caused by missed wakeup signals in + task_arena::execute(). + +Open-source contributions integrated: + +- A build fix for Linux* s390x platform by Jerry J. + +------------------------------------------------------------------------ +Intel TBB 2017 Update 2 +TBB_INTERFACE_VERSION == 9102 + +Changes (w.r.t. Intel TBB 2017 Update 1): + +- Removed the long-outdated support for Xbox* consoles. + +Bugs fixed: + +- Fixed the issue with task_arena::execute() not being processed when + the calling thread cannot join the arena. +- Fixed dynamic memory allocation replacement failure on macOS* 10.12. + +------------------------------------------------------------------------ +Intel TBB 2017 Update 1 +TBB_INTERFACE_VERSION == 9101 + +Changes (w.r.t. Intel TBB 2017): + +Bugs fixed: + +- Fixed dynamic memory allocation replacement failures on Windows* 10 + Anniversary Update. +- Fixed emplace() method of concurrent unordered containers to not + require a copy constructor. + +------------------------------------------------------------------------ +Intel TBB 2017 +TBB_INTERFACE_VERSION == 9100 + +Changes (w.r.t. Intel TBB 4.4 Update 5): + +- static_partitioner class is now a fully supported feature. +- async_node class is now a fully supported feature. +- Improved dynamic memory allocation replacement on Windows* OS to skip + DLLs for which replacement cannot be done, instead of aborting. +- Intel TBB no longer performs dynamic memory allocation replacement + for Microsoft* Visual Studio* 2008. +- For 64-bit platforms, quadrupled the worst-case limit on the amount + of memory the Intel TBB allocator can handle. +- Added TBB_USE_GLIBCXX_VERSION macro to specify the version of GNU + libstdc++ when it cannot be properly recognized, e.g. when used + with Clang on Linux* OS. Inspired by a contribution from David A. +- Added graph/stereo example to demostrate tbb::flow::async_msg. +- Removed a few cases of excessive user data copying in the flow graph. +- Reworked split_node to eliminate unnecessary overheads. +- Added support for C++11 move semantics to the argument of + tbb::parallel_do_feeder::add() method. +- Added C++11 move constructor and assignment operator to + tbb::combinable template class. +- Added tbb::this_task_arena::max_concurrency() function and + max_concurrency() method of class task_arena returning the maximal + number of threads that can work inside an arena. +- Deprecated tbb::task_arena::current_thread_index() static method; + use tbb::this_task_arena::current_thread_index() function instead. +- All examples for commercial version of library moved online: + https://software.intel.com/en-us/product-code-samples. Examples are + available as a standalone package or as a part of Intel(R) Parallel + Studio XE or Intel(R) System Studio Online Samples packages. + +Changes affecting backward compatibility: + +- Renamed following methods and types in async_node class: + Old New + async_gateway_type => gateway_type + async_gateway() => gateway() + async_try_put() => try_put() + async_reserve() => reserve_wait() + async_commit() => release_wait() +- Internal layout of some flow graph nodes has changed; recompilation + is recommended for all binaries that use the flow graph. + +Preview Features: + +- Added template class streaming_node to the flow graph API. It allows + a flow graph to offload computations to other devices through + streaming or offloading APIs. +- Template class opencl_node reimplemented as a specialization of + streaming_node that works with OpenCL*. +- Added tbb::this_task_arena::isolate() function to isolate execution + of a group of tasks or an algorithm from other tasks submitted + to the scheduler. + +Bugs fixed: + +- Added a workaround for GCC bug #62258 in std::rethrow_exception() + to prevent possible problems in case of exception propagation. +- Fixed parallel_scan to provide correct result if the initial value + of an accumulator is not the operation identity value. +- Fixed a memory corruption in the memory allocator when it meets + internal limits. +- Fixed the memory allocator on 64-bit platforms to align memory + to 16 bytes by default for all allocations bigger than 8 bytes. +- As a workaround for crashes in the Intel TBB library compiled with + GCC 6, added -flifetime-dse=1 to compilation options on Linux* OS. +- Fixed a race in the flow graph implementation. + +Open-source contributions integrated: + +- Enabling use of C++11 'override' keyword by Raf Schietekat. + +------------------------------------------------------------------------ +Intel TBB 4.4 Update 6 +TBB_INTERFACE_VERSION == 9006 + +Changes (w.r.t. Intel TBB 4.4 Update 5): + +- For 64-bit platforms, quadrupled the worst-case limit on the amount + of memory the Intel TBB allocator can handle. + +Bugs fixed: + +- Fixed a memory corruption in the memory allocator when it meets + internal limits. +- Fixed the memory allocator on 64-bit platforms to align memory + to 16 bytes by default for all allocations bigger than 8 bytes. +- Fixed parallel_scan to provide correct result if the initial value + of an accumulator is not the operation identity value. +- As a workaround for crashes in the Intel TBB library compiled with + GCC 6, added -flifetime-dse=1 to compilation options on Linux* OS. + +------------------------------------------------------------------------ +Intel TBB 4.4 Update 5 +TBB_INTERFACE_VERSION == 9005 + +Changes (w.r.t. Intel TBB 4.4 Update 4): + +- Modified graph/fgbzip2 example to remove unnecessary data queuing. + +Preview Features: + +- Added a Python* module which is able to replace Python's thread pool + class with the implementation based on Intel TBB task scheduler. + +Bugs fixed: + +- Fixed the implementation of 64-bit tbb::atomic for IA-32 architecture + to work correctly with GCC 5.2 in C++11/14 mode. +- Fixed a possible crash when tasks with affinity (e.g. specified via + affinity_partitioner) are used simultaneously with task priority + changes. + +------------------------------------------------------------------------ +Intel TBB 4.4 Update 4 +TBB_INTERFACE_VERSION == 9004 + +Changes (w.r.t. Intel TBB 4.4 Update 3): + +- Removed a few cases of excessive user data copying in the flow graph. +- Improved robustness of concurrent_bounded_queue::abort() in case of + simultaneous push and pop operations. + +Preview Features: + +- Added tbb::flow::async_msg, a special message type to support + communications between the flow graph and external asynchronous + activities. +- async_node modified to support use with C++03 compilers. + +Bugs fixed: + +- Fixed a bug in dynamic memory allocation replacement for Windows* OS. +- Fixed excessive memory consumption on Linux* OS caused by enabling + zero-copy realloc. +- Fixed performance regression on Intel(R) Xeon Phi(tm) coprocessor with + auto_partitioner. + +------------------------------------------------------------------------ +Intel TBB 4.4 Update 3 +TBB_INTERFACE_VERSION == 9003 + +Changes (w.r.t. Intel TBB 4.4 Update 2): + +- Modified parallel_sort to not require a default constructor for values + and to use iter_swap() for value swapping. +- Added support for creating or initializing a task_arena instance that + is connected to the arena currently used by the thread. +- graph/binpack example modified to use multifunction_node. +- For performance analysis, use Intel(R) VTune(TM) Amplifier XE 2015 + and higher; older versions are no longer supported. +- Improved support for compilation with disabled RTTI, by omitting its use + in auxiliary code, such as assertions. However some functionality, + particularly the flow graph, does not work if RTTI is disabled. +- The tachyon example for Android* can be built using Android Studio 1.5 + and higher with experimental Gradle plugin 0.4.0. + +Preview Features: + +- Added class opencl_subbufer that allows using OpenCL* sub-buffer + objects with opencl_node. +- Class global_control supports the value of 1 for + max_allowed_parallelism. + +Bugs fixed: + +- Fixed a race causing "TBB Warning: setaffinity syscall failed" message. +- Fixed a compilation issue on OS X* with Intel(R) C++ Compiler 15.0. +- Fixed a bug in queuing_rw_mutex::downgrade() that could temporarily + block new readers. +- Fixed speculative_spin_rw_mutex to stop using the lazy subscription + technique due to its known flaws. +- Fixed memory leaks in the tool support code. + +------------------------------------------------------------------------ +Intel TBB 4.4 Update 2 +TBB_INTERFACE_VERSION == 9002 + +Changes (w.r.t. Intel TBB 4.4 Update 1): + +- Improved interoperability with Intel(R) OpenMP RTL (libiomp) on Linux: + OpenMP affinity settings do not affect the default number of threads + used in the task scheduler. Intel(R) C++ Compiler 16.0 Update 1 + or later is required. +- Added a new flow graph example with different implementations of the + Cholesky Factorization algorithm. + +Preview Features: + +- Added template class opencl_node to the flow graph API. It allows a + flow graph to offload computations to OpenCL* devices. +- Extended join_node to use type-specified message keys. It simplifies + the API of the node by obtaining message keys via functions + associated with the message type (instead of node ports). +- Added static_partitioner that minimizes overhead of parallel_for and + parallel_reduce for well-balanced workloads. +- Improved template class async_node in the flow graph API to support + user settable concurrency limits. + +Bugs fixed: + +- Fixed a possible crash in the GUI layer for library examples on Linux. + +------------------------------------------------------------------------ +Intel TBB 4.4 Update 1 +TBB_INTERFACE_VERSION == 9001 + +Changes (w.r.t. Intel TBB 4.4): + +- Added support for Microsoft* Visual Studio* 2015. +- Intel TBB no longer performs dynamic replacement of memory allocation + functions for Microsoft Visual Studio 2005 and earlier versions. +- For GCC 4.7 and higher, the intrinsics-based platform isolation layer + uses __atomic_* built-ins instead of the legacy __sync_* ones. + This change is inspired by a contribution from Mathieu Malaterre. +- Improvements in task_arena: + Several application threads may join a task_arena and execute tasks + simultaneously. The amount of concurrency reserved for application + threads at task_arena construction can be set to any value between + 0 and the arena concurrency limit. +- The fractal example was modified to demonstrate class task_arena + and moved to examples/task_arena/fractal. + +Bugs fixed: + +- Fixed a deadlock during destruction of task_scheduler_init objects + when one of destructors is set to wait for worker threads. +- Added a workaround for a possible crash on OS X* when dynamic memory + allocator replacement (libtbbmalloc_proxy) is used and memory is + released during application startup. +- Usage of mutable functors with task_group::run_and_wait() and + task_arena::enqueue() is disabled. An attempt to pass a functor + which operator()() is not const will produce compilation errors. +- Makefiles and environment scripts now properly recognize GCC 5.0 and + higher. + +Open-source contributions integrated: + +- Improved performance of parallel_for_each for inputs allowing random + access, by Raf Schietekat. + +------------------------------------------------------------------------ +Intel TBB 4.4 +TBB_INTERFACE_VERSION == 9000 + +Changes (w.r.t. Intel TBB 4.3 Update 6): + +- The following features are now fully supported: + tbb::flow::composite_node; + additional policies of tbb::flow::graph_node::reset(). +- Platform abstraction layer for Windows* OS updated to use compiler + intrinsics for most atomic operations. +- The tbb/compat/thread header updated to automatically include + C++11 where available. +- Fixes and refactoring in the task scheduler and class task_arena. +- Added key_matching policy to tbb::flow::join_node, which removes + the restriction on the type that can be compared-against. +- For tag_matching join_node, tag_value is redefined to be 64 bits + wide on all architectures. +- Expanded the documentation for the flow graph with details about + node semantics and behavior. +- Added dynamic replacement of C11 standard function aligned_alloc() + under Linux* OS. +- Added C++11 move constructors and assignment operators to + tbb::enumerable_thread_specific container. +- Added hashing support for tbb::tbb_thread::id. +- On OS X*, binaries that depend on libstdc++ are not provided anymore. + In the makefiles, libc++ is now used by default; for building with + libstdc++, specify stdlib=libstdc++ in the make command line. + +Preview Features: + +- Added a new example, graph/fgbzip2, that shows usage of + tbb::flow::async_node. +- Modification to the low-level API for memory pools: + added a function for finding a memory pool by an object allocated + from that pool. +- tbb::memory_pool now does not request memory till the first allocation + from the pool. + +Changes affecting backward compatibility: + +- Internal layout of flow graph nodes has changed; recompilation is + recommended for all binaries that use the flow graph. +- Resetting a tbb::flow::source_node will immediately activate it, + unless it was created in inactive state. + +Bugs fixed: + +- Failure at creation of a memory pool will not cause process + termination anymore. + +Open-source contributions integrated: + +- Supported building TBB with Clang on AArch64 with use of built-in + intrinsics by David A. + +------------------------------------------------------------------------ +Intel TBB 4.3 Update 6 +TBB_INTERFACE_VERSION == 8006 + +Changes (w.r.t. Intel TBB 4.3 Update 5): + +- Supported zero-copy realloc for objects >1MB under Linux* via + mremap system call. +- C++11 move-aware insert and emplace methods have been added to + concurrent_hash_map container. +- install_name is set to @rpath/ on OS X*. + +Preview Features: + +- Added template class async_node to the flow graph API. It allows a + flow graph to communicate with an external activity managed by + the user or another runtime. +- Improved speed of flow::graph::reset() clearing graph edges. + rf_extract flag has been renamed rf_clear_edges. +- extract() method of graph nodes now takes no arguments. + +Bugs fixed: + +- concurrent_unordered_{set,map} behaves correctly for degenerate + hashes. +- Fixed a race condition in the memory allocator that may lead to + excessive memory consumption under high multithreading load. + +------------------------------------------------------------------------ +Intel TBB 4.3 Update 5 +TBB_INTERFACE_VERSION == 8005 + +Changes (w.r.t. Intel TBB 4.3 Update 4): + +- Added add_ref_count() method of class tbb::task. + +Preview Features: + +- Added class global_control for application-wide control of allowed + parallelism and thread stack size. +- memory_pool_allocator now throws the std::bad_alloc exception on + allocation failure. +- Exceptions thrown for by memory pool constructors changed from + std::bad_alloc to std::invalid_argument and std::runtime_error. + +Bugs fixed: + +- scalable_allocator now throws the std::bad_alloc exception on + allocation failure. +- Fixed a race condition in the memory allocator that may lead to + excessive memory consumption under high multithreading load. +- A new scheduler created right after destruction of the previous one + might be unable to modify the number of worker threads. + +Open-source contributions integrated: + +- (Added but not enabled) push_front() method of class tbb::task_list + by Raf Schietekat. + +------------------------------------------------------------------------ +Intel TBB 4.3 Update 4 +TBB_INTERFACE_VERSION == 8004 + +Changes (w.r.t. Intel TBB 4.3 Update 3): + +- Added a C++11 variadic constructor for enumerable_thread_specific. + The arguments from this constructor are used to construct + thread-local values. +- Improved exception safety for enumerable_thread_specific. +- Added documentation for tbb::flow::tagged_msg class and + tbb::flow::output_port function. +- Fixed build errors for systems that do not support dynamic linking. +- C++11 move-aware insert and emplace methods have been added to + concurrent unordered containers. + +Preview Features: + +- Interface-breaking change: typedefs changed for node predecessor and + successor lists, affecting copy_predecessors and copy_successors + methods. +- Added template class composite_node to the flow graph API. It packages + a subgraph to represent it as a first-class flow graph node. +- make_edge and remove_edge now accept multiport nodes as arguments, + automatically using the node port with index 0 for an edge. + +Open-source contributions integrated: + +- Draft code for enumerable_thread_specific constructor with multiple + arguments (see above) by Adrien Guinet. +- Fix for GCC invocation on IBM* Blue Gene* + by Jeff Hammond and Raf Schietekat. +- Extended testing with smart pointers for Clang & libc++ + by Raf Schietekat. + +------------------------------------------------------------------------ +Intel TBB 4.3 Update 3 +TBB_INTERFACE_VERSION == 8003 + +Changes (w.r.t. Intel TBB 4.3 Update 2): + +- Move constructor and assignment operator were added to unique_lock. + +Preview Features: + +- Time overhead for memory pool destruction was reduced. + +Open-source contributions integrated: + +- Build error fix for iOS* by Raf Schietekat. + +------------------------------------------------------------------------ +Intel TBB 4.3 Update 2 +TBB_INTERFACE_VERSION == 8002 + +Changes (w.r.t. Intel TBB 4.3 Update 1): + +- Binary files for 64-bit Android* applications were added as part of the + Linux* OS package. +- Exact exception propagation is enabled for Intel C++ Compiler on OS X*. +- concurrent_vector::shrink_to_fit was optimized for types that support + C++11 move semantics. + +Bugs fixed: + +- Fixed concurrent unordered containers to insert elements much faster + in debug mode. +- Fixed concurrent priority queue to support types that do not have + copy constructors. +- Fixed enumerable_thread_specific to forbid copying from an instance + with a different value type. + +Open-source contributions integrated: + +- Support for PathScale* EKOPath* Compiler by Erik Lindahl. + +------------------------------------------------------------------------ +Intel TBB 4.3 Update 1 +TBB_INTERFACE_VERSION == 8001 + +Changes (w.r.t. Intel TBB 4.3): + +- The ability to split blocked_ranges in a proportion, used by + affinity_partitioner since version 4.2 Update 4, became a formal + extension of the Range concept. +- More checks for an incorrect address to release added to the debug + version of the memory allocator. +- Different kind of solutions for each TBB example were merged. + +Preview Features: + +- Task priorities are re-enabled in preview binaries. + +Bugs fixed: + +- Fixed a duplicate symbol when TBB_PREVIEW_VARIADIC_PARALLEL_INVOKE is + used in multiple compilation units. +- Fixed a crash in __itt_fini_ittlib seen on Ubuntu 14.04. +- Fixed a crash in memory release after dynamic replacement of the + OS X* memory allocator. +- Fixed incorrect indexing of arrays in seismic example. +- Fixed a data race in lazy initialization of task_arena. + +Open-source contributions integrated: + +- Fix for dumping information about gcc and clang compiler versions + by Misty De Meo. + +------------------------------------------------------------------------ +Intel TBB 4.3 +TBB_INTERFACE_VERSION == 8000 + +Changes (w.r.t. Intel TBB 4.2 Update 5): + +- The following features are now fully supported: flow::indexer_node, + task_arena, speculative_spin_rw_mutex. +- Compatibility with C++11 standard improved for tbb/compat/thread + and tbb::mutex. +- C++11 move constructors have been added to concurrent_queue and + concurrent_bounded_queue. +- C++11 move constructors and assignment operators have been added to + concurrent_vector, concurrent_hash_map, concurrent_priority_queue, + concurrent_unordered_{set,multiset,map,multimap}. +- C++11 move-aware emplace/push/pop methods have been added to + concurrent_vector, concurrent_queue, concurrent_bounded_queue, + concurrent_priority_queue. +- Methods to insert a C++11 initializer list have been added: + concurrent_vector::grow_by(), concurrent_hash_map::insert(), + concurrent_unordered_{set,multiset,map,multimap}::insert(). +- Testing for compatibility of containers with some C++11 standard + library types has been added. +- Dynamic replacement of standard memory allocation routines has been + added for OS X*. +- Microsoft* Visual Studio* projects for Intel TBB examples updated + to VS 2010. +- For open-source packages, debugging information (line numbers) in + precompiled binaries now matches the source code. +- Debug information was added to release builds for OS X*, Solaris*, + FreeBSD* operating systems and MinGW*. +- Various improvements in documentation, debug diagnostics and examples. + +Preview Features: + +- Additional actions on reset of graphs, and extraction of individual + nodes from a graph (TBB_PREVIEW_FLOW_GRAPH_FEATURES). +- Support for an arbitrary number of arguments in parallel_invoke + (TBB_PREVIEW_VARIADIC_PARALLEL_INVOKE). + +Changes affecting backward compatibility: + +- For compatibility with C++11 standard, copy and move constructors and + assignment operators are disabled for all mutex classes. To allow + the old behavior, use TBB_DEPRECATED_MUTEX_COPYING macro. +- flow::sequencer_node rejects messages with repeating sequence numbers. +- Changed internal interface between tbbmalloc and tbbmalloc_proxy. +- Following deprecated functionality has been removed: + old debugging macros TBB_DO_ASSERT & TBB_DO_THREADING_TOOLS; + no-op depth-related methods in class task; + tbb::deprecated::concurrent_queue; + deprecated variants of concurrent_vector methods. +- register_successor() and remove_successor() are deprecated as methods + to add and remove edges in flow::graph; use make_edge() and + remove_edge() instead. + +Bugs fixed: + +- Fixed incorrect scalable_msize() implementation for aligned objects. +- Flow graph buffering nodes now destroy their copy of forwarded items. +- Multiple fixes in task_arena implementation, including for: + inconsistent task scheduler state inside executed functions; + incorrect floating-point settings and exception propagation; + possible stalls in concurrent invocations of execute(). +- Fixed floating-point settings propagation when the same instance of + task_group_context is used in different arenas. +- Fixed compilation error in pipeline.h with Intel Compiler on OS X*. +- Added missed headers for individual components to tbb.h. + +Open-source contributions integrated: + +- Range interface addition to parallel_do, parallel_for_each and + parallel_sort by Stephan Dollberg. +- Variadic template implementation of parallel_invoke + by Kizza George Mbidde (see Preview Features). +- Improvement in Seismic example for MacBook Pro* with Retina* display + by Raf Schietekat. + +------------------------------------------------------------------------ +Intel TBB 4.2 Update 5 +TBB_INTERFACE_VERSION == 7005 + +Changes (w.r.t. Intel TBB 4.2 Update 4): + +- The second template argument of class aligned_space now is set + to 1 by default. + +Preview Features: + +- Better support for exception safety, task priorities and floating + point settings in class task_arena. +- task_arena::current_slot() has been renamed to + task_arena::current_thread_index(). + +Bugs fixed: + +- Task priority change possibly ignored by a worker thread entering + a nested parallel construct. +- Memory leaks inside the task scheduler when running on + Intel(R) Xeon Phi(tm) coprocessor. + +Open-source contributions integrated: + +- Improved detection of X Window support for Intel TBB examples + and other feedback by Raf Schietekat. + +------------------------------------------------------------------------ +Intel TBB 4.2 Update 4 +TBB_INTERFACE_VERSION == 7004 + +Changes (w.r.t. Intel TBB 4.2 Update 3): + +- Added possibility to specify floating-point settings at invocation + of most parallel algorithms (including flow::graph) via + task_group_context. +- Added dynamic replacement of malloc_usable_size() under + Linux*/Android* and dlmalloc_usable_size() under Android*. +- Added new methods to concurrent_vector: + grow_by() that appends a sequence between two given iterators; + grow_to_at_least() that initializes new elements with a given value. +- Improved affinity_partitioner for better performance on balanced + workloads. +- Improvements in the task scheduler, including better scalability + when threads search for a task arena, and better diagnostics. +- Improved allocation performance for workloads that do intensive + allocation/releasing of same-size objects larger than ~8KB from + multiple threads. +- Exception support is enabled by default for 32-bit MinGW compilers. +- The tachyon example for Android* can be built for all targets + supported by the installed NDK. +- Added Windows Store* version of the tachyon example. +- GettingStarted/sub_string_finder example ported to offload execution + on Windows* for Intel(R) Many Integrated Core Architecture. + +Preview Features: + +- Removed task_scheduler_observer::on_scheduler_leaving() callback. +- Added task_scheduler_observer::may_sleep() callback. +- The CPF or_node has been renamed indexer_node. The input to + indexer_node is now a list of types. The output of indexer_node is + a tagged_msg type composed of a tag and a value. For indexer_node, + the tag is a size_t. + +Bugs fixed: + +- Fixed data races in preview extensions of task_scheduler_observer. +- Added noexcept(false) for destructor of task_group_base to avoid + crash on cancellation of structured task group in C++11. + +Open-source contributions integrated: + +- Improved concurrency detection for BG/Q, and other improvements + by Raf Schietekat. +- Fix for crashes in enumerable_thread_specific in case if a contained + object is too big to be constructed on the stack by Adrien Guinet. + +------------------------------------------------------------------------ +Intel TBB 4.2 Update 3 +TBB_INTERFACE_VERSION == 7003 + +Changes (w.r.t. Intel TBB 4.2 Update 2): + +- Added support for Microsoft* Visual Studio* 2013. +- Improved Microsoft* PPL-compatible form of parallel_for for better + support of auto-vectorization. +- Added a new example for cancellation and reset in the flow graph: + Kohonen self-organizing map (examples/graph/som). +- Various improvements in source code, tests, and makefiles. + +Bugs fixed: + +- Added dynamic replacement of _aligned_msize() previously missed. +- Fixed task_group::run_and_wait() to throw invalid_multiple_scheduling + exception if the specified task handle is already scheduled. + +Open-source contributions integrated: + +- A fix for ARM* processors by Steve Capper. +- Improvements in std::swap calls by Robert Maynard. + +------------------------------------------------------------------------ +Intel TBB 4.2 Update 2 +TBB_INTERFACE_VERSION == 7002 + +Changes (w.r.t. Intel TBB 4.2 Update 1): + +- Enable C++11 features for Microsoft* Visual Studio* 2013 Preview. +- Added a test for compatibility of TBB containers with C++11 + range-based for loop. + +Changes affecting backward compatibility: + +- Internal layout changed for class tbb::flow::limiter_node. + +Preview Features: + +- Added speculative_spin_rw_mutex, a read-write lock class which uses + Intel(R) Transactional Synchronization Extensions. + +Bugs fixed: + +- When building for Intel(R) Xeon Phi(tm) coprocessor, TBB programs + no longer require explicit linking with librt and libpthread. + +Open-source contributions integrated: + +- Fixes for ARM* processors by Steve Capper, Leif Lindholm + and Steven Noonan. +- Support for Clang on Linux by Raf Schietekat. +- Typo correction in scheduler.cpp by Julien Schueller. + +------------------------------------------------------------------------ +Intel TBB 4.2 Update 1 +TBB_INTERFACE_VERSION == 7001 + +Changes (w.r.t. Intel TBB 4.2): + +- Added project files for Microsoft* Visual Studio* 2010. +- Initial support of Microsoft* Visual Studio* 2013 Preview. +- Enable C++11 features available in Intel(R) C++ Compiler 14.0. +- scalable_allocation_mode(TBBMALLOC_SET_SOFT_HEAP_LIMIT, ) can be + used to urge releasing memory from tbbmalloc internal buffers when + the given limit is exceeded. + +Preview Features: + +- Class task_arena no longer requires linking with a preview library, + though still remains a community preview feature. +- The method task_arena::wait_until_empty() is removed. +- The method task_arena::current_slot() now returns -1 if + the task scheduler is not initialized in the thread. + +Changes affecting backward compatibility: + +- Because of changes in internal layout of graph nodes, the namespace + interface number of flow::graph has been incremented from 6 to 7. + +Bugs fixed: + +- Fixed a race in lazy initialization of task_arena. +- Fixed flow::graph::reset() to prevent situations where tasks would be + spawned in the process of resetting the graph to its initial state. +- Fixed decrement bug in limiter_node. +- Fixed a race in arc deletion in the flow graph. + +Open-source contributions integrated: + +- Improved support for IBM* Blue Gene* by Raf Schietekat. + +------------------------------------------------------------------------ +Intel TBB 4.2 +TBB_INTERFACE_VERSION == 7000 + +Changes (w.r.t. Intel TBB 4.1 Update 4): + +- Added speculative_spin_mutex, which uses Intel(R) Transactional + Synchronization Extensions when they are supported by hardware. +- Binary files linked with libc++ (the C++ standard library in Clang) + were added on OS X*. +- For OS X* exact exception propagation is supported with Clang; + it requires use of libc++ and corresponding Intel TBB binaries. +- Support for C++11 initializer lists in constructor and assigment + has been added to concurrent_hash_map, concurrent_unordered_set, + concurrent_unordered_multiset, concurrent_unordered_map, + concurrent_unordered_multimap. +- The memory allocator may now clean its per-thread memory caches + when it cannot get more memory. +- Added the scalable_allocation_command() function for on-demand + cleaning of internal memory caches. +- Reduced the time overhead for freeing memory objects smaller than ~8K. +- Simplified linking with the debug library for applications that use + Intel TBB in code offloaded to Intel(R) Xeon Phi(tm) coprocessors. + See an example in + examples/GettingStarted/sub_string_finder/Makefile. +- Various improvements in source code, scripts and makefiles. + +Changes affecting backward compatibility: + +- tbb::flow::graph has been modified to spawn its tasks; + the old behaviour (task enqueuing) is deprecated. This change may + impact applications that expected a flow graph to make progress + without calling wait_for_all(), which is no longer guaranteed. See + the documentation for more details. +- Changed the return values of the scalable_allocation_mode() function. + +Bugs fixed: + +- Fixed a leak of parallel_reduce body objects when execution is + cancelled or an exception is thrown, as suggested by Darcy Harrison. +- Fixed a race in the task scheduler which can lower the effective + priority despite the existence of higher priority tasks. +- On Linux an error during destruction of the internal thread local + storage no longer results in an exception. + +Open-source contributions integrated: + +- Fixed task_group_context state propagation to unrelated context trees + by Raf Schietekat. + +------------------------------------------------------------------------ +Intel TBB 4.1 Update 4 +TBB_INTERFACE_VERSION == 6105 + +Changes (w.r.t. Intel TBB 4.1 Update 3): + +- Use /volatile:iso option with VS 2012 to disable extended + semantics for volatile variables. +- Various improvements in affinity_partitioner, scheduler, + tests, examples, makefiles. +- Concurrent_priority_queue class now supports initialization/assignment + via C++11 initializer list feature (std::initializer_list). + +Bugs fixed: + +- Fixed more possible stalls in concurrent invocations of + task_arena::execute(), especially waiting for enqueued tasks. +- Fixed requested number of workers for task_arena(P,0). +- Fixed interoperability with Intel(R) VTune(TM) Amplifier XE in + case of using task_arena::enqueue() from a terminating thread. + +Open-source contributions integrated: + +- Type fixes, cleanups, and code beautification by Raf Schietekat. +- Improvements in atomic operations for big endian platforms + by Raf Schietekat. + +------------------------------------------------------------------------ +Intel TBB 4.1 Update 3 +TBB_INTERFACE_VERSION == 6103 + +Changes (w.r.t. Intel TBB 4.1 Update 2): + +- Binary files for Android* applications were added to the Linux* OS + package. +- Binary files for Windows Store* applications were added to the + Windows* OS package. +- Exact exception propagation (exception_ptr) support on Linux OS is + now turned on by default for GCC 4.4 and higher. +- Stopped implicit use of large memory pages by tbbmalloc (Linux-only). + Now use of large pages must be explicitly enabled with + scalable_allocation_mode() function or TBB_MALLOC_USE_HUGE_PAGES + environment variable. + +Community Preview Features: + +- Extended class task_arena constructor and method initialize() to + allow some concurrency to be reserved strictly for application + threads. +- New methods terminate() and is_active() were added to class + task_arena. + +Bugs fixed: + +- Fixed initialization of hashing helper constant in the hash + containers. +- Fixed possible stalls in concurrent invocations of + task_arena::execute() when no worker thread is available to make + progress. +- Fixed incorrect calculation of hardware concurrency in the presence + of inactive processor groups, particularly on systems running + Windows* 8 and Windows* Server 2012. + +Open-source contributions integrated: + +- The fix for the GUI examples on OS X* systems by Raf Schietekat. +- Moved some power-of-2 calculations to functions to improve readability + by Raf Schietekat. +- C++11/Clang support improvements by arcata. +- ARM* platform isolation layer by Steve Capper, Leif Lindholm, Leo Lara + (ARM). + +------------------------------------------------------------------------ +Intel TBB 4.1 Update 2 +TBB_INTERFACE_VERSION == 6102 + +Changes (w.r.t. Intel TBB 4.1 Update 1): + +- Objects up to 128 MB are now cached by the tbbmalloc. Previously + the threshold was 8MB. Objects larger than 128 MB are still + processed by direct OS calls. +- concurrent_unordered_multiset and concurrent_unordered_multimap + have been added, based on Microsoft* PPL prototype. +- Ability to value-initialize a tbb::atomic variable on construction + in C++11, with const expressions properly supported. + +Community Preview Features: + +- Added a possibility to wait until all worker threads terminate. + This is necessary before calling fork() from an application. + +Bugs fixed: + +- Fixed data race in tbbmalloc that might lead to memory leaks + for large object allocations. +- Fixed task_arena::enqueue() to use task_group_context of target arena. +- Improved implementation of 64 bit atomics on ia32. + +------------------------------------------------------------------------ +Intel TBB 4.1 Update 1 +TBB_INTERFACE_VERSION == 6101 + +Changes (w.r.t. Intel TBB 4.1): + +- concurrent_vector class now supports initialization/assignment + via C++11 initializer list feature (std::initializer_list) +- Added implementation of the platform isolation layer based on + Intel compiler atomic built-ins; it is supposed to work on + any platform supported by compiler version 12.1 and newer. +- Using GetNativeSystemInfo() instead of GetSystemInfo() to support + more than 32 processors for 32-bit applications under WOW64. +- The following form of parallel_for: + parallel_for(first, last, [step,] f[, context]) now accepts an + optional partitioner parameter after the function f. + +Backward-incompatible API changes: + +- The library no longer injects tuple in to namespace std. + In previous releases, tuple was injected into namespace std by + flow_graph.h when std::tuple was not available. In this release, + flow_graph.h now uses tbb::flow::tuple. On platforms where + std::tuple is available, tbb::flow::tuple is typedef'ed to + std::tuple. On all other platforms, tbb::flow::tuple provides + a subset of the functionality defined by std::tuple. Users of + flow_graph.h may need to change their uses of std::tuple to + tbb::flow::tuple to ensure compatibility with non-C++11 compliant + compilers. + +Bugs fixed: + +- Fixed local observer to be able to override propagated CPU state and + to provide correct value of task_arena::current_slot() in callbacks. + +------------------------------------------------------------------------ +Intel TBB 4.1 +TBB_INTERFACE_VERSION == 6100 + +Changes (w.r.t. Intel TBB 4.0 Update 5): + +- _WIN32_WINNT must be set to 0x0501 or greater in order to use TBB + on Microsoft* Windows*. +- parallel_deterministic_reduce template function is fully supported. +- TBB headers can be used with C++0x/C++11 mode (-std=c++0x) of GCC + and Intel(R) Compiler. +- C++11 std::make_exception_ptr is used where available, instead of + std::copy_exception from earlier C++0x implementations. +- Improvements in the TBB allocator to reduce extra memory consumption. +- Partial refactoring of the task scheduler data structures. +- TBB examples allow more flexible specification of the thread number, + including arithmetic and geometric progression. + +Bugs fixed: + +- On Linux & OS X*, pre-built TBB binaries do not yet support exact + exception propagation via C++11 exception_ptr. To prevent run time + errors, by default TBB headers disable exact exception propagation + even if the C++ implementation provides exception_ptr. + +Community Preview Features: + +- Added: class task_arena, for work submission by multiple application + threads with thread-independent control of concurrency level. +- Added: task_scheduler_observer can be created as local to a master + thread, to observe threads that work on behalf of that master. + Local observers may have new on_scheduler_leaving() callback. + +------------------------------------------------------------------------ +Intel TBB 4.0 Update 5 +TBB_INTERFACE_VERSION == 6005 + +Changes (w.r.t. Intel TBB 4.0 Update 4): + +- Parallel pipeline optimization (directly storing small objects in the + interstage data buffers) limited to trivially-copyable types for + C++11 and a short list of types for earlier compilers. +- _VARIADIC_MAX switch is honored for TBB tuple implementation + and flow::graph nodes based on tuple. +- Support of Cocoa framework was added to the GUI examples on OS X* + systems. + +Bugs fixed: + +- Fixed a tv_nsec overflow bug in condition_variable::wait_for. +- Fixed execution order of enqueued tasks with different priorities. +- Fixed a bug with task priority changes causing lack of progress + for fire-and-forget tasks when TBB was initialized to use 1 thread. +- Fixed duplicate symbol problem when linking multiple compilation + units that include flow_graph.h on VC 10. + +------------------------------------------------------------------------ +Intel TBB 4.0 Update 4 +TBB_INTERFACE_VERSION == 6004 + +Changes (w.r.t. Intel TBB 4.0 Update 3): + +- The TBB memory allocator transparently supports large pages on Linux. +- A new flow_graph example, logic_sim, was added. +- Support for DirectX* 9 was added to GUI examples. + +Community Preview Features: + +- Added: aggregator, a new concurrency control mechanism. + +Bugs fixed: + +- The abort operation on concurrent_bounded_queue now leaves the queue + in a reusable state. If a bad_alloc or bad_last_alloc exception is + thrown while the queue is recovering from an abort, that exception + will be reported instead of user_abort on the thread on which it + occurred, and the queue will not be reusable. +- Steal limiting heuristic fixed to avoid premature stealing disabling + when large amount of __thread data is allocated on thread stack. +- Fixed a low-probability leak of arenas in the task scheduler. +- In STL-compatible allocator classes, the method construct() was fixed + to comply with C++11 requirements. +- Fixed a bug that prevented creation of fixed-size memory pools + smaller than 2M. +- Significantly reduced the amount of warnings from various compilers. + +Open-source contributions integrated: + +- Multiple improvements by Raf Schietekat. +- Basic support for Clang on OS X* by Blas Rodriguez Somoza. +- Fixes for warnings and corner-case bugs by Blas Rodriguez Somoza + and Edward Lam. + +------------------------------------------------------------------------ +Intel TBB 4.0 Update 3 +TBB_INTERFACE_VERSION == 6003 + +Changes (w.r.t. Intel TBB 4.0 Update 2): + +- Modifications to the low-level API for memory pools: + added support for aligned allocations; + pool policies reworked to allow backward-compatible extensions; + added a policy to not return memory space till destruction; + pool_reset() does not return memory space anymore. +- Class tbb::flow::graph_iterator added to iterate over all nodes + registered with a graph instance. +- multioutput_function_node has been renamed multifunction_node. + multifunction_node and split_node are now fully-supported features. +- For the tagged join node, the policy for try_put of an item with + already existing tag has been defined: the item will be rejected. +- Matching the behavior on Windows, on other platforms the optional + shared libraries (libtbbmalloc, libirml) now are also searched + only in the directory where libtbb is located. +- The platform isolation layer based on GCC built-ins is extended. + +Backward-incompatible API changes: + +- a graph reference parameter is now required to be passed to the + constructors of the following flow graph nodes: overwrite_node, + write_once_node, broadcast_node, and the CPF or_node. +- the following tbb::flow node methods and typedefs have been renamed: + Old New + join_node and or_node: + inputs() -> input_ports() + input_ports_tuple_type -> input_ports_type + multifunction_node and split_node: + ports_type -> output_ports_type + +Bugs fixed: + +- Not all logical processors were utilized on systems with more than + 64 cores split by Windows into several processor groups. + +------------------------------------------------------------------------ +Intel TBB 4.0 Update 2 commercial-aligned release +TBB_INTERFACE_VERSION == 6002 + +Changes (w.r.t. Intel TBB 4.0 Update 1 commercial-aligned release): + +- concurrent_bounded_queue now has an abort() operation that releases + threads involved in pending push or pop operations. The released + threads will receive a tbb::user_abort exception. +- Added Community Preview Feature: concurrent_lru_cache container, + a concurrent implementation of LRU (least-recently-used) cache. + +Bugs fixed: + +- fixed a race condition in the TBB scalable allocator. +- concurrent_queue counter wraparound bug was fixed, which occurred when + the number of push and pop operations exceeded ~>4 billion on IA32. +- fixed races in the TBB scheduler that could put workers asleep too + early, especially in presence of affinitized tasks. + +------------------------------------------------------------------------ +Intel TBB 4.0 Update 1 commercial-aligned release +TBB_INTERFACE_VERSION == 6000 (forgotten to increment) + +Changes (w.r.t. Intel TBB 4.0 commercial-aligned release): + +- Memory leaks fixed in binpack example. +- Improvements and fixes in the TBB allocator. + +------------------------------------------------------------------------ +Intel TBB 4.0 commercial-aligned release +TBB_INTERFACE_VERSION == 6000 + +Changes (w.r.t. Intel TBB 3.0 Update 8 commercial-aligned release): + +- concurrent_priority_queue is now a fully supported feature. + Capacity control methods were removed. +- Flow graph is now a fully supported feature. +- A new memory backend has been implemented in the TBB allocator. + It can reuse freed memory for both small and large objects, and + returns unused memory blocks to the OS more actively. +- Improved partitioning algorithms for parallel_for and parallel_reduce + to better handle load imbalance. +- The convex_hull example has been refactored for reproducible + performance results. +- The major interface version has changed from 5 to 6. + Deprecated interfaces might be removed in future releases. + +Community Preview Features: + +- Added: serial subset, i.e. sequential implementations of TBB generic + algorithms (currently, only provided for parallel_for). +- Preview of new flow graph nodes: + or_node (accepts multiple inputs, forwards each input separately + to all successors), + split_node (accepts tuples, and forwards each element of a tuple + to a corresponding successor), and + multioutput_function_node (accepts one input, and passes the input + and a tuple of output ports to the function body to support outputs + to multiple successors). +- Added: memory pools for more control on memory source, grouping, + and collective deallocation. + +------------------------------------------------------------------------ +Intel TBB 3.0 Update 8 commercial-aligned release +TBB_INTERFACE_VERSION == 5008 + +Changes (w.r.t. Intel TBB 3.0 Update 7 commercial-aligned release): + +- Task priorities become an official feature of TBB, + not community preview as before. +- Atomics API extended, and implementation refactored. +- Added task::set_parent() method. +- Added concurrent_unordered_set container. + +Open-source contributions integrated: + +- PowerPC support by Raf Schietekat. +- Fix of potential task pool overrun and other improvements + in the task scheduler by Raf Schietekat. +- Fix in parallel_for_each to work with std::set in Visual* C++ 2010. + +Community Preview Features: + +- Graph community preview feature was renamed to flow graph. + Multiple improvements in the implementation. + Binpack example was added for the feature. +- A number of improvements to concurrent_priority_queue. + Shortpath example was added for the feature. +- TBB runtime loaded functionality was added (Windows*-only). + It allows to specify which versions of TBB should be used, + as well as to set directories for the library search. +- parallel_deterministic_reduce template function was added. + +------------------------------------------------------------------------ +Intel TBB 3.0 Update 7 commercial-aligned release +TBB_INTERFACE_VERSION == 5006 (forgotten to increment) + +Changes (w.r.t. Intel TBB 3.0 Update 6 commercial-aligned release): + +- Added implementation of the platform isolation layer based on + GCC atomic built-ins; it is supposed to work on any platform + where GCC has these built-ins. + +Community Preview Features: + +- Graph's dining_philosophers example added. +- A number of improvements to graph and concurrent_priority_queue. + + +------------------------------------------------------------------------ +Intel TBB 3.0 Update 6 commercial-aligned release +TBB_INTERFACE_VERSION == 5006 + +Changes (w.r.t. Intel TBB 3.0 Update 5 commercial-aligned release): + +- Added Community Preview feature: task and task group priority, and + Fractal example demonstrating it. +- parallel_pipeline optimized for data items of small and large sizes. +- Graph's join_node is now parametrized with a tuple of up to 10 types. +- Improved performance of concurrent_priority_queue. + +Open-source contributions integrated: + +- Initial NetBSD support by Aleksej Saushev. + +Bugs fixed: + +- Failure to enable interoperability with Intel(R) Cilk(tm) Plus runtime + library, and a crash caused by invoking the interoperability layer + after one of the libraries was unloaded. +- Data race that could result in concurrent_unordered_map structure + corruption after call to clear() method. +- Stack corruption caused by PIC version of 64-bit CAS compiled by Intel + compiler on Linux. +- Inconsistency of exception propagation mode possible when application + built with Microsoft* Visual Studio* 2008 or earlier uses TBB built + with Microsoft* Visual Studio* 2010. +- Affinitizing master thread to a subset of available CPUs after TBB + scheduler was initialized tied all worker threads to the same CPUs. +- Method is_stolen_task() always returned 'false' for affinitized tasks. +- write_once_node and overwrite_node did not immediately send buffered + items to successors + +------------------------------------------------------------------------ +Intel TBB 3.0 Update 5 commercial-aligned release +TBB_INTERFACE_VERSION == 5005 + +Changes (w.r.t. Intel TBB 3.0 Update 4 commercial-aligned release): + +- Added Community Preview feature: graph. +- Added automatic propagation of master thread FPU settings to + TBB worker threads. +- Added a public function to perform a sequentially consistent full + memory fence: tbb::atomic_fence() in tbb/atomic.h. + +Bugs fixed: + +- Data race that could result in scheduler data structures corruption + when using fire-and-forget tasks. +- Potential referencing of destroyed concurrent_hash_map element after + using erase(accessor&A) method with A acquired as const_accessor. +- Fixed a correctness bug in the convex hull example. + +Open-source contributions integrated: + +- Patch for calls to internal::atomic_do_once() by Andrey Semashev. + +------------------------------------------------------------------------ +Intel TBB 3.0 Update 4 commercial-aligned release +TBB_INTERFACE_VERSION == 5004 + +Changes (w.r.t. Intel TBB 3.0 Update 3 commercial-aligned release): + +- Added Community Preview feature: concurrent_priority_queue. +- Fixed library loading to avoid possibility for remote code execution, + see http://www.microsoft.com/technet/security/advisory/2269637.mspx. +- Added support of more than 64 cores for appropriate Microsoft* + Windows* versions. For more details, see + http://msdn.microsoft.com/en-us/library/dd405503.aspx. +- Default number of worker threads is adjusted in accordance with + process affinity mask. + +Bugs fixed: + +- Calls of scalable_* functions from inside the allocator library + caused issues if the functions were overridden by another module. +- A crash occurred if methods run() and wait() were called concurrently + for an empty tbb::task_group (1736). +- The tachyon example exhibited build problems associated with + bug 554339 on Microsoft* Visual Studio* 2010. Project files were + modified as a partial workaround to overcome the problem. See + http://connect.microsoft.com/VisualStudio/feedback/details/554339. + +------------------------------------------------------------------------ +Intel TBB 3.0 Update 3 commercial-aligned release +TBB_INTERFACE_VERSION == 5003 + +Changes (w.r.t. Intel TBB 3.0 Update 2 commercial-aligned release): + +- cache_aligned_allocator class reworked to use scalable_aligned_malloc. +- Improved performance of count() and equal_range() methods + in concurrent_unordered_map. +- Improved implementation of 64-bit atomic loads and stores on 32-bit + platforms, including compilation with VC 7.1. +- Added implementation of atomic operations on top of OSAtomic API + provided by OS X*. +- Removed gratuitous try/catch blocks surrounding thread function calls + in tbb_thread. +- Xcode* projects were added for sudoku and game_of_life examples. +- Xcode* projects were updated to work without TBB framework. + +Bugs fixed: + +- Fixed a data race in task scheduler destruction that on rare occasion + could result in memory corruption. +- Fixed idle spinning in thread bound filters in tbb::pipeline (1670). + +Open-source contributions integrated: + +- MinGW-64 basic support by brsomoza (partially). +- Patch for atomic.h by Andrey Semashev. +- Support for AIX & GCC on PowerPC by Giannis Papadopoulos. +- Various improvements by Raf Schietekat. + +------------------------------------------------------------------------ +Intel TBB 3.0 Update 2 commercial-aligned release +TBB_INTERFACE_VERSION == 5002 + +Changes (w.r.t. Intel TBB 3.0 Update 1 commercial-aligned release): + +- Destructor of tbb::task_group class throws missing_wait exception + if there are tasks running when it is invoked. +- Interoperability layer with Intel Cilk Plus runtime library added + to protect TBB TLS in case of nested usage with Intel Cilk Plus. +- Compilation fix for dependent template names in concurrent_queue. +- Memory allocator code refactored to ease development and maintenance. + +Bugs fixed: + +- Improved interoperability with other Intel software tools on Linux in + case of dynamic replacement of memory allocator (1700) +- Fixed install issues that prevented installation on + Mac OS* X 10.6.4 (1711). + +------------------------------------------------------------------------ +Intel TBB 3.0 Update 1 commercial-aligned release +TBB_INTERFACE_VERSION == 5000 (forgotten to increment) + +Changes (w.r.t. Intel TBB 3.0 commercial-aligned release): + +- Decreased memory fragmentation by allocations bigger than 8K. +- Lazily allocate worker threads, to avoid creating unnecessary stacks. + +Bugs fixed: + +- TBB allocator used much more memory than malloc (1703) - see above. +- Deadlocks happened in some specific initialization scenarios + of the TBB allocator (1701, 1704). +- Regression in enumerable_thread_specific: excessive requirements + for object constructors. +- A bug in construction of parallel_pipeline filters when body instance + was a temporary object. +- Incorrect usage of memory fences on PowerPC and XBOX360 platforms. +- A subtle issue in task group context binding that could result + in cancellation signal being missed by nested task groups. +- Incorrect construction of concurrent_unordered_map if specified + number of buckets is not power of two. +- Broken count() and equal_range() of concurrent_unordered_map. +- Return type of postfix form of operator++ for hash map's iterators. + +------------------------------------------------------------------------ +Intel TBB 3.0 commercial-aligned release +TBB_INTERFACE_VERSION == 5000 + +Changes (w.r.t. Intel TBB 2.2 Update 3 commercial-aligned release): + +- All open-source-release changes down to TBB 2.2 U3 below + were incorporated into this release. + +------------------------------------------------------------------------ +20100406 open-source release + +Changes (w.r.t. 20100310 open-source release): + +- Added support for Microsoft* Visual Studio* 2010, including binaries. +- Added a PDF file with recommended Design Patterns for TBB. +- Added parallel_pipeline function and companion classes and functions + that provide a strongly typed lambda-friendly pipeline interface. +- Reworked enumerable_thread_specific to use a custom implementation of + hash map that is more efficient for ETS usage models. +- Added example for class task_group; see examples/task_group/sudoku. +- Removed two examples, as they were long outdated and superceded: + pipeline/text_filter (use pipeline/square); + parallel_while/parallel_preorder (use parallel_do/parallel_preorder). +- PDF documentation updated. +- Other fixes and changes in code, tests, and examples. + +Bugs fixed: + +- Eliminated build errors with MinGW32. +- Fixed post-build step and other issues in VS projects for examples. +- Fixed discrepancy between scalable_realloc and scalable_msize that + caused crashes with malloc replacement on Windows. + +------------------------------------------------------------------------ +20100310 open-source release + +Changes (w.r.t. Intel TBB 2.2 Update 3 commercial-aligned release): + +- Version macros changed in anticipation of a future release. +- Directory structure aligned with Intel(R) C++ Compiler; + now TBB binaries reside in //[bin|lib] + (in TBB 2.x, it was [bin|lib]//). +- Visual Studio projects changed for examples: instead of separate set + of files for each VS version, now there is single 'msvs' directory + that contains workspaces for MS C++ compiler (_cl.sln) and + Intel C++ compiler (_icl.sln). Works with VS 2005 and above. +- The name versioning scheme for backward compatibility was improved; + now compatibility-breaking changes are done in a separate namespace. +- Added concurrent_unordered_map implementation based on a prototype + developed in Microsoft for a future version of PPL. +- Added PPL-compatible writer-preference RW lock (reader_writer_lock). +- Added TBB_IMPLEMENT_CPP0X macro to control injection of C++0x names + implemented in TBB into namespace std. +- Added almost-C++0x-compatible std::condition_variable, plus a bunch + of other C++0x classes required by condition_variable. +- With TBB_IMPLEMENT_CPP0X, tbb_thread can be also used as std::thread. +- task.cpp was split into several translation units to structure + TBB scheduler sources layout. Static data layout and library + initialization logic were also updated. +- TBB scheduler reworked to prevent master threads from stealing + work belonging to other masters. +- Class task was extended with enqueue() method, and slightly changed + semantics of methods spawn() and destroy(). For exact semantics, + refer to TBB Reference manual. +- task_group_context now allows for destruction by non-owner threads. +- Added TBB_USE_EXCEPTIONS macro to control use of exceptions in TBB + headers. It turns off (i.e. sets to 0) automatically if specified + compiler options disable exception handling. +- TBB is enabled to run on top of Microsoft's Concurrency Runtime + on Windows* 7 (via our worker dispatcher known as RML). +- Removed old unused busy-waiting code in concurrent_queue. +- Described the advanced build & test options in src/index.html. +- Warning level for GCC raised with -Wextra and a few other options. +- Multiple fixes and improvements in code, tests, examples, and docs. + +Open-source contributions integrated: + +- Xbox support by Roman Lut (Deep Shadows), though further changes are + required to make it working; e.g. post-2.1 entry points are missing. +- "Eventcount" by Dmitry Vyukov evolved into concurrent_monitor, + an internal class used in the implementation of concurrent_queue. + +------------------------------------------------------------------------ +Intel TBB 2.2 Update 3 commercial-aligned release +TBB_INTERFACE_VERSION == 4003 + +Changes (w.r.t. Intel TBB 2.2 Update 2 commercial-aligned release): + +- PDF documentation updated. + +Bugs fixed: + +- concurrent_hash_map compatibility issue exposed on Linux in case + two versions of the container were used by different modules. +- enforce 16 byte stack alignment for consistence with GCC; required + to work correctly with 128-bit variables processed by SSE. +- construct() methods of allocator classes now use global operator new. + +------------------------------------------------------------------------ +Intel TBB 2.2 Update 2 commercial-aligned release +TBB_INTERFACE_VERSION == 4002 + +Changes (w.r.t. Intel TBB 2.2 Update 1 commercial-aligned release): + +- parallel_invoke and parallel_for_each now take function objects + by const reference, not by value. +- Building TBB with /MT is supported, to avoid dependency on particular + versions of Visual C++* runtime DLLs. TBB DLLs built with /MT + are located in vc_mt directory. +- Class critical_section introduced. +- Improvements in exception support: new exception classes introduced, + all exceptions are thrown via an out-of-line internal method. +- Improvements and fixes in the TBB allocator and malloc replacement, + including robust memory identification, and more reliable dynamic + function substitution on Windows*. +- Method swap() added to class tbb_thread. +- Methods rehash() and bucket_count() added to concurrent_hash_map. +- Added support for Visual Studio* 2010 Beta2. No special binaries + provided, but CRT-independent DLLs (vc_mt) should work. +- Other fixes and improvements in code, tests, examples, and docs. + +Open-source contributions integrated: + +- The fix to build 32-bit TBB on Mac OS* X 10.6. +- GCC-based port for SPARC Solaris by Michailo Matijkiw, with use of + earlier work by Raf Schietekat. + +Bugs fixed: + +- 159 - TBB build for PowerPC* running Mac OS* X. +- 160 - IBM* Java segfault if used with TBB allocator. +- crash in concurrent_queue (1616). + +------------------------------------------------------------------------ +Intel TBB 2.2 Update 1 commercial-aligned release +TBB_INTERFACE_VERSION == 4001 + +Changes (w.r.t. Intel TBB 2.2 commercial-aligned release): + +- Incorporates all changes from open-source releases below. +- Documentation was updated. +- TBB scheduler auto-initialization now covers all possible use cases. +- concurrent_queue: made argument types of sizeof used in paddings + consistent with those actually used. +- Memory allocator was improved: supported corner case of user's malloc + calling scalable_malloc (non-Windows), corrected processing of + memory allocation requests during tbb memory allocator startup + (Linux). +- Windows malloc replacement has got better support for static objects. +- In pipeline setups that do not allow actual parallelism, execution + by a single thread is guaranteed, idle spinning eliminated, and + performance improved. +- RML refactoring and clean-up. +- New constructor for concurrent_hash_map allows reserving space for + a number of items. +- Operator delete() added to the TBB exception classes. +- Lambda support was improved in parallel_reduce. +- gcc 4.3 warnings were fixed for concurrent_queue. +- Fixed possible initialization deadlock in modules using TBB entities + during construction of global static objects. +- Copy constructor in concurrent_hash_map was fixed. +- Fixed a couple of rare crashes in the scheduler possible before + in very specific use cases. +- Fixed a rare crash in the TBB allocator running out of memory. +- New tests were implemented, including test_lambda.cpp that checks + support for lambda expressions. +- A few other small changes in code, tests, and documentation. + +------------------------------------------------------------------------ +20090809 open-source release + +Changes (w.r.t. Intel TBB 2.2 commercial-aligned release): + +- Fixed known exception safety issues in concurrent_vector. +- Better concurrency of simultaneous grow requests in concurrent_vector. +- TBB allocator further improves performance of large object allocation. +- Problem with source of text relocations was fixed on Linux +- Fixed bugs related to malloc replacement under Windows +- A few other small changes in code and documentation. + +------------------------------------------------------------------------ +Intel TBB 2.2 commercial-aligned release +TBB_INTERFACE_VERSION == 4000 + +Changes (w.r.t. Intel TBB 2.1 U4 commercial-aligned release): + +- Incorporates all changes from open-source releases below. +- Architecture folders renamed from em64t to intel64 and from itanium + to ia64. +- Major Interface version changed from 3 to 4. Deprecated interfaces + might be removed in future releases. +- Parallel algorithms that use partitioners have switched to use + the auto_partitioner by default. +- Improved memory allocator performance for allocations bigger than 8K. +- Added new thread-bound filters functionality for pipeline. +- New implementation of concurrent_hash_map that improves performance + significantly. +- A few other small changes in code and documentation. + +------------------------------------------------------------------------ +20090511 open-source release + +Changes (w.r.t. previous open-source release): + +- Basic support for MinGW32 development kit. +- Added tbb::zero_allocator class that initializes memory with zeros. + It can be used as an adaptor to any STL-compatible allocator class. +- Added tbb::parallel_for_each template function as alias to parallel_do. +- Added more overloads for tbb::parallel_for. +- Added support for exact exception propagation (can only be used with + compilers that support C++0x std::exception_ptr). +- tbb::atomic template class can be used with enumerations. +- mutex, recursive_mutex, spin_mutex, spin_rw_mutex classes extended + with explicit lock/unlock methods. +- Fixed size() and grow_to_at_least() methods of tbb::concurrent_vector + to provide space allocation guarantees. More methods added for + compatibility with std::vector, including some from C++0x. +- Preview of a lambda-friendly interface for low-level use of tasks. +- scalable_msize function added to the scalable allocator (Windows only). +- Rationalized internal auxiliary functions for spin-waiting and backoff. +- Several tests undergo decent refactoring. + +Changes affecting backward compatibility: + +- Improvements in concurrent_queue, including limited API changes. + The previous version is deprecated; its functionality is accessible + via methods of the new tbb::concurrent_bounded_queue class. +- grow* and push_back methods of concurrent_vector changed to return + iterators; old semantics is deprecated. + +------------------------------------------------------------------------ +Intel TBB 2.1 Update 4 commercial-aligned release +TBB_INTERFACE_VERSION == 3016 + +Changes (w.r.t. Intel TBB 2.1 U3 commercial-aligned release): + +- Added tests for aligned memory allocations and malloc replacement. +- Several improvements for better bundling with Intel(R) C++ Compiler. +- A few other small changes in code and documentaion. + +Bugs fixed: + +- 150 - request to build TBB examples with debug info in release mode. +- backward compatibility issue with concurrent_queue on Windows. +- dependency on VS 2005 SP1 runtime libraries removed. +- compilation of GUI examples under Xcode* 3.1 (1577). +- On Windows, TBB allocator classes can be instantiated with const types + for compatibility with MS implementation of STL containers (1566). + +------------------------------------------------------------------------ +20090313 open-source release + +Changes (w.r.t. 20081109 open-source release): + +- Includes all changes introduced in TBB 2.1 Update 2 & Update 3 + commercial-aligned releases (see below for details). +- Added tbb::parallel_invoke template function. It runs up to 10 + user-defined functions in parallel and waits for them to complete. +- Added a special library providing ability to replace the standard + memory allocation routines in Microsoft* C/C++ RTL (malloc/free, + global new/delete, etc.) with the TBB memory allocator. + Usage details are described in include/tbb/tbbmalloc_proxy.h file. +- Task scheduler switched to use new implementation of its core + functionality (deque based task pool, new structure of arena slots). +- Preview of Microsoft* Visual Studio* 2005 project files for + building the library is available in build/vsproject folder. +- Added tests for aligned memory allocations and malloc replacement. +- Added parallel_for/game_of_life.net example (for Windows only) + showing TBB usage in a .NET application. +- A number of other fixes and improvements to code, tests, makefiles, + examples and documents. + +Bugs fixed: + +- The same list as in TBB 2.1 Update 4 right above. + +------------------------------------------------------------------------ +Intel TBB 2.1 Update 3 commercial-aligned release +TBB_INTERFACE_VERSION == 3015 + +Changes (w.r.t. Intel TBB 2.1 U2 commercial-aligned release): + +- Added support for aligned allocations to the TBB memory allocator. +- Added a special library to use with LD_PRELOAD on Linux* in order to + replace the standard memory allocation routines in C/C++ with the + TBB memory allocator. +- Added null_mutex and null_rw_mutex: no-op classes interface-compliant + to other TBB mutexes. +- Improved performance of parallel_sort, to close most of the serial gap + with std::sort, and beat it on 2 and more cores. +- A few other small changes. + +Bugs fixed: + +- the problem where parallel_for hanged after exception throw + if affinity_partitioner was used (1556). +- get rid of VS warnings about mbstowcs deprecation (1560), + as well as some other warnings. +- operator== for concurrent_vector::iterator fixed to work correctly + with different vector instances. + +------------------------------------------------------------------------ +Intel TBB 2.1 Update 2 commercial-aligned release +TBB_INTERFACE_VERSION == 3014 + +Changes (w.r.t. Intel TBB 2.1 U1 commercial-aligned release): + +- Incorporates all open-source-release changes down to TBB 2.1 U1, + except for: + - 20081019 addition of enumerable_thread_specific; +- Warning level for Microsoft* Visual C++* compiler raised to /W4 /Wp64; + warnings found on this level were cleaned or suppressed. +- Added TBB_runtime_interface_version API function. +- Added new example: pipeline/square. +- Added exception handling and cancellation support + for parallel_do and pipeline. +- Added copy constructor and [begin,end) constructor to concurrent_queue. +- Added some support for beta version of Intel(R) Parallel Amplifier. +- Added scripts to set environment for cross-compilation of 32-bit + applications on 64-bit Linux with Intel(R) C++ Compiler. +- Fixed semantics of concurrent_vector::clear() to not deallocate + internal arrays. Fixed compact() to perform such deallocation later. +- Fixed the issue with atomic when T is incomplete type. +- Improved support for PowerPC* Macintosh*, including the fix + for a bug in masked compare-and-swap reported by a customer. +- As usual, a number of other improvements everywhere. + +------------------------------------------------------------------------ +20081109 open-source release + +Changes (w.r.t. previous open-source release): + +- Added new serial out of order filter for tbb::pipeline. +- Fixed the issue with atomic::operator= reported at the forum. +- Fixed the issue with using tbb::task::self() in task destructor + reported at the forum. +- A number of other improvements to code, tests, makefiles, examples + and documents. + +Open-source contributions integrated: +- Changes in the memory allocator were partially integrated. + +------------------------------------------------------------------------ +20081019 open-source release + +Changes (w.r.t. previous open-source release): + +- Introduced enumerable_thread_specific. This new class provides a + wrapper around native thread local storage as well as iterators and + ranges for accessing the thread local copies (1533). +- Improved support for Intel(R) Threading Analysis Tools + on Intel(R) 64 architecture. +- Dependency from Microsoft* CRT was integrated to the libraries using + manifests, to avoid issues if called from code that uses different + version of Visual C++* runtime than the library. +- Introduced new defines TBB_USE_ASSERT, TBB_USE_DEBUG, + TBB_USE_PERFORMANCE_WARNINGS, TBB_USE_THREADING_TOOLS. +- A number of other improvements to code, tests, makefiles, examples + and documents. + +Open-source contributions integrated: + +- linker optimization: /incremental:no . + +------------------------------------------------------------------------ +20080925 open-source release + +Changes (w.r.t. previous open-source release): + +- Same fix for a memory leak in the memory allocator as in TBB 2.1 U1. +- Improved support for lambda functions. +- Fixed more concurrent_queue issues reported at the forum. +- A number of other improvements to code, tests, makefiles, examples + and documents. + +------------------------------------------------------------------------ +Intel TBB 2.1 Update 1 commercial-aligned release +TBB_INTERFACE_VERSION == 3013 + +Changes (w.r.t. Intel TBB 2.1 commercial-aligned release): + +- Fixed small memory leak in the memory allocator. +- Incorporates all open-source-release changes since TBB 2.1, + except for: + - 20080825 changes for parallel_do; + +------------------------------------------------------------------------ +20080825 open-source release + +Changes (w.r.t. previous open-source release): + +- Added exception handling and cancellation support for parallel_do. +- Added default HashCompare template argument for concurrent_hash_map. +- Fixed concurrent_queue.clear() issues due to incorrect assumption + about clear() being private method. +- Added the possibility to use TBB in applications that change + default calling conventions (Windows* only). +- Many improvements to code, tests, examples, makefiles and documents. + +Bugs fixed: + +- 120, 130 - memset declaration missed in concurrent_hash_map.h + +------------------------------------------------------------------------ +20080724 open-source release + +Changes (w.r.t. previous open-source release): + +- Inline assembly for atomic operations improved for gcc 4.3 +- A few more improvements to the code. + +------------------------------------------------------------------------ +20080709 open-source release + +Changes (w.r.t. previous open-source release): + +- operator=() was added to the tbb_thread class according to + the current working draft for std::thread. +- Recognizing SPARC* in makefiles for Linux* and Sun Solaris*. + +Bugs fixed: + +- 127 - concurrent_hash_map::range fixed to split correctly. + +Open-source contributions integrated: + +- fix_set_midpoint.diff by jyasskin +- SPARC* support in makefiles by Raf Schietekat + +------------------------------------------------------------------------ +20080622 open-source release + +Changes (w.r.t. previous open-source release): + +- Fixed a hang that rarely happened on Linux + during deinitialization of the TBB scheduler. +- Improved support for Intel(R) Thread Checker. +- A few more improvements to the code. + +------------------------------------------------------------------------ +Intel TBB 2.1 commercial-aligned release +TBB_INTERFACE_VERSION == 3011 + +Changes (w.r.t. Intel TBB 2.0 U3 commercial-aligned release): + +- All open-source-release changes down to, and including, TBB 2.0 below, + were incorporated into this release. + +------------------------------------------------------------------------ +20080605 open-source release + +Changes (w.r.t. previous open-source release): + +- Explicit control of exported symbols by version scripts added on Linux. +- Interfaces polished for exception handling & algorithm cancellation. +- Cache behavior improvements in the scalable allocator. +- Improvements in text_filter, polygon_overlay, and other examples. +- A lot of other stability improvements in code, tests, and makefiles. +- First release where binary packages include headers/docs/examples, so + binary packages are now self-sufficient for using TBB. + +Open-source contributions integrated: + +- atomics patch (partially). +- tick_count warning patch. + +Bugs fixed: + +- 118 - fix for boost compatibility. +- 123 - fix for tbb_machine.h. + +------------------------------------------------------------------------ +20080512 open-source release + +Changes (w.r.t. previous open-source release): + +- Fixed a problem with backward binary compatibility + of debug Linux builds. +- Sun* Studio* support added. +- soname support added on Linux via linker script. To restore backward + binary compatibility, *.so -> *.so.2 softlinks should be created. +- concurrent_hash_map improvements - added few new forms of insert() + method and fixed precondition and guarantees of erase() methods. + Added runtime warning reporting about bad hash function used for + the container. Various improvements for performance and concurrency. +- Cancellation mechanism reworked so that it does not hurt scalability. +- Algorithm parallel_do reworked. Requirement for Body::argument_type + definition removed, and work item argument type can be arbitrarily + cv-qualified. +- polygon_overlay example added. +- A few more improvements to code, tests, examples and Makefiles. + +Open-source contributions integrated: + +- Soname support patch for Bugzilla #112. + +Bugs fixed: + +- 112 - fix for soname support. + +------------------------------------------------------------------------ +Intel TBB 2.0 U3 commercial-aligned release (package 017, April 20, 2008) + +Corresponds to commercial 019 (for Linux*, 020; for Mac OS* X, 018) +packages. + +Changes (w.r.t. Intel TBB 2.0 U2 commercial-aligned release): + +- Does not contain open-source-release changes below; this release is + only a minor update of TBB 2.0 U2. +- Removed spin-waiting in pipeline and concurrent_queue. +- A few more small bug fixes from open-source releases below. + +------------------------------------------------------------------------ +20080408 open-source release + +Changes (w.r.t. previous open-source release): + +- count_strings example reworked: new word generator implemented, hash + function replaced, and tbb_allocator is used with std::string class. +- Static methods of spin_rw_mutex were replaced by normal member + functions, and the class name was versioned. +- tacheon example was renamed to tachyon. +- Improved support for Intel(R) Thread Checker. +- A few more minor improvements. + +Open-source contributions integrated: + +- Two sets of Sun patches for IA Solaris support. + +------------------------------------------------------------------------ +20080402 open-source release + +Changes (w.r.t. previous open-source release): + +- Exception handling and cancellation support for tasks and algorithms + fully enabled. +- Exception safety guaranties defined and fixed for all concurrent + containers. +- User-defined memory allocator support added to all concurrent + containers. +- Performance improvement of concurrent_hash_map, spin_rw_mutex. +- Critical fix for a rare race condition during scheduler + initialization/de-initialization. +- New methods added for concurrent containers to be closer to STL, + as well as automatic filters removal from pipeline + and __TBB_AtomicAND function. +- The volatile keyword dropped from where it is not really needed. +- A few more minor improvements. + +------------------------------------------------------------------------ +20080319 open-source release + +Changes (w.r.t. previous open-source release): + +- Support for gcc version 4.3 was added. +- tbb_thread class, near compatible with std::thread expected in C++0x, + was added. + +Bugs fixed: + +- 116 - fix for compilation issues with gcc version 4.2.1. +- 120 - fix for compilation issues with gcc version 4.3. + +------------------------------------------------------------------------ +20080311 open-source release + +Changes (w.r.t. previous open-source release): + +- An enumerator added for pipeline filter types (serial vs. parallel). +- New task_scheduler_observer class introduced, to observe when + threads start and finish interacting with the TBB task scheduler. +- task_scheduler_init reverted to not use internal versioned class; + binary compatibility guaranteed with stable releases only. +- Various improvements to code, tests, examples and Makefiles. + +------------------------------------------------------------------------ +20080304 open-source release + +Changes (w.r.t. previous open-source release): + +- Task-to-thread affinity support, previously kept under a macro, + now fully legalized. +- Work-in-progress on cache_aligned_allocator improvements. +- Pipeline really supports parallel input stage; it's no more serialized. +- Various improvements to code, tests, examples and Makefiles. + +Bugs fixed: + +- 119 - fix for scalable_malloc sometimes failing to return a big block. +- TR575 - fixed a deadlock occurring on Windows in startup/shutdown + under some conditions. + +------------------------------------------------------------------------ +20080226 open-source release + +Changes (w.r.t. previous open-source release): + +- Introduced tbb_allocator to select between standard allocator and + tbb::scalable_allocator when available. +- Removed spin-waiting in pipeline and concurrent_queue. +- Improved performance of concurrent_hash_map by using tbb_allocator. +- Improved support for Intel(R) Thread Checker. +- Various improvements to code, tests, examples and Makefiles. + +------------------------------------------------------------------------ +Intel TBB 2.0 U2 commercial-aligned release (package 017, February 14, 2008) + +Corresponds to commercial 017 (for Linux*, 018; for Mac OS* X, 016) +packages. + +Changes (w.r.t. Intel TBB 2.0 U1 commercial-aligned release): + +- Does not contain open-source-release changes below; this release is + only a minor update of TBB 2.0 U1. +- Add support for Microsoft* Visual Studio* 2008, including binary + libraries and VS2008 projects for examples. +- Use SwitchToThread() not Sleep() to yield threads on Windows*. +- Enhancements to Doxygen-readable comments in source code. +- A few more small bug fixes from open-source releases below. + +Bugs fixed: + +- TR569 - Memory leak in concurrent_queue. + +------------------------------------------------------------------------ +20080207 open-source release + +Changes (w.r.t. previous open-source release): + +- Improvements and minor fixes in VS2008 projects for examples. +- Improvements in code for gating worker threads that wait for work, + previously consolidated under #if IMPROVED_GATING, now legalized. +- Cosmetic changes in code, examples, tests. + +Bugs fixed: + +- 113 - Iterators and ranges should be convertible to their const + counterparts. +- TR569 - Memory leak in concurrent_queue. + +------------------------------------------------------------------------ +20080122 open-source release + +Changes (w.r.t. previous open-source release): + +- Updated examples/parallel_for/seismic to improve the visuals and to + use the affinity_partitioner (20071127 and forward) for better + performance. +- Minor improvements to unittests and performance tests. + +------------------------------------------------------------------------ +20080115 open-source release + +Changes (w.r.t. previous open-source release): + +- Cleanup, simplifications and enhancements to the Makefiles for + building the libraries (see build/index.html for high-level + changes) and the examples. +- Use SwitchToThread() not Sleep() to yield threads on Windows*. +- Engineering work-in-progress on exception safety/support. +- Engineering work-in-progress on affinity_partitioner for + parallel_reduce. +- Engineering work-in-progress on improved gating for worker threads + (idle workers now block in the OS instead of spinning). +- Enhancements to Doxygen-readable comments in source code. + +Bugs fixed: + +- 102 - Support for parallel build with gmake -j +- 114 - /Wp64 build warning on Windows*. + +------------------------------------------------------------------------ +20071218 open-source release + +Changes (w.r.t. previous open-source release): + +- Full support for Microsoft* Visual Studio* 2008 in open-source. + Binaries for vc9/ will be available in future stable releases. +- New recursive_mutex class. +- Full support for 32-bit PowerMac including export files for builds. +- Improvements to parallel_do. + +------------------------------------------------------------------------ +20071206 open-source release + +Changes (w.r.t. previous open-source release): + +- Support for Microsoft* Visual Studio* 2008 in building libraries + from source as well as in vc9/ projects for examples. +- Small fixes to the affinity_partitioner first introduced in 20071127. +- Small fixes to the thread-stack size hook first introduced in 20071127. +- Engineering work in progress on concurrent_vector. +- Engineering work in progress on exception behavior. +- Unittest improvements. + +------------------------------------------------------------------------ +20071127 open-source release + +Changes (w.r.t. previous open-source release): + +- Task-to-thread affinity support (affinity partitioner) first appears. +- More work on concurrent_vector. +- New parallel_do algorithm (function-style version of parallel while) + and parallel_do/parallel_preorder example. +- New task_scheduler_init() hooks for getting default_num_threads() and + for setting thread stack size. +- Support for weak memory consistency models in the code base. +- Futex usage in the task scheduler (Linux). +- Started adding 32-bit PowerMac support. +- Intel(R) 9.1 compilers are now the base supported Intel(R) compiler + version. +- TBB libraries added to link line automatically on Microsoft Windows* + systems via #pragma comment linker directives. + +Open-source contributions integrated: + +- FreeBSD platform support patches. +- AIX weak memory model patch. + +Bugs fixed: + +- 108 - Removed broken affinity.h reference. +- 101 - Does not build on Debian Lenny (replaced arch with uname -m). + +------------------------------------------------------------------------ +20071030 open-source release + +Changes (w.r.t. previous open-source release): + +- More work on concurrent_vector. +- Better support for building with -Wall -Werror (or not) as desired. +- A few fixes to eliminate extraneous warnings. +- Begin introduction of versioning hooks so that the internal/API + version is tracked via TBB_INTERFACE_VERSION. The newest binary + libraries should always work with previously-compiled code when- + ever possible. +- Engineering work in progress on using futex inside the mutexes (Linux). +- Engineering work in progress on exception behavior. +- Engineering work in progress on a new parallel_do algorithm. +- Unittest improvements. + +------------------------------------------------------------------------ +20070927 open-source release + +Changes (w.r.t. Intel TBB 2.0 U1 commercial-aligned release): + +- Minor update to TBB 2.0 U1 below. +- Begin introduction of new concurrent_vector interfaces not released + with TBB 2.0 U1. + +------------------------------------------------------------------------ +Intel TBB 2.0 U1 commercial-aligned release (package 014, October 1, 2007) + +Corresponds to commercial 014 (for Linux*, 016) packages. + +Changes (w.r.t. Intel TBB 2.0 commercial-aligned release): + +- All open-source-release changes down to, and including, TBB 2.0 + below, were incorporated into this release. +- Made a number of changes to the officially supported OS list: + Added Linux* OSs: + Asianux* 3, Debian* 4.0, Fedora Core* 6, Fedora* 7, + Turbo Linux* 11, Ubuntu* 7.04; + Dropped Linux* OSs: + Asianux* 2, Fedora Core* 4, Haansoft* Linux 2006 Server, + Mandriva/Mandrake* 10.1, Miracle Linux* 4.0, + Red Flag* DC Server 5.0; + Only Mac OS* X 10.4.9 (and forward) and Xcode* tool suite 2.4.1 (and + forward) are now supported. +- Commercial installers on Linux* fixed to recommend the correct + binaries to use in more cases, with less unnecessary warnings. +- Changes to eliminate spurious build warnings. + +Open-source contributions integrated: + +- Two small header guard macro patches; it also fixed bug #94. +- New blocked_range3d class. + +Bugs fixed: + +- 93 - Removed misleading comments in task.h. +- 94 - See above. + +------------------------------------------------------------------------ +20070815 open-source release + +Changes: + +- Changes to eliminate spurious build warnings. +- Engineering work in progress on concurrent_vector allocator behavior. +- Added hooks to use the Intel(R) compiler code coverage tools. + +Open-source contributions integrated: + +- Mac OS* X build warning patch. + +Bugs fixed: + +- 88 - Fixed TBB compilation errors if both VS2005 and Windows SDK are + installed. + +------------------------------------------------------------------------ +20070719 open-source release + +Changes: + +- Minor update to TBB 2.0 commercial-aligned release below. +- Changes to eliminate spurious build warnings. + +------------------------------------------------------------------------ +Intel TBB 2.0 commercial-aligned release (package 010, July 19, 2007) + +Corresponds to commercial 010 (for Linux*, 012) packages. + +- TBB open-source debut release. + +------------------------------------------------------------------------ +Intel TBB 1.1 commercial release (April 10, 2007) + +Changes (w.r.t. Intel TBB 1.0 commercial release): + +- auto_partitioner which offered an automatic alternative to specifying + a grain size parameter to estimate the best granularity for tasks. +- The release was added to the Intel(R) C++ Compiler 10.0 Pro. + +------------------------------------------------------------------------ +Intel TBB 1.0 Update 2 commercial release + +Changes (w.r.t. Intel TBB 1.0 Update 1 commercial release): + +- Mac OS* X 64-bit support added. +- Source packages for commercial releases introduced. + +------------------------------------------------------------------------ +Intel TBB 1.0 Update 1 commercial-aligned release + +Changes (w.r.t. Intel TBB 1.0 commercial release): + +- Fix for critical package issue on Mac OS* X. + +------------------------------------------------------------------------ +Intel TBB 1.0 commercial release (August 29, 2006) + +Changes (w.r.t. Intel TBB 1.0 beta commercial release): + +- New namespace (and compatibility headers for old namespace). + Namespaces are tbb and tbb::internal and all classes are in the + underscore_style not the WindowsStyle. +- New class: scalable_allocator (and cache_aligned_allocator using that + if it exists). +- Added parallel_for/tacheon example. +- Removed C-style casts from headers for better C++ compliance. +- Bug fixes. +- Documentation improvements. +- Improved performance of the concurrent_hash_map class. +- Upgraded parallel_sort() to support STL-style random-access iterators + instead of just pointers. +- The Windows vs7_1 directories renamed to vs7.1 in examples. +- New class: spin version of reader-writer lock. +- Added push_back() interface to concurrent_vector(). + +------------------------------------------------------------------------ +Intel TBB 1.0 beta commercial release + +Initial release. + +Features / APIs: + +- Concurrent containers: ConcurrentHashTable, ConcurrentVector, + ConcurrentQueue. +- Parallel algorithms: ParallelFor, ParallelReduce, ParallelScan, + ParallelWhile, Pipeline, ParallelSort. +- Support: AlignedSpace, BlockedRange (i.e., 1D), BlockedRange2D +- Task scheduler with multi-master support. +- Atomics: read, write, fetch-and-store, fetch-and-add, compare-and-swap. +- Locks: spin, reader-writer, queuing, OS-wrapper. +- Memory allocation: STL-style memory allocator that avoids false + sharing. +- Timers. + +Tools Support: +- Intel(R) Thread Checker 3.0. +- Intel(R) Thread Profiler 3.0. + +Documentation: +- First Use Documents: README.txt, INSTALL.txt, Release_Notes.txt, + Doc_Index.html, Getting_Started.pdf, Tutorial.pdf, Reference.pdf. +- Class hierarchy HTML pages (Doxygen). +- Tree of index.html pages for navigating the installed package, esp. + for the examples. + +Examples: +- One for each of these TBB features: ConcurrentHashTable, ParallelFor, + ParallelReduce, ParallelWhile, Pipeline, Task. +- Live copies of examples from Getting_Started.pdf. +- TestAll example that exercises every class and header in the package + (i.e., a "liveness test"). +- Compilers: see Release_Notes.txt. +- APIs: OpenMP, WinThreads, Pthreads. + +Packaging: +- Package for Windows installs IA-32 and EM64T bits. +- Package for Linux installs IA-32, EM64T and IPF bits. +- Package for Mac OS* X installs IA-32 bits. +- All packages support Intel(R) software setup assistant (ISSA) and + install-time FLEXlm license checking. +- ISSA support allows license file to be specified directly in case of + no Internet connection or problems with IRC or serial #s. +- Linux installer allows root or non-root, RPM or non-RPM installs. +- FLEXlm license servers (for those who need floating/counted licenses) + are provided separately on Intel(R) Premier. + +------------------------------------------------------------------------ +Intel, the Intel logo, Xeon, Intel Xeon Phi, and Cilk are registered +trademarks or trademarks of Intel Corporation or its subsidiaries in +the United States and other countries. + +* Other names and brands may be claimed as the property of others. diff --git a/xdl/third_party/tbb/Doxyfile b/xdl/third_party/tbb/Doxyfile new file mode 100644 index 00000000..e024073e --- /dev/null +++ b/xdl/third_party/tbb/Doxyfile @@ -0,0 +1,1327 @@ +# Doxyfile 1.4.7 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# by quotes) that should identify the project. + +PROJECT_NAME = "Intel(R) Threading Building Blocks Doxygen Documentation" + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = "version 4.2.3" + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of +# source files, where putting all generated files in the same directory would +# otherwise cause performance problems for the file system. + +CREATE_SUBDIRS = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, +# Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese, +# Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian, +# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, +# Swedish, and Ukrainian. + +OUTPUT_LANGUAGE = English + +# This tag can be used to specify the encoding used in the generated output. +# The encoding is not always determined by the language that is chosen, +# but also whether or not the output is meant for Windows or non-Windows users. +# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES +# forces the Windows encoding (this is the default for the Windows binary), +# whereas setting the tag to NO uses a Unix-style encoding (the default for +# all platforms other than Windows). + +USE_WINDOWS_ENCODING = NO + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is +# used as the annotated text. Otherwise, the brief description is used as-is. +# If left blank, the following values are used ("$name" is automatically +# replaced with the name of the entity): "The $name class" "The $name widget" +# "The $name file" "is" "provides" "specifies" "contains" +# "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = NO + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful is your file systems +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = YES + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like the Qt-style comments (thus requiring an +# explicit @brief command for a brief description. + +JAVADOC_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the DETAILS_AT_TOP tag is set to YES then Doxygen +# will output the detailed description near the top, like JavaDoc. +# If set to NO, the detailed description appears after the member +# documentation. + +DETAILS_AT_TOP = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce +# a new page for each member. If set to NO, the documentation of a member will +# be part of the file/class/namespace that contains it. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 8 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C +# sources only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java +# sources only. Doxygen will then generate output that is more tailored for Java. +# For instance, namespaces will be presented as packages, qualified scopes +# will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments +# according to the Markdown format, which allows for more readable +# documentation. See http://daringfireball.net/projects/markdown/ for details. +# The output of markdown processing is further processed by doxygen, so you can +# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in +# case of backward compatibilities issues. +# The default value is: YES. + +MARKDOWN_SUPPORT = YES + +# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up +# to that level are automatically included in the table of contents, even if +# they do not have an id attribute. +# Note: This feature currently applies only to Markdown headings. +# Minimum value: 0, maximum value: 99, default value: 0. +# This tag requires that the tag MARKDOWN_SUPPORT is set to YES. + +TOC_INCLUDE_HEADINGS = 0 + +# When enabled doxygen tries to link words that correspond to documented +# classes, or namespaces to their corresponding documentation. Such a link can +# be prevented in individual cases by putting a % sign in front of the word or +# globally by setting AUTOLINK_SUPPORT to NO. +# The default value is: YES. + +AUTOLINK_SUPPORT = YES + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to +# include (a tag file for) the STL sources as input, then you should +# set this tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. +# func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. + +BUILTIN_STL_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = YES + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = YES + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = YES + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = NO + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = NO + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = NO + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = INTERNAL + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or define consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and defines in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +# If the sources in your project are distributed over multiple directories +# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy +# in the documentation. The default is NO. + +SHOW_DIRECTORIES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from the +# version control system). Doxygen will invoke the program by executing (via +# popen()) the command , where is the value of +# the FILE_VERSION_FILTER tag, and is the name of an input file +# provided by doxygen. Whatever the program writes to standard output +# is used as the file version. See the manual for examples. + +FILE_VERSION_FILTER = + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# This WARN_NO_PARAMDOC option can be abled to get warnings for +# functions that are documented, but have no documentation for their parameters +# or return value. If set to NO (the default) doxygen will only warn about +# wrong or incomplete parameter documentation, but not about the absence of +# documentation. + +WARN_NO_PARAMDOC = NO + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. Optionally the format may contain +# $version, which will be replaced by the version of the file (if it could +# be obtained via FILE_VERSION_FILTER) + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = include/ src/tbb/ + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx +# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py + +FILE_PATTERNS = + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used select whether or not files or +# directories that are symbolic links (a Unix filesystem feature) are excluded +# from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. Note that the wildcards are matched +# against the file with absolute path, so to exclude all test directories +# for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. If FILTER_PATTERNS is specified, this tag will be +# ignored. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER +# is applied to all files. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = YES + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = YES + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES (the default) +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = YES + +# If the REFERENCES_RELATION tag is set to YES (the default) +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = YES + +# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) +# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from +# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will +# link to the source code. Otherwise they will link to the documentstion. + +REFERENCES_LINK_SOURCE = NO + +# If the USE_HTAGS tag is set to YES then the references to source code +# will point to the HTML generated by the htags(1) tool instead of doxygen +# built-in source browser. The htags tool is part of GNU's global source +# tagging system (see http://www.gnu.org/software/global/global.html). You +# will need version 4.8.6 or higher. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = YES + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = doc/copyright_brand_disclaimer_doxygen.txt + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. + +DISABLE_INDEX = NO + +# This tag can be used to set the number of enum values (range [1..20]) +# that doxygen will group on one line in the generated HTML documentation. + +ENUM_VALUES_PER_LINE = 4 + +# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be +# generated containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, +# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are +# probably better off using the HTML help feature. + +GENERATE_TREEVIEW = YES + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = NO + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, a4wide, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4wide + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = NO + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = NO + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = NO + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. This is useful +# if you want to understand what is going on. On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = NO + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_DEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# in the INCLUDE_PATH (see below) will be search if a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator +# instead of the = operator. + +PREDEFINED = TBB_PREVIEW_FLOW_GRAPH_FEATURES \ + TBB_PREVIEW_FLOW_GRAPH_NODES \ + __TBB_GFX_PRESENT \ + __TBB_PREVIEW_OPENCL_NODE \ + __TBB_CPP11_RVALUE_REF_PRESENT \ + __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT \ + __TBB_IMPLICIT_MOVE_PRESENT \ + __TBB_EXCEPTION_PTR_PRESENT \ + __TBB_STATIC_ASSERT_PRESENT \ + __TBB_CPP11_TUPLE_PRESENT \ + __TBB_INITIALIZER_LISTS_PRESENT \ + __TBB_CONSTEXPR_PRESENT \ + __TBB_DEFAULTED_AND_DELETED_FUNC_PRESENT \ + __TBB_NOEXCEPT_PRESENT \ + __TBB_CPP11_STD_BEGIN_END_PRESENT \ + __TBB_CPP11_AUTO_PRESENT \ + __TBB_CPP11_DECLTYPE_PRESENT \ + __TBB_CPP11_LAMBDAS_PRESENT \ + __TBB_CPP11_DEFAULT_FUNC_TEMPLATE_ARGS_PRESENT \ + __TBB_OVERRIDE_PRESENT \ + __TBB_ALIGNAS_PRESENT \ + __TBB_CPP11_TEMPLATE_ALIASES_PRESENT \ + __TBB_FLOW_GRAPH_CPP11_FEATURES \ + __TBB_PREVIEW_GFX_FACTORY \ + __TBB_PREVIEW_STREAMING_NODE + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all function-like macros that are alone +# on a line, have an all uppercase name, and do not end with a semicolon. Such +# function macros are typically used for boiler-plate code, and will confuse +# the parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen +# is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base +# or super classes. Setting the tag to NO turns the diagrams off. Note that +# this option is superseded by the HAVE_DOT option below. This is only a +# fallback. It is recommended to install and use dot, since it yields more +# powerful graphs. + +CLASS_DIAGRAMS = YES + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = YES + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# the CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for groups, showing the direct groups dependencies + +GROUP_GRAPHS = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = YES + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will +# generate a call dependency graph for every global function or class method. +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable call graphs for selected +# functions only using the \callgraph command. + +CALL_GRAPH = YES + +# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then doxygen will +# generate a caller dependency graph for every global function or class method. +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable caller graphs for selected +# functions only using the \callergraph command. + +CALLER_GRAPH = YES + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES +# then doxygen will show the dependencies a directory has on other directories +# in a graphical way. The dependency relations are determined by the #include +# relations between the files in the directories. + +DIRECTORY_GRAPH = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are png, jpg, or gif +# If left blank png will be used. + +DOT_IMAGE_FORMAT = svg + +# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to +# enable generation of interactive SVG images that allow zooming and panning. +# +# Note that this requires a modern browser other than Internet Explorer. Tested +# and working are Firefox, Chrome, Safari, and Opera. +# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make +# the SVG files visible. Older versions of IE do not have SVG support. +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. + +INTERACTIVE_SVG = YES + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found in the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_WIDTH = 1024 + +# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_HEIGHT = 1024 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes +# that lay further from the root node will be omitted. Note that setting this +# option to 1 or 2 may greatly reduce the computation time needed for large +# code bases. Also note that a graph may be further truncated if the graph's +# image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH +# and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default), +# the graph is not depth-constrained. + +# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes +# that will be shown in the graph. If the number of nodes in a graph becomes +# larger than this value, doxygen will truncate the graph, which is visualized +# by representing a node as a red box. Note that doxygen if the number of direct +# children of the root node in a graph is already larger than +# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that +# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. +# Minimum value: 0, maximum value: 10000, default value: 50. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_GRAPH_MAX_NODES = 200 + +MAX_DOT_GRAPH_DEPTH = 0 + +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is disabled by default, which results in a white background. +# Warning: Depending on the platform used, enabling this option may lead to +# badly anti-aliased labels on the edges of a graph (i.e. they become hard to +# read). + +DOT_TRANSPARENT = NO + +# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) +# support this, this feature is disabled by default. + +DOT_MULTI_TARGETS = YES + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to the search engine +#--------------------------------------------------------------------------- + +# The SEARCHENGINE tag specifies whether or not a search engine should be +# used. If set to NO the values of all tags below this one will be ignored. + +SEARCHENGINE = YES diff --git a/xdl/third_party/tbb/LICENSE b/xdl/third_party/tbb/LICENSE new file mode 100644 index 00000000..261eeb9e --- /dev/null +++ b/xdl/third_party/tbb/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/xdl/third_party/tbb/Makefile b/xdl/third_party/tbb/Makefile new file mode 100644 index 00000000..0f7d30d0 --- /dev/null +++ b/xdl/third_party/tbb/Makefile @@ -0,0 +1,85 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +tbb_root?=. +include $(tbb_root)/build/common.inc +.PHONY: default all tbb tbbmalloc tbbproxy test examples + +#workaround for non-depend targets tbb and tbbmalloc which both depend on version_string.ver +#According to documentation, recursively invoked make commands can process their targets in parallel +.NOTPARALLEL: tbb tbbmalloc tbbproxy + +default: tbb tbbmalloc $(if $(use_proxy),tbbproxy) + +all: tbb tbbmalloc tbbproxy test examples + +tbb: mkdir + $(MAKE) -C "$(work_dir)_debug" -r -f $(tbb_root)/build/Makefile.tbb cfg=debug + $(MAKE) -C "$(work_dir)_release" -r -f $(tbb_root)/build/Makefile.tbb cfg=release + +tbbmalloc: mkdir + $(MAKE) -C "$(work_dir)_debug" -r -f $(tbb_root)/build/Makefile.tbbmalloc cfg=debug malloc + $(MAKE) -C "$(work_dir)_release" -r -f $(tbb_root)/build/Makefile.tbbmalloc cfg=release malloc + +tbbproxy: mkdir + $(MAKE) -C "$(work_dir)_debug" -r -f $(tbb_root)/build/Makefile.tbbproxy cfg=debug tbbproxy + $(MAKE) -C "$(work_dir)_release" -r -f $(tbb_root)/build/Makefile.tbbproxy cfg=release tbbproxy + +test: tbb tbbmalloc $(if $(use_proxy),tbbproxy) + -$(MAKE) -C "$(work_dir)_debug" -r -f $(tbb_root)/build/Makefile.tbbmalloc cfg=debug malloc_test + -$(MAKE) -C "$(work_dir)_debug" -r -f $(tbb_root)/build/Makefile.test cfg=debug + -$(MAKE) -C "$(work_dir)_release" -r -f $(tbb_root)/build/Makefile.tbbmalloc cfg=release malloc_test + -$(MAKE) -C "$(work_dir)_release" -r -f $(tbb_root)/build/Makefile.test cfg=release + +rml: mkdir + $(MAKE) -C "$(work_dir)_debug" -r -f $(tbb_root)/build/Makefile.rml cfg=debug + $(MAKE) -C "$(work_dir)_release" -r -f $(tbb_root)/build/Makefile.rml cfg=release + +examples: tbb tbbmalloc + $(MAKE) -C examples -r -f Makefile tbb_root=.. release test + +python: tbb + $(MAKE) -C "$(work_dir)_release" -rf $(tbb_root)/python/Makefile install + +doxygen: + doxygen Doxyfile + +.PHONY: clean clean_examples mkdir info + +clean: clean_examples + $(shell $(RM) $(work_dir)_release$(SLASH)*.* >$(NUL) 2>$(NUL)) + $(shell $(RD) $(work_dir)_release >$(NUL) 2>$(NUL)) + $(shell $(RM) $(work_dir)_debug$(SLASH)*.* >$(NUL) 2>$(NUL)) + $(shell $(RD) $(work_dir)_debug >$(NUL) 2>$(NUL)) + @echo clean done + +clean_examples: + $(shell $(MAKE) -s -i -r -C examples -f Makefile tbb_root=.. clean >$(NUL) 2>$(NUL)) + +mkdir: + $(shell $(MD) "$(work_dir)_release" >$(NUL) 2>$(NUL)) + $(shell $(MD) "$(work_dir)_debug" >$(NUL) 2>$(NUL)) + @echo Created $(work_dir)_release and ..._debug directories + +info: + @echo OS: $(tbb_os) + @echo arch=$(arch) + @echo compiler=$(compiler) + @echo runtime=$(runtime) + @echo tbb_build_prefix=$(tbb_build_prefix) + diff --git a/xdl/third_party/tbb/README b/xdl/third_party/tbb/README new file mode 100644 index 00000000..fcc87af0 --- /dev/null +++ b/xdl/third_party/tbb/README @@ -0,0 +1,11 @@ +Intel(R) Threading Building Blocks - README + +See index.html for directions and documentation. + +If source is present (./Makefile and src/ directories), +type 'gmake' in this directory to build and test. + +See examples/index.html for runnable examples and directions. + +See http://threadingbuildingblocks.org for full documentation +and software information. diff --git a/xdl/third_party/tbb/README.md b/xdl/third_party/tbb/README.md new file mode 100644 index 00000000..81896699 --- /dev/null +++ b/xdl/third_party/tbb/README.md @@ -0,0 +1,34 @@ +# Threading Building Blocks 2019 Update 3 +[![Stable release](https://img.shields.io/badge/version-2019_U3-green.svg)](https://github.com/01org/tbb/releases/tag/2019_U3) +[![Apache License Version 2.0](https://img.shields.io/badge/license-Apache_2.0-green.svg)](LICENSE) + +Threading Building Blocks (TBB) lets you easily write parallel C++ programs that take +full advantage of multicore performance, that are portable, composable and have future-proof scalability. + +## Release Information +Here are the latest [Changes](CHANGES) and [Release Notes](doc/Release_Notes.txt) (contains system requirements and known issues). + +Since [2018 U5](https://github.com/01org/tbb/releases/tag/2018_U5) TBB binary packages include [Parallel STL](https://github.com/intel/parallelstl) as a high-level component. + +## Documentation +* TBB [tutorial](https://software.intel.com/en-us/tbb-tutorial) +* TBB general documentation: [stable](https://software.intel.com/en-us/tbb-documentation) +and [latest](https://www.threadingbuildingblocks.org/docs/help/index.htm) + +## Support +Please report issues and suggestions via +[GitHub issues](https://github.com/01org/tbb/issues) or start a topic on the +[TBB forum](http://software.intel.com/en-us/forums/intel-threading-building-blocks/). + +## How to Contribute +To contribute to TBB, please open a GitHub pull request (preferred) or send us a patch by e-mail. +Threading Building Blocks is licensed under [Apache License, Version 2.0](LICENSE). +By its terms, contributions submitted to the project are also done under that license. + +## Engineering team contacts +* [E-mail us.](mailto:inteltbbdevelopers@intel.com) + +------------------------------------------------------------------------ +Intel and the Intel logo are trademarks of Intel Corporation or its subsidiaries in the U.S. and/or other countries. + +\* Other names and brands may be claimed as the property of others. diff --git a/xdl/third_party/tbb/build/AIX.gcc.inc b/xdl/third_party/tbb/build/AIX.gcc.inc new file mode 100644 index 00000000..5adcd41d --- /dev/null +++ b/xdl/third_party/tbb/build/AIX.gcc.inc @@ -0,0 +1,75 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +COMPILE_ONLY = -c -MMD +PREPROC_ONLY = -E -x c++ +INCLUDE_KEY = -I +DEFINE_KEY = -D +OUTPUT_KEY = -o # +OUTPUTOBJ_KEY = -o # +PIC_KEY = -fPIC +WARNING_AS_ERROR_KEY = -Werror +WARNING_KEY = -Wall +DYLIB_KEY = -shared +LIBDL = -ldl + +CPLUS = g++ +CONLY = gcc +LIB_LINK_FLAGS = -shared +LIBS = -lpthread -ldl +C_FLAGS = $(CPLUS_FLAGS) -x c + +ifeq ($(cfg), release) + CPLUS_FLAGS = -O2 -DUSE_PTHREAD -pthread +endif +ifeq ($(cfg), debug) + CPLUS_FLAGS = -DTBB_USE_DEBUG -g -O0 -DUSE_PTHREAD -pthread +endif + +ASM= +ASM_FLAGS= + +TBB_ASM.OBJ= + +ifeq (powerpc,$(arch)) + CPLUS_FLAGS += -maix64 -Wl,-G + LIB_LINK_FLAGS += -maix64 -Wl,-b64 -Wl,-brtl -Wl,-G +endif + +#------------------------------------------------------------------------------ +# Setting assembler data. +#------------------------------------------------------------------------------ + +ASSEMBLY_SOURCE=ibm_aix51 +ifeq (powerpc,$(arch)) + TBB_ASM.OBJ = atomic_support.o +endif + +#------------------------------------------------------------------------------ +# End of setting assembler data. +#------------------------------------------------------------------------------ + +#------------------------------------------------------------------------------ +# Setting tbbmalloc data. +#------------------------------------------------------------------------------ + +M_CPLUS_FLAGS = $(CPLUS_FLAGS) -fno-rtti -fno-exceptions + +#------------------------------------------------------------------------------ +# End of setting tbbmalloc data. +#------------------------------------------------------------------------------ diff --git a/xdl/third_party/tbb/build/AIX.inc b/xdl/third_party/tbb/build/AIX.inc new file mode 100644 index 00000000..e279a4da --- /dev/null +++ b/xdl/third_party/tbb/build/AIX.inc @@ -0,0 +1,66 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +ifndef arch + arch:=$(shell uname -p) + export arch +endif + +ifndef runtime + gcc_version:=$(shell gcc -dumpversion) + os_version:=$(shell uname -r) + os_kernel_version:=$(shell uname -r | sed -e 's/-.*$$//') + export runtime:=cc$(gcc_version)_kernel$(os_kernel_version) +endif + +native_compiler := gcc +export compiler ?= gcc +debugger ?= gdb + +CMD=$(SHELL) -c +CWD=$(shell pwd) +RM?=rm -f +RD?=rmdir +MD?=mkdir -p +NUL= /dev/null +SLASH=/ +MAKE_VERSIONS=sh $(tbb_root)/build/version_info_aix.sh $(VERSION_FLAGS) >version_string.ver +MAKE_TBBVARS=sh $(tbb_root)/build/generate_tbbvars.sh + +ifdef LIBPATH + export LIBPATH := .:$(LIBPATH) +else + export LIBPATH := . +endif + +####### Build settings ######################################################## + +OBJ = o +DLL = so + +TBB.LST = +TBB.DEF = +TBB.DLL = libtbb$(CPF_SUFFIX)$(DEBUG_SUFFIX).$(DLL) +TBB.LIB = $(TBB.DLL) +LINK_TBB.LIB = $(TBB.LIB) + +MALLOC.DLL = libtbbmalloc$(DEBUG_SUFFIX).$(DLL) +MALLOC.LIB = $(MALLOC.DLL) +LINK_MALLOC.LIB = $(MALLOC.LIB) + +TEST_LAUNCHER=sh $(tbb_root)/build/test_launcher.sh $(largs) diff --git a/xdl/third_party/tbb/build/BSD.clang.inc b/xdl/third_party/tbb/build/BSD.clang.inc new file mode 100644 index 00000000..fc134061 --- /dev/null +++ b/xdl/third_party/tbb/build/BSD.clang.inc @@ -0,0 +1,110 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +COMPILE_ONLY = -c -MMD +PREPROC_ONLY = -E -x c++ +INCLUDE_KEY = -I +DEFINE_KEY = -D +OUTPUT_KEY = -o # +OUTPUTOBJ_KEY = -o # +PIC_KEY = -fPIC +WARNING_AS_ERROR_KEY = -Werror +WARNING_KEY = -Wall +TEST_WARNING_KEY = -Wextra -Wshadow -Wcast-qual -Woverloaded-virtual -Wnon-virtual-dtor +WARNING_SUPPRESS = -Wno-parentheses -Wno-non-virtual-dtor -Wno-dangling-else +DYLIB_KEY = -shared +EXPORT_KEY = -Wl,--version-script, +LIBDL = + +CPLUS = clang++ +CONLY = clang +LIB_LINK_FLAGS = $(DYLIB_KEY) -Wl,-soname=$(BUILDING_LIBRARY) +LIBS += -lpthread +LINK_FLAGS = -Wl,-rpath-link=. -Wl,-rpath=. -rdynamic +C_FLAGS = $(CPLUS_FLAGS) + +ifeq ($(cfg), release) + CPLUS_FLAGS = $(ITT_NOTIFY) -g -O2 -DUSE_PTHREAD +endif +ifeq ($(cfg), debug) + CPLUS_FLAGS = -DTBB_USE_DEBUG $(ITT_NOTIFY) -g -O0 -DUSE_PTHREAD +endif + +ifneq (,$(stdlib)) + CPLUS_FLAGS += -stdlib=$(stdlib) + LIB_LINK_FLAGS += -stdlib=$(stdlib) +endif + +TBB_ASM.OBJ= +MALLOC_ASM.OBJ= + +ifeq (intel64,$(arch)) + ITT_NOTIFY = -DDO_ITT_NOTIFY + CPLUS_FLAGS += -m64 + LIB_LINK_FLAGS += -m64 +endif + +ifeq (ia32,$(arch)) + ITT_NOTIFY = -DDO_ITT_NOTIFY + CPLUS_FLAGS += -m32 -march=pentium4 + LIB_LINK_FLAGS += -m32 +endif + +ifeq (ppc64,$(arch)) + CPLUS_FLAGS += -m64 + LIB_LINK_FLAGS += -m64 +endif + +ifeq (ppc32,$(arch)) + CPLUS_FLAGS += -m32 + LIB_LINK_FLAGS += -m32 +endif + +ifeq (bg,$(arch)) + CPLUS = bgclang++ + CONLY = bgclang +endif + +#------------------------------------------------------------------------------ +# Setting assembler data. +#------------------------------------------------------------------------------ +ASM = as +ifeq (intel64,$(arch)) + ASM_FLAGS += --64 +endif +ifeq (ia32,$(arch)) + ASM_FLAGS += --32 +endif +ifeq ($(cfg),debug) + ASM_FLAGS += -g +endif + +ASSEMBLY_SOURCE=$(arch)-gas +#------------------------------------------------------------------------------ +# End of setting assembler data. +#------------------------------------------------------------------------------ + +#------------------------------------------------------------------------------ +# Setting tbbmalloc data. +#------------------------------------------------------------------------------ + +M_CPLUS_FLAGS = $(CPLUS_FLAGS) -fno-rtti -fno-exceptions + +#------------------------------------------------------------------------------ +# End of setting tbbmalloc data. +#------------------------------------------------------------------------------ diff --git a/xdl/third_party/tbb/build/BSD.inc b/xdl/third_party/tbb/build/BSD.inc new file mode 100644 index 00000000..0ba21351 --- /dev/null +++ b/xdl/third_party/tbb/build/BSD.inc @@ -0,0 +1,74 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +ifndef arch + ifeq ($(shell uname -m),i386) + export arch:=ia32 + endif + ifeq ($(shell uname -m),ia64) + export arch:=ia64 + endif + ifeq ($(shell uname -m),amd64) + export arch:=intel64 + endif +endif + +ifndef runtime + clang_version:=$(shell clang -v 2>&1 | grep version | sed "s/.*version \([0-9]*\.[0-9]*\).*/\1/") + os_version:=$(shell uname -r) + os_kernel_version:=$(shell uname -r | sed -e 's/-.*$$//') + export runtime:=cc$(clang_version)_kernel$(os_kernel_version) +endif + +native_compiler := clang +export compiler ?= clang +debugger ?= gdb + +CMD=$(SHELL) -c +CWD=$(shell pwd) +RM?=rm -f +RD?=rmdir +MD?=mkdir -p +NUL= /dev/null +SLASH=/ +MAKE_VERSIONS=sh $(tbb_root)/build/version_info_linux.sh $(VERSION_FLAGS) >version_string.ver +MAKE_TBBVARS=sh $(tbb_root)/build/generate_tbbvars.sh + +ifdef LD_LIBRARY_PATH + export LD_LIBRARY_PATH := .:$(LD_LIBRARY_PATH) +else + export LD_LIBRARY_PATH := . +endif + +####### Build settings ######################################################## + +OBJ = o +DLL = so +LIBEXT=so + +TBB.LST = +TBB.DEF = +TBB.DLL = libtbb$(CPF_SUFFIX)$(DEBUG_SUFFIX).$(DLL) +TBB.LIB = $(TBB.DLL) +LINK_TBB.LIB = $(TBB.LIB) + +MALLOC.DLL = libtbbmalloc$(DEBUG_SUFFIX).$(DLL) +MALLOC.LIB = $(MALLOC.DLL) +LINK_MALLOC.LIB = $(MALLOC.LIB) + +TEST_LAUNCHER=sh $(tbb_root)/build/test_launcher.sh $(largs) diff --git a/xdl/third_party/tbb/build/FreeBSD.clang.inc b/xdl/third_party/tbb/build/FreeBSD.clang.inc new file mode 100644 index 00000000..aae99642 --- /dev/null +++ b/xdl/third_party/tbb/build/FreeBSD.clang.inc @@ -0,0 +1,21 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +include $(tbb_root)/build/BSD.clang.inc + +LIBS += -lrt diff --git a/xdl/third_party/tbb/build/FreeBSD.gcc.inc b/xdl/third_party/tbb/build/FreeBSD.gcc.inc new file mode 100644 index 00000000..1c8ff5ff --- /dev/null +++ b/xdl/third_party/tbb/build/FreeBSD.gcc.inc @@ -0,0 +1,93 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +COMPILE_ONLY = -c -MMD +PREPROC_ONLY = -E -x c++ +INCLUDE_KEY = -I +DEFINE_KEY = -D +OUTPUT_KEY = -o # +OUTPUTOBJ_KEY = -o # +PIC_KEY = -fPIC +WARNING_AS_ERROR_KEY = -Werror +WARNING_KEY = -Wall +DYLIB_KEY = -shared +WARNING_SUPPRESS = -Wno-parentheses + +CPLUS = g++ +CONLY = gcc +LIB_LINK_FLAGS = -shared +LIBS = -lpthread +C_FLAGS = $(CPLUS_FLAGS) + +# gcc 6.0 and later have -flifetime-dse option that controls +# elimination of stores done outside the object lifetime +ifneq (,$(shell gcc -dumpversion | egrep "^([6-9])")) + # keep pre-contruction stores for zero initialization + DSE_KEY = -flifetime-dse=1 +endif + +ifeq ($(cfg), release) + CPLUS_FLAGS = -g -O2 -DUSE_PTHREAD +endif +ifeq ($(cfg), debug) + CPLUS_FLAGS = -DTBB_USE_DEBUG -g -O0 -DUSE_PTHREAD +endif + +ASM= +ASM_FLAGS= + +TBB_ASM.OBJ= +MALLOC_ASM.OBJ= + +ifeq (ia64,$(arch)) +# Position-independent code (PIC) is a must on IA-64 architecture, even for regular (not shared) executables + CPLUS_FLAGS += $(PIC_KEY) +endif + +ifeq (intel64,$(arch)) + CPLUS_FLAGS += -m64 + LIB_LINK_FLAGS += -m64 +endif + +ifeq (ia32,$(arch)) + CPLUS_FLAGS += -m32 + LIB_LINK_FLAGS += -m32 +endif + +#------------------------------------------------------------------------------ +# Setting assembler data. +#------------------------------------------------------------------------------ +ASSEMBLY_SOURCE=$(arch)-gas +ifeq (ia64,$(arch)) + ASM=as + TBB_ASM.OBJ = atomic_support.o lock_byte.o log2.o pause.o + MALLOC_ASM.OBJ = atomic_support.o lock_byte.o pause.o +endif +#------------------------------------------------------------------------------ +# End of setting assembler data. +#------------------------------------------------------------------------------ + +#------------------------------------------------------------------------------ +# Setting tbbmalloc data. +#------------------------------------------------------------------------------ + +M_CPLUS_FLAGS = $(CPLUS_FLAGS) -fno-rtti -fno-exceptions + +#------------------------------------------------------------------------------ +# End of setting tbbmalloc data. +#------------------------------------------------------------------------------ diff --git a/xdl/third_party/tbb/build/FreeBSD.inc b/xdl/third_party/tbb/build/FreeBSD.inc new file mode 100644 index 00000000..91bebc96 --- /dev/null +++ b/xdl/third_party/tbb/build/FreeBSD.inc @@ -0,0 +1,19 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +include $(tbb_root)/build/BSD.inc diff --git a/xdl/third_party/tbb/build/Makefile.rml b/xdl/third_party/tbb/build/Makefile.rml new file mode 100644 index 00000000..e3150e39 --- /dev/null +++ b/xdl/third_party/tbb/build/Makefile.rml @@ -0,0 +1,166 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +# TODO: investigate why version_string.ver is not complete when $(RML_SERVER.OBJ) is being compiled. +.NOTPARALLEL: + +tbb_root ?= $(TBBROOT) +BUILDING_PHASE=1 +TEST_RESOURCE = $(RML.RES) +include $(tbb_root)/build/common.inc +DEBUG_SUFFIX=$(findstring _debug,_$(cfg)) + +ifeq (android,$(target)) +$(error "RML is not supported on Android") +endif + +# default target +default_rml: rml rml_test + +RML_ROOT ?= $(tbb_root)/src/rml +RML_SERVER_ROOT = $(RML_ROOT)/server + +VPATH = $(tbb_root)/src/tbb $(tbb_root)/src/tbb/$(ASSEMBLY_SOURCE) +VPATH += $(RML_ROOT)/server $(RML_ROOT)/client $(RML_ROOT)/test $(tbb_root)/src/test + +include $(tbb_root)/build/common_rules.inc + +#-------------------------------------------------------------------------- +# Define rules for making the RML server shared library and client objects. +#-------------------------------------------------------------------------- + +# Object files that make up RML server +RML_SERVER.OBJ = rml_server.$(OBJ) + +# Object files that RML clients need +RML_TBB_CLIENT.OBJ ?= rml_tbb.$(OBJ) dynamic_link_rml.$(OBJ) +RML_OMP_CLIENT.OBJ ?= rml_omp.$(OBJ) omp_dynamic_link.$(OBJ) + +RML.OBJ = $(RML_SERVER.OBJ) $(RML_TBB_CLIENT.OBJ) $(RML_OMP_CLIENT.OBJ) +ifeq (windows,$(tbb_os)) +RML_ASM.OBJ = $(if $(findstring intel64,$(arch)),$(TBB_ASM.OBJ)) +endif +ifeq (linux,$(tbb_os)) +RML_ASM.OBJ = $(if $(findstring ia64,$(arch)),$(TBB_ASM.OBJ)) +endif + +RML_TBB_DEP= cache_aligned_allocator_rml.$(OBJ) dynamic_link_rml.$(OBJ) concurrent_vector_rml.$(OBJ) semaphore_rml.$(OBJ) tbb_misc_rml.$(OBJ) tbb_misc_ex_rml.$(OBJ) +TBB_DEP_NON_RML_TEST?= cache_aligned_allocator_rml.$(OBJ) dynamic_link_rml.$(OBJ) $(RML_ASM.OBJ) tbb_misc_rml.$(OBJ) tbb_misc_ex_rml.$(OBJ) +ifeq ($(cfg),debug) +RML_TBB_DEP+= spin_mutex_rml.$(OBJ) +TBB_DEP_RML_TEST?= $(RML_ASM.OBJ) tbb_misc_rml.$(OBJ) +else +TBB_DEP_RML_TEST?= $(RML_ASM.OBJ) +endif +LIBS += $(LIBDL) + +INCLUDES += $(INCLUDE_KEY)$(RML_ROOT)/include $(INCLUDE_KEY). +T_INCLUDES = $(INCLUDES) $(INCLUDE_KEY)$(tbb_root)/src/test $(INCLUDE_KEY)$(RML_SERVER_ROOT) + +ifeq ($(rml_wcrm),1) +CPLUS_FLAGS+=/DRML_USE_WCRM +endif + +# Suppress superfluous warnings for RML compilation +R_CPLUS_FLAGS = $(subst DO_ITT_NOTIFY,DO_ITT_NOTIFY=0,$(CPLUS_FLAGS)) $(WARNING_SUPPRESS) \ + $(DEFINE_KEY)TBB_USE_THREADING_TOOLS=0 $(DEFINE_KEY)__TBB_RML_STATIC=1 $(DEFINE_KEY)__TBB_NO_IMPLICIT_LINKAGE=1 + +%.$(OBJ): %.cpp + $(CPLUS) $(COMPILE_ONLY) $(R_CPLUS_FLAGS) $(PIC_KEY) $(DSE_KEY) $(INCLUDES) $< + +ifeq (linux,$(tbb_os)) +omp_dynamic_link.$(OBJ): CPLUS_FLAGS+=-fno-exceptions +endif + +tbb_misc_rml.$(OBJ) $(RML_SERVER.OBJ): version_string.ver + +RML_TEST.OBJ = test_job_automaton.$(OBJ) test_thread_monitor.$(OBJ) test_rml_tbb.$(OBJ) test_rml_omp.$(OBJ) test_rml_mixed.$(OBJ) + +$(RML_TBB_DEP): %_rml.$(OBJ): %.cpp + $(CPLUS) $(COMPILE_ONLY) $(OUTPUTOBJ_KEY)$@ $(R_CPLUS_FLAGS) $(PIC_KEY) $(DSE_KEY) $(INCLUDES) $< + +$(RML_TEST.OBJ): %.$(OBJ): %.cpp + $(CPLUS) $(COMPILE_ONLY) $(R_CPLUS_FLAGS) $(PIC_KEY) $(T_INCLUDES) $< + +ifneq (,$(RML.DEF)) +rml.def: $(RML.DEF) + $(CPLUS) $(PREPROC_ONLY) $< $(CPLUS_FLAGS) $(INCLUDES) > $@ + +LIB_LINK_FLAGS += $(EXPORT_KEY)rml.def +$(RML.DLL): rml.def +endif + +$(RML.DLL): CPLUS_FLAGS += $(SDL_FLAGS) +$(RML.DLL): BUILDING_LIBRARY = $(RML.DLL) +$(RML.DLL): $(RML_TBB_DEP) $(RML_SERVER.OBJ) $(RML.RES) $(RML_NO_VERSION.DLL) $(RML_ASM.OBJ) + $(LIB_LINK_CMD) $(LIB_OUTPUT_KEY)$(RML.DLL) $(RML_SERVER.OBJ) $(RML_TBB_DEP) $(RML_ASM.OBJ) $(RML.RES) $(LIB_LINK_LIBS) $(LIB_LINK_FLAGS) + +ifneq (,$(RML_NO_VERSION.DLL)) +$(RML_NO_VERSION.DLL): + echo "INPUT ($(RML.DLL))" > $(RML_NO_VERSION.DLL) +endif + +rml: $(RML.DLL) $(RML_TBB_CLIENT.OBJ) $(RML_OMP_CLIENT.OBJ) + +#------------------------------------------------------ +# End of rules for making the RML server shared library +#------------------------------------------------------ + +#------------------------------------------------------ +# Define rules for making the RML unit tests +#------------------------------------------------------ + +add_debug=$(basename $(1))_debug$(suffix $(1)) +cross_suffix=$(if $(crosstest),$(if $(DEBUG_SUFFIX),$(subst _debug,,$(1)),$(call add_debug,$(1))),$(1)) + +RML_TESTS = test_job_automaton.$(TEST_EXT) test_thread_monitor.$(TEST_EXT) +RML_CUSTOM_TESTS = test_rml_tbb.$(TEST_EXT) test_rml_omp.$(TEST_EXT) test_rml_mixed.$(TEST_EXT) test_rml_omp_c_linkage.$(TEST_EXT) + +test_rml_tbb.$(TEST_EXT): test_rml_tbb.$(OBJ) $(RML_TBB_CLIENT.OBJ) $(TBB_DEP_RML_TEST) + $(CPLUS) $(OUTPUT_KEY)$@ $(CPLUS_FLAGS) test_rml_tbb.$(OBJ) $(RML_TBB_CLIENT.OBJ) $(TBB_DEP_RML_TEST) $(LIBS) $(LINK_FLAGS) + +test_rml_omp.$(TEST_EXT): test_rml_omp.$(OBJ) $(RML_OMP_CLIENT.OBJ) $(TBB_DEP_NON_RML_TEST) + $(CPLUS) $(OUTPUT_KEY)$@ $(CPLUS_FLAGS) test_rml_omp.$(OBJ) $(RML_OMP_CLIENT.OBJ) $(TBB_DEP_NON_RML_TEST) $(LIBS) $(LINK_FLAGS) + +test_rml_mixed.$(TEST_EXT): test_rml_mixed.$(OBJ) $(RML_TBB_CLIENT.OBJ) $(RML_OMP_CLIENT.OBJ) $(TBB_DEP_RML_TEST) + $(CPLUS) $(OUTPUT_KEY)$@ $(CPLUS_FLAGS) test_rml_mixed.$(OBJ) $(RML_TBB_CLIENT.OBJ) $(RML_OMP_CLIENT.OBJ) $(TBB_DEP_RML_TEST) $(LIBS) $(LINK_FLAGS) + +rml_omp_stub.$(OBJ): rml_omp_stub.cpp + $(CPLUS) $(COMPILE_ONLY) $(M_CPLUS_FLAGS) $(WARNING_SUPPRESS) $(T_INCLUDES) $(PIC_KEY) $< + +test_rml_omp_c_linkage.$(TEST_EXT): test_rml_omp_c_linkage.$(OBJ) rml_omp_stub.$(OBJ) omp_dynamic_link.$(OBJ) + $(CONLY) $(C_FLAGS) $(OUTPUT_KEY)$@ test_rml_omp_c_linkage.$(OBJ) rml_omp_stub.$(OBJ) omp_dynamic_link.$(OBJ) $(LIBS) $(LINK_FLAGS) + +$(RML_TESTS): %.$(TEST_EXT): %.$(OBJ) $(TBB_DEP_NON_RML_TEST) + $(CPLUS) $(OUTPUT_KEY)$@ $(CPLUS_FLAGS) $< $(TBB_DEP_NON_RML_TEST) $(LIBS) $(LINK_FLAGS) + +### run_cmd is usually empty +rml_test: $(call cross_suffix,$(RML.DLL)) $(TEST_PREREQUISITE) $(RML_TESTS) $(RML_CUSTOM_TESTS) + $(run_cmd) ./test_job_automaton.$(TEST_EXT) $(args) + $(run_cmd) ./test_thread_monitor.$(TEST_EXT) $(args) + $(run_cmd) ./test_rml_tbb.$(TEST_EXT) $(args) + $(run_cmd) ./test_rml_omp.$(TEST_EXT) $(args) + $(run_cmd) ./test_rml_mixed.$(TEST_EXT) $(args) + $(run_cmd) ./test_rml_omp_c_linkage.$(TEST_EXT) $(args) + +#------------------------------------------------------ +# End of rules for making the TBBMalloc unit tests +#------------------------------------------------------ + +# Include automatically generated dependencies +-include *.d diff --git a/xdl/third_party/tbb/build/Makefile.tbb b/xdl/third_party/tbb/build/Makefile.tbb new file mode 100644 index 00000000..0ddf4601 --- /dev/null +++ b/xdl/third_party/tbb/build/Makefile.tbb @@ -0,0 +1,118 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +#------------------------------------------------------------------------------ +# Define rules for making the TBB shared library. +#------------------------------------------------------------------------------ + +tbb_root ?= "$(TBBROOT)" +BUILDING_PHASE=1 +include $(tbb_root)/build/common.inc +CPLUS_FLAGS += $(SDL_FLAGS) +DEBUG_SUFFIX=$(findstring _debug,_$(cfg)) + +#------------------------------------------------------------ +# Define static pattern rules dealing with .cpp source files +#------------------------------------------------------------ +$(warning CONFIG: cfg=$(cfg) arch=$(arch) compiler=$(compiler) target=$(target) runtime=$(runtime)) + +default_tbb: $(TBB.DLL) +.PHONY: default_tbb tbbvars clean +.PRECIOUS: %.$(OBJ) + +VPATH = $(tbb_root)/src/tbb/$(ASSEMBLY_SOURCE) $(tbb_root)/src/tbb $(tbb_root)/src/old $(tbb_root)/src/rml/client + +CPLUS_FLAGS += $(PIC_KEY) $(DSE_KEY) $(DEFINE_KEY)__TBB_BUILD=1 + +# Object files (that were compiled from C++ code) that gmake up TBB +TBB_CPLUS.OBJ = concurrent_hash_map.$(OBJ) \ + concurrent_queue.$(OBJ) \ + concurrent_vector.$(OBJ) \ + dynamic_link.$(OBJ) \ + itt_notify.$(OBJ) \ + cache_aligned_allocator.$(OBJ) \ + pipeline.$(OBJ) \ + queuing_mutex.$(OBJ) \ + queuing_rw_mutex.$(OBJ) \ + reader_writer_lock.$(OBJ) \ + spin_rw_mutex.$(OBJ) \ + x86_rtm_rw_mutex.$(OBJ) \ + spin_mutex.$(OBJ) \ + critical_section.$(OBJ) \ + mutex.$(OBJ) \ + recursive_mutex.$(OBJ) \ + condition_variable.$(OBJ) \ + tbb_thread.$(OBJ) \ + concurrent_monitor.$(OBJ) \ + semaphore.$(OBJ) \ + private_server.$(OBJ) \ + rml_tbb.$(OBJ) \ + tbb_misc.$(OBJ) \ + tbb_misc_ex.$(OBJ) \ + task.$(OBJ) \ + task_group_context.$(OBJ) \ + governor.$(OBJ) \ + market.$(OBJ) \ + arena.$(OBJ) \ + scheduler.$(OBJ) \ + observer_proxy.$(OBJ) \ + tbb_statistics.$(OBJ) \ + tbb_main.$(OBJ) + +# OLD/Legacy object files for backward binary compatibility +ifeq (,$(findstring $(DEFINE_KEY)TBB_NO_LEGACY,$(CPLUS_FLAGS))) +TBB_CPLUS_OLD.OBJ = \ + concurrent_vector_v2.$(OBJ) \ + concurrent_queue_v2.$(OBJ) \ + spin_rw_mutex_v2.$(OBJ) \ + task_v2.$(OBJ) +endif + +# Object files that gmake up TBB (TBB_ASM.OBJ is platform-specific) +TBB.OBJ = $(TBB_CPLUS.OBJ) $(TBB_CPLUS_OLD.OBJ) $(TBB_ASM.OBJ) + +# Suppress superfluous warnings for TBB compilation +WARNING_KEY += $(WARNING_SUPPRESS) + +include $(tbb_root)/build/common_rules.inc + +ifneq (,$(TBB.DEF)) +tbb.def: $(TBB.DEF) $(TBB.LST) + $(CPLUS) $(PREPROC_ONLY) $< $(CPLUS_FLAGS) $(INCLUDES) > $@ + +LIB_LINK_FLAGS += $(EXPORT_KEY)tbb.def +$(TBB.DLL): tbb.def +endif + +tbbvars.sh: + $(MAKE_TBBVARS) + +$(TBB.DLL): BUILDING_LIBRARY = $(TBB.DLL) +$(TBB.DLL): $(TBB.OBJ) $(TBB.RES) tbbvars.sh $(TBB_NO_VERSION.DLL) + $(LIB_LINK_CMD) $(LIB_OUTPUT_KEY)$(TBB.DLL) $(TBB.OBJ) $(TBB.RES) $(LIB_LINK_LIBS) $(LIB_LINK_FLAGS) + +ifneq (,$(TBB_NO_VERSION.DLL)) +$(TBB_NO_VERSION.DLL): + echo "INPUT ($(TBB.DLL))" > $(TBB_NO_VERSION.DLL) +endif + +#clean: +# $(RM) *.$(OBJ) *.$(DLL) *.res *.map *.ilk *.pdb *.exp *.manifest *.tmp *.d core core.*[0-9][0-9] *.ver + +# Include automatically generated dependencies +-include *.d diff --git a/xdl/third_party/tbb/build/Makefile.tbbmalloc b/xdl/third_party/tbb/build/Makefile.tbbmalloc new file mode 100644 index 00000000..c147568b --- /dev/null +++ b/xdl/third_party/tbb/build/Makefile.tbbmalloc @@ -0,0 +1,260 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +# default target +default_malloc: malloc malloc_test + +tbb_root ?= $(TBBROOT) +BUILDING_PHASE=1 +TEST_RESOURCE = $(MALLOC.RES) +TESTFILE=tbbmalloc +include $(tbb_root)/build/common.inc +DEBUG_SUFFIX=$(findstring _debug,$(call cross_cfg,_$(cfg))) + +MALLOC_ROOT ?= $(tbb_root)/src/tbbmalloc +MALLOC_SOURCE_ROOT ?= $(MALLOC_ROOT) + +VPATH = $(tbb_root)/src/tbb/$(ASSEMBLY_SOURCE) $(tbb_root)/src/tbb $(tbb_root)/src/test +VPATH += $(MALLOC_ROOT) $(MALLOC_SOURCE_ROOT) + +CPLUS_FLAGS += $(if $(crosstest),$(DEFINE_KEY)__TBBMALLOC_NO_IMPLICIT_LINKAGE=1) + +TEST_SUFFIXES=proxy +TEST_PREREQUISITE+=$(MALLOC.LIB) +LINK_FILES+=$(LINK_MALLOC.LIB) +include $(tbb_root)/build/common_rules.inc + +ORIG_CPLUS_FLAGS:=$(CPLUS_FLAGS) +ORIG_INCLUDES:=$(INCLUDES) +ORIG_LINK_MALLOC.LIB:=$(LINK_MALLOC.LIB) + +#------------------------------------------------------ +# Define rules for making the TBBMalloc shared library. +#------------------------------------------------------ + +# Object files that make up TBBMalloc +MALLOC_CPLUS.OBJ = backend.$(OBJ) large_objects.$(OBJ) backref.$(OBJ) tbbmalloc.$(OBJ) +MALLOC.OBJ := $(MALLOC_CPLUS.OBJ) $(MALLOC_ASM.OBJ) itt_notify_malloc.$(OBJ) frontend.$(OBJ) +PROXY.OBJ := proxy.$(OBJ) tbb_function_replacement.$(OBJ) +M_CPLUS_FLAGS += $(DEFINE_KEY)__TBBMALLOC_BUILD=1 +M_INCLUDES := $(INCLUDES) $(INCLUDE_KEY)$(MALLOC_ROOT) $(INCLUDE_KEY)$(MALLOC_SOURCE_ROOT) + +# Suppress superfluous warnings for TBBMalloc compilation +$(MALLOC.OBJ): M_CPLUS_FLAGS := $(subst $(WARNING_KEY),,$(M_CPLUS_FLAGS)) $(WARNING_SUPPRESS) +# Suppress superfluous warnings for TBBMalloc proxy compilation +$(PROXY.OBJ): CPLUS_FLAGS += $(WARNING_SUPPRESS) + +frontend.$(OBJ): frontend.cpp version_string.ver + $(CPLUS) $(COMPILE_ONLY) $(M_CPLUS_FLAGS) $(PIC_KEY) $(DSE_KEY) $(M_INCLUDES) $(INCLUDE_KEY). $< + +$(PROXY.OBJ): %.$(OBJ): %.cpp + $(CPLUS) $(COMPILE_ONLY) $(CPLUS_FLAGS) $(PIC_KEY) $(DSE_KEY) $(DEFINE_KEY)__TBBMALLOC_BUILD=1 $(M_INCLUDES) $< + +$(MALLOC_CPLUS.OBJ): %.$(OBJ): %.cpp + $(CPLUS) $(COMPILE_ONLY) $(M_CPLUS_FLAGS) $(PIC_KEY) $(DSE_KEY) $(M_INCLUDES) $< + +itt_notify_malloc.$(OBJ): itt_notify.cpp + $(CPLUS) $(COMPILE_ONLY) $(M_CPLUS_FLAGS) $(PIC_KEY) $(DSE_KEY) $(OUTPUTOBJ_KEY)$@ $(INCLUDES) $< + +MALLOC_LINK_FLAGS = $(LIB_LINK_FLAGS) +PROXY_LINK_FLAGS = $(LIB_LINK_FLAGS) + +ifneq (,$(MALLOC.DEF)) +tbbmalloc.def: $(MALLOC.DEF) + $(CPLUS) $(PREPROC_ONLY) $< $(M_CPLUS_FLAGS) $(WARNING_SUPPRESS) $(INCLUDES) > $@ + +MALLOC_LINK_FLAGS += $(EXPORT_KEY)tbbmalloc.def +$(MALLOC.DLL): tbbmalloc.def +endif + +$(MALLOC.DLL) $(MALLOCPROXY.DLL): CPLUS_FLAGS += $(SDL_FLAGS) +$(MALLOC.DLL) $(MALLOCPROXY.DLL): M_CPLUS_FLAGS += $(SDL_FLAGS) +$(MALLOC.DLL): BUILDING_LIBRARY = $(MALLOC.DLL) +$(MALLOC.DLL): $(MALLOC.OBJ) $(MALLOC.RES) $(MALLOC_NO_VERSION.DLL) + $(subst $(CPLUS),$(CONLY),$(LIB_LINK_CMD)) $(LIB_OUTPUT_KEY)$(MALLOC.DLL) $(MALLOC.OBJ) $(MALLOC.RES) $(LIB_LINK_LIBS) $(MALLOC_LINK_FLAGS) + +ifneq (,$(MALLOCPROXY.DEF)) +tbbmallocproxy.def: $(MALLOCPROXY.DEF) + $(CPLUS) $(PREPROC_ONLY) $< $(CPLUS_FLAGS) $(WARNING_SUPPRESS) $(INCLUDES) > $@ + +PROXY_LINK_FLAGS += $(EXPORT_KEY)tbbmallocproxy.def +$(MALLOCPROXY.DLL): tbbmallocproxy.def +endif + +ifneq (,$(MALLOCPROXY.DLL)) +$(MALLOCPROXY.DLL): BUILDING_LIBRARY = $(MALLOCPROXY.DLL) +$(MALLOCPROXY.DLL): $(PROXY.OBJ) $(MALLOCPROXY_NO_VERSION.DLL) $(MALLOC.DLL) $(MALLOC.RES) + $(LIB_LINK_CMD) $(LIB_OUTPUT_KEY)$(MALLOCPROXY.DLL) $(PROXY.OBJ) $(MALLOC.RES) $(LIB_LINK_LIBS) $(LINK_MALLOC.LIB) $(PROXY_LINK_FLAGS) +endif + +ifneq (,$(MALLOC_NO_VERSION.DLL)) +$(MALLOC_NO_VERSION.DLL): + echo "INPUT ($(MALLOC.DLL))" > $(MALLOC_NO_VERSION.DLL) +endif + +ifneq (,$(MALLOCPROXY_NO_VERSION.DLL)) +$(MALLOCPROXY_NO_VERSION.DLL): + echo "INPUT ($(MALLOCPROXY.DLL))" > $(MALLOCPROXY_NO_VERSION.DLL) +endif + +malloc: $(MALLOC.DLL) $(MALLOCPROXY.DLL) + +malloc_dll: $(MALLOC.DLL) + +malloc_proxy_dll: $(MALLOCPROXY.DLL) + +.PHONY: malloc malloc_dll malloc_proxy_dll + +#------------------------------------------------------ +# End of rules for making the TBBMalloc shared library +#------------------------------------------------------ + +#------------------------------------------------------ +# Define rules for making the TBBMalloc unit tests +#------------------------------------------------------ + +# --------- The list of TBBMalloc unit tests ---------- +MALLOC_TESTS = test_ScalableAllocator.$(TEST_EXT) \ + test_ScalableAllocator_STL.$(TEST_EXT) \ + test_malloc_compliance.$(TEST_EXT) \ + test_malloc_regression.$(TEST_EXT) \ + test_malloc_init_shutdown.$(TEST_EXT) \ + test_malloc_pools.$(TEST_EXT) \ + test_malloc_pure_c.$(TEST_EXT) \ + test_malloc_whitebox.$(TEST_EXT) \ + test_malloc_used_by_lib.$(TEST_EXT) \ + test_malloc_lib_unload.$(TEST_EXT) \ + test_malloc_shutdown_hang.$(TEST_EXT) +ifneq (,$(MALLOCPROXY.DLL)) +MALLOC_TESTS += test_malloc_overload.$(TEST_EXT) \ + test_malloc_overload_proxy.$(TEST_EXT) \ + test_malloc_overload_disable.$(TEST_EXT) \ + test_malloc_atexit.$(TEST_EXT) \ + test_malloc_new_handler.$(TEST_EXT) +endif +# ----------------------------------------------------- + +# ------------ Set test specific variables ------------ +# TODO: implement accurate warning suppression for tests to unify with Makefile.test. +$(MALLOC_TESTS): CPLUS_FLAGS += $(TEST_WARNING_KEY) $(if $(no_exceptions),$(DEFINE_KEY)__TBB_TEST_NO_EXCEPTIONS=1) +$(MALLOC_TESTS): M_CPLUS_FLAGS += $(TEST_WARNING_KEY) $(if $(no_exceptions),$(DEFINE_KEY)__TBB_TEST_NO_EXCEPTIONS=1) +$(MALLOC_TESTS): INCLUDES += $(INCLUDE_TEST_HEADERS) +$(MALLOC_TESTS): M_INCLUDES += $(INCLUDE_TEST_HEADERS) + +ifeq (windows.gcc,$(tbb_os).$(compiler)) +test_malloc_overload.$(TEST_EXT): LIBS += $(MALLOCPROXY.LIB) +endif + +MALLOC_M_CPLUS_TESTS = test_malloc_whitebox.$(TEST_EXT) test_malloc_lib_unload.$(TEST_EXT) \ + test_malloc_used_by_lib.$(TEST_EXT) +MALLOC_NO_LIB_TESTS = test_malloc_whitebox.$(TEST_EXT) test_malloc_lib_unload.$(TEST_EXT) \ + test_malloc_used_by_lib.$(TEST_EXT) test_malloc_overload.$(TEST_EXT) +MALLOC_LINK_PROXY_TESTS = test_malloc_overload_proxy.$(TEST_EXT) test_malloc_new_handler.$(TEST_EXT) +MALLOC_ADD_DLL_TESTS = test_malloc_lib_unload.$(TEST_EXT) test_malloc_used_by_lib.$(TEST_EXT) \ + test_malloc_atexit.$(TEST_EXT) +MALLOC_SUPPRESS_WARNINGS = test_malloc_whitebox.$(TEST_EXT) test_malloc_pure_c.$(TEST_EXT) + +$(MALLOC_SUPPRESS_WARNINGS): WARNING_KEY= +$(MALLOC_SUPPRESS_WARNINGS): TEST_WARNING_KEY= +$(MALLOC_M_CPLUS_TESTS): CPLUS_FLAGS:=$(M_CPLUS_FLAGS) +$(MALLOC_M_CPLUS_TESTS): INCLUDES=$(M_INCLUDES) +$(MALLOC_NO_LIB_TESTS): LINK_MALLOC.LIB= +$(MALLOC_NO_LIB_TESTS): LINK_FLAGS+=$(LIBDL) +$(MALLOC_LINK_PROXY_TESTS): LINK_MALLOC.LIB=$(LINK_MALLOCPROXY.LIB) +ifneq (,$(DYLIB_KEY)) +$(MALLOC_ADD_DLL_TESTS): %.$(TEST_EXT): %_dll.$(DLL) +$(MALLOC_ADD_DLL_TESTS): TEST_LIBS+=$(@:.$(TEST_EXT)=_dll.$(LIBEXT)) +endif + +test_malloc_over%.$(TEST_EXT): CPLUS_FLAGS:=$(subst /MT,/MD,$(M_CPLUS_FLAGS)) +test_malloc_over%.$(TEST_EXT): INCLUDES=$(M_INCLUDES) +test_malloc_overload_proxy.$(TEST_EXT): LINK_FLAGS+=$(LIBDL) + +test_malloc_atexit_dll.$(DLL): CPLUS_FLAGS:=$(subst /MT,/MD,$(M_CPLUS_FLAGS)) +test_malloc_atexit.$(TEST_EXT): CPLUS_FLAGS:=$(subst /MT,/MD,$(M_CPLUS_FLAGS)) +test_malloc_atexit.$(TEST_EXT): LINK_FLAGS+=$(LIBDL) +# on Ubuntu 11.10 linker called with --as-needed, so dependency on libtbbmalloc_proxy +# is not created, and malloc overload via linking with -ltbbmalloc_proxy is not working. +# Overcome with --no-as-needed. +ifeq (linux.gcc,$(tbb_os).$(compiler)) +test_malloc_atexit.$(TEST_EXT): MALLOCPROXY.LIB := -Wl,--no-as-needed $(MALLOCPROXY.LIB) +endif +# The test isn't added to MALLOC_LINK_PROXY_TESTS, because we need both +# tbbmalloc and proxy libs. For platforms other than Android it's enough +# to modify LINK_MALLOC.LIB for TEST_EXT target only. But under Android build +# of DLL and TEST_EXT can be requested independently, so there is no chance +# to set LINK_MALLOC.LIB in TEST_EXT build rule, and affect DLL build. +test_malloc_atexit.$(TEST_EXT): LINK_MALLOC.LIB := $(LINK_MALLOC.LIB) $(LINK_MALLOCPROXY.LIB) +test_malloc_atexit_dll.$(DLL): LINK_MALLOC.LIB := $(LINK_MALLOC.LIB) $(LINK_MALLOCPROXY.LIB) + +test_malloc_whitebox.$(TEST_EXT): $(MALLOC_ASM.OBJ) version_string.ver +test_malloc_whitebox.$(TEST_EXT): INCLUDES+=$(INCLUDE_KEY). +test_malloc_whitebox.$(TEST_EXT): LINK_FILES+=$(MALLOC_ASM.OBJ) + +# Some _dll targets need to restore variables since they are changed by parent +# target-specific rule of its .exe targets +test_malloc_lib_unload_dll.$(DLL): CPLUS_FLAGS=$(ORIG_CPLUS_FLAGS) $(if $(no_exceptions),$(DEFINE_KEY)__TBB_TEST_NO_EXCEPTIONS=1) +test_malloc_lib_unload_dll.$(DLL): INCLUDES=$(ORIG_INCLUDES) $(INCLUDE_TEST_HEADERS) + +test_malloc_used_by_lib_dll.$(DLL): CPLUS_FLAGS:=$(subst /MT,/LD,$(M_CPLUS_FLAGS)) +test_malloc_used_by_lib_dll.$(DLL): LINK_FILES+=$(ORIG_LINK_MALLOC.LIB) +test_malloc_used_by_lib_dll.$(DLL): LIBDL= + +# The test needs both tbb and tbbmalloc. +# For static build LINK_TBB.LIB is resolved in tbb.a static lib name (Linux), which cannot be found (dynamic tbb is used only). +# In order to link properly, have to define LINK_TBB.LIB ourselves except for Windows where linkage with *.lib file expected. +ifdef extra_inc +ifneq ($(tbb_os),windows) +DYNAMIC_TBB_LIB=$(LIBPREF)tbb$(CPF_SUFFIX)$(DEBUG_SUFFIX).$(DLL) +endif +endif +test_malloc_shutdown_hang.$(TEST_EXT): LINK_FILES += $(if $(DYNAMIC_TBB_LIB), $(DYNAMIC_TBB_LIB), $(LINK_TBB.LIB)) + +# ----------------------------------------------------- + +# ---- The list of TBBMalloc test running commands ---- +# run_cmd is usually empty +malloc_test: $(MALLOC.DLL) malloc_test_no_depends + +malloc_test_no_depends: $(TEST_PREREQUISITE) $(MALLOC_TESTS) + $(run_cmd) ./test_malloc_pools.$(TEST_EXT) $(args) 1:4 +ifneq (,$(MALLOCPROXY.DLL)) + $(run_cmd) ./test_malloc_atexit.$(TEST_EXT) $(args) + $(run_cmd) $(TEST_LAUNCHER) -l $(MALLOCPROXY.DLL) ./test_malloc_overload.$(TEST_EXT) $(args) + $(run_cmd) $(TEST_LAUNCHER) ./test_malloc_overload_proxy.$(TEST_EXT) $(args) + $(run_cmd) ./test_malloc_overload_disable.$(TEST_EXT) $(args) + $(run_cmd) $(TEST_LAUNCHER) ./test_malloc_new_handler.$(TEST_EXT) $(args) +endif + $(run_cmd) $(TEST_LAUNCHER) ./test_malloc_lib_unload.$(TEST_EXT) $(args) + $(run_cmd) $(TEST_LAUNCHER) ./test_malloc_used_by_lib.$(TEST_EXT) + $(run_cmd) ./test_malloc_whitebox.$(TEST_EXT) $(args) 1:4 + $(run_cmd) $(TEST_LAUNCHER) -u ./test_malloc_compliance.$(TEST_EXT) $(args) 1:4 + $(run_cmd) ./test_ScalableAllocator.$(TEST_EXT) $(args) + $(run_cmd) ./test_ScalableAllocator_STL.$(TEST_EXT) $(args) + $(run_cmd) ./test_malloc_regression.$(TEST_EXT) $(args) + $(run_cmd) ./test_malloc_init_shutdown.$(TEST_EXT) $(args) + $(run_cmd) ./test_malloc_pure_c.$(TEST_EXT) $(args) + $(run_cmd) ./test_malloc_shutdown_hang.$(TEST_EXT) +# ----------------------------------------------------- + +#------------------------------------------------------ +# End of rules for making the TBBMalloc unit tests +#------------------------------------------------------ + +# Include automatically generated dependencies +-include *.d diff --git a/xdl/third_party/tbb/build/Makefile.tbbproxy b/xdl/third_party/tbb/build/Makefile.tbbproxy new file mode 100644 index 00000000..eae6c9f3 --- /dev/null +++ b/xdl/third_party/tbb/build/Makefile.tbbproxy @@ -0,0 +1,109 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +# default target +default_tbbproxy: tbbproxy tbbproxy_test + +tbb_root ?= $(TBBROOT) +BUILDING_PHASE=1 +include $(tbb_root)/build/common.inc +DEBUG_SUFFIX=$(findstring _debug,_$(cfg)) + +PROXY_ROOT ?= $(tbb_root)/src/tbbproxy +PROXY_SOURCE_ROOT ?= $(PROXY_ROOT) + +VPATH = $(tbb_root)/src/tbb/$(ASSEMBLY_SOURCE) $(tbb_root)/src/tbb $(tbb_root)/src/test +VPATH += $(PROXY_ROOT) $(PROXY_SOURCE_ROOT) + +CPLUS_FLAGS += $(DEFINE_KEY)__TBB_DLL_NAME=$(TBB.DLL) +CPLUS_FLAGS += $(DEFINE_KEY)__TBB_LST=$(TBB.LST) +CPLUS_FLAGS += $(foreach dir,$(VPATH),$(INCLUDE_KEY)$(dir)) +CPLUS_FLAGS += $(PIC_KEY) $(DSE_KEY) + +include $(tbb_root)/build/common_rules.inc + +#------------------------------------------------------ +# Define rules for making the TBB Proxy static library. +#------------------------------------------------------ + +# Object files that make up TBB Proxy +PROXY_CPLUS.OBJ = tbbproxy.$(OBJ) +PROXY_ASM.OBJ = tbbproxy-asm.$(OBJ) +PROXY.OBJ := $(PROXY_CPLUS.OBJ) $(PROXY_ASM.OBJ) + +# Not using intrinsics prevents undesired dependence on ICL libraries (e.g. libirc). +# Not using default libs prevents link issues caused by different CRT versions in tbbproxy and in an app. +$(PROXY.OBJ): CPLUS_FLAGS += $(DEFINE_KEY)ARCH_$(arch) $(DEFINE_KEY)OS_$(tbb_os) $(NOINTRINSIC_KEY) $(NODEFAULTLIB_KEY) + +$(PROXY_CPLUS.OBJ): CPLUS_FLAGS+=$(if $(filter windows.%cl,$(tbb_os).$(compiler)),/Fdtbbproxy$(DEBUG_SUFFIX).pdb) +$(PROXY_CPLUS.OBJ): %.$(OBJ): %.cpp + $(CPLUS) $(COMPILE_ONLY) $(CPLUS_FLAGS) $(INCLUDES) $< + +$(PROXY.LIB): $(PROXY.OBJ) + $(AR) $(AR_FLAGS) $(AR_OUTPUT_KEY)$@ $^ + +.PRECIOUS : %.$(ASMEXT) +tbbproxy-asm.$(ASMEXT) : tbbproxy-$(tbb_os).$(ASMEXT) $(TBB.LST) $(TBB-OBJECTS.LST) + $(CPLUS) $(PREPROC_ONLY) $< $(INCLUDES) $(CPLUS_FLAGS) $(DEFINE_KEY)__TBB_BUILD=1 > $@ + +.PHONY: tbbproxy +ifeq (windows,$(tbb_os)) +tbbproxy: $(PROXY.LIB) +else +tbbproxy: +endif + +#------------------------------------------------------ +# End of rules for making the TBB Proxy static library +#------------------------------------------------------ + +#------------------------------------------------------ +# Define rules for making the TBB Proxy unit tests +#------------------------------------------------------ + +add_debug=$(basename $(1))_debug$(suffix $(1)) +cross_suffix=$(if $(crosstest),$(if $(DEBUG_SUFFIX),$(subst _debug,,$(1)),$(call add_debug,$(1))),$(1)) + +PROXY_LIB = $(call cross_suffix,$(PROXY.LIB)) +PROXY_TESTS_SRCS = test_runtime_loader.cpp +PROXY_TESTS_OBJS = $(PROXY_TESTS_SRCS:.cpp=.$(OBJ)) +PROXY_TESTS_EXES = $(PROXY_TESTS_OBJS:.$(OBJ)=.$(TEST_EXT)) + +# Run rules. +.PHONY: tbbproxy_test +ifeq (windows,$(tbb_os)) +tbbproxy_test: $(call cross_suffix,$(PROXY.LIB)) $(TEST_PREREQUISITE) $(PROXY_TESTS_EXES) + $(run_cmd) ./test_runtime_loader.$(TEST_EXT) $(args) +else +tbbproxy_test: +endif + +# Link rules. +$(PROXY_TESTS_EXES): %.$(TEST_EXT): %.$(OBJ) $(PROXY_LIB) + $(CPLUS) $(OUTPUT_KEY)$@ $(CPLUS_FLAGS) $< $(PROXY_LIB) $(LIBS) $(LIBDL) $(LINK_FLAGS) + +# Compilation rules. +$(PROXY_TESTS_OBJS): %.$(OBJ): %.cpp + $(CPLUS) $(COMPILE_ONLY) $(CPLUS_FLAGS) $(CXX_ONLY_FLAGS) $(CXX_WARN_SUPPRESS) $(INCLUDES) $(OUTPUT_KEY)$@ $< + +#------------------------------------------------------ +# End of rules for making the TBB Proxy unit tests +#------------------------------------------------------ + +# Include automatically generated dependencies +-include *.d diff --git a/xdl/third_party/tbb/build/Makefile.test b/xdl/third_party/tbb/build/Makefile.test new file mode 100644 index 00000000..8e38d368 --- /dev/null +++ b/xdl/third_party/tbb/build/Makefile.test @@ -0,0 +1,318 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +#------------------------------------------------------------------------------ +# Define rules for making the TBB tests. +#------------------------------------------------------------------------------ +.PHONY: default test_tbb_plain test_tbb_openmp test_tbb_cilk test_tbb_old clean + +default: test_tbb_plain test_tbb_openmp test_tbb_cilk test_tbb_old + +tbb_root ?= $(TBBROOT) +BUILDING_PHASE=1 +TEST_RESOURCE = $(TBB.RES) +TESTFILE=test +include $(tbb_root)/build/common.inc +DEBUG_SUFFIX=$(findstring _debug,$(call cross_cfg,_$(cfg))) + +#------------------------------------------------------------ +# Define static pattern rules dealing with .cpp source files +#------------------------------------------------------------ + +VPATH = $(tbb_root)/src/tbb/$(ASSEMBLY_SOURCE) $(tbb_root)/src/tbb $(tbb_root)/src/rml/client $(tbb_root)/src/old $(tbb_root)/src/test $(tbb_root)/src/perf +CPLUS_FLAGS += $(if $(crosstest),$(DEFINE_KEY)__TBB_NO_IMPLICIT_LINKAGE=1) \ + $(if $(no_exceptions),$(DEFINE_KEY)__TBB_TEST_NO_EXCEPTIONS=1) \ + $(if $(LINK_TBB.LIB),$(DEFINE_KEY)TEST_USES_TBB=1) + +TEST_PREREQUISITE+=$(TBB.LIB) +LINK_FILES+=$(LINK_TBB.LIB) + +ifdef use_proxy + USE_PROXY_FLAG = $(DEFINE_KEY)HARNESS_USE_RUNTIME_LOADER + CPLUS_FLAGS += $(USE_PROXY_FLAG) + LINK_TBB.LIB = $(PROXY.LIB) + LIBS += $(LIBDL) +endif + +TEST_SUFFIXES=secondary compiler_builtins pic +include $(tbb_root)/build/common_rules.inc + +# Rules for the tests, which use TBB in a dynamically loadable library +test_model_plugin.$(TEST_EXT): LINK_TBB.LIB = +test_model_plugin.$(TEST_EXT): CPLUS_FLAGS := $(CPLUS_FLAGS:$(USE_PROXY_FLAG)=) +test_model_plugin.$(TEST_EXT): LIBS += $(LIBDL) +ifneq (,$(DYLIB_KEY)) +test_model_plugin.$(TEST_EXT): test_model_plugin_dll.$(DLL) +endif + +# tbb_misc.$(OBJ) has to be specified here (instead of harness_inject_scheduler.h) because it carries dependency on version_string.ver +SCHEDULER_DEPENDENCIES = $(TBB_ASM.OBJ) tbb_misc.$(OBJ) + +# These executables don't depend on the TBB library, but include core .cpp files directly +SCHEDULER_DIRECTLY_INCLUDED = test_task_leaks.$(TEST_EXT) \ + test_task_assertions.$(TEST_EXT) \ + test_fast_random.$(TEST_EXT) \ + test_global_control_whitebox.$(TEST_EXT) \ + test_concurrent_queue_whitebox.$(TEST_EXT) + +# Necessary to locate version_string.ver referenced from directly included tbb_misc.cpp +INCLUDES += $(INCLUDE_KEY). $(INCLUDE_TEST_HEADERS) + +$(SCHEDULER_DIRECTLY_INCLUDED): CPLUS_FLAGS += $(DSE_KEY) +$(SCHEDULER_DIRECTLY_INCLUDED): WARNING_KEY += $(WARNING_SUPPRESS) +$(SCHEDULER_DIRECTLY_INCLUDED): LIBS += $(LIBDL) +#tbb.lib must not be linked to scheduler white box tests in order to not violate ODR +$(SCHEDULER_DIRECTLY_INCLUDED): LINK_TBB.LIB = +$(SCHEDULER_DIRECTLY_INCLUDED): LINK_FILES += $(SCHEDULER_DEPENDENCIES) +$(SCHEDULER_DIRECTLY_INCLUDED): $(SCHEDULER_DEPENDENCIES) + +# test_tbb_header detects "multiple definition" linker error using the test that covers the whole library +TWICE_LINKED_TESTS = test_tbb_header.$(TEST_EXT) \ + test_concurrent_unordered_set.$(TEST_EXT) + +%_secondary.$(OBJ): CPLUS_FLAGS+=$(DEFINE_KEY)__TBB_TEST_SECONDARY=1 + +# Detecting "multiple definition" linker error using the test that covers the whole library +$(TWICE_LINKED_TESTS): %.$(TEST_EXT): %.$(OBJ) %_secondary.$(OBJ) +$(TWICE_LINKED_TESTS): LINK_FILES+=$(@:.$(TEST_EXT)=_secondary.$(OBJ)) + +# Checks that TBB works correctly in position independent code +%_pic.$(OBJ): CPLUS_FLAGS+=$(PIC_KEY) +%_pic.$(OBJ): CPLUS_FLAGS+=$(DEFINE_KEY)__TBB_TEST_PIC=1 + +# Test of generic gcc port and icc intrinsics port +%_compiler_builtins.$(TEST_EXT): LINK_TBB.LIB = +%_compiler_builtins.$(OBJ): CPLUS_FLAGS+=$(DEFINE_KEY)__TBB_TEST_BUILTINS=1 $(DEFINE_KEY)TBB_USE_ASSERT=0 + +# dynamic_link tests don't depend on the TBB library +test_dynamic_link%.$(TEST_EXT): LINK_TBB.LIB = +test_dynamic_link.$(TEST_EXT): LIBS += $(LIBDL) + +# Resolving issue with the number of sections that an object file can contain +ifneq (,$(BIGOBJ_KEY)) +TEST_BIGOBJ = test_opencl_node.$(TEST_EXT) \ + test_atomic.$(TEST_EXT) \ + test_concurrent_unordered_set.$(TEST_EXT) \ + test_concurrent_unordered_map.$(TEST_EXT) \ + test_join_node_key_matching.$(TEST_EXT) \ + test_join_node_msg_key_matching.$(TEST_EXT) \ + test_join_node.$(TEST_EXT) +$(TEST_BIGOBJ): override CXXFLAGS += $(BIGOBJ_KEY) +endif + +# TODO: remove repetition of .$(TEST_EXT) in the list bellow +# The main list of TBB tests +TEST_TBB_PLAIN.EXE = test_assembly.$(TEST_EXT) \ + test_global_control.$(TEST_EXT) \ + test_tbb_fork.$(TEST_EXT) \ + test_assembly_compiler_builtins.$(TEST_EXT) \ + test_aligned_space.$(TEST_EXT) \ + test_atomic.$(TEST_EXT) \ + test_atomic_pic.$(TEST_EXT) \ + test_atomic_compiler_builtins.$(TEST_EXT) \ + test_blocked_range.$(TEST_EXT) \ + test_blocked_range2d.$(TEST_EXT) \ + test_blocked_range3d.$(TEST_EXT) \ + test_blocked_rangeNd.$(TEST_EXT) \ + test_concurrent_queue.$(TEST_EXT) \ + test_concurrent_vector.$(TEST_EXT) \ + test_concurrent_unordered_set.$(TEST_EXT) \ + test_concurrent_unordered_map.$(TEST_EXT) \ + test_concurrent_hash_map.$(TEST_EXT) \ + test_enumerable_thread_specific.$(TEST_EXT) \ + test_handle_perror.$(TEST_EXT) \ + test_halt.$(TEST_EXT) \ + test_model_plugin.$(TEST_EXT) \ + test_mutex.$(TEST_EXT) \ + test_mutex_native_threads.$(TEST_EXT) \ + test_rwm_upgrade_downgrade.$(TEST_EXT) \ + test_cache_aligned_allocator.$(TEST_EXT) \ + test_cache_aligned_allocator_STL.$(TEST_EXT) \ + test_parallel_for.$(TEST_EXT) \ + test_parallel_reduce.$(TEST_EXT) \ + test_parallel_sort.$(TEST_EXT) \ + test_parallel_scan.$(TEST_EXT) \ + test_parallel_while.$(TEST_EXT) \ + test_parallel_do.$(TEST_EXT) \ + test_pipeline.$(TEST_EXT) \ + test_pipeline_with_tbf.$(TEST_EXT) \ + test_parallel_pipeline.$(TEST_EXT) \ + test_lambda.$(TEST_EXT) \ + test_task_scheduler_init.$(TEST_EXT) \ + test_task_scheduler_observer.$(TEST_EXT) \ + test_task.$(TEST_EXT) \ + test_tbb_thread.$(TEST_EXT) \ + test_std_thread.$(TEST_EXT) \ + test_tick_count.$(TEST_EXT) \ + test_inits_loop.$(TEST_EXT) \ + test_yield.$(TEST_EXT) \ + test_eh_tasks.$(TEST_EXT) \ + test_eh_algorithms.$(TEST_EXT) \ + test_eh_flow_graph.$(TEST_EXT) \ + test_parallel_invoke.$(TEST_EXT) \ + test_task_group.$(TEST_EXT) \ + test_ittnotify.$(TEST_EXT) \ + test_parallel_for_each.$(TEST_EXT) \ + test_tbb_header.$(TEST_EXT) \ + test_combinable.$(TEST_EXT) \ + test_task_auto_init.$(TEST_EXT) \ + test_task_arena.$(TEST_EXT) \ + test_concurrent_monitor.$(TEST_EXT) \ + test_semaphore.$(TEST_EXT) \ + test_critical_section.$(TEST_EXT) \ + test_reader_writer_lock.$(TEST_EXT) \ + test_tbb_condition_variable.$(TEST_EXT) \ + test_intrusive_list.$(TEST_EXT) \ + test_concurrent_priority_queue.$(TEST_EXT) \ + test_task_priority.$(TEST_EXT) \ + test_task_enqueue.$(TEST_EXT) \ + test_task_steal_limit.$(TEST_EXT) \ + test_hw_concurrency.$(TEST_EXT) \ + test_fp.$(TEST_EXT) \ + test_tuple.$(TEST_EXT) \ + test_flow_graph.$(TEST_EXT) \ + test_broadcast_node.$(TEST_EXT) \ + test_continue_node.$(TEST_EXT) \ + test_function_node.$(TEST_EXT) \ + test_limiter_node.$(TEST_EXT) \ + test_join_node.$(TEST_EXT) \ + test_join_node_key_matching.$(TEST_EXT) \ + test_join_node_msg_key_matching.$(TEST_EXT) \ + test_buffer_node.$(TEST_EXT) \ + test_queue_node.$(TEST_EXT) \ + test_priority_queue_node.$(TEST_EXT) \ + test_sequencer_node.$(TEST_EXT) \ + test_source_node.$(TEST_EXT) \ + test_overwrite_node.$(TEST_EXT) \ + test_write_once_node.$(TEST_EXT) \ + test_indexer_node.$(TEST_EXT) \ + test_multifunction_node.$(TEST_EXT) \ + test_split_node.$(TEST_EXT) \ + test_static_assert.$(TEST_EXT) \ + test_aggregator.$(TEST_EXT) \ + test_concurrent_lru_cache.$(TEST_EXT) \ + test_examples_common_utility.$(TEST_EXT) \ + test_dynamic_link.$(TEST_EXT) \ + test_parallel_for_vectorization.$(TEST_EXT) \ + test_tagged_msg.$(TEST_EXT) \ + test_partitioner_whitebox.$(TEST_EXT) \ + test_flow_graph_whitebox.$(TEST_EXT) \ + test_composite_node.$(TEST_EXT) \ + test_async_node.$(TEST_EXT) \ + test_async_msg.$(TEST_EXT) \ + test_tbb_version.$(TEST_EXT) # insert new files right above + +# These tests depend on other technologies +TEST_TBB_SPECIAL.EXE = test_openmp.$(TEST_EXT) \ + test_cilk_interop.$(TEST_EXT) \ + test_gfx_factory.$(TEST_EXT) \ + test_opencl_node.$(TEST_EXT) + +# skip mode_plugin for now +skip_tests += test_model_plugin + +ifdef OPENMP_FLAG +test_openmp.$(TEST_EXT): CPLUS_FLAGS += $(OPENMP_FLAG) + +test_tbb_openmp: $(TEST_PREREQUISITE) test_openmp.$(TEST_EXT) + $(run_cmd) ./test_openmp.$(TEST_EXT) 1:4 +else +test_tbb_openmp: + @echo "OpenMP is not available" +endif + +ifdef CILK_AVAILABLE +# Workaround on cilkrts linkage known issue (see Intel(R) C++ Composer XE 2011 Release Notes) +# The issue reveals itself if a version of binutils is prior to 2.17 +ifeq (linux_icc,$(tbb_os)_$(compiler)) +test_cilk_interop.$(TEST_EXT): LIBS += -lcilkrts +test_gfx_factory.$(TEST_EXT): LIBS += -lcilkrts +endif +test_tbb_cilk: test_cilk_interop.$(TEST_EXT) + $(run_cmd) ./test_cilk_interop.$(TEST_EXT) $(args) +else +test_tbb_cilk: + @echo "Intel(R) Cilk(TM) Plus is not available" +endif + +test_opencl_node.$(TEST_EXT): LIBS += $(OPENCL.LIB) + +$(TEST_TBB_PLAIN.EXE) $(TEST_TBB_SPECIAL.EXE): WARNING_KEY += $(TEST_WARNING_KEY) + +# Run tests that are in SCHEDULER_DIRECTLY_INCLUDED and TEST_TBB_PLAIN.EXE but not in skip_tests (which is specified by user) +TESTS_TO_RUN := $(filter-out $(addsuffix .$(TEST_EXT),$(skip_tests)),$(TEST_TBB_PLAIN.EXE) $(SCHEDULER_DIRECTLY_INCLUDED)) + +# This definition intentionally consists of two blank lines +define eol + + +endef + +# First build the targets, then run them +# Form a list of commands separated with end of line +# Note that usually run_cmd is empty, and tests run directly + +test_tbb_plain: $(TEST_PREREQUISITE) $(TESTS_TO_RUN) + $(foreach test, $(TESTS_TO_RUN), $(run_cmd) ./$(test) $(args) $(eol)) + + +# For deprecated files, we don't mind warnings etc., thus compilation rules are most relaxed +CPLUS_FLAGS_DEPRECATED = $(DEFINE_KEY)__TBB_TEST_DEPRECATED=1 $(subst $(WARNING_KEY),,$(CPLUS_FLAGS)) $(WARNING_SUPPRESS) $(INCLUDE_KEY)$(tbb_root)/src/test +TEST_TBB_OLD.OBJ = test_concurrent_vector_v2.$(OBJ) test_concurrent_queue_v2.$(OBJ) test_mutex_v2.$(OBJ) test_task_scheduler_observer_v3.$(OBJ) + +$(TEST_TBB_OLD.OBJ): CPLUS_FLAGS := $(CPLUS_FLAGS_DEPRECATED) + +TEST_TBB_OLD.EXE = $(subst .$(OBJ),.$(TEST_EXT),$(TEST_TBB_OLD.OBJ)) + +ifeq (,$(NO_LEGACY_TESTS)) +test_tbb_old: $(TEST_PREREQUISITE) $(TEST_TBB_OLD.EXE) + $(run_cmd) ./test_concurrent_vector_v2.$(TEST_EXT) $(args) 1:4 + $(run_cmd) ./test_concurrent_queue_v2.$(TEST_EXT) $(args) 1:4 + $(run_cmd) ./test_mutex_v2.$(TEST_EXT) $(args) 1 + $(run_cmd) ./test_mutex_v2.$(TEST_EXT) $(args) 2 + $(run_cmd) ./test_mutex_v2.$(TEST_EXT) $(args) 4 + $(run_cmd) ./test_task_scheduler_observer_v3.$(TEST_EXT) $(args) 1:4 +else +test_tbb_old: + @echo Legacy tests skipped +endif + +ifneq (,$(codecov)) +codecov_gen: + profmerge + codecov $(if $(findstring -,$(codecov)),$(codecov),) -demang -comp $(tbb_root)/build/codecov.txt +endif + +time_%: time_%.$(TEST_EXT) $(TEST_PREREQUISITE) + $(run_cmd) ./$< $(args) + + +# for some reason, "perf_%.$(TEST_EXT): perf_dll.$(DLL)" does not work TODO: find out how to apply pattern here +perf_sched.$(TEST_EXT): perf_dll.$(DLL) +perf_%.$(TEST_EXT): TEST_LIBS = perf_dll.$(LIBEXT) +perf_%: perf_%.$(TEST_EXT) $(TEST_PREREQUISITE) + $(run_cmd) ./$< $(args) + +clean_%: + $(RM) $*.$(OBJ) $*.exe $*.$(DLL) $*.$(LIBEXT) $*.res $*.map $*.ilk $*.pdb $*.exp $*.*manifest $*.tmp $*.d *.ver + +clean: + $(RM) *.$(OBJ) *.exe *.$(DLL) *.$(LIBEXT) *.res *.map *.ilk *.pdb *.exp *.manifest *.tmp *.d pgopti.* *.dyn core core.*[0-9][0-9] *.ver + +# Include automatically generated dependencies +-include *.d diff --git a/xdl/third_party/tbb/build/OpenBSD.clang.inc b/xdl/third_party/tbb/build/OpenBSD.clang.inc new file mode 100644 index 00000000..8d7bf854 --- /dev/null +++ b/xdl/third_party/tbb/build/OpenBSD.clang.inc @@ -0,0 +1,19 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +include $(tbb_root)/build/BSD.clang.inc diff --git a/xdl/third_party/tbb/build/OpenBSD.inc b/xdl/third_party/tbb/build/OpenBSD.inc new file mode 100644 index 00000000..91bebc96 --- /dev/null +++ b/xdl/third_party/tbb/build/OpenBSD.inc @@ -0,0 +1,19 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +include $(tbb_root)/build/BSD.inc diff --git a/xdl/third_party/tbb/build/SunOS.gcc.inc b/xdl/third_party/tbb/build/SunOS.gcc.inc new file mode 100644 index 00000000..1e8dcf4f --- /dev/null +++ b/xdl/third_party/tbb/build/SunOS.gcc.inc @@ -0,0 +1,92 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +COMPILE_ONLY = -c -MMD +PREPROC_ONLY = -E -x c++ +INCLUDE_KEY = -I +DEFINE_KEY = -D +OUTPUT_KEY = -o # +OUTPUTOBJ_KEY = -o # +PIC_KEY = -fPIC +WARNING_AS_ERROR_KEY = -Werror +WARNING_KEY = -Wall +TEST_WARNING_KEY = -Wshadow -Wcast-qual -Woverloaded-virtual -Wnon-virtual-dtor -Wextra +WARNING_SUPPRESS = -Wno-parentheses -Wno-non-virtual-dtor +DYLIB_KEY = -shared +LIBDL = -ldl + +CPLUS = g++ +CONLY = gcc +LIB_LINK_FLAGS = -shared +LIBS = -lpthread -lrt -ldl +C_FLAGS = $(CPLUS_FLAGS) -x c + +ifeq ($(cfg), release) + CPLUS_FLAGS = -g -O2 -DUSE_PTHREAD +endif +ifeq ($(cfg), debug) + CPLUS_FLAGS = -DTBB_USE_DEBUG -g -O0 -DUSE_PTHREAD +endif + +ASM= +ASM_FLAGS= + +TBB_ASM.OBJ= + +ifeq (ia64,$(arch)) +# Position-independent code (PIC) is a must for IA-64 + CPLUS_FLAGS += $(PIC_KEY) +endif + +ifeq (intel64,$(arch)) + CPLUS_FLAGS += -m64 + LIB_LINK_FLAGS += -m64 +endif + +ifeq (ia32,$(arch)) + CPLUS_FLAGS += -m32 + LIB_LINK_FLAGS += -m32 +endif + +# for some gcc versions on Solaris, -m64 may imply V9, but perhaps not everywhere (TODO: verify) +ifeq (sparc,$(arch)) + CPLUS_FLAGS += -mcpu=v9 -m64 + LIB_LINK_FLAGS += -mcpu=v9 -m64 +endif + +#------------------------------------------------------------------------------ +# Setting assembler data. +#------------------------------------------------------------------------------ +ASSEMBLY_SOURCE=$(arch)-gas +ifeq (ia64,$(arch)) + ASM=ias + TBB_ASM.OBJ = atomic_support.o lock_byte.o log2.o pause.o +endif +#------------------------------------------------------------------------------ +# End of setting assembler data. +#------------------------------------------------------------------------------ + +#------------------------------------------------------------------------------ +# Setting tbbmalloc data. +#------------------------------------------------------------------------------ + +M_CPLUS_FLAGS = $(CPLUS_FLAGS) -fno-rtti -fno-exceptions + +#------------------------------------------------------------------------------ +# End of setting tbbmalloc data. +#------------------------------------------------------------------------------ diff --git a/xdl/third_party/tbb/build/SunOS.inc b/xdl/third_party/tbb/build/SunOS.inc new file mode 100644 index 00000000..95b17353 --- /dev/null +++ b/xdl/third_party/tbb/build/SunOS.inc @@ -0,0 +1,83 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +ifndef arch + arch:=$(shell uname -p) + ifeq ($(arch),i386) + ifeq ($(shell isainfo -b),64) + arch:=intel64 + else + arch:=ia32 + endif + endif + export arch +# For non-IA systems running Sun OS, 'arch' will contain whatever is printed by uname -p. +# In particular, for SPARC architecture it will contain "sparc". +endif + +ifndef runtime + gcc_version:=$(shell gcc -dumpversion) + os_version:=$(shell uname -r) + os_kernel_version:=$(shell uname -r | sed -e 's/-.*$$//') + export runtime:=cc$(gcc_version)_kernel$(os_kernel_version) +endif + +ifeq ($(arch),sparc) + native_compiler := gcc + export compiler ?= gcc +else + native_compiler := suncc + export compiler ?= suncc +endif +# debugger ?= gdb + +CMD=$(SHELL) -c +CWD=$(shell pwd) +RM?=rm -f +RD?=rmdir +MD?=mkdir -p +NUL= /dev/null +SLASH=/ +MAKE_VERSIONS=bash $(tbb_root)/build/version_info_sunos.sh $(VERSION_FLAGS) >version_string.ver +MAKE_TBBVARS=bash $(tbb_root)/build/generate_tbbvars.sh + +ifdef LD_LIBRARY_PATH + export LD_LIBRARY_PATH := .:$(LD_LIBRARY_PATH) +else + export LD_LIBRARY_PATH := . +endif + +####### Build settings ######################################################## + +OBJ = o +DLL = so +LIBEXT=so + +TBB.LST = +TBB.DEF = +TBB.DLL = libtbb$(CPF_SUFFIX)$(DEBUG_SUFFIX).$(DLL) +TBB.LIB = $(TBB.DLL) +LINK_TBB.LIB = $(TBB.LIB) + +MALLOC.DLL = libtbbmalloc$(DEBUG_SUFFIX).$(DLL) +MALLOC.LIB = $(MALLOC.DLL) +LINK_MALLOC.LIB = $(MALLOC.LIB) + +MALLOCPROXY.DLL = libtbbmalloc_proxy$(DEBUG_SUFFIX).$(DLL) + +TEST_LAUNCHER=sh $(tbb_root)/build/test_launcher.sh $(largs) diff --git a/xdl/third_party/tbb/build/SunOS.suncc.inc b/xdl/third_party/tbb/build/SunOS.suncc.inc new file mode 100644 index 00000000..b1fda770 --- /dev/null +++ b/xdl/third_party/tbb/build/SunOS.suncc.inc @@ -0,0 +1,92 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +COMPILE_ONLY = -c -xMMD -errtags +PREPROC_ONLY = -E -xMMD +INCLUDE_KEY = -I +DEFINE_KEY = -D +OUTPUT_KEY = -o # +OUTPUTOBJ_KEY = -o # +PIC_KEY = -KPIC +DYLIB_KEY = -G +LIBDL = -ldl +# WARNING_AS_ERROR_KEY = -errwarn=%all +WARNING_AS_ERROR_KEY = Warning as error +# Supported Solaris Studio* 12.2 and above, remove ',inlasmpnu' in the line below to build by compiler prior Solaris Studio* 12.2 +WARNING_SUPPRESS = -erroff=unassigned,attrskipunsup,badargtype2w,badbinaryopw,wbadasg,wvarhidemem,inlasmpnu +tbb_strict=0 + +CPLUS = CC +CONLY = cc + +OPENMP_FLAG = -xopenmp +LIB_LINK_FLAGS = -G -R . -M$(tbb_root)/build/suncc.map.pause +LINK_FLAGS += -M$(tbb_root)/build/suncc.map.pause +LIBS = -lpthread -lrt -R . +C_FLAGS = $(CPLUS_FLAGS) + +#TODO: the $(stdlib) instead of hard-wiring STLPort +ifeq ($(cfg), release) + CPLUS_FLAGS = -mt -xO2 -g -library=stlport4 -DUSE_PTHREAD $(WARNING_SUPPRESS) +endif +ifeq ($(cfg), debug) + CPLUS_FLAGS = -mt -DTBB_USE_DEBUG -g -library=stlport4 -DUSE_PTHREAD $(WARNING_SUPPRESS) +endif + +ASM= +ASM_FLAGS= + +TBB_ASM.OBJ= + +ifeq (intel64,$(arch)) + CPLUS_FLAGS += -m64 + ASM_FLAGS += -m64 + LIB_LINK_FLAGS += -m64 +endif + +ifeq (ia32,$(arch)) + CPLUS_FLAGS += -m32 + LIB_LINK_FLAGS += -m32 +endif + +# TODO: verify whether -m64 implies V9 on relevant Sun Studio versions +# (those that handle gcc assembler syntax) +ifeq (sparc,$(arch)) + CPLUS_FLAGS += -m64 + LIB_LINK_FLAGS += -m64 +endif + +export TBB_CUSTOM_VARS_SH=export CXXFLAGS="-I$${TBBROOT}/include -library=stlport4 $(CXXFLAGS) -M$${TBBROOT}/build/suncc.map.pause" +export TBB_CUSTOM_VARS_CSH=setenv CXXFLAGS "-I$${TBBROOT}/include -library=stlport4 $(CXXFLAGS) -M$${TBBROOT}/build/suncc.map.pause" + +#------------------------------------------------------------------------------ +# Setting assembler data. +#------------------------------------------------------------------------------ +ASSEMBLY_SOURCE=$(arch)-fbe +#------------------------------------------------------------------------------ +# End of setting assembler data. +#------------------------------------------------------------------------------ + +#------------------------------------------------------------------------------ +# Setting tbbmalloc data. +#------------------------------------------------------------------------------ +M_INCLUDES = $(INCLUDES) -I$(MALLOC_ROOT) -I$(MALLOC_SOURCE_ROOT) +M_CPLUS_FLAGS = $(CPLUS_FLAGS) +#------------------------------------------------------------------------------ +# End of setting tbbmalloc data. +#------------------------------------------------------------------------------ diff --git a/xdl/third_party/tbb/build/android.clang.inc b/xdl/third_party/tbb/build/android.clang.inc new file mode 100644 index 00000000..4f9ef31d --- /dev/null +++ b/xdl/third_party/tbb/build/android.clang.inc @@ -0,0 +1,130 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + + +COMPILE_ONLY = -c -MMD +PREPROC_ONLY = -E -x c++ +INCLUDE_KEY = -I +DEFINE_KEY = -D +OUTPUT_KEY = -o # +OUTPUTOBJ_KEY = -o # +PIC_KEY = -fPIC +WARNING_AS_ERROR_KEY = -Werror +WARNING_KEY = -Wall +SDL_FLAGS = -fPIE -fPIC -fstack-protector -Wformat -Wformat-security +TEST_WARNING_KEY = -Wshadow -Wcast-qual -Woverloaded-virtual -Wnon-virtual-dtor -Wextra + +WARNING_SUPPRESS = -Wno-parentheses -Wno-non-virtual-dtor +DYLIB_KEY = -shared +EXPORT_KEY = -Wl,--version-script, +LIBDL = -ldl + +CPLUS = $(TARGET_CXX) +CONLY = $(TARGET_CC) + +# -soname is necessary for proper linkage to TBB prebuilt libraries when building application with Android SDK +LIB_LINK_FLAGS = $(DYLIB_KEY) -Wl,-soname=$(BUILDING_LIBRARY) -z relro -z now + +# pie is necessary for test executables to work and might be removed if newer NDK will add it implicitly +PIE_FLAG = -pie +ifeq ($(APP_PIE), false) + PIE_FLAG= +endif + +LINK_FLAGS = -Wl,-rpath-link=. -rdynamic +C_FLAGS = $(CPLUS_FLAGS) + +ifeq ($(cfg), release) + SDL_FLAGS += -D_FORTIFY_SOURCE=2 + CPLUS_FLAGS = -O2 +endif +ifeq ($(cfg), debug) + CPLUS_FLAGS = -g -O0 $(DEFINE_KEY)TBB_USE_DEBUG +endif + +CPLUS_FLAGS += $(DEFINE_KEY)USE_PTHREAD $(DEFINE_KEY)_GLIBCXX_HAVE_FENV_H + +ifneq (,$(findstring $(arch),ia32 intel64)) + CPLUS_FLAGS += $(DEFINE_KEY)DO_ITT_NOTIFY +endif + +ifeq (0, $(dynamic_load)) + CPLUS_FLAGS += $(DEFINE_KEY)__TBB_DYNAMIC_LOAD_ENABLED=0 +endif + +# Paths to the NDK prebuilt tools and libraries +ifeq (,$(findstring $(ndk_version), $(foreach v, 7 8 9 10 11 12 13 14 15,r$(v) r$(v)b r$(v)c r$(v)d r$(v)e))) + # Since Android* NDK r16 another sysroot and isystem paths have to be specified + CPLUS_FLAGS += --sysroot=$(NDK_ROOT)/sysroot -isystem $(NDK_ROOT)/sysroot/usr/include/$(TRIPLE) + # Android* version flag required since r16 + CPLUS_FLAGS += -D__ANDROID_API__=$(API_LEVEL) +else + CPLUS_FLAGS += --sysroot=$(SYSROOT) +endif + +# Library sysroot flag +LIB_LINK_FLAGS += --sysroot=$(SYSROOT) +# Flag for test executables +LINK_FLAGS += --sysroot=$(SYSROOT) + +LIBS = -L$(CPLUS_LIB_PATH) -lc++_shared +ifeq (,$(findstring $(ndk_version),$(foreach v, 7 8 9 10 11,r$(v) r$(v)b r$(v)c r$(v)d r$(v)e))) + LIBS += -lc++abi + ifeq (arm,$(arch)) + LIBS += -lunwind + endif +endif + +ifeq (arm,$(arch)) + CPLUS_FLAGS += $(DEFINE_KEY)__TBB_64BIT_ATOMICS=0 +endif + +CPLUS_FLAGS += $(TARGET_CFLAGS) +LIB_LINK_FLAGS += $(TARGET_CFLAGS) $(TARGET_LDFLAGS) -L$(CPLUS_LIB_PATH) + +#------------------------------------------------------------------------------ +# Setting assembler data. +#------------------------------------------------------------------------------ +TBB_ASM.OBJ= +MALLOC_ASM.OBJ= + +ASM = $(tbb_tool_prefix)as +ifeq (intel64,$(arch)) + ASM_FLAGS += --64 +endif +ifeq (ia32,$(arch)) + ASM_FLAGS += --32 +endif +ifeq ($(cfg),debug) + ASM_FLAGS += -g +endif + +ASSEMBLY_SOURCE=$(arch)-gas +#------------------------------------------------------------------------------ +# End of setting assembler data. +#------------------------------------------------------------------------------ + +#------------------------------------------------------------------------------ +# Setting tbbmalloc data. +#------------------------------------------------------------------------------ + +M_CPLUS_FLAGS = $(CPLUS_FLAGS) -fno-rtti -fno-exceptions + +#------------------------------------------------------------------------------ +# End of setting tbbmalloc data. +#------------------------------------------------------------------------------ diff --git a/xdl/third_party/tbb/build/android.gcc.inc b/xdl/third_party/tbb/build/android.gcc.inc new file mode 100644 index 00000000..a90d5870 --- /dev/null +++ b/xdl/third_party/tbb/build/android.gcc.inc @@ -0,0 +1,117 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + + +COMPILE_ONLY = -c -MMD +PREPROC_ONLY = -E -x c++ +INCLUDE_KEY = -I +DEFINE_KEY = -D +OUTPUT_KEY = -o # +OUTPUTOBJ_KEY = -o # +PIC_KEY = -fPIC +WARNING_AS_ERROR_KEY = -Werror +WARNING_KEY = -Wall +TEST_WARNING_KEY = -Wshadow -Wcast-qual -Woverloaded-virtual -Wnon-virtual-dtor -Wextra + +WARNING_SUPPRESS = -Wno-parentheses -Wno-non-virtual-dtor +DYLIB_KEY = -shared +EXPORT_KEY = -Wl,--version-script, +LIBDL = -ldl + +CPLUS = $(tbb_tool_prefix)g++ +CONLY = $(tbb_tool_prefix)gcc + +# -soname is necessary for proper linkage to TBB prebuilt libraries when building application with Android SDK +LIB_LINK_FLAGS = $(DYLIB_KEY) -Wl,-soname=$(BUILDING_LIBRARY) + +# pie is necessary for test executables to work and might be removed if newer NDK will add it implicitly +PIE_FLAG = -pie +ifeq ($(APP_PIE), false) + PIE_FLAG= +endif + +LINK_FLAGS = -Wl,-rpath-link=. -rdynamic +C_FLAGS = $(CPLUS_FLAGS) + +ifeq ($(cfg), release) + CPLUS_FLAGS = -O2 +endif +ifeq ($(cfg), debug) + CPLUS_FLAGS = -g -O0 $(DEFINE_KEY)TBB_USE_DEBUG +endif + +CPLUS_FLAGS += $(DEFINE_KEY)USE_PTHREAD $(DEFINE_KEY)_GLIBCXX_HAVE_FENV_H + +ifneq (,$(findstring $(arch),ia32 intel64)) + CPLUS_FLAGS += $(DEFINE_KEY)DO_ITT_NOTIFY +endif + +ifeq (0, $(dynamic_load)) + CPLUS_FLAGS += $(DEFINE_KEY)__TBB_DYNAMIC_LOAD_ENABLED=0 +endif + + +# Paths to the NDK prebuilt tools and libraries +CPLUS_FLAGS += --sysroot=$(SYSROOT) +LIB_LINK_FLAGS += --sysroot=$(SYSROOT) +LIBS = -L$(CPLUS_LIB_PATH) -lgnustl_shared + +ifeq (ia32,$(arch)) + # TODO: Determine best setting of -march and add to CPLUS_FLAGS + CPLUS_FLAGS += -m32 + LIB_LINK_FLAGS += -m32 +else ifeq (intel64,$(arch)) + CPLUS_FLAGS += -m64 + LIB_LINK_FLAGS += -m64 +else ifeq (arm,$(arch)) + CPLUS_FLAGS += -march=armv7-a $(DEFINE_KEY)TBB_USE_GCC_BUILTINS=1 $(DEFINE_KEY)__TBB_64BIT_ATOMICS=0 +else ifeq (arm64,$(arch)) + CPLUS_FLAGS += -march=armv8-a +endif + +#------------------------------------------------------------------------------ +# Setting assembler data. +#------------------------------------------------------------------------------ +TBB_ASM.OBJ= +MALLOC_ASM.OBJ= + +ASM = $(tbb_tool_prefix)as +ifeq (intel64,$(arch)) + ASM_FLAGS += --64 +endif +ifeq (ia32,$(arch)) + ASM_FLAGS += --32 +endif +ifeq ($(cfg),debug) + ASM_FLAGS += -g +endif + +ASSEMBLY_SOURCE=$(arch)-gas +#------------------------------------------------------------------------------ +# End of setting assembler data. +#------------------------------------------------------------------------------ + +#------------------------------------------------------------------------------ +# Setting tbbmalloc data. +#------------------------------------------------------------------------------ + +M_CPLUS_FLAGS = $(CPLUS_FLAGS) -fno-rtti -fno-exceptions + +#------------------------------------------------------------------------------ +# End of setting tbbmalloc data. +#------------------------------------------------------------------------------ diff --git a/xdl/third_party/tbb/build/android.icc.inc b/xdl/third_party/tbb/build/android.icc.inc new file mode 100644 index 00000000..3909b38f --- /dev/null +++ b/xdl/third_party/tbb/build/android.icc.inc @@ -0,0 +1,120 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + + +COMPILE_ONLY = -c -MMD +PREPROC_ONLY = -E -x c++ +INCLUDE_KEY = -I +DEFINE_KEY = -D +OUTPUT_KEY = -o # +OUTPUTOBJ_KEY = -o # +PIC_KEY = -fPIC +WARNING_AS_ERROR_KEY = -Werror +WARNING_KEY = +TEST_WARNING_KEY = -Wshadow -Woverloaded-virtual -Wextra + +WARNING_SUPPRESS = -Wno-parentheses -Wno-non-virtual-dtor +DYLIB_KEY = -shared +EXPORT_KEY = -Wl,--version-script, +LIBDL = -ldl + +CPLUS = icpc +CONLY = icc + +# -soname is necessary for proper linkage to TBB prebuilt libraries when building application with Android SDK +LIB_LINK_FLAGS = $(DYLIB_KEY) -Wl,-soname=$(BUILDING_LIBRARY) + +# pie is necessary for test executables to work and might be removed if newer NDK will add it implicitly +PIE_FLAG = -pie +ifeq ($(APP_PIE), false) + PIE_FLAG= +endif + +LINK_FLAGS = -Wl,-rpath-link=. -rdynamic +C_FLAGS = $(CPLUS_FLAGS) + +ifeq ($(cfg), release) + CPLUS_FLAGS = -O2 +endif +ifeq ($(cfg), debug) + CPLUS_FLAGS = -g -O0 $(DEFINE_KEY)TBB_USE_DEBUG +endif + +CPLUS_FLAGS += $(DEFINE_KEY)USE_PTHREAD $(DEFINE_KEY)_GLIBCXX_HAVE_FENV_H + +ifneq (,$(findstring $(arch),ia32 intel64)) + CPLUS_FLAGS += $(DEFINE_KEY)DO_ITT_NOTIFY +endif + +ifeq (0, $(dynamic_load)) + CPLUS_FLAGS += $(DEFINE_KEY)__TBB_DYNAMIC_LOAD_ENABLED=0 +endif + + +# Paths to the NDK prebuilt tools and libraries +CPLUS_FLAGS += --sysroot=$(SYSROOT) +LIB_LINK_FLAGS += --sysroot=$(SYSROOT) +# the -static-intel flag is to remove the need to copy Intel-specific libs to the device. +LIBS = -L$(CPLUS_LIB_PATH) -lgnustl_shared -static-intel + +ifeq (ia32,$(arch)) + # TODO: Determine best setting of -march and add to CPLUS_FLAGS + CPLUS_FLAGS += -m32 -march=pentium4 -falign-stack=maintain-16-byte + LIB_LINK_FLAGS += -m32 +else + ifeq (intel64,$(arch)) + CPLUS_FLAGS += -m64 + LIB_LINK_FLAGS += -m64 + endif +endif + +ifeq (arm,$(findstring arm,$(arch))) + $(error "Unsupported architecture $(arch) for icc compiler") +endif + +#------------------------------------------------------------------------------ +# Setting assembler data. +#------------------------------------------------------------------------------ +TBB_ASM.OBJ= +MALLOC_ASM.OBJ= + +ASM = $(tbb_tool_prefix)as +ifeq (intel64,$(arch)) + ASM_FLAGS += --64 +endif +ifeq (ia32,$(arch)) + ASM_FLAGS += --32 +endif +ifeq ($(cfg),debug) + ASM_FLAGS += -g +endif + +ASSEMBLY_SOURCE=$(arch)-gas +#------------------------------------------------------------------------------ +# End of setting assembler data. +#------------------------------------------------------------------------------ + +#------------------------------------------------------------------------------ +# Setting tbbmalloc data. +#------------------------------------------------------------------------------ + +M_CPLUS_FLAGS = $(CPLUS_FLAGS) -fno-rtti -fno-exceptions + +#------------------------------------------------------------------------------ +# End of setting tbbmalloc data. +#------------------------------------------------------------------------------ diff --git a/xdl/third_party/tbb/build/android.inc b/xdl/third_party/tbb/build/android.inc new file mode 100644 index 00000000..c0232b03 --- /dev/null +++ b/xdl/third_party/tbb/build/android.inc @@ -0,0 +1,63 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +# +# Extra gmake command-line parameters for use with Android: +# +# dlopen_workaround: Some OS versions need workaround for dlopen to avoid recursive calls. +# + +####### Detections and Commands ############################################### + +ifeq (android,$(findstring android,$(tbb_os))) + $(error TBB only supports cross-compilation for Android. Specify "target=android" instead.) +endif + +ifndef BUILDING_PHASE + ifneq ("command line","$(origin arch)") + ifeq (icc,$(compiler)) + export COMPILER_VERSION := ICC: $(shell icc -V &1 | grep 'Version') + ifneq (,$(findstring running on IA-32, $(COMPILER_VERSION))) + export arch:=ia32 + else ifneq (,$(findstring running on Intel(R) 64, $(COMPILER_VERSION))) + export arch:=intel64 + else + $(error "No support for Android in $(COMPILER_VERSION)") + endif + + else + ifdef ANDROID_SERIAL + uname_m:=$(shell adb shell uname -m) + ifeq (i686,$(uname_m)) + export arch:=ia32 + else + export arch:=$(uname_m) + endif + endif + endif + endif +endif + +ifeq ("$(arch)","") + $(error "No target architecture specified and \'ANDROID_SERIAL\' environment variable specifying target device not set") +endif + +# Android platform only supported from TBB 4.1 forward +NO_LEGACY_TESTS = 1 + + diff --git a/xdl/third_party/tbb/build/android.linux.inc b/xdl/third_party/tbb/build/android.linux.inc new file mode 100644 index 00000000..c95e5e35 --- /dev/null +++ b/xdl/third_party/tbb/build/android.linux.inc @@ -0,0 +1,67 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +####### Detections and Commands ############################################### + +# Must set def_prefix according to target architecture detected above +ifeq (ia32,$(arch)) + def_prefix = lin32 +endif +ifeq (arm,$(findstring arm,$(arch))) + def_prefix = lin32 +endif +ifeq (64,$(findstring 64,$(arch))) + def_prefix = lin64 +endif + +ifdef ndk_version + $(warning "NDK version $(ndk_version)") +else + $(warning "NDK version not set in environment, using \'unknown\' instead.") + ndk_version:=unknown +endif + +export runtime:=$(target)_NDK$(ndk_version)_version_$(target_os_version) + +AR = $(tbb_tool_prefix)ar +MAKE_VERSIONS=sh $(tbb_root)/build/version_info_android.sh $(VERSION_FLAGS) >version_string.ver + +####### Build settings ######################################################## + +# No SONAME_SUFFIX for Android allowed in library names +TBB.LST = $(tbb_root)/src/tbb/$(def_prefix)-tbb-export.lst +TBB.DEF = $(TBB.LST:.lst=.def) +TBB.DLL = libtbb$(CPF_SUFFIX)$(DEBUG_SUFFIX).$(DLL) +TBB.LIB = $(TBB.DLL) +TBB_NO_VERSION.DLL= +LINK_TBB.LIB = $(TBB.LIB) + +MALLOC.DEF = $(MALLOC_ROOT)/$(def_prefix)-tbbmalloc-export.def +MALLOC.DLL = libtbbmalloc$(DEBUG_SUFFIX).$(DLL) +MALLOC.LIB = $(MALLOC.DLL) +MALLOC_NO_VERSION.DLL= +LINK_MALLOC.LIB = $(MALLOC.LIB) + +MALLOCPROXY.DEF = $(MALLOC_ROOT)/$(def_prefix)-proxy-export.def +MALLOCPROXY.DLL = libtbbmalloc_proxy$(DEBUG_SUFFIX).$(DLL) +MALLOCPROXY_NO_VERSION.DLL= +MALLOCPROXY.LIB = $(MALLOCPROXY.DLL) +LINK_MALLOCPROXY.LIB = $(MALLOCPROXY.LIB) + +TEST_LAUNCHER= +run_cmd ?= -sh $(tbb_root)/build/android.linux.launcher.sh $(largs) diff --git a/xdl/third_party/tbb/build/android.linux.launcher.sh b/xdl/third_party/tbb/build/android.linux.launcher.sh new file mode 100644 index 00000000..919bc49c --- /dev/null +++ b/xdl/third_party/tbb/build/android.linux.launcher.sh @@ -0,0 +1,148 @@ +#!/bin/sh +# +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +# Usage: +# android.linux.launcher.sh [-v] [-q] [-s] [-r ] [-u] [-l ] +# where: -v enables verbose output +# where: -q enables quiet mode +# where: -s runs the test in stress mode (until non-zero exit code or ctrl-c pressed) +# where: -r specifies number of times to repeat execution +# where: -u is ignored on Android +# where: -l specifies the library name to be assigned to LD_PRELOAD +# +# Libs and executable necessary for testing should be present in the current directory before running. +# ANDROID_SERIAL must be set to the connected Android target device name for file transfer and test runs. +# ANDROID_TEST_DIRECTORY may be set to the directory used for testing on the Android target device; otherwise, +# the default directory used is "/data/local/tmp/$(basename $PWD)". +# Note: Do not remove the redirections to '/dev/null' in the script, otherwise the nightly test system will fail. + +do_cleanup() # +{ # + adb pull $targetdir/events.txt events.txt > /dev/null 2>&1 # + # Remove target directory on the device + adb shell "rm -r ${targetdir}; mkdir -p ${targetdir}" > /dev/null 2>&1 # +} # +do_trap_cleanup() # +{ # + do_cleanup # + exit -1 # +} # +while getopts "qvsr:ul:" flag # +do case $flag in # + s ) # Stress testing mode + echo Doing stress testing. Press Ctrl-C to terminate + run_env='stressed() { while $*; do :; done; }; ' # + run_prefix="stressed $run_prefix" ;; # + r ) # Repeats test n times + run_env="repeated() { for i in $(seq -s ' ' 1 $OPTARG) ; do echo \$i of $OPTARG:; \$*; done; }; " # + run_prefix="repeated $run_prefix" ;; # + l ) # Additional library + ldpreload="$OPTARG " ;; # + u ) # Stack limit + ;; # + q ) # Quiet mode, removes 'done' but prepends any other output by test name + OUTPUT='2>&1 | sed -e "s/done//;/^[[:space:]]*$/d;s!^!$exename: !"' ;; # + v ) # Verbose mode + SUPPRESS='' # + verbose=1 ;; # +esac done # +shift `expr $OPTIND - 1` # +[ -z "$OUTPUT" ] && OUTPUT='| sed -e "s/\\r$//"' # +[ $verbose ] || SUPPRESS='>/dev/null' # +# Collect the executable name +exename=$(basename $1) # +shift # +# Prepare the target directory on the device +currentdir=$(basename $PWD) # +targetdir=${ANDROID_TEST_DIRECTORY:-/data/local/tmp/$currentdir} # +do_cleanup # +trap do_trap_cleanup INT # if someone hits control-c, cleanup the device +# Collect the list of files to transfer to the target device, starting with executable itself. +fnamelist="$exename" # +# Add the C++ standard library from the NDK, which is required for all tests on Android. +if [ ! -z "${LIB_STL_ANDROID}" ]; then # + fnamelist="$fnamelist ${LIB_STL_ANDROID}" # +else # + fnamelist="$fnamelist libc++_shared.so" # +fi # +# Find the TBB libraries and add them to the list. +# Add TBB libraries from the current directory that contains libtbb* files +files="$(ls libtbb* 2> /dev/null)" # +[ -z "$files" ] || fnamelist="$fnamelist $files" # +# Add any libraries built for specific tests. +exeroot=${exename%\.*} # +files="$(ls ${exeroot}*.so ${exeroot}*.so.* 2> /dev/null)" # +[ -z "$files" ] || fnamelist="$fnamelist $files" # +# TODO: Add extra libraries from the Intel(R) Compiler for certain tests +# found=$(echo $exename | egrep 'test_malloc_atexit\|test_malloc_lib_unload' 2> /dev/null) +# if [ ! -z $found ] ; then +# fnamelist="$fnamelist ${compiler_path_lib}/libimf.so \ +# ${compiler_path_lib}/libsvml.so \ +# ${compiler_path_lib}/libintlc.so.5" +# fi + +# Transfer collected executable and library files to the target device. +transfers_ok=1 # +for fullname in $fnamelist; do { # + if [ -r $fullname ]; then { # + # Transfer the executable and libraries to top-level target directory + [ $verbose ] && echo -n "Pushing $fullname: " # + eval "adb push $fullname ${targetdir}/$(basename $fullname) $SUPPRESS 2>&1" # + }; else { # + echo "Error: required file ${currentdir}/${fullname} for test $exename not available for transfer." # + transfers_ok=0 # + }; fi # +}; done # +if [ "${transfers_ok}" = "0" ]; then { # + do_cleanup # + exit -1 # +}; fi # +# Transfer input files used by example codes by scanning the executable argument list. +for fullname in "$@"; do { # + if [ -r $fullname ]; then { # + directory=$(dirname $fullname) # + filename=$(basename $fullname) # + # strip leading "." from fullname if present + if [ "$directory" = "\." ]; then { # + directory="" # + fullname=$filename # + }; fi # + # Create the target directory to hold input file if necessary + if [ ! -z $directory ]; then { # + eval "adb shell 'mkdir $directory' $SUPPRESS 2>&1" # + }; fi # + # Transfer the input file to corresponding directory on target device + [ $verbose ] && echo -n "Pushing $fullname: " # + eval "adb push $fullname ${targetdir}/$fullname $SUPPRESS 2>&1" # + }; fi # +}; done # +# Set LD_PRELOAD if necessary +[ -z "$ldpreload" ] || run_prefix="LD_PRELOAD='$ldpreload' $run_prefix" # +[ $verbose ] && echo Running $run_prefix ./$exename $* # +run_env="$run_env cd $targetdir; export LD_LIBRARY_PATH=." # +[ -z "$VIRTUAL_MACHINE" ] || run_env="$run_env; export VIRTUAL_MACHINE=$VIRTUAL_MACHINE" # +# The return_code file is the best way found to return the status of the test execution when using adb shell. +eval 'adb shell "$run_env; $run_prefix ./$exename $* || echo -n \$? >error_code"' "${OUTPUT}" # +# Capture the return code string and remove the trailing \r from the return_code file contents +err=`adb shell "cat $targetdir/error_code 2>/dev/null"` # +[ -z $err ] || echo $exename: exited with error $err # +do_cleanup # +# Return the exit code of the test. +exit $err # diff --git a/xdl/third_party/tbb/build/android.macos.inc b/xdl/third_party/tbb/build/android.macos.inc new file mode 100644 index 00000000..8b1c7ae6 --- /dev/null +++ b/xdl/third_party/tbb/build/android.macos.inc @@ -0,0 +1,76 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +####### Detections and Commands ############################################### + +# Must set def_prefix according to target architecture detected above +ifeq (ia32,$(arch)) + def_prefix = lin32 +endif +ifeq (arm,$(findstring arm,$(arch))) + def_prefix = lin32 +endif +ifeq (64,$(findstring 64,$(arch))) + def_prefix = lin64 +endif + +ifdef ndk_version + $(warning "NDK version $(ndk_version)") +else + $(warning "NDK version not set in environment, using \'unknown\' instead.") + ndk_version:=unknown +endif + +export runtime:=$(target)_NDK$(ndk_version)_version_$(target_os_version) + +AR = $(tbb_tool_prefix)ar +MAKE_VERSIONS=sh $(tbb_root)/build/version_info_android.sh $(VERSION_FLAGS) >version_string.ver + +####### Build settings ######################################################## + +# No SONAME_SUFFIX for Android allowed in library names +TBB.LST = $(tbb_root)/src/tbb/$(def_prefix)-tbb-export.lst +TBB.DEF = $(TBB.LST:.lst=.def) +TBB.DLL = libtbb$(CPF_SUFFIX)$(DEBUG_SUFFIX).$(DLL) +TBB.LIB = $(TBB.DLL) +TBB_NO_VERSION.DLL= +LINK_TBB.LIB = $(TBB.LIB) + +MALLOC.DEF = $(MALLOC_ROOT)/$(def_prefix)-tbbmalloc-export.def +MALLOC.DLL = libtbbmalloc$(DEBUG_SUFFIX).$(DLL) +MALLOC.LIB = $(MALLOC.DLL) +MALLOC_NO_VERSION.DLL= +LINK_MALLOC.LIB = $(MALLOC.LIB) + +MALLOCPROXY.DEF = $(MALLOC_ROOT)/$(def_prefix)-proxy-export.def +MALLOCPROXY.DLL = libtbbmalloc_proxy$(DEBUG_SUFFIX).$(DLL) +MALLOCPROXY_NO_VERSION.DLL= +MALLOCPROXY.LIB = $(MALLOCPROXY.DLL) +LINK_MALLOCPROXY.LIB = $(MALLOCPROXY.LIB) + +TBB.RES = +MALLOC.RES = +RML.RES = +TBB.MANIFEST = +MALLOC.MANIFEST = +RML.MANIFEST = +OBJ = o +DLL = so + +TEST_LAUNCHER= +run_cmd ?= -sh $(tbb_root)/build/android.linux.launcher.sh $(largs) diff --git a/xdl/third_party/tbb/build/android.windows.inc b/xdl/third_party/tbb/build/android.windows.inc new file mode 100644 index 00000000..01b1d90d --- /dev/null +++ b/xdl/third_party/tbb/build/android.windows.inc @@ -0,0 +1,78 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +####### Detections and Commands ############################################### + +# Must set def_prefix according to target architecture detected above +ifeq (ia32,$(arch)) + def_prefix = lin32 +endif +ifeq (arm,$(findstring arm,$(arch))) + def_prefix = lin32 +endif +ifeq (64,$(findstring 64,$(arch))) + def_prefix = lin64 +endif + +ifdef ndk_version + $(warning "NDK version $(ndk_version)") +else + $(warning "NDK version not set in environment, using \'unknown\' instead.") + ndk_version:=unknown +endif + +export runtime:=$(target)_NDK$(ndk_version)_version_$(target_os_version) + +AR = $(tbb_tool_prefix)ar +MAKE_VERSIONS = cmd /C cscript /nologo /E:jscript $(subst \,/,$(tbb_root))/build/version_info_windows.js $(CONLY) $(arch) $(subst \,/,"$(VERSION_FLAGS)") > version_string.ver + +####### Build settings ######################################################## + +# No SONAME_SUFFIX for Android allowed in library names +TBB.LST = $(tbb_root)/src/tbb/$(def_prefix)-tbb-export.lst +TBB.DEF = $(TBB.LST:.lst=.def) +TBB.DLL = libtbb$(CPF_SUFFIX)$(DEBUG_SUFFIX).$(DLL) +TBB.LIB = $(TBB.DLL) +TBB_NO_VERSION.DLL= +LINK_TBB.LIB = $(TBB.LIB) + +MALLOC.DEF = $(MALLOC_ROOT)/$(def_prefix)-tbbmalloc-export.def +MALLOC.DLL = libtbbmalloc$(DEBUG_SUFFIX).$(DLL) +MALLOC.LIB = $(MALLOC.DLL) +MALLOC_NO_VERSION.DLL= +LINK_MALLOC.LIB = $(MALLOC.LIB) + +MALLOCPROXY.DEF = $(MALLOC_ROOT)/$(def_prefix)-proxy-export.def +MALLOCPROXY.DLL = libtbbmalloc_proxy$(DEBUG_SUFFIX).$(DLL) +MALLOCPROXY_NO_VERSION.DLL= +MALLOCPROXY.LIB = $(MALLOCPROXY.DLL) + +TBB.RES = +MALLOC.RES = +RML.RES = +TBB.MANIFEST = +MALLOC.MANIFEST = +RML.MANIFEST = +OBJ = o +DLL = so + +TEST_LAUNCHER= +run_cmd ?= -sh $(tbb_root)/build/android.linux.launcher.sh $(largs) +export UNIXMODE = 1 +# Clang for Android* uses the INCLUDE variable (instead of CPATH) +export USE_INCLUDE_ENV = 1 diff --git a/xdl/third_party/tbb/build/big_iron.inc b/xdl/third_party/tbb/build/big_iron.inc new file mode 100644 index 00000000..ad1b4fba --- /dev/null +++ b/xdl/third_party/tbb/build/big_iron.inc @@ -0,0 +1,76 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +#------------------------------------------------------------------------------ +# Defines settings for building the TBB run-time as a static library. +# Use these only on platforms where dynamic linking is impractical. +# +# IF YOU USE TBB AS A STATIC LIBRARY, YOU MUST GUARANTEE THAT ONLY ONE COPY OF +# THE TBB RUN-TIME IS LINKED INTO AN APPLICATION! LINKING IN MULTIPLE COPIES +# OF THE TBB RUN-TIME, DIRECTLY OR INDIRECTLY, MAY CAUSE PROGRAM FAILURE! +#------------------------------------------------------------------------------ + +# Note that ITT_NOTIFY allows to selectively remove the definition of +# DO_ITT_NOTIFY without sabotaging deferred expansion of CPLUS_FLAGS. +# TODO: currently only in linux.{gcc,xl}.inc + +# Note that -pthread with xl gives "1501-210 (W) command option t contains an incorrect subargument"; +# multithreading is instead achieved by using the _r affix in the compiler name. +# TODO: is -lpthread still relevant/needed with XL and _r affix? + +# Note that usage of dynamic (shared) libraries is disabled +# (via -D__TBB_DYNAMIC_LOAD_ENABLED=0 and LIBDL emptied) primarily for performance. + +# OS specific settings => + LIB_LINK_CMD = ar rcs + LIB_LINK_FLAGS = + LIB_LINK_LIBS = + LIB_OUTPUT_KEY = + DYLIB_KEY = + ifeq ($(tbb_os),linux) + ifeq ($(compiler),clang) + LIBS = -pthread -lrt + endif + ifeq ($(compiler),gcc) + LIBS = -pthread -lrt + endif + ifeq ($(compiler),xl) + LIBS = -lpthread -lrt + endif + LINK_FLAGS = + endif + override CXXFLAGS += -D__TBB_DYNAMIC_LOAD_ENABLED=0 -D__TBB_SOURCE_DIRECTLY_INCLUDED=1 + ITT_NOTIFY = + DLL = a + LIBEXT = a + LIBPREF = lib + LIBDL = +# <= OS specific settings + +TBB.DLL = $(LIBPREF)tbb$(DEBUG_SUFFIX).$(LIBEXT) +LINK_TBB.LIB = $(TBB.DLL) +TBB.LST = +TBB.DEF = +TBB_NO_VERSION.DLL = + +MALLOC.DLL = $(LIBPREF)tbbmalloc$(DEBUG_SUFFIX).$(LIBEXT) +LINK_MALLOC.LIB = $(MALLOC.DLL) +MALLOC.DEF = +MALLOC_NO_VERSION.DLL = +MALLOCPROXY.DLL = +MALLOCPROXY.DEF = diff --git a/xdl/third_party/tbb/build/build.py b/xdl/third_party/tbb/build/build.py new file mode 100644 index 00000000..53796a94 --- /dev/null +++ b/xdl/third_party/tbb/build/build.py @@ -0,0 +1,193 @@ +#!/usr/bin/env python +# +# Copyright (c) 2017-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +# Provides unified tool for preparing TBB for packaging + +from __future__ import print_function +import os +import re +import sys +import shutil +import platform +import argparse +from glob import glob +from collections import OrderedDict + +jp = os.path.join +is_win = (platform.system() == 'Windows') +is_lin = (platform.system() == 'Linux') +is_mac = (platform.system() == 'Darwin') + +default_prefix = os.getenv('PREFIX', 'install_prefix') +if is_win: + default_prefix = jp(default_prefix, 'Library') # conda-specific by default on Windows + +parser = argparse.ArgumentParser() +parser.add_argument('--tbbroot', default='.', help='Take Intel TBB from here') +parser.add_argument('--prefix', default=default_prefix, help='Prefix') +parser.add_argument('--prebuilt', default=[], action='append', help='Directories to find prebuilt files') +parser.add_argument('--no-rebuild', default=False, action='store_true', help='do not rebuild') +parser.add_argument('--install', default=False, action='store_true', help='install all') +parser.add_argument('--install-libs', default=False, action='store_true', help='install libs') +parser.add_argument('--install-devel', default=False, action='store_true', help='install devel') +parser.add_argument('--install-docs', default=False, action='store_true', help='install docs') +parser.add_argument('--install-python',default=False, action='store_true', help='install python module') +parser.add_argument('--make-tool', default='make', help='Use different make command instead') +parser.add_argument('--copy-tool', default=None, help='Use this command for copying ($ tool file dest-dir)') +parser.add_argument('--build-args', default="", help='specify extra build args') +parser.add_argument('--build-prefix', default='local', help='build dir prefix') +if is_win: + parser.add_argument('--msbuild', default=False, action='store_true', help='Use msbuild') + parser.add_argument('--vs', default="2012", help='select VS version for build') + parser.add_argument('--vs-platform', default="x64", help='select VS platform for build') +parser.add_argument('ignore', nargs='?', help="workaround conda-build issue #2512") + +args = parser.parse_args() + +if args.install: + args.install_libs = True + args.install_devel = True + args.install_docs = True + args.install_python= True + +def custom_cp(src, dst): + assert os.system(' '.join([args.copy_tool, src, dst])) == 0 + +if args.copy_tool: + install_cp = custom_cp # e.g. to use install -p -D -m 755 on Linux +else: + install_cp = shutil.copy + +bin_dir = jp(args.prefix, "bin") +lib_dir = jp(args.prefix, "lib") +inc_dir = jp(args.prefix, 'include') +doc_dir = jp(args.prefix, 'share', 'doc', 'tbb') +if is_win: + os.environ["OS"] = "Windows_NT" # make sure TBB will interpret it corretly + libext = '.dll' + libpref = '' + dll_dir = bin_dir +else: + libext = '.dylib' if is_mac else '.so.2' + libpref = 'lib' + dll_dir = lib_dir + +tbb_names = ["tbb", "tbbmalloc", "tbbmalloc_proxy"] + +############################################################## + +def system(arg): + print('$ ', arg) + return os.system(arg) + +def run_make(arg): + if system('%s -j %s'% (args.make_tool, arg)) != 0: + print("\nBummer. Running serial build in order to recover the log and have a chance to fix the build") + assert system('%s %s'% (args.make_tool, arg)) == 0 + +os.chdir(args.tbbroot) +if args.prebuilt: + release_dirs = sum([glob(d) for d in args.prebuilt], []) + print("Using pre-built files from ", release_dirs) +else: + if is_win and args.msbuild: + preview_release_dir = release_dir = jp(args.tbbroot, 'build', 'vs'+args.vs, args.vs_platform, 'Release') + if not args.no_rebuild or not os.path.isdir(release_dir): + assert os.system('msbuild /m /p:Platform=%s /p:Configuration=Release %s build/vs%s/makefile.sln'% \ + (args.vs_platform, args.build_args, args.vs)) == 0 + preview_debug_dir = debug_dir = jp(args.tbbroot, 'build', 'vs'+args.vs, args.vs_platform, 'Debug') + if not args.no_rebuild or not os.path.isdir(debug_dir): + assert os.system('msbuild /m /p:Platform=%s /p:Configuration=Debug %s build/vs%s/makefile.sln'% \ + (args.vs_platform, args.build_args, args.vs)) == 0 + else: + release_dir = jp(args.tbbroot, 'build', args.build_prefix+'_release') + debug_dir = jp(args.tbbroot, 'build', args.build_prefix+'_debug') + if not args.no_rebuild or not (os.path.isdir(release_dir) and os.path.isdir(debug_dir)): + run_make('tbb_build_prefix=%s %s'% (args.build_prefix, args.build_args)) + preview_release_dir = jp(args.tbbroot, 'build', args.build_prefix+'_preview_release') + preview_debug_dir = jp(args.tbbroot, 'build', args.build_prefix+'_preview_debug') + if not args.no_rebuild or not (os.path.isdir(preview_release_dir) and os.path.isdir(preview_debug_dir)): + run_make('tbb_build_prefix=%s_preview %s tbb_cpf=1 tbb'% (args.build_prefix, args.build_args)) + release_dirs = [release_dir, debug_dir, preview_release_dir, preview_debug_dir] + +filemap = OrderedDict() +def append_files(names, dst, paths=release_dirs): + global filemap + files = sum([glob(jp(d, f)) for d in paths for f in names], []) + filemap.update(dict(zip(files, [dst]*len(files)))) + + +if args.install_libs: + append_files([libpref+f+libext for f in tbb_names], dll_dir) + +if args.install_devel: + dll_files = [libpref+f+'_debug'+libext for f in tbb_names] # adding debug libraries + if not is_win or not args.msbuild: + dll_files += [libpref+"tbb_preview"+libext, libpref+"tbb_preview_debug"+libext] + if is_win: + dll_files += ['tbb*.pdb'] # copying debug info + if is_lin: + dll_files += ['libtbb*.so'] # copying linker scripts + # symlinks .so -> .so.2 should not be created instead + # since linking with -ltbb when using links can result in + # incorrect dependence upon unversioned .so files + append_files(dll_files, dll_dir) + if is_win: + append_files(['*.lib', '*.def'], lib_dir) # copying linker libs and defs + for rootdir, dirnames, filenames in os.walk(jp(args.tbbroot,'include')): + files = [f for f in filenames if not '.html' in f] + append_files(files, jp(inc_dir, rootdir.split('include')[1][1:]), paths=(rootdir,)) + +if args.install_python: # RML part + irml_dir = jp(args.tbbroot, 'build', args.build_prefix+'_release') + run_make('-C src tbb_build_prefix=%s %s python_rml'% (args.build_prefix, args.build_args)) + if is_lin: + append_files(['libirml.so.1'], dll_dir, paths=[irml_dir]) + +if args.install_docs: + files = [ + 'CHANGES', + 'LICENSE', + 'README', + 'README.md', + 'Release_Notes.txt', + ] + append_files(files, doc_dir, paths=release_dirs+[jp(args.tbbroot, d) for d in ('.', 'doc')]) + +for f in filemap.keys(): + assert os.path.exists(f) + assert os.path.isfile(f) + +if filemap: + print("Copying to prefix =", args.prefix) +for f, dest in filemap.items(): + if not os.path.isdir(dest): + os.makedirs(dest) + print("+ %s to $prefix%s"%(f,dest.replace(args.prefix, ''))) + install_cp(f, dest) + +if args.install_python: # Python part + paths = [os.path.abspath(d) for d in [args.prefix, inc_dir, irml_dir, lib_dir]+release_dirs] + os.environ["TBBROOT"] = paths[0] + # all the paths must be relative to python/ directory or be absolute + assert system('python python/setup.py build -b%s build_ext -I%s -L%s install -f'% \ + (paths[2], paths[1], ':'.join(paths[2:]))) == 0 + +print("done") diff --git a/xdl/third_party/tbb/build/codecov.txt b/xdl/third_party/tbb/build/codecov.txt new file mode 100644 index 00000000..e22f8059 --- /dev/null +++ b/xdl/third_party/tbb/build/codecov.txt @@ -0,0 +1,7 @@ +src/tbb +src/tbbmalloc +include/tbb +src/rml/server +src/rml/client +src/rml/include +source/malloc diff --git a/xdl/third_party/tbb/build/common.inc b/xdl/third_party/tbb/build/common.inc new file mode 100644 index 00000000..cef75df7 --- /dev/null +++ b/xdl/third_party/tbb/build/common.inc @@ -0,0 +1,174 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +ifndef tbb_os + + # Windows sets environment variable OS; for other systems, ask uname + ifeq ($(OS),) + OS:=$(shell uname) + ifeq ($(OS),) + $(error "Cannot detect operating system") + endif + export tbb_os=$(OS) + endif + + ifeq ($(OS), Windows_NT) + export tbb_os=windows + endif + ifeq ($(OS), Linux) + export tbb_os=linux + endif + ifeq ($(OS), Darwin) + export tbb_os=macos + endif + +endif # !tbb_os + +ifeq (1,$(tbb_cpf)) + export CPF_SUFFIX ?=_preview +endif + +ifeq (0,$(exceptions)) +# Inverse the value, for simplicity of use + export no_exceptions=1 +endif + +ifdef cpp0x + $(warning "Warning: deprecated cpp0x=$(cpp0x) is used, stdver must be used instead. Building in stdver=c++0x mode.") + export stdver?=c++0x + override cpp0x= +endif + +# Define C & C++ compilers according to platform defaults or CXX & CC environment variables +ifneq (,$(findstring environment, $(origin CXX))) + CPLUS = $(CXX) +endif +ifneq (,$(findstring environment, $(origin CC))) + CONLY = $(CC) +endif + +ifneq (,$(stdver)) + ifeq (,$(findstring ++, $(stdver))) + $(warning "Warning: unexpected stdver=$(stdver) is used.") + endif + CXX_STD_FLAGS=-std=$(stdver) +endif + +# The requested option is added unconditionally. +# If it is not supported, a compiler warning or error is expected. +# Note that CXX_STD_FLAGS can be changed in ..inc. +CXX_ONLY_FLAGS+=$(CXX_STD_FLAGS) + +ifeq (,$(wildcard $(tbb_root)/build/$(tbb_os).inc)) + $(error "$(tbb_os)" is not supported. Add build/$(tbb_os).inc file with os-specific settings ) +endif + +# detect arch and runtime versions, provide common host-specific definitions +include $(tbb_root)/build/$(tbb_os).inc + +ifeq ($(arch),) + $(error Architecture not detected) +endif +ifeq ($(runtime),) + $(error Runtime version not detected) +endif + +# process target-dependent compilation and testing configurations +ifdef target + # optionally process target-dependent options for compilation and testing + ifneq (,$(wildcard $(tbb_root)/build/$(target).inc)) + include $(tbb_root)/build/$(target).inc + endif + + # optionally process host-dependent environment for target-dependent compilation and testing + ifneq (,$(wildcard $(tbb_root)/build/$(target).$(tbb_os).inc)) + include $(tbb_root)/build/$(target).$(tbb_os).inc + endif + + # insure at least one target-dependent configuration file was found for compilation and testing + ifeq (,$(wildcard $(tbb_root)/build/$(target).inc)$(wildcard $(tbb_root)/build/$(target).$(tbb_os).inc)) + $(error "$(target)" is not supported. Add build/$(target).inc or build/$(target).$(tbb_os).inc file) + endif +endif #target + +# Support for running debug tests to release library and vice versa +flip_cfg=$(subst _flipcfg,_release,$(subst _release,_debug,$(subst _debug,_flipcfg,$(1)))) +cross_cfg = $(if $(crosstest),$(call flip_cfg,$(1)),$(1)) +# Setting default configuration to release +cfg?=release + +compiler_name=$(notdir $(compiler)) +ifdef BUILDING_PHASE + ifndef target + target:=$(tbb_os) + endif + # process host/target compiler-dependent build configuration + ifeq (,$(wildcard $(tbb_root)/build/$(target).$(compiler_name).inc)) + $(error "$(compiler_name)" is not supported on $(target). Add build/$(target).$(compiler_name).inc file with compiler-specific settings. ) + endif + include $(tbb_root)/build/$(target).$(compiler_name).inc +endif + +ifneq ($(BUILDING_PHASE),1) + # definitions for top-level Makefiles + origin_build_dir:=$(origin tbb_build_dir) + tbb_build_dir?=$(tbb_root)$(SLASH)build + export tbb_build_prefix?=$(tbb_os)_$(arch)_$(compiler_name)_$(runtime)$(CPF_SUFFIX) + work_dir=$(tbb_build_dir)$(SLASH)$(tbb_build_prefix) +endif # BUILDING_PHASE != 1 + +ifdef offload + extra_inc=$(offload).offload.inc +endif +ifdef extra_inc + ifneq (,$(wildcard $(tbb_root)/build/$(extra_inc))) + include $(tbb_root)/build/$(extra_inc) + else + $(error specified build file: "build/$(extra_inc)" is not found. ) + endif +endif + +ifndef BUILDING_PHASE + work_dir:=$(work_dir) + # assign new value for tbb_root if path is not absolute (the filter keeps only /* paths) + ifeq ($(filter /% $(SLASH)%, $(subst :, ,$(tbb_root)) ),) + full_tbb_root:=$(CURDIR)/$(tbb_root) + ifeq ($(origin_build_dir),undefined) + #relative path are needed here as a workaround to support whitespaces in path + override tbb_root:=../.. + else + override tbb_root:=$(full_tbb_root) + endif + export tbb_root + endif + endif # !BUILDING_PHASE + +.DELETE_ON_ERROR: # Make will delete target if error occurred when building it. + +# MAKEOVERRIDES contains the command line variable definitions. Reseting it to +# empty allows propogating all exported overridden variables to nested makes. +# NOTEs: +# 1. All variable set in command line are propagated to nested makes. +# 2. All variables declared with the "export" keyword are propagated to +# nested makes. +# 3. "override" allows changing variables set in command line. But it doesn't +# propagate new values to nested makes. For propagation, the "export" keyword +# should be used. +# 4. gmake v3.80 doesn't support exporting of target-specific variables using +# the "export" keyword +MAKEOVERRIDES = diff --git a/xdl/third_party/tbb/build/common_rules.inc b/xdl/third_party/tbb/build/common_rules.inc new file mode 100644 index 00000000..6bb2e7a6 --- /dev/null +++ b/xdl/third_party/tbb/build/common_rules.inc @@ -0,0 +1,169 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + + +ifeq ($(tbb_strict),1) + ifeq ($(WARNING_AS_ERROR_KEY),) + $(error WARNING_AS_ERROR_KEY is empty) + endif + # Do not remove line below! + WARNING_KEY += $(WARNING_AS_ERROR_KEY) +endif + +ifneq (,$(findstring s,$(MAKEFLAGS))) + override largs+=-q +endif +ifneq (,$(repeat)) + override largs+=-r $(repeat) +endif +ifneq (,$(largs)$(run_prefix)) + override run_cmd:=$(run_cmd) $(TEST_LAUNCHER) + TEST_LAUNCHER= + ifeq (,$(strip $(run_cmd))) + $(warning Test launcher is not defined for the platform, ignoring launcher arguments) + endif +endif + +ifndef TEST_EXT + TEST_EXT = exe +endif + +INCLUDES += $(INCLUDE_KEY)$(tbb_root)/src $(INCLUDE_KEY)$(tbb_root)/src/rml/include $(INCLUDE_KEY)$(tbb_root)/include + +CPLUS_FLAGS += $(WARNING_KEY) $(CXXFLAGS) +ifeq (1,$(tbb_cpf)) +CPLUS_FLAGS += $(DEFINE_KEY)__TBB_CPF_BUILD=1 +endif +ifeq (0,$(exceptions)) +CPLUS_FLAGS += $(DEFINE_KEY)TBB_USE_EXCEPTIONS=0 +endif +LINK_FLAGS += $(LDFLAGS) +LIB_LINK_FLAGS += $(LDFLAGS) + +LIB_LINK_CMD ?= $(CPLUS) $(PIC_KEY) +ifeq ($(origin LIB_OUTPUT_KEY), undefined) + LIB_OUTPUT_KEY = $(OUTPUT_KEY) +endif +ifeq ($(origin LIB_LINK_LIBS), undefined) + LIB_LINK_LIBS = $(LIBDL) $(LIBS) +endif + +# some platforms do not provide separate C-only compiler +CONLY ?= $(CPLUS) + +# The most generic rules +#$(1) - is the target pattern +define make-cxx-obj +$1: %.cpp + $$(CPLUS) $$(OUTPUTOBJ_KEY)$$@ $$(COMPILE_ONLY) $$(CPLUS_FLAGS) $$(CXX_ONLY_FLAGS) $$(CXX_WARN_SUPPRESS) $$(INCLUDES) $$< +endef + +TEST_AFFIXES_OBJS=$(addsuffix .$(OBJ),$(addprefix %_,$(TEST_SUFFIXES)) $(addsuffix _%,$(TEST_PREFIXES))) + +# Make will not process the same recipe for each test pattern (since the dependency on the same %.cpp) +# thus the separated recipes should be provided +$(foreach t,%.$(OBJ) $(TEST_AFFIXES_OBJS),$(eval $(call make-cxx-obj,$(t)))) + +.PRECIOUS: %.$(OBJ) %.$(TEST_EXT) %.res $(TEST_AFFIXES_OBJS) + +# Rules for generating a test DLL +%_dll.$(OBJ): %.cpp + $(CPLUS) $(COMPILE_ONLY) $(OUTPUTOBJ_KEY)$@ $(CPLUS_FLAGS) $(PIC_KEY) $(DEFINE_KEY)_USRDLL $(INCLUDES) $< + +#$(1) - is the binary name +#$(2) - is the input obj files and libraries +define make-test-binary + $(CPLUS) $(OUTPUT_KEY)$(strip $1) $(CPLUS_FLAGS) $(2) $(LIBS) $(LINK_FLAGS) +endef + +# LINK_FILES the list of options to link test specific files (libraries and object files) +LINK_FILES+=$(TEST_LIBS) +# Rule for generating executable test +%.$(TEST_EXT): %.$(OBJ) $(TEST_LIBS) $(TEST_PREREQUISITE) $(if $(use_proxy),$(PROXY.LIB)) + $(call make-test-binary,$@,$< $(LINK_FILES) $(PIE_FLAG)) + +# Rules for generating a test DLL +%_dll.$(DLL): LINK_FLAGS += $(PIC_KEY) $(DYLIB_KEY) +%_dll.$(DLL): TEST_LIBS := $(subst %_dll.$(DLL),,$(TEST_LIBS)) +%_dll.$(DLL): %_dll.$(OBJ) + $(call make-test-binary,$@,$< $(LINK_FILES)) +.PRECIOUS: %_dll.$(OBJ) %_dll.$(DLL) + +%.$(OBJ): %.c + $(CONLY) $(COMPILE_ONLY) $(OUTPUTOBJ_KEY)$@ $(C_FLAGS) $(INCLUDES) $< + +%.$(OBJ): %.asm + $(ASM) $(ASM_FLAGS) $< + +%.$(OBJ): %.s + cpp <$< | grep -v '^#' >$*.tmp + $(ASM) $(ASM_FLAGS) -o $@ $*.tmp + +# Rule for generating .E file if needed for visual inspection +# Note that ICL treats an argument after PREPROC_ONLY as a file to open, +# so all uses of PREPROC_ONLY should be immediately followed by a file name +%.E: %.cpp + $(CPLUS) $(CPLUS_FLAGS) $(CXX_ONLY_FLAGS) $(INCLUDES) $(PREPROC_ONLY) $< >$@ + +# TODO Rule for generating .asm file if needed for visual inspection +%.asm: %.cpp + $(CPLUS) /c /FAs /Fa $(CPLUS_FLAGS) $(CXX_ONLY_FLAGS) $(INCLUDES) $< + +# TODO Rule for generating .s file if needed for visual inspection +%.s: %.cpp + $(CPLUS) -S $(CPLUS_FLAGS) $(CXX_ONLY_FLAGS) $(INCLUDES) $< + +# Customizations +$(KNOWN_WARNINGS): %.$(OBJ): %.cpp + $(CPLUS) $(COMPILE_ONLY) $(subst $(WARNING_KEY),,$(CPLUS_FLAGS)) $(CXX_ONLY_FLAGS) $(CXX_WARN_SUPPRESS) $(INCLUDES) $< + +tbb_misc.$(OBJ): version_string.ver +tbb_misc.$(OBJ): INCLUDES+=$(INCLUDE_KEY). + +tbb_misc.E: tbb_misc.cpp version_string.ver + $(CPLUS) $(CPLUS_FLAGS) $(CXX_ONLY_FLAGS) $(INCLUDE_KEY). $(INCLUDES) $(PREPROC_ONLY) $< >$@ + +%.res: %.rc version_string.ver $(TBB.MANIFEST) + rc /Fo$@ $(INCLUDES) $(filter /D%,$(CPLUS_FLAGS)) $< + +# TODO: add $(LIB_LINK_LIBS) $(LIB_LINK_FLAGS) (in a separate line?) and remove useless $(INCLUDES) +VERSION_FLAGS=$(CPLUS) $(CPLUS_FLAGS) $(CXX_ONLY_FLAGS) $(INCLUDES) + +ifneq (,$(TBB.MANIFEST)) +$(TBB.MANIFEST): + cmd /C "echo #include ^ >tbbmanifest.c" + cmd /C "echo int main(){return 0;} >>tbbmanifest.c" + cl /nologo $(C_FLAGS) tbbmanifest.c + +version_string.ver: $(TBB.MANIFEST) + $(MAKE_VERSIONS) + cmd /C "echo #define TBB_MANIFEST 1 >> version_string.ver" +# TODO: fix parallel build by writing to a temporary file and rename it when complete +else +# TODO: make version strings directly representative for all the libraries +version_string.ver: + $(MAKE_VERSIONS) +endif + +test_% debug_%: test_%.$(TEST_EXT) $(TEST_PREREQUISITE) + $(run_cmd) ./$< $(args) +ifneq (,$(codecov)) + profmerge + codecov $(if $(findstring -,$(codecov)),$(codecov),) -demang -comp $(tbb_root)/build/codecov.txt +endif + diff --git a/xdl/third_party/tbb/build/detect.js b/xdl/third_party/tbb/build/detect.js new file mode 100644 index 00000000..45d6b4ba --- /dev/null +++ b/xdl/third_party/tbb/build/detect.js @@ -0,0 +1,199 @@ +// Copyright (c) 2005-2018 Intel Corporation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// +// +// + +function readAllFromFile(fname) { + var fso = new ActiveXObject("Scripting.FileSystemObject"); + var file = null; + try { + file = fso.OpenTextFile(fname, 1, 0); + return (file.readAll()); + } finally { + // Close the file in the finally section to guarantee that it will be closed in any case + // (if the exception is thrown or not). + file.Close(); + } +} + +function doWork() { + var WshShell = WScript.CreateObject("WScript.Shell"); + + var tmpExec = WshShell.Run("cmd /c echo int main(){return 0;} >detect.c", 0, true); + + // The next block deals with GCC (MinGW) + if (WScript.Arguments.Count() > 1) { + var compilerPath = WScript.Arguments(1); + // The RegExp matches everything up to and including the last slash (it uses a greedy approach.) + var compilerName = compilerPath.replace(/^.*[\/\\]/, ""); + if (compilerName.match(/gcc/i) != null) { + if (WScript.Arguments(0) == "/arch") { + // Get predefined macros + tmpExec = WshShell.Run("cmd /C " + compilerPath + " -dM -E detect.c > detect.map", 0, true); + var defs = readAllFromFile("detect.map"); + //detect target architecture + var intel64 = /x86_64|amd64/mgi; + var ia32 = /i386/mgi; + if (defs.match(intel64)) { + WScript.Echo("intel64"); + } else if (defs.match(ia32)) { + WScript.Echo("ia32"); + } else { + WScript.Echo("unknown"); + } + } else { + tmpExec = WshShell.Exec(compilerPath + " -dumpversion"); + var gccVersion = tmpExec.StdOut.ReadLine(); + if (WScript.Arguments(0) == "/runtime") { + WScript.Echo("mingw" + gccVersion); + } + else if (WScript.Arguments(0) == "/minversion") { + // Comparing strings, not numbers; will not work for two-digit versions + if (gccVersion >= WScript.Arguments(2)) { + WScript.Echo("ok"); + } else { + WScript.Echo("fail"); + } + } + } + return; + } + } + + //Compile binary + tmpExec = WshShell.Exec("cl /MD detect.c /link /MAP"); + while (tmpExec.Status == 0) { + WScript.Sleep(100); + } + //compiler banner that includes version and target arch was printed to stderr + var clVersion = tmpExec.StdErr.ReadAll(); + + if (WScript.Arguments(0) == "/arch") { + //detect target architecture + var intel64 = /AMD64|EM64T|x64/mgi; + var ia32 = /[80|\s]x86/mgi; + var arm = /ARM/mgi; + if (clVersion.match(intel64)) { + WScript.Echo("intel64"); + } else if (clVersion.match(ia32)) { + WScript.Echo("ia32"); + } else if (clVersion.match(arm)) { + WScript.Echo("armv7"); + } else { + WScript.Echo("unknown"); + } + return; + } + + if (WScript.Arguments(0) == "/runtime") { + //read map-file + var mapContext = readAllFromFile("detect.map"); + //detect runtime + var vc71 = /MSVCR71\.DLL/mgi; + var vc80 = /MSVCR80\.DLL/mgi; + var vc90 = /MSVCR90\.DLL/mgi; + var vc100 = /MSVCR100\.DLL/mgi; + var vc110 = /MSVCR110\.DLL/mgi; + var vc120 = /MSVCR120\.DLL/mgi; + var vc140 = /VCRUNTIME140\.DLL/mgi; + var psdk = /MSVCRT\.DLL/mgi; + if (mapContext.match(vc71)) { + WScript.Echo("vc7.1"); + } else if (mapContext.match(vc80)) { + WScript.Echo("vc8"); + } else if (mapContext.match(vc90)) { + WScript.Echo("vc9"); + } else if (mapContext.match(vc100)) { + WScript.Echo("vc10"); + } else if (mapContext.match(vc110)) { + WScript.Echo("vc11"); + } else if (mapContext.match(vc120)) { + WScript.Echo("vc12"); + } else if (mapContext.match(vc140)) { + if (WshShell.ExpandEnvironmentStrings("%VisualStudioVersion%") == "15.0") + WScript.Echo("vc14.1"); + else + WScript.Echo("vc14"); + } else { + WScript.Echo("unknown"); + } + return; + } + + if (WScript.Arguments(0) == "/minversion") { + var compilerVersion; + var compilerUpdate; + if (WScript.Arguments(1) == "cl") { + compilerVersion = clVersion.match(/Compiler Version ([0-9.]+)\s/mi)[1]; + // compilerVersion is in xx.xx.xxxxx.xx format, i.e. a string. + // It will compare well with major.minor versions where major has two digits, + // which is sufficient as the versions of interest start from 13 (for VC7). + } else if (WScript.Arguments(1) == "icl") { + // Get predefined ICL macros + tmpExec = WshShell.Run("cmd /C icl /QdM /E detect.c > detect.map", 0, true); + var defs = readAllFromFile("detect.map"); + // In #define __INTEL_COMPILER XXYY, XX is the major ICL version, YY is minor + compilerVersion = defs.match(/__INTEL_COMPILER[ \t]*([0-9]+).*$/mi)[1] / 100; + compilerUpdate = defs.match(/__INTEL_COMPILER_UPDATE[ \t]*([0-9]+).*$/mi)[1]; + // compiler version is a number; it compares well with another major.minor + // version number, where major has one, two, and perhaps more digits (9.1, 11, etc). + } + var requestedVersion = WScript.Arguments(2); + var requestedUpdate = 0; + if (WScript.Arguments.Count() > 3) + requestedUpdate = WScript.Arguments(3); + if (compilerVersion < requestedVersion) { + WScript.Echo("fail"); + } else if (compilerVersion == requestedVersion && compilerUpdate < requestedUpdate) { + WScript.Echo("fail"); + } else { + WScript.Echo("ok"); + } + return; + } +} + +function doClean() { + var fso = new ActiveXObject("Scripting.FileSystemObject"); + // delete intermediate files + if (fso.FileExists("detect.c")) + fso.DeleteFile("detect.c", false); + if (fso.FileExists("detect.obj")) + fso.DeleteFile("detect.obj", false); + if (fso.FileExists("detect.map")) + fso.DeleteFile("detect.map", false); + if (fso.FileExists("detect.exe")) + fso.DeleteFile("detect.exe", false); + if (fso.FileExists("detect.exe.manifest")) + fso.DeleteFile("detect.exe.manifest", false); +} + +if (WScript.Arguments.Count() > 0) { + + try { + doWork(); + } catch (error) { + WScript.Echo("unknown"); + } + doClean(); + +} else { + WScript.Echo("Supported options:\n" + + "\t/arch [compiler]\n" + + "\t/runtime [compiler]\n" + + "\t/minversion compiler version"); +} + diff --git a/xdl/third_party/tbb/build/generate_tbbvars.bat b/xdl/third_party/tbb/build/generate_tbbvars.bat new file mode 100644 index 00000000..a7bee908 --- /dev/null +++ b/xdl/third_party/tbb/build/generate_tbbvars.bat @@ -0,0 +1,66 @@ +@echo off +REM +REM Copyright (c) 2005-2018 Intel Corporation +REM +REM Licensed under the Apache License, Version 2.0 (the "License"); +REM you may not use this file except in compliance with the License. +REM You may obtain a copy of the License at +REM +REM http://www.apache.org/licenses/LICENSE-2.0 +REM +REM Unless required by applicable law or agreed to in writing, software +REM distributed under the License is distributed on an "AS IS" BASIS, +REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +REM See the License for the specific language governing permissions and +REM limitations under the License. +REM +REM +REM +REM +REM +setlocal +for %%D in ("%tbb_root%") do set actual_root=%%~fD +set fslash_root=%actual_root:\=/% +set bin_dir=%CD% +set fslash_bin_dir=%bin_dir:\=/% +set _INCLUDE=INCLUDE& set _LIB=LIB +if not x%UNIXMODE%==x set _INCLUDE=CPATH& set _LIB=LIBRARY_PATH +if not x%USE_INCLUDE_ENV%==x set _INCLUDE=INCLUDE + +echo Generating local tbbvars.bat +echo @echo off>tbbvars.bat +echo SET TBBROOT=%actual_root%>>tbbvars.bat +echo SET TBB_ARCH_PLATFORM=%arch%\%runtime%>>tbbvars.bat +echo SET TBB_TARGET_ARCH=%arch%>>tbbvars.bat +echo SET %_INCLUDE%=%%TBBROOT%%\include;%%%_INCLUDE%%%>>tbbvars.bat +echo SET %_LIB%=%bin_dir%;%%%_LIB%%%>>tbbvars.bat +echo SET PATH=%bin_dir%;%%PATH%%>>tbbvars.bat +if not x%UNIXMODE%==x echo SET LD_LIBRARY_PATH=%bin_dir%;%%LD_LIBRARY_PATH%%>>tbbvars.bat + +echo Generating local tbbvars.sh +echo #!/bin/sh>tbbvars.sh +echo export TBBROOT="%fslash_root%">>tbbvars.sh +echo export TBB_ARCH_PLATFORM="%arch%\%runtime%">>tbbvars.sh +echo export TBB_TARGET_ARCH="%arch%">>tbbvars.sh +echo export %_INCLUDE%="${TBBROOT}/include;$%_INCLUDE%">>tbbvars.sh +echo export %_LIB%="%fslash_bin_dir%;$%_LIB%">>tbbvars.sh +echo export PATH="%fslash_bin_dir%;$PATH">>tbbvars.sh +if not x%UNIXMODE%==x echo export LD_LIBRARY_PATH="%fslash_bin_dir%;$LD_LIBRARY_PATH">>tbbvars.sh + +echo Generating local tbbvars.csh +echo #!/bin/csh>tbbvars.csh +echo setenv TBBROOT "%actual_root%">>tbbvars.csh +echo setenv TBB_ARCH_PLATFORM "%arch%\%runtime%">>tbbvars.csh +echo setenv TBB_TARGET_ARCH "%arch%">>tbbvars.csh +echo setenv %_INCLUDE% "${TBBROOT}\include;$%_INCLUDE%">>tbbvars.csh +echo setenv %_LIB% "%bin_dir%;$%_LIB%">>tbbvars.csh +echo setenv PATH "%bin_dir%;$PATH">>tbbvars.csh +if not x%UNIXMODE%==x echo setenv LD_LIBRARY_PATH "%bin_dir%;$LD_LIBRARY_PATH">>tbbvars.csh + +if not x%LIB_STL_ANDROID%==x ( +REM Workaround for copying Android* specific stl shared library to work folder +copy /Y "%LIB_STL_ANDROID:/=\%" . +) + +endlocal +exit diff --git a/xdl/third_party/tbb/build/generate_tbbvars.sh b/xdl/third_party/tbb/build/generate_tbbvars.sh new file mode 100644 index 00000000..4dd9c2c7 --- /dev/null +++ b/xdl/third_party/tbb/build/generate_tbbvars.sh @@ -0,0 +1,71 @@ +#!/bin/bash +# +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +# Script used to generate tbbvars.[c]sh scripts +bin_dir="$PWD" # +cd "$tbb_root" # keep this comments here +tbb_root="$PWD" # to make it unsensible +cd "$bin_dir" # to EOL encoding +cat >./tbbvars.sh <./tbbvars.csh < + + +

Overview

+This directory contains the internal Makefile infrastructure for Intel® Threading Building Blocks (Intel® TBB). + +

+See below for how to build Intel TBB and how to port Intel TBB +to a new platform, operating system or architecture. +

+ +

Files

+The files here are not intended to be used directly. See below for usage. +
+
Makefile.tbb +
Main Makefile to build the Intel TBB library. + Invoked via 'make tbb' from top-level Makefile. +
Makefile.tbbmalloc +
Main Makefile to build the Intel TBB scalable memory allocator library as well as its tests. + Invoked via 'make tbbmalloc' from top-level Makefile. +
Makefile.test +
Main Makefile to build and run the tests for the Intel TBB library. + Invoked via 'make test' from top-level Makefile. +
common.inc +
Main common included Makefile that includes OS-specific and compiler-specific Makefiles. +
<os>.inc +
OS-specific Makefile for a particular <os>. +
<os>.<compiler>.inc +
Compiler-specific Makefile for a particular <os> / <compiler> combination. +
*.sh +
Infrastructure utilities for Linux* OS, macOS*, and UNIX*-related operating systems. +
*.js, *.bat +
Infrastructure utilities for Windows* OS. +
+ +

To Build

+

+To port Intel TBB to a new platform, operating system or architecture, see the porting directions below. +

+ +

Software prerequisites:

+
    +
  1. C++ compiler for the platform, operating system and architecture of interest. + Either the native compiler for your system, or, optionally, the appropriate Intel® C++ Compiler, may be used. +
  2. GNU make utility. On Windows OS, if a UNIX* emulator is used to run GNU make, + it should be able to run Windows OS utilities and commands. On Linux OS, macOS, etc., + shell commands issued by GNU make should execute in a Bourne or BASH compatible shell. + In the following examples, replace make with the correct GNU make command for + your system (for example, gmake). GNU make version 3.80 and more recent are supported. +
+ +

+Intel TBB libraries can be built by performing the following steps. +On systems that support only one ABI (e.g., 32-bit), these steps build the libraries for that ABI. +On systems that support both 64-bit and 32-bit libraries, these steps build the 64-bit libraries +(Linux OS, macOS, and related systems) or whichever ABI is selected in the development environment (Windows OS). +

+
    +
  1. Change to the top-level directory of the installed software. +
  2. If using the Intel® C++ Compiler, make sure the appropriate compiler is available in your PATH + (e.g., by sourcing the appropriate iccvars script for the compiler to be used). +
  3. Invoke GNU make using no arguments, for example, make. +
+ +

+To build Intel TBB libraries for other than the default ABI (e.g., to build 32-bit libraries on Linux OS, macOS, +or related systems that support both 64-bit and 32-bit libraries), perform the following steps: +

+
    +
  1. Change to the top-level directory of the installed software. +
  2. If using the Intel® C++ Compiler, make sure the appropriate compiler is available in your PATH + (e.g., by sourcing the appropriate iccvars script for the compiler to be used). +
  3. Explicitly specify the architecture when invoking GNU make, e.g. make arch=ia32. +
+ +

The default make target will build the release and debug versions of the Intel TBB library.

+

Other targets are available in the top-level Makefile. You might find the following targets useful: +

    +
  • make test will build and run Intel TBB unit-tests; +
  • make examples will build and run Intel TBB examples. Available in the open-source version only. +For the commercial version, you can download Intel TBB Samples at the Intel® Software Product Samples and Tutorials website; +
  • make all will do all of the above. Available in the open-source version only. +
+See also the list of other targets below. +

+ +

+By default, the libraries will be built in sub-directories within the build/ directory. +The sub-directories are named according to the operating system, architecture, compiler and software environment used +(the sub-directory names also distinguish release vs. debug libraries). On Linux OS, the software environment comprises +the GCC, libc and kernel version used. On macOS, the software environment comprises the GCC and OS version used. +On Windows OS, the software environment comprises the Microsoft* Visual Studio* version used. +See below for how to change the default build directory. +

+ +

+To perform different build and/or test operations, use the following steps. +

+
    +
  1. Change to the top-level directory of the installed software. +
  2. If using the Intel® C++ Compiler, make sure the appropriate compiler is available in your PATH + (e.g., by sourcing the appropriate iccvars script for the compiler to be used). +
  3. Invoke GNU make by using one or more of the following commands. +
    +
    make +
    Default build. Equivalent to make tbb tbbmalloc. +
    make all +
    Equivalent to make tbb tbbmalloc test examples. Available in the open-source version only. +
    cd src;make release +
    Build and test release libraries only. +
    cd src;make debug +
    Build and test debug libraries only. +
    make tbb +
    Make Intel TBB release and debug libraries. +
    make tbbmalloc +
    Make Intel TBB scalable memory allocator libraries. +
    make test +
    Compile and run unit-tests +
    make examples +
    Build libraries and run all examples, like doing make debug clean release from the general example Makefile. + Available in the open-source version only. +
    make python +
    Build, install, and test Python* API for Intel TBB. See details here. +
    make compiler={icl, icc, gcc, clang} [(above options or targets)] +
    Build and run as above, but use specified compilers instead of default, native compilers +
      +
    1. {icl, icc} - to use Intel® compilers (icl on Windows OS, icc on Linux OS or macOS).
    2. +
    3. gcc - to use g++ (e.g. MinGW on Windows OS)
    4. +
    5. clang - to use Clang compiler
    6. +
    +
    make compiler=clang stdlib=libc++ [(above options or targets)] +
    Build and run as above, but use libc++ as a standard c++ library for clang. +
    make stdver={c++11, c++14, ...} [(above options or targets)] +
    Build and run as above, but additionally specify the version of the C++ standard or dialect to be used by + the compiler. The specified value of stdver will be used as a parameter to the appropriate + compiler option (such as -std); the behavior in case of unsupported value is compiler-specific. +
    make target_app={win8ui, uwp, uwd} [target_mode=store] [(above options or targets)] +
    Build and run as above, but use API that is compliant with Universal Windows* applications. Use win8ui option, if you want to use Intel TBB in Windows* 8 Universal application, uwp in case of Windows* 10 Universal Windows application and uwd for the usage inside Universal Windows* driver. + target_mode=store is used to produce binaries that are compliant with Windows Store* application container. In later case they won't work with Intel TBB unit tests but work only with Windows Store* applications. +
    ndk-build target=android [(above options or targets)] +
    Build and run as above, but build libraries for Android* OS by Android NDK that should be installed. Makefiles were tested with revision 8. +
    make arch={ia32, intel64, ia64} [(above options or targets)] +
    Build and run as above, but build libraries for the selected ABI. + Might be useful for cross-compilation; ensure proper environment is set before running this command. +
    make tbb_root={(Intel TBB directory)} [(above options or targets)] +
    Build and run as above; for use when invoking make from a directory other than the top-level directory. +
    make tbb_build_dir={(build directory)} [(above options or targets)] +
    Build and run as above, but place the built libraries in the specified directory, rather than in the default sub-directory within the build/ directory. This command might have troubles with the build in case the sources installed to the directory with spaces in the path. +
    make tbb_build_prefix={(build sub-directory)} [(above options or targets)] +
    Build and run as above, but place the built libraries in the specified sub-directory within the build/ directory, rather than using the default sub-directory name. +
    make tbb_cpf=1 [(above options or targets)] +
    Build and run as above, but build and use libraries with the Community Preview Features enabled, rather than the default libraries. +
    make [(above options)] clean +
    Remove any executables or intermediate files produced by the above commands. + Includes build directories, object files, libraries and test executables. +
    +
+ +

To Port

+

+This section provides information on how to port Intel TBB to a new platform, operating system or architecture. +A subset or a superset of these steps may be required for porting to a given platform. +

+ +

To port the Intel TBB source code:

+
    +
  1. If porting to a new architecture, create a file that describes the architecture-specific details for that architecture. +
      +
    • Create a <os>_<architecture>.h file in the include/tbb/machine directory + that describes these details. +
        +
      • The <os>_<architecture>.h is named after the operating system and architecture as recognized by + include/tbb/tbb_machine.h and the Makefile infrastructure. +
      • This file defines the implementations of synchronization operations, and also the + scheduler yield function, for the operating system and architecture. +
      • Several examples of <os>_<architecture>.h files can be found in the + include/tbb/machine directory. +
          +
        • A minimal implementation defines the 4-byte and 8-byte compare-and-swap operations, + and the scheduler yield function. See include/tbb/machine/mac_ppc.h + for an example of a minimal implementation. +
        • More complex implementation examples can also be found in the + include/tbb/machine directory + that implement all the individual variants of synchronization operations that Intel TBB uses. + Such implementations are more verbose but may achieve better performance on a given architecture. +
        • In a given implementation, any synchronization operation that is not defined is implemented, by default, + in terms of 4-byte or 8-byte compare-and-swap. More operations can thus be added incrementally to increase + the performance of an implementation. +
        • In most cases, synchronization operations are implemented as inline assembly code; examples also exist, + (e.g., for Intel® Itanium® processors) that use out-of-line assembly code in *.s or *.asm files + (see the assembly code sub-directories in the src/tbb directory). +
        +
      +
    • Modify include/tbb/tbb_machine.h, if needed, to invoke the appropriate + <os>_<architecture>.h file in the include/tbb/machine directory. +
    +
  2. Add an implementation of DetectNumberOfWorkers() in src/tbb/tbb_misc.h, + that returns the number of cores found on the system in case it is not supported by the current implementation. + This is used to determine the default number of threads for the Intel TBB task scheduler. +
  3. Either properly define FillDynamicLinks for use in + src/tbb/cache_aligned_allocator.cpp, + or hardcode the allocator to be used. +
  4. Additional types might be required in the union defined in + include/tbb/aligned_space.h + to ensure proper alignment on your platform. +
  5. Changes may be required in include/tbb/tick_count.h + for systems that do not provide gettimeofday. +
+ +

To port the Makefile infrastructure:

+Modify the appropriate files in the Makefile infrastructure to add a new platform, operating system or architecture as needed. +See the Makefile infrastructure files for examples. +
    +
  1. The top-level Makefile includes common.inc to determine the operating system. +
      +
    • To add a new operating system, add the appropriate test to common.inc, and create the needed <os>.inc and <os>.<compiler>.inc files (see below). +
    +
  2. The <os>.inc file makes OS-specific settings for a particular operating systems. +
      +
    • For example, linux.inc makes settings specific to Linux operating systems. +
    • This file performs OS-dependent tests to determine the specific platform and/or architecture, and sets other platform-dependent values. +
    • Add a new <os>.inc file for each new operating system added. +
    +
  3. The <os>.<compiler>.inc file makes compiler-specific settings for a particular + <os> / <compiler> combination. +
      +
    • For example, linux.gcc.inc makes specific settings for using GCC on Linux OS, and linux.icc.inc makes specific settings for using the Intel® C++ compiler on Linux OS. +
    • This file sets particular compiler, assembler and linker options required when using a particular <os> / <compiler> combination. +
    • Add a new <os>.<compiler>.inc file for each new <os> / <compiler> combination added. +
    +
+ +
+Up to parent directory +

+Copyright © 2005-2018 Intel Corporation. All Rights Reserved. +

+Intel, the Intel logo and Itanium are trademarks of Intel Corporation or its subsidiaries in the U.S. and/or other countries. +

+* Other names and brands may be claimed as the property of others. + + diff --git a/xdl/third_party/tbb/build/ios.clang.inc b/xdl/third_party/tbb/build/ios.clang.inc new file mode 100644 index 00000000..6c810421 --- /dev/null +++ b/xdl/third_party/tbb/build/ios.clang.inc @@ -0,0 +1,23 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +include $(tbb_root)/build/macos.clang.inc + +CPLUS_FLAGS += -miphoneos-version-min=8.0 +LINK_FLAGS += -miphoneos-version-min=8.0 +LIB_LINK_FLAGS += -miphoneos-version-min=8.0 diff --git a/xdl/third_party/tbb/build/ios.macos.inc b/xdl/third_party/tbb/build/ios.macos.inc new file mode 100644 index 00000000..03308a05 --- /dev/null +++ b/xdl/third_party/tbb/build/ios.macos.inc @@ -0,0 +1,36 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +ifneq ($(arch),$(filter $(arch),ia32 intel64 armv7 armv7s arm64)) + $(error $(arch) is unknown architecture. Known arhitechtures are ia32 intel64 armv7 armv7s arm64) +endif + +# If target is ios but arch is ia32/intel64 then build for 32/64 simulator! +ifeq (,$(SDKROOT)) + ifeq ($(arch),$(filter $(arch),ia32 intel64)) + export SDKROOT:=$(shell xcodebuild -sdk -version | grep -o -E '/.*SDKs/iPhoneSimulator.*' 2>/dev/null) + else + export SDKROOT:=$(shell xcodebuild -sdk -version | grep -o -E '/.*SDKs/iPhoneOS.*' 2>/dev/null) + endif +endif +ifeq (,$(SDKROOT)) + $(error iOS* SDK not found) +endif + +ios_version:=$(shell echo $(SDKROOT) | sed -e "s/.*[a-z,A-Z]\(.*\).sdk/\1/") +runtime:=cc$(clang_version)_ios$(ios_version) diff --git a/xdl/third_party/tbb/build/linux.clang.inc b/xdl/third_party/tbb/build/linux.clang.inc new file mode 100644 index 00000000..065f1d3d --- /dev/null +++ b/xdl/third_party/tbb/build/linux.clang.inc @@ -0,0 +1,115 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +CPLUS ?= clang++ +CONLY ?= clang +COMPILE_ONLY = -c -MMD +PREPROC_ONLY = -E -x c++ +INCLUDE_KEY = -I +DEFINE_KEY = -D +OUTPUT_KEY = -o # +OUTPUTOBJ_KEY = -o # +PIC_KEY = -fPIC +WARNING_AS_ERROR_KEY = -Werror +WARNING_KEY = -Wall -Wextra +TEST_WARNING_KEY = -Wshadow -Wcast-qual -Woverloaded-virtual -Wnon-virtual-dtor +WARNING_SUPPRESS = -Wno-parentheses -Wno-non-virtual-dtor -Wno-dangling-else +DYLIB_KEY = -shared +EXPORT_KEY = -Wl,--version-script, +LIBDL = -ldl + +LIB_LINK_FLAGS = $(DYLIB_KEY) -Wl,-soname=$(BUILDING_LIBRARY) +LIBS += -lpthread -lrt +LINK_FLAGS = -Wl,-rpath-link=. -rdynamic +C_FLAGS = $(CPLUS_FLAGS) + +ifeq ($(cfg), release) + CPLUS_FLAGS = $(ITT_NOTIFY) -g -O2 -DUSE_PTHREAD +endif +ifeq ($(cfg), debug) + CPLUS_FLAGS = -DTBB_USE_DEBUG $(ITT_NOTIFY) -g -O0 -DUSE_PTHREAD +endif + +ifneq (,$(stdlib)) + CPLUS_FLAGS += -stdlib=$(stdlib) + LIB_LINK_FLAGS += -stdlib=$(stdlib) +endif + +ifneq (,$(gcc_version)) + # TODO: do not assume that GCC minor and patchlevel versions are always single-digit. + CPLUS_FLAGS += -DTBB_USE_GLIBCXX_VERSION=$(subst .,0,$(gcc_version)) +endif + +TBB_ASM.OBJ= +MALLOC_ASM.OBJ= + +ifeq (intel64,$(arch)) + ITT_NOTIFY = -DDO_ITT_NOTIFY + CPLUS_FLAGS += -m64 + LIB_LINK_FLAGS += -m64 +endif + +ifeq (ia32,$(arch)) + ITT_NOTIFY = -DDO_ITT_NOTIFY + CPLUS_FLAGS += -m32 -march=pentium4 + LIB_LINK_FLAGS += -m32 +endif + +ifeq (ppc64,$(arch)) + CPLUS_FLAGS += -m64 + LIB_LINK_FLAGS += -m64 +endif + +ifeq (ppc32,$(arch)) + CPLUS_FLAGS += -m32 + LIB_LINK_FLAGS += -m32 +endif + +ifeq (bg,$(arch)) + CPLUS = bgclang++ + CONLY = bgclang +endif + +#------------------------------------------------------------------------------ +# Setting assembler data. +#------------------------------------------------------------------------------ +ASM = as +ifeq (intel64,$(arch)) + ASM_FLAGS += --64 +endif +ifeq (ia32,$(arch)) + ASM_FLAGS += --32 +endif +ifeq ($(cfg),debug) + ASM_FLAGS += -g +endif + +ASSEMBLY_SOURCE=$(arch)-gas +#------------------------------------------------------------------------------ +# End of setting assembler data. +#------------------------------------------------------------------------------ + +#------------------------------------------------------------------------------ +# Setting tbbmalloc data. +#------------------------------------------------------------------------------ + +M_CPLUS_FLAGS = $(CPLUS_FLAGS) -fno-rtti -fno-exceptions + +#------------------------------------------------------------------------------ +# End of setting tbbmalloc data. +#------------------------------------------------------------------------------ diff --git a/xdl/third_party/tbb/build/linux.gcc.inc b/xdl/third_party/tbb/build/linux.gcc.inc new file mode 100644 index 00000000..36936767 --- /dev/null +++ b/xdl/third_party/tbb/build/linux.gcc.inc @@ -0,0 +1,156 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +CPLUS ?= g++ +CONLY ?= gcc +COMPILE_ONLY = -c -MMD +PREPROC_ONLY = -E -x c++ +INCLUDE_KEY = -I +DEFINE_KEY = -D +OUTPUT_KEY = -o # +OUTPUTOBJ_KEY = -o # +PIC_KEY = -fPIC +WARNING_AS_ERROR_KEY = -Werror +WARNING_KEY = -Wall +TEST_WARNING_KEY = -Wshadow -Wcast-qual -Woverloaded-virtual -Wnon-virtual-dtor + +WARNING_SUPPRESS = -Wno-parentheses +DYLIB_KEY = -shared +EXPORT_KEY = -Wl,--version-script, +LIBDL = -ldl + +LIB_LINK_FLAGS = $(DYLIB_KEY) -Wl,-soname=$(BUILDING_LIBRARY) +LIBS += -lpthread -lrt +LINK_FLAGS = -Wl,-rpath-link=. -rdynamic +C_FLAGS = $(CPLUS_FLAGS) + +# gcc 4.2 and higher support OpenMP +ifneq (,$(shell $(CONLY) -dumpversion | egrep "^(4\.[2-9]|[5-9])")) + OPENMP_FLAG = -fopenmp +endif + +# gcc 4.8 and later support RTM intrinsics, but require command line switch to enable them +ifneq (,$(shell $(CONLY) -dumpversion | egrep "^(4\.[8-9]|[5-9])")) + RTM_KEY = -mrtm +endif + +# gcc 4.0 and later have -Wextra that is used by some our customers. +ifneq (,$(shell $(CONLY) -dumpversion | egrep "^([4-9])")) + WARNING_KEY += -Wextra +endif + +# gcc 5.0 and later have -Wsuggest-override and -Wno-sized-deallocation options +ifneq (,$(shell $(CONLY) -dumpversion | egrep "^([5-9])")) + # enable -Wsuggest-override via a pre-included header in order to limit to C++11 and above + INCLUDE_TEST_HEADERS = -include $(tbb_root)/src/test/harness_preload.h + WARNING_SUPPRESS += -Wno-sized-deallocation +endif + +# gcc 6.0 and later have -flifetime-dse option that controls +# elimination of stores done outside the object lifetime +ifneq (,$(shell $(CONLY) -dumpversion | egrep "^([6-9])")) + # keep pre-contruction stores for zero initialization + DSE_KEY = -flifetime-dse=1 +endif + +ifeq ($(cfg), release) + CPLUS_FLAGS = $(ITT_NOTIFY) -g -O2 -DUSE_PTHREAD +endif +ifeq ($(cfg), debug) + CPLUS_FLAGS = -DTBB_USE_DEBUG $(ITT_NOTIFY) -g -O0 -DUSE_PTHREAD +endif + +TBB_ASM.OBJ= +MALLOC_ASM.OBJ= + +ifeq (ia64,$(arch)) +# Position-independent code (PIC) is a must on IA-64 architecture, even for regular (not shared) executables + CPLUS_FLAGS += $(PIC_KEY) +endif + +ifeq (intel64,$(arch)) + ITT_NOTIFY = -DDO_ITT_NOTIFY + CPLUS_FLAGS += -m64 $(RTM_KEY) + LIB_LINK_FLAGS += -m64 +endif + +ifeq (ia32,$(arch)) + ITT_NOTIFY = -DDO_ITT_NOTIFY + CPLUS_FLAGS += -m32 -march=pentium4 $(RTM_KEY) + LIB_LINK_FLAGS += -m32 +endif + +ifeq (ppc64,$(arch)) + CPLUS_FLAGS += -m64 + LIB_LINK_FLAGS += -m64 +endif + +ifeq (ppc32,$(arch)) + CPLUS_FLAGS += -m32 + LIB_LINK_FLAGS += -m32 +endif + +ifeq (bg,$(arch)) + CPLUS = $(firstword $(notdir $(shell which powerpc{64,32,}-bg{z..a}-linux-g++ 2>/dev/null))) + CONLY = $(firstword $(notdir $(shell which powerpc{64,32,}-bg{z..a}-linux-gcc 2>/dev/null))) +endif + +# for some gcc versions on Solaris, -m64 may imply V9, but perhaps not everywhere (TODO: verify) +ifeq (sparc,$(arch)) + CPLUS_FLAGS += -mcpu=v9 -m64 + LIB_LINK_FLAGS += -mcpu=v9 -m64 +endif + +# automatically generate "IT" instructions when compiling for Thumb ISA +ifeq (armv7,$(arch)) + CPLUS_FLAGS += -Wa,-mimplicit-it=thumb +endif + +#------------------------------------------------------------------------------ +# Setting assembler data. +#------------------------------------------------------------------------------ +ASM = as +ifeq (intel64,$(arch)) + ASM_FLAGS += --64 +endif +ifeq (ia32,$(arch)) + ASM_FLAGS += --32 +endif +ifeq ($(cfg),debug) + ASM_FLAGS += -g +endif + +ASSEMBLY_SOURCE=$(arch)-gas +ifeq (ia64,$(arch)) + ASM_FLAGS += -xexplicit + TBB_ASM.OBJ += atomic_support.o lock_byte.o log2.o pause.o ia64_misc.o + MALLOC_ASM.OBJ += atomic_support.o lock_byte.o pause.o log2.o +endif +#------------------------------------------------------------------------------ +# End of setting assembler data. +#------------------------------------------------------------------------------ + +#------------------------------------------------------------------------------ +# Setting tbbmalloc data. +#------------------------------------------------------------------------------ + +M_CPLUS_FLAGS = $(CPLUS_FLAGS) -fno-rtti -fno-exceptions + +#------------------------------------------------------------------------------ +# End of setting tbbmalloc data. +#------------------------------------------------------------------------------ diff --git a/xdl/third_party/tbb/build/linux.icc.inc b/xdl/third_party/tbb/build/linux.icc.inc new file mode 100644 index 00000000..4731f963 --- /dev/null +++ b/xdl/third_party/tbb/build/linux.icc.inc @@ -0,0 +1,119 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +CPLUS ?= icpc +CONLY ?= icc +COMPILE_ONLY = -c -MMD +PREPROC_ONLY = -E -x c++ +INCLUDE_KEY = -I +DEFINE_KEY = -D +OUTPUT_KEY = -o # +OUTPUTOBJ_KEY = -o # +PIC_KEY = -fPIC +WARNING_AS_ERROR_KEY = -Werror +WARNING_KEY = -w1 +DYLIB_KEY = -shared +EXPORT_KEY = -Wl,--version-script, +NOINTRINSIC_KEY = -fno-builtin +LIBDL = -ldl +ifneq (,$(shell icc -dumpversion | egrep "1[2-9]\.")) +SDL_FLAGS = -fstack-protector -Wformat -Wformat-security +endif + +ITT_NOTIFY = -DDO_ITT_NOTIFY +ifeq (release,$(cfg)) +SDL_FLAGS += -D_FORTIFY_SOURCE=2 +CPLUS_FLAGS = $(ITT_NOTIFY) -O2 -g -DUSE_PTHREAD +else +CPLUS_FLAGS = $(ITT_NOTIFY) -O0 -g -DUSE_PTHREAD -DTBB_USE_DEBUG +endif + +LIB_LINK_FLAGS = -shared -static-intel -Wl,-soname=$(BUILDING_LIBRARY) -z relro -z now +LIBS += -lpthread -lrt +LINK_FLAGS = -rdynamic +C_FLAGS = $(CPLUS_FLAGS) + +ifneq (,$(shell icc -dumpversion | egrep "^1[6-9]\.")) +OPENMP_FLAG = -qopenmp +else +OPENMP_FLAG = -openmp +endif + +# ICC 12.0 and higher provide Intel(R) Cilk(TM) Plus +ifneq (,$(shell icc -dumpversion | egrep "^1[2-9]\.")) + CILK_AVAILABLE = yes +endif + +TBB_ASM.OBJ= +MALLOC_ASM.OBJ= + +ifeq (ia32,$(arch)) + CPLUS_FLAGS += -m32 -falign-stack=maintain-16-byte + LIB_LINK_FLAGS += -m32 +endif + +ifeq (ia64,$(arch)) + ITT_NOTIFY = +# Position-independent code (PIC) is a must on IA-64 architecture, even for regular (not shared) executables +# strict-ansi does not work with on RHEL 4 AS + CPLUS_FLAGS += $(PIC_KEY) $(if $(findstring cc3.,$(runtime)),-ansi,-strict-ansi) +else +# For ICC 16 and older, in std=c++14 mode -strict-ansi does not work with GNU C++ library headers +# egrep returns 0 or 1, compare it in concatenation + CPLUS_FLAGS += $(if $(findstring c++14_1,$(stdver)_$(shell icc -dumpversion| egrep -c "^1[1-6]\.")),-ansi,-strict-ansi) +endif + +ifneq (,$(codecov)) +# no tool support for code coverage, need profile data generation + ITT_NOTIFY = -prof-gen=srcpos +endif + +#------------------------------------------------------------------------------ +# Setting assembler data. +#------------------------------------------------------------------------------ +ASM = as +ifeq (intel64,$(arch)) + ASM_FLAGS += --64 +endif +ifeq (ia32,$(arch)) + ASM_FLAGS += --32 +endif +ifeq ($(cfg),debug) + ASM_FLAGS += -g +endif + +ASSEMBLY_SOURCE=$(arch)-gas +ifeq (ia64,$(arch)) + ASM_FLAGS += -xexplicit + TBB_ASM.OBJ += atomic_support.o lock_byte.o log2.o pause.o ia64_misc.o + MALLOC_ASM.OBJ += atomic_support.o lock_byte.o pause.o log2.o +endif +#------------------------------------------------------------------------------ +# End of setting assembler data. +#------------------------------------------------------------------------------ + +#------------------------------------------------------------------------------ +# Setting tbbmalloc data. +#------------------------------------------------------------------------------ + +M_CPLUS_FLAGS = $(CPLUS_FLAGS) -fno-rtti -fno-exceptions + +#------------------------------------------------------------------------------ +# End of setting tbbmalloc data. +#------------------------------------------------------------------------------ + diff --git a/xdl/third_party/tbb/build/linux.inc b/xdl/third_party/tbb/build/linux.inc new file mode 100644 index 00000000..8e58f1ee --- /dev/null +++ b/xdl/third_party/tbb/build/linux.inc @@ -0,0 +1,142 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +####### Detections and Commands ############################################### + +ifeq (icc,$(compiler)) + export COMPILER_VERSION := ICC: $(shell icc -V &1 | grep 'Version') + ifneq (,$(findstring running on IA-32, $(COMPILER_VERSION))) + export arch:=ia32 + else + ifneq (,$(findstring running on Intel(R) 64, $(COMPILER_VERSION))) + export arch:=intel64 + else + ifneq (,$(findstring IA-64, $(COMPILER_VERSION))) + export arch:=ia64 + endif + endif + endif + ifeq (,$(arch)) + $(warning "Unknown Intel compiler") + endif +endif + +ifndef arch + uname_m:=$(shell uname -m) + ifeq ($(uname_m),i686) + export arch:=ia32 + endif + ifeq ($(uname_m),ia64) + export arch:=ia64 + endif + ifeq ($(uname_m),x86_64) + export arch:=intel64 + endif + ifeq ($(uname_m),sparc64) + export arch:=sparc + endif + ifeq ($(uname_m),armv7l) + export arch:=armv7 + endif + ifndef arch + export arch:=$(uname_m) + endif +endif + +ifndef runtime + export gcc_version:=$(shell gcc -dumpversion) + os_version:=$(shell uname -r) + os_kernel_version:=$(shell uname -r | sed -e 's/-.*$$//') + export os_glibc_version_full:=$(shell getconf GNU_LIBC_VERSION | grep glibc | sed -e 's/^glibc //') + os_glibc_version:=$(shell echo "$(os_glibc_version_full)" | sed -e '2,$$d' -e 's/-.*$$//') + export runtime:=cc$(gcc_version)_libc$(os_glibc_version)_kernel$(os_kernel_version) +endif + +native_compiler := gcc +export compiler ?= gcc +debugger ?= gdb + +CMD=sh -c +CWD=$(shell pwd) +CP=cp +RM?=rm -f +RD?=rmdir +MD?=mkdir -p +NUL= /dev/null +SLASH=/ +MAKE_VERSIONS=sh $(tbb_root)/build/version_info_linux.sh $(VERSION_FLAGS) >version_string.ver +MAKE_TBBVARS=sh $(tbb_root)/build/generate_tbbvars.sh + +ifdef LD_LIBRARY_PATH + export LD_LIBRARY_PATH := .:$(LD_LIBRARY_PATH) +else + export LD_LIBRARY_PATH := . +endif + +####### Build settings ######################################################## + +OBJ = o +DLL = so +MALLOC_DLL?=$(DLL) +LIBEXT = so +SONAME_SUFFIX =$(shell grep TBB_COMPATIBLE_INTERFACE_VERSION $(tbb_root)/include/tbb/tbb_stddef.h | egrep -o [0-9.]+) + +ifeq ($(arch),ia64) + def_prefix = lin64ipf +endif +ifneq (,$(findstring $(arch),sparc s390x)) + def_prefix = lin64 +endif +ifeq ($(arch),armv7) + def_prefix = lin32 +endif +ifeq (,$(def_prefix)) + ifeq (64,$(findstring 64,$(arch))) + def_prefix = lin64 + else + def_prefix = lin32 + endif +endif +TBB.LST = $(tbb_root)/src/tbb/$(def_prefix)-tbb-export.lst +TBB.DEF = $(TBB.LST:.lst=.def) + +TBB.DLL = $(TBB_NO_VERSION.DLL).$(SONAME_SUFFIX) +TBB.LIB = $(TBB.DLL) +TBB_NO_VERSION.DLL=libtbb$(CPF_SUFFIX)$(DEBUG_SUFFIX).$(DLL) +LINK_TBB.LIB = $(TBB_NO_VERSION.DLL) + +MALLOC_NO_VERSION.DLL = libtbbmalloc$(DEBUG_SUFFIX).$(MALLOC_DLL) +MALLOC.DEF = $(MALLOC_ROOT)/$(def_prefix)-tbbmalloc-export.def +MALLOC.DLL = $(MALLOC_NO_VERSION.DLL).$(SONAME_SUFFIX) +MALLOC.LIB = $(MALLOC_NO_VERSION.DLL) +LINK_MALLOC.LIB = $(MALLOC_NO_VERSION.DLL) + +MALLOCPROXY_NO_VERSION.DLL = libtbbmalloc_proxy$(DEBUG_SUFFIX).$(DLL) +MALLOCPROXY.DEF = $(MALLOC_ROOT)/$(def_prefix)-proxy-export.def +MALLOCPROXY.DLL = $(MALLOCPROXY_NO_VERSION.DLL).$(SONAME_SUFFIX) +MALLOCPROXY.LIB = $(MALLOCPROXY_NO_VERSION.DLL) +LINK_MALLOCPROXY.LIB = $(MALLOCPROXY.LIB) + +RML_NO_VERSION.DLL = libirml$(DEBUG_SUFFIX).$(DLL) +RML.DEF = $(RML_SERVER_ROOT)/lin-rml-export.def +RML.DLL = $(RML_NO_VERSION.DLL).1 +RML.LIB = $(RML_NO_VERSION.DLL) + +TEST_LAUNCHER=sh $(tbb_root)/build/test_launcher.sh $(largs) + +OPENCL.LIB = -lOpenCL diff --git a/xdl/third_party/tbb/build/linux.pathcc.inc b/xdl/third_party/tbb/build/linux.pathcc.inc new file mode 100644 index 00000000..d2693c1d --- /dev/null +++ b/xdl/third_party/tbb/build/linux.pathcc.inc @@ -0,0 +1,93 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +CPLUS ?= pathCC +CONLY ?= pathcc +COMPILE_ONLY = -c -MMD +PREPROC_ONLY = -E -x c++ +INCLUDE_KEY = -I +DEFINE_KEY = -D +OUTPUT_KEY = -o # +OUTPUTOBJ_KEY = -o # +PIC_KEY = -fPIC +WARNING_AS_ERROR_KEY = -Werror +WARNING_KEY = -Wall +TEST_WARNING_KEY = -Wshadow -Wcast-qual -Woverloaded-virtual -Wnon-virtual-dtor -Wextra + +WARNING_SUPPRESS = -Wno-parentheses -Wno-non-virtual-dtor +DYLIB_KEY = -shared +EXPORT_KEY = -Wl,--version-script, +LIBDL = -ldl + +LIB_LINK_FLAGS = $(DYLIB_KEY) -Wl,-soname=$(BUILDING_LIBRARY) +LIBS += -lstl -lpthread -lrt +LINK_FLAGS = -Wl,-rpath-link=. -rdynamic +C_FLAGS = $(CPLUS_FLAGS) + +OPENMP_FLAG = -openmp + +ifeq ($(cfg), release) + CPLUS_FLAGS = $(ITT_NOTIFY) -g -O2 -DUSE_PTHREAD +endif +ifeq ($(cfg), debug) + CPLUS_FLAGS = -DTBB_USE_DEBUG $(ITT_NOTIFY) -g -O0 -DUSE_PTHREAD +endif + +TBB_ASM.OBJ= +MALLOC_ASM.OBJ= + +ifeq (intel64,$(arch)) + ITT_NOTIFY = -DDO_ITT_NOTIFY + CPLUS_FLAGS += -m64 + LIB_LINK_FLAGS += -m64 +endif + +ifeq (ia32,$(arch)) + ITT_NOTIFY = -DDO_ITT_NOTIFY + CPLUS_FLAGS += -m32 -march=pentium4 + LIB_LINK_FLAGS += -m32 +endif + +#------------------------------------------------------------------------------ +# Setting assembler data. +#------------------------------------------------------------------------------ +ASM = as +ifeq (intel64,$(arch)) + ASM_FLAGS += --64 +endif +ifeq (ia32,$(arch)) + ASM_FLAGS += --32 +endif +ifeq ($(cfg),debug) + ASM_FLAGS += -g +endif + +ASSEMBLY_SOURCE=$(arch)-gas +#------------------------------------------------------------------------------ +# End of setting assembler data. +#------------------------------------------------------------------------------ + +#------------------------------------------------------------------------------ +# Setting tbbmalloc data. +#------------------------------------------------------------------------------ + +M_CPLUS_FLAGS = $(CPLUS_FLAGS) -fno-rtti -fno-exceptions + +#------------------------------------------------------------------------------ +# End of setting tbbmalloc data. +#------------------------------------------------------------------------------ diff --git a/xdl/third_party/tbb/build/linux.xl.inc b/xdl/third_party/tbb/build/linux.xl.inc new file mode 100644 index 00000000..dcec5a64 --- /dev/null +++ b/xdl/third_party/tbb/build/linux.xl.inc @@ -0,0 +1,104 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +####### Detections and Commands ############################################### + +CPLUS ?= xlc++_r +CONLY ?= xlc_r +COMPILE_ONLY = -c +PREPROC_ONLY = -E -qsourcetype=c +INCLUDE_KEY = -I +DEFINE_KEY = -D +OUTPUT_KEY = -o # +OUTPUTOBJ_KEY = -o # +PIC_KEY = -qpic +WARNING_AS_ERROR_KEY = -qhalt=w +WARNING_KEY = +TEST_WARNING_KEY = + +WARNING_SUPPRESS = +DYLIB_KEY = -qmkshrobj +EXPORT_KEY = -Wl,--version-script, +LIBDL = -ldl + +LIB_LINK_FLAGS = $(DYLIB_KEY) -Wl,-soname=$(BUILDING_LIBRARY) +LIBS = -lpthread -lrt +C_FLAGS = $(CPLUS_FLAGS) + +ifeq ($(cfg), release) + CPLUS_FLAGS = $(ITT_NOTIFY) -O2 -DUSE_PTHREAD +endif +ifeq ($(cfg), debug) + CPLUS_FLAGS = -DTBB_USE_DEBUG $(ITT_NOTIFY) -g -O0 -DUSE_PTHREAD +endif + +# Adding directly to CPLUS_FLAGS instead of to WARNING_SUPPRESS because otherwise it would not be used in several tests (why not?). +# Suppress warnings like: +# - "1500-029: (W) WARNING: subprogram [...] could not be inlined into [...]." +# - "1501-201: (W) Maximum number of common component diagnostics, 10 has been exceeded." +# see http://www-01.ibm.com/support/docview.wss?uid=swg1LI72843 +# it seems that the internal compiler error that would ensue has now been avoided, making the condition harmless +# - "1540-0198 (W) The omitted keyword "private" is assumed for base class "no_copy"." +# - "1540-0822 (W) The name "__FUNCTION__" must not be defined as a macro." +CPLUS_FLAGS += -qsuppress=1500-029:1501-201:1540-0198:1540-0822 + +ASM= +ASM_FLAGS= + +TBB_ASM.OBJ= + +ifeq (intel64,$(arch)) + ITT_NOTIFY = -DDO_ITT_NOTIFY + CPLUS_FLAGS += -q64 + LIB_LINK_FLAGS += -q64 +endif + +# TODO: equivalent for -march=pentium4 in CPLUS_FLAGS +ifeq (ia32,$(arch)) + ITT_NOTIFY = -DDO_ITT_NOTIFY + CPLUS_FLAGS += -q32 -qarch=pentium4 + LIB_LINK_FLAGS += -q32 +endif + +ifeq (ppc64,$(arch)) + CPLUS_FLAGS += -q64 + LIB_LINK_FLAGS += -q64 +endif + +ifeq (ppc32,$(arch)) + CPLUS_FLAGS += -q32 + LIB_LINK_FLAGS += -q32 +endif + +ifeq (bg,$(arch)) + CPLUS = bgxlC_r + CONLY = bgxlc_r +endif + +#------------------------------------------------------------------------------ +# Setting tbbmalloc data. +#------------------------------------------------------------------------------ + +# Suppress innumerable warnings like "1540-1088 (W) The exception specification is being ignored." +# Suppress warnings like "1540-1090 (I) The destructor of "lock" might not be called." +# TODO: aren't these warnings an indication that -qnoeh might not be appropriate? +M_CPLUS_FLAGS = $(CPLUS_FLAGS) -qnortti -qnoeh -qsuppress=1540-1088:1540-1090 + +#------------------------------------------------------------------------------ +# End of setting tbbmalloc data. +#------------------------------------------------------------------------------ diff --git a/xdl/third_party/tbb/build/macos.clang.inc b/xdl/third_party/tbb/build/macos.clang.inc new file mode 100644 index 00000000..23a4288d --- /dev/null +++ b/xdl/third_party/tbb/build/macos.clang.inc @@ -0,0 +1,125 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +CPLUS ?= clang++ +CONLY ?= clang +COMPILE_ONLY = -c -MMD +PREPROC_ONLY = -E -x c++ +INCLUDE_KEY = -I +DEFINE_KEY = -D +OUTPUT_KEY = -o # +OUTPUTOBJ_KEY = -o # +PIC_KEY = -fPIC +WARNING_AS_ERROR_KEY = -Werror +WARNING_KEY = -Wall +TEST_WARNING_KEY = -Wextra -Wshadow -Wcast-qual -Woverloaded-virtual -Wnon-virtual-dtor +WARNING_SUPPRESS = -Wno-non-virtual-dtor -Wno-dangling-else +DYLIB_KEY = -dynamiclib +EXPORT_KEY = -Wl,-exported_symbols_list, +LIBDL = -ldl + +LIBS = -lpthread +LINK_FLAGS = +LIB_LINK_FLAGS = -dynamiclib -install_name @rpath/$(BUILDING_LIBRARY) +C_FLAGS = $(CPLUS_FLAGS) + +ifeq ($(cfg), release) + CPLUS_FLAGS = -g -O2 +else + CPLUS_FLAGS = -g -O0 -DTBB_USE_DEBUG +endif + +CPLUS_FLAGS += -DUSE_PTHREAD $(ITT_NOTIFY) + +# For Clang, we add the option to support RTM intrinsics *iff* xtest is found in +ifneq (,$(shell grep xtest `echo "\#include" | $(CONLY) -E -M - 2>&1 | grep immintrin.h` 2>/dev/null)) + RTM_KEY = -mrtm +endif + +ifneq (,$(stdlib)) + CPLUS_FLAGS += -stdlib=$(stdlib) + LIB_LINK_FLAGS += -stdlib=$(stdlib) +endif + +ifeq (intel64,$(arch)) + ITT_NOTIFY = -DDO_ITT_NOTIFY + CPLUS_FLAGS += -m64 $(RTM_KEY) + LINK_FLAGS += -m64 + LIB_LINK_FLAGS += -m64 +endif + +ifeq (ia32,$(arch)) + ITT_NOTIFY = -DDO_ITT_NOTIFY + CPLUS_FLAGS += -m32 $(RTM_KEY) + LINK_FLAGS += -m32 + LIB_LINK_FLAGS += -m32 +endif + +ifeq (ppc64,$(arch)) + CPLUS_FLAGS += -arch ppc64 + LINK_FLAGS += -arch ppc64 + LIB_LINK_FLAGS += -arch ppc64 +endif + +ifeq (ppc32,$(arch)) + CPLUS_FLAGS += -arch ppc + LINK_FLAGS += -arch ppc + LIB_LINK_FLAGS += -arch ppc +endif + +ifeq ($(arch),$(filter $(arch),armv7 armv7s arm64)) + CPLUS_FLAGS += -arch $(arch) + LINK_FLAGS += -arch $(arch) + LIB_LINK_FLAGS += -arch $(arch) +endif + +ifdef SDKROOT + CPLUS_FLAGS += -isysroot $(SDKROOT) + LINK_FLAGS += -L$(SDKROOT)/usr/lib/system -L$(SDKROOT)/usr/lib/ + LIB_LINK_FLAGS += -L$(SDKROOT)/usr/lib/system -L$(SDKROOT)/usr/lib/ +endif + +#------------------------------------------------------------------------------ +# Setting assembler data. +#------------------------------------------------------------------------------ + +ASM = as +ifeq (intel64,$(arch)) + ASM_FLAGS += -arch x86_64 +endif +ifeq (ia32,$(arch)) + ASM_FLAGS += -arch i386 +endif +ifeq ($(cfg), debug) + ASM_FLAGS += -g +endif + +#------------------------------------------------------------------------------ +# End of setting assembler data. +#------------------------------------------------------------------------------ + +#------------------------------------------------------------------------------ +# Setting tbbmalloc data. +#------------------------------------------------------------------------------ + +M_CPLUS_FLAGS = $(CPLUS_FLAGS) -fno-rtti -fno-exceptions + +#------------------------------------------------------------------------------ +# End of setting tbbmalloc data. +#------------------------------------------------------------------------------ + diff --git a/xdl/third_party/tbb/build/macos.gcc.inc b/xdl/third_party/tbb/build/macos.gcc.inc new file mode 100644 index 00000000..5df569d5 --- /dev/null +++ b/xdl/third_party/tbb/build/macos.gcc.inc @@ -0,0 +1,132 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +CPLUS ?= g++ +CONLY ?= gcc +COMPILE_ONLY = -c -MMD +PREPROC_ONLY = -E -x c++ +INCLUDE_KEY = -I +DEFINE_KEY = -D +OUTPUT_KEY = -o # +OUTPUTOBJ_KEY = -o # +PIC_KEY = -fPIC +WARNING_AS_ERROR_KEY = -Werror +WARNING_KEY = -Wall +TEST_WARNING_KEY = -Wextra -Wshadow -Wcast-qual -Woverloaded-virtual -Wnon-virtual-dtor +WARNING_SUPPRESS = -Wno-non-virtual-dtor +DYLIB_KEY = -dynamiclib +EXPORT_KEY = -Wl,-exported_symbols_list, +LIBDL = -ldl + +LIBS = -lpthread +LINK_FLAGS = +LIB_LINK_FLAGS = -dynamiclib -install_name @rpath/$(BUILDING_LIBRARY) +C_FLAGS = $(CPLUS_FLAGS) + +# gcc 4.8 and later support RTM intrinsics, but require command line switch to enable them +ifneq (,$(shell $(CONLY) -dumpversion | egrep "^(4\.[8-9]|[5-9])")) + RTM_KEY = -mrtm +endif + +# gcc 5.0 and later have -Wsuggest-override option +# enable it via a pre-included header in order to limit to C++11 and above +ifneq (,$(shell $(CONLY) -dumpversion | egrep "^([5-9])")) + INCLUDE_TEST_HEADERS = -include $(tbb_root)/src/test/harness_preload.h +endif + +# gcc 6.0 and later have -flifetime-dse option that controls +# elimination of stores done outside the object lifetime +ifneq (,$(shell $(CONLY) -dumpversion | egrep "^([6-9])")) + # keep pre-contruction stores for zero initialization + DSE_KEY = -flifetime-dse=1 +endif + +ifeq ($(cfg), release) + CPLUS_FLAGS = -g -O2 +else + CPLUS_FLAGS = -g -O0 -DTBB_USE_DEBUG +endif + +CPLUS_FLAGS += -DUSE_PTHREAD $(ITT_NOTIFY) + +ifeq (intel64,$(arch)) + ITT_NOTIFY = -DDO_ITT_NOTIFY + CPLUS_FLAGS += -m64 + LINK_FLAGS += -m64 + LIB_LINK_FLAGS += -m64 +endif + +ifeq (ia32,$(arch)) + ITT_NOTIFY = -DDO_ITT_NOTIFY + CPLUS_FLAGS += -m32 + LINK_FLAGS += -m32 + LIB_LINK_FLAGS += -m32 +endif + +ifeq (ppc64,$(arch)) + CPLUS_FLAGS += -arch ppc64 + LINK_FLAGS += -arch ppc64 + LIB_LINK_FLAGS += -arch ppc64 +endif + +ifeq (ppc32,$(arch)) + CPLUS_FLAGS += -arch ppc + LINK_FLAGS += -arch ppc + LIB_LINK_FLAGS += -arch ppc +endif + +ifeq (armv7,$(arch)) + CPLUS_FLAGS += -arch armv7 + LINK_FLAGS += -arch armv7 + LIB_LINK_FLAGS += -arch armv7 +endif + +ifdef SDKROOT + CPLUS_FLAGS += -isysroot $(SDKROOT) + LIB_LINK_FLAGS += -L$(SDKROOT)/usr/lib/system -L$(SDKROOT)/usr/lib/ +endif + +#------------------------------------------------------------------------------ +# Setting assembler data. +#------------------------------------------------------------------------------ + +ASM = as +ifeq (intel64,$(arch)) + ASM_FLAGS += -arch x86_64 +endif +ifeq (ia32,$(arch)) + ASM_FLAGS += -arch i386 +endif +ifeq ($(cfg), debug) + ASM_FLAGS += -g +endif + +#------------------------------------------------------------------------------ +# End of setting assembler data. +#------------------------------------------------------------------------------ + +#------------------------------------------------------------------------------ +# Setting tbbmalloc data. +#------------------------------------------------------------------------------ + +M_CPLUS_FLAGS = $(CPLUS_FLAGS) -fno-rtti -fno-exceptions + +#------------------------------------------------------------------------------ +# End of setting tbbmalloc data. +#------------------------------------------------------------------------------ + diff --git a/xdl/third_party/tbb/build/macos.icc.inc b/xdl/third_party/tbb/build/macos.icc.inc new file mode 100644 index 00000000..aa7d3324 --- /dev/null +++ b/xdl/third_party/tbb/build/macos.icc.inc @@ -0,0 +1,107 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +CPLUS ?= icpc +CONLY ?= icc +COMPILE_ONLY = -c -MMD +PREPROC_ONLY = -E -x c++ +INCLUDE_KEY = -I +DEFINE_KEY = -D +OUTPUT_KEY = -o # +OUTPUTOBJ_KEY = -o # +PIC_KEY = -fPIC +WARNING_AS_ERROR_KEY = -Werror +WARNING_KEY = -w1 +ifneq (,$(shell icc -dumpversion | egrep "1[2-9]\.")) +SDL_FLAGS = -fstack-protector -Wformat -Wformat-security +endif + +DYLIB_KEY = -dynamiclib +EXPORT_KEY = -Wl,-exported_symbols_list, +LIBDL = -ldl + +LIBS = -lpthread +LINK_FLAGS = +LIB_LINK_FLAGS = -dynamiclib -static-intel -install_name @rpath/$(BUILDING_LIBRARY) +C_FLAGS = $(CPLUS_FLAGS) + +ifneq (,$(shell icc -dumpversion | egrep "^1[6-9]\.")) +OPENMP_FLAG = -qopenmp +else +OPENMP_FLAG = -openmp +endif + +# ICC 12.0 and higher provide Intel(R) Cilk(TM) Plus +ifneq (,$(shell icc -dumpversion | egrep "^1[2-9]\.")) + CILK_AVAILABLE = yes +endif + +ifeq ($(cfg), release) + SDL_FLAGS += -D_FORTIFY_SOURCE=2 + CPLUS_FLAGS = -g -O2 -fno-omit-frame-pointer +else + CPLUS_FLAGS = -g -O0 -DTBB_USE_DEBUG +endif + +ITT_NOTIFY = -DDO_ITT_NOTIFY +CPLUS_FLAGS += -DUSE_PTHREAD $(ITT_NOTIFY) + +ifneq (,$(codecov)) + CPLUS_FLAGS += -prof-gen=srcpos +endif + +# ICC 14.0 and higher support usage of libc++, clang standard library +MACOSX_DEPLOYMENT_TARGET ?= 10.11 +ifneq (,$(shell icc -dumpversion | egrep "^1[4-9]\.")) +ifneq (,$(stdlib)) + CPLUS_FLAGS += -stdlib=$(stdlib) -mmacosx-version-min=$(MACOSX_DEPLOYMENT_TARGET) + LIB_LINK_FLAGS += -stdlib=$(stdlib) -mmacosx-version-min=$(MACOSX_DEPLOYMENT_TARGET) +endif +endif + +#------------------------------------------------------------------------------ +# Setting assembler data. +#------------------------------------------------------------------------------ + +ASM = as +ifeq (intel64,$(arch)) + ASM_FLAGS += -arch x86_64 +endif +ifeq (ia32,$(arch)) + CPLUS_FLAGS += -m32 + LINK_FLAGS += -m32 + LIB_LINK_FLAGS += -m32 + ASM_FLAGS += -arch i386 +endif +ifeq ($(cfg), debug) + ASM_FLAGS += -g +endif + +#------------------------------------------------------------------------------ +# End of setting assembler data. +#------------------------------------------------------------------------------ + +#------------------------------------------------------------------------------ +# Setting tbbmalloc data. +#------------------------------------------------------------------------------ + +M_CPLUS_FLAGS = $(CPLUS_FLAGS) -fno-rtti -fno-exceptions + +#------------------------------------------------------------------------------ +# End of setting tbbmalloc data. +#------------------------------------------------------------------------------ diff --git a/xdl/third_party/tbb/build/macos.inc b/xdl/third_party/tbb/build/macos.inc new file mode 100644 index 00000000..c219e574 --- /dev/null +++ b/xdl/third_party/tbb/build/macos.inc @@ -0,0 +1,107 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +####### Detections and Commands ############################################### + +ifeq (icc,$(compiler)) + export COMPILER_VERSION := ICC: $(shell icc -V &1 | grep 'Version') + ifneq (,$(findstring running on IA-32, $(COMPILER_VERSION))) + export arch:=ia32 + else + ifneq (,$(findstring running on Intel(R) 64, $(COMPILER_VERSION))) + export arch:=intel64 + endif + endif + ifeq (,$(arch)) + $(warning "Unknown Intel compiler") + endif +endif + +ifndef arch + ifeq ($(shell /usr/sbin/sysctl -n hw.machine),Power Macintosh) + ifeq ($(shell /usr/sbin/sysctl -n hw.optional.64bitops),1) + export arch:=ppc64 + else + export arch:=ppc32 + endif + else + ifeq ($(shell /usr/sbin/sysctl -n hw.optional.x86_64 2>/dev/null),1) + export arch:=intel64 + else + export arch:=ia32 + endif + endif +endif + +ifndef runtime + clang_version:=$(shell clang -v 2>&1 >/dev/null | grep version | sed -e "s/.*version \(.*[0-9]\) .*/\1/") + ifndef os_version + os_version:=$(shell /usr/bin/sw_vers -productVersion) + endif + export runtime:=cc$(clang_version)_os$(os_version) +endif + +native_compiler := clang +export compiler ?= clang +debugger ?= lldb + +export stdlib ?= libc++ + +CMD=$(SHELL) -c +CWD=$(shell pwd) +RM?=rm -f +RD?=rmdir +MD?=mkdir -p +NUL= /dev/null +SLASH=/ +MAKE_VERSIONS=sh $(tbb_root)/build/version_info_macos.sh $(VERSION_FLAGS) >version_string.ver +MAKE_TBBVARS=sh $(tbb_root)/build/generate_tbbvars.sh DY + +ifdef DYLD_LIBRARY_PATH + export DYLD_LIBRARY_PATH := .:$(DYLD_LIBRARY_PATH) +else + export DYLD_LIBRARY_PATH := . +endif + +####### Build settings ######################################################## + +OBJ=o +DLL=dylib +MALLOC_DLL?=$(DLL) +LIBEXT=dylib + +def_prefix = $(if $(findstring 64,$(arch)),mac64,mac32) + +TBB.LST = $(tbb_root)/src/tbb/$(def_prefix)-tbb-export.lst +TBB.DEF = $(TBB.LST:.lst=.def) +TBB.DLL = libtbb$(CPF_SUFFIX)$(DEBUG_SUFFIX).$(DLL) +TBB.LIB = $(TBB.DLL) +LINK_TBB.LIB = $(TBB.LIB) + +MALLOC.DEF = $(MALLOC_ROOT)/$(def_prefix)-tbbmalloc-export.def +MALLOC.DLL = libtbbmalloc$(DEBUG_SUFFIX).$(MALLOC_DLL) +MALLOC.LIB = $(MALLOC.DLL) +LINK_MALLOC.LIB = $(MALLOC.LIB) + +MALLOCPROXY.DLL = libtbbmalloc_proxy$(DEBUG_SUFFIX).$(MALLOC_DLL) +MALLOCPROXY.LIB = $(MALLOCPROXY.DLL) +LINK_MALLOCPROXY.LIB = $(MALLOCPROXY.LIB) + +TEST_LAUNCHER=sh $(tbb_root)/build/test_launcher.sh $(largs) + +OPENCL.LIB = -framework OpenCL diff --git a/xdl/third_party/tbb/build/mic.icc.inc b/xdl/third_party/tbb/build/mic.icc.inc new file mode 100644 index 00000000..f91519ab --- /dev/null +++ b/xdl/third_party/tbb/build/mic.icc.inc @@ -0,0 +1,79 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +CPLUS ?= icpc +CONLY ?= icc +COMPILE_ONLY = -c -MMD +PREPROC_ONLY = -E -x c++ +INCLUDE_KEY = -I +DEFINE_KEY = -D +OUTPUT_KEY = -o # +OUTPUTOBJ_KEY = -o # +PIC_KEY = -fPIC +WARNING_AS_ERROR_KEY = -Werror +WARNING_KEY = -w1 +DYLIB_KEY = -shared -Wl,-soname=$@ +EXPORT_KEY = -Wl,--version-script, +NOINTRINSIC_KEY = -fno-builtin +LIBDL = -ldl +SDL_FLAGS = -fstack-protector -Wformat -Wformat-security + +ifeq (release,$(cfg)) + SDL_FLAGS += -D_FORTIFY_SOURCE=2 + CPLUS_FLAGS = -O2 -g -DUSE_PTHREAD +else + CPLUS_FLAGS = -O0 -g -DUSE_PTHREAD -DTBB_USE_DEBUG +endif + +ifneq (,$(codecov)) + CPLUS_FLAGS += -prof-gen=srcpos +endif + +ifneq (,$(shell icc -dumpversion | egrep "^1[6-9]\.")) +OPENMP_FLAG = -qopenmp +else +OPENMP_FLAG = -openmp +endif + +LIB_LINK_FLAGS = -shared -static-intel -Wl,-soname=$(BUILDING_LIBRARY) -z relro -z now +LIBS += -lpthread -lrt +C_FLAGS = $(CPLUS_FLAGS) +CILK_AVAILABLE = yes + +TBB_ASM.OBJ= +MALLOC_ASM.OBJ= + +CPLUS_FLAGS += -DHARNESS_INCOMPLETE_SOURCES=1 -D__TBB_MIC_NATIVE -DTBB_USE_EXCEPTIONS=0 -qopt-streaming-stores never +CPLUS += -mmic +CONLY += -mmic +LINK_FLAGS = -Wl,-rpath-link=. -rdynamic +# Tell the icc to not link against libcilk*. Otherwise icc tries to link and emits a warning message. +LIB_LINK_FLAGS += -no-intel-extensions + +#------------------------------------------------------------------------------ +# Setting tbbmalloc data. +#------------------------------------------------------------------------------ + +M_CPLUS_FLAGS = $(CPLUS_FLAGS) -fno-rtti -fno-exceptions + +#------------------------------------------------------------------------------ +# End of setting tbbmalloc data. +#------------------------------------------------------------------------------ + + + diff --git a/xdl/third_party/tbb/build/mic.linux.inc b/xdl/third_party/tbb/build/mic.linux.inc new file mode 100644 index 00000000..bb1e81a5 --- /dev/null +++ b/xdl/third_party/tbb/build/mic.linux.inc @@ -0,0 +1,43 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +ifeq ($(tbb_os),mic) + $(error MIC supports only cross-compilation. Specify "target=mic" instead.) +endif + +ifneq ($(BUILDING_PHASE),1) + # The same build prefix should be used in offload.inc + ifeq (,$(tbb_build_prefix)) + tbb_build_prefix=mic_icc$(CPF_SUFFIX) + endif + # For examples + mic_tbb_build_prefix=$(tbb_build_prefix) +endif + +MAKE_VERSIONS=sh $(tbb_root)/build/version_info_linux.sh $(VERSION_FLAGS) >version_string.ver +MAKE_TBBVARS=sh $(tbb_root)/build/generate_tbbvars.sh MIC_ MIC_ +def_prefix=lin64 + +TEST_LAUNCHER= +run_cmd ?= bash $(tbb_root)/build/mic.linux.launcher.sh $(largs) + +# detects whether examples are being built. +ifeq ($(BUILDING_PHASE),0) + export UI = con + export x64 = 64 +endif # examples diff --git a/xdl/third_party/tbb/build/mic.linux.launcher.sh b/xdl/third_party/tbb/build/mic.linux.launcher.sh new file mode 100644 index 00000000..60e01b78 --- /dev/null +++ b/xdl/third_party/tbb/build/mic.linux.launcher.sh @@ -0,0 +1,161 @@ +#!/bin/bash +# +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +# Usage: +# mic.linux.launcher.sh [-v] [-q] [-s] [-r ] [-u] [-l ] +# where: -v enables verbose output +# where: -q enables quiet mode +# where: -s runs the test in stress mode (until non-zero exit code or ctrl-c pressed) +# where: -r specifies number of times to repeat execution +# where: -u limits stack size +# where: -l specifies the library name to be assigned to LD_PRELOAD +# +# Libs and executable necessary for testing should be present in the current directory before running. +# Note: Do not remove the redirections to '/dev/null' in the script, otherwise the nightly test system will fail. +# +trap 'echo Error at line $LINENO while executing "$BASH_COMMAND"' ERR # +trap 'echo -e "\n*** Interrupted ***" && exit 1' SIGINT SIGQUIT # +# Process the optional arguments if present +while getopts "qvsr:ul:" flag # +do case $flag in # + s ) # Stress testing mode + echo Doing stress testing. Press Ctrl-C to terminate + run_env='stressed() { while $*; do :; done; };' # + run_prefix="stressed $run_prefix" ;; # + r ) # Repeats test n times + run_env="repeated() { for i in \$(seq 1 $OPTARG); do echo \$i of $OPTARG:; \$*; done; };" # + run_prefix="repeated $run_prefix" ;; # + l ) # Additional library + ldd_list+="$OPTARG " # + run_prefix+=" LD_PRELOAD=$OPTARG" ;; # + u ) # Set stack limit + run_prefix="ulimit -s 10240; $run_prefix" ;; # + q ) # Quiet mode, removes 'done' but prepends any other output by test name + SUPPRESS='>/dev/null' # + verbose=1 ;; # TODO: implement a better quiet mode + v ) # Verbose mode + verbose=1 ;; # +esac done # +shift `expr $OPTIND - 1` # +[ $verbose ] || SUPPRESS='>/dev/null' # +# +# Collect the executable name +fexename="$1" # +exename=`basename $1` # +shift # +# +: ${MICDEV:=mic0} # +RSH="sudo ssh $MICDEV" # +RCP="sudo scp" # +currentdir=$PWD # +# +# Prepare the target directory on the device +targetdir="`$RSH mktemp -d /tmp/tbbtestXXXXXX 2>/dev/null`" # +# Prepare the temporary directory on the host +hostdir="`mktemp -d /tmp/tbbtestXXXXXX 2>/dev/null`" # +# +function copy_files { # + [ $verbose ] && echo Going to copy $* # + eval "cp $* $hostdir/ $SUPPRESS 2>/dev/null || exit \$?" # + eval "$RCP $hostdir/* $MICDEV:$targetdir/ $SUPPRESS 2>/dev/null || exit \$?" # + eval "rm $hostdir/* $SUPPRESS 2>/dev/null || exit \$?" # +} # copy files +# +function clean_all() { # + eval "$RSH rm -fr $targetdir $SUPPRESS" ||: # + eval "rm -fr $hostdir $SUPPRESS" ||: # +} # clean all temporary files +# +function kill_interrupt() { # + echo -e "\n*** Killing remote $exename ***" && $RSH "killall $exename" # + clean_all # +} # kill target process +# +trap 'clean_all' SIGINT SIGQUIT # trap keyboard interrupt (control-c) +# +# Transfer the test executable file and its auxiliary libraries (named as {test}_dll.so) to the target device. +copy_files $fexename `ls ${exename%\.*}*.so 2>/dev/null ||:` # +# +# Collect all dependencies of the test and its auxiliary libraries to transfer them to the target device. +ldd_list+="libtbbmalloc*.so* libirml*.so* `$RSH ldd $targetdir/\* | grep = | cut -d= -f1 2>/dev/null`" # +fnamelist="" # +# +# Find the libraries and add them to the list. +# For example, go through MIC_LD_LIBRARY_PATH and add TBB libraries from the first +# directory that contains tbb files +mic_dir_list=`echo .:$MIC_LD_LIBRARY_PATH | tr : " "` # +[ $verbose ] && echo Searching libraries in $mic_dir_list +for name in $ldd_list; do # adds the first matched name in specified dirs + found="`find -L $mic_dir_list -name $name -a -readable -print -quit 2>/dev/null` "||: # + [ $verbose ] && echo File $name: $found + fnamelist+=$found +done # +# +# Remove extra spaces. +fnamelist=`echo $fnamelist` # +# Transfer collected executable and library files to the target device. +[ -n "$fnamelist" ] && copy_files $fnamelist +# +# Transfer input files used by example codes by scanning the executable argument list. +argfiles= # +args= # +for arg in "$@"; do # + if [ -r $arg ]; then # + argfiles+="$arg " # + args+="$(basename $arg) " # + else # + args+="$arg " # + fi # +done # +[ -n "$argfiles" ] && copy_files $argfiles # +# +# Get the list of transferred files +testfiles="`$RSH find $targetdir/ -type f | tr '\n' ' ' 2>/dev/null`" # +# +[ $verbose ] && echo Running $run_prefix ./$exename $args # +# Run the test on the target device +trap 'kill_interrupt' SIGINT SIGQUIT # trap keyboard interrupt (control-c) +trap - ERR # +run_env+="cd $targetdir; export LD_LIBRARY_PATH=.:\$LD_LIBRARY_PATH;" # +$RSH "$run_env $run_prefix ./$exename $args" # +# +# Delete the test files and get the list of output files +outfiles=`$RSH rm $testfiles 2>/dev/null; find $targetdir/ -type f 2>/dev/null` ||: # +if [ -n "$outfiles" ]; then # + for outfile in $outfiles; do # + filename=$(basename $outfile) # + subdir=$(dirname $outfile) # + subdir="${subdir#$targetdir}" # + [ -n $subdir ] subdir=$subdir/ # + # Create directories on host + [ ! -d "$hostdir/$subdir" ] && mkdir -p "$hostdir/$subdir" # + [ ! -d "$currentdir/$subdir" ] && mkdir -p "$currentdir/$subdir" # + # Copy the output file to the temporary directory on host + eval "$RCP -r '$MICDEV:${outfile#}' '$hostdir/$subdir$filename' $SUPPRESS 2>&1 || exit \$?" # + # Copy the output file from the temporary directory to the current directory + eval "cp '$hostdir/$subdir$filename' '$currentdir/$subdir$filename' $SUPPRESS 2>&1 || exit \$?" # + done # +fi # +# +# Clean up temporary directories +clean_all +# +# Return the exit code of the test. +exit $? # diff --git a/xdl/third_party/tbb/build/mic.offload.inc b/xdl/third_party/tbb/build/mic.offload.inc new file mode 100644 index 00000000..e2b09718 --- /dev/null +++ b/xdl/third_party/tbb/build/mic.offload.inc @@ -0,0 +1,118 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +ifneq (mic,$(offload)) + $(error File mic.offload.inc should not be included directly. Use offload=mic instead.) +endif +ifneq (icc,$(compiler)) + $(error Only Intel(R) Compiler is supported for MIC offload compilation) +endif + +# The same build prefix should be used in mic.linux.inc +mic_tbb_build_prefix=mic_icc$(CPF_SUFFIX) +MIC_OFFLOAD_NATIVE_PATH?=../$(mic_tbb_build_prefix)_$(cfg) + +ifdef BUILDING_PHASE + ifeq ($(BUILDING_PHASE),1) + # Tests + export MIC_OFFLOAD_NATIVE_PATH + LINK_TBB_NATIVE.LIB=$(MIC_OFFLOAD_NATIVE_PATH)/$(TBB.LIB) + LINK_TBB.LIB=-qoffload-option,mic,ld,"$(LINK_TBB_NATIVE.LIB)" $(TBB.LIB) + LINK_MALLOC_NATIVE.LIB=$(MIC_OFFLOAD_NATIVE_PATH)/$(MALLOC.DLL) + LINK_MALLOC.LIB=-qoffload-option,mic,ld,"$(LINK_MALLOC_NATIVE.LIB)" $(MALLOC.LIB) + LINK_MALLOCPROXY_NATIVE.LIB=$(MIC_OFFLOAD_NATIVE_PATH)/$(MALLOCPROXY.DLL) + LINK_MALLOCPROXY.LIB=-qoffload-option,mic,ld,"$(LINK_MALLOCPROXY_NATIVE.LIB)" $(MALLOCPROXY.LIB) + + # Export extensions for test_launcher + export DLL + export TEST_EXT=offload.exe + OBJ=offload.o + + # Do not use -Werror because it is too strict for the early offload compiler. + # Need to set anything because WARNING_AS_ERROR_KEY should not be empty. + # Treat #2426 as a warning. Print errors only. + tbb_strict=0 + WARNING_AS_ERROR_KEY = Warning as error + WARNING_KEY = -diag-warning 2426 -w0 + + CXX_MIC_STUFF = -qoffload-attribute-target=mic -D__TBB_MIC_OFFLOAD=1 -qoffload-option,mic,compiler,"-D__TBB_MIC_OFFLOAD=1 $(CXX_MIC_NATIVE_STUFF)" + CXX_MIC_NATIVE_STUFF = -DHARNESS_INCOMPLETE_SOURCES=1 -D__TBB_MIC_NATIVE -DTBB_USE_EXCEPTIONS=0 + CPLUS_FLAGS += $(CXX_MIC_STUFF) + + # Some tests require that an executable exports its symbols. + LINK_FLAGS += -qoffload-option,mic,ld,"--export-dynamic" + + # libcoi_device.so is needed for COIProcessProxyFlush used in Harness. + LINK_FLAGS += -qoffload-option,mic,ld,"-lcoi_device" + + # DSO-linking semantics forces linking libpthread and librt to a test. + LINK_FLAGS += -qoffload-option,mic,ld,"-lpthread -lrt" + + .PHONY: FORCE + FORCE: + + $(MIC_OFFLOAD_NATIVE_PATH)/%_dll.$(DLL): FORCE + @$(MAKE) --no-print-directory -C "$(MIC_OFFLOAD_NATIVE_PATH)" target=mic offload= -f$(tbb_root)/build/Makefile.$(TESTFILE) $*_dll.$(DLL) + %_dll.$(DLL): $(MIC_OFFLOAD_NATIVE_PATH)/%_dll.$(DLL) FORCE + @$(MAKE) --no-print-directory offload= -f$(tbb_root)/build/Makefile.$(TESTFILE) $*_dll.$(DLL) + + .PRECIOUS: $(MIC_OFFLOAD_NATIVE_PATH)/%_dll.$(DLL) + + %.$(TEST_EXT): LINK_FILES+=-qoffload-option,mic,ld,"$(addprefix $(MIC_OFFLOAD_NATIVE_PATH)/,$(TEST_LIBS))" + + TEST_LAUNCHER=sh $(tbb_root)/build/test_launcher.sh $(largs) + + ifdef MIC_LD_LIBRARY_PATH + export MIC_LD_LIBRARY_PATH := $(MIC_OFFLOAD_NATIVE_PATH):$(MIC_LD_LIBRARY_PATH) + else + export MIC_LD_LIBRARY_PATH := $(MIC_OFFLOAD_NATIVE_PATH) + endif + else + # Examples + export UI = con + export x64 = 64 + endif +else + # Libraries + LIB_TARGETS = tbb tbbmalloc tbbproxy rml + addsuffixes = $(foreach suff,$(1),$(addsuffix $(suff),$(2))) + + .PHONY: $(call addsuffixes, _debug _release _debug_mic _release_mic,$(LIB_TARGETS)) + + # The dependence on *_debug and *_release targets unifies the offload support + # for top-level Makefile and src/Makefile + $(LIB_TARGETS): %: %_release %_debug + + # "override offload=" suppresses the "offload" variable value for nested makes + $(LIB_TARGETS) $(call addsuffixes, _debug _release,$(LIB_TARGETS)): override offload= + # Apply overriding for library builds + export offload + export tbb_build_prefix + # Add the dependency on target libraries + $(call addsuffixes, _debug _release,$(LIB_TARGETS)): %: %_mic + + # tbb_build_prefix should be overridden since we want to restart make in "clear" environment + $(call addsuffixes, _debug_mic _release_mic,$(LIB_TARGETS)): override tbb_build_prefix= + $(call addsuffixes, _debug_mic _release_mic,$(LIB_TARGETS)): %_mic: + @$(MAKE) --no-print-directory -C "$(full_tbb_root)/src" $* target=mic tbb_root=.. + + mic_clean: override tbb_build_prefix= + mic_clean: + @$(MAKE) --no-print-directory -C "$(full_tbb_root)/src" clean offload= target=mic tbb_root=.. + clean: mic_clean +endif diff --git a/xdl/third_party/tbb/build/suncc.map.pause b/xdl/third_party/tbb/build/suncc.map.pause new file mode 100644 index 00000000..a92d08eb --- /dev/null +++ b/xdl/third_party/tbb/build/suncc.map.pause @@ -0,0 +1 @@ +hwcap_1 = OVERRIDE; \ No newline at end of file diff --git a/xdl/third_party/tbb/build/test_launcher.bat b/xdl/third_party/tbb/build/test_launcher.bat new file mode 100644 index 00000000..8e1fb31e --- /dev/null +++ b/xdl/third_party/tbb/build/test_launcher.bat @@ -0,0 +1,74 @@ +@echo off +REM +REM Copyright (c) 2005-2018 Intel Corporation +REM +REM Licensed under the Apache License, Version 2.0 (the "License"); +REM you may not use this file except in compliance with the License. +REM You may obtain a copy of the License at +REM +REM http://www.apache.org/licenses/LICENSE-2.0 +REM +REM Unless required by applicable law or agreed to in writing, software +REM distributed under the License is distributed on an "AS IS" BASIS, +REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +REM See the License for the specific language governing permissions and +REM limitations under the License. +REM +REM +REM +REM +REM + +set cmd_line= +if DEFINED run_prefix set cmd_line=%run_prefix% +:while +if NOT "%1"=="" ( + REM Verbose mode + if "%1"=="-v" ( + set verbose=yes + GOTO continue + ) + REM Silent mode of 'make' requires additional support for associating + REM of test output with the test name. Verbose mode is the simplest way + if "%1"=="-q" ( + set verbose=yes + GOTO continue + ) + REM Run in stress mode + if "%1"=="-s" ( + echo Doing stress testing. Press Ctrl-C to terminate + set stress=yes + GOTO continue + ) + REM Repeat execution specified number of times + if "%1"=="-r" ( + set repeat=%2 + SHIFT + GOTO continue + ) + REM no LD_PRELOAD under Windows + REM but run the test to check "#pragma comment" construction + if "%1"=="-l" ( + REM The command line may specify -l with empty dll name, + REM e.g. "test_launcher.bat -l app.exe". If the dll name is + REM empty then %2 contains the application name and the SHIFT + REM operation is not necessary. + if exist "%3" SHIFT + GOTO continue + ) + REM no need to setup up stack size under Windows + if "%1"=="-u" GOTO continue + set cmd_line=%cmd_line% %1 +:continue + SHIFT + GOTO while +) +set cmd_line=%cmd_line:./=.\% +if DEFINED verbose echo Running %cmd_line% +if DEFINED stress set cmd_line=%cmd_line% ^& IF NOT ERRORLEVEL 1 GOTO stress +:stress +if DEFINED repeat ( + for /L %%i in (1,1,%repeat%) do echo %%i of %repeat%: & %cmd_line% +) else ( + %cmd_line% +) diff --git a/xdl/third_party/tbb/build/test_launcher.sh b/xdl/third_party/tbb/build/test_launcher.sh new file mode 100644 index 00000000..8df4c14d --- /dev/null +++ b/xdl/third_party/tbb/build/test_launcher.sh @@ -0,0 +1,94 @@ +#!/bin/sh +# +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +# Usage: +# test_launcher.sh [-v] [-q] [-s] [-r ] [-u] [-l ] +# where: -v enables verbose output +# where: -q enables quiet mode +# where: -s runs the test in stress mode (until non-zero exit code or ctrl-c pressed) +# where: -r specifies number of times to repeat execution +# where: -u limits stack size +# where: -l specifies the library name to be assigned to LD_PRELOAD + +while getopts "qvsr:ul:" flag # +do case $flag in # + s ) # Stress testing mode + run_prefix="stressed $run_prefix" ;; # + r ) # Repeats test n times + repeat=$OPTARG # + run_prefix="repeated $run_prefix" ;; # + l ) if [ `uname` = 'Linux' ] ; then # + LD_PRELOAD=$OPTARG # + elif [ `uname` = 'Darwin' ] ; then # + DYLD_INSERT_LIBRARIES=$OPTARG # + else # + echo 'skip' # + exit # + fi ;; # + u ) # Set stack limit + ulimit -s 10240 ;; # + q ) # Quiet mode, removes 'done' but prepends any other output by test name + OUTPUT='2>&1 | sed -e "s/done//;/^[[:space:]]*$/d;s!^!$1: !"' ;; # + v ) # Verbose mode + verbose=1 ;; # +esac done # +shift `expr $OPTIND - 1` # +if [ $MIC_OFFLOAD_NATIVE_PATH ] ; then # + LIB_NAME=${1/%.$TEST_EXT/_dll.$DLL} # + if [ -f "$MIC_OFFLOAD_NATIVE_PATH/$LIB_NAME" ]; then # + [ -z "$MIC_CARD" ] && MIC_CARD=mic0 # + TMPDIR_HOST=`mktemp -d /tmp/tbbtestXXXXXX` # + TMPDIR_MIC=`sudo ssh $MIC_CARD mktemp -d /tmp/tbbtestXXXXXX` # + sudo ssh $MIC_CARD "chmod +x $TMPDIR_MIC" # + # Test specific library may depend on libtbbmalloc* + cp "$MIC_OFFLOAD_NATIVE_PATH/$LIB_NAME" "$MIC_OFFLOAD_NATIVE_PATH"/libtbbmalloc* "$TMPDIR_HOST" >/dev/null 2>/dev/null # + sudo scp "$TMPDIR_HOST"/* $MIC_CARD:"$TMPDIR_MIC" >/dev/null 2>/dev/null # + + LD_LIBRARY_PATH=$TMPDIR_MIC:$LD_LIBRARY_PATH # + export LD_LIBRARY_PATH # + fi # +fi # +stressed() { echo Doing stress testing. Press Ctrl-C to terminate # + while :; do $*; done;# +} # +repeated() { # + i=0; while [ "$i" -lt $repeat ]; do i=`expr $i + 1`; echo $i of $repeat:; $*; done # +} # +# DYLD_LIBRARY_PATH can be purged on OS X 10.11, set it again +if [ `uname` = 'Darwin' -a -z "$DYLD_LIBRARY_PATH" ] ; then # + DYLD_LIBRARY_PATH=. # + export DYLD_LIBRARY_PATH # +fi # +# Run the command line passed via parameters +[ $verbose ] && echo Running $run_prefix $* # +if [ -n "$LD_PRELOAD" ] ; then # + export LD_PRELOAD # +elif [ -n "$DYLD_INSERT_LIBRARIES" ] ; then # + export DYLD_INSERT_LIBRARIES # +fi # +exec 4>&1 # extracting exit code of the first command in pipeline needs duplicated stdout +# custom redirection needs eval, otherwise shell cannot parse it +err=`eval '( $run_prefix $* || echo \$? >&3; )' ${OUTPUT} 3>&1 >&4` # +[ -z "$err" ] || echo $1: exited with error $err # +if [ $MIC_OFFLOAD_NATIVE_PATH ] ; then # + sudo ssh $MIC_CARD rm -fr "$TMPDIR_MIC" >/dev/null 2>/dev/null # + rm -fr "$TMPDIR_HOST" >/dev/null 2>/dev/null # +fi # +exit $err # diff --git a/xdl/third_party/tbb/build/version_info_aix.sh b/xdl/third_party/tbb/build/version_info_aix.sh new file mode 100644 index 00000000..7703f4ca --- /dev/null +++ b/xdl/third_party/tbb/build/version_info_aix.sh @@ -0,0 +1,34 @@ +#!/bin/sh +# +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +# Script used to generate version info string +echo "#define __TBB_VERSION_STRINGS(N) \\" +echo '#N": BUILD_HOST'"\t\t"`hostname -s`" ("`uname -m`")"'" ENDL \' +# find OS name in *-release and issue* files by filtering blank lines and lsb-release content out +echo '#N": BUILD_OS'"\t\t"`lsb_release -sd 2>/dev/null | grep -ih '[a-z] ' - /etc/*release /etc/issue 2>/dev/null | head -1 | sed -e 's/["\\\\]//g'`'" ENDL \' +echo '#N": BUILD_KERNEL'"\t"`uname -srv`'" ENDL \' +echo '#N": BUILD_GCC'"\t\t"`g++ --version &1 | grep 'g++'`'" ENDL \' +[ -z "$COMPILER_VERSION" ] || echo '#N": BUILD_COMPILER'"\t"$COMPILER_VERSION'" ENDL \' +echo '#N": BUILD_LIBC'"\t"`getconf GNU_LIBC_VERSION | grep glibc | sed -e 's/^glibc //'`'" ENDL \' +echo '#N": BUILD_LD'"\t\t"`ld -v 2>&1 | grep 'version'`'" ENDL \' +echo '#N": BUILD_TARGET'"\t$arch on $runtime"'" ENDL \' +echo '#N": BUILD_COMMAND'"\t"$*'" ENDL \' +echo "" +echo "#define __TBB_DATETIME \""`date -u`"\"" diff --git a/xdl/third_party/tbb/build/version_info_android.sh b/xdl/third_party/tbb/build/version_info_android.sh new file mode 100644 index 00000000..ba8211aa --- /dev/null +++ b/xdl/third_party/tbb/build/version_info_android.sh @@ -0,0 +1,33 @@ +#!/bin/sh +# +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +# Script used to generate version info string +echo "#define __TBB_VERSION_STRINGS(N) \\" +echo '#N": BUILD_HOST'"\t\t"`hostname -s`" ("`uname -m`")"'" ENDL \' +# find OS name in *-release and issue* files by filtering blank lines and lsb-release content out +echo '#N": BUILD_OS'"\t\t"`lsb_release -sd 2>/dev/null | grep -ih '[a-z] ' - /etc/*release /etc/issue 2>/dev/null | head -1 | sed -e 's/["\\\\]//g'`'" ENDL \' +echo '#N": BUILD_TARGET_CXX'"\t"`$TARGET_CXX --version | head -n1`'" ENDL \' +[ -z "$COMPILER_VERSION" ] || echo '#N": BUILD_COMPILER'"\t"$COMPILER_VERSION'" ENDL \' +[ -z "$ndk_version" ] || echo '#N": BUILD_NDK'"\t\t$ndk_version"'" ENDL \' +echo '#N": BUILD_LD'"\t\t"`${tbb_tool_prefix}ld -v 2>&1 | grep 'ld'`'" ENDL \' +echo '#N": BUILD_TARGET'"\t$arch on $runtime"'" ENDL \' +echo '#N": BUILD_COMMAND'"\t"$*'" ENDL \' +echo "" +echo "#define __TBB_DATETIME \""`date -u`"\"" diff --git a/xdl/third_party/tbb/build/version_info_linux.sh b/xdl/third_party/tbb/build/version_info_linux.sh new file mode 100644 index 00000000..7703f4ca --- /dev/null +++ b/xdl/third_party/tbb/build/version_info_linux.sh @@ -0,0 +1,34 @@ +#!/bin/sh +# +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +# Script used to generate version info string +echo "#define __TBB_VERSION_STRINGS(N) \\" +echo '#N": BUILD_HOST'"\t\t"`hostname -s`" ("`uname -m`")"'" ENDL \' +# find OS name in *-release and issue* files by filtering blank lines and lsb-release content out +echo '#N": BUILD_OS'"\t\t"`lsb_release -sd 2>/dev/null | grep -ih '[a-z] ' - /etc/*release /etc/issue 2>/dev/null | head -1 | sed -e 's/["\\\\]//g'`'" ENDL \' +echo '#N": BUILD_KERNEL'"\t"`uname -srv`'" ENDL \' +echo '#N": BUILD_GCC'"\t\t"`g++ --version &1 | grep 'g++'`'" ENDL \' +[ -z "$COMPILER_VERSION" ] || echo '#N": BUILD_COMPILER'"\t"$COMPILER_VERSION'" ENDL \' +echo '#N": BUILD_LIBC'"\t"`getconf GNU_LIBC_VERSION | grep glibc | sed -e 's/^glibc //'`'" ENDL \' +echo '#N": BUILD_LD'"\t\t"`ld -v 2>&1 | grep 'version'`'" ENDL \' +echo '#N": BUILD_TARGET'"\t$arch on $runtime"'" ENDL \' +echo '#N": BUILD_COMMAND'"\t"$*'" ENDL \' +echo "" +echo "#define __TBB_DATETIME \""`date -u`"\"" diff --git a/xdl/third_party/tbb/build/version_info_macos.sh b/xdl/third_party/tbb/build/version_info_macos.sh new file mode 100644 index 00000000..2fcfc071 --- /dev/null +++ b/xdl/third_party/tbb/build/version_info_macos.sh @@ -0,0 +1,32 @@ +#!/bin/sh +# +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +# Script used to generate version info string +echo "#define __TBB_VERSION_STRINGS(N) \\" +echo '#N": BUILD_HOST'"\t\t"`hostname -s`" ("`arch`")"'" ENDL \' +echo '#N": BUILD_OS'"\t\t"`sw_vers -productName`" version "`sw_vers -productVersion`'" ENDL \' +echo '#N": BUILD_KERNEL'"\t"`uname -v`'" ENDL \' +echo '#N": BUILD_CLANG'"\t"`clang --version &1 | grep 'version '`'" ENDL \' +echo '#N": BUILD_XCODE'"\t"`xcodebuild -version &1 | grep 'Xcode'`'" ENDL \' +[ -z "$COMPILER_VERSION" ] || echo '#N": BUILD_COMPILER'"\t"$COMPILER_VERSION'" ENDL \' +echo '#N": BUILD_TARGET'"\t$arch on $runtime"'" ENDL \' +echo '#N": BUILD_COMMAND'"\t"$*'" ENDL \' +echo "" +echo "#define __TBB_DATETIME \""`date -u`"\"" diff --git a/xdl/third_party/tbb/build/version_info_sunos.sh b/xdl/third_party/tbb/build/version_info_sunos.sh new file mode 100644 index 00000000..885bcc40 --- /dev/null +++ b/xdl/third_party/tbb/build/version_info_sunos.sh @@ -0,0 +1,31 @@ +#!/bin/sh +# +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +# Script used to generate version info string +echo "#define __TBB_VERSION_STRINGS(N) \\" +echo '#N": BUILD_HOST'"\t"`hostname`" ("`arch`")"'" ENDL \' +echo '#N": BUILD_OS'"\t\t"`uname`'" ENDL \' +echo '#N": BUILD_KERNEL'"\t"`uname -srv`'" ENDL \' +echo '#N": BUILD_SUNCC'"\t"`CC -V &1 | grep 'C++'`'" ENDL \' +[ -z "$COMPILER_VERSION" ] || echo '#N": BUILD_COMPILER'"\t"$COMPILER_VERSION'" ENDL \' +echo '#N": BUILD_TARGET'"\t$arch on $runtime"'" ENDL \' +echo '#N": BUILD_COMMAND'"\t"$*'" ENDL \' +echo "" +echo "#define __TBB_DATETIME \""`date -u`"\"" diff --git a/xdl/third_party/tbb/build/version_info_windows.js b/xdl/third_party/tbb/build/version_info_windows.js new file mode 100644 index 00000000..031b22c3 --- /dev/null +++ b/xdl/third_party/tbb/build/version_info_windows.js @@ -0,0 +1,95 @@ +// Copyright (c) 2005-2018 Intel Corporation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// +// +// + +var WshShell = WScript.CreateObject("WScript.Shell"); + +var tmpExec; + +WScript.Echo("#define __TBB_VERSION_STRINGS(N) \\"); + +//Getting BUILD_HOST +WScript.echo( "#N \": BUILD_HOST\\t\\t" + + WshShell.ExpandEnvironmentStrings("%COMPUTERNAME%") + + "\" ENDL \\" ); + +//Getting BUILD_OS +tmpExec = WshShell.Exec("cmd /c ver"); +while ( tmpExec.Status == 0 ) { + WScript.Sleep(100); +} +tmpExec.StdOut.ReadLine(); + +WScript.echo( "#N \": BUILD_OS\\t\\t" + + tmpExec.StdOut.ReadLine() + + "\" ENDL \\" ); + +if ( WScript.Arguments(0).toLowerCase().match("gcc") ) { + tmpExec = WshShell.Exec(WScript.Arguments(0) + " --version"); + WScript.echo( "#N \": BUILD_GCC\\t\\t" + + tmpExec.StdOut.ReadLine() + + "\" ENDL \\" ); + +} else if ( WScript.Arguments(0).toLowerCase().match("clang") ) { + tmpExec = WshShell.Exec(WScript.Arguments(0) + " --version"); + WScript.echo( "#N \": BUILD_CLANG\\t" + + tmpExec.StdOut.ReadLine() + + "\" ENDL \\" ); + +} else { // MS / Intel compilers + //Getting BUILD_CL + tmpExec = WshShell.Exec("cmd /c echo #define 0 0>empty.cpp"); + tmpExec = WshShell.Exec("cl -c empty.cpp "); + while ( tmpExec.Status == 0 ) { + WScript.Sleep(100); + } + var clVersion = tmpExec.StdErr.ReadLine(); + WScript.echo( "#N \": BUILD_CL\\t\\t" + + clVersion + + "\" ENDL \\" ); + + //Getting BUILD_COMPILER + if ( WScript.Arguments(0).toLowerCase().match("icl") ) { + tmpExec = WshShell.Exec("icl -c empty.cpp "); + while ( tmpExec.Status == 0 ) { + WScript.Sleep(100); + } + WScript.echo( "#N \": BUILD_COMPILER\\t" + + tmpExec.StdErr.ReadLine() + + "\" ENDL \\" ); + } else { + WScript.echo( "#N \": BUILD_COMPILER\\t\\t" + + clVersion + + "\" ENDL \\" ); + } + tmpExec = WshShell.Exec("cmd /c del /F /Q empty.obj empty.cpp"); +} + +//Getting BUILD_TARGET +WScript.echo( "#N \": BUILD_TARGET\\t" + + WScript.Arguments(1) + + "\" ENDL \\" ); + +//Getting BUILD_COMMAND +WScript.echo( "#N \": BUILD_COMMAND\\t" + WScript.Arguments(2) + "\" ENDL" ); + +//Getting __TBB_DATETIME and __TBB_VERSION_YMD +var date = new Date(); +WScript.echo( "#define __TBB_DATETIME \"" + date.toUTCString() + "\"" ); +WScript.echo( "#define __TBB_VERSION_YMD " + date.getUTCFullYear() + ", " + + (date.getUTCMonth() > 8 ? (date.getUTCMonth()+1):("0"+(date.getUTCMonth()+1))) + + (date.getUTCDate() > 9 ? date.getUTCDate():("0"+date.getUTCDate())) ); diff --git a/xdl/third_party/tbb/build/vs2013/index.html b/xdl/third_party/tbb/build/vs2013/index.html new file mode 100644 index 00000000..11466543 --- /dev/null +++ b/xdl/third_party/tbb/build/vs2013/index.html @@ -0,0 +1,30 @@ + + + +

Overview

+This directory contains the Visual Studio* 2013 solution to build Intel® Threading Building Blocks. + + +

Files

+
+
makefile.sln +
Solution file.
+
tbb.vcxproj +
Library project file.
+
tbbmalloc.vcxproj +
Scalable allocator library project file.
+
tbbmalloc_proxy.vcxproj +
Standard allocator replacement project file.
+
+ +
+Up to parent directory +

+Copyright © 2018 Intel Corporation. All Rights Reserved. +

+Intel and the Intel logo are trademarks of Intel Corporation +or its subsidiaries in the U.S. and/or other countries. +

+* Other names and brands may be claimed as the property of others. + + diff --git a/xdl/third_party/tbb/build/vs2013/makefile.sln b/xdl/third_party/tbb/build/vs2013/makefile.sln new file mode 100644 index 00000000..b913551e --- /dev/null +++ b/xdl/third_party/tbb/build/vs2013/makefile.sln @@ -0,0 +1,80 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.40629.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{8898CE0B-0BFB-45AE-AA71-83735ED2510D}" + ProjectSection(SolutionItems) = preProject + index.html = index.html + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tbb", "tbb.vcxproj", "{F62787DD-1327-448B-9818-030062BCFAA5}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tbbmalloc", "tbbmalloc.vcxproj", "{B15F131E-328A-4D42-ADC2-9FF4CA6306D8}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tbbmalloc_proxy", "tbbmalloc_proxy.vcxproj", "{02F61511-D5B6-46E6-B4BB-DEAA96E6BCC7}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Debug-MT|Win32 = Debug-MT|Win32 + Debug-MT|x64 = Debug-MT|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + Release-MT|Win32 = Release-MT|Win32 + Release-MT|x64 = Release-MT|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {F62787DD-1327-448B-9818-030062BCFAA5}.Debug|Win32.ActiveCfg = Debug|Win32 + {F62787DD-1327-448B-9818-030062BCFAA5}.Debug|Win32.Build.0 = Debug|Win32 + {F62787DD-1327-448B-9818-030062BCFAA5}.Debug|x64.ActiveCfg = Debug|x64 + {F62787DD-1327-448B-9818-030062BCFAA5}.Debug|x64.Build.0 = Debug|x64 + {F62787DD-1327-448B-9818-030062BCFAA5}.Debug-MT|Win32.ActiveCfg = Debug-MT|Win32 + {F62787DD-1327-448B-9818-030062BCFAA5}.Debug-MT|Win32.Build.0 = Debug-MT|Win32 + {F62787DD-1327-448B-9818-030062BCFAA5}.Debug-MT|x64.ActiveCfg = Debug-MT|x64 + {F62787DD-1327-448B-9818-030062BCFAA5}.Debug-MT|x64.Build.0 = Debug-MT|x64 + {F62787DD-1327-448B-9818-030062BCFAA5}.Release|Win32.ActiveCfg = Release|Win32 + {F62787DD-1327-448B-9818-030062BCFAA5}.Release|Win32.Build.0 = Release|Win32 + {F62787DD-1327-448B-9818-030062BCFAA5}.Release|x64.ActiveCfg = Release|x64 + {F62787DD-1327-448B-9818-030062BCFAA5}.Release|x64.Build.0 = Release|x64 + {F62787DD-1327-448B-9818-030062BCFAA5}.Release-MT|Win32.ActiveCfg = Release-MT|Win32 + {F62787DD-1327-448B-9818-030062BCFAA5}.Release-MT|Win32.Build.0 = Release-MT|Win32 + {F62787DD-1327-448B-9818-030062BCFAA5}.Release-MT|x64.ActiveCfg = Release-MT|x64 + {F62787DD-1327-448B-9818-030062BCFAA5}.Release-MT|x64.Build.0 = Release-MT|x64 + {B15F131E-328A-4D42-ADC2-9FF4CA6306D8}.Debug|Win32.ActiveCfg = Debug|Win32 + {B15F131E-328A-4D42-ADC2-9FF4CA6306D8}.Debug|Win32.Build.0 = Debug|Win32 + {B15F131E-328A-4D42-ADC2-9FF4CA6306D8}.Debug|x64.ActiveCfg = Debug|x64 + {B15F131E-328A-4D42-ADC2-9FF4CA6306D8}.Debug|x64.Build.0 = Debug|x64 + {B15F131E-328A-4D42-ADC2-9FF4CA6306D8}.Debug-MT|Win32.ActiveCfg = Debug-MT|Win32 + {B15F131E-328A-4D42-ADC2-9FF4CA6306D8}.Debug-MT|Win32.Build.0 = Debug-MT|Win32 + {B15F131E-328A-4D42-ADC2-9FF4CA6306D8}.Debug-MT|x64.ActiveCfg = Debug-MT|x64 + {B15F131E-328A-4D42-ADC2-9FF4CA6306D8}.Debug-MT|x64.Build.0 = Debug-MT|x64 + {B15F131E-328A-4D42-ADC2-9FF4CA6306D8}.Release|Win32.ActiveCfg = Release|Win32 + {B15F131E-328A-4D42-ADC2-9FF4CA6306D8}.Release|Win32.Build.0 = Release|Win32 + {B15F131E-328A-4D42-ADC2-9FF4CA6306D8}.Release|x64.ActiveCfg = Release|x64 + {B15F131E-328A-4D42-ADC2-9FF4CA6306D8}.Release|x64.Build.0 = Release|x64 + {B15F131E-328A-4D42-ADC2-9FF4CA6306D8}.Release-MT|Win32.ActiveCfg = Release-MT|Win32 + {B15F131E-328A-4D42-ADC2-9FF4CA6306D8}.Release-MT|Win32.Build.0 = Release-MT|Win32 + {B15F131E-328A-4D42-ADC2-9FF4CA6306D8}.Release-MT|x64.ActiveCfg = Release-MT|x64 + {B15F131E-328A-4D42-ADC2-9FF4CA6306D8}.Release-MT|x64.Build.0 = Release-MT|x64 + {02F61511-D5B6-46E6-B4BB-DEAA96E6BCC7}.Debug|Win32.ActiveCfg = Debug|Win32 + {02F61511-D5B6-46E6-B4BB-DEAA96E6BCC7}.Debug|Win32.Build.0 = Debug|Win32 + {02F61511-D5B6-46E6-B4BB-DEAA96E6BCC7}.Debug|x64.ActiveCfg = Debug|x64 + {02F61511-D5B6-46E6-B4BB-DEAA96E6BCC7}.Debug|x64.Build.0 = Debug|x64 + {02F61511-D5B6-46E6-B4BB-DEAA96E6BCC7}.Debug-MT|Win32.ActiveCfg = Debug-MT|Win32 + {02F61511-D5B6-46E6-B4BB-DEAA96E6BCC7}.Debug-MT|Win32.Build.0 = Debug-MT|Win32 + {02F61511-D5B6-46E6-B4BB-DEAA96E6BCC7}.Debug-MT|x64.ActiveCfg = Debug-MT|x64 + {02F61511-D5B6-46E6-B4BB-DEAA96E6BCC7}.Debug-MT|x64.Build.0 = Debug-MT|x64 + {02F61511-D5B6-46E6-B4BB-DEAA96E6BCC7}.Release|Win32.ActiveCfg = Release|Win32 + {02F61511-D5B6-46E6-B4BB-DEAA96E6BCC7}.Release|Win32.Build.0 = Release|Win32 + {02F61511-D5B6-46E6-B4BB-DEAA96E6BCC7}.Release|x64.ActiveCfg = Release|x64 + {02F61511-D5B6-46E6-B4BB-DEAA96E6BCC7}.Release|x64.Build.0 = Release|x64 + {02F61511-D5B6-46E6-B4BB-DEAA96E6BCC7}.Release-MT|Win32.ActiveCfg = Release-MT|Win32 + {02F61511-D5B6-46E6-B4BB-DEAA96E6BCC7}.Release-MT|Win32.Build.0 = Release-MT|Win32 + {02F61511-D5B6-46E6-B4BB-DEAA96E6BCC7}.Release-MT|x64.ActiveCfg = Release-MT|x64 + {02F61511-D5B6-46E6-B4BB-DEAA96E6BCC7}.Release-MT|x64.Build.0 = Release-MT|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/xdl/third_party/tbb/build/vs2013/tbb.vcxproj b/xdl/third_party/tbb/build/vs2013/tbb.vcxproj new file mode 100644 index 00000000..cbfcd391 --- /dev/null +++ b/xdl/third_party/tbb/build/vs2013/tbb.vcxproj @@ -0,0 +1,697 @@ + + + + + Debug-MT + Win32 + + + Debug-MT + x64 + + + Debug + Win32 + + + Debug + x64 + + + Release-MT + Win32 + + + Release-MT + x64 + + + Release + Win32 + + + Release + x64 + + + + {F62787DD-1327-448B-9818-030062BCFAA5} + tbb + Win32Proj + + + + DynamicLibrary + NotSet + true + v120 + + + DynamicLibrary + NotSet + v120 + + + DynamicLibrary + NotSet + true + v120 + + + DynamicLibrary + NotSet + v120 + + + DynamicLibrary + NotSet + true + v120 + + + DynamicLibrary + NotSet + v120 + + + DynamicLibrary + NotSet + true + v120 + + + DynamicLibrary + NotSet + v120 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.40219.1 + $(SolutionDir)$(Platform)\$(Configuration)\ + $(SolutionDir)$(Platform)\$(ProjectName)\$(Configuration)\ + false + $(SolutionDir)$(Platform)\$(Configuration)\ + $(SolutionDir)$(Platform)\$(ProjectName)\$(Configuration)\ + false + $(SolutionDir)$(Platform)\$(Configuration)\ + $(SolutionDir)$(Platform)\$(ProjectName)\$(Configuration)\ + false + $(SolutionDir)$(Platform)\$(Configuration)\ + $(SolutionDir)$(Platform)\$(ProjectName)\$(Configuration)\ + false + $(SolutionDir)$(Platform)\$(Configuration)\ + $(SolutionDir)$(Platform)\$(ProjectName)\$(Configuration)\ + false + $(SolutionDir)$(Platform)\$(Configuration)\ + $(SolutionDir)$(Platform)\$(ProjectName)\$(Configuration)\ + false + $(SolutionDir)$(Platform)\$(Configuration)\ + $(SolutionDir)$(Platform)\$(ProjectName)\$(Configuration)\ + false + $(SolutionDir)$(Platform)\$(Configuration)\ + $(SolutionDir)$(Platform)\$(ProjectName)\$(Configuration)\ + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + $(ProjectName)_debug + $(ProjectName)_debug + $(ProjectName)_debug + $(ProjectName)_debug + + + + /c /MDd /Od /Ob0 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /DTBB_USE_DEBUG /D__TBB_LIB_NAME=tbb_debug.lib /DDO_ITT_NOTIFY /GS /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0502 /D__TBB_BUILD=1 /W4 /I../../src /I../../src/rml/include /I../../include + Disabled + .;%(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + ProgramDatabase + + + /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)tbb.def" %(AdditionalOptions) + $(OutDir)tbb_debug.dll + true + Windows + false + + + MachineX86 + + + + + X64 + + + /c /MDd /Od /Ob0 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /DTBB_USE_DEBUG /D__TBB_LIB_NAME=tbb_debug.lib /DDO_ITT_NOTIFY /GS /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0502 /D__TBB_BUILD=1 /W4 /I../../src /I../../src/rml/include /I../../include + Disabled + .;%(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level4 + ProgramDatabase + false + + + /nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)tbb.def" %(AdditionalOptions) + $(OutDir)tbb_debug.dll + true + Windows + false + + + MachineX64 + false + + + + + /c /MD /O2 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /D__TBB_LIB_NAME=tbb.lib /DDO_ITT_NOTIFY /GS /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0502 /D__TBB_BUILD=1 /W4 /I../../src /I../../src/rml/include /I../../include + .;%(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + MultiThreadedDLL + + + Level4 + ProgramDatabase + + + /nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)tbb.def" %(AdditionalOptions) + $(OutDir)tbb.dll + true + Windows + true + true + false + + + MachineX86 + + + + + X64 + + + /c /MD /O2 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /D__TBB_LIB_NAME=tbb.lib /DDO_ITT_NOTIFY /GS /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0502 /D__TBB_BUILD=1 /W4 /I../../src /I../../src/rml/include /I../../include + .;%(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + MultiThreadedDLL + Level4 + ProgramDatabase + + + /nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)tbb.def" %(AdditionalOptions) + $(OutDir)tbb.dll + true + Windows + true + true + false + + + MachineX64 + false + + + + + /c /MTd /Od /Ob0 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /DTBB_USE_DEBUG /D__TBB_LIB_NAME=tbb_debug.lib /DDO_ITT_NOTIFY /GS /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0502 /D__TBB_BUILD=1 /W4 /I../../src /I../../src/rml/include /I../../include + Disabled + .;%(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebug + + + Level4 + ProgramDatabase + + + /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)tbb.def" %(AdditionalOptions) + $(OutDir)tbb_debug.dll + true + Windows + false + + + MachineX86 + + + + + X64 + + + /c /MTd /Od /Ob0 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /DTBB_USE_DEBUG /D__TBB_LIB_NAME=tbb_debug.lib /DDO_ITT_NOTIFY /GS /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0502 /D__TBB_BUILD=1 /W4 /I../../src /I../../src/rml/include /I../../include + Disabled + .;%(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebug + Level4 + ProgramDatabase + false + + + /nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)tbb.def" %(AdditionalOptions) + $(OutDir)tbb_debug.dll + true + Windows + false + + + MachineX64 + false + + + + + /c /MT /O2 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /D__TBB_LIB_NAME=tbb.lib /DDO_ITT_NOTIFY /GS /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0502 /D__TBB_BUILD=1 /W4 /I../../src /I../../src/rml/include /I../../include + .;%(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + MultiThreaded + + + Level4 + ProgramDatabase + + + /nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)tbb.def" %(AdditionalOptions) + $(OutDir)tbb.dll + true + Windows + true + true + false + + + MachineX86 + + + + + X64 + + + /c /MT /O2 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /D__TBB_LIB_NAME=tbb.lib /DDO_ITT_NOTIFY /GS /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0502 /D__TBB_BUILD=1 /W4 /I../../src /I../../src/rml/include /I../../include + .;%(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + MultiThreaded + Level4 + ProgramDatabase + + + /nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)tbb.def" %(AdditionalOptions) + $(OutDir)tbb.dll + true + Windows + true + true + false + + + MachineX64 + false + + + + + /coff /Zi + true + true + /coff /Zi + true + true + /coff + true + true + /coff + true + true + + + true + building atomic_support.obj + ml64 /Fo"$(IntDir)%(FileName).obj" /DUSE_FRAME_POINTER /DEM64T=1 /c /Zi ../../src/tbb/intel64-masm/atomic_support.asm + $(IntDir)%(FileName).obj;%(Outputs) + true + building atomic_support.obj + ml64 /Fo"$(IntDir)%(FileName).obj" /DUSE_FRAME_POINTER /DEM64T=1 /c /Zi ../../src/tbb/intel64-masm/atomic_support.asm + $(IntDir)%(FileName).obj;%(Outputs) + true + building atomic_support.obj + ml64 /Fo"$(IntDir)%(FileName).obj" /DEM64T=1 /c /Zi ../../src/tbb/intel64-masm/atomic_support.asm + $(IntDir)%(FileName).obj;%(Outputs) + true + building atomic_support.obj + ml64 /Fo"$(IntDir)%(FileName).obj" /DEM64T=1 /c /Zi ../../src/tbb/intel64-masm/atomic_support.asm + $(IntDir)%(FileName).obj;%(Outputs) + + + true + building intel64_misc.obj + ml64 /Fo"$(IntDir)%(FileName).obj" /DUSE_FRAME_POINTER /DEM64T=1 /c /Zi ../../src/tbb/intel64-masm/intel64_misc.asm + $(IntDir)%(FileName).obj;%(Outputs) + true + building intel64_misc.obj + ml64 /Fo"$(IntDir)%(FileName).obj" /DUSE_FRAME_POINTER /DEM64T=1 /c /Zi ../../src/tbb/intel64-masm/intel64_misc.asm + $(IntDir)%(FileName).obj;%(Outputs) + true + building intel64_misc.obj + ml64 /Fo"$(IntDir)%(FileName).obj" /DEM64T=1 /c /Zi ../../src/tbb/intel64-masm/intel64_misc.asm + $(IntDir)%(FileName).obj;%(Outputs) + true + building intel64_misc.obj + ml64 /Fo"$(IntDir)%(FileName).obj" /DEM64T=1 /c /Zi ../../src/tbb/intel64-masm/intel64_misc.asm + $(IntDir)%(FileName).obj;%(Outputs) + + + /coff /Zi + true + true + /coff /Zi + true + true + /coff + true + true + /coff + true + true + + + true + building itsx.obj + ml64 /Fo"$(IntDir)%(FileName).obj" /DUSE_FRAME_POINTER /DEM64T=1 /c /Zi ../../src/tbb/intel64-masm/itsx.asm + $(IntDir)%(FileName).obj;%(Outputs) + true + building itsx.obj + ml64 /Fo"$(IntDir)%(FileName).obj" /DUSE_FRAME_POINTER /DEM64T=1 /c /Zi ../../src/tbb/intel64-masm/itsx.asm + $(IntDir)%(FileName).obj;%(Outputs) + true + building itsx.obj + ml64 /Fo"$(IntDir)%(FileName).obj" /DEM64T=1 /c /Zi ../../src/tbb/intel64-masm/itsx.asm + $(IntDir)%(FileName).obj;%(Outputs) + true + building itsx.obj + ml64 /Fo"$(IntDir)%(FileName).obj" /DEM64T=1 /c /Zi ../../src/tbb/intel64-masm/itsx.asm + $(IntDir)%(FileName).obj;%(Outputs) + + + /coff /Zi + true + true + /coff /Zi + /coff /Zi + true + true + /coff /Zi + /coff + true + true + /coff + true + true + + + + + generating tbb.def file + cl /nologo /TC /EP ../../src/tbb/win32-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /I../../src /I../../include >"$(IntDir)tbb.def" + + $(IntDir)tbb.def;%(Outputs) + true + generating tbb.def file + cl /nologo /TC /EP ../../src/tbb/win32-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)tbb.def" + + $(IntDir)tbb.def;%(Outputs) + generating tbb.def file + cl /nologo /TC /EP ../../src/tbb/win32-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /I../../src /I../../include >"$(IntDir)tbb.def" + + $(IntDir)tbb.def;%(Outputs) + true + generating tbb.def file + cl /nologo /TC /EP ../../src/tbb/win32-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)tbb.def" + + $(IntDir)tbb.def;%(Outputs) + generating tbb.def file + cl /nologo /TC /EP ../../src/tbb/win32-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /I../../src /I../../include >"$(IntDir)tbb.def" + + $(IntDir)tbb.def;%(Outputs) + true + generating tbb.def file + cl /nologo /TC /EP ../../src/tbb/win32-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)tbb.def" + + $(IntDir)tbb.def;%(Outputs) + generating tbb.def file + cl /nologo /TC /EP ../../src/tbb/win32-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /I../../src /I../../include >"$(IntDir)tbb.def" + + $(IntDir)tbb.def;%(Outputs) + true + generating tbb.def file + cl /nologo /TC /EP ../../src/tbb/win32-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)tbb.def" + + $(IntDir)tbb.def;%(Outputs) + + + true + generating tbb.def file + cl /nologo /TC /EP ../../src/tbb/win64-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)tbb.def" + + $(IntDir)tbb.def;%(Outputs) + generating tbb.def file + cl /nologo /TC /EP ../../src/tbb/win64-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /I../../src /I../../include >"$(IntDir)tbb.def" + + $(IntDir)tbb.def;%(Outputs) + true + generating tbb.def file + cl /nologo /TC /EP ../../src/tbb/win64-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)tbb.def" + + $(IntDir)tbb.def;%(Outputs) + generating tbb.def file + cl /nologo /TC /EP ../../src/tbb/win64-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /I../../src /I../../include >"$(IntDir)tbb.def" + + $(IntDir)tbb.def;%(Outputs) + true + generating tbb.def file + cl /nologo /TC /EP ../../src/tbb/win64-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)tbb.def" + + $(IntDir)tbb.def;%(Outputs) + generating tbb.def file + cl /nologo /TC /EP ../../src/tbb/win64-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /I../../src /I../../include >"$(IntDir)tbb.def" + + $(IntDir)tbb.def;%(Outputs) + true + generating tbb.def file + cl /nologo /TC /EP ../../src/tbb/win64-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 >"$(IntDir)tbb.def" + + $(IntDir)tbb.def;%(Outputs) + generating tbb.def file + cl /nologo /TC /EP ../../src/tbb/win64-tbb-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBB_BUILD=1 /I../../src /I../../include >"$(IntDir)tbb.def" + + $(IntDir)tbb.def;%(Outputs) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 %(AdditionalOptions) + /I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 %(AdditionalOptions) + /I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 %(AdditionalOptions) + /I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 %(AdditionalOptions) + /I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 %(AdditionalOptions) + /I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 %(AdditionalOptions) + /I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 %(AdditionalOptions) + /I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 %(AdditionalOptions) + + + + + + + \ No newline at end of file diff --git a/xdl/third_party/tbb/build/vs2013/tbbmalloc.vcxproj b/xdl/third_party/tbb/build/vs2013/tbbmalloc.vcxproj new file mode 100644 index 00000000..0a38cd5f --- /dev/null +++ b/xdl/third_party/tbb/build/vs2013/tbbmalloc.vcxproj @@ -0,0 +1,559 @@ + + + + + Debug-MT + Win32 + + + Debug-MT + x64 + + + Debug + Win32 + + + Debug + x64 + + + Release-MT + Win32 + + + Release-MT + x64 + + + Release + Win32 + + + Release + x64 + + + + {B15F131E-328A-4D42-ADC2-9FF4CA6306D8} + tbbmalloc + Win32Proj + + + + DynamicLibrary + NotSet + true + v120 + + + DynamicLibrary + NotSet + v120 + + + DynamicLibrary + NotSet + true + v120 + + + DynamicLibrary + NotSet + v120 + + + DynamicLibrary + NotSet + true + v120 + + + DynamicLibrary + NotSet + v120 + + + DynamicLibrary + NotSet + true + v120 + + + DynamicLibrary + NotSet + v120 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.40219.1 + $(SolutionDir)$(Platform)\$(Configuration)\ + $(SolutionDir)$(Platform)\$(ProjectName)\$(Configuration)\ + false + $(SolutionDir)$(Platform)\$(Configuration)\ + $(SolutionDir)$(Platform)\$(ProjectName)\$(Configuration)\ + false + $(SolutionDir)$(Platform)\$(Configuration)\ + $(SolutionDir)$(Platform)\$(ProjectName)\$(Configuration)\ + false + $(SolutionDir)$(Platform)\$(Configuration)\ + $(SolutionDir)$(Platform)\$(ProjectName)\$(Configuration)\ + false + $(SolutionDir)$(Platform)\$(Configuration)\ + $(SolutionDir)$(Platform)\$(ProjectName)\$(Configuration)\ + false + $(SolutionDir)$(Platform)\$(Configuration)\ + $(SolutionDir)$(Platform)\$(ProjectName)\$(Configuration)\ + false + $(SolutionDir)$(Platform)\$(Configuration)\ + $(SolutionDir)$(Platform)\$(ProjectName)\$(Configuration)\ + false + $(SolutionDir)$(Platform)\$(Configuration)\ + $(SolutionDir)$(Platform)\$(ProjectName)\$(Configuration)\ + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + $(ProjectName)_debug + $(ProjectName)_debug + $(ProjectName)_debug + $(ProjectName)_debug + + + + /c /MDd /Od /Ob0 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /DTBB_USE_DEBUG /D__TBB_LIB_NAME=tbb_debug.lib /DDO_ITT_NOTIFY /GS /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0502 /D__TBBMALLOC_BUILD=1 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc /I. + Disabled + .;%(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + Level4 + ProgramDatabase + false + + + /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)tbbmalloc.def" %(AdditionalOptions) + $(OutDir)tbbmalloc_debug.dll + true + Windows + false + + + MachineX86 + + + + + X64 + + + /c /MDd /Od /Ob0 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /DTBB_USE_DEBUG /D__TBB_LIB_NAME=tbb_debug.lib /DDO_ITT_NOTIFY /GS /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0502 /D__TBBMALLOC_BUILD=1 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc /I. + Disabled + .;%(AdditionalIncludeDirectories) + false + Default + MultiThreadedDebugDLL + true + Level4 + ProgramDatabase + false + false + + + /nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)tbbmalloc.def" %(AdditionalOptions) + $(OutDir)tbbmalloc_debug.dll + true + Windows + false + + + MachineX64 + + + + + /c /MD /O2 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /D__TBB_LIB_NAME=tbb.lib /DDO_ITT_NOTIFY /GS /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0502 /D__TBBMALLOC_BUILD=1 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc /I. + .;%(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + MultiThreadedDLL + Level4 + ProgramDatabase + false + + + /nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)tbbmalloc.def" %(AdditionalOptions) + $(OutDir)tbbmalloc.dll + true + Windows + true + true + false + + + MachineX86 + + + + + X64 + + + /c /MD /O2 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /D__TBB_LIB_NAME=tbb.lib /DDO_ITT_NOTIFY /GS /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0502 /D__TBBMALLOC_BUILD=1 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc /I. + .;%(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + MultiThreadedDLL + Level4 + ProgramDatabase + false + + + /nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)tbbmalloc.def" %(AdditionalOptions) + $(OutDir)tbbmalloc.dll + true + Windows + true + true + false + + + MachineX64 + + + + + /c /MTd /Od /Ob0 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /DTBB_USE_DEBUG /D__TBB_LIB_NAME=tbb_debug.lib /DDO_ITT_NOTIFY /GS /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0502 /D__TBBMALLOC_BUILD=1 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc /I. + Disabled + .;%(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + true + Default + MultiThreadedDebug + Level4 + ProgramDatabase + false + + + /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)tbbmalloc.def" %(AdditionalOptions) + $(OutDir)tbbmalloc_debug.dll + true + Windows + false + + + MachineX86 + + + + + X64 + + + /c /MTd /Od /Ob0 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /DTBB_USE_DEBUG /D__TBB_LIB_NAME=tbb_debug.lib /DDO_ITT_NOTIFY /GS /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0502 /D__TBBMALLOC_BUILD=1 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc /I. + Disabled + .;%(AdditionalIncludeDirectories) + false + Default + MultiThreadedDebug + true + Level4 + ProgramDatabase + false + false + + + /nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)tbbmalloc.def" %(AdditionalOptions) + $(OutDir)tbbmalloc_debug.dll + true + Windows + false + + + MachineX64 + + + + + /c /MT /O2 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /D__TBB_LIB_NAME=tbb.lib /DDO_ITT_NOTIFY /GS /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0502 /D__TBBMALLOC_BUILD=1 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc /I. + .;%(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + MultiThreaded + Level4 + ProgramDatabase + false + + + /nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)tbbmalloc.def" %(AdditionalOptions) + $(OutDir)tbbmalloc.dll + true + Windows + true + true + false + MachineX86 + + + + + X64 + + + /c /MT /O2 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /D__TBB_LIB_NAME=tbb.lib /DDO_ITT_NOTIFY /GS /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0502 /D__TBBMALLOC_BUILD=1 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc /I. + .;%(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + MultiThreaded + Level4 + ProgramDatabase + false + + + /nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DEF:"$(IntDir)tbbmalloc.def" %(AdditionalOptions) + $(OutDir)tbbmalloc.dll + true + Windows + true + true + false + + + MachineX64 + + + + + true + building atomic_support.obj + ml64 /Fo"$(IntDir)%(FileName).obj" /DUSE_FRAME_POINTER /DEM64T=1 /c /Zi ../../src/tbb/intel64-masm/atomic_support.asm + $(IntDir)%(FileName).obj;%(Outputs) + true + building atomic_support.obj + ml64 /Fo"$(IntDir)%(FileName).obj" /DUSE_FRAME_POINTER /DEM64T=1 /c /Zi ../../src/tbb/intel64-masm/atomic_support.asm + $(IntDir)%(FileName).obj;%(Outputs) + true + building atomic_support.obj + ml64 /Fo"$(IntDir)%(FileName).obj" /DEM64T=1 /c /Zi ../../src/tbb/intel64-masm/atomic_support.asm + $(IntDir)%(FileName).obj;%(Outputs) + true + building atomic_support.obj + ml64 /Fo"$(IntDir)%(FileName).obj" /DEM64T=1 /c /Zi ../../src/tbb/intel64-masm/atomic_support.asm + $(IntDir)%(FileName).obj;%(Outputs) + + + + + generating tbbmalloc.def file + cl /nologo /TC /EP ../../src/tbbmalloc/win32-tbbmalloc-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBBMALLOC_BUILD=1 >"$(IntDir)tbbmalloc.def" + + $(IntDir)tbbmalloc.def;%(Outputs) + true + generating tbbmalloc.def file + cl /nologo /TC /EP ../../src/tbbmalloc/win32-tbbmalloc-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBBMALLOC_BUILD=1 >"$(IntDir)tbbmalloc.def" + + $(IntDir)tbbmalloc.def;%(Outputs) + generating tbbmalloc.def file + cl /nologo /TC /EP ../../src/tbbmalloc/win32-tbbmalloc-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBBMALLOC_BUILD=1 >"$(IntDir)tbbmalloc.def" + + $(IntDir)tbbmalloc.def;%(Outputs) + true + generating tbbmalloc.def file + cl /nologo /TC /EP ../../src/tbbmalloc/win32-tbbmalloc-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBBMALLOC_BUILD=1 >"$(IntDir)tbbmalloc.def" + + $(IntDir)tbbmalloc.def;%(Outputs) + generating tbbmalloc.def file + cl /nologo /TC /EP ../../src/tbbmalloc/win32-tbbmalloc-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBBMALLOC_BUILD=1 >"$(IntDir)tbbmalloc.def" + + $(IntDir)tbbmalloc.def;%(Outputs) + true + generating tbbmalloc.def file + cl /nologo /TC /EP ../../src/tbb/win32-tbbmalloc-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBBMALLOC_BUILD=1 >"$(IntDir)tbbmalloc.def" + + $(IntDir)tbbmalloc.def;%(Outputs) + generating tbbmalloc.def file + cl /nologo /TC /EP ../../src/tbbmalloc/win32-tbbmalloc-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBBMALLOC_BUILD=1 >"$(IntDir)tbbmalloc.def" + + $(IntDir)tbbmalloc.def;%(Outputs) + true + generating tbbmalloc.def file + cl /nologo /TC /EP ../../src/tbb/win32-tbbmalloc-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBBMALLOC_BUILD=1 >"$(IntDir)tbbmalloc.def" + + $(IntDir)tbbmalloc.def;%(Outputs) + + + true + generating tbbmalloc.def file + cl /nologo /TC /EP ../../src/tbb/win64-tbbmalloc-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBBMALLOC_BUILD=1 >"$(IntDir)tbbmalloc.def" + + $(IntDir)tbbmalloc.def;%(Outputs) + generating tbbmalloc.def file + cl /nologo /TC /EP ../../src/tbbmalloc/win64-tbbmalloc-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBBMALLOC_BUILD=1 >"$(IntDir)tbbmalloc.def" + + $(IntDir)tbbmalloc.def;%(Outputs) + true + generating tbbmalloc.def file + cl /nologo /TC /EP ../../src/tbb/win64-tbbmalloc-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBBMALLOC_BUILD=1 >"$(IntDir)tbbmalloc.def" + + $(IntDir)tbbmalloc.def;%(Outputs) + generating tbbmalloc.def file + cl /nologo /TC /EP ../../src/tbbmalloc/win64-tbbmalloc-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBBMALLOC_BUILD=1 >"$(IntDir)tbbmalloc.def" + + $(IntDir)tbbmalloc.def;%(Outputs) + true + generating tbbmalloc.def file + cl /nologo /TC /EP ../../src/tbb/win64-tbbmalloc-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBBMALLOC_BUILD=1 >"$(IntDir)tbbmalloc.def" + + $(IntDir)tbbmalloc.def;%(Outputs) + generating tbbmalloc.def file + cl /nologo /TC /EP ../../src/tbbmalloc/win64-tbbmalloc-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBBMALLOC_BUILD=1 >"$(IntDir)tbbmalloc.def" + + $(IntDir)tbbmalloc.def;%(Outputs) + true + generating tbbmalloc.def file + cl /nologo /TC /EP ../../src/tbb/win64-tbbmalloc-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBBMALLOC_BUILD=1 >"$(IntDir)tbbmalloc.def" + + $(IntDir)tbbmalloc.def;%(Outputs) + generating tbbmalloc.def file + cl /nologo /TC /EP ../../src/tbbmalloc/win64-tbbmalloc-export.def /DTBB_USE_DEBUG /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 /D__TBBMALLOC_BUILD=1 >"$(IntDir)tbbmalloc.def" + + $(IntDir)tbbmalloc.def;%(Outputs) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 %(AdditionalOptions) + /I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 %(AdditionalOptions) + /I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 %(AdditionalOptions) + /I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 %(AdditionalOptions) + /I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 %(AdditionalOptions) + /I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 %(AdditionalOptions) + /I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 %(AdditionalOptions) + /I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 %(AdditionalOptions) + + + + + {f62787dd-1327-448b-9818-030062bcfaa5} + false + + + + + + + \ No newline at end of file diff --git a/xdl/third_party/tbb/build/vs2013/tbbmalloc_proxy.vcxproj b/xdl/third_party/tbb/build/vs2013/tbbmalloc_proxy.vcxproj new file mode 100644 index 00000000..758bb517 --- /dev/null +++ b/xdl/third_party/tbb/build/vs2013/tbbmalloc_proxy.vcxproj @@ -0,0 +1,425 @@ + + + + + Debug-MT + Win32 + + + Debug-MT + x64 + + + Debug + Win32 + + + Debug + x64 + + + Release-MT + Win32 + + + Release-MT + x64 + + + Release + Win32 + + + Release + x64 + + + + {02F61511-D5B6-46E6-B4BB-DEAA96E6BCC7} + tbbmalloc_proxy + Win32Proj + + + + DynamicLibrary + NotSet + true + v120 + + + DynamicLibrary + NotSet + v120 + + + DynamicLibrary + NotSet + true + v120 + + + DynamicLibrary + NotSet + v120 + + + DynamicLibrary + NotSet + true + v120 + + + DynamicLibrary + NotSet + v120 + + + DynamicLibrary + NotSet + true + v120 + + + DynamicLibrary + NotSet + v120 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.40219.1 + $(SolutionDir)$(Platform)\$(Configuration)\ + $(SolutionDir)$(Platform)\$(ProjectName)\$(Configuration)\ + false + $(SolutionDir)$(Platform)\$(Configuration)\ + $(SolutionDir)$(Platform)\$(ProjectName)\$(Configuration)\ + false + $(SolutionDir)$(Platform)\$(Configuration)\ + $(SolutionDir)$(Platform)\$(ProjectName)\$(Configuration)\ + false + $(SolutionDir)$(Platform)\$(Configuration)\ + $(SolutionDir)$(Platform)\$(ProjectName)\$(Configuration)\ + false + $(SolutionDir)$(Platform)\$(Configuration)\ + $(SolutionDir)$(Platform)\$(ProjectName)\$(Configuration)\ + false + $(SolutionDir)$(Platform)\$(Configuration)\ + $(SolutionDir)$(Platform)\$(ProjectName)\$(Configuration)\ + false + $(SolutionDir)$(Platform)\$(Configuration)\ + $(SolutionDir)$(Platform)\$(ProjectName)\$(Configuration)\ + false + $(SolutionDir)$(Platform)\$(Configuration)\ + $(SolutionDir)$(Platform)\$(ProjectName)\$(Configuration)\ + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + $(ProjectName)_debug + $(ProjectName)_debug + $(ProjectName)_debug + $(ProjectName)_debug + + + + /c /MDd /Od /Ob0 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /DTBB_USE_DEBUG /D__TBB_LIB_NAME=tbb_debug.lib /DDO_ITT_NOTIFY /GS /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0502 /W4 /D__TBBMALLOC_BUILD=1 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc + Disabled + .;%(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + true + Sync + Default + MultiThreadedDebugDLL + + + Level4 + ProgramDatabase + + + /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO %(AdditionalOptions) + $(OutDir)tbbmalloc_proxy_debug.dll + true + Windows + false + + + MachineX86 + + + + + X64 + + + /c /MDd /Od /Ob0 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /DTBB_USE_DEBUG /D__TBB_LIB_NAME=tbb_debug.lib /DDO_ITT_NOTIFY /GS /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0502 /W4 /D__TBBMALLOC_BUILD=1 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc + Disabled + .;%(AdditionalIncludeDirectories) + false + + + Default + MultiThreadedDebugDLL + true + + + Level4 + ProgramDatabase + false + + + /nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO %(AdditionalOptions) + $(OutDir)tbbmalloc_proxy_debug.dll + true + Windows + false + + + MachineX64 + + + + + /c /MD /O2 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /D__TBB_LIB_NAME=tbb.lib /DDO_ITT_NOTIFY /GS /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0502 /W4 /D__TBBMALLOC_BUILD=1 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc + .;%(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + + + MultiThreadedDLL + + + Level4 + ProgramDatabase + + + /nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO %(AdditionalOptions) + $(OutDir)tbbmalloc_proxy.dll + true + Windows + true + true + false + + + MachineX86 + + + + + X64 + + + /c /MD /O2 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /D__TBB_LIB_NAME=tbb.lib /DDO_ITT_NOTIFY /GS /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0502 /W4 /D__TBBMALLOC_BUILD=1 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc + .;%(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + + + MultiThreadedDLL + + + Level4 + ProgramDatabase + + + /nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO %(AdditionalOptions) + $(OutDir)tbbmalloc_proxy.dll + true + Windows + true + true + false + + + MachineX64 + + + + + /c /MTd /Od /Ob0 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /DTBB_USE_DEBUG /D__TBB_LIB_NAME=tbb_debug.lib /DDO_ITT_NOTIFY /GS /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0502 /W4 /D__TBBMALLOC_BUILD=1 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc + Disabled + .;%(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + true + Sync + Default + MultiThreadedDebug + + + Level4 + ProgramDatabase + + + /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO %(AdditionalOptions) + $(OutDir)tbbmalloc_proxy_debug.dll + true + Windows + false + + + MachineX86 + + + + + X64 + + + /c /MTd /Od /Ob0 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /DTBB_USE_DEBUG /D__TBB_LIB_NAME=tbb_debug.lib /DDO_ITT_NOTIFY /GS /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0502 /W4 /D__TBBMALLOC_BUILD=1 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc + Disabled + .;%(AdditionalIncludeDirectories) + false + + + Default + MultiThreadedDebug + true + + + Level4 + ProgramDatabase + false + + + /nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO %(AdditionalOptions) + $(OutDir)tbbmalloc_proxy_debug.dll + true + Windows + false + + + MachineX64 + + + + + /c /MT /O2 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /D__TBB_LIB_NAME=tbb.lib /DDO_ITT_NOTIFY /GS /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0502 /W4 /D__TBBMALLOC_BUILD=1 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc + .;%(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + + + MultiThreaded + + + Level4 + ProgramDatabase + + + /nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO %(AdditionalOptions) + $(OutDir)tbbmalloc_proxy.dll + true + Windows + true + true + false + + + MachineX86 + + + + + X64 + + + /c /MT /O2 /Zi /EHsc /GR /Zc:forScope /Zc:wchar_t /D__TBB_LIB_NAME=tbb.lib /DDO_ITT_NOTIFY /GS /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0502 /W4 /D__TBBMALLOC_BUILD=1 /I../../src /I../../src/rml/include /I../../include /I../../src/tbbmalloc /I../../src/tbbmalloc + .;%(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + + + MultiThreaded + + + Level4 + ProgramDatabase + + + /nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO %(AdditionalOptions) + $(OutDir)tbbmalloc_proxy.dll + true + Windows + true + true + false + + + MachineX64 + + + + + + + + + + + /I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 %(AdditionalOptions) + /I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 %(AdditionalOptions) + /I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 %(AdditionalOptions) + /I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 %(AdditionalOptions) + /I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 %(AdditionalOptions) + /I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 %(AdditionalOptions) + /I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 %(AdditionalOptions) + /I../../src /I../../include /DDO_ITT_NOTIFY /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0400 %(AdditionalOptions) + + + + + + + {b15f131e-328a-4d42-adc2-9ff4ca6306d8} + false + + + + + + + \ No newline at end of file diff --git a/xdl/third_party/tbb/build/vs2013/version_string.ver b/xdl/third_party/tbb/build/vs2013/version_string.ver new file mode 100644 index 00000000..5d8f04e5 --- /dev/null +++ b/xdl/third_party/tbb/build/vs2013/version_string.ver @@ -0,0 +1 @@ +#define __TBB_VERSION_STRINGS(N) "Empty" diff --git a/xdl/third_party/tbb/build/windows.cl.inc b/xdl/third_party/tbb/build/windows.cl.inc new file mode 100644 index 00000000..97909cf4 --- /dev/null +++ b/xdl/third_party/tbb/build/windows.cl.inc @@ -0,0 +1,166 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +#------------------------------------------------------------------------------ +# Define compiler-specific variables. +#------------------------------------------------------------------------------ + + +#------------------------------------------------------------------------------ +# Setting compiler flags. +#------------------------------------------------------------------------------ +CPLUS ?= cl /nologo +LINK_FLAGS = /link /nologo +LIB_LINK_FLAGS=/link /nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DYNAMICBASE /NXCOMPAT + +ifneq (,$(stdver)) + CXX_STD_FLAGS = /std:$(stdver) +endif + +ifeq ($(arch), ia32) + LIB_LINK_FLAGS += /SAFESEH +endif + +ifeq ($(runtime), vc_mt) + MS_CRT_KEY = /MT$(if $(findstring debug,$(cfg)),d) +else + MS_CRT_KEY = /MD$(if $(findstring debug,$(cfg)),d) +endif +EH_FLAGS = $(if $(no_exceptions),/EHs-,/EHsc /GR) + +# UWD binaries have to use static CRT linkage +ifeq ($(target_app), uwd) + MS_CRT_KEY = /MT$(if $(findstring debug,$(cfg)),d) +endif + +ifeq ($(cfg), release) + CPLUS_FLAGS = $(MS_CRT_KEY) /O2 /Zi $(EH_FLAGS) /Zc:forScope /Zc:wchar_t /D__TBB_LIB_NAME=$(TBB.LIB) + ASM_FLAGS = +endif +ifeq ($(cfg), debug) + CPLUS_FLAGS = $(MS_CRT_KEY) /Od /Ob0 /Zi $(EH_FLAGS) /Zc:forScope /Zc:wchar_t /DTBB_USE_DEBUG /D__TBB_LIB_NAME=$(TBB.LIB) + ASM_FLAGS = /DUSE_FRAME_POINTER +endif + +ZW_KEY = /ZW:nostdlib + +# These flags are general for Windows* universal applications +ifneq (,$(target_app)) + CPLUS_FLAGS += $(ZW_KEY) /D "_UNICODE" /D "UNICODE" /D "WINAPI_FAMILY=WINAPI_FAMILY_APP" +endif + +ifeq ($(target_app), win8ui) + _WIN32_WINNT = 0x0602 +else ifneq (,$(filter $(target_app),uwp uwd)) + _WIN32_WINNT = 0x0A00 + LIB_LINK_FLAGS += /NODEFAULTLIB:kernel32.lib OneCore.lib +else + CPLUS_FLAGS += /DDO_ITT_NOTIFY +endif +ifeq ($(target_mode), store) +# it is necessary to source vcvars with 'store' argument in production + LIB_LINK_FLAGS += /APPCONTAINER +endif + +CPLUS_FLAGS += /GS + +COMPILE_ONLY = /c +PREPROC_ONLY = /TP /EP +INCLUDE_KEY = /I +DEFINE_KEY = /D +OUTPUT_KEY = /Fe +OUTPUTOBJ_KEY = /Fo +WARNING_AS_ERROR_KEY = /WX +WARNING_SUPPRESS = $(if $(no_exceptions),/wd4530 /wd4577) +BIGOBJ_KEY = /bigobj + +ifeq ($(runtime),vc7.1) + WARNING_KEY = /W3 +else + WARNING_KEY = /W4 + OPENMP_FLAG = /openmp +endif + +DYLIB_KEY = /DLL +EXPORT_KEY = /DEF: +NODEFAULTLIB_KEY = /Zl +NOINTRINSIC_KEY = /Oi- + +INCLUDE_TEST_HEADERS = /FI$(tbb_root)/src/test/harness_preload.h + +ifeq ($(runtime),vc8) + WARNING_KEY += /Wp64 + CPLUS_FLAGS += /D_USE_RTM_VERSION +endif + +# Since VS2012, VC++ provides /volatile option to control semantics of volatile variables. +# We want to use strict ISO semantics in the library and tests +ifeq (ok,$(call detect_js,/minversion cl 17)) + CPLUS_FLAGS += /volatile:iso +endif + +# Since VS2013, VC++ uses the same .pdb file for different sources so we need +# to add /FS (Force Synchronous PDB Writes) +ifeq (ok,$(call detect_js,/minversion cl 18)) + CPLUS_FLAGS += /FS +endif + +CPLUS_FLAGS += /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE \ + /D_WIN32_WINNT=$(_WIN32_WINNT) +C_FLAGS = $(subst $(ZW_KEY),,$(subst $(EH_FLAGS),,$(CPLUS_FLAGS))) + +#------------------------------------------------------------------------------ +# End of setting compiler flags. +#------------------------------------------------------------------------------ + + +#------------------------------------------------------------------------------ +# Setting assembler data. +#------------------------------------------------------------------------------ +ASSEMBLY_SOURCE=$(arch)-masm +ifeq (intel64,$(arch)) + ASM=ml64 /nologo + ASM_FLAGS += /DEM64T=1 /c /Zi + TBB_ASM.OBJ = atomic_support.obj intel64_misc.obj itsx.obj + MALLOC_ASM.OBJ = atomic_support.obj +else +ifeq (armv7,$(arch)) + ASM= + TBB_ASM.OBJ= +else + ASM=ml /nologo + ASM_FLAGS += /c /coff /Zi /safeseh + TBB_ASM.OBJ = atomic_support.obj lock_byte.obj itsx.obj +endif +endif +#------------------------------------------------------------------------------ +# End of setting assembler data. +#------------------------------------------------------------------------------ + + +#------------------------------------------------------------------------------ +# Setting tbbmalloc data. +#------------------------------------------------------------------------------ +M_CPLUS_FLAGS = $(CPLUS_FLAGS) +#------------------------------------------------------------------------------ +# End of setting tbbmalloc data. +#------------------------------------------------------------------------------ + +#------------------------------------------------------------------------------ +# End of define compiler-specific variables. +#------------------------------------------------------------------------------ diff --git a/xdl/third_party/tbb/build/windows.gcc.inc b/xdl/third_party/tbb/build/windows.gcc.inc new file mode 100644 index 00000000..90a956af --- /dev/null +++ b/xdl/third_party/tbb/build/windows.gcc.inc @@ -0,0 +1,142 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +#------------------------------------------------------------------------------ +# Overriding settings from windows.inc +#------------------------------------------------------------------------------ + +SLASH= $(strip \) +OBJ = o +LIBEXT = dll # MinGW allows linking with DLLs directly + +TBB.RES = +MALLOC.RES = +RML.RES = +TBB.MANIFEST = +MALLOC.MANIFEST = +RML.MANIFEST = + +ifeq (ia32,$(arch)) + TBB.LST = $(tbb_root)/src/tbb/lin32-tbb-export.lst +else + TBB.LST = $(tbb_root)/src/tbb/win64-gcc-tbb-export.lst +endif +MALLOC.DEF = $(MALLOC_ROOT)/$(def_prefix)-gcc-tbbmalloc-export.def +RML.DEF = $(RML_SERVER_ROOT)/lin-rml-export.def + +LINK_TBB.LIB = $(TBB.LIB) +# no TBB proxy for the configuration +PROXY.LIB = + +#------------------------------------------------------------------------------ +# End of overridden settings +#------------------------------------------------------------------------------ +# Compiler-specific variables +#------------------------------------------------------------------------------ + +CPLUS ?= g++ +COMPILE_ONLY = -c -MMD +PREPROC_ONLY = -E -x c++ +INCLUDE_KEY = -I +DEFINE_KEY = -D +OUTPUT_KEY = -o # +OUTPUTOBJ_KEY = -o # +PIC_KEY = +WARNING_AS_ERROR_KEY = -Werror +WARNING_KEY = -Wall +TEST_WARNING_KEY = -Wextra -Wshadow -Wcast-qual -Woverloaded-virtual -Wnon-virtual-dtor -Wno-uninitialized +WARNING_SUPPRESS = -Wno-parentheses -Wno-uninitialized -Wno-non-virtual-dtor +DYLIB_KEY = -shared +LIBDL = +EXPORT_KEY = -Wl,--version-script, +LIBS = -lpsapi +BIGOBJ_KEY = -Wa,-mbig-obj + +#------------------------------------------------------------------------------ +# End of compiler-specific variables +#------------------------------------------------------------------------------ +# Command lines +#------------------------------------------------------------------------------ + +LINK_FLAGS = -Wl,--enable-auto-import +LIB_LINK_FLAGS = $(DYLIB_KEY) + +# gcc 4.8 and later support RTM intrinsics, but require command line switch to enable them +ifeq (ok,$(call detect_js,/minversion gcc 4.8)) + RTM_KEY = -mrtm +endif + +# gcc 6.0 and later have -flifetime-dse option that controls +# elimination of stores done outside the object lifetime +ifeq (ok,$(call detect_js,/minversion gcc 6.0)) + # keep pre-contruction stores for zero initialization + DSE_KEY = -flifetime-dse=1 +endif + +ifeq ($(cfg), release) + CPLUS_FLAGS = -g -O2 +endif +ifeq ($(cfg), debug) + CPLUS_FLAGS = -g -O0 -DTBB_USE_DEBUG +endif + +CPLUS_FLAGS += -DUSE_WINTHREAD +CPLUS_FLAGS += -D_WIN32_WINNT=$(_WIN32_WINNT) + +# MinGW specific +CPLUS_FLAGS += -DMINGW_HAS_SECURE_API=1 -D__MSVCRT_VERSION__=0x0700 -msse -mthreads + +CONLY = gcc +debugger = gdb +C_FLAGS = $(CPLUS_FLAGS) + +ifeq (intel64,$(arch)) + CPLUS_FLAGS += -m64 $(RTM_KEY) + LIB_LINK_FLAGS += -m64 +endif + +ifeq (ia32,$(arch)) + CPLUS_FLAGS += -m32 -march=i686 $(RTM_KEY) + LIB_LINK_FLAGS += -m32 +endif + +# For examples +export UNIXMODE = 1 + +#------------------------------------------------------------------------------ +# End of command lines +#------------------------------------------------------------------------------ +# Setting assembler data +#------------------------------------------------------------------------------ + +ASM= +ASM_FLAGS= +TBB_ASM.OBJ= +ASSEMBLY_SOURCE=$(arch)-gas + +#------------------------------------------------------------------------------ +# End of setting assembler data +#------------------------------------------------------------------------------ +# Setting tbbmalloc data +#------------------------------------------------------------------------------ + +M_CPLUS_FLAGS = $(CPLUS_FLAGS) -fno-rtti -fno-exceptions + +#------------------------------------------------------------------------------ +# End of setting tbbmalloc data +#------------------------------------------------------------------------------ diff --git a/xdl/third_party/tbb/build/windows.icl.inc b/xdl/third_party/tbb/build/windows.icl.inc new file mode 100644 index 00000000..8fc8cdf7 --- /dev/null +++ b/xdl/third_party/tbb/build/windows.icl.inc @@ -0,0 +1,178 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +#------------------------------------------------------------------------------ +# Define compiler-specific variables. +#------------------------------------------------------------------------------ + + +#------------------------------------------------------------------------------ +# Setting default configuration to release. +#------------------------------------------------------------------------------ +cfg ?= release +#------------------------------------------------------------------------------ +# End of setting default configuration to release. +#------------------------------------------------------------------------------ + + +#------------------------------------------------------------------------------ +# Setting compiler flags. +#------------------------------------------------------------------------------ +CPLUS ?= icl /nologo $(VCCOMPAT_FLAG) +LINK_FLAGS = /link /nologo +LIB_LINK_FLAGS= /link /nologo /DLL /MAP /DEBUG /fixed:no /INCREMENTAL:NO /DYNAMICBASE /NXCOMPAT + +ifeq ($(arch), ia32) + LIB_LINK_FLAGS += /SAFESEH +endif + +ifneq (,$(stdver)) + CXX_STD_FLAGS = /Qstd=$(stdver) +endif + +# ICC 12.0 and higher provide Intel(R) Cilk(TM) Plus +ifeq (ok,$(call detect_js,/minversion icl 12)) + CILK_AVAILABLE = yes +endif + +# ICC 17.0.4 and higher provide support for VS2017 +ifeq (ok,$(call detect_js,/minversion icl 17 4)) + VS2017_SUPPORT = yes +endif + +ifeq ($(runtime), vc_mt) + MS_CRT_KEY = /MT$(if $(findstring debug,$(cfg)),d) +else + MS_CRT_KEY = /MD$(if $(findstring debug,$(cfg)),d) +endif +EH_FLAGS = $(if $(no_exceptions),/EHs-,/EHsc /GR) + +ifeq ($(cfg), release) + CPLUS_FLAGS = $(MS_CRT_KEY) /O2 /Zi $(EH_FLAGS) /Zc:forScope /Zc:wchar_t /D__TBB_LIB_NAME=$(TBB.LIB) + ASM_FLAGS = +endif +ifeq ($(cfg), debug) + CPLUS_FLAGS = $(MS_CRT_KEY) /Od /Ob0 /Zi $(EH_FLAGS) /Zc:forScope /Zc:wchar_t /DTBB_USE_DEBUG /D__TBB_LIB_NAME=$(TBB.LIB) + ASM_FLAGS = /DUSE_FRAME_POINTER +endif +CPLUS_FLAGS += /GS + +COMPILE_ONLY = /c /QMMD +# PREPROC_ONLY should really use /TP which applies to all files in the command line. +# But with /TP, ICL does not preprocess *.def files. +PREPROC_ONLY = /EP /Tp +INCLUDE_KEY = /I +DEFINE_KEY = /D +OUTPUT_KEY = /Fe +OUTPUTOBJ_KEY = /Fo +WARNING_AS_ERROR_KEY = /WX +WARNING_KEY = /W3 +WARNING_SUPPRESS = $(if $(no_exceptions),/wd583) +DYLIB_KEY = /DLL +EXPORT_KEY = /DEF: +NODEFAULTLIB_KEY = /Zl +NOINTRINSIC_KEY = /Oi- +BIGOBJ_KEY = /bigobj +INCLUDE_TEST_HEADERS = /FI$(tbb_root)/src/test/harness_preload.h + + +ifneq (,$(codecov)) + CPLUS_FLAGS += /Qprof-genx +else + CPLUS_FLAGS += /DDO_ITT_NOTIFY +endif + +OPENMP_FLAG = /Qopenmp +CPLUS_FLAGS += /DUSE_WINTHREAD /D_CRT_SECURE_NO_DEPRECATE \ + /D_WIN32_WINNT=$(_WIN32_WINNT) + +ifeq ($(runtime),vc8) + CPLUS_FLAGS += /D_USE_RTM_VERSION +endif + + +C_FLAGS = $(subst $(EH_FLAGS),,$(CPLUS_FLAGS)) + +VCVERSION:=$(runtime) +VCCOMPAT_FLAG ?= $(if $(findstring vc7.1, $(VCVERSION)),/Qvc7.1) +ifeq ($(VCCOMPAT_FLAG),) + VCCOMPAT_FLAG := $(if $(findstring vc8, $(VCVERSION)),/Qvc8) +endif +ifeq ($(VCCOMPAT_FLAG),) + VCCOMPAT_FLAG := $(if $(findstring vc_mt, $(VCVERSION)),/Qvc10) +endif +ifeq ($(VCCOMPAT_FLAG),) + VCCOMPAT_FLAG := $(if $(findstring vc9, $(VCVERSION)),/Qvc9) +endif +ifeq ($(VCCOMPAT_FLAG),) + VCCOMPAT_FLAG := $(if $(findstring vc10, $(VCVERSION)),/Qvc10) +endif +ifeq ($(VCCOMPAT_FLAG),) + VCCOMPAT_FLAG := $(if $(findstring vc11, $(VCVERSION)),/Qvc11) +endif +ifeq ($(VCCOMPAT_FLAG),) + VCCOMPAT_FLAG := $(if $(findstring vc12, $(VCVERSION)),/Qvc12) +endif +ifeq ($(VCCOMPAT_FLAG),) + VCCOMPAT_FLAG := $(if $(findstring vc14, $(VCVERSION)),/Qvc14) + ifeq ($(VS2017_SUPPORT),yes) + ifneq (,$(findstring vc14.1, $(VCVERSION))) + VCCOMPAT_FLAG := /Qvc14.1 + endif + endif +endif +ifeq ($(VCCOMPAT_FLAG),) + $(error VC version not detected correctly: $(VCVERSION) ) +endif +export VCCOMPAT_FLAG + +#------------------------------------------------------------------------------ +# End of setting compiler flags. +#------------------------------------------------------------------------------ + + +#------------------------------------------------------------------------------ +# Setting assembler data. +#------------------------------------------------------------------------------ +ASSEMBLY_SOURCE=$(arch)-masm +ifeq (intel64,$(arch)) + ASM=ml64 /nologo + ASM_FLAGS += /DEM64T=1 /c /Zi + TBB_ASM.OBJ = atomic_support.obj intel64_misc.obj itsx.obj + MALLOC_ASM.OBJ = atomic_support.obj +else + ASM=ml /nologo + ASM_FLAGS += /c /coff /Zi /safeseh + TBB_ASM.OBJ = atomic_support.obj lock_byte.obj itsx.obj +endif +#------------------------------------------------------------------------------ +# End of setting assembler data. +#------------------------------------------------------------------------------ + + +#------------------------------------------------------------------------------ +# Setting tbbmalloc data. +#------------------------------------------------------------------------------ +M_CPLUS_FLAGS = $(CPLUS_FLAGS) +#------------------------------------------------------------------------------ +# End of setting tbbmalloc data. +#------------------------------------------------------------------------------ + +#------------------------------------------------------------------------------ +# End of define compiler-specific variables. +#------------------------------------------------------------------------------ diff --git a/xdl/third_party/tbb/build/windows.inc b/xdl/third_party/tbb/build/windows.inc new file mode 100644 index 00000000..891bf94e --- /dev/null +++ b/xdl/third_party/tbb/build/windows.inc @@ -0,0 +1,111 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +export SHELL = cmd + +ifdef tbb_build_dir + test_dir:=$(tbb_build_dir) +else + test_dir:=. +endif + +# A convenience wrapper for calls to detect.js. +# $(1) is the full command line for the script, e.g. /minversion icl 12 +detect_js = $(shell cmd /C "cscript /nologo /E:jscript $(tbb_root)/build/detect.js $(1)") + +# TODO give an error if archs doesn't match +ifndef arch + export arch:=$(call detect_js, /arch $(compiler)) +endif + +ifndef runtime + export runtime:=$(call detect_js, /runtime $(compiler)) +endif + +native_compiler := cl +export compiler ?= cl +debugger ?= devenv /debugexe + +CMD=cmd /C +CWD=$(shell cmd /C echo %CD%) +RM=cmd /C del /Q /F +RD=cmd /C rmdir +MD=cmd /c mkdir +SLASH=\\ +NUL = nul + +AR=lib +AR_OUTPUT_KEY=/out: +AR_FLAGS=/nologo /nodefaultlib + +OBJ = obj +DLL = dll +LIBEXT = lib +ASMEXT = asm + +def_prefix = $(if $(findstring intel64,$(arch)),win64,win32) + +# Target Windows version. Do not increase beyond 0x0502 without prior discussion! +# Used as the value for macro definition option in windows.cl.inc etc. +# For tests, we need at least Windows XP SP2 for sake of enabling stack backtraces. +_WIN32_WINNT=0x0502 + +TBB.LST = $(tbb_root)/src/tbb/$(def_prefix)-tbb-export.lst +TBB.DEF = $(TBB.LST:.lst=.def) +TBB.DLL = tbb$(CPF_SUFFIX)$(DEBUG_SUFFIX).$(DLL) +TBB.LIB = tbb$(CPF_SUFFIX)$(DEBUG_SUFFIX).$(LIBEXT) +TBB.RES = tbb_resource.res +# On Windows, we use #pragma comment to set the proper TBB lib to link with. +# But for cross-configuration testing, need to link explicitly. +# Tests use this variable to detect dependency on TBB binary, so have to be non-empty. +LINK_TBB.LIB = $(if $(crosstest),$(TBB.LIB),$(DEFINE_KEY)__TBB_IMPLICITLY_LINKED) +TBB.MANIFEST = +ifneq ($(filter vc8 vc9,$(runtime)),) + TBB.MANIFEST = tbbmanifest.exe.manifest +endif + +MALLOC.DEF = $(MALLOC_ROOT)/$(def_prefix)-tbbmalloc-export.def +MALLOC.DLL = tbbmalloc$(DEBUG_SUFFIX).$(DLL) +MALLOC.LIB = tbbmalloc$(DEBUG_SUFFIX).$(LIBEXT) +MALLOC.RES = tbbmalloc.res +MALLOC.MANIFEST = +ifneq ($(filter vc8 vc9,$(runtime)),) +MALLOC.MANIFEST = tbbmanifest.exe.manifest +endif +LINK_MALLOC.LIB = $(MALLOC.LIB) + +MALLOCPROXY.DLL = tbbmalloc_proxy$(DEBUG_SUFFIX).$(DLL) +MALLOCPROXY.LIB = tbbmalloc_proxy$(DEBUG_SUFFIX).$(LIBEXT) +LINK_MALLOCPROXY.LIB = $(MALLOCPROXY.LIB) + +PROXY.LIB = tbbproxy$(DEBUG_SUFFIX).$(LIBEXT) + +RML.DEF = $(RML_SERVER_ROOT)/$(def_prefix)-rml-export.def +RML.DLL = irml$(DEBUG_SUFFIX).$(DLL) +RML.LIB = irml$(DEBUG_SUFFIX).$(LIBEXT) +RML.RES = irml.res +ifneq ($(filter vc8 vc9,$(runtime)),) +RML.MANIFEST = tbbmanifest.exe.manifest +endif + +MAKE_VERSIONS = cmd /C cscript /nologo /E:jscript $(subst \,/,$(tbb_root))/build/version_info_windows.js $(compiler) $(arch) $(subst \,/,"$(VERSION_FLAGS)") > version_string.ver +MAKE_TBBVARS = cmd /C "$(subst /,\,$(tbb_root))\build\generate_tbbvars.bat" + +TEST_LAUNCHER = $(subst /,\,$(tbb_root))\build\test_launcher.bat $(largs) + +OPENCL.LIB = OpenCL.$(LIBEXT) diff --git a/xdl/third_party/tbb/cmake/README.rst b/xdl/third_party/tbb/cmake/README.rst new file mode 100644 index 00000000..40befbfc --- /dev/null +++ b/xdl/third_party/tbb/cmake/README.rst @@ -0,0 +1,285 @@ +.. contents:: + +Introduction +------------ +Many developers use CMake to manage their development projects, so the Intel(R) Threading Building Blocks (Intel(R) TBB) +team created the set of CMake modules to simplify integration of the Intel TBB library into a CMake project. +The modules are available starting from Intel TBB 2017 U7 in `/cmake `_. + +About Intel TBB +^^^^^^^^^^^^^^^ +Intel TBB is a library that supports scalable parallel programming using standard ISO C++ code. It does not require special languages or compilers. It is designed to promote scalable data parallel programming. Additionally, it fully supports nested parallelism, so you can build larger parallel components from smaller parallel components. To use the library, you specify tasks, not threads, and let the library map tasks onto threads in an efficient manner. + +Many of the library interfaces employ generic programming, in which interfaces are defined by requirements on types and not specific types. The C++ Standard Template Library (STL) is an example of generic programming. Generic programming enables Intel TBB to be flexible yet efficient. The generic interfaces enable you to customize components to your specific needs. + +The net result is that Intel TBB enables you to specify parallelism far more conveniently than using raw threads, and at the same time can improve performance. + +References +^^^^^^^^^^ +* `Official Intel TBB open source site `_ +* `Official GitHub repository `_ + +Engineering team contacts +^^^^^^^^^^^^^^^^^^^^^^^^^ +The Intel TBB team is very interested in convenient integration of the Intel TBB library into customer projects. These CMake modules were created to provide such a possibility for CMake projects using a simple but powerful interface. We hope you will try these modules and we are looking forward to receiving your feedback! + +E-mail us: `inteltbbdevelopers@intel.com `_. + +Visit our `forum `_. + +Release Notes +------------- +* Minimum supported CMake version: ``3.0.0``. +* Intel TBB versioning via `find_package `_ has restricted functionality: compatibility of update numbers (as well as interface versions) is not checked. Supported versioning: ``find_package(TBB . ...)``. Intel TBB interface version can be obtained in the customer project via the ``TBB_INTERFACE_VERSION`` variable. + +Use cases of Intel TBB integration into CMake-aware projects +------------------------------------------------------------ +There are two types of Intel TBB packages: + * Binary packages with pre-built binaries for Windows* OS, Linux* OS and macOS*. They are available on the releases page of the Github repository: https://github.com/01org/tbb/releases. The main purpose of the binary package integration is the ability to build Intel TBB header files and binaries into your CMake-aware project. + * A source package is also available to download from the release page via the "Source code" link. In addition, it can be cloned from the repository by ``git clone https://github.com/01org/tbb.git``. The main purpose of the source package integration is to allow you to do a custom build of the Intel TBB library from the source files and then build that into your CMake-aware project. + +There are four types of CMake modules that can be used to integrate Intel TBB: `TBBConfig`, `TBBGet`, `TBBMakeConfig` and `TBBBuild`. See `Technical documentation for CMake modules`_ section for additional details. + +Binary package integration +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The following use case is valid for packages starting from Intel TBB 2017 U7: + +* Download package manually and make integration. + + Pre-condition: Location of TBBConfig.cmake is available via ``TBB_DIR`` or ``CMAKE_PREFIX_PATH`` contains path to Intel TBB root. + + CMake code for integration: + + .. code:: cmake + + find_package(TBB ) + +The following use case is valid for all Intel TBB 2017 packages. + +* Download package using TBBGet_ and make integration. + + Pre-condition: Intel TBB CMake modules are available via . + + CMake code for integration: + .. code:: cmake + + include(/TBBGet.cmake) + tbb_get(TBB_ROOT tbb_root CONFIG_DIR TBB_DIR) + find_package(TBB ) + +Source package integration +^^^^^^^^^^^^^^^^^^^^^^^^^^ +* Build Intel TBB from existing source files using TBBBuild_ and make integration. + + Pre-condition: Intel TBB source code is available via and Intel TBB CMake modules are available via . + + CMake code for integration: + .. code:: cmake + + include(/TBBBuild.cmake) + tbb_build(TBB_ROOT CONFIG_DIR TBB_DIR) + find_package(TBB ) + +* Download Intel TBB source files using TBBGet_, build it using TBBBuild_ and make integration. + + Pre-condition: Intel TBB CMake modules are available via . + + CMake code for integration: + .. code:: cmake + + include(/TBBGet.cmake) + include(/TBBBuild.cmake) + tbb_get(TBB_ROOT tbb_root SOURCE_CODE) + tbb_build(TBB_ROOT ${tbb_root} CONFIG_DIR TBB_DIR) + find_package(TBB ) + +Tutorials: Intel TBB integration using CMake +-------------------------------------------- +Binary Intel TBB integration to the sub_string_finder sample (Windows* OS) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In this example, we will integrate binary Intel TBB package into the sub_string_finder sample on Windows* OS (Microsoft* Visual Studio). +This example is also applicable for other platforms with slight changes. +Place holders and should be replaced with the actual values for the Intel TBB package being used. The example is written for `CMake 3.7.1`. + +Precondition: + * `Microsoft* Visual Studio 11` or higher. + * `CMake 3.0.0` or higher. + +#. Download the latest binary package for Windows from `this page `_ and unpack it to the directory ``C:\demo_tbb_cmake``. +#. In the directory ``C:\demo_tbb_cmake\tbb_oss\examples\GettingStarted\sub_string_finder`` create ``CMakeLists.txt`` file with the following content: + .. code:: cmake + + cmake_minimum_required(VERSION 3.0.0 FATAL_ERROR) + + project(sub_string_finder CXX) + add_executable(sub_string_finder sub_string_finder.cpp) + + # find_package will search for available TBBConfig using variables CMAKE_PREFIX_PATH and TBB_DIR. + find_package(TBB REQUIRED tbb) + + # Link Intel TBB imported targets to the executable; + # "TBB::tbb" can be used instead of "${TBB_IMPORTED_TARGETS}". + target_link_libraries(sub_string_finder ${TBB_IMPORTED_TARGETS}) +#. Run CMake GUI and: + * Fill the following fields (you can use the buttons ``Browse Source...`` and ``Browse Build...`` accordingly) + + * Where is the source code: ``C:/demo_tbb_cmake/tbb_oss/examples/GettingStarted/sub_string_finder`` + * Where to build the binaries: ``C:/demo_tbb_cmake/tbb_oss/examples/GettingStarted/sub_string_finder/build`` + + * Add new cache entry using button ``Add Entry`` to let CMake know where to search for TBBConfig: + + * Name: ``CMAKE_PREFIX_PATH`` + * Type: ``PATH`` + * Value: ``C:/demo_tbb_cmake/tbb_oss`` + + * Push the button ``Generate`` and choose a proper generator for your Microsoft* Visual Studio version. +#. Now you can open the generated solution ``C:/demo_tbb_cmake/tbb_oss/examples/GettingStarted/sub_string_finder/build/sub_string_finder.sln`` in your Microsoft* Visual Studio and build it. + +Source code integration of Intel TBB to the sub_string_finder sample (Linux* OS) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In this example, we will build Intel TBB from source code with enabled Community Preview Features and link the sub_string_finder sample with the built library. +This example is also applicable for other platforms with slight changes. + +Precondition: + * `CMake 3.0.0` or higher. + * `Git` (to clone the Intel TBB repository from GitHub) + +#. Create the directory ``~/demo_tbb_cmake``, go to the created directory and clone the Intel TBB repository there: + ``mkdir ~/demo_tbb_cmake ; cd ~/demo_tbb_cmake ; git clone https://github.com/01org/tbb.git`` +#. In the directory ``~/demo_tbb_cmake/tbb/examples/GettingStarted/sub_string_finder`` create ``CMakeLists.txt`` file with following content: + .. code:: cmake + + cmake_minimum_required(VERSION 3.0.0 FATAL_ERROR) + + project(sub_string_finder CXX) + add_executable(sub_string_finder sub_string_finder.cpp) + + include(${TBB_ROOT}/cmake/TBBBuild.cmake) + + # Build Intel TBB with enabled Community Preview Features (CPF). + tbb_build(TBB_ROOT ${TBB_ROOT} CONFIG_DIR TBB_DIR MAKE_ARGS tbb_cpf=1) + + find_package(TBB REQUIRED tbb_preview) + + # Link Intel TBB imported targets to the executable; + # "TBB::tbb_preview" can be used instead of "${TBB_IMPORTED_TARGETS}". + target_link_libraries(sub_string_finder ${TBB_IMPORTED_TARGETS}) +#. Create a build directory for the sub_string_finder sample to perform build out of source, go to the created directory + ``mkdir ~/demo_tbb_cmake/tbb/examples/GettingStarted/sub_string_finder/build ; cd ~/demo_tbb_cmake/tbb/examples/GettingStarted/sub_string_finder/build`` +#. Run CMake to prepare Makefile for the sub_string_finder sample and provide Intel TBB location (root) where to perform build: + ``cmake -DTBB_ROOT=${HOME}/demo_tbb_cmake/tbb ..`` +#. Make an executable and run it: + ``make ; ./sub_string_finder`` + +Technical documentation for CMake modules +----------------------------------------- +TBBConfig +^^^^^^^^^ + +Configuration module for ``Intel(R) Threading Building Blocks (Intel(R) TBB)`` library. + +How to use this module in your CMake project: + #. Add location of Intel TBB (root) to `CMAKE_PREFIX_PATH `_ + or specify location of TBBConfig.cmake in ``TBB_DIR``. + #. Use `find_package `_ to configure Intel TBB. + #. Use provided variables and/or imported targets (described below) to work with Intel TBB. + +Intel TBB components can be passed to `find_package `_ +after keyword ``COMPONENTS`` or ``REQUIRED``. +Use basic names of components (``tbb``, ``tbbmalloc``, ``tbb_preview``, etc.). + +If components are not specified then default are used: ``tbb``, ``tbbmalloc`` and ``tbbmalloc_proxy``. + +If ``tbbmalloc_proxy`` is requested, ``tbbmalloc`` component will also be added and set as dependency for ``tbbmalloc_proxy``. + +TBBConfig creates `imported targets `_ as +shared libraries using the following format: ``TBB::`` (for example, ``TBB::tbb``, ``TBB::tbbmalloc``). + +Variables set during Intel TBB configuration: + +========================= ================================================ + Variable Description +========================= ================================================ +``TBB_FOUND`` Intel TBB library is found +``TBB__FOUND`` specific Intel TBB component is found +``TBB_IMPORTED_TARGETS`` all created Intel TBB imported targets +``TBB_VERSION`` Intel TBB version (format: ``.``) +``TBB_INTERFACE_VERSION`` Intel TBB interface version +========================= ================================================ + +TBBGet +^^^^^^ + +Module for getting ``Intel(R) Threading Building Blocks (Intel(R) TBB)`` library from `GitHub `_. + +Provides the following functions: + ``tbb_get(TBB_ROOT [RELEASE_TAG |LATEST] [SAVE_TO ] [SYSTEM_NAME Linux|Windows|Darwin] [CONFIG_DIR | SOURCE_CODE])`` + downloads Intel TBB from GitHub and creates TBBConfig for the downloaded binary package if there is no TBBConfig. + + ==================================== ==================================== + Parameter Description + ==================================== ==================================== + ``TBB_ROOT `` a variable to save Intel TBB root in, ``-NOTFOUND`` will be provided in case ``tbb_get`` is unsuccessful + ``RELEASE_TAG |LATEST`` Intel TBB release tag to be downloaded (for example, ``2017_U6``), ``LATEST`` is used by default + ``SAVE_TO `` path to location at which to unpack downloaded Intel TBB, ``${CMAKE_CURRENT_BINARY_DIR}/tbb_downloaded`` is used by default + ``SYSTEM_NAME Linux|Windows|Darwin`` operating system name to download a binary package for, + value of `CMAKE_SYSTEM_NAME `_ is used by default + ``CONFIG_DIR `` a variable to save location of TBBConfig.cmake and TBBConfigVersion.cmake. Ignored if ``SOURCE_CODE`` specified + ``SOURCE_CODE`` flag to get Intel TBB source code (instead of binary package) + ==================================== ==================================== + +TBBMakeConfig +^^^^^^^^^^^^^ + +Module for making TBBConfig in ``Intel(R) Threading Building Blocks (Intel(R) TBB)`` binary package. + +This module is to be used for packages that do not have TBBConfig. + +Provides the following functions: + ``tbb_make_config(TBB_ROOT CONFIG_DIR [SYSTEM_NAME Linux|Windows|Darwin])`` + creates CMake configuration files (TBBConfig.cmake and TBBConfigVersion.cmake) for Intel TBB binary package. + + ==================================== ==================================== + Parameter Description + ==================================== ==================================== + ``TBB_ROOT `` path to Intel TBB root + ``CONFIG_DIR `` a variable to store location of the created configuration files + ``SYSTEM_NAME Linux|Windows|Darwin`` operating system name of the binary Intel TBB package, + value of `CMAKE_SYSTEM_NAME `_ is used by default + ==================================== ==================================== + +TBBBuild +^^^^^^^^ + +Module for building ``Intel(R) Threading Building Blocks (Intel(R) TBB)`` library from the source code. + +Provides the following functions: + ``tbb_build(TBB_ROOT CONFIG_DIR [MAKE_ARGS ])`` + builds Intel TBB from source code using the ``Makefile``, creates and provides the location of the CMake configuration files (TBBConfig.cmake and TBBConfigVersion.cmake) . + + ===================================== ==================================== + Parameter Description + ===================================== ==================================== + ``TBB_ROOT `` path to Intel TBB root + ``CONFIG_DIR `` a variable to store location of the created configuration files, + ``-NOTFOUND`` will be provided in case ``tbb_build`` is unsuccessful + ``MAKE_ARGS `` custom arguments to be passed to ``make`` tool. + + The following arguments are always passed with automatically detected values to + ``make`` tool if they are not redefined in ````: + + - ``compiler=`` + - ``tbb_build_dir=`` + - ``tbb_build_prefix=`` + - ``-j`` + ===================================== ==================================== + + +------------ + +Intel and the Intel logo are trademarks of Intel Corporation or its subsidiaries in the U.S. and/or other countries. + +``*`` Other names and brands may be claimed as the property of others. diff --git a/xdl/third_party/tbb/cmake/TBBBuild.cmake b/xdl/third_party/tbb/cmake/TBBBuild.cmake new file mode 100644 index 00000000..14f8517b --- /dev/null +++ b/xdl/third_party/tbb/cmake/TBBBuild.cmake @@ -0,0 +1,197 @@ +# Copyright (c) 2017-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +# +# Usage: +# include(TBBBuild.cmake) +# tbb_build(ROOT MAKE_ARGS [... ]) +# find_package(TBB ) +# + +include(CMakeParseArguments) + +# Save the location of Intel TBB CMake modules here, as it will not be possible to do inside functions, +# see for details: https://cmake.org/cmake/help/latest/variable/CMAKE_CURRENT_LIST_DIR.html +set(_tbb_cmake_module_path ${CMAKE_CURRENT_LIST_DIR}) + +## +# Builds Intel TBB. +# +# Parameters: +# TBB_ROOT - path to Intel TBB root directory (with sources); +# MAKE_ARGS - user-defined arguments to be passed to make-tool; +# CONFIG_DIR - store location of the created TBBConfig if the build was ok, store -NOTFOUND otherwise. +# +function(tbb_build) + # NOTE: internal function are used to hide them from user. + + ## + # Provides arguments for make-command to build Intel TBB. + # + # Following arguments are provided automatically if they are not defined by user: + # compiler= + # tbb_build_dir= + # tbb_build_prefix= + # -j + # + # Parameters: + # USER_DEFINED_ARGS - list of user-defined arguments; + # RESULT - resulting list of 'make' arguments. + # + function(tbb_get_make_args) + set(oneValueArgs RESULT) + set(multiValueArgs USER_DEFINED_ARGS) + cmake_parse_arguments(tbb_GMA "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + + set(result ${tbb_GMA_USER_DEFINED_ARGS}) + + if (NOT tbb_GMA_USER_DEFINED_ARGS MATCHES "compiler=") + # TODO: add other supported compilers. + if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + set(compiler gcc) + elseif (CMAKE_CXX_COMPILER_ID STREQUAL "Intel") + set(compiler icc) + if (CMAKE_SYSTEM_NAME MATCHES "Windows") + set(compiler icl) + endif() + elseif (MSVC) + set(compiler cl) + elseif (CMAKE_CXX_COMPILER_ID MATCHES "Clang") + set(compiler clang) + endif() + + set(result "compiler=${compiler}" ${result}) + endif() + + if (NOT tbb_GMA_USER_DEFINED_ARGS MATCHES "tbb_build_dir=") + set(result "tbb_build_dir=${CMAKE_CURRENT_BINARY_DIR}/tbb_cmake_build" ${result}) + endif() + + if (NOT tbb_GMA_USER_DEFINED_ARGS MATCHES "tbb_build_prefix=") + set(result "tbb_build_prefix=tbb_cmake_build_subdir" ${result}) + endif() + + if (NOT tbb_GMA_USER_DEFINED_ARGS MATCHES "(;|^) *\\-j[0-9]* *(;|$)") + include(ProcessorCount) + ProcessorCount(num_of_cores) + if (NOT num_of_cores EQUAL 0) + set(result "-j${num_of_cores}" ${result}) + endif() + endif() + + if (CMAKE_SYSTEM_NAME MATCHES "Android") + set(result target=android ${result}) + endif() + + set(${tbb_GMA_RESULT} ${result} PARENT_SCOPE) + endfunction() + + ## + # Provides release and debug directories basing on 'make' arguments. + # + # Following 'make' arguments are parsed: tbb_build_dir, tbb_build_prefix + # + # Parameters: + # MAKE_ARGS - 'make' arguments (tbb_build_dir and tbb_build_prefix are required) + # RELEASE_DIR - store normalized (CMake) path to release directory + # DEBUG_DIR - store normalized (CMake) path to debug directory + # + function(tbb_get_build_paths_from_make_args) + set(oneValueArgs RELEASE_DIR DEBUG_DIR) + set(multiValueArgs MAKE_ARGS) + cmake_parse_arguments(tbb_GBPFMA "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + + foreach(arg ${tbb_GBPFMA_MAKE_ARGS}) + if (arg MATCHES "tbb_build_dir=") + string(REPLACE "tbb_build_dir=" "" tbb_build_dir "${arg}") + elseif (arg MATCHES "tbb_build_prefix=") + string(REPLACE "tbb_build_prefix=" "" tbb_build_prefix "${arg}") + endif() + endforeach() + + set(tbb_release_dir "${tbb_build_dir}/${tbb_build_prefix}_release") + set(tbb_debug_dir "${tbb_build_dir}/${tbb_build_prefix}_debug") + + file(TO_CMAKE_PATH "${tbb_release_dir}" tbb_release_dir) + file(TO_CMAKE_PATH "${tbb_debug_dir}" tbb_debug_dir) + + set(${tbb_GBPFMA_RELEASE_DIR} ${tbb_release_dir} PARENT_SCOPE) + set(${tbb_GBPFMA_DEBUG_DIR} ${tbb_debug_dir} PARENT_SCOPE) + endfunction() + + # -------------------- # + # Function entry point # + # -------------------- # + set(oneValueArgs TBB_ROOT CONFIG_DIR) + set(multiValueArgs MAKE_ARGS) + cmake_parse_arguments(tbb_build "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + + if (NOT EXISTS "${tbb_build_TBB_ROOT}/Makefile" OR NOT EXISTS "${tbb_build_TBB_ROOT}/src") + message(STATUS "Intel TBB can not be built: Makefile or src directory was not found in ${tbb_build_TBB_ROOT}") + set(${tbb_build_CONFIG_DIR} ${tbb_build_CONFIG_DIR}-NOTFOUND PARENT_SCOPE) + return() + endif() + + set(make_tool_name make) + if (CMAKE_SYSTEM_NAME MATCHES "Windows") + set(make_tool_name gmake) + elseif (CMAKE_SYSTEM_NAME MATCHES "Android") + set(make_tool_name ndk-build) + endif() + + find_program(TBB_MAKE_TOOL ${make_tool_name} DOC "Make-tool to build Intel TBB.") + mark_as_advanced(TBB_MAKE_TOOL) + + if (NOT TBB_MAKE_TOOL) + message(STATUS "Intel TBB can not be built: required make-tool (${make_tool_name}) was not found") + set(${tbb_build_CONFIG_DIR} ${tbb_build_CONFIG_DIR}-NOTFOUND PARENT_SCOPE) + return() + endif() + + tbb_get_make_args(USER_DEFINED_ARGS ${tbb_build_MAKE_ARGS} RESULT tbb_make_args) + + set(tbb_build_cmd ${TBB_MAKE_TOOL} ${tbb_make_args}) + + string(REPLACE ";" " " tbb_build_cmd_str "${tbb_build_cmd}") + message(STATUS "Building Intel TBB: ${tbb_build_cmd_str}") + execute_process(COMMAND ${tbb_build_cmd} + WORKING_DIRECTORY ${tbb_build_TBB_ROOT} + RESULT_VARIABLE tbb_build_result + ERROR_VARIABLE tbb_build_error_output + OUTPUT_QUIET) + + if (NOT tbb_build_result EQUAL 0) + message(STATUS "Building is unsuccessful (${tbb_build_result}): ${tbb_build_error_output}") + set(${tbb_build_CONFIG_DIR} ${tbb_build_CONFIG_DIR}-NOTFOUND PARENT_SCOPE) + return() + endif() + + tbb_get_build_paths_from_make_args(MAKE_ARGS ${tbb_make_args} + RELEASE_DIR tbb_release_dir + DEBUG_DIR tbb_debug_dir) + + include(${_tbb_cmake_module_path}/TBBMakeConfig.cmake) + tbb_make_config(TBB_ROOT ${tbb_build_TBB_ROOT} + SYSTEM_NAME ${CMAKE_SYSTEM_NAME} + CONFIG_DIR tbb_config_dir + CONFIG_FOR_SOURCE + TBB_RELEASE_DIR ${tbb_release_dir} + TBB_DEBUG_DIR ${tbb_debug_dir}) + + set(${tbb_build_CONFIG_DIR} ${tbb_config_dir} PARENT_SCOPE) +endfunction() diff --git a/xdl/third_party/tbb/cmake/TBBConfigVersion.cmake b/xdl/third_party/tbb/cmake/TBBConfigVersion.cmake new file mode 100644 index 00000000..80d92ebb --- /dev/null +++ b/xdl/third_party/tbb/cmake/TBBConfigVersion.cmake @@ -0,0 +1,28 @@ +# Copyright (c) 2017-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +set(PACKAGE_VERSION 2019.0) + +if ("${PACKAGE_VERSION}" VERSION_LESS "${PACKAGE_FIND_VERSION}") + set(PACKAGE_VERSION_COMPATIBLE FALSE) +else() + set(PACKAGE_VERSION_COMPATIBLE TRUE) + if ("${PACKAGE_VERSION}" VERSION_EQUAL "${PACKAGE_FIND_VERSION}") + set(PACKAGE_VERSION_EXACT TRUE) + endif() +endif() diff --git a/xdl/third_party/tbb/cmake/TBBGet.cmake b/xdl/third_party/tbb/cmake/TBBGet.cmake new file mode 100644 index 00000000..5cb93af5 --- /dev/null +++ b/xdl/third_party/tbb/cmake/TBBGet.cmake @@ -0,0 +1,298 @@ +# Copyright (c) 2017-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +include(CMakeParseArguments) + +# Save the location of Intel TBB CMake modules here, as it will not be possible to do inside functions, +# see for details: https://cmake.org/cmake/help/latest/variable/CMAKE_CURRENT_LIST_DIR.html +set(_tbb_cmake_module_path ${CMAKE_CURRENT_LIST_DIR}) + +## +# Downloads file. +# +# Parameters: +# URL - URL to download data from; +# SAVE_AS - filename there to save downloaded data; +# INFO - text description of content to be downloaded; +# will be printed as message in format is "Downloading : ; +# FORCE - option to delete local file from SAVE_AS if it exists; +# +function(_tbb_download_file) + set(options FORCE) + set(oneValueArgs URL RELEASE SAVE_AS INFO) + cmake_parse_arguments(tbb_df "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + + if (tbb_df_FORCE AND EXISTS "${tbb_df_SAVE_AS}") + file(REMOVE ${tbb_df_SAVE_AS}) + endif() + + if (NOT EXISTS "${tbb_df_SAVE_AS}") + set(_show_progress) + if (TBB_DOWNLOADING_PROGRESS) + set(_show_progress SHOW_PROGRESS) + endif() + + message(STATUS "Downloading ${tbb_df_INFO}: ${tbb_df_URL}") + file(DOWNLOAD ${tbb_df_URL} ${tbb_df_SAVE_AS} ${_show_progress} STATUS download_status) + + list(GET download_status 0 download_status_num) + if (NOT download_status_num EQUAL 0) + message(STATUS "Unsuccessful downloading: ${download_status}") + file(REMOVE ${tbb_df_SAVE_AS}) + return() + endif() + else() + message(STATUS "Needed file was found locally ${tbb_df_SAVE_AS}. Remove it if you still want to download a new one") + endif() +endfunction() + +## +# Checks if specified Intel TBB release is available on GitHub. +# +# tbb_check_git_release( ) +# Parameters: +# - release to be checked; +# - store result (TRUE/FALSE). +# +function(_tbb_check_git_release_tag _tbb_release_tag _tbb_release_tag_avail) + if (_tbb_release_tag STREQUAL LATEST) + set(${_tbb_release_tag_avail} TRUE PARENT_SCOPE) + return() + endif() + + set(tbb_releases_file "${CMAKE_CURRENT_BINARY_DIR}/tbb_releases.json") + + _tbb_download_file(URL "${tbb_github_api}/releases" + SAVE_AS ${tbb_releases_file} + INFO "information from GitHub about Intel TBB releases" + FORCE) + + if (NOT EXISTS "${tbb_releases_file}") + set(${_tbb_release_tag_avail} FALSE PARENT_SCOPE) + return() + endif() + + file(READ ${tbb_releases_file} tbb_releases) + + string(REPLACE "\"" "" tbb_releases ${tbb_releases}) + string(REGEX MATCHALL "tag_name: *([A-Za-z0-9_\\.]+)" tbb_releases ${tbb_releases}) + + set(_release_available FALSE) + foreach(tbb_rel ${tbb_releases}) + string(REGEX REPLACE "tag_name: *" "" tbb_rel_cut ${tbb_rel}) + list(REMOVE_ITEM tbb_releases ${tbb_rel}) + list(APPEND tbb_releases ${tbb_rel_cut}) + if (_tbb_release_tag STREQUAL tbb_rel_cut) + set(_release_available TRUE) + break() + endif() + endforeach() + + if (NOT _release_available) + string(REPLACE ";" ", " tbb_releases_str "${tbb_releases}") + message(STATUS "Requested release tag ${_tbb_release_tag} is not available. Available Intel TBB release tags: ${tbb_releases_str}") + endif() + + set(${_tbb_release_tag_avail} ${_release_available} PARENT_SCOPE) +endfunction() + +## +# Compares two Intel TBB releases and provides result +# TRUE if the first release is less than the second, FALSE otherwise. +# +# tbb_is_release_less( ) +# +function(_tbb_is_release_less rel1 rel2 result) + # Convert release to numeric representation to compare it using "if" with VERSION_LESS. + string(REGEX REPLACE "[A-Za-z]" "" rel1 "${rel1}") + string(REPLACE "_" "." rel1 "${rel1}") + string(REGEX REPLACE "[A-Za-z]" "" rel2 "${rel2}") + string(REPLACE "_" "." rel2 "${rel2}") + + if (${rel1} VERSION_LESS ${rel2}) + set(${result} TRUE PARENT_SCOPE) + return() + endif() + + set(${result} FALSE PARENT_SCOPE) +endfunction() + +## +# Finds exact URL to download Intel TBB basing on provided parameters. +# +# Usage: +# _tbb_get_url(URL RELEASE_TAG OS [SOURCE_CODE]) +# +function(_tbb_get_url) + set(oneValueArgs URL RELEASE_TAG OS) + set(options SOURCE_CODE) + cmake_parse_arguments(tbb_get_url "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + + set(tbb_github_api "https://api.github.com/repos/01org/tbb") + + _tbb_check_git_release_tag(${tbb_get_url_RELEASE_TAG} tbb_release_available) + if (NOT tbb_release_available) + set(${tbb_download_FULL_PATH} ${tbb_download_FULL_PATH}-NOTFOUND PARENT_SCOPE) + return() + endif() + + if (tbb_get_url_RELEASE_TAG STREQUAL LATEST) + set(tbb_rel_info_api_url "${tbb_github_api}/releases/latest") + else() + set(tbb_rel_info_api_url "${tbb_github_api}/releases/tags/${tbb_get_url_RELEASE_TAG}") + endif() + + set(tbb_release_info_file "${CMAKE_CURRENT_BINARY_DIR}/tbb_${tbb_get_url_RELEASE_TAG}_info.json") + + _tbb_download_file(URL ${tbb_rel_info_api_url} + SAVE_AS ${tbb_release_info_file} + INFO "information from GitHub about packages for Intel TBB ${tbb_get_url_RELEASE_TAG}" + FORCE) + + if (NOT EXISTS "${tbb_release_info_file}") + set(${tbb_get_url_URL} ${tbb_get_url_URL}-NOTFOUND PARENT_SCOPE) + return() + endif() + + file(STRINGS ${tbb_release_info_file} tbb_release_info) + + if (tbb_get_url_SOURCE_CODE) + # Find name of the latest release to get link to source archive. + if (tbb_get_url_RELEASE_TAG STREQUAL LATEST) + string(REPLACE "\"" "" tbb_release_info ${tbb_release_info}) + string(REGEX REPLACE ".*tag_name: *([A-Za-z0-9_\\.]+).*" "\\1" tbb_get_url_RELEASE_TAG "${tbb_release_info}") + endif() + + set(${tbb_get_url_URL} "https://github.com/01org/tbb/archive/${tbb_get_url_RELEASE_TAG}.tar.gz" PARENT_SCOPE) + else() + if (tbb_get_url_OS MATCHES "Linux") + set(tbb_lib_archive_suffix lin.tgz) + elseif (tbb_get_url_OS MATCHES "Windows") + set(tbb_lib_archive_suffix win.zip) + elseif (tbb_get_url_OS MATCHES "Darwin") + set(tbb_lib_archive_suffix mac.tgz) + + # Since 2017_U4 release archive for Apple has suffix "mac.tgz" instead of "osx.tgz". + if (NOT tbb_get_url_RELEASE_TAG STREQUAL "LATEST") + _tbb_is_release_less(${tbb_get_url_RELEASE_TAG} 2017_U4 release_less) + if (release_less) + set(tbb_lib_archive_suffix osx.tgz) + endif() + endif() + elseif (tbb_get_url_OS MATCHES "Android") + set(tbb_lib_archive_suffix and.tgz) + else() + message(STATUS "Currently prebuilt Intel TBB is not available for your OS (${tbb_get_url_OS})") + set(${tbb_get_url_URL} ${tbb_get_url_URL}-NOTFOUND PARENT_SCOPE) + return() + endif() + + string(REGEX REPLACE ".*(https.*oss_${tbb_lib_archive_suffix}).*" "\\1" tbb_bin_url "${tbb_release_info}") + + set(${tbb_get_url_URL} ${tbb_bin_url} PARENT_SCOPE) + endif() +endfunction() + +function(tbb_get) + set(oneValueArgs RELEASE_TAG SYSTEM_NAME SAVE_TO TBB_ROOT CONFIG_DIR) + set(options SOURCE_CODE) + cmake_parse_arguments(tbb_get "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + + set(tbb_os ${CMAKE_SYSTEM_NAME}) + if (tbb_get_SYSTEM_NAME) + set(tbb_os ${tbb_get_SYSTEM_NAME}) + endif() + + set(tbb_release_tag LATEST) + if (tbb_get_RELEASE_TAG) + set(tbb_release_tag ${tbb_get_RELEASE_TAG}) + endif() + + set(tbb_save_to ${CMAKE_CURRENT_BINARY_DIR}/tbb_downloaded) + if (tbb_get_SAVE_TO) + set(tbb_save_to ${tbb_get_SAVE_TO}) + endif() + + if (tbb_get_SOURCE_CODE) + _tbb_get_url(URL tbb_url RELEASE_TAG ${tbb_release_tag} OS ${tbb_os} SOURCE_CODE) + else() + _tbb_get_url(URL tbb_url RELEASE_TAG ${tbb_release_tag} OS ${tbb_os}) + endif() + + if (NOT tbb_url) + message(STATUS "URL to download Intel TBB has not been found") + set(${tbb_get_TBB_ROOT} ${tbb_get_TBB_ROOT}-NOTFOUND PARENT_SCOPE) + return() + endif() + + get_filename_component(filename ${tbb_url} NAME) + set(local_file "${CMAKE_CURRENT_BINARY_DIR}/${filename}") + + _tbb_download_file(URL ${tbb_url} + SAVE_AS ${local_file} + INFO "Intel TBB library") + + if (NOT EXISTS "${local_file}") + set(${tbb_get_TBB_ROOT} ${tbb_get_TBB_ROOT}-NOTFOUND PARENT_SCOPE) + return() + endif() + + get_filename_component(subdir_name ${filename} NAME_WE) + file(MAKE_DIRECTORY ${tbb_save_to}/${subdir_name}) + if (NOT EXISTS "${tbb_save_to}/${subdir_name}") + message(STATUS "${tbb_save_to}/${subdir_name} can not be created") + set(${tbb_get_TBB_ROOT} ${tbb_get_TBB_ROOT}-NOTFOUND PARENT_SCOPE) + return() + endif() + + message(STATUS "Unpacking ${local_file} to ${tbb_save_to}/${subdir_name}") + execute_process(COMMAND ${CMAKE_COMMAND} -E tar xzf ${local_file} + WORKING_DIRECTORY ${tbb_save_to}/${subdir_name} + RESULT_VARIABLE unpacking_result) + + if (NOT unpacking_result EQUAL 0) + message(STATUS "Unsuccessful unpacking: ${unpacking_result}") + set(${tbb_get_TBB_ROOT} ${tbb_get_TBB_ROOT}-NOTFOUND PARENT_SCOPE) + return() + endif() + + file(GLOB_RECURSE tbb_h ${tbb_save_to}/${subdir_name}/*/include/tbb/tbb.h) + list(GET tbb_h 0 tbb_h) + + if (NOT EXISTS "${tbb_h}") + message(STATUS "tbb/tbb.h has not been found in the downloaded package") + set(${tbb_get_TBB_ROOT} ${tbb_get_TBB_ROOT}-NOTFOUND PARENT_SCOPE) + return() + endif() + + get_filename_component(tbb_root "${tbb_h}" PATH) + get_filename_component(tbb_root "${tbb_root}" PATH) + get_filename_component(tbb_root "${tbb_root}" PATH) + + if (NOT tbb_get_SOURCE_CODE) + set(tbb_config_dir ${tbb_root}/cmake) + + if (NOT EXISTS "${tbb_config_dir}") + tbb_make_config(TBB_ROOT ${tbb_root} CONFIG_DIR tbb_config_dir) + endif() + + set(${tbb_get_CONFIG_DIR} ${tbb_config_dir} PARENT_SCOPE) + endif() + + set(${tbb_get_TBB_ROOT} ${tbb_root} PARENT_SCOPE) +endfunction() diff --git a/xdl/third_party/tbb/cmake/TBBMakeConfig.cmake b/xdl/third_party/tbb/cmake/TBBMakeConfig.cmake new file mode 100644 index 00000000..54fc7c60 --- /dev/null +++ b/xdl/third_party/tbb/cmake/TBBMakeConfig.cmake @@ -0,0 +1,169 @@ +# Copyright (c) 2017-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +# +# Usage: +# include(TBBMakeConfig.cmake) +# tbb_make_config(TBB_ROOT SYSTEM_NAME CONFIG_DIR [SAVE_TO] [CONFIG_FOR_SOURCE TBB_RELEASE_DIR TBB_DEBUG_DIR ]) +# + +include(CMakeParseArguments) + +# Save the location of Intel TBB CMake modules here, as it will not be possible to do inside functions, +# see for details: https://cmake.org/cmake/help/latest/variable/CMAKE_CURRENT_LIST_DIR.html +set(_tbb_cmake_module_path ${CMAKE_CURRENT_LIST_DIR}) + +function(tbb_make_config) + set(oneValueArgs TBB_ROOT SYSTEM_NAME CONFIG_DIR SAVE_TO TBB_RELEASE_DIR TBB_DEBUG_DIR) + set(options CONFIG_FOR_SOURCE) + cmake_parse_arguments(tbb_MK "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + + set(tbb_system_name ${CMAKE_SYSTEM_NAME}) + if (tbb_MK_SYSTEM_NAME) + set(tbb_system_name ${tbb_MK_SYSTEM_NAME}) + endif() + + set(tbb_config_dir ${tbb_MK_TBB_ROOT}/cmake) + if (tbb_MK_SAVE_TO) + set(tbb_config_dir ${tbb_MK_SAVE_TO}) + endif() + + file(MAKE_DIRECTORY ${tbb_config_dir}) + + set(TBB_DEFAULT_COMPONENTS tbb tbbmalloc tbbmalloc_proxy) + + if (tbb_MK_CONFIG_FOR_SOURCE) + set(TBB_RELEASE_DIR ${tbb_MK_TBB_RELEASE_DIR}) + set(TBB_DEBUG_DIR ${tbb_MK_TBB_DEBUG_DIR}) + endif() + + if (tbb_system_name STREQUAL "Linux") + set(TBB_SHARED_LIB_DIR "lib") + set(TBB_X32_SUBDIR "ia32") + set(TBB_X64_SUBDIR "intel64") + set(TBB_LIB_PREFIX "lib") + set(TBB_LIB_EXT "so.2") + + # Note: multiline variable + set(TBB_CHOOSE_COMPILER_SUBDIR "if (CMAKE_CXX_COMPILER_LOADED) + set(_tbb_compiler_id \${CMAKE_CXX_COMPILER_ID}) + set(_tbb_compiler_ver \${CMAKE_CXX_COMPILER_VERSION}) +elseif (CMAKE_C_COMPILER_LOADED) + set(_tbb_compiler_id \${CMAKE_C_COMPILER_ID}) + set(_tbb_compiler_ver \${CMAKE_C_COMPILER_VERSION}) +endif() + +# For non-GCC compilers try to find version of system GCC to choose right compiler subdirectory. +if (NOT _tbb_compiler_id STREQUAL \"GNU\") + execute_process(COMMAND gcc --version OUTPUT_VARIABLE _tbb_gcc_ver_output ERROR_QUIET) + string(REGEX REPLACE \".*gcc.*([0-9]+\\\\.[0-9]+)\\\\.[0-9]+.*\" \"\\\\1\" _tbb_compiler_ver \"\${_tbb_gcc_ver_output}\") + if (NOT _tbb_compiler_ver) + message(FATAL_ERROR \"This Intel TBB package is intended to be used only environment with available 'gcc'\") + endif() + unset(_tbb_gcc_ver_output) +endif() + +set(_tbb_compiler_subdir gcc4.1) +foreach (_tbb_gcc_version 4.1 4.4 4.7) + if (NOT _tbb_compiler_ver VERSION_LESS \${_tbb_gcc_version}) + set(_tbb_compiler_subdir gcc\${_tbb_gcc_version}) + endif() +endforeach() + +unset(_tbb_compiler_id) +unset(_tbb_compiler_ver)") + + elseif (tbb_system_name STREQUAL "Windows") + set(TBB_SHARED_LIB_DIR "bin") + set(TBB_X32_SUBDIR "ia32") + set(TBB_X64_SUBDIR "intel64") + set(TBB_LIB_PREFIX "") + set(TBB_LIB_EXT "dll") + + # Note: multiline variable + set(TBB_CHOOSE_COMPILER_SUBDIR "if (NOT MSVC) + message(FATAL_ERROR \"This Intel TBB package is intended to be used only in the project with MSVC\") +endif() + +# Detect the most relevant MSVC subdirectory +set(_tbb_msvc_1700_subdir vc11) +set(_tbb_msvc_1800_subdir vc12) +set(_tbb_msvc_1900_subdir vc14) +set(_tbb_msvc_ver \${MSVC_VERSION}) +if (MSVC_VERSION VERSION_LESS 1700) + message(FATAL_ERROR \"This Intel TBB package is intended to be used only in the project with MSVC version 1700 (vc11) or higher\") +elseif (MSVC_VERSION VERSION_GREATER 1900) + set(_tbb_msvc_ver 1900) +endif() +set(_tbb_compiler_subdir \${_tbb_msvc_\${_tbb_msvc_ver}_subdir}) +unset(_tbb_msvc_1700_subdir) +unset(_tbb_msvc_1800_subdir) +unset(_tbb_msvc_1900_subdir) + +if (WINDOWS_STORE) + set(_tbb_compiler_subdir \${_tbb_compiler_subdir}_ui) +endif()") + + if (tbb_MK_CONFIG_FOR_SOURCE) + set(TBB_IMPLIB_RELEASE "\nIMPORTED_IMPLIB_RELEASE \"${tbb_MK_TBB_RELEASE_DIR}/\${_tbb_component}.lib\"") + set(TBB_IMPLIB_DEBUG "\nIMPORTED_IMPLIB_DEBUG \"${tbb_MK_TBB_DEBUG_DIR}/\${_tbb_component}_debug.lib\"") + else() + # Note: multiline variable + set(TBB_IMPLIB " + IMPORTED_IMPLIB_RELEASE \"\${_tbb_root}/lib/\${_tbb_arch_subdir}/\${_tbb_compiler_subdir}/\${_tbb_component}.lib\" + IMPORTED_IMPLIB_DEBUG \"\${_tbb_root}/lib/\${_tbb_arch_subdir}/\${_tbb_compiler_subdir}/\${_tbb_component}_debug.lib\"") + endif() + + # Note: multiline variable + # tbb/internal/_tbb_windef.h (included via tbb/tbb_stddef.h) does implicit linkage of some .lib files, use a special define to avoid it + set(TBB_COMPILE_DEFINITIONS " + INTERFACE_COMPILE_DEFINITIONS \"__TBB_NO_IMPLICIT_LINKAGE=1\"") + elseif (tbb_system_name STREQUAL "Darwin") + set(TBB_SHARED_LIB_DIR "lib") + set(TBB_X32_SUBDIR ".") + set(TBB_X64_SUBDIR ".") + set(TBB_LIB_PREFIX "lib") + set(TBB_LIB_EXT "dylib") + set(TBB_CHOOSE_COMPILER_SUBDIR "set(_tbb_compiler_subdir .)") + elseif (tbb_system_name STREQUAL "Android") + set(TBB_SHARED_LIB_DIR "lib") + set(TBB_X32_SUBDIR ".") + set(TBB_X64_SUBDIR "x86_64") + set(TBB_LIB_PREFIX "lib") + set(TBB_LIB_EXT "so") + set(TBB_CHOOSE_COMPILER_SUBDIR "set(_tbb_compiler_subdir .)") + else() + message(FATAL_ERROR "Unsupported OS name: ${tbb_system_name}") + endif() + + file(READ "${tbb_MK_TBB_ROOT}/include/tbb/tbb_stddef.h" _tbb_stddef) + string(REGEX REPLACE ".*#define TBB_VERSION_MAJOR ([0-9]+).*" "\\1" _tbb_ver_major "${_tbb_stddef}") + string(REGEX REPLACE ".*#define TBB_VERSION_MINOR ([0-9]+).*" "\\1" _tbb_ver_minor "${_tbb_stddef}") + string(REGEX REPLACE ".*#define TBB_INTERFACE_VERSION ([0-9]+).*" "\\1" TBB_INTERFACE_VERSION "${_tbb_stddef}") + set(TBB_VERSION "${_tbb_ver_major}.${_tbb_ver_minor}") + + if (tbb_MK_CONFIG_FOR_SOURCE) + set(_tbb_config_template TBBConfigForSource.cmake.in) + else() + set(_tbb_config_template TBBConfig.cmake.in) + endif() + configure_file(${_tbb_cmake_module_path}/templates/${_tbb_config_template} ${tbb_config_dir}/TBBConfig.cmake @ONLY) + configure_file(${_tbb_cmake_module_path}/templates/TBBConfigVersion.cmake.in ${tbb_config_dir}/TBBConfigVersion.cmake @ONLY) + + set(${tbb_MK_CONFIG_DIR} ${tbb_config_dir} PARENT_SCOPE) +endfunction() diff --git a/xdl/third_party/tbb/cmake/tbb_config_generator.cmake b/xdl/third_party/tbb/cmake/tbb_config_generator.cmake new file mode 100644 index 00000000..5c38aaa4 --- /dev/null +++ b/xdl/third_party/tbb/cmake/tbb_config_generator.cmake @@ -0,0 +1,45 @@ +# Copyright (c) 2017-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +function(tbb_conf_gen_print_help) + message("Usage: cmake -DTBB_ROOT= -DTBB_OS=Linux|Windows|Darwin [-DSAVE_TO=] -P tbb_config_generator.cmake") +endfunction() + +if (NOT DEFINED TBB_ROOT) + tbb_conf_gen_print_help() + message(FATAL_ERROR "Required parameter TBB_ROOT is not defined") +endif() + +if (NOT EXISTS "${TBB_ROOT}") + tbb_conf_gen_print_help() + message(FATAL_ERROR "TBB_ROOT=${TBB_ROOT} does not exist") +endif() + +if (NOT DEFINED TBB_OS) + tbb_conf_gen_print_help() + message(FATAL_ERROR "Required parameter TBB_OS is not defined") +endif() + +if (DEFINED SAVE_TO) + set(tbb_conf_gen_save_to_param SAVE_TO ${SAVE_TO}) +endif() + +include(${CMAKE_CURRENT_LIST_DIR}/TBBMakeConfig.cmake) +tbb_make_config(TBB_ROOT ${TBB_ROOT} CONFIG_DIR tbb_config_dir SYSTEM_NAME ${TBB_OS} ${tbb_conf_gen_save_to_param}) + +message(STATUS "TBBConfig files were created in ${tbb_config_dir}") diff --git a/xdl/third_party/tbb/cmake/templates/TBBConfig.cmake.in b/xdl/third_party/tbb/cmake/templates/TBBConfig.cmake.in new file mode 100644 index 00000000..9094343c --- /dev/null +++ b/xdl/third_party/tbb/cmake/templates/TBBConfig.cmake.in @@ -0,0 +1,89 @@ +# Copyright (c) 2017-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +# TBB_FOUND should not be set explicitly. It is defined automatically by CMake. +# Handling of TBB_VERSION is in TBBConfigVersion.cmake. + +if (NOT TBB_FIND_COMPONENTS) + set(TBB_FIND_COMPONENTS "@TBB_DEFAULT_COMPONENTS@") + foreach (_tbb_component ${TBB_FIND_COMPONENTS}) + set(TBB_FIND_REQUIRED_${_tbb_component} 1) + endforeach() +endif() + +# Add components with internal dependencies: tbbmalloc_proxy -> tbbmalloc +list(FIND TBB_FIND_COMPONENTS tbbmalloc_proxy _tbbmalloc_proxy_ix) +if (NOT _tbbmalloc_proxy_ix EQUAL -1) + list(FIND TBB_FIND_COMPONENTS tbbmalloc _tbbmalloc_ix) + if (_tbbmalloc_ix EQUAL -1) + list(APPEND TBB_FIND_COMPONENTS tbbmalloc) + set(TBB_FIND_REQUIRED_tbbmalloc ${TBB_FIND_REQUIRED_tbbmalloc_proxy}) + endif() +endif() + +set(TBB_INTERFACE_VERSION @TBB_INTERFACE_VERSION@) + +get_filename_component(_tbb_root "${CMAKE_CURRENT_LIST_FILE}" PATH) +get_filename_component(_tbb_root "${_tbb_root}" PATH) + +set(_tbb_x32_subdir @TBB_X32_SUBDIR@) +set(_tbb_x64_subdir @TBB_X64_SUBDIR@) + +if (CMAKE_SIZEOF_VOID_P EQUAL 8) + set(_tbb_arch_subdir ${_tbb_x64_subdir}) +else() + set(_tbb_arch_subdir ${_tbb_x32_subdir}) +endif() + +@TBB_CHOOSE_COMPILER_SUBDIR@ + +get_filename_component(_tbb_lib_path "${_tbb_root}/@TBB_SHARED_LIB_DIR@/${_tbb_arch_subdir}/${_tbb_compiler_subdir}" ABSOLUTE) + +foreach (_tbb_component ${TBB_FIND_COMPONENTS}) + set(_tbb_release_lib "${_tbb_lib_path}/@TBB_LIB_PREFIX@${_tbb_component}.@TBB_LIB_EXT@") + set(_tbb_debug_lib "${_tbb_lib_path}/@TBB_LIB_PREFIX@${_tbb_component}_debug.@TBB_LIB_EXT@") + + if (EXISTS "${_tbb_release_lib}" AND EXISTS "${_tbb_debug_lib}") + add_library(TBB::${_tbb_component} SHARED IMPORTED) + set_target_properties(TBB::${_tbb_component} PROPERTIES + IMPORTED_CONFIGURATIONS "RELEASE;DEBUG" + IMPORTED_LOCATION_RELEASE "${_tbb_release_lib}" + IMPORTED_LOCATION_DEBUG "${_tbb_debug_lib}" + INTERFACE_INCLUDE_DIRECTORIES "${_tbb_root}/include"@TBB_IMPLIB@@TBB_COMPILE_DEFINITIONS@) + + # Add internal dependencies for imported targets: TBB::tbbmalloc_proxy -> TBB::tbbmalloc + if (_tbb_component STREQUAL tbbmalloc_proxy) + set_target_properties(TBB::tbbmalloc_proxy PROPERTIES INTERFACE_LINK_LIBRARIES TBB::tbbmalloc) + endif() + + list(APPEND TBB_IMPORTED_TARGETS TBB::${_tbb_component}) + set(TBB_${_tbb_component}_FOUND 1) + elseif (TBB_FIND_REQUIRED AND TBB_FIND_REQUIRED_${_tbb_component}) + message(FATAL_ERROR "Missed required Intel TBB component: ${_tbb_component}") + endif() +endforeach() + +unset(_tbb_x32_subdir) +unset(_tbb_x64_subdir) +unset(_tbb_arch_subdir) +unset(_tbb_compiler_subdir) +unset(_tbbmalloc_proxy_ix) +unset(_tbbmalloc_ix) +unset(_tbb_lib_path) +unset(_tbb_release_lib) +unset(_tbb_debug_lib) diff --git a/xdl/third_party/tbb/cmake/templates/TBBConfigForSource.cmake.in b/xdl/third_party/tbb/cmake/templates/TBBConfigForSource.cmake.in new file mode 100644 index 00000000..2bccdd9e --- /dev/null +++ b/xdl/third_party/tbb/cmake/templates/TBBConfigForSource.cmake.in @@ -0,0 +1,82 @@ +# Copyright (c) 2017-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +# TBB_FOUND should not be set explicitly. It is defined automatically by CMake. +# Handling of TBB_VERSION is in TBBConfigVersion.cmake. + +if (NOT TBB_FIND_COMPONENTS) + set(TBB_FIND_COMPONENTS "@TBB_DEFAULT_COMPONENTS@") + foreach (_tbb_component ${TBB_FIND_COMPONENTS}) + set(TBB_FIND_REQUIRED_${_tbb_component} 1) + endforeach() +endif() + +# Add components with internal dependencies: tbbmalloc_proxy -> tbbmalloc +list(FIND TBB_FIND_COMPONENTS tbbmalloc_proxy _tbbmalloc_proxy_ix) +if (NOT _tbbmalloc_proxy_ix EQUAL -1) + list(FIND TBB_FIND_COMPONENTS tbbmalloc _tbbmalloc_ix) + if (_tbbmalloc_ix EQUAL -1) + list(APPEND TBB_FIND_COMPONENTS tbbmalloc) + set(TBB_FIND_REQUIRED_tbbmalloc ${TBB_FIND_REQUIRED_tbbmalloc_proxy}) + endif() +endif() + +set(TBB_INTERFACE_VERSION @TBB_INTERFACE_VERSION@) + +get_filename_component(_tbb_root "${CMAKE_CURRENT_LIST_FILE}" PATH) +get_filename_component(_tbb_root "${_tbb_root}" PATH) + +foreach (_tbb_component ${TBB_FIND_COMPONENTS}) + set(_tbb_release_lib "@TBB_RELEASE_DIR@/@TBB_LIB_PREFIX@${_tbb_component}.@TBB_LIB_EXT@") + set(_tbb_debug_lib "@TBB_DEBUG_DIR@/@TBB_LIB_PREFIX@${_tbb_component}_debug.@TBB_LIB_EXT@") + + if (EXISTS "${_tbb_release_lib}" OR EXISTS "${_tbb_debug_lib}") + add_library(TBB::${_tbb_component} SHARED IMPORTED) + set_target_properties(TBB::${_tbb_component} PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${_tbb_root}/include"@TBB_COMPILE_DEFINITIONS@) + + + if (EXISTS "${_tbb_release_lib}") + set_target_properties(TBB::${_tbb_component} PROPERTIES + IMPORTED_LOCATION_RELEASE "${_tbb_release_lib}"@TBB_IMPLIB_RELEASE@) + set_property(TARGET TBB::${_tbb_component} APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE) + endif() + + if (EXISTS "${_tbb_debug_lib}") + set_target_properties(TBB::${_tbb_component} PROPERTIES + IMPORTED_LOCATION_DEBUG "${_tbb_debug_lib}"@TBB_IMPLIB_DEBUG@) + set_property(TARGET TBB::${_tbb_component} APPEND PROPERTY IMPORTED_CONFIGURATIONS DEBUG) + endif() + + # Add internal dependencies for imported targets: TBB::tbbmalloc_proxy -> TBB::tbbmalloc + if (_tbb_component STREQUAL tbbmalloc_proxy) + set_target_properties(TBB::tbbmalloc_proxy PROPERTIES INTERFACE_LINK_LIBRARIES TBB::tbbmalloc) + endif() + + list(APPEND TBB_IMPORTED_TARGETS TBB::${_tbb_component}) + set(TBB_${_tbb_component}_FOUND 1) + elseif (TBB_FIND_REQUIRED AND TBB_FIND_REQUIRED_${_tbb_component}) + message(FATAL_ERROR "Missed required Intel TBB component: ${_tbb_component}") + endif() +endforeach() + +unset(_tbbmalloc_proxy_ix) +unset(_tbbmalloc_ix) +unset(_tbb_lib_path) +unset(_tbb_release_lib) +unset(_tbb_debug_lib) diff --git a/xdl/third_party/tbb/cmake/templates/TBBConfigVersion.cmake.in b/xdl/third_party/tbb/cmake/templates/TBBConfigVersion.cmake.in new file mode 100644 index 00000000..f587af28 --- /dev/null +++ b/xdl/third_party/tbb/cmake/templates/TBBConfigVersion.cmake.in @@ -0,0 +1,28 @@ +# Copyright (c) 2017-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +set(PACKAGE_VERSION @TBB_VERSION@) + +if ("${PACKAGE_VERSION}" VERSION_LESS "${PACKAGE_FIND_VERSION}") + set(PACKAGE_VERSION_COMPATIBLE FALSE) +else() + set(PACKAGE_VERSION_COMPATIBLE TRUE) + if ("${PACKAGE_VERSION}" VERSION_EQUAL "${PACKAGE_FIND_VERSION}") + set(PACKAGE_VERSION_EXACT TRUE) + endif() +endif() diff --git a/xdl/third_party/tbb/doc/Release_Notes.txt b/xdl/third_party/tbb/doc/Release_Notes.txt new file mode 100644 index 00000000..aba73d9a --- /dev/null +++ b/xdl/third_party/tbb/doc/Release_Notes.txt @@ -0,0 +1,134 @@ +------------------------------------------------------------------------ +Intel(R) Threading Building Blocks - Release Notes + Version 2019 +------------------------------------------------------------------------ + + +System Requirements +------------------- + +Intel(R) Threading Building Blocks (Intel(R) TBB) is available +commercially (see http://software.intel.com/en-us/intel-tbb) as a +binary distribution, and in open source, in both source and binary +forms (see http://threadingbuildingblocks.org). + +When built from source, Intel(R) TBB is intended to be highly portable +and so supports a wide variety of operating systems and platforms (see +http://threadingbuildingblocks.org for more details). + +Binary distributions, including commercial distributions, are validated +and officially supported for the hardware, software, operating systems +and compilers listed here. + +Hardware - Recommended + + Microsoft* Windows* Systems + Intel(R) Core(TM) processor family + Intel(R) Xeon(R) processor family + Intel(R) Xeon Phi(TM) processor family + Linux* Systems + Intel(R) Core(TM) processor family + Intel(R) Xeon(R) processor family + Intel(R) Xeon Phi(TM) processor family + macOS* Systems + Intel(R) Core(TM) processor family + Android* Systems + Intel(R) Atom(TM) processor family + +Hardware - Supported + + Intel(R) Pentium(R) 4 processor family + Intel(R) Xeon Phi(TM) coprocessor + Intel(R) Atom(TM) processor family + Non Intel(R) processors compatible with the above processors + +Software - Minimum Requirements + + Supported operating system (see below) + Supported compiler (see below) + +Software - Recommended + + Intel(R) Parallel Studio XE 2018, 2019 + Intel(R) System Studio 2018, 2019 + +Software - Supported Operating Systems + + Systems with Microsoft* Windows* operating systems + Microsoft* Windows* 10 + Microsoft* Windows* 8.1 + Microsoft* Windows* 7 SP1 + Microsoft* Windows* Server 2016 + Microsoft* Windows* Server 2012 R2 + Systems with Linux* operating systems + CentOS 7.1 + Debian* 8, 9 + Fedora* 27 + Intel(R) Cluster Ready + Red Hat* Enterprise Linux* 6, 7 + SuSE* Linux* Enterprise Server 12 + Ubuntu* 14.04 LTS, 16.04 LTS, 18.04 LTS + WindRiver* Linux 8, 9 + Yocto 2.3 + Systems with OS X* or macOS* operating systems + OS X* 10.11 + macOS* 10.12, 10.13 + Systems with Android* operating systems + Android* 5.x, 6.x, 7.x, 8.x + +Software - Supported Compilers + + Intel(R) C++ Compiler 17, 18 and 19 version + Microsoft* Visual C++ 12.0 (Microsoft* Visual Studio* 2013, + Windows* OS only) + Microsoft* Visual C++ 14.0 (Microsoft* Visual Studio* 2015, + Windows* OS only) + Microsoft* Visual C++ 14.1 (Microsoft* Visual Studio* 2017, + Windows* OS only) + Microsoft* Windows* Software Development Kit for Windows* 8.1 + Microsoft* Windows* Software Development Kit for Windows* 10 + For each supported Linux* operating system, the standard gcc + version provided with that operating system is supported + GNU Compilers (gcc) 4.1 - 7.1 + GNU C Library (glibc) version 2.4 - 2.19 + Xcode* 7.0 - 9.1 + Android* NDK r10e - r17b + +Software - Supported Performance Analysis Tools + + Intel(R) VTune(TM) Amplifier XE 2018, 2019 + Intel(R) Inspector XE 2018, 2019 + Intel(R) Advisor XE 2018, 2019 + +Known Issues +------------ + +Below is the list of known issues in this release of +Intel(R) Threading Building Blocks (Intel(R) TBB). +See the "Known Issues" appendix in the Intel(R) TBB Developer +Reference for notes applicable to multiple releases of Intel(R) TBB. + +Library Issues + + - If you build Intel(R) TBB from sources with GCC 6, specify + the -flifetime-dse=1 option to prevent crashes at runtime, + or use Intel(R) TBB makefiles that automatically set this option. + + - The current implementation of gfx_factory does not allow memory + buffer objects to be used concurrently. As a result, several + streaming nodes customized with gfx_factory cannot be connected + with each other directly. + +------------------------------------------------------------------------ +(C) 2018 Intel Corporation + +Intel, the Intel logo, Intel Core, Intel Atom, Xeon, Intel Xeon Phi and +Pentium are trademarks of Intel Corporation in the U.S. and/or other +countries. + +* Other names and brands may be claimed as the property of others. + +Third Party and Open Source Licenses + +Content of some examples or binaries may be covered by various open-source +licenses. See the index.html file in each respective folder for details. diff --git a/xdl/third_party/tbb/doc/copyright_brand_disclaimer_doxygen.txt b/xdl/third_party/tbb/doc/copyright_brand_disclaimer_doxygen.txt new file mode 100644 index 00000000..7ba446bb --- /dev/null +++ b/xdl/third_party/tbb/doc/copyright_brand_disclaimer_doxygen.txt @@ -0,0 +1,9 @@ +
+

+Copyright © 2005-2018 Intel Corporation. All Rights Reserved. +

+Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are +registered trademarks or trademarks of Intel Corporation or its +subsidiaries in the United States and other countries. +

+* Other names and brands may be claimed as the property of others. diff --git a/xdl/third_party/tbb/examples/GettingStarted/index.html b/xdl/third_party/tbb/examples/GettingStarted/index.html new file mode 100644 index 00000000..ee3e985d --- /dev/null +++ b/xdl/third_party/tbb/examples/GettingStarted/index.html @@ -0,0 +1,344 @@ + + + + + + Intel® Threading Building Blocks. Getting Started Samples + + + + + +

+ This directory contains the examples referenced by the Intel® Threading Building Blocks Getting Started Guide. +

+ +
+
Directories
+ +
+
+
sub_string_finder +
Finds largest matching substrings. +
+
+
+
+ Up to parent directory +
+
+
Legal Information:
+ +
+

+ Intel and the Intel logo are trademarks of Intel Corporation in the U.S. and/or other countries. +
* Other names and brands may be claimed as the property of others. +
© 2018, Intel Corporation +

+
+
+ + + diff --git a/xdl/third_party/tbb/examples/GettingStarted/sub_string_finder/CMakeLists.txt b/xdl/third_party/tbb/examples/GettingStarted/sub_string_finder/CMakeLists.txt new file mode 100644 index 00000000..4fc7a7d2 --- /dev/null +++ b/xdl/third_party/tbb/examples/GettingStarted/sub_string_finder/CMakeLists.txt @@ -0,0 +1,15 @@ +cmake_minimum_required(VERSION 3.0.0 FATAL_ERROR) + +project(sub_string_finder CXX) +add_executable(sub_string_finder sub_string_finder.cpp) + +include(${TBB_ROOT}/cmake/TBBBuild.cmake) + +# Build Intel TBB with enabled Community Preview Features (CPF). +tbb_build(TBB_ROOT ${TBB_ROOT} CONFIG_DIR TBB_DIR MAKE_ARGS) + +find_package(TBB REQUIRED) + +# Link Intel TBB imported targets to the executable; +# "TBB::tbb_preview" can be used instead of "${TBB_IMPORTED_TARGETS}". +target_link_libraries(sub_string_finder ${TBB_IMPORTED_TARGETS}) diff --git a/xdl/third_party/tbb/examples/GettingStarted/sub_string_finder/Makefile b/xdl/third_party/tbb/examples/GettingStarted/sub_string_finder/Makefile new file mode 100644 index 00000000..cb97400b --- /dev/null +++ b/xdl/third_party/tbb/examples/GettingStarted/sub_string_finder/Makefile @@ -0,0 +1,74 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +# GNU Makefile that builds and runs example. +run_cmd= +PROG=sub_string_finder_extended +ARGS= +LIGHT_PROG=sub_string_finder + +# The C++ compiler +ifneq (,$(shell which icc 2>/dev/null)) +CXX=icc +endif # icc + +TBBLIB = -ltbb +TBBLIB_DEBUG = -ltbb_debug + +ifneq (,$(findstring mic, $(offload))) +override CXXFLAGS += -qoffload-arch=$(offload) -qopt-report-phase:offload -D__TBB_MIC_OFFLOAD=1 +# Replace -ltbb with -tbb in the offload mode +TBBLIB = -tbb +TBBLIB_DEBUG += -qoffload-option,mic,ld,"-ltbb_debug" +endif + +ifeq ($(shell uname), Linux) +ifeq ($(target), android) +LIBS+= --sysroot=$(SYSROOT) +run_cmd=../../common/android.linux.launcher.sh +else +LIBS+= -lrt +endif +else ifeq ($(shell uname), Darwin) +override CXXFLAGS += -Wl,-rpath,$(TBBROOT)/lib +endif + +all: release test + +release: *.cpp +ifeq ($(offload),) + $(CXX) -O2 -DNDEBUG $(CXXFLAGS) -o sub_string_finder sub_string_finder.cpp $(TBBLIB) $(LIBS) + $(CXX) -O2 -DNDEBUG $(CXXFLAGS) -o sub_string_finder_pretty sub_string_finder_pretty.cpp $(TBBLIB) $(LIBS) +endif + $(CXX) -O2 -DNDEBUG $(CXXFLAGS) -o sub_string_finder_extended sub_string_finder_extended.cpp $(TBBLIB) $(LIBS) + +debug: *.cpp +ifeq ($(offload),) + $(CXX) -O0 -g -DTBB_USE_DEBUG $(CXXFLAGS) -o sub_string_finder sub_string_finder.cpp $(TBBLIB_DEBUG) $(LIBS) + $(CXX) -O0 -g -DTBB_USE_DEBUG $(CXXFLAGS) -o sub_string_finder_pretty sub_string_finder_pretty.cpp $(TBBLIB_DEBUG) $(LIBS) +endif + $(CXX) -O0 -g -DTBB_USE_DEBUG $(CXXFLAGS) -o sub_string_finder_extended sub_string_finder_extended.cpp $(TBBLIB_DEBUG) $(LIBS) + +clean: + $(RM) sub_string_finder sub_string_finder_extended sub_string_finder_pretty *.o *.d + +test: + $(run_cmd) ./$(PROG) $(ARGS) + +light_test: + $(run_cmd) ./$(LIGHT_PROG) $(ARGS) diff --git a/xdl/third_party/tbb/examples/GettingStarted/sub_string_finder/Makefile.windows b/xdl/third_party/tbb/examples/GettingStarted/sub_string_finder/Makefile.windows new file mode 100644 index 00000000..cc49a396 --- /dev/null +++ b/xdl/third_party/tbb/examples/GettingStarted/sub_string_finder/Makefile.windows @@ -0,0 +1,59 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +# Common Makefile that builds and runs examples. +PROG=sub_string_finder_extended +ARGS= +LIGHT_PROG=sub_string_finder + +# The C++ compiler options +# Trying to find if icl.exe is set +CXX1 = $(TBB_CXX)- +CXX2 = $(CXX1:icl.exe-=icl.exe) +CXX = $(CXX2:-=cl.exe) + +offload1 = $(offload)+ +OFFLOADFLAGS1 = $(offload1:mic+=/Qoffload-arch=mic) +OFFLOADFLAGS2 = $(OFFLOADFLAGS1:mic-avx512+=/Qoffload-arch=mic-avx512) +offload2 = $(offload:mic-avx512=mic) +OFFLOADFLAGS = $(OFFLOADFLAGS2:+=) $(offload2:mic=/D__TBB_MIC_OFFLOAD /Qdiag-disable:3335,3440,3441) + +MYCXXFLAGS = /EHsc /W3 /nologo /D _CONSOLE /D _MBCS /D WIN32 $(OFFLOADFLAGS) $(CXXFLAGS) +MYLDFLAGS =/INCREMENTAL:NO /NOLOGO /DEBUG /FIXED:NO $(LDFLAGS) + +TBB_MIC_LIB = $(offload2:mic=/Qtbb) +TBB_DEBUG_MIC_LIB = $(offload2:mic=/Qoffload-option,mic,link,"-ltbb_debug") + +all: release test +release: compiler_check + $(CXX) sub_string_finder.cpp /MD /O2 /D NDEBUG $(MYCXXFLAGS) $(TBB_MIC_LIB) /link tbb.lib $(LIBS) $(MYLDFLAGS) /OUT:sub_string_finder.exe + $(CXX) sub_string_finder_extended.cpp /MD /O2 /D NDEBUG $(MYCXXFLAGS) $(TBB_MIC_LIB) /link tbb.lib $(LIBS) $(MYLDFLAGS) /OUT:sub_string_finder_extended.exe + $(CXX) sub_string_finder_pretty.cpp /MD /O2 /D NDEBUG $(MYCXXFLAGS) $(TBB_MIC_LIB) /link tbb.lib $(LIBS) $(MYLDFLAGS) /OUT:sub_string_finder_pretty.exe +debug: compiler_check + $(CXX) sub_string_finder.cpp /MDd /Od /Zi /D TBB_USE_DEBUG /D _DEBUG $(MYCXXFLAGS) $(TBB_DEBUG_MIC_LIB) /link tbb_debug.lib $(LIBS) $(MYLDFLAGS) /OUT:sub_string_finder.exe + $(CXX) sub_string_finder_extended.cpp /MDd /Od /Zi /D TBB_USE_DEBUG /D _DEBUG $(MYCXXFLAGS) $(TBB_DEBUG_MIC_LIB) /link tbb_debug.lib $(LIBS) $(MYLDFLAGS) /OUT:sub_string_finder_extended.exe + $(CXX) sub_string_finder_pretty.cpp /MDd /Od /Zi /D TBB_USE_DEBUG /D _DEBUG $(MYCXXFLAGS) $(TBB_DEBUG_MIC_LIB) /link tbb_debug.lib $(LIBS) $(MYLDFLAGS) /OUT:sub_string_finder_pretty.exe +clean: + @cmd.exe /C del sub_string_finder*.exe *.obj *.?db *.manifest +test: + $(PROG) $(ARGS) +light_test: + $(LIGHT_PROG) $(ARGS) +compiler_check: + @echo compiler_test>compiler_test && @$(CXX) /E compiler_test >nul 2>&1 || echo "$(CXX) command not found. Check if CXX=$(CXX) is set properly" + @cmd.exe /C del compiler_test diff --git a/xdl/third_party/tbb/examples/GettingStarted/sub_string_finder/msvs/sub_string_finder.sln b/xdl/third_party/tbb/examples/GettingStarted/sub_string_finder/msvs/sub_string_finder.sln new file mode 100644 index 00000000..ffe7699b --- /dev/null +++ b/xdl/third_party/tbb/examples/GettingStarted/sub_string_finder/msvs/sub_string_finder.sln @@ -0,0 +1,48 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.40629.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sub_string_finder", "sub_string_finder.vcxproj", "{3AA40693-F93D-4D4B-B32E-068F511A2525}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sub_string_finder_extended", "sub_string_finder_extended.vcxproj", "{3AA40693-F93D-4D4B-B32E-068F511A2526}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sub_string_finder_pretty", "sub_string_finder_pretty.vcxproj", "{3AA40693-F93D-4D4B-B32E-068F511A2524}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {3AA40693-F93D-4D4B-B32E-068F511A2525}.Debug|Win32.ActiveCfg = Debug|Win32 + {3AA40693-F93D-4D4B-B32E-068F511A2525}.Debug|Win32.Build.0 = Debug|Win32 + {3AA40693-F93D-4D4B-B32E-068F511A2525}.Debug|x64.ActiveCfg = Debug|x64 + {3AA40693-F93D-4D4B-B32E-068F511A2525}.Debug|x64.Build.0 = Debug|x64 + {3AA40693-F93D-4D4B-B32E-068F511A2525}.Release|Win32.ActiveCfg = Release|Win32 + {3AA40693-F93D-4D4B-B32E-068F511A2525}.Release|Win32.Build.0 = Release|Win32 + {3AA40693-F93D-4D4B-B32E-068F511A2525}.Release|x64.ActiveCfg = Release|x64 + {3AA40693-F93D-4D4B-B32E-068F511A2525}.Release|x64.Build.0 = Release|x64 + {3AA40693-F93D-4D4B-B32E-068F511A2526}.Debug|Win32.ActiveCfg = Debug|Win32 + {3AA40693-F93D-4D4B-B32E-068F511A2526}.Debug|Win32.Build.0 = Debug|Win32 + {3AA40693-F93D-4D4B-B32E-068F511A2526}.Debug|x64.ActiveCfg = Debug|x64 + {3AA40693-F93D-4D4B-B32E-068F511A2526}.Debug|x64.Build.0 = Debug|x64 + {3AA40693-F93D-4D4B-B32E-068F511A2526}.Release|Win32.ActiveCfg = Release|Win32 + {3AA40693-F93D-4D4B-B32E-068F511A2526}.Release|Win32.Build.0 = Release|Win32 + {3AA40693-F93D-4D4B-B32E-068F511A2526}.Release|x64.ActiveCfg = Release|x64 + {3AA40693-F93D-4D4B-B32E-068F511A2526}.Release|x64.Build.0 = Release|x64 + {3AA40693-F93D-4D4B-B32E-068F511A2524}.Debug|Win32.ActiveCfg = Debug|Win32 + {3AA40693-F93D-4D4B-B32E-068F511A2524}.Debug|Win32.Build.0 = Debug|Win32 + {3AA40693-F93D-4D4B-B32E-068F511A2524}.Debug|x64.ActiveCfg = Debug|x64 + {3AA40693-F93D-4D4B-B32E-068F511A2524}.Debug|x64.Build.0 = Debug|x64 + {3AA40693-F93D-4D4B-B32E-068F511A2524}.Release|Win32.ActiveCfg = Release|Win32 + {3AA40693-F93D-4D4B-B32E-068F511A2524}.Release|Win32.Build.0 = Release|Win32 + {3AA40693-F93D-4D4B-B32E-068F511A2524}.Release|x64.ActiveCfg = Release|x64 + {3AA40693-F93D-4D4B-B32E-068F511A2524}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/xdl/third_party/tbb/examples/GettingStarted/sub_string_finder/msvs/sub_string_finder.vcxproj b/xdl/third_party/tbb/examples/GettingStarted/sub_string_finder/msvs/sub_string_finder.vcxproj new file mode 100644 index 00000000..89261817 --- /dev/null +++ b/xdl/third_party/tbb/examples/GettingStarted/sub_string_finder/msvs/sub_string_finder.vcxproj @@ -0,0 +1,198 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + sub_string_finder + {3AA40693-F93D-4D4B-B32E-068F511A2525} + sub_string_finder + Win32Proj + + + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.40219.1 + $(TEMP)\tbb_examples\$(Configuration)\ + $(TEMP)\tbb_examples\$(ProjectName)\$(Configuration)\ + false + $(TEMP)\tbb_examples\$(Platform)\$(Configuration)\ + $(TEMP)\tbb_examples\$(ProjectName)\$(Platform)\$(Configuration)\ + false + $(TEMP)\tbb_examples\$(Configuration)\ + $(TEMP)\tbb_examples\$(ProjectName)\$(Configuration)\ + false + $(TEMP)\tbb_examples\$(Platform)\$(Configuration)\ + $(TEMP)\tbb_examples\$(ProjectName)\$(Platform)\$(Configuration)\ + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG;%(PreprocessorDefinitions) + MultiThreadedDebugDLL + + + ProgramDatabase + + + tbb_debug.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc12;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc12;%(AdditionalLibraryDirectories) + true + Console + MachineX86 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 debug "$(OutDir)" + + + + + X64 + + + Disabled + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG;%(PreprocessorDefinitions) + MultiThreadedDebugDLL + + + ProgramDatabase + + + tbb_debug.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc12;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc12;%(AdditionalLibraryDirectories) + true + Console + MachineX64 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 debug "$(OutDir)" + + + + + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + + + ProgramDatabase + + + tbb.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc12;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc12;%(AdditionalLibraryDirectories) + true + Console + true + true + MachineX86 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 release "$(OutDir)" + + + + + X64 + + + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + + + ProgramDatabase + + + tbb.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc12;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc12;%(AdditionalLibraryDirectories) + true + Console + true + true + MachineX64 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 release "$(OutDir)" + + + + + + + + + \ No newline at end of file diff --git a/xdl/third_party/tbb/examples/GettingStarted/sub_string_finder/msvs/sub_string_finder_extended.vcxproj b/xdl/third_party/tbb/examples/GettingStarted/sub_string_finder/msvs/sub_string_finder_extended.vcxproj new file mode 100644 index 00000000..fad40433 --- /dev/null +++ b/xdl/third_party/tbb/examples/GettingStarted/sub_string_finder/msvs/sub_string_finder_extended.vcxproj @@ -0,0 +1,198 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + sub_string_finder_extended + {3AA40693-F93D-4D4B-B32E-068F511A2526} + sub_string_finder_extended + Win32Proj + + + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.40219.1 + $(TEMP)\tbb_examples\$(Configuration)\ + $(TEMP)\tbb_examples\$(ProjectName)\$(Configuration)\ + false + $(TEMP)\tbb_examples\$(Platform)\$(Configuration)\ + $(TEMP)\tbb_examples\$(ProjectName)\$(Platform)\$(Configuration)\ + false + $(TEMP)\tbb_examples\$(Configuration)\ + $(TEMP)\tbb_examples\$(ProjectName)\$(Configuration)\ + false + $(TEMP)\tbb_examples\$(Platform)\$(Configuration)\ + $(TEMP)\tbb_examples\$(ProjectName)\$(Platform)\$(Configuration)\ + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG;%(PreprocessorDefinitions) + MultiThreadedDebugDLL + + + ProgramDatabase + + + tbb_debug.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc12;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc12;%(AdditionalLibraryDirectories) + true + Console + MachineX86 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 debug "$(OutDir)" + + + + + X64 + + + Disabled + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG;%(PreprocessorDefinitions) + MultiThreadedDebugDLL + + + ProgramDatabase + + + tbb_debug.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc12;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc12;%(AdditionalLibraryDirectories) + true + Console + MachineX64 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 debug "$(OutDir)" + + + + + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + + + ProgramDatabase + + + tbb.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc12;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc12;%(AdditionalLibraryDirectories) + true + Console + true + true + MachineX86 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 release "$(OutDir)" + + + + + X64 + + + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + + + ProgramDatabase + + + tbb.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc12;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc12;%(AdditionalLibraryDirectories) + true + Console + true + true + MachineX64 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 release "$(OutDir)" + + + + + + + + + \ No newline at end of file diff --git a/xdl/third_party/tbb/examples/GettingStarted/sub_string_finder/msvs/sub_string_finder_pretty.vcxproj b/xdl/third_party/tbb/examples/GettingStarted/sub_string_finder/msvs/sub_string_finder_pretty.vcxproj new file mode 100644 index 00000000..bb3e84b7 --- /dev/null +++ b/xdl/third_party/tbb/examples/GettingStarted/sub_string_finder/msvs/sub_string_finder_pretty.vcxproj @@ -0,0 +1,198 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + sub_string_finder_pretty + {3AA40693-F93D-4D4B-B32E-068F511A2524} + sub_string_finder_pretty + Win32Proj + + + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.40219.1 + $(TEMP)\tbb_examples\$(Configuration)\ + $(TEMP)\tbb_examples\$(ProjectName)\$(Configuration)\ + false + $(TEMP)\tbb_examples\$(Platform)\$(Configuration)\ + $(TEMP)\tbb_examples\$(ProjectName)\$(Platform)\$(Configuration)\ + false + $(TEMP)\tbb_examples\$(Configuration)\ + $(TEMP)\tbb_examples\$(ProjectName)\$(Configuration)\ + false + $(TEMP)\tbb_examples\$(Platform)\$(Configuration)\ + $(TEMP)\tbb_examples\$(ProjectName)\$(Platform)\$(Configuration)\ + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG;%(PreprocessorDefinitions) + MultiThreadedDebugDLL + + + ProgramDatabase + + + tbb_debug.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc12;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc12;%(AdditionalLibraryDirectories) + true + Console + MachineX86 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 debug "$(OutDir)" + + + + + X64 + + + Disabled + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG;%(PreprocessorDefinitions) + MultiThreadedDebugDLL + + + ProgramDatabase + + + tbb_debug.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc12;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc12;%(AdditionalLibraryDirectories) + true + Console + MachineX64 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 debug "$(OutDir)" + + + + + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + + + ProgramDatabase + + + tbb.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc12;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc12;%(AdditionalLibraryDirectories) + true + Console + true + true + MachineX86 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 release "$(OutDir)" + + + + + X64 + + + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + + + ProgramDatabase + + + tbb.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc12;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc12;%(AdditionalLibraryDirectories) + true + Console + true + true + MachineX64 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 release "$(OutDir)" + + + + + + + + + \ No newline at end of file diff --git a/xdl/third_party/tbb/examples/GettingStarted/sub_string_finder/readme.html b/xdl/third_party/tbb/examples/GettingStarted/sub_string_finder/readme.html new file mode 100644 index 00000000..7afbed81 --- /dev/null +++ b/xdl/third_party/tbb/examples/GettingStarted/sub_string_finder/readme.html @@ -0,0 +1,416 @@ + + + + + + Intel® Threading Building Blocks. Sub_string_finder sample + + + + + +

+ A simple example that uses the parallel_for template in a substring matching program. + The Intel® Threading Building Blocks Getting Started Guide describes this example. +

+ For each position + in a string, the program displays the length of the largest matching substring elsewhere in the string. + The program also displays the location of a largest match for each position. Consider the string "babba" + as an example. Starting at position 0, "ba" is the largest substring with a match elsewhere in the + string (position 3). +

+ The code located in the sub_string_finder_extended.cpp file + demonstrates offload programming for Intel® Many Integrated Core (Intel® MIC) Architecture (see build instructions). +

+ +
+
System Requirements
+ +
+

+ For the most up to date system requirements, see the release notes. +

+
+
+ +
+
Files
+ +
+
+
sub_string_finder.cpp +
The example as it appears in the Getting Started Guide. +
sub_string_finder_extended.cpp +
An example similar to the one in the Getting Started Guide, but with an added sequential + implementation, and with an offload region added that can be executed on Intel® MIC Architecture based coprocessor. + The three implementations are timed, by using tick_count, + and the speedup of the parallel version and + the speedup of the parallel version and, if applicable, the offload version is calculated and displayed. +
sub_string_finder_pretty.cpp +
An example similar to the one in the Getting Started Guide, but with more attractive printing of the results. +
Makefile +
Makefile for building the example. +
+
+
+ +
+
Directories
+ +
+
+
msvs +
Contains Microsoft* Visual Studio* workspace for building and running the example (Windows* systems only). +
xcode +
Contains Xcode* IDE workspace for building and running the example (macOS* systems only). +
+

For information about the minimum supported version of IDE, see release notes.

+
+
+ +
+
Build instructions
+ +
+

General build directions can be found here.

+
+
+ +
+
Usage
+ +
+
+
sub_string_finder +
Runs the example as it appears in the Getting Started Guide. +
sub_string_finder_pretty +
Runs the similar example with more attractive printing of the results. +
sub_string_finder_extended +
Runs the example extended with a sequential implementation and an offload region that can be executed on Intel® MIC Architecture based coprocessor. +
To run a short version of this example, e.g., for use with Intel® Threading Tools: +
Build a debug version of the sub_string_finder_pretty example + (see the build instructions). +
Run it, e.g., sub_string_finder_pretty. +
+
+
+ +
+ Up to parent directory +
+
+
Legal Information
+ +
+

+ Intel and the Intel logo are trademarks of Intel Corporation in the U.S. and/or other countries. +
* Other names and brands may be claimed as the property of others. +
© 2018, Intel Corporation +

+
+
+ + + diff --git a/xdl/third_party/tbb/examples/GettingStarted/sub_string_finder/sub_string_finder.cpp b/xdl/third_party/tbb/examples/GettingStarted/sub_string_finder/sub_string_finder.cpp new file mode 100644 index 00000000..9274c473 --- /dev/null +++ b/xdl/third_party/tbb/examples/GettingStarted/sub_string_finder/sub_string_finder.cpp @@ -0,0 +1,78 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +#include +#include +#include +#include //std::max +#include "tbb/parallel_for.h" +#include "tbb/blocked_range.h" + +static const std::size_t N = 23; + +class SubStringFinder { + const std::string &str; + std::vector &max_array; + std::vector &pos_array; +public: + void operator() ( const tbb::blocked_range &r ) const { + for (std::size_t i = r.begin(); i != r.end(); ++i) { + std::size_t max_size = 0, max_pos = 0; + for (std::size_t j = 0; j < str.size(); ++j) { + if (j != i) { + std::size_t limit = str.size()-(std::max)(i,j); + for (std::size_t k = 0; k < limit; ++k) { + if (str[i + k] != str[j + k]) + break; + if (k > max_size) { + max_size = k; + max_pos = j; + } + } + } + } + max_array[i] = max_size; + pos_array[i] = max_pos; + } + } + + SubStringFinder( const std::string &s, std::vector &m, std::vector &p ) : + str(s), max_array(m), pos_array(p) { } +}; + +int main() { + std::string str[N] = { std::string("a"), std::string("b") }; + for (std::size_t i = 2; i < N; ++i) + str[i] = str[i-1]+str[i-2]; + std::string &to_scan = str[N-1]; + const std::size_t num_elem = to_scan.size(); + + std::vector max(num_elem); + std::vector pos(num_elem); + + tbb::parallel_for( tbb::blocked_range( 0, num_elem ), + SubStringFinder( to_scan, max, pos ) ); + + for (std::size_t i = 0; i < num_elem; ++i) + std::cout << " " << max[i] << "(" << pos[i] << ")" << std::endl; + + return 0; +} + diff --git a/xdl/third_party/tbb/examples/GettingStarted/sub_string_finder/sub_string_finder_extended.cpp b/xdl/third_party/tbb/examples/GettingStarted/sub_string_finder/sub_string_finder_extended.cpp new file mode 100644 index 00000000..6f255b04 --- /dev/null +++ b/xdl/third_party/tbb/examples/GettingStarted/sub_string_finder/sub_string_finder_extended.cpp @@ -0,0 +1,166 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +#if __TBB_MIC_OFFLOAD +#pragma offload_attribute (push,target(mic)) +#endif // __TBB_MIC_OFFLOAD + +#include +#include +#include +#include //std::max + +#include "tbb/parallel_for.h" +#include "tbb/blocked_range.h" +#include "tbb/tick_count.h" + +#if __TBB_MIC_OFFLOAD +#pragma offload_attribute (pop) + +class __declspec(target(mic)) SubStringFinder; +#endif // __TBB_MIC_OFFLOAD + +static const std::size_t N = 22; + +void SerialSubStringFinder ( const std::string &str, std::vector &max_array, std::vector &pos_array ) { + for (std::size_t i = 0; i < str.size(); ++i) { + std::size_t max_size = 0, max_pos = 0; + for (std::size_t j = 0; j < str.size(); ++j) + if (j != i) { + std::size_t limit = str.size()-(std::max)(i,j); + for (std::size_t k = 0; k < limit; ++k) { + if (str[i + k] != str[j + k]) + break; + if (k > max_size) { + max_size = k; + max_pos = j; + } + } + } + max_array[i] = max_size; + pos_array[i] = max_pos; + } +} + +class SubStringFinder { + const char *str; + const std::size_t len; + std::size_t *max_array; + std::size_t *pos_array; +public: + void operator() ( const tbb::blocked_range& r ) const { + for (std::size_t i = r.begin(); i != r.end(); ++i) { + std::size_t max_size = 0, max_pos = 0; + for (std::size_t j = 0; j < len; ++j) { + if (j != i) { + std::size_t limit = len-(std::max)(i,j); + for (std::size_t k = 0; k < limit; ++k) { + if (str[i + k] != str[j + k]) + break; + if (k > max_size) { + max_size = k; + max_pos = j; + } + } + } + } + max_array[i] = max_size; + pos_array[i] = max_pos; + } + } + // We do not use std::vector for compatibility with offload execution + SubStringFinder( const char *s, const std::size_t s_len, std::size_t *m, std::size_t *p ) : + str(s), len(s_len), max_array(m), pos_array(p) { } +}; + +int main() { + using namespace tbb; + + std::string str[N] = { std::string("a"), std::string("b") }; + for (std::size_t i = 2; i < N; ++i) + str[i] = str[i-1]+str[i-2]; + std::string &to_scan = str[N-1]; + const std::size_t num_elem = to_scan.size(); + + std::vector max1(num_elem); + std::vector pos1(num_elem); + std::vector max2(num_elem); + std::vector pos2(num_elem); + + std::cout << " Done building string." << std::endl; + + tick_count serial_t0 = tick_count::now(); + SerialSubStringFinder( to_scan, max2, pos2 ); + tick_count serial_t1 = tick_count::now(); + std::cout << " Done with serial version." << std::endl; + + tick_count parallel_t0 = tick_count::now(); + parallel_for(blocked_range(0, num_elem, 100), + SubStringFinder( to_scan.c_str(), num_elem, &max1[0], &pos1[0] ) ); + tick_count parallel_t1 = tick_count::now(); + std::cout << " Done with parallel version." << std::endl; + + for (std::size_t i = 0; i < num_elem; ++i) { + if (max1[i] != max2[i] || pos1[i] != pos2[i]) { + std::cout << "ERROR: Serial and Parallel Results are Different!" << std::endl; + break; + } + } + std::cout << " Done validating results." << std::endl; + + std::cout << "Serial version ran in " << (serial_t1 - serial_t0).seconds() << " seconds" << std::endl + << "Parallel version ran in " << (parallel_t1 - parallel_t0).seconds() << " seconds" << std::endl + << "Resulting in a speedup of " << (serial_t1 - serial_t0).seconds() / (parallel_t1 - parallel_t0).seconds() << std::endl; + +#if __TBB_MIC_OFFLOAD + // Do offloadable version. Do the timing on host. + + std::vector max3(num_elem); + std::vector pos3(num_elem); + + std::size_t *max3_array = &max3[0]; // method data() for vector is not available in C++03 + std::size_t *pos3_array = &pos3[0]; + tick_count parallel_tt0 = tick_count::now(); + const char *to_scan_str = to_scan.c_str(); // Offload the string as a char array. + #pragma offload target(mic) in(num_elem) in(to_scan_str:length(num_elem)) out(max3_array,pos3_array:length(num_elem)) + { + parallel_for(blocked_range(0, num_elem, 100), + SubStringFinder ( to_scan_str, num_elem, max3_array, pos3_array ) ); + } + tick_count parallel_tt1 = tick_count::now(); + std::cout << " Done with offloadable version." << std::endl; + + // Do validation of offloadable results on host. + for (std::size_t i = 0; i < num_elem; ++i) { + if (max1[i] != max3[i] || pos1[i] != pos3[i]) { + std::cout << "ERROR: Serial and Offloadable Results are Different!" << std::endl; + break; + } + } + std::cout << " Done validating offloadable results." << std::endl; + + std::cout << "Offloadable version ran in " << (parallel_tt1 - parallel_tt0).seconds() << " seconds" << std::endl + << "Resulting in a speedup of " << (serial_t1 - serial_t0).seconds() / (parallel_tt1 - parallel_tt0).seconds() + << " of offloadable version" << std::endl; + +#endif // __TBB_MIC_OFFLOAD + + return 0; +} diff --git a/xdl/third_party/tbb/examples/GettingStarted/sub_string_finder/sub_string_finder_pretty.cpp b/xdl/third_party/tbb/examples/GettingStarted/sub_string_finder/sub_string_finder_pretty.cpp new file mode 100644 index 00000000..067d2817 --- /dev/null +++ b/xdl/third_party/tbb/examples/GettingStarted/sub_string_finder/sub_string_finder_pretty.cpp @@ -0,0 +1,98 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +#include +#include +#include +#include +#include //std::max + +#include "tbb/parallel_for.h" +#include "tbb/blocked_range.h" + +static const std::size_t N = 9; + +class SubStringFinder { + const std::string &str; + std::vector &max_array; + std::vector &pos_array; +public: + void operator() ( const tbb::blocked_range& r ) const { + for (std::size_t i = r.begin(); i != r.end(); ++i) { + std::size_t max_size = 0, max_pos = 0; + for (std::size_t j = 0; j < str.size(); ++j) { + if (j != i) { + std::size_t limit = str.size()-(std::max)(i,j); + for (std::size_t k = 0; k < limit; ++k) { + if (str[i + k] != str[j + k]) + break; + if (k+1 > max_size) { + max_size = k+1; + max_pos = j; + } + } + } + } + max_array[i] = max_size; + pos_array[i] = max_pos; + } + } + + SubStringFinder( const std::string &s, std::vector &m, std::vector &p ) : + str(s), max_array(m), pos_array(p) { } +}; + +int main() { + using namespace tbb; + + std::string str[N] = { std::string("a"), std::string("b") }; + for (std::size_t i = 2; i < N; ++i) + str[i] = str[i-1]+str[i-2]; + std::string &to_scan = str[N-1]; + const std::size_t num_elem = to_scan.size(); + std::cout << "String to scan: " << to_scan << std::endl; + + std::vector max( num_elem ); + std::vector pos( num_elem ); + + parallel_for( blocked_range( 0, num_elem, 100 ), + SubStringFinder( to_scan, max, pos ) ); + + for (std::size_t i = 0; i < num_elem; ++i) { + for (std::size_t j = 0; j < num_elem; ++j) { + if (j >= i && j < i + max[i]) + std::cout << "_"; + else + std::cout << " "; + } + std::cout << std::endl << to_scan << std::endl; + + for (std::size_t j = 0; j < num_elem; ++j) { + if (j >= pos[i] && j < pos[i] + max[i]) + std::cout << "*"; + else + std::cout << " "; + } + std::cout << std::endl; + } + + return 0; +} + diff --git a/xdl/third_party/tbb/examples/GettingStarted/sub_string_finder/xcode/sub_string_finder.xcodeproj/project.pbxproj b/xdl/third_party/tbb/examples/GettingStarted/sub_string_finder/xcode/sub_string_finder.xcodeproj/project.pbxproj new file mode 100644 index 00000000..9ff1086c --- /dev/null +++ b/xdl/third_party/tbb/examples/GettingStarted/sub_string_finder/xcode/sub_string_finder.xcodeproj/project.pbxproj @@ -0,0 +1,502 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + A1F593A60B8F042A00073279 /* sub_string_finder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F593A50B8F042A00073279 /* sub_string_finder.cpp */; }; + A1F594270B8F1F8100073279 /* sub_string_finder_extended.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F594260B8F1F8100073279 /* sub_string_finder_extended.cpp */; }; +/* End PBXBuildFile section */ + +/* Begin PBXBuildRule section */ + C3C5894D218B576600DAC94C /* PBXBuildRule */ = { + isa = PBXBuildRule; + compilerSpec = com.intel.compilers.icc.latest; + fileType = sourcecode.cpp; + isEditable = 1; + outputFiles = ( + ); + script = "# Type a script or drag a script file from your workspace to insert its path.\n"; + }; + C3C5894E218B57EA00DAC94C /* PBXBuildRule */ = { + isa = PBXBuildRule; + compilerSpec = com.intel.compilers.icc.latest; + fileType = sourcecode.cpp; + isEditable = 1; + outputFiles = ( + ); + script = "# Type a script or drag a script file from your workspace to insert its path.\n"; + }; + C3C5894F218B581400DAC94C /* PBXBuildRule */ = { + isa = PBXBuildRule; + compilerSpec = com.intel.compilers.icc.latest; + fileType = sourcecode.cpp; + isEditable = 1; + outputFiles = ( + ); + script = "# Type a script or drag a script file from your workspace to insert its path.\n"; + }; +/* End PBXBuildRule section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 8DD76F690486A84900D96B5E /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 12; + dstPath = ""; + dstSubfolderSpec = 16; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A1F594140B8F1E2D00073279 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 16; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A1F5941D0B8F1F2D00073279 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 16; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 8DD76F6C0486A84900D96B5E /* sub_string_finder */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = sub_string_finder; sourceTree = BUILT_PRODUCTS_DIR; }; + A1F593A50B8F042A00073279 /* sub_string_finder.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = sub_string_finder.cpp; path = ../sub_string_finder.cpp; sourceTree = SOURCE_ROOT; }; + A1F5940A0B8F1D8E00073279 /* sub_string_finder_pretty */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = sub_string_finder_pretty; sourceTree = BUILT_PRODUCTS_DIR; }; + A1F594110B8F1E0C00073279 /* sub_string_finder_pretty.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = sub_string_finder_pretty.cpp; path = ../sub_string_finder_pretty.cpp; sourceTree = SOURCE_ROOT; }; + A1F5941B0B8F1F0900073279 /* sub_string_finder_extended */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = sub_string_finder_extended; sourceTree = BUILT_PRODUCTS_DIR; }; + A1F594260B8F1F8100073279 /* sub_string_finder_extended.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = sub_string_finder_extended.cpp; path = ../sub_string_finder_extended.cpp; sourceTree = SOURCE_ROOT; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 8DD76F660486A84900D96B5E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A1F594080B8F1D8E00073279 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A1F594190B8F1F0900073279 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 08FB7794FE84155DC02AAC07 /* sub_string_finder */ = { + isa = PBXGroup; + children = ( + 08FB7795FE84155DC02AAC07 /* Source */, + 1AB674ADFE9D54B511CA2CBB /* Products */, + ); + name = sub_string_finder; + sourceTree = ""; + }; + 08FB7795FE84155DC02AAC07 /* Source */ = { + isa = PBXGroup; + children = ( + A1F594260B8F1F8100073279 /* sub_string_finder_extended.cpp */, + A1F594110B8F1E0C00073279 /* sub_string_finder_pretty.cpp */, + A1F593A50B8F042A00073279 /* sub_string_finder.cpp */, + ); + name = Source; + sourceTree = ""; + }; + 1AB674ADFE9D54B511CA2CBB /* Products */ = { + isa = PBXGroup; + children = ( + 8DD76F6C0486A84900D96B5E /* sub_string_finder */, + A1F5940A0B8F1D8E00073279 /* sub_string_finder_pretty */, + A1F5941B0B8F1F0900073279 /* sub_string_finder_extended */, + ); + name = Products; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 8DD76F620486A84900D96B5E /* sub_string_finder */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "sub_string_finder" */; + buildPhases = ( + 8DD76F640486A84900D96B5E /* Sources */, + 8DD76F660486A84900D96B5E /* Frameworks */, + 8DD76F690486A84900D96B5E /* CopyFiles */, + ); + buildRules = ( + C3C5894F218B581400DAC94C /* PBXBuildRule */, + ); + dependencies = ( + ); + name = sub_string_finder; + productInstallPath = "$(HOME)/bin"; + productName = sub_string_finder; + productReference = 8DD76F6C0486A84900D96B5E /* sub_string_finder */; + productType = "com.apple.product-type.tool"; + }; + A1F594090B8F1D8E00073279 /* sub_string_finder_pretty */ = { + isa = PBXNativeTarget; + buildConfigurationList = A1F5940C0B8F1DB600073279 /* Build configuration list for PBXNativeTarget "sub_string_finder_pretty" */; + buildPhases = ( + A1F594070B8F1D8E00073279 /* Sources */, + A1F594080B8F1D8E00073279 /* Frameworks */, + A1F594140B8F1E2D00073279 /* CopyFiles */, + ); + buildRules = ( + C3C5894E218B57EA00DAC94C /* PBXBuildRule */, + ); + dependencies = ( + ); + name = sub_string_finder_pretty; + productName = sub_string_finder_pretty; + productReference = A1F5940A0B8F1D8E00073279 /* sub_string_finder_pretty */; + productType = "com.apple.product-type.tool"; + }; + A1F5941A0B8F1F0900073279 /* sub_string_finder_extended */ = { + isa = PBXNativeTarget; + buildConfigurationList = A1F5941F0B8F1F4E00073279 /* Build configuration list for PBXNativeTarget "sub_string_finder_extended" */; + buildPhases = ( + A1F594180B8F1F0900073279 /* Sources */, + A1F594190B8F1F0900073279 /* Frameworks */, + A1F5941D0B8F1F2D00073279 /* CopyFiles */, + ); + buildRules = ( + C3C5894D218B576600DAC94C /* PBXBuildRule */, + ); + dependencies = ( + ); + name = sub_string_finder_extended; + productName = sub_string_finder_extended; + productReference = A1F5941B0B8F1F0900073279 /* sub_string_finder_extended */; + productType = "com.apple.product-type.tool"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 08FB7793FE84155DC02AAC07 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1000; + }; + buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "sub_string_finder" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 1; + knownRegions = ( + en, + ); + mainGroup = 08FB7794FE84155DC02AAC07 /* sub_string_finder */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + A1F5941A0B8F1F0900073279 /* sub_string_finder_extended */, + A1F594090B8F1D8E00073279 /* sub_string_finder_pretty */, + 8DD76F620486A84900D96B5E /* sub_string_finder */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + 8DD76F640486A84900D96B5E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + A1F593A60B8F042A00073279 /* sub_string_finder.cpp in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A1F594070B8F1D8E00073279 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A1F594180B8F1F0900073279 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + A1F594270B8F1F8100073279 /* sub_string_finder_extended.cpp in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + A1F593C60B8F0E6E00073279 /* Debug64 */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_VERSION = ""; + HEADER_SEARCH_PATHS = "$(inherited)"; + ICC_CXX_LANG_DIALECT = "c++11"; + INSTALL_PATH = "$(HOME)/bin"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited)"; + LIBRARY_SEARCH_PATHS = "$(inherited)"; + PRODUCT_NAME = sub_string_finder; + ZERO_LINK = NO; + }; + name = Debug64; + }; + A1F593C70B8F0E6E00073279 /* Release64 */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_GENERATE_DEBUGGING_SYMBOLS = NO; + GCC_VERSION = ""; + HEADER_SEARCH_PATHS = "$(inherited)"; + ICC_CXX_LANG_DIALECT = "c++11"; + INSTALL_PATH = "$(HOME)/bin"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited)"; + LIBRARY_SEARCH_PATHS = "$(inherited)"; + PRODUCT_NAME = sub_string_finder; + ZERO_LINK = NO; + }; + name = Release64; + }; + A1F593C80B8F0E6E00073279 /* Debug64 */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_ENABLE_CPP_RTTI = YES; + GCC_MODEL_TUNING = ""; + GCC_NO_COMMON_BLOCKS = YES; + GCC_VERSION = ""; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(TBBROOT)/include", + /opt/intel/tbb/include, + ); + ICC_CXX_LANG_DIALECT = "c++11"; + LD_RUNPATH_SEARCH_PATHS = "$(TBBROOT)/lib /opt/intel/tbb/lib"; + LIBRARY_SEARCH_PATHS = ( + "$(TBBROOT)/lib", + /opt/intel/tbb/lib, + ); + MACOSX_DEPLOYMENT_TARGET = 10.11; + ONLY_ACTIVE_ARCH = YES; + OTHER_CPLUSPLUSFLAGS = ( + "$(OTHER_CFLAGS)", + "-m64", + ); + OTHER_LDFLAGS = ( + "-m64", + "-ltbb_debug", + ); + PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO; + SYMROOT = "/tmp/tbb-$(USER)"; + VALID_ARCHS = x86_64; + }; + name = Debug64; + }; + A1F593C90B8F0E6E00073279 /* Release64 */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_ENABLE_CPP_RTTI = YES; + GCC_MODEL_TUNING = ""; + GCC_NO_COMMON_BLOCKS = YES; + GCC_VERSION = ""; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(TBBROOT)/include", + /opt/intel/tbb/include, + ); + ICC_CXX_LANG_DIALECT = "c++11"; + LD_RUNPATH_SEARCH_PATHS = "$(TBBROOT)/lib /opt/intel/tbb/lib"; + LIBRARY_SEARCH_PATHS = ( + "$(TBBROOT)/lib", + /opt/intel/tbb/lib, + ); + MACOSX_DEPLOYMENT_TARGET = 10.11; + OTHER_CPLUSPLUSFLAGS = ( + "$(OTHER_CFLAGS)", + "-m64", + ); + OTHER_LDFLAGS = ( + "-m64", + "-ltbb", + ); + PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO; + SYMROOT = "/tmp/tbb-$(USER)"; + VALID_ARCHS = x86_64; + }; + name = Release64; + }; + A1F5940E0B8F1DB600073279 /* Debug64 */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_VERSION = ""; + HEADER_SEARCH_PATHS = "$(inherited)"; + ICC_CXX_LANG_DIALECT = "c++11"; + INSTALL_PATH = "$(HOME)/bin"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited)"; + LIBRARY_SEARCH_PATHS = "$(inherited)"; + PRODUCT_NAME = sub_string_finder_pretty; + ZERO_LINK = NO; + }; + name = Debug64; + }; + A1F594100B8F1DB600073279 /* Release64 */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_GENERATE_DEBUGGING_SYMBOLS = NO; + GCC_VERSION = ""; + HEADER_SEARCH_PATHS = "$(inherited)"; + ICC_CXX_LANG_DIALECT = "c++11"; + INSTALL_PATH = "$(HOME)/bin"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited)"; + LIBRARY_SEARCH_PATHS = "$(inherited)"; + PRODUCT_NAME = sub_string_finder_pretty; + ZERO_LINK = NO; + }; + name = Release64; + }; + A1F594210B8F1F4E00073279 /* Debug64 */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_VERSION = ""; + HEADER_SEARCH_PATHS = "$(inherited)"; + ICC_CXX_LANG_DIALECT = "c++11"; + INSTALL_PATH = "$(HOME)/bin"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited)"; + LIBRARY_SEARCH_PATHS = "$(inherited)"; + PRODUCT_NAME = sub_string_finder_extended; + ZERO_LINK = NO; + }; + name = Debug64; + }; + A1F594230B8F1F4E00073279 /* Release64 */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_GENERATE_DEBUGGING_SYMBOLS = NO; + GCC_VERSION = ""; + HEADER_SEARCH_PATHS = "$(inherited)"; + ICC_CXX_LANG_DIALECT = "c++11"; + INSTALL_PATH = "$(HOME)/bin"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited)"; + LIBRARY_SEARCH_PATHS = "$(inherited)"; + PRODUCT_NAME = sub_string_finder_extended; + ZERO_LINK = NO; + }; + name = Release64; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "sub_string_finder" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A1F593C60B8F0E6E00073279 /* Debug64 */, + A1F593C70B8F0E6E00073279 /* Release64 */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug64; + }; + 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "sub_string_finder" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A1F593C80B8F0E6E00073279 /* Debug64 */, + A1F593C90B8F0E6E00073279 /* Release64 */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug64; + }; + A1F5940C0B8F1DB600073279 /* Build configuration list for PBXNativeTarget "sub_string_finder_pretty" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A1F5940E0B8F1DB600073279 /* Debug64 */, + A1F594100B8F1DB600073279 /* Release64 */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug64; + }; + A1F5941F0B8F1F4E00073279 /* Build configuration list for PBXNativeTarget "sub_string_finder_extended" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A1F594210B8F1F4E00073279 /* Debug64 */, + A1F594230B8F1F4E00073279 /* Release64 */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug64; + }; +/* End XCConfigurationList section */ + }; + rootObject = 08FB7793FE84155DC02AAC07 /* Project object */; +} diff --git a/xdl/third_party/tbb/examples/Makefile b/xdl/third_party/tbb/examples/Makefile new file mode 100644 index 00000000..3594be30 --- /dev/null +++ b/xdl/third_party/tbb/examples/Makefile @@ -0,0 +1,159 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +# This file should be always located and called in $(tbb_root)/examples + +# Usage: +# make [all] [clean] [release] [debug] [test] +# executes specified targets for all examples. +# make {example's dir}/{target} +# calls specified example with specified target. +# For instance: make task/tree_sum/all + +tbb_root?=.. +BUILDING_PHASE:=0 +include ../build/common.inc + +#check, if tbb_root is not absolute path (the filter keeps only /* paths) +ifeq ($(filter /% $(SLASH)%, $(subst :, ,$(tbb_root)) ),) + # also changes related variables like work_dir + override tbb_root := $(CWD)$(SLASH).. + export TBBROOT := $(tbb_root) +endif + +override CXXFLAGS += $(CXX_STD_FLAGS) + +# give stdver priotity over autodetection +ifneq (,$(stdver)) + CXX0XFLAGS=-std=$(stdver) +endif +# empty CXX0XFLAGS exported as well, to have control over C++ autodetection +export CXX0XFLAGS + +ifeq ($(tbb_os),windows) + ifeq ($(UNIXMODE),1) + EXAMPLE_MAKEFILE = Makefile + EXAMPLES = $(wildcard */*/$(EXAMPLE_MAKEFILE)) + ifeq ($(compiler),gcc) + override CXXFLAGS += -Wl,--enable-auto-import + endif + export CPATH := $(CPATH);$(tbb_root)/include + export LIBRARY_PATH := $(LIBRARY_PATH);$(work_dir)_release;$(work_dir)_debug + export RM = cmd /C del /Q /F + else + EXAMPLE_MAKEFILE = Makefile.windows + EXAMPLES = $(wildcard */*/$(EXAMPLE_MAKEFILE)) + EXAMPLE_MAKEFILE := $(if $(EXAMPLES),Makefile.windows,Makefile) + export INCLUDE := $(tbb_root)$(SLASH)include;$(INCLUDE) + export LIB := $(work_dir)_release;$(work_dir)_debug;$(LIB) + endif + work_dir := $(subst /,$(SLASH),$(work_dir)) + export PATH := $(work_dir)_release;$(work_dir)_debug;$(PATH) + export TBB_ARCH_PLATFORM = $(arch)\$(runtime) + export TBB_TARGET_ARCH = $(arch) +else + EXAMPLE_MAKEFILE = Makefile + EXAMPLES := $(wildcard */*/$(EXAMPLE_MAKEFILE)) + # platform-specific settings + ifeq ($(arch),ia64) + override CXXFLAGS += $(PIC_KEY) + endif + ifneq ($(filter suncc gcc clang,$(compiler)),) + ifeq ($(compiler),suncc) + override CXXFLAGS += -I$(tbb_root)$(SLASH)include -library=stlport4 -M$(tbb_root)/build/suncc.map.pause -erroff=unassigned,attrskipunsup,badargtype2w,badbinaryopw,wbadasg,wvarhidemem,wbadinit + endif + ifeq ($(arch),intel64) + override CXXFLAGS += -m64 + endif + ifeq ($(arch),ia32) + override CXXFLAGS += -m32 + endif + ifeq ($(arch),ppc64) + override CXXFLAGS += -m64 + endif + ifeq ($(arch),ppc32) + override CXXFLAGS += -m32 + endif + ifeq ($(arch),sparc) + override CXXFLAGS += -mcpu=v9 -m64 + endif + endif + ifeq ($(compiler),xl) + # -qsuppress=1540-0198 suppresses warnings like "1540-0198 (W) The omitted keyword "private" is assumed for base class "no_copy"." + # -qsuppress=1540-1401 suppresses warnings like "1540-1401 (I) An unknown "pragma ivdep" is specified." + override CXXFLAGS += -I$(tbb_root)$(SLASH)include -qsuppress=1540-0198:1540-1401 -L$(work_dir)_release -L$(work_dir)_debug + ifeq ($(arch),intel64) + override CXXFLAGS += -q64 + endif + ifeq ($(arch),ia32) + override CXXFLAGS += -q32 + endif + ifeq ($(arch),ppc64) + override CXXFLAGS += -q64 + endif + ifeq ($(arch),ppc32) + override CXXFLAGS += -q32 + endif + endif + ifeq ($(tbb_os),macos) + export DYLD_LIBRARY_PATH := $(DYLD_LIBRARY_PATH):$(work_dir)_release:$(work_dir)_debug + override CXXFLAGS += -Wl,-rpath,$(work_dir)_release -Wl,-rpath,$(work_dir)_debug + else + export LD_LIBRARY_PATH := $(LD_LIBRARY_PATH):$(work_dir)_release:$(work_dir)_debug + ifeq ($(findstring mic,$(offload) $(target)),mic) + mic_path=$(tbb_build_dir)$(SLASH)$(mic_tbb_build_prefix) + export MIC_LIBRARY_PATH := $(mic_path)_release:$(mic_path)_debug:$(MIC_LIBRARY_PATH) + export MIC_LD_LIBRARY_PATH := $(mic_path)_release:$(mic_path)_debug:$(MIC_LD_LIBRARY_PATH) + else + # -L necessary for non-native compilers which don't search $LIBRARY_PATH + override CXXFLAGS += -L$(work_dir)_release -L$(work_dir)_debug + endif + endif + export LIBS + export LIBRARY_PATH := $(LIBRARY_PATH):$(work_dir)_release:$(work_dir)_debug + export CPATH := $(CPATH):$(tbb_root)/include +endif + +export CXXFLAGS +COMMON_TARGETS := all clean release debug test perf_build perf_run +# list of directories of examples +EXAMPLES_DIRS := $(foreach T,$(EXAMPLES),$(dir $(T))) +# targets to explicitly call example have format: {example's dir}/{example's target} +EXAMPLES_TARGETS := $(foreach T,$(COMMON_TARGETS),$(addsuffix $(T),$(EXAMPLES_DIRS))) + +.PHONY: $(COMMON_TARGETS) $(EXAMPLES_TARGETS) + +.DEFAULT: all + +# execute standard targets for all examples +$(COMMON_TARGETS):: % : $(addsuffix %,$(EXAMPLES_DIRS)) + +# proxy rule for calling appropriate example +$(EXAMPLES_TARGETS):: + @echo ------------------------ $@ ------------------------ + -$(MAKE) -C $(@D) -f $(EXAMPLE_MAKEFILE) $(notdir $@) CXX="$(CPLUS)" $(if $(run_cmd),run_cmd="$(run_cmd)",) $(if $(args),ARGS="$(args)",) $(if $(UI),UI="$(UI)") + +printenv: +ifeq ($(tbb_os),windows) + @cmd /C set PATH + @cmd /C set LIB + @cmd /C set INCLUDE +else + @env | grep PATH +endif + diff --git a/xdl/third_party/tbb/examples/common/copy_libraries.bat b/xdl/third_party/tbb/examples/common/copy_libraries.bat new file mode 100644 index 00000000..87c4a594 --- /dev/null +++ b/xdl/third_party/tbb/examples/common/copy_libraries.bat @@ -0,0 +1,77 @@ +@echo off +REM +REM Copyright (c) 2005-2018 Intel Corporation +REM +REM Licensed under the Apache License, Version 2.0 (the "License"); +REM you may not use this file except in compliance with the License. +REM You may obtain a copy of the License at +REM +REM http://www.apache.org/licenses/LICENSE-2.0 +REM +REM Unless required by applicable law or agreed to in writing, software +REM distributed under the License is distributed on an "AS IS" BASIS, +REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +REM See the License for the specific language governing permissions and +REM limitations under the License. +REM +REM +REM +REM +REM + +:: Getting parameters +if ("%1") == ("") goto error0 +if ("%2") == ("") goto error0 +if ("%3") == ("") goto error0 +set arch=%1 +if ("%2") == ("debug") set postfix=_debug +set output_dir=%3 + +:: Optional 4th parameter to set install root +if ("%4") NEQ ("") set TBBROOT=%4 +:: Actually we can set install root by ourselves +if ("%TBBROOT%") == ("") set TBBROOT=%~d0%~p0..\..\ + +:: Getting vs folders in case vc_mt binaries are not provided +:: ordered from oldest to newest, so we end with newest available version +if ("%VS110COMNTOOLS%") NEQ ("") set vc_dir=vc11 +if ("%VS120COMNTOOLS%") NEQ ("") set vc_dir=vc12 +if ("%VS140COMNTOOLS%") NEQ ("") set vc_dir=vc14 +:: To use Microsoft* Visual Studio* 2017 IDE, make sure the variable VS150COMNTOOLS is set in your IDE instance. +:: If it is not, try running Microsoft Visual Studio 2017 from Microsoft* Developer Command Prompt* for VS 2017. +:: For details, see https://developercommunity.visualstudio.com/content/problem/730/vs154-env-var-vs150comntools-missing-from-build-sy.html +if ("%VS150COMNTOOLS%") NEQ ("") set vc_dir=vc14 + +:: Are we standalone/oss or inside compiler? +if exist "%TBBROOT%\bin\%arch%\%vc_dir%\tbb%postfix%.dll" set interim_path=bin\%arch% +if exist "%TBBROOT%\..\redist\%arch%\tbb\%vc_dir%\tbb%postfix%.dll" set interim_path=..\redist\%arch%\tbb +if ("%interim_path%") == ("") goto error1 + +:: Do we provide vc_mt binaries? +if exist "%TBBROOT%\%interim_path%\vc_mt\tbb%postfix%.dll" set vc_dir=vc_mt +if ("%vc_dir%") == ("") goto error2 + +:: We know everything we wanted and there are no errors +:: Copying binaries + +copy "%TBBROOT%\%interim_path%\%vc_dir%\tbb%postfix%.dll" "%output_dir%" +copy "%TBBROOT%\%interim_path%\%vc_dir%\tbb%postfix%.pdb" "%output_dir%" +copy "%TBBROOT%\%interim_path%\%vc_dir%\tbbmalloc%postfix%.dll" "%output_dir%" +copy "%TBBROOT%\%interim_path%\%vc_dir%\tbbmalloc%postfix%.pdb" "%output_dir%" +if exist "%TBBROOT%\%interim_path%\%vc_dir%\tbb_preview%postfix%.dll" copy "%TBBROOT%\%interim_path%\%vc_dir%\tbb_preview%postfix%.dll" "%output_dir%" +if exist "%TBBROOT%\%interim_path%\%vc_dir%\tbb_preview%postfix%.pdb" copy "%TBBROOT%\%interim_path%\%vc_dir%\tbb_preview%postfix%.pdb" "%output_dir%" + +goto end +:error0 +echo number of parameters not correct +exit /B 1 +:error1 +echo Could not determine path to TBB libraries +exit /B 1 +:error2 +echo Could not determine Visual Studio version +exit /B 1 + +:end +exit /B 0 + diff --git a/xdl/third_party/tbb/examples/common/examples-common.inc b/xdl/third_party/tbb/examples/common/examples-common.inc new file mode 100644 index 00000000..3417a92b --- /dev/null +++ b/xdl/third_party/tbb/examples/common/examples-common.inc @@ -0,0 +1,38 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +# detect if a compiler can support C++11 +# If CXX0XFLAGS already set, do not change it +ifneq (,$(findstring $(CXX), icc icpc clang++)) + # every supported icc or clang is OK + CXX0XFLAGS ?= -std=c++0x +else + ifneq (,$(findstring $(CXX), g++ gcc)) + ifneq (, $(strip $(shell $(CXX) -v 2>&1 | grep "clang-"))) + # This is clang actually, + # every supported clang is OK + CXX0XFLAGS ?= -std=c++0x + else + # support of lambda started GCC 4.5 + ifneq (, $(strip $(shell g++ -dumpversion | egrep "^(4\.[5-9]|[5-9])"))) + CXX0XFLAGS ?= -std=c++0x + endif + endif + endif +endif + diff --git a/xdl/third_party/tbb/examples/common/gui/Makefile.gmake b/xdl/third_party/tbb/examples/common/gui/Makefile.gmake new file mode 100644 index 00000000..c4aeb826 --- /dev/null +++ b/xdl/third_party/tbb/examples/common/gui/Makefile.gmake @@ -0,0 +1,90 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +# The C++ compiler +#CXX=g++ + +# detecting MS Windows (for MinGW support) +ifeq ($(OS), Windows_NT) +RM = cmd /C del /Q /F +RD = cmd /C rmdir +UI = con +EXE = $(NAME)$(SUFFIX).exe + +else +RM = rm -f +RD = rmdir -r + +# detecting 64-bit platform +arch ?= $(shell uname -m) +# Possible values of interest: intel64 x86_64 amd64 ia64 ppc64 sparc sparc64 +x64 ?= $(findstring 64,$(subst sparc,sparc64,$(arch))) + +# see https://wiki.debian.org/Multiarch/Tuples +MULTIARCH = $(arch) +ifeq ($(arch),ia32) +MULTIARCH = i386 +endif +ifeq ($(arch),intel64) +MULTIARCH = x86_64 +endif +ifeq ($(arch),ppc32) +MULTIARCH = powerpc +endif +ifeq ($(arch),sparc) +MULTIARCH = sparc64 +endif +MULTIARCHTUPLE ?= $(MULTIARCH)-linux-gnu + +# detecting UI ("mac", "x" or "con") +ifeq ($(shell uname),Darwin) + UI ?= mac +else + UI ?= $(shell sh -c "[ -f /usr/X11R6/lib$(x64)/libX11.so -o -f /usr/lib$(x64)/libX11.so -o -f /usr/lib/$(MULTIARCHTUPLE)/libX11.so ] && echo x") +endif + +ifeq ($(UI),x) + EXE = $(NAME)$(SUFFIX) + UI_CXXFLAGS += -I/usr/X11R6/include + LIBS += -lpthread -L/usr/X11R6/lib$(x64) -lX11 + # detect if libXext can be found + ifeq ($(shell sh -c "[ -f /usr/X11R6/lib$(x64)/libXext.so -o -f /usr/lib$(x64)/libXext.so -o -f /usr/lib/$(MULTIARCHTUPLE)/libXext.so ] && echo 0"),0) + LIBS += -lXext + else # no libXext + UI_CXXFLAGS += -DX_NOSHMEM + endif # libXext + +else # ! X + ifeq ($(UI),mac) + CXX_UI?=g++ + LIBS += -framework OpenGL -framework Foundation -framework Cocoa + MACUISOURCES = ../../common/gui/xcode/tbbExample/OpenGLView.m ../../common/gui/xcode/tbbExample/main.m ../../common/gui/xcode/tbbExample/tbbAppDelegate.m + MACUIOBJS = OpenGLView.o main.o tbbAppDelegate.o + APPRES = $(NAME)$(SUFFIX).app/Contents/Resources + EXE = $(NAME)$(SUFFIX).app/Contents/MacOS/$(NAME)$(SUFFIX) + + else # ! macOS* + + EXE = $(NAME)$(SUFFIX) + ifeq (,$(strip $(UI))) + UI = con + $(warning Note: no graphics output capability detected, building for console output.) + endif + endif # macOS +endif # X +endif # Windows vs. other diff --git a/xdl/third_party/tbb/examples/common/gui/Makefile.win b/xdl/third_party/tbb/examples/common/gui/Makefile.win new file mode 100644 index 00000000..fb0e4a64 --- /dev/null +++ b/xdl/third_party/tbb/examples/common/gui/Makefile.win @@ -0,0 +1,74 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +# Per-build Makefile rules (for recursive $(MAKE) calls from Makefile) + +# Base compile/link options +MYCXXFLAGS = /nologo /EHsc /Zc:forScope /D WIN32 /D _MBCS /D _CRT_SECURE_NO_DEPRECATE /MP $(CXXFLAGS) +MYLFLAGS = /link /incremental:no /fixed:no $(LFLAGS) +CXXFLAGS_NDEBUG = /MD /O2 /Ot /Gy /D NDEBUG +CXXFLAGS_DEBUG = /MDd /Od /Zi /D _DEBUG + +# Specify library directory for Direct X SDK +DDLIB_DIR=$(DXSDK_DIR)\lib\$(XARCH:AMD64=x64) + +# Input and output files +#SOURCE = v +#RCNAME = specified externaly +#EXE = ^ +# defaults on XARCH = x86 +UISRC = ../../common/gui/$(UI)video.cpp + +default: + +build_echo: + -@echo Building$(DEBUG) $(EXE) with UI=$(UI) XARCH=$(XARCH) + +build_one: build_echo build_$(UI)$(DEBUG) + +build_con: $(SOURCE) $(UISRC) compiler_check + $(CXX) $(CXXFLAGS_NDEBUG) $(MYCXXFLAGS) $(SOURCE) $(UISRC) $(MYLFLAGS) /subsystem:console /OUT:$(EXE) + @cmd.exe /C del *.obj + +build_con_debug: $(SOURCE) $(UISRC) compiler_check + $(CXX) $(CXXFLAGS_DEBUG) $(MYCXXFLAGS) $(SOURCE) $(UISRC) $(MYLFLAGS) /debug /subsystem:console /OUT:$(EXE) + @cmd.exe /C del *.obj + +build_gdi: $(SOURCE) $(UISRC) msvs/$(RCNAME).res compiler_check + $(CXX) $(CXXFLAGS_NDEBUG) /D _WINDOWS $(MYCXXFLAGS) $(SOURCE) $(UISRC) $(MYLFLAGS) msvs/$(RCNAME).res /subsystem:windows /machine:$(XARCH) /OUT:$(EXE) + @cmd.exe /C del *.obj + +build_gdi_debug: $(SOURCE) $(UISRC) msvs/$(RCNAME).res compiler_check + $(CXX) $(CXXFLAGS_DEBUG) /D _WINDOWS $(MYCXXFLAGS) $(SOURCE) $(UISRC) $(MYLFLAGS) msvs/$(RCNAME).res /debug /subsystem:windows /machine:$(XARCH) /OUT:$(EXE) + @cmd.exe /C del *.obj + +build_d2d: $(SOURCE) $(UISRC) msvs/$(RCNAME).res compiler_check + -@echo Using DirectX SDK from "$(DDLIB_DIR)" + $(CXX) $(CXXFLAGS_NDEBUG) /D _WINDOWS $(MYCXXFLAGS) /I "$(DXSDK_DIR)\include" $(SOURCE) $(UISRC) $(MYLFLAGS) /LIBPATH:"$(DDLIB_DIR)" msvs/$(RCNAME).res /subsystem:windows /machine:$(XARCH) /OUT:$(EXE) + @cmd.exe /C del *.obj + +build_d2d_debug: $(SOURCE) $(UISRC) msvs/$(RCNAME).res compiler_check + -@echo Using DirectX SDK from "$(DDLIB_DIR)" + $(CXX) $(CXXFLAGS_DEBUG) /D _WINDOWS $(MYCXXFLAGS) /I "$(DXSDK_DIR)\include" $(SOURCE) $(UISRC) $(MYLFLAGS) /LIBPATH:"$(DDLIB_DIR)" msvs/$(RCNAME).res /debug /subsystem:windows /machine:$(XARCH) /OUT:$(EXE) + @cmd.exe /C del *.obj + +msvs/$(RCNAME).res: + rc /r msvs/$(RCNAME) +compiler_check: + @echo compiler_test>compiler_test && @$(CXX) /E compiler_test >nul 2>&1 || echo "$(CXX) command not found. Check if CXX=$(CXX) is set properly" + @cmd.exe /C del compiler_test diff --git a/xdl/third_party/tbb/examples/common/gui/convideo.cpp b/xdl/third_party/tbb/examples/common/gui/convideo.cpp new file mode 100644 index 00000000..18d10968 --- /dev/null +++ b/xdl/third_party/tbb/examples/common/gui/convideo.cpp @@ -0,0 +1,136 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +#include "video.h" +#include +#include + +unsigned int * g_pImg = 0; +int g_sizex, g_sizey; +static video *g_video = 0; +static int g_fps = 0; + +#if _WIN32 || _WIN64 + +static DWORD g_msec = 0; + +#ifdef _WINDOWS +HINSTANCE video::win_hInstance = 0; +int video::win_iCmdShow = 0; +void video::win_set_class(WNDCLASSEX &wcex) { } +void video::win_load_accelerators(int idc) { } +#endif //_WINDOWS + +#else +#include +#include +struct timeval g_time; +#endif //_WIN32||_WIN64 + +#define CALC_FPS_ENABLED ((WINAPI_FAMILY != WINAPI_FAMILY_APP) && (!__ANDROID__)) + +video::video() + // OpenGL* RGBA byte order for little-endian CPU + : depth(24), red_shift(0), green_shift(8), blue_shift(16), + red_mask(0xff), green_mask(0xff00), blue_mask(0xff0000) +{ + assert(g_video == 0); + g_video = this; title = "Video"; updating = calc_fps = false; +} + +bool video::init_window(int x, int y) +{ + g_sizex = x; g_sizey = y; + g_pImg = new unsigned int[x*y]; + running = true; + return false; +} + +bool video::init_console() +{ + running = true; + return true; +} + +void video::terminate() +{ +#if CALC_FPS_ENABLED + if(calc_fps) { + double fps = g_fps; +#if _WIN32 || _WIN64 + fps /= (GetTickCount()-g_msec)/1000.0; +#else + struct timezone tz; struct timeval end_time; gettimeofday(&end_time, &tz); + fps /= (end_time.tv_sec+1.0*end_time.tv_usec/1000000.0) - (g_time.tv_sec+1.0*g_time.tv_usec/1000000.0); +#endif + printf("%s: %.1f fps\n", title, fps); + } +#endif + g_video = 0; running = false; + if(g_pImg) { delete[] g_pImg; g_pImg = 0; } +} + +video::~video() +{ + if(g_video) terminate(); +} + +//! Count and display FPS count in titlebar +bool video::next_frame() +{ +#if CALC_FPS_ENABLED + if(calc_fps){ + if(!g_fps) { +#if _WIN32 || _WIN64 + g_msec = GetTickCount(); +#else + struct timezone tz; gettimeofday(&g_time, &tz); +#endif + } + g_fps++; + } +#endif + return running; +} + +//! Do standard loop +void video::main_loop() +{ + on_process(); +} + +//! Change window title +void video::show_title() +{ +} + +///////////////////////////////////////////// public methods of video class /////////////////////// + +drawing_area::drawing_area(int x, int y, int sizex, int sizey) + : base_index(y*g_sizex + x), max_index(g_sizex*g_sizey), index_stride(g_sizex), + pixel_depth(24), ptr32(g_pImg), start_x(x), start_y(y), size_x(sizex), size_y(sizey) +{ + assert(x < g_sizex); assert(y < g_sizey); + assert(x+sizex <= g_sizex); assert(y+sizey <= g_sizey); + + index = base_index; // current index +} + +void drawing_area::update() {} diff --git a/xdl/third_party/tbb/examples/common/gui/d2dvideo.cpp b/xdl/third_party/tbb/examples/common/gui/d2dvideo.cpp new file mode 100644 index 00000000..0ca77664 --- /dev/null +++ b/xdl/third_party/tbb/examples/common/gui/d2dvideo.cpp @@ -0,0 +1,201 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +// common Windows parts +#include "winvideo.h" + +// and another headers +#include +#include +#include +#if _DXSDK_PRODUCT_MAJOR < 9 +#error DXSDK Version 9 and above required. +#endif +#include +#include +#pragma comment(lib, "d2d1.lib") + +ID2D1Factory *m_pD2DFactory; +ID2D1HwndRenderTarget *m_pRenderTarget; +ID2D1Bitmap *m_pBitmap; +D2D1_SIZE_U bitmapSize; + +HANDLE g_hVSync; + +#include +#pragma comment(lib, "DxErr.lib") + +//! Create a dialog box and tell the user what went wrong +bool DisplayError(LPSTR lpstrErr, HRESULT hres) +{ + if(hres != S_OK){ + static bool InError = false; + int retval = 0; + if (!InError) + { + InError = true; + const char *message = hres?DXGetErrorString(hres):0; + retval = MessageBoxA(g_hAppWnd, lpstrErr, hres?message:"Error!", MB_OK|MB_ICONERROR); + InError = false; + } + } + return false; +} + +void DrawBitmap() +{ + HRESULT hr = S_OK; + if (m_pRenderTarget) { + m_pRenderTarget->BeginDraw(); + if (m_pBitmap) + hr = m_pBitmap->CopyFromMemory(NULL,(BYTE*)g_pImg, 4*g_sizex); + DisplayError( "DrawBitmap error", hr ); + m_pRenderTarget->DrawBitmap(m_pBitmap); + m_pRenderTarget->EndDraw(); + } + return; +} + +inline void mouse(int k, LPARAM lParam) +{ + int x = (int)LOWORD(lParam); + int y = (int)HIWORD(lParam); + RECT rc; + GetClientRect(g_hAppWnd, &rc); + g_video->on_mouse( x*g_sizex/(rc.right - rc.left), y*g_sizey/(rc.bottom - rc.top), k ); +} + +//! Win event processing function +LRESULT CALLBACK InternalWndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) +{ + switch (iMsg) + { + case WM_MOVE: + // Check to make sure our window exists before we tell it to repaint. + // This will fail the first time (while the window is being created). + if (hwnd) { + InvalidateRect(hwnd, NULL, FALSE); + UpdateWindow(hwnd); + } + return 0L; + + case WM_SIZE: + case WM_PAINT: + if( g_video->running && g_video->updating ) { + DrawBitmap(); + Sleep(0); + } + break; + // Process all mouse and keyboard events + case WM_LBUTTONDOWN: mouse( 1, lParam ); break; + case WM_LBUTTONUP: mouse(-1, lParam ); break; + case WM_RBUTTONDOWN: mouse( 2, lParam ); break; + case WM_RBUTTONUP: mouse(-2, lParam ); break; + case WM_MBUTTONDOWN: mouse( 3, lParam ); break; + case WM_MBUTTONUP: mouse(-3, lParam ); break; + case WM_CHAR: g_video->on_key( (int)wParam); break; + + // some useless stuff + case WM_ERASEBKGND: return 1; // keeps erase-background events from happening, reduces chop + case WM_DISPLAYCHANGE: return 0; + + // Now, shut down the window... + case WM_DESTROY: PostQuitMessage(0); return 0; + } + // call user defined proc, if exists + return g_pUserProc? g_pUserProc(hwnd, iMsg, wParam, lParam) : DefWindowProc(hwnd, iMsg, wParam, lParam); +} + +bool video::init_window(int sizex, int sizey) +{ + assert(win_hInstance != 0); + g_sizex = sizex; g_sizey = sizey; + if (!WinInit(win_hInstance, win_iCmdShow, gWndClass, title, false)) { + DisplayError("Unable to initialize the program's window."); + return false; + } + ShowWindow(g_hAppWnd, SW_SHOW); + g_pImg = new unsigned int[sizex*sizey]; + + HRESULT hr = S_OK; + + hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &m_pD2DFactory); + // Create a Direct2D render target. + if (SUCCEEDED(hr) && !m_pRenderTarget){ + RECT rc; + GetClientRect(g_hAppWnd, &rc); + + bitmapSize = D2D1::SizeU( + rc.right - rc.left, + rc.bottom - rc.top + ); + + hr = m_pD2DFactory->CreateHwndRenderTarget( + D2D1::RenderTargetProperties(), + D2D1::HwndRenderTargetProperties(g_hAppWnd, bitmapSize), + &m_pRenderTarget + ); + if (SUCCEEDED(hr) && !m_pBitmap){ + D2D1_PIXEL_FORMAT pixelFormat = D2D1::PixelFormat( + DXGI_FORMAT_B8G8R8A8_UNORM, + D2D1_ALPHA_MODE_IGNORE + ); + D2D1_BITMAP_PROPERTIES bitmapProperties; + bitmapProperties.pixelFormat = pixelFormat; + m_pRenderTarget->GetDpi( &bitmapProperties.dpiX, &bitmapProperties.dpiY ); + m_pRenderTarget->CreateBitmap(bitmapSize,bitmapProperties,&m_pBitmap); + m_pRenderTarget->DrawBitmap(m_pBitmap); + } + } + + running = true; + return true; +} + +void video::terminate() +{ + if (m_pBitmap) m_pBitmap->Release(); + if (m_pRenderTarget) m_pRenderTarget->Release(); + if (m_pD2DFactory) m_pD2DFactory->Release(); + g_video = 0; running = false; + if(g_pImg) { delete[] g_pImg; g_pImg = 0; } +} + +//////////// drawing area constructor & destructor ///////////// + +drawing_area::drawing_area(int x, int y, int sizex, int sizey) + : base_index(y*g_sizex + x), max_index(g_sizex*g_sizey), index_stride(g_sizex), + pixel_depth(24), ptr32(g_pImg), start_x(x), start_y(y), size_x(sizex), size_y(sizey) +{ + assert(x < g_sizex); assert(y < g_sizey); + assert(x+sizex <= g_sizex); assert(y+sizey <= g_sizey); + + index = base_index; // current index +} + +void drawing_area::update() +{ + if(g_video->updating) { + RECT r; + r.left = start_x; r.right = start_x + size_x; + r.top = start_y; r.bottom = start_y + size_y; + InvalidateRect(g_hAppWnd, &r, false); + } +} diff --git a/xdl/third_party/tbb/examples/common/gui/dxcheck.bat b/xdl/third_party/tbb/examples/common/gui/dxcheck.bat new file mode 100644 index 00000000..281bc6f6 --- /dev/null +++ b/xdl/third_party/tbb/examples/common/gui/dxcheck.bat @@ -0,0 +1,28 @@ +@echo off +REM +REM Copyright (c) 2005-2018 Intel Corporation +REM +REM Licensed under the Apache License, Version 2.0 (the "License"); +REM you may not use this file except in compliance with the License. +REM You may obtain a copy of the License at +REM +REM http://www.apache.org/licenses/LICENSE-2.0 +REM +REM Unless required by applicable law or agreed to in writing, software +REM distributed under the License is distributed on an "AS IS" BASIS, +REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +REM See the License for the specific language governing permissions and +REM limitations under the License. +REM +REM +REM +REM +REM +if "%DXSDK_DIR%"=="" goto error_no_DXSDK +goto end + +:error_no_DXSDK +echo DirectX SDK Check : error : This example requires the DirectX SDK. Either (re)-install the DirectX SDK, or set the DXSDK_DIR environment variable to indicate where it is installed. + +:end + diff --git a/xdl/third_party/tbb/examples/common/gui/gdivideo.cpp b/xdl/third_party/tbb/examples/common/gui/gdivideo.cpp new file mode 100644 index 00000000..3e401761 --- /dev/null +++ b/xdl/third_party/tbb/examples/common/gui/gdivideo.cpp @@ -0,0 +1,146 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +// common Windows parts +#include "winvideo.h" +// include GDI+ headers +#include +// and another headers +#include + +// tag linking library +#pragma comment(lib, "gdiplus.lib") + +// global specific variables +Gdiplus::Bitmap * g_pBitmap; // main drawing bitmap +ULONG_PTR gdiplusToken; +Gdiplus::GdiplusStartupInput gdiplusStartupInput;// GDI+ + +//! display system error +bool DisplayError(LPSTR lpstrErr, HRESULT hres) +{ + static bool InError = false; + int retval = 0; + if (!InError) + { + InError = true; + LPCSTR lpMsgBuf; + if(!hres) hres = GetLastError(); + FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, hres, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL ); + retval = MessageBox(g_hAppWnd, lpstrErr, lpMsgBuf, MB_OK|MB_ICONERROR); + LocalFree( (HLOCAL)lpMsgBuf ); + InError = false; + } + return false; +} + +//! Win event processing function +LRESULT CALLBACK InternalWndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) +{ + switch (iMsg) + { + case WM_MOVE: + // Check to make sure our window exists before we tell it to repaint. + // This will fail the first time (while the window is being created). + if (hwnd) { + InvalidateRect(hwnd, NULL, FALSE); + UpdateWindow(hwnd); + } + return 0L; + + case WM_PAINT: + { + PAINTSTRUCT ps; + Gdiplus::Graphics graphics( BeginPaint(hwnd, &ps) ); + // redraw just requested area. This call is as fast as simple DrawImage() call. + if(g_video->updating) graphics.DrawImage(g_pBitmap, ps.rcPaint.left, ps.rcPaint.top, ps.rcPaint.left, ps.rcPaint.top, + ps.rcPaint.right, ps.rcPaint.bottom, Gdiplus::UnitPixel); + EndPaint(hwnd, &ps); + } + return 0L; + + // Process all mouse and keyboard events + case WM_LBUTTONDOWN: g_video->on_mouse( (int)LOWORD(lParam), (int)HIWORD(lParam), 1); break; + case WM_LBUTTONUP: g_video->on_mouse( (int)LOWORD(lParam), (int)HIWORD(lParam), -1); break; + case WM_RBUTTONDOWN: g_video->on_mouse( (int)LOWORD(lParam), (int)HIWORD(lParam), 2); break; + case WM_RBUTTONUP: g_video->on_mouse( (int)LOWORD(lParam), (int)HIWORD(lParam), -2); break; + case WM_MBUTTONDOWN: g_video->on_mouse( (int)LOWORD(lParam), (int)HIWORD(lParam), 3); break; + case WM_MBUTTONUP: g_video->on_mouse( (int)LOWORD(lParam), (int)HIWORD(lParam), -3); break; + case WM_CHAR: g_video->on_key( (int)wParam); break; + + // some useless stuff + case WM_ERASEBKGND: return 1; // keeps erase-background events from happening, reduces chop + case WM_DISPLAYCHANGE: return 0; + + // Now, shut down the window... + case WM_DESTROY: PostQuitMessage(0); return 0; + } + // call user defined proc, if exists + return g_pUserProc? g_pUserProc(hwnd, iMsg, wParam, lParam) : DefWindowProc(hwnd, iMsg, wParam, lParam); +} + +///////////// video functions //////////////// + +bool video::init_window(int sizex, int sizey) +{ + assert(win_hInstance != 0); + g_sizex = sizex; g_sizey = sizey; + if (!WinInit(win_hInstance, win_iCmdShow, gWndClass, title, true)) { + DisplayError("Unable to initialize the program's window."); + return false; + } + ShowWindow(g_hAppWnd, SW_SHOW); + Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); + g_pImg = new unsigned int[sizex*sizey]; + g_pBitmap = new Gdiplus::Bitmap(g_sizex, g_sizey, 4*g_sizex, PixelFormat32bppRGB, (BYTE*)g_pImg ); + running = true; + return true; +} + +void video::terminate() +{ + if(g_pBitmap) { delete g_pBitmap; g_pBitmap = 0; } + Gdiplus::GdiplusShutdown(gdiplusToken); + g_video = 0; running = false; + if(g_pImg) { delete[] g_pImg; g_pImg = 0; } +} + +//////////// drawing area constructor & destructor ///////////// + +drawing_area::drawing_area(int x, int y, int sizex, int sizey) + : base_index(y*g_sizex + x), max_index(g_sizex*g_sizey), index_stride(g_sizex), + pixel_depth(24), ptr32(g_pImg), start_x(x), start_y(y), size_x(sizex), size_y(sizey) +{ + assert(x < g_sizex); assert(y < g_sizey); + assert(x+sizex <= g_sizex); assert(y+sizey <= g_sizey); + + index = base_index; // current index +} + +void drawing_area::update() +{ + if(g_video->updating) { + RECT r; + r.left = start_x; r.right = start_x + size_x; + r.top = start_y; r.bottom = start_y + size_y; + InvalidateRect(g_hAppWnd, &r, false); + } +} diff --git a/xdl/third_party/tbb/examples/common/gui/macvideo.cpp b/xdl/third_party/tbb/examples/common/gui/macvideo.cpp new file mode 100644 index 00000000..a35ccb7f --- /dev/null +++ b/xdl/third_party/tbb/examples/common/gui/macvideo.cpp @@ -0,0 +1,164 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +#include "video.h" +#include +#include +#include +#include + +unsigned int* g_pImg = 0; +int g_sizex=0, g_sizey=0; +static video *g_video = 0; +static int g_fps = 0; +char *window_title=NULL; +#define WINDOW_TITLE_SIZE 256 +int cocoa_update=0; + +#include +#include +struct timeval g_time; + +video::video() +#if __TBB_IOS + : depth(24), red_shift(0), green_shift(8), blue_shift(16), + red_mask(0xff), green_mask(0xff00), blue_mask(0xff0000) +#else + : depth(24), red_shift(16), green_shift(8), blue_shift(0), + red_mask(0xff0000), green_mask(0xff00), blue_mask(0xff) +#endif +{ + assert(g_video == 0); + g_video = this; title = "Video"; cocoa_update=1; updating = true; calc_fps = false; +} + +bool video::init_window(int x, int y) +{ + g_sizex = x; g_sizey = y; + g_pImg = new unsigned int[x*y]; + if( window_title==NULL ) + window_title = (char*)malloc(WINDOW_TITLE_SIZE); + strncpy( window_title, title, WINDOW_TITLE_SIZE-1 ); + running = true; + return true; +} + +bool video::init_console() +{ + running = true; + return true; +} + +void video::terminate() +{ + if(calc_fps) { + double fps = g_fps; + struct timezone tz; struct timeval end_time; gettimeofday(&end_time, &tz); + fps /= (end_time.tv_sec+1.0*end_time.tv_usec/1000000.0) - (g_time.tv_sec+1.0*g_time.tv_usec/1000000.0); + printf("%s: %.1f fps\n", title, fps); + } + g_video = 0; running = false; + if(g_pImg) { delete[] g_pImg; g_pImg = 0; } +} + +video::~video() +{ + if(g_video) terminate(); +} + +//! Count and display FPS count in titlebar +bool video::next_frame() +{ + if(calc_fps){ + if(!g_fps) { + struct timezone tz; gettimeofday(&g_time, &tz); + } + g_fps++; + } + struct timezone tz; struct timeval now_time; gettimeofday(&now_time, &tz); + double sec=((now_time.tv_sec+1.0*now_time.tv_usec/1000000.0) - (g_time.tv_sec+1.0*g_time.tv_usec/1000000.0)); + if( sec>1 ){ + if(calc_fps) { + memcpy(&g_time, &now_time, sizeof(g_time)); + int fps; + fps = g_fps/sec; + cocoa_update = (int)updating; + snprintf(window_title,WINDOW_TITLE_SIZE, "%s%s: %d fps", title, updating?"":" (no updating)", int(fps)); + g_fps=0; + } + } + return running; +} + + +void* thread_func(void*) +{ + g_video->on_process(); + exit(EXIT_SUCCESS); +} + +extern "C" void on_mouse_func(int x, int y, int k) +{ + g_video->on_mouse(x, y, k); + return; +} + +extern "C" void on_key_func(int x) +{ + g_video->on_key(x); + return; +} + +extern "C" int cocoa_main( int argc, char *argv[] ); +//! Do standard loop +void video::main_loop() +{ + pthread_t handle; + pthread_attr_t attr; + pthread_attr_init(&attr); + pthread_create(&handle,&attr,&thread_func,(void*)NULL); + pthread_detach(handle); + cocoa_main( 0, NULL ); +} + +//! Change window title +void video::show_title() +{ + if(title) + strncpy( window_title, title, WINDOW_TITLE_SIZE ); + return; +} + +///////////////////////////////////////////// public methods of video class /////////////////////// + +drawing_area::drawing_area(int x, int y, int sizex, int sizey) + : base_index(y*g_sizex + x), max_index(g_sizex*g_sizey), index_stride(g_sizex), + pixel_depth(24), ptr32(g_pImg), start_x(x), start_y(y), size_x(sizex), size_y(sizey) +{ + assert(x < g_sizex); assert(y < g_sizey); + assert(x+sizex <= g_sizex); assert(y+sizey <= g_sizey); + + index = base_index; // current index +} + +void drawing_area::update() +{ + //nothing to do, updating via timer in cocoa part. +} diff --git a/xdl/third_party/tbb/examples/common/gui/video.h b/xdl/third_party/tbb/examples/common/gui/video.h new file mode 100644 index 00000000..db347e03 --- /dev/null +++ b/xdl/third_party/tbb/examples/common/gui/video.h @@ -0,0 +1,241 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +#ifndef __VIDEO_H__ +#define __VIDEO_H__ + +#include +#if _MSC_VER +#include // for uintptr_t +#else +#include // for uintptr_t +#endif +#if _WIN32 || _WIN64 +#include +#else +#include +#endif + +typedef unsigned int color_t; +typedef unsigned char colorcomp_t; +typedef signed char depth_t; + +//! Class for getting access to drawing memory +class drawing_memory +{ +#ifdef __TBB_MIC_OFFLOAD + // The address is kept as uintptr_t since + // the compiler could not offload a pointer +#endif + uintptr_t my_address; +public: + depth_t pixel_depth; + int sizex, sizey; + //! Get drawing memory + inline char* get_address() const { return reinterpret_cast(my_address); } + //! Get drawing memory size + inline int get_size() const { return ((pixel_depth>16) ? 4:2) * sizex * sizey; } + //! Set drawing memory + inline void set_address(char *mem) { my_address = reinterpret_cast(mem); } + + friend class drawing_area; + friend class video; +}; + +//! Simple proxy class for managing of different video systems +class video +{ + //! colorspace information + depth_t depth, red_shift, green_shift, blue_shift; + color_t red_mask, green_mask, blue_mask; + friend class drawing_area; + +public: + //! Constructor + video(); + //! Destructor + ~video(); + //! member to set window name + const char *title; + //! true is enable to show fps + bool calc_fps; + //! if true: on windows fork processing thread for on_process(), on non-windows note that next_frame() is called concurrently. + bool threaded; + //! true while running within main_loop() + bool running; + //! if true, do gui updating + bool updating; + //! initialize graphical video system + bool init_window(int sizex, int sizey); + //! initialize console. returns true if console is available + bool init_console(); + //! terminate video system + void terminate(); + //! Do standard event & processing loop. Use threaded = true to separate event/updating loop from frame processing + void main_loop(); + //! Process next frame + bool next_frame(); + //! Change window title + void show_title(); + //! translate RGB components into packed type + inline color_t get_color(colorcomp_t red, colorcomp_t green, colorcomp_t blue) const; + //! Get drawing memory descriptor + inline drawing_memory get_drawing_memory() const; + + //! code of the ESCape key + static const int esc_key = 27; + //! Mouse events handler. + virtual void on_mouse(int x, int y, int key) { } + //! Mouse events handler. + virtual void on_key(int key) { } + //! Main processing loop. Redefine with your own + virtual void on_process() { while(next_frame()); } + +#ifdef _WINDOWS + //! Windows specific members + //! if VIDEO_WINMAIN isn't defined then set this just before init() by arguments of WinMain + static HINSTANCE win_hInstance; static int win_iCmdShow; + //! optionally call it just before init() to set own. Use ascii strings convention + void win_set_class(WNDCLASSEX &); + //! load and set accelerator table from resources + void win_load_accelerators(int idc); +#endif +}; + +//! Drawing class +class drawing_area +{ + const size_t base_index, max_index, index_stride; + const depth_t pixel_depth; + unsigned int * const ptr32; + size_t index; +public: + const int start_x, start_y, size_x, size_y; + //! constructors + drawing_area(int x, int y, int sizex, int sizey); + inline drawing_area(int x, int y, int sizex, int sizey, const drawing_memory &dmem); + //! destructor + inline ~drawing_area(); + //! update the image + void update(); + //! set current position. local_x could be bigger then size_x + inline void set_pos(int local_x, int local_y); + //! put pixel in current position with incremental address calculating to next right pixel + inline void put_pixel(color_t color); + //! draw pixel at position by packed color + void set_pixel(int localx, int localy, color_t color) + { set_pos(localx, localy); put_pixel(color); } +}; + +extern int g_sizex; +extern int g_sizey; +extern unsigned int *g_pImg; + +inline drawing_memory video::get_drawing_memory() const +{ + drawing_memory dmem; + dmem.pixel_depth = depth; + dmem.my_address = reinterpret_cast(g_pImg); + dmem.sizex = g_sizex; + dmem.sizey = g_sizey; + return dmem; +} + +inline color_t video::get_color(colorcomp_t red, colorcomp_t green, colorcomp_t blue) const +{ + if(red_shift == 16) // only for depth == 24 && red_shift > blue_shift + return (red<<16) | (green<<8) | blue; + else if(depth >= 24) + return +#if __ANDROID__ + // Setting Alpha to 0xFF + 0xFF000000 | +#endif + (red< 0) { + depth_t bs = blue_shift, rs = red_shift; + if(blue_shift < 0) blue >>= -bs, bs = 0; + else /*red_shift < 0*/ red >>= -rs, rs = 0; + return ((red<2^16 + u = (2048 + (blue << 3) - (y >> 5)) >> 4; // (limit->2^12)>>4 + v = (2048 + (red << 3) - (y >> 5)) >> 4; + y = y >> 8; + return u | (y << 8) | (v << 16) | (y << 24); + } +} + +inline drawing_area::drawing_area(int x, int y, int sizex, int sizey, const drawing_memory &dmem) + : base_index(y*dmem.sizex + x), max_index(dmem.sizex*dmem.sizey), index_stride(dmem.sizex), + pixel_depth(dmem.pixel_depth), ptr32(reinterpret_cast(dmem.my_address)), + start_x(x), start_y(y), size_x(sizex), size_y(sizey) +{ + assert(x < dmem.sizex); assert(y < dmem.sizey); + assert(x+sizex <= dmem.sizex); assert(y+sizey <= dmem.sizey); + + index = base_index; // current index +} + +inline void drawing_area::set_pos(int local_x, int local_y) +{ + index = base_index + local_x + local_y*index_stride; +} + +inline void drawing_area::put_pixel(color_t color) +{ + assert(index < max_index); + if(pixel_depth > 16) ptr32[index++] = color; + else if(pixel_depth > 0) + ((unsigned short*)ptr32)[index++] = (unsigned short)color; + else { // UYVY colorspace + if(index&1) color >>= 16; + ((unsigned short*)ptr32)[index++] = (unsigned short)color; + } +} + +inline drawing_area::~drawing_area() +{ +#if ! __TBB_DEFINE_MIC + update(); +#endif +} + +#if defined(_WINDOWS) && (defined(VIDEO_WINMAIN) || defined(VIDEO_WINMAIN_ARGS) ) +#include +//! define WinMain for subsystem:windows. +#ifdef VIDEO_WINMAIN_ARGS +int main(int, char *[]); +#else +int main(); +#endif +int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR szCmdLine, int iCmdShow) +{ + video::win_hInstance = hInstance; video::win_iCmdShow = iCmdShow; +#ifdef VIDEO_WINMAIN_ARGS + return main(__argc, __argv); +#else + return main(); +#endif +} +#endif + +#endif// __VIDEO_H__ diff --git a/xdl/third_party/tbb/examples/common/gui/winvideo.h b/xdl/third_party/tbb/examples/common/gui/winvideo.h new file mode 100644 index 00000000..c5ae8a3b --- /dev/null +++ b/xdl/third_party/tbb/examples/common/gui/winvideo.h @@ -0,0 +1,283 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +/////// Common internal implementation of Windows-specific stuff ////////////// +/////// Must be the first included header ////////////// + +#ifndef __WINVIDEO_H__ +#define __WINVIDEO_H__ + +#ifndef _CRT_SECURE_NO_DEPRECATE +#define _CRT_SECURE_NO_DEPRECATE +#endif +// Check that the target Windows version has all API calls requried. +#ifndef _WIN32_WINNT +# define _WIN32_WINNT 0x0400 +#endif +#if _WIN32_WINNT<0x0400 +# define YIELD_TO_THREAD() Sleep(0) +#else +# define YIELD_TO_THREAD() SwitchToThread() +#endif +#include "video.h" +#include +#include +#include +#include + +#pragma comment(lib, "gdi32.lib") +#pragma comment(lib, "user32.lib") + +// maximum mumber of lines the output console should have +static const WORD MAX_CONSOLE_LINES = 500; +const COLORREF RGBKEY = RGB(8, 8, 16); // at least 8 for 16-bit palette +HWND g_hAppWnd; // The program's window handle +HANDLE g_handles[2] = {0,0};// thread and wake up event +unsigned int * g_pImg = 0; // drawing memory +int g_sizex, g_sizey; +static video * g_video = 0; +WNDPROC g_pUserProc = 0; +HINSTANCE video::win_hInstance = 0; +int video::win_iCmdShow = 0; +static WNDCLASSEX * gWndClass = 0; +static HACCEL hAccelTable = 0; +static DWORD g_msec = 0; +static int g_fps = 0, g_updates = 0, g_skips = 0; + +bool DisplayError(LPSTR lpstrErr, HRESULT hres = 0); // always returns false +LRESULT CALLBACK InternalWndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam); + +//! Create window +bool WinInit(HINSTANCE hInstance, int nCmdShow, WNDCLASSEX *uwc, const char *title, bool fixedsize) +{ + WNDCLASSEX wndclass; // Our app's windows class + if(uwc) { + memcpy(&wndclass, uwc, sizeof(wndclass)); + g_pUserProc = uwc->lpfnWndProc; + } else { + memset(&wndclass, 0, sizeof(wndclass)); + wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); + wndclass.lpszClassName = title; + } + wndclass.cbSize = sizeof(wndclass); + wndclass.hInstance = hInstance; + wndclass.lpfnWndProc = InternalWndProc; + wndclass.style |= CS_HREDRAW | CS_VREDRAW; + wndclass.hbrBackground = CreateSolidBrush(RGBKEY); + + if( !RegisterClassExA(&wndclass) ) return false; + int xaddend = GetSystemMetrics(fixedsize?SM_CXFIXEDFRAME:SM_CXFRAME)*2; + int yaddend = GetSystemMetrics(fixedsize?SM_CYFIXEDFRAME:SM_CYFRAME)*2 + GetSystemMetrics(SM_CYCAPTION); + if(wndclass.lpszMenuName) yaddend += GetSystemMetrics(SM_CYMENU); + + // Setup the new window's physical parameters - and tell Windows to create it + g_hAppWnd = CreateWindowA(wndclass.lpszClassName, // Window class name + title, // Window caption + !fixedsize ? WS_OVERLAPPEDWINDOW : // Window style + WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX, + CW_USEDEFAULT, // Initial x pos: use default placement + 0, // Initial y pos: not used here + g_sizex+xaddend,// Initial x size + g_sizey+yaddend,// Initial y size + NULL, // parent window handle + NULL, // window menu handle + hInstance, // program instance handle + NULL); // Creation parameters + return g_hAppWnd != NULL; +} + +//! create console window with redirection +static bool RedirectIOToConsole(void) +{ + int hConHandle; size_t lStdHandle; + CONSOLE_SCREEN_BUFFER_INFO coninfo; + FILE *fp; + // allocate a console for this app + AllocConsole(); + + // set the screen buffer to be big enough to let us scroll text + GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &coninfo); + coninfo.dwSize.Y = MAX_CONSOLE_LINES; + SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), coninfo.dwSize); + + // redirect unbuffered STDOUT to the console + lStdHandle = (size_t)GetStdHandle(STD_OUTPUT_HANDLE); + hConHandle = _open_osfhandle(lStdHandle, _O_TEXT); + if(hConHandle <= 0) return false; + fp = _fdopen( hConHandle, "w" ); + *stdout = *fp; + setvbuf( stdout, NULL, _IONBF, 0 ); + + // redirect unbuffered STDERR to the console + lStdHandle = (size_t)GetStdHandle(STD_ERROR_HANDLE); + hConHandle = _open_osfhandle(lStdHandle, _O_TEXT); + if(hConHandle > 0) { + fp = _fdopen( hConHandle, "w" ); + *stderr = *fp; + setvbuf( stderr, NULL, _IONBF, 0 ); + } + + // redirect unbuffered STDIN to the console + lStdHandle = (size_t)GetStdHandle(STD_INPUT_HANDLE); + hConHandle = _open_osfhandle(lStdHandle, _O_TEXT); + if(hConHandle > 0) { + fp = _fdopen( hConHandle, "r" ); + *stdin = *fp; + setvbuf( stdin, NULL, _IONBF, 0 ); + } + + // make cout, wcout, cin, wcin, wcerr, cerr, wclog and clog + // point to console as well + std::ios::sync_with_stdio(); + return true; +} + + +video::video() + : depth(24), red_shift(16), green_shift(8), blue_shift(0), + red_mask(0xff0000), green_mask(0xff00), blue_mask(0xff) +{ + assert(g_video == 0); + g_video = this; title = "Video"; running = threaded = calc_fps = false; updating = true; +} + +//! optionally call it just before init() to set own +void video::win_set_class(WNDCLASSEX &wcex) +{ + gWndClass = &wcex; +} + +void video::win_load_accelerators(int idc) +{ + hAccelTable = LoadAccelerators(win_hInstance, MAKEINTRESOURCE(idc)); +} + +bool video::init_console() +{ + if(RedirectIOToConsole()) { + if(!g_pImg && g_sizex && g_sizey) + g_pImg = new unsigned int[g_sizex * g_sizey]; + if(g_pImg) running = true; + return true; + } + return false; +} + +video::~video() +{ + if(g_video) terminate(); +} + +DWORD WINAPI thread_video(LPVOID lpParameter) +{ + video *v = (video*)lpParameter; + v->on_process(); + return 0; +} + +static bool loop_once(video *v) +{ + // screen update notify + if(int updates = g_updates) { + g_updates = 0; + if(g_video->updating) { g_skips += updates-1; g_fps++; } + else g_skips += updates; + UpdateWindow(g_hAppWnd); + } + // update fps + DWORD msec = GetTickCount(); + if(v->calc_fps && msec >= g_msec+1000) { + double sec = (msec - g_msec)/1000.0; + char buffer[256], n = _snprintf(buffer, 128, "%s: %d fps", v->title, int(double(g_fps + g_skips)/sec)); + if(g_skips) _snprintf(buffer+n, 128, " - %d skipped = %d updates", int(g_skips/sec), int(g_fps/sec)); + SetWindowTextA(g_hAppWnd, buffer); + g_msec = msec; g_skips = g_fps = 0; + } + // event processing, including painting + MSG msg; + if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){ + if( msg.message == WM_QUIT ) { v->running = false; return false; } + if( !hAccelTable || !TranslateAccelerator(msg.hwnd, hAccelTable, &msg) ){ + TranslateMessage(&msg); + DispatchMessage(&msg); + } + return true; // try again + } + return false; +} + +//! Do standard event loop +void video::main_loop() +{ + // let Windows draw and unroll the window + InvalidateRect(g_hAppWnd, 0, false); + g_msec = GetTickCount(); // let's stay for 0,5 sec + while(g_msec + 500 > GetTickCount()) { loop_once(this); Sleep(1); } + g_msec = GetTickCount(); + // now, start main process + if(threaded) { + g_handles[0] = CreateThread ( + NULL, // LPSECURITY_ATTRIBUTES security_attrs + 0, // SIZE_T stacksize + (LPTHREAD_START_ROUTINE) thread_video, + this, // argument + 0, 0); + if(!g_handles[0]) { DisplayError("Can't create thread"); return; } + else // harmless race is possible here + g_handles[1] = CreateEvent(NULL, false, false, NULL); + while(running) { + while(loop_once(this)); + YIELD_TO_THREAD(); // give time for processing when running on single CPU + DWORD r = MsgWaitForMultipleObjects(2, g_handles, false, INFINITE, QS_ALLINPUT^QS_MOUSEMOVE); + if(r == WAIT_OBJECT_0) break; // thread terminated + } + running = false; + if(WaitForSingleObject(g_handles[0], 3000) == WAIT_TIMEOUT){ + // there was not enough time for graceful shutdown, killing the example with code 1. + exit(1); + } + if(g_handles[0]) CloseHandle(g_handles[0]); + if(g_handles[1]) CloseHandle(g_handles[1]); + g_handles[0] = g_handles[1] = 0; + } + else on_process(); +} + +//! Refresh screen picture +bool video::next_frame() +{ + if(!running) return false; + g_updates++; // Fast but inaccurate counter. The data race here is benign. + if(!threaded) while(loop_once(this)); + else if(g_handles[1]) { + SetEvent(g_handles[1]); + YIELD_TO_THREAD(); + } + return true; +} + +//! Change window title +void video::show_title() +{ + if(g_hAppWnd) + SetWindowTextA(g_hAppWnd, title); +} + +#endif //__WINVIDEO_H__ diff --git a/xdl/third_party/tbb/examples/common/gui/xcode/tbbExample/OpenGLView.h b/xdl/third_party/tbb/examples/common/gui/xcode/tbbExample/OpenGLView.h new file mode 100644 index 00000000..81e19952 --- /dev/null +++ b/xdl/third_party/tbb/examples/common/gui/xcode/tbbExample/OpenGLView.h @@ -0,0 +1,60 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +#import + +#if TARGET_OS_IPHONE + +#import +#import "OpenGLES/ES2/gl.h" + +@interface OpenGLView : UIView { + NSTimer *timer; + CGRect imageRect; +} + +@property (nonatomic, retain) NSTimer *timer; +@property (nonatomic) CGRect imageRect; + +- (void) drawRect:(CGRect)rect; +- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; + +@end + +#elif TARGET_OS_MAC + +#import +#import + +@interface OpenGLView : NSOpenGLView{ + NSTimer *timer; +} + +@property (nonatomic,retain) NSTimer *timer; + +- (void) drawRect:(NSRect)start; +- (void) mouseDown:(NSEvent *)theEvent; +- (void) keyDown:(NSEvent *)theEvent; +- (BOOL) acceptsFirstResponder; +- (void) viewDidEndLiveResize; + +@end + +#endif diff --git a/xdl/third_party/tbb/examples/common/gui/xcode/tbbExample/OpenGLView.m b/xdl/third_party/tbb/examples/common/gui/xcode/tbbExample/OpenGLView.m new file mode 100644 index 00000000..096db8a2 --- /dev/null +++ b/xdl/third_party/tbb/examples/common/gui/xcode/tbbExample/OpenGLView.m @@ -0,0 +1,147 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +#import +#import "OpenGLView.h" + +// defined in macvideo.cpp +extern char* window_title; +extern int cocoa_update; +extern int g_sizex, g_sizey; +extern unsigned int *g_pImg; +void on_mouse_func(int x, int y, int k); +void on_key_func(int x); + +bool initilized = false; + +#if TARGET_OS_IPHONE + +#import "OpenGLES/ES2/gl.h" + +@implementation OpenGLView + +@synthesize timer; +@synthesize imageRect; + +- (void)drawRect:(CGRect)start +{ + if (initilized == false) { + NSLog(@"INITIALIZE"); + timer = [NSTimer scheduledTimerWithTimeInterval:0.03 target:self selector:@selector(update_window) userInfo:nil repeats:YES]; + imageRect = [[UIScreen mainScreen] bounds]; + CGFloat full_height = imageRect.size.height; + const float ratio=(float)g_sizex/g_sizey; + imageRect.size.height=imageRect.size.width/ratio; + imageRect.origin.y=(full_height-imageRect.size.height)/2; + initilized = true; + } + + CGColorSpaceRef colourSpace = CGColorSpaceCreateDeviceRGB(); + CGDataProviderRef dataProvider = CGDataProviderCreateWithData(NULL, g_pImg, 4*g_sizex*g_sizey, NULL); + + CGImageRef inputImage = CGImageCreate(g_sizex, g_sizey, 8, 32, g_sizex * 4, colourSpace,(CGBitmapInfo)kCGImageAlphaNoneSkipLast, dataProvider, NULL, NO, kCGRenderingIntentDefault); + UIImage *image = [UIImage imageWithCGImage:inputImage]; + + CGDataProviderRelease(dataProvider); + CGColorSpaceRelease(colourSpace); + CGImageRelease(inputImage); + + [image drawInRect:imageRect]; + +} + +- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event +{ + CGPoint point = [[touches anyObject] locationInView:self]; + const int x = point.x; + const int y = point.y; + if ( (y-imageRect.origin.y) > 0 && y < (imageRect.origin.y + imageRect.size.height )) + on_mouse_func( x*g_sizex/(imageRect.size.width), (y-imageRect.origin.y)*g_sizey/imageRect.size.height,1); + [self setNeedsDisplay]; +} + +-(void) update_window{ + if( cocoa_update ) [self setNeedsDisplay]; +} + +@end + +#elif TARGET_OS_MAC + +#import + +@implementation OpenGLView + +@synthesize timer; + +- (void) drawRect:(NSRect)start +{ + if (initilized == false) { + NSLog(@"INITIALIZE"); + timer = [NSTimer scheduledTimerWithTimeInterval:0.03 target:self selector:@selector(update_window) userInfo:nil repeats:YES]; + initilized = true; + } + glWindowPos2i(0, (int)self.visibleRect.size.height); + glPixelZoom( (float)self.visibleRect.size.width /(float)g_sizex, + -(float)self.visibleRect.size.height/(float)g_sizey); + glDrawPixels(g_sizex, g_sizey, GL_BGRA_EXT, GL_UNSIGNED_INT_8_8_8_8_REV, g_pImg); + glFlush(); +} + +-(void) update_window{ + if( cocoa_update ) [self setNeedsDisplay:YES]; + if( window_title ) [_window setTitle:[NSString stringWithFormat:@"%s", window_title]]; +} + +-(void) keyDown:(NSEvent *)theEvent{ + on_key_func([theEvent.characters characterAtIndex:0]); +} + +-(void) mouseDown:(NSEvent *)theEvent{ + // mouse event for seismic and fractal + NSPoint point= theEvent.locationInWindow; + const int x = (int)point.x; + const int y = (int)point.y; + NSRect rect = self.visibleRect; + on_mouse_func(x*g_sizex/(int)rect.size.width,((int)rect.size.height-y)*g_sizey/(int)rect.size.height,1); + [self setNeedsDisplay:YES]; +} + +- (BOOL) acceptsFirstResponder +{ + return YES; +} + +- (void) rightMouseDown:(NSEvent *)theEvent +{ + return; +} + +-(void) viewDidEndLiveResize +{ + NSRect rect = self.visibleRect; + const int x=(int)rect.size.width; + const int y=(int)rect.size.height; + [_window setTitle:[NSString stringWithFormat:@"X=%d Y=%d", x,y]]; +} + +@end + +#endif diff --git a/xdl/third_party/tbb/examples/common/gui/xcode/tbbExample/PkgInfo b/xdl/third_party/tbb/examples/common/gui/xcode/tbbExample/PkgInfo new file mode 100644 index 00000000..bd04210f --- /dev/null +++ b/xdl/third_party/tbb/examples/common/gui/xcode/tbbExample/PkgInfo @@ -0,0 +1 @@ +APPL???? \ No newline at end of file diff --git a/xdl/third_party/tbb/examples/common/gui/xcode/tbbExample/en.lproj/InfoPlist.strings b/xdl/third_party/tbb/examples/common/gui/xcode/tbbExample/en.lproj/InfoPlist.strings new file mode 100644 index 00000000..477b28ff --- /dev/null +++ b/xdl/third_party/tbb/examples/common/gui/xcode/tbbExample/en.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/xdl/third_party/tbb/examples/common/gui/xcode/tbbExample/en.lproj/MainMenu.nib b/xdl/third_party/tbb/examples/common/gui/xcode/tbbExample/en.lproj/MainMenu.nib new file mode 100644 index 00000000..bbcd0057 Binary files /dev/null and b/xdl/third_party/tbb/examples/common/gui/xcode/tbbExample/en.lproj/MainMenu.nib differ diff --git a/xdl/third_party/tbb/examples/common/gui/xcode/tbbExample/en.lproj/MainMenu.xib b/xdl/third_party/tbb/examples/common/gui/xcode/tbbExample/en.lproj/MainMenu.xib new file mode 100644 index 00000000..975382ce --- /dev/null +++ b/xdl/third_party/tbb/examples/common/gui/xcode/tbbExample/en.lproj/MainMenu.xib @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/xdl/third_party/tbb/examples/common/gui/xcode/tbbExample/iOS.storyboard b/xdl/third_party/tbb/examples/common/gui/xcode/tbbExample/iOS.storyboard new file mode 100644 index 00000000..9906441e --- /dev/null +++ b/xdl/third_party/tbb/examples/common/gui/xcode/tbbExample/iOS.storyboard @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/xdl/third_party/tbb/examples/common/gui/xcode/tbbExample/main.m b/xdl/third_party/tbb/examples/common/gui/xcode/tbbExample/main.m new file mode 100644 index 00000000..5b873956 --- /dev/null +++ b/xdl/third_party/tbb/examples/common/gui/xcode/tbbExample/main.m @@ -0,0 +1,51 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +#import +#import + +#if TARGET_OS_IPHONE + +#import +#import "tbbAppDelegate.h" + +void get_screen_resolution(int *x, int *y) { + // Getting landscape screen resolution in any case + CGRect imageRect = [[UIScreen mainScreen] bounds]; + *x=imageRect.size.width>imageRect.size.height?imageRect.size.width:imageRect.size.height; + *y=imageRect.size.width + +int cocoa_main(int argc, char *argv[]) +{ + return NSApplicationMain(argc, (const char **)argv); +} +#endif diff --git a/xdl/third_party/tbb/examples/common/gui/xcode/tbbExample/tbbAppDelegate.h b/xdl/third_party/tbb/examples/common/gui/xcode/tbbExample/tbbAppDelegate.h new file mode 100644 index 00000000..4bd08819 --- /dev/null +++ b/xdl/third_party/tbb/examples/common/gui/xcode/tbbExample/tbbAppDelegate.h @@ -0,0 +1,51 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +// +// Created by Xcode* 4.3.2 +// + +#import + +#if TARGET_OS_IPHONE + +#import + +@interface tbbAppDelegate : UIResponder + +@property (strong, nonatomic) UIWindow *window; + +@end + +#elif TARGET_OS_MAC + +#import + +@interface tbbAppDelegate : NSObject { + __unsafe_unretained NSWindow *_window; +} + +@property (assign) IBOutlet NSWindow *window; + +- (BOOL) applicationShouldTerminateAfterLastWindowClosed:(NSApplication *) sender; + +@end + +#endif diff --git a/xdl/third_party/tbb/examples/common/gui/xcode/tbbExample/tbbAppDelegate.m b/xdl/third_party/tbb/examples/common/gui/xcode/tbbExample/tbbAppDelegate.m new file mode 100644 index 00000000..266c1a4c --- /dev/null +++ b/xdl/third_party/tbb/examples/common/gui/xcode/tbbExample/tbbAppDelegate.m @@ -0,0 +1,66 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +#import "tbbAppDelegate.h" + +#if TARGET_OS_IPHONE + +@implementation tbbAppDelegate + +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions +{ + return YES; +} + +- (void)applicationDidEnterBackground:(UIApplication *)application +{ + exit(EXIT_SUCCESS); +} + +@end + +#elif TARGET_OS_MAC + +@implementation tbbAppDelegate + +@synthesize window = _window; + +//declared in macvideo.cpp file +extern int g_sizex, g_sizey; + +- (void)applicationDidFinishLaunching:(NSNotification *)aNotification +{ + // Insert code here to initialize your application + NSRect windowSize; + windowSize.size.height = g_sizey; + windowSize.size.width = g_sizex; + windowSize.origin=_window.frame.origin; + [_window setFrame:windowSize display:YES]; + +} + +- (BOOL) applicationShouldTerminateAfterLastWindowClosed:(NSApplication *) sender +{ + return YES; +} + +@end + +#endif diff --git a/xdl/third_party/tbb/examples/common/gui/xcode/tbbExample/tbbExample-Info.ios.plist b/xdl/third_party/tbb/examples/common/gui/xcode/tbbExample/tbbExample-Info.ios.plist new file mode 100644 index 00000000..80bdf4ff --- /dev/null +++ b/xdl/third_party/tbb/examples/common/gui/xcode/tbbExample/tbbExample-Info.ios.plist @@ -0,0 +1,44 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + iOS + UIMainStoryboardFile + iOS + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/xdl/third_party/tbb/examples/common/gui/xcode/tbbExample/tbbExample-Info.plist b/xdl/third_party/tbb/examples/common/gui/xcode/tbbExample/tbbExample-Info.plist new file mode 100644 index 00000000..c344a910 --- /dev/null +++ b/xdl/third_party/tbb/examples/common/gui/xcode/tbbExample/tbbExample-Info.plist @@ -0,0 +1,45 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleDisplayName + + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIconFile + + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSApplicationCategoryType + public.app-category.business + LSEnvironment + + DYLD_LIBRARY_PATH + Contents/Resources:.:../Resources:/tmp:$DYLD_LIBRARY_PATH + LIBRARY_PATH + Contents/Resources:.:../:/tmp:$DYLD_LIBRARY_PATH + + LSMinimumSystemVersion + ${MACOSX_DEPLOYMENT_TARGET} + NSHumanReadableCopyright + Copyright 2005-2018 Intel Corporation. All Rights Reserved. + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + diff --git a/xdl/third_party/tbb/examples/common/gui/xcode/tbbExample/tbbExample-Prefix.pch b/xdl/third_party/tbb/examples/common/gui/xcode/tbbExample/tbbExample-Prefix.pch new file mode 100644 index 00000000..4531cbe0 --- /dev/null +++ b/xdl/third_party/tbb/examples/common/gui/xcode/tbbExample/tbbExample-Prefix.pch @@ -0,0 +1,36 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +// +// Prefix header for all source files of the 'tbbExample' target in the 'tbbExample' project +// + +#import + +#if TARGET_OS_IPHONE +#ifdef __OBJC__ + #import + #import +#endif +#elif TARGET_OS_MAC +#ifdef __OBJC__ + #import +#endif +#endif diff --git a/xdl/third_party/tbb/examples/common/gui/xvideo.cpp b/xdl/third_party/tbb/examples/common/gui/xvideo.cpp new file mode 100644 index 00000000..8f5ce231 --- /dev/null +++ b/xdl/third_party/tbb/examples/common/gui/xvideo.cpp @@ -0,0 +1,386 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +// Uncomment next line to disable shared memory features if you do not have libXext +// (http://www.xfree86.org/current/mit-shm.html) +//#define X_NOSHMEM + +// Note that it may happen that the build environment supports the shared-memory extension +// (so there's no build-time reason to disable the relevant code by defining X_NOSHMEM), +// but that using shared memory still fails at run time. +// This situation will (ultimately) cause the error handler set by XSetErrorHandler() +// to be invoked with XErrorEvent::minor_code==X_ShmAttach. The code below tries to make +// such a determination at XShmAttach() time, which seems plausible, but unfortunately +// it has also been observed in a specific environment that the error may be reported +// at a later time instead, even after video::init_window() has returned. +// It is not clear whether this may happen in that way in any environment where it might +// depend on the kind of display, e.g., local vs. over "ssh -X", so #define'ing X_NOSHMEM +// may not always be the appropriate solution, therefore an environment variable +// has been introduced to disable shared memory at run time. +// A diagnostic has been added to advise the user about possible workarounds. +// X_ShmAttach macro was changed to 1 due to recent changes to X11/extensions/XShm.h header. + +#include "video.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef X_NOSHMEM +#include +#include +#include +#include + +static XShmSegmentInfo shmseginfo; +static Pixmap pixmap = 0; +static bool already_called_X_ShmAttach = false; +static bool already_advised_about_NOSHMEM_workarounds = false; +static const char* NOSHMEM_env_var_name = "TBB_EXAMPLES_X_NOSHMEM"; +#endif +static char *display_name = NULL; +static Display *dpy = NULL; +static Screen *scrn; +static Visual *vis; +static Colormap cmap; +static GC gc; +static Window win, rootW; +static int dispdepth = 0; +static XGCValues xgcv; +static XImage *ximage; +static int x_error = 0; +static int vidtype = 3; +int g_sizex, g_sizey; +static video *g_video = 0; +unsigned int *g_pImg = 0; +static int g_fps = 0; +struct timeval g_time; +static pthread_mutex_t g_mutex = PTHREAD_MUTEX_INITIALIZER; +Atom _XA_WM_DELETE_WINDOW = 0;// like in Xatom.h + +///////////////////////////////////////////// public methods of video class /////////////////////// + +video::video() +{ + assert(g_video == 0); + g_video = this; title = "Video"; calc_fps = running = false; updating = true; +} + +inline void mask2bits(unsigned int mask, unsigned int &save, depth_t &shift) +{ + save = mask; if(!mask) { shift = dispdepth/3; return; } + shift = 0; while(!(mask&1)) ++shift, mask >>= 1; + int bits = 0; while(mask&1) ++bits, mask >>= 1; + shift += bits - 8; +} + +int xerr_handler(Display* dpy_, XErrorEvent *error) +{ + x_error = error->error_code; + if(g_video) g_video->running = false; +#ifndef X_NOSHMEM + if (error->minor_code==1/*X_ShmAttach*/ && already_called_X_ShmAttach && !already_advised_about_NOSHMEM_workarounds) + { + char err[256]; XGetErrorText(dpy_, x_error, err, 255); + fprintf(stderr, "Warning: Can't attach shared memory to display: %s (%d)\n", err, x_error); + fprintf(stderr, "If you are seeing a black output window, try setting %s environment variable to 1" + " to disable shared memory extensions (0 to re-enable, other values undefined)," + " or rebuilding with X_NOSHMEM defined in " __FILE__ "\n", NOSHMEM_env_var_name); + already_advised_about_NOSHMEM_workarounds = true; + } +#else + (void) dpy_; // warning prevention +#endif + return 0; +} + +bool video::init_window(int xsize, int ysize) +{ + { //enclose local variables before fail label + g_sizex = xsize; g_sizey = ysize; + + // Open the display + if (!dpy) { + dpy = XOpenDisplay(display_name); + if (!dpy) { + fprintf(stderr, "Can't open X11 display %s\n", XDisplayName(display_name)); + goto fail; + } + } + int theScreen = DefaultScreen(dpy); + scrn = ScreenOfDisplay(dpy, theScreen); + dispdepth = DefaultDepth(dpy, theScreen); + XVisualInfo vinfo; + if (!( (dispdepth >= 15 && dispdepth <= 32 && XMatchVisualInfo(dpy, theScreen, dispdepth, TrueColor, &vinfo) ) + || XMatchVisualInfo(dpy, theScreen, 24, TrueColor, &vinfo) + || XMatchVisualInfo(dpy, theScreen, 32, TrueColor, &vinfo) + || XMatchVisualInfo(dpy, theScreen, 16, TrueColor, &vinfo) + || XMatchVisualInfo(dpy, theScreen, 15, TrueColor, &vinfo) + )) { + fprintf(stderr, "Display has no appropriate True Color visual\n"); + goto fail; + } + vis = vinfo.visual; + depth = dispdepth = vinfo.depth; + mask2bits(vinfo.red_mask, red_mask, red_shift); + mask2bits(vinfo.green_mask, green_mask, green_shift); + mask2bits(vinfo.blue_mask, blue_mask, blue_shift); + rootW = RootWindow(dpy, theScreen); + cmap = XCreateColormap(dpy, rootW, vis, AllocNone); + XSetWindowAttributes attrs; + attrs.backing_store = Always; + attrs.colormap = cmap; + attrs.event_mask = StructureNotifyMask|KeyPressMask|ButtonPressMask|ButtonReleaseMask; + attrs.background_pixel = BlackPixelOfScreen(scrn); + attrs.border_pixel = WhitePixelOfScreen(scrn); + win = XCreateWindow(dpy, rootW, + 0, 0, xsize, ysize, 2, + dispdepth, InputOutput, vis, + CWBackingStore | CWColormap | CWEventMask | + CWBackPixel | CWBorderPixel, + &attrs); + if(!win) { + fprintf(stderr, "Can't create the window\n"); + goto fail; + } + XSizeHints sh; + sh.flags = PSize | PMinSize | PMaxSize; + sh.width = sh.min_width = sh.max_width = xsize; + sh.height = sh.min_height = sh.max_height = ysize; + XSetStandardProperties( dpy, win, g_video->title, g_video->title, None, NULL, 0, &sh ); + _XA_WM_DELETE_WINDOW = XInternAtom(dpy, "WM_DELETE_WINDOW", false); + XSetWMProtocols(dpy, win, &_XA_WM_DELETE_WINDOW, 1); + gc = XCreateGC(dpy, win, 0L, &xgcv); + XMapRaised(dpy, win); + XFlush(dpy); +#ifdef X_FULLSYNC + XSynchronize(dpy, true); +#endif + XSetErrorHandler(xerr_handler); + + int imgbytes = xsize*ysize*(dispdepth<=16?2:4); + const char *vidstr; +#ifndef X_NOSHMEM + int major, minor, pixmaps; + if(XShmQueryExtension(dpy) && + XShmQueryVersion(dpy, &major, &minor, &pixmaps)) + { // Shared memory + if(NULL!=getenv(NOSHMEM_env_var_name) && 0!=strcmp("0",getenv(NOSHMEM_env_var_name))) { + goto generic; + } + shmseginfo.shmid = shmget(IPC_PRIVATE, imgbytes, IPC_CREAT|0777); + if(shmseginfo.shmid < 0) { + fprintf(stderr, "Warning: Can't get shared memory: %s\n", strerror(errno)); + goto generic; + } + g_pImg = (unsigned int*)(shmseginfo.shmaddr = (char*)shmat(shmseginfo.shmid, 0, 0)); + if(g_pImg == (unsigned int*)-1) { + fprintf(stderr, "Warning: Can't attach to shared memory: %s\n", strerror(errno)); + shmctl(shmseginfo.shmid, IPC_RMID, NULL); + goto generic; + } + shmseginfo.readOnly = false; + if(!XShmAttach(dpy, &shmseginfo) || x_error) { + char err[256]; XGetErrorText(dpy, x_error, err, 255); + fprintf(stderr, "Warning: Can't attach shared memory to display: %s (%d)\n", err, x_error); + shmdt(shmseginfo.shmaddr); shmctl(shmseginfo.shmid, IPC_RMID, NULL); + goto generic; + } + already_called_X_ShmAttach = true; + +#ifndef X_NOSHMPIX + if(pixmaps && XShmPixmapFormat(dpy) == ZPixmap) + { // Pixmaps + vidtype = 2; vidstr = "X11 shared memory pixmap"; + pixmap = XShmCreatePixmap(dpy, win, (char*)g_pImg, &shmseginfo, xsize, ysize, dispdepth); + XSetWindowBackgroundPixmap(dpy, win, pixmap); + } else +#endif//!X_NOSHMPIX + { // Standard + vidtype = 1; vidstr = "X11 shared memory"; + ximage = XShmCreateImage(dpy, vis, dispdepth, + ZPixmap, 0, &shmseginfo, xsize, ysize); + if(!ximage) { + fprintf(stderr, "Can't create the shared image\n"); + goto fail; + } + assert(ximage->bytes_per_line == xsize*(dispdepth<=16?2:4)); + ximage->data = shmseginfo.shmaddr; + } + } else +#endif + { +#ifndef X_NOSHMEM +generic: +#endif + vidtype = 0; vidstr = "generic X11"; + g_pImg = new unsigned int[imgbytes/sizeof(int)]; + ximage = XCreateImage(dpy, vis, dispdepth, ZPixmap, 0, (char*)g_pImg, xsize, ysize, 32, imgbytes/ysize); + if(!ximage) { + fprintf(stderr, "Can't create the image\n"); + goto fail; + } + } + if( ximage ) { + // Note: It may be more efficient to adopt the server's byte order + // and swap once per get_color() call instead of once per pixel. + const uint32_t probe = 0x03020100; + const bool big_endian = (((const char*)(&probe))[0]==0x03); + ximage->byte_order = big_endian ? MSBFirst : LSBFirst; + } + printf("Note: using %s with %s visual for %d-bit color depth\n", vidstr, vis==DefaultVisual(dpy, theScreen)?"default":"non-default", dispdepth); + running = true; + return true; + } // end of enclosing local variables +fail: + terminate(); init_console(); + return false; +} + +bool video::init_console() +{ + if(!g_pImg && g_sizex && g_sizey) { + dispdepth = 24; red_shift = 16; vidtype = 3; // fake video + g_pImg = new unsigned int[g_sizex*g_sizey]; + running = true; + } + return true; +} + +void video::terminate() +{ + running = false; + if(dpy) { + vidtype = 3; // stop video + if(threaded) { pthread_mutex_lock(&g_mutex); pthread_mutex_unlock(&g_mutex); } + if(ximage) { XDestroyImage(ximage); ximage = 0; g_pImg = 0; } // it frees g_pImg for vidtype == 0 +#ifndef X_NOSHMEM + if(pixmap) XFreePixmap(dpy, pixmap); + if(shmseginfo.shmaddr) { XShmDetach(dpy, &shmseginfo); shmdt(shmseginfo.shmaddr); g_pImg = 0; } + if(shmseginfo.shmid >= 0) shmctl(shmseginfo.shmid, IPC_RMID, NULL); +#endif + if(gc) XFreeGC(dpy, gc); + if(win) XDestroyWindow(dpy, win); + XCloseDisplay(dpy); dpy = 0; + } + if(g_pImg) { delete[] g_pImg; g_pImg = 0; } // if was allocated for console mode +} + +video::~video() +{ + if(g_video) terminate(); + g_video = 0; +} + +//! Do standard event loop +void video::main_loop() +{ + struct timezone tz; gettimeofday(&g_time, &tz); + on_process(); +} + +//! Check for pending events once +bool video::next_frame() +{ + if(!running) return false; + //! try acquire mutex if threaded code, returns on failure + if(vidtype == 3 || threaded && pthread_mutex_trylock(&g_mutex)) + return running; + //! Refresh screen picture + g_fps++; +#ifndef X_NOSHMPIX + if(vidtype == 2 && updating) XClearWindow(dpy, win); +#endif + while( XPending(dpy) ) { + XEvent report; XNextEvent(dpy, &report); + switch( report.type ) { + case ClientMessage: + if(report.xclient.format != 32 || report.xclient.data.l[0] != _XA_WM_DELETE_WINDOW) break; + case DestroyNotify: + running = false; + case KeyPress: + on_key( XLookupKeysym(&report.xkey, 0) ); break; + case ButtonPress: + on_mouse( report.xbutton.x, report.xbutton.y, report.xbutton.button ); break; + case ButtonRelease: + on_mouse( report.xbutton.x, report.xbutton.y, -report.xbutton.button ); break; + } + } + struct timezone tz; struct timeval now_time; gettimeofday(&now_time, &tz); + double sec = (now_time.tv_sec+1.0*now_time.tv_usec/1000000.0) - (g_time.tv_sec+1.0*g_time.tv_usec/1000000.0); + if(sec > 1) { + memcpy(&g_time, &now_time, sizeof(g_time)); + if(calc_fps) { + double fps = g_fps; g_fps = 0; + char buffer[256]; snprintf(buffer, 256, "%s%s: %d fps", title, updating?"":" (no updating)", int(fps/sec)); + XStoreName(dpy, win, buffer); + } +#ifndef X_FULLSYNC + XSync(dpy, false); // It is often better then using XSynchronize(dpy, true) +#endif//X_FULLSYNC + } + if(threaded) pthread_mutex_unlock(&g_mutex); + return true; +} + +//! Change window title +void video::show_title() +{ + if(vidtype < 3) + XStoreName(dpy, win, title); +} + +drawing_area::drawing_area(int x, int y, int sizex, int sizey) + : base_index(y*g_sizex + x), max_index(g_sizex*g_sizey), index_stride(g_sizex), + pixel_depth(dispdepth), ptr32(g_pImg), start_x(x), start_y(y), size_x(sizex), size_y(sizey) +{ + assert(x < g_sizex); assert(y < g_sizey); + assert(x+sizex <= g_sizex); assert(y+sizey <= g_sizey); + + index = base_index; // current index +} + +void drawing_area::update() +{ + if(!g_video->updating) return; +#ifndef X_NOSHMEM + switch(vidtype) { + case 0: +#endif + pthread_mutex_lock(&g_mutex); + if(vidtype == 0) XPutImage(dpy, win, gc, ximage, start_x, start_y, start_x, start_y, size_x, size_y); + pthread_mutex_unlock(&g_mutex); +#ifndef X_NOSHMEM + break; + case 1: + pthread_mutex_lock(&g_mutex); + if(vidtype == 1) XShmPutImage(dpy, win, gc, ximage, start_x, start_y, start_x, start_y, size_x, size_y, false); + pthread_mutex_unlock(&g_mutex); + break; + /*case 2: make it in next_frame(); break;*/ + } +#endif +} diff --git a/xdl/third_party/tbb/examples/common/index.html b/xdl/third_party/tbb/examples/common/index.html new file mode 100644 index 00000000..6e9398a7 --- /dev/null +++ b/xdl/third_party/tbb/examples/common/index.html @@ -0,0 +1,397 @@ + + + + + + Intel® Threading Building Blocks. Common source code for samples + + + + + +

+ This directory contains common code that is used in the Intel® Threading Building Blocks (Intel® TBB) samples. +
+ This code is not intended to be used directly. It is incorporated automatically by the examples that need it. +

+ +
+
Directories
+ +
+
+
gui +
+ GUI code for examples that have graphical user interfaces. Currently supports: +
    +
  • GDI+*, DirectDraw*, Direct2D* (Windows* systems) +
  • OpenGL* (macOS* systems) +
  • X window (Linux* or macOS* systems) +
+ See the examples that use the GUI + (stereo, + tachyon, + seismic, + fractal) + for more details. +
+
+
utility +
Common driver and utility code for examples. Currently provides: +
    +
  • class FastRandom - a random number generator that uses linear congruential method + (fast_random.h) +
  • class thread_number_range - a class to specify the numbers of threads an example should use + (utility.h) +
  • support for command line interface - class cli_argument_pack and function parse_cli_arguments + (utility.h) +
+
+
+
+
+
Common information
+ +
+
+
Number of threads
+

+ Most Intel TBB examples allow to specify n-of-threads, the set of thread numbers that should be used to run an example. +
Usually, it is a range of the form low[:high[:(+|*|#)S]], where low and optional high + are non-negative integers or 'auto' for the default choice, and optional step expression (+|*|#)S + specifies how thread numbers are chosen within the range: +

    +
  • With +/*, the previous number is incremented/multiplied by S. + E.g., expression '12:16:+1' means 12,13,14,15,16 threads, and '1:16:*2' means 1,2,4,8,16 threads. +
  • With #, S is the desired number of steps between any subsequent powers of 2; + it must be a power of 2 on its own, with most meaningful values being 2, 4, and 8. + For a given number of threads, the actual step value is computed as the quotient + of the nearest smaller power of 2 divided by the number of steps, but is at least 1. + E.g., '1:32:#4' means 1,2,3,4,5,6,7,8,10,12,14,16,20,24,28,32 threads; + note the step doubling at 8 and 16 to keep 4 steps between powers of 2. +
+ A default value for the number of threads can be customized in an example. If not customized, it is '1:auto:#4'. + The 'auto' parameter is substituted with a value returned by a specified function, which typically is + tbb::task_scheduler_init::default_num_threads(). +

+
+
+ +
+ Up to parent directory +
+
+
Legal Information:
+ +
+

+ Intel and the Intel logo are trademarks of Intel Corporation in the U.S. and/or other countries. +
* Other names and brands may be claimed as the property of others. +
© 2018, Intel Corporation +

+
+
+ + diff --git a/xdl/third_party/tbb/examples/common/toolset.props b/xdl/third_party/tbb/examples/common/toolset.props new file mode 100644 index 00000000..44388c6a --- /dev/null +++ b/xdl/third_party/tbb/examples/common/toolset.props @@ -0,0 +1,9 @@ + + + + Intel C++ Compiler 15.0 [Intel(R) System Studio] + Intel C++ Compiler XE 15.0 + Intel C++ Compiler 16.0 + true + + diff --git a/xdl/third_party/tbb/examples/common/utility/fast_random.h b/xdl/third_party/tbb/examples/common/utility/fast_random.h new file mode 100644 index 00000000..7ca97a21 --- /dev/null +++ b/xdl/third_party/tbb/examples/common/utility/fast_random.h @@ -0,0 +1,82 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +#ifndef FAST_RANDOM_H_ +#define FAST_RANDOM_H_ +namespace utility{ +//------------------------------------------------------------------------ +// FastRandom +//------------------------------------------------------------------------ + +namespace internal{ + size_t GetPrime ( size_t seed ); +} + +//! A fast random number generator. +/** Uses linear congruential method. */ +class FastRandom { + size_t x, a; +public: + //! Get a random number. + unsigned short get() { + return get(x); + } + //! Get a random number for the given seed; update the seed for next use. + unsigned short get( size_t& seed ) { + unsigned short r = (unsigned short)(seed>>16); + seed = seed*a+1; + return r; + } + //! Construct a random number generator. + FastRandom( size_t seed ) { + x = seed*internal::GetPrime(seed); + a = internal::GetPrime(x); + } +}; +} + +namespace utility { +namespace internal{ +//! Table of primes used by fast random-number generator (FastRandom). + static const unsigned Primes[] = { + 0x9e3779b1, 0xffe6cc59, 0x2109f6dd, 0x43977ab5, + 0xba5703f5, 0xb495a877, 0xe1626741, 0x79695e6b, + 0xbc98c09f, 0xd5bee2b3, 0x287488f9, 0x3af18231, + 0x9677cd4d, 0xbe3a6929, 0xadc6a877, 0xdcf0674b, + 0xbe4d6fe9, 0x5f15e201, 0x99afc3fd, 0xf3f16801, + 0xe222cfff, 0x24ba5fdb, 0x0620452d, 0x79f149e3, + 0xc8b93f49, 0x972702cd, 0xb07dd827, 0x6c97d5ed, + 0x085a3d61, 0x46eb5ea7, 0x3d9910ed, 0x2e687b5b, + 0x29609227, 0x6eb081f1, 0x0954c4e1, 0x9d114db9, + 0x542acfa9, 0xb3e6bd7b, 0x0742d917, 0xe9f3ffa7, + 0x54581edb, 0xf2480f45, 0x0bb9288f, 0xef1affc7, + 0x85fa0ca7, 0x3ccc14db, 0xe6baf34b, 0x343377f7, + 0x5ca19031, 0xe6d9293b, 0xf0a9f391, 0x5d2e980b, + 0xfc411073, 0xc3749363, 0xb892d829, 0x3549366b, + 0x629750ad, 0xb98294e5, 0x892d9483, 0xc235baf3, + 0x3d2402a3, 0x6bdef3c9, 0xbec333cd, 0x40c9520f + }; + size_t GetPrime ( size_t seed ) { + return Primes[seed%(sizeof(Primes)/sizeof(Primes[0]))]; + } +} +} + +#endif /* FAST_RANDOM_H_ */ diff --git a/xdl/third_party/tbb/examples/common/utility/utility.h b/xdl/third_party/tbb/examples/common/utility/utility.h new file mode 100644 index 00000000..0f8475e1 --- /dev/null +++ b/xdl/third_party/tbb/examples/common/utility/utility.h @@ -0,0 +1,526 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +#ifndef UTILITY_H_ +#define UTILITY_H_ + +#if __TBB_MIC_OFFLOAD +#pragma offload_attribute (push,target(mic)) +#include +#include +#pragma offload_attribute (pop) +#endif // __TBB_MIC_OFFLOAD + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +// TBB headers should not be used, as some examples may need to be built without TBB. + +namespace utility{ + namespace internal{ + +#if (_MSC_VER >= 1600 || __cplusplus >= 201103L || __GXX_EXPERIMENTAL_CXX0X__) \ + && (_CPPLIB_VER || _LIBCPP_VERSION || __GLIBCXX__ && _UNIQUE_PTR_H ) \ + && (!__INTEL_COMPILER || __INTEL_COMPILER >= 1200 ) + // std::unique_ptr is available, and compiler can use it + #define smart_ptr std::unique_ptr + using std::swap; +#else + #if __INTEL_COMPILER && __GXX_EXPERIMENTAL_CXX0X__ + // std::unique_ptr is unavailable, so suppress std::auto_prt<> deprecation warning + #pragma warning(disable: 1478) + #endif + #define smart_ptr std::auto_ptr + // in some C++ libraries, std::swap does not work with std::auto_ptr + template + void swap( std::auto_ptr& ptr1, std::auto_ptr& ptr2 ) { + std::auto_ptr tmp; tmp = ptr2; ptr2 = ptr1; ptr1 = tmp; + } +#endif + + //TODO: add tcs + template + dest_type& string_to(std::string const& s, dest_type& result){ + std::stringstream stream(s); + stream>>result; + if ((!stream)||(stream.fail())){ + throw std::invalid_argument("error converting string '"+std::string(s)+"'"); + } + return result; + } + + template + dest_type string_to(std::string const& s){ + dest_type result; + return string_to(s,result); + } + + template + struct is_bool { static bool value(){return false;}}; + template<> + struct is_bool { static bool value(){return true;}}; + + class type_base { + type_base& operator=(const type_base&); + public: + const std::string name; + const std::string description; + + type_base (std::string a_name, std::string a_description) : name(a_name), description(a_description) {} + virtual void parse_and_store(const std::string & s) = 0; + virtual std::string value() const = 0; + virtual smart_ptr clone() const = 0; + virtual ~type_base(){} + }; + template + class type_impl : public type_base { + private: + type_impl& operator=(const type_impl&); + typedef bool(*validating_function_type)(const type&); + private: + type & target; + validating_function_type validating_function; + public: + type_impl(std::string a_name, std::string a_description, type & a_target, validating_function_type a_validating_function = NULL) + : type_base (a_name,a_description), target(a_target),validating_function(a_validating_function) + {}; + void parse_and_store (const std::string & s) /*override*/ { + try{ + const bool is_bool = internal::is_bool::value(); + if (is_bool && s.empty()){ + //to avoid directly assigning true + //(as it will impose additional layer of indirection) + //so, simply pass it as string + internal::string_to("1",target); + }else { + internal::string_to(s,target); + } + }catch(std::invalid_argument& e){ + std::stringstream str; + str <<"'"< + static bool is_null_c_str(t&){return false;} + static bool is_null_c_str(char* s){return s==NULL;} + std::string value() const /*override*/ { + std::stringstream str; + if (!is_null_c_str(target)) + str< clone() const /*override*/ { + return smart_ptr(new type_impl(*this)); + } + }; + + class argument{ + private: + smart_ptr p_type; + bool matched_; + public: + argument(argument const& other) + : p_type(other.p_type.get() ? (other.p_type->clone()).release() : NULL) + ,matched_(other.matched_) + {} + argument& operator=(argument a){ + this->swap(a); + return *this; + } + void swap(argument& other){ + internal::swap(p_type, other.p_type); + std::swap(matched_,other.matched_); + } + template + argument(std::string a_name, std::string a_description, type& dest, bool(*a_validating_function)(const type&)= NULL) + :p_type(new type_impl(a_name,a_description,dest,a_validating_function)) + ,matched_(false) + {} + std::string value()const{ + return p_type->value(); + } + std::string name()const{ + return p_type->name; + } + std::string description() const{ + return p_type->description; + } + void parse_and_store(const std::string & s){ + p_type->parse_and_store(s); + matched_=true; + } + bool is_matched() const{return matched_;} + }; + } // namespace internal + + class cli_argument_pack{ + typedef std::map args_map_type; + typedef std::vector args_display_order_type; + typedef std::vector positional_arg_names_type; + private: + args_map_type args_map; + args_display_order_type args_display_order; + positional_arg_names_type positional_arg_names; + std::set bool_args_names; + private: + void add_arg(internal::argument const& a){ + std::pair result = args_map.insert(std::make_pair(a.name(),a)); + if (!result.second){ + throw std::invalid_argument("argument with name: '"+a.name()+"' already registered"); + } + args_display_order.push_back(a.name()); + } + public: + template + cli_argument_pack& arg(type& dest,std::string const& name, std::string const& description, bool(*validate)(const type &)= NULL){ + internal::argument a(name,description,dest,validate); + add_arg(a); + if (internal::is_bool::value()){ + bool_args_names.insert(name); + } + return *this; + } + + //Positional means that argument name can be omitted in actual CL + //only key to match values for parameters with + template + cli_argument_pack& positional_arg(type& dest,std::string const& name, std::string const& description, bool(*validate)(const type &)= NULL){ + internal::argument a(name,description,dest,validate); + add_arg(a); + if (internal::is_bool::value()){ + bool_args_names.insert(name); + } + positional_arg_names.push_back(name); + return *this; + } + + void parse(std::size_t argc, char const* argv[]){ + { + std::size_t current_positional_index=0; + for (std::size_t j=1;jis_matched()){ + throw std::invalid_argument(std::string("several values specified for: '")+pa->name()+"' argument"); + } + pa->parse_and_store(argument_value); + } + } + } + std::string usage_string(const std::string& binary_name)const{ + std::string command_line_params; + std::string summary_description; + + for (args_display_order_type::const_iterator it = args_display_order.begin();it!=args_display_order.end();++it){ + const bool is_bool = (0!=bool_args_names.count((*it))); + args_map_type::const_iterator argument_it = args_map.find(*it); + //TODO: probably use of smarter assert would help here + assert(argument_it!=args_map.end()/*&&"args_display_order and args_map are out of sync"*/); + if (argument_it==args_map.end()){ + throw std::logic_error("args_display_order and args_map are out of sync"); + } + const internal::argument & a = (*argument_it).second; + command_line_params +=" [" + a.name() + (is_bool ?"":"=value")+ "]"; + summary_description +=" " + a.name() + " - " + a.description() +" ("+a.value() +")" + "\n"; + } + + std::string positional_arg_cl; + for (positional_arg_names_type::const_iterator it = positional_arg_names.begin();it!=positional_arg_names.end();++it){ + positional_arg_cl +=" ["+(*it); + } + for (std::size_t i=0;i + bool is_power_of_2( T val ) { + size_t intval = size_t(val); + return (intval&(intval-1)) == size_t(0); + } + int step_function_plus(int previous, double step){ + return static_cast(previous+step); + } + int step_function_multiply(int previous, double multiply){ + return static_cast(previous*multiply); + } + // "Power-of-2 ladder": nsteps is the desired number of steps between any subsequent powers of 2. + // The actual step is the quotient of the nearest smaller power of 2 divided by that number (but at least 1). + // E.g., '1:32:#4' means 1,2,3,4,5,6,7,8,10,12,14,16,20,24,28,32 + int step_function_power2_ladder(int previous, double nsteps){ + int steps = int(nsteps); + assert( is_power_of_2(steps) ); // must be a power of 2 + // The actual step is 1 until the value is twice as big as nsteps + if( previous < 2*steps ) + return previous+1; + // calculate the previous power of 2 + int prev_power2 = previous/2; // start with half the given value + int rshift = 1; // and with the shift of 1; + while( int shifted = prev_power2>>rshift ) { // shift the value right; while the result is non-zero, + prev_power2 |= shifted; // add the bits set in 'shifted'; + rshift <<= 1; // double the shift, as twice as many top bits are set; + } // repeat. + ++prev_power2; // all low bits set; now it's just one less than the desired power of 2 + assert( is_power_of_2(prev_power2) ); + assert( (prev_power2<=previous)&&(2*prev_power2>previous) ); + // The actual step value is the previous power of 2 divided by steps + return previous + (prev_power2/steps); + } + typedef int (* step_function_ptr_type)(int,double); + + struct step_function_descriptor { + char mnemonic; + step_function_ptr_type function; + public: + step_function_descriptor(char a_mnemonic, step_function_ptr_type a_function) : mnemonic(a_mnemonic), function(a_function) {} + private: + void operator=(step_function_descriptor const&); + }; + step_function_descriptor step_function_descriptors[] = { + step_function_descriptor('*',step_function_multiply), + step_function_descriptor('+',step_function_plus), + step_function_descriptor('#',step_function_power2_ladder) + }; + + template + inline size_t array_length(const T(&)[N]) + { + return N; + } + + struct thread_range_step { + step_function_ptr_type step_function; + double step_function_argument; + + thread_range_step ( step_function_ptr_type step_function_, double step_function_argument_) + :step_function(step_function_),step_function_argument(step_function_argument_) + { + if (!step_function_) + throw std::invalid_argument("step_function for thread range step should not be NULL"); + } + int operator()(int previous)const { + assert(0<=previous); // test 0<=first and loop discipline + const int ret = step_function(previous,step_function_argument); + assert(previous>(std::istream& input_stream, thread_range_step& step){ + char function_char; + double function_argument; + input_stream >> function_char >> function_argument; + size_t i = 0; + while ((i= array_length(step_function_descriptors)){ + throw std::invalid_argument("unknown step function mnemonic: "+std::string(1,function_char)); + } else if ((function_char=='#') && !is_power_of_2(function_argument)) { + throw std::invalid_argument("the argument of # should be a power of 2"); + } + step.step_function = step_function_descriptors[i].function; + step.step_function_argument = function_argument; + return input_stream; + } + }; + } // namespace internal + + struct thread_number_range{ + int (*auto_number_of_threads)(); + int first; // 0<=first (0 can be used as a special value) + int last; // first<=last + + internal::thread_range_step step; + + thread_number_range( int (*auto_number_of_threads_)(),int low_=1, int high_=-1 + , internal::thread_range_step step_ = internal::thread_range_step(internal::step_function_power2_ladder,4) + ) + : auto_number_of_threads(auto_number_of_threads_), first(low_), last((high_>-1) ? high_ : auto_number_of_threads_()) + ,step(step_) + { + if (first<0) { + throw std::invalid_argument("negative value not allowed"); + } + if (first>last) { + throw std::invalid_argument("decreasing sequence not allowed"); + } + } + friend std::istream& operator>>(std::istream& i, thread_number_range& range){ + try{ + std::string s; + i>>s; + struct string_to_number_of_threads{ + int auto_value; + string_to_number_of_threads(int auto_value_):auto_value(auto_value_){} + int operator()(const std::string & value)const{ + return (value=="auto")? auto_value : internal::string_to(value); + } + }; + string_to_number_of_threads string_to_number_of_threads(range.auto_number_of_threads()); + int low, high; + std::size_t colon = s.find(':'); + if ( colon == std::string::npos ){ + low = high = string_to_number_of_threads(s); + } else { + //it is a range + std::size_t second_colon = s.find(':',colon+1); + + low = string_to_number_of_threads(std::string(s, 0, colon)); //not copying the colon + high = string_to_number_of_threads(std::string(s, colon+1, second_colon - (colon+1))); //not copying the colons + if (second_colon != std::string::npos){ + internal::string_to(std::string(s,second_colon + 1),range.step); + } + } + range = thread_number_range(range.auto_number_of_threads,low,high,range.step); + }catch(std::invalid_argument&){ + i.setstate(std::ios::failbit); + throw; + } + return i; + } + friend std::ostream& operator<<(std::ostream& o, thread_number_range const& range){ + using namespace internal; + size_t i = 0; + for (; i < array_length(step_function_descriptors) && step_function_descriptors[i].function != range.step.step_function; ++i ) {} + if (i >= array_length(step_function_descriptors)){ + throw std::invalid_argument("unknown step function for thread range"); + } + o<(argv), cli_pack); + } +} + +#endif /* UTILITY_H_ */ diff --git a/xdl/third_party/tbb/examples/concurrent_hash_map/count_strings/Makefile b/xdl/third_party/tbb/examples/concurrent_hash_map/count_strings/Makefile new file mode 100644 index 00000000..f6630b5b --- /dev/null +++ b/xdl/third_party/tbb/examples/concurrent_hash_map/count_strings/Makefile @@ -0,0 +1,59 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +# GNU Makefile that builds and runs example. +run_cmd= +PROG=count_strings +ARGS= +PERF_RUN_ARGS=auto 10000000 silent + +# The C++ compiler +ifneq (,$(shell which icc 2>/dev/null)) +CXX=icc +endif # icc + +ifeq ($(shell uname), Linux) +ifeq ($(target), android) +LIBS+= --sysroot=$(SYSROOT) +run_cmd=../../common/android.linux.launcher.sh +else +LIBS+= -lrt +endif +else ifeq ($(shell uname), Darwin) +override CXXFLAGS += -Wl,-rpath,$(TBBROOT)/lib +endif + +all: release test + +release: *.cpp + $(CXX) -O2 -DNDEBUG $(CXXFLAGS) -o $(PROG) $^ -ltbb $(LIBS) + +debug: *.cpp + $(CXX) -O0 -g -DTBB_USE_DEBUG $(CXXFLAGS) -o $(PROG) $^ -ltbb_debug $(LIBS) + +clean: + $(RM) $(PROG) *.o *.d + +test: + $(run_cmd) ./$(PROG) $(ARGS) + +perf_build: release + +perf_run: + $(run_cmd) ./$(PROG) $(PERF_RUN_ARGS) + diff --git a/xdl/third_party/tbb/examples/concurrent_hash_map/count_strings/Makefile.windows b/xdl/third_party/tbb/examples/concurrent_hash_map/count_strings/Makefile.windows new file mode 100644 index 00000000..871cfd55 --- /dev/null +++ b/xdl/third_party/tbb/examples/concurrent_hash_map/count_strings/Makefile.windows @@ -0,0 +1,51 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +# Common Makefile that builds and runs example. + +# Just specify your program basename +PROG=Count_Strings +ARGS= +PERF_RUN_ARGS=auto 10000000 silent + +# The C++ compiler options + +# Trying to find if icl.exe is set +CXX1 = $(TBB_CXX)- +CXX2 = $(CXX1:icl.exe-=icl.exe) +CXX = $(CXX2:-=cl.exe) + +MYCXXFLAGS = /TP /EHsc /W3 /nologo /D _CONSOLE /D _MBCS /D WIN32 $(CXXFLAGS) +MYLDFLAGS =/INCREMENTAL:NO /NOLOGO /DEBUG /FIXED:NO $(LDFLAGS) + +all: release test +release: compiler_check + $(CXX) *.cpp /MD /O2 /D NDEBUG $(MYCXXFLAGS) /link tbb.lib $(LIBS) $(MYLDFLAGS) /OUT:$(PROG).exe +debug: compiler_check + $(CXX) *.cpp /MDd /Od /Zi /D TBB_USE_DEBUG /D _DEBUG $(MYCXXFLAGS) /link tbb_debug.lib $(LIBS) $(MYLDFLAGS) /OUT:$(PROG).exe +clean: + @cmd.exe /C del $(PROG).exe *.obj *.?db *.manifest +test: + $(PROG) $(ARGS) +compiler_check: + @echo compiler_test>compiler_test && @$(CXX) /E compiler_test >nul 2>&1 || echo "$(CXX) command not found. Check if CXX=$(CXX) is set properly" + @cmd.exe /C del compiler_test +perf_build: release +perf_run: + $(PROG) $(PERF_RUN_ARGS) + diff --git a/xdl/third_party/tbb/examples/concurrent_hash_map/count_strings/count_strings.cpp b/xdl/third_party/tbb/examples/concurrent_hash_map/count_strings/count_strings.cpp new file mode 100644 index 00000000..779ac7d2 --- /dev/null +++ b/xdl/third_party/tbb/examples/concurrent_hash_map/count_strings/count_strings.cpp @@ -0,0 +1,235 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +// Workaround for ICC 11.0 not finding __sync_fetch_and_add_4 on some of the Linux platforms. +#if __linux__ && defined(__INTEL_COMPILER) +#define __sync_fetch_and_add(ptr,addend) _InterlockedExchangeAdd(const_cast(reinterpret_cast(ptr)), addend) +#endif +#include +#include +#include +#include +#include +#include "tbb/concurrent_hash_map.h" +#include "tbb/blocked_range.h" +#include "tbb/parallel_for.h" +#include "tbb/tick_count.h" +#include "tbb/task_scheduler_init.h" +#include "tbb/tbb_allocator.h" +#include "../../common/utility/utility.h" + + +//! String type with scalable allocator. +/** On platforms with non-scalable default memory allocators, the example scales + better if the string allocator is changed to tbb::tbb_allocator. */ +typedef std::basic_string,tbb::tbb_allocator > MyString; + +using namespace tbb; +using namespace std; + +//! Set to true to counts. +static bool verbose = false; +static bool silent = false; +//! Problem size +long N = 1000000; +const int size_factor = 2; + +//! A concurrent hash table that maps strings to ints. +typedef concurrent_hash_map StringTable; + +//! Function object for counting occurrences of strings. +struct Tally { + StringTable& table; + Tally( StringTable& table_ ) : table(table_) {} + void operator()( const blocked_range range ) const { + for( MyString* p=range.begin(); p!=range.end(); ++p ) { + StringTable::accessor a; + table.insert( a, *p ); + a->second += 1; + } + } +}; + +static MyString* Data; + +static void CountOccurrences(int nthreads) { + StringTable table; + + tick_count t0 = tick_count::now(); + parallel_for( blocked_range( Data, Data+N, 1000 ), Tally(table) ); + tick_count t1 = tick_count::now(); + + int n = 0; + for( StringTable::iterator i=table.begin(); i!=table.end(); ++i ) { + if( verbose && nthreads ) + printf("%s %d\n",i->first.c_str(),i->second); + n += i->second; + } + + if ( !silent ) printf("total = %d unique = %u time = %g\n", n, unsigned(table.size()), (t1-t0).seconds()); +} + +/// Generator of random words + +struct Sound { + const char *chars; + int rates[3];// beginning, middle, ending +}; +Sound Vowels[] = { + {"e", {445,6220,1762}}, {"a", {704,5262,514}}, {"i", {402,5224,162}}, {"o", {248,3726,191}}, + {"u", {155,1669,23}}, {"y", {4,400,989}}, {"io", {5,512,18}}, {"ia", {1,329,111}}, + {"ea", {21,370,16}}, {"ou", {32,298,4}}, {"ie", {0,177,140}}, {"ee", {2,183,57}}, + {"ai", {17,206,7}}, {"oo", {1,215,7}}, {"au", {40,111,2}}, {"ua", {0,102,4}}, + {"ui", {0,104,1}}, {"ei", {6,94,3}}, {"ue", {0,67,28}}, {"ay", {1,42,52}}, + {"ey", {1,14,80}}, {"oa", {5,84,3}}, {"oi", {2,81,1}}, {"eo", {1,71,5}}, + {"iou", {0,61,0}}, {"oe", {2,46,9}}, {"eu", {12,43,0}}, {"iu", {0,45,0}}, + {"ya", {12,19,5}}, {"ae", {7,18,10}}, {"oy", {0,10,13}}, {"ye", {8,7,7}}, + {"ion", {0,0,20}}, {"ing", {0,0,20}}, {"ium", {0,0,10}}, {"er", {0,0,20}} +}; +Sound Consonants[] = { + {"r", {483,1414,1110}}, {"n", {312,1548,1114}}, {"t", {363,1653,251}}, {"l", {424,1341,489}}, + {"c", {734,735,260}}, {"m", {732,785,161}}, {"d", {558,612,389}}, {"s", {574,570,405}}, + {"p", {519,361,98}}, {"b", {528,356,30}}, {"v", {197,598,16}}, {"ss", {3,191,567}}, + {"g", {285,430,42}}, {"st", {142,323,180}}, {"h", {470,89,30}}, {"nt", {0,350,231}}, + {"ng", {0,117,442}}, {"f", {319,194,19}}, {"ll", {1,414,83}}, {"w", {249,131,64}}, + {"k", {154,179,47}}, {"nd", {0,279,92}}, {"bl", {62,235,0}}, {"z", {35,223,16}}, + {"sh", {112,69,79}}, {"ch", {139,95,25}}, {"th", {70,143,39}}, {"tt", {0,219,19}}, + {"tr", {131,104,0}}, {"pr", {186,41,0}}, {"nc", {0,223,2}}, {"j", {184,32,1}}, + {"nn", {0,188,20}}, {"rt", {0,148,51}}, {"ct", {0,160,29}}, {"rr", {0,182,3}}, + {"gr", {98,87,0}}, {"ck", {0,92,86}}, {"rd", {0,81,88}}, {"x", {8,102,48}}, + {"ph", {47,101,10}}, {"br", {115,43,0}}, {"cr", {92,60,0}}, {"rm", {0,131,18}}, + {"ns", {0,124,18}}, {"sp", {81,55,4}}, {"sm", {25,29,85}}, {"sc", {53,83,1}}, + {"rn", {0,100,30}}, {"cl", {78,42,0}}, {"mm", {0,116,0}}, {"pp", {0,114,2}}, + {"mp", {0,99,14}}, {"rs", {0,96,16}}, /*{"q", {52,57,1}},*/ {"rl", {0,97,7}}, + {"rg", {0,81,15}}, {"pl", {56,39,0}}, {"sn", {32,62,1}}, {"str", {38,56,0}}, + {"dr", {47,44,0}}, {"fl", {77,13,1}}, {"fr", {77,11,0}}, {"ld", {0,47,38}}, + {"ff", {0,62,20}}, {"lt", {0,61,19}}, {"rb", {0,75,4}}, {"mb", {0,72,7}}, + {"rc", {0,76,1}}, {"gg", {0,74,1}}, {"pt", {1,56,10}}, {"bb", {0,64,1}}, + {"sl", {48,17,0}}, {"dd", {0,59,2}}, {"gn", {3,50,4}}, {"rk", {0,30,28}}, + {"nk", {0,35,20}}, {"gl", {40,14,0}}, {"wh", {45,6,0}}, {"ntr", {0,50,0}}, + {"rv", {0,47,1}}, {"ght", {0,19,29}}, {"sk", {23,17,5}}, {"nf", {0,46,0}}, + {"cc", {0,45,0}}, {"ln", {0,41,0}}, {"sw", {36,4,0}}, {"rp", {0,36,4}}, + {"dn", {0,38,0}}, {"ps", {14,19,5}}, {"nv", {0,38,0}}, {"tch", {0,21,16}}, + {"nch", {0,26,11}}, {"lv", {0,35,0}}, {"wn", {0,14,21}}, {"rf", {0,32,3}}, + {"lm", {0,30,5}}, {"dg", {0,34,0}}, {"ft", {0,18,15}}, {"scr", {23,10,0}}, + {"rch", {0,24,6}}, {"rth", {0,23,7}}, {"rh", {13,15,0}}, {"mpl", {0,29,0}}, + {"cs", {0,1,27}}, {"gh", {4,10,13}}, {"ls", {0,23,3}}, {"ndr", {0,25,0}}, + {"tl", {0,23,1}}, {"ngl", {0,25,0}}, {"lk", {0,15,9}}, {"rw", {0,23,0}}, + {"lb", {0,23,1}}, {"tw", {15,8,0}}, /*{"sq", {15,8,0}},*/ {"chr", {18,4,0}}, + {"dl", {0,23,0}}, {"ctr", {0,22,0}}, {"nst", {0,21,0}}, {"lc", {0,22,0}}, + {"sch", {16,4,0}}, {"ths", {0,1,20}}, {"nl", {0,21,0}}, {"lf", {0,15,6}}, + {"ssn", {0,20,0}}, {"xt", {0,18,1}}, {"xp", {0,20,0}}, {"rst", {0,15,5}}, + {"nh", {0,19,0}}, {"wr", {14,5,0}} +}; +const int VowelsNumber = sizeof(Vowels)/sizeof(Sound); +const int ConsonantsNumber = sizeof(Consonants)/sizeof(Sound); +int VowelsRatesSum[3] = {0,0,0}, ConsonantsRatesSum[3] = {0,0,0}; + +int CountRateSum(Sound sounds[], const int num, const int part) +{ + int sum = 0; + for(int i = 0; i < num; i++) + sum += sounds[i].rates[part]; + return sum; +} + +const char *GetLetters(int type, const int part) +{ + Sound *sounds; int rate, i = 0; + if(type & 1) + sounds = Vowels, rate = rand() % VowelsRatesSum[part]; + else + sounds = Consonants, rate = rand() % ConsonantsRatesSum[part]; + do { + rate -= sounds[i++].rates[part]; + } while(rate > 0); + return sounds[--i].chars; +} + +static void CreateData() { + for(int i = 0; i < 3; i++) { + ConsonantsRatesSum[i] = CountRateSum(Consonants, ConsonantsNumber, i); + VowelsRatesSum[i] = CountRateSum(Vowels, VowelsNumber, i); + } + for( int i=0; i + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + count_strings + {3AA40693-F93D-4D4B-B32E-068F511A252C} + count_strings + Win32Proj + + + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.40219.1 + $(TEMP)\tbb_examples\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Configuration)\ + false + $(TEMP)\tbb_examples\$(Platform)\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Platform)\$(Configuration)\ + false + $(TEMP)\tbb_examples\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Configuration)\ + false + $(TEMP)\tbb_examples\$(Platform)\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Platform)\$(Configuration)\ + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG;%(PreprocessorDefinitions) + MultiThreadedDebugDLL + + + ProgramDatabase + + + tbb_debug.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc12;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc12;%(AdditionalLibraryDirectories) + true + Console + MachineX86 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 debug "$(OutDir)" + + + + + X64 + + + Disabled + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG;%(PreprocessorDefinitions) + MultiThreadedDebugDLL + + + ProgramDatabase + + + tbb_debug.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc12;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc12;%(AdditionalLibraryDirectories) + true + Console + MachineX64 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 debug "$(OutDir)" + + + + + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + + + ProgramDatabase + + + tbb.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc12;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc12;%(AdditionalLibraryDirectories) + true + Console + true + true + MachineX86 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 release "$(OutDir)" + + + + + X64 + + + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + + + ProgramDatabase + + + tbb.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc12;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc12;%(AdditionalLibraryDirectories) + true + Console + true + true + MachineX64 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 release "$(OutDir)" + + + + + + + + + + + + \ No newline at end of file diff --git a/xdl/third_party/tbb/examples/concurrent_hash_map/count_strings/readme.html b/xdl/third_party/tbb/examples/concurrent_hash_map/count_strings/readme.html new file mode 100644 index 00000000..9ed9d934 --- /dev/null +++ b/xdl/third_party/tbb/examples/concurrent_hash_map/count_strings/readme.html @@ -0,0 +1,401 @@ + + + + + + Intel® Threading Building Blocks. Count_strings sample + + + + + +

+ The example counts the number of unique words in a text. +

+ +
+
System Requirements
+ +
+

+ For the most up to date system requirements, see the release notes. +

+
+
+ +
+
Files
+ +
+
+
count_strings.cpp +
Source code for the example. +
Makefile +
Makefile for building the example. +
+
+
+ +
+
Directories
+ +
+
+
msvs +
Contains Microsoft* Visual Studio* workspace for building and running the example (Windows* systems only). +
xcode +
Contains Xcode* IDE workspace for building and running the example (macOS* systems only). +
+

For information about the minimum supported version of IDE, see release notes.

+
+
+ +
+
Build instructions
+ +
+

+ General build directions can be found here. +

+
+
+ +
+
Usage
+ +
+
+
count_strings -h +
Prints the help for command line options +
count_strings [n-of-threads=value] [n-of-strings=value] [verbose] [silent] +
count_strings [n-of-threads [n-of-strings]] [verbose] [silent] +
n-of-threads is the number of threads to use; a range of the form low[:high], where low and optional high are non-negative integers or 'auto' for a platform-specific default number.
+ n-of-strings is a number of strings.
+ verbose - enables printing of extra information during execution.
+ silent - no output except elapsed time.
+
To run a short version of this example, e.g., for use with Intel® Parallel Inspector: +
Build a debug version of the example. +
Run it with a small number of strings and the desired number of threads, e.g., count_strings 2 10000. +
+
+
+ +
+ Up to parent directory +
+
+
Legal Information
+ +
+

+ Intel and the Intel logo are trademarks of Intel Corporation in the U.S. and/or other countries. +
* Other names and brands may be claimed as the property of others. +
© 2018, Intel Corporation +

+
+
+ + + diff --git a/xdl/third_party/tbb/examples/concurrent_hash_map/count_strings/xcode/count_strings.xcodeproj/project.pbxproj b/xdl/third_party/tbb/examples/concurrent_hash_map/count_strings/xcode/count_strings.xcodeproj/project.pbxproj new file mode 100644 index 00000000..44900a5f --- /dev/null +++ b/xdl/third_party/tbb/examples/concurrent_hash_map/count_strings/xcode/count_strings.xcodeproj/project.pbxproj @@ -0,0 +1,310 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + A1F593A60B8F042A00073279 /* count_strings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F593A50B8F042A00073279 /* count_strings.cpp */; }; +/* End PBXBuildFile section */ + +/* Begin PBXBuildRule section */ + C3C5894B218B547B00DAC94C /* PBXBuildRule */ = { + isa = PBXBuildRule; + compilerSpec = com.intel.compilers.icc.latest; + fileType = sourcecode.cpp; + isEditable = 1; + outputFiles = ( + ); + script = "# Type a script or drag a script file from your workspace to insert its path.\n"; + }; +/* End PBXBuildRule section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 8DD76F690486A84900D96B5E /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 12; + dstPath = ""; + dstSubfolderSpec = 16; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 8DD76F6C0486A84900D96B5E /* count_strings */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = count_strings; sourceTree = BUILT_PRODUCTS_DIR; }; + A1F593A50B8F042A00073279 /* count_strings.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = count_strings.cpp; path = ../count_strings.cpp; sourceTree = SOURCE_ROOT; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 8DD76F660486A84900D96B5E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 08FB7794FE84155DC02AAC07 /* count_strings */ = { + isa = PBXGroup; + children = ( + 08FB7795FE84155DC02AAC07 /* Source */, + 1AB674ADFE9D54B511CA2CBB /* Products */, + ); + name = count_strings; + sourceTree = ""; + }; + 08FB7795FE84155DC02AAC07 /* Source */ = { + isa = PBXGroup; + children = ( + A1F593A50B8F042A00073279 /* count_strings.cpp */, + ); + name = Source; + sourceTree = ""; + }; + 1AB674ADFE9D54B511CA2CBB /* Products */ = { + isa = PBXGroup; + children = ( + 8DD76F6C0486A84900D96B5E /* count_strings */, + ); + name = Products; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 8DD76F620486A84900D96B5E /* count_strings */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "count_strings" */; + buildPhases = ( + 8DD76F640486A84900D96B5E /* Sources */, + 8DD76F660486A84900D96B5E /* Frameworks */, + 8DD76F690486A84900D96B5E /* CopyFiles */, + ); + buildRules = ( + C3C5894B218B547B00DAC94C /* PBXBuildRule */, + ); + dependencies = ( + ); + name = count_strings; + productInstallPath = "$(HOME)/bin"; + productName = count_strings; + productReference = 8DD76F6C0486A84900D96B5E /* count_strings */; + productType = "com.apple.product-type.tool"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 08FB7793FE84155DC02AAC07 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1000; + }; + buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "count_strings" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 1; + knownRegions = ( + en, + ); + mainGroup = 08FB7794FE84155DC02AAC07 /* count_strings */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 8DD76F620486A84900D96B5E /* count_strings */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + 8DD76F640486A84900D96B5E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + A1F593A60B8F042A00073279 /* count_strings.cpp in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + A1F593C60B8F0E6E00073279 /* Debug64 */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_VERSION = ""; + HEADER_SEARCH_PATHS = "$(inherited)"; + INSTALL_PATH = "$(HOME)/bin"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited)"; + LIBRARY_SEARCH_PATHS = "$(inherited)"; + PRODUCT_NAME = count_strings; + ZERO_LINK = NO; + }; + name = Debug64; + }; + A1F593C70B8F0E6E00073279 /* Release64 */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_GENERATE_DEBUGGING_SYMBOLS = NO; + GCC_VERSION = ""; + HEADER_SEARCH_PATHS = "$(inherited)"; + INSTALL_PATH = "$(HOME)/bin"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited)"; + LIBRARY_SEARCH_PATHS = "$(inherited)"; + PRODUCT_NAME = count_strings; + ZERO_LINK = NO; + }; + name = Release64; + }; + A1F593C80B8F0E6E00073279 /* Debug64 */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_ENABLE_CPP_RTTI = YES; + GCC_MODEL_TUNING = ""; + GCC_NO_COMMON_BLOCKS = YES; + GCC_VERSION = ""; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(TBBROOT)/include", + /opt/intel/tbb/include, + ); + ICC_CXX_LANG_DIALECT = "c++11"; + LD_RUNPATH_SEARCH_PATHS = "$(TBBROOT)/lib /opt/intel/tbb/lib"; + LIBRARY_SEARCH_PATHS = ( + "$(TBBROOT)/lib", + /opt/intel/tbb/lib, + ); + MACOSX_DEPLOYMENT_TARGET = 10.11; + ONLY_ACTIVE_ARCH = YES; + OTHER_CPLUSPLUSFLAGS = ( + "$(OTHER_CFLAGS)", + "-m64", + ); + OTHER_LDFLAGS = ( + "-m64", + "-ltbb_debug", + ); + PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO; + SYMROOT = "/tmp/tbb-$(USER)"; + VALID_ARCHS = x86_64; + }; + name = Debug64; + }; + A1F593C90B8F0E6E00073279 /* Release64 */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_ENABLE_CPP_RTTI = YES; + GCC_MODEL_TUNING = ""; + GCC_NO_COMMON_BLOCKS = YES; + GCC_VERSION = ""; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(TBBROOT)/include", + /opt/intel/tbb/include, + ); + ICC_CXX_LANG_DIALECT = "c++11"; + LD_RUNPATH_SEARCH_PATHS = "$(TBBROOT)/lib /opt/intel/tbb/lib"; + LIBRARY_SEARCH_PATHS = ( + "$(TBBROOT)/lib", + /opt/intel/tbb/lib, + ); + MACOSX_DEPLOYMENT_TARGET = 10.11; + OTHER_CPLUSPLUSFLAGS = ( + "$(OTHER_CFLAGS)", + "-m64", + ); + OTHER_LDFLAGS = ( + "-m64", + "-ltbb", + ); + PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO; + SYMROOT = "/tmp/tbb-$(USER)"; + VALID_ARCHS = x86_64; + }; + name = Release64; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "count_strings" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A1F593C60B8F0E6E00073279 /* Debug64 */, + A1F593C70B8F0E6E00073279 /* Release64 */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug64; + }; + 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "count_strings" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A1F593C80B8F0E6E00073279 /* Debug64 */, + A1F593C90B8F0E6E00073279 /* Release64 */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug64; + }; +/* End XCConfigurationList section */ + }; + rootObject = 08FB7793FE84155DC02AAC07 /* Project object */; +} diff --git a/xdl/third_party/tbb/examples/concurrent_hash_map/index.html b/xdl/third_party/tbb/examples/concurrent_hash_map/index.html new file mode 100644 index 00000000..78521f71 --- /dev/null +++ b/xdl/third_party/tbb/examples/concurrent_hash_map/index.html @@ -0,0 +1,344 @@ + + + + + + Intel® Threading Building Blocks. Samples on concurrent_hash_map container + + + + + +

+ This directory has examples of the concurrent_hash_map container. +

+ +
+
Directories
+ +
+
+
count_strings +
Concurrently inserts strings into a concurrent_hash_map container. +
+
+
+
+ Up to parent directory +
+
+
Legal Information:
+ +
+

+ Intel and the Intel logo are trademarks of Intel Corporation in the U.S. and/or other countries. +
* Other names and brands may be claimed as the property of others. +
© 2018, Intel Corporation +

+
+
+ + + diff --git a/xdl/third_party/tbb/examples/concurrent_priority_queue/index.html b/xdl/third_party/tbb/examples/concurrent_priority_queue/index.html new file mode 100644 index 00000000..6e769e31 --- /dev/null +++ b/xdl/third_party/tbb/examples/concurrent_priority_queue/index.html @@ -0,0 +1,344 @@ + + + + + + Intel® Threading Building Blocks. Samples on concurrent_priority_queue container + + + + + +

+ This directory has examples of the concurrent_priority_queue container. +

+ +
+
Directories
+ +
+
+
shortpath +
Solves the single source shortest path problem using a concurrent_priority_queue container. +
+
+
+
+ Up to parent directory +
+
+
Legal Information:
+ +
+

+ Intel and the Intel logo are trademarks of Intel Corporation in the U.S. and/or other countries. +
* Other names and brands may be claimed as the property of others. +
© 2018, Intel Corporation +

+
+
+ + + diff --git a/xdl/third_party/tbb/examples/concurrent_priority_queue/shortpath/Makefile b/xdl/third_party/tbb/examples/concurrent_priority_queue/shortpath/Makefile new file mode 100644 index 00000000..6aa7e91c --- /dev/null +++ b/xdl/third_party/tbb/examples/concurrent_priority_queue/shortpath/Makefile @@ -0,0 +1,61 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +# GNU Makefile that builds and runs example. +run_cmd= +PROG=shortpath +ARGS=4 N=1000 start=0 end=999 verbose +PERF_RUN_ARGS=auto N=1000 start=0 end=99 silent + +# icpc by default +ifneq (,$(shell which icc 2>/dev/null)) + CXX=icpc +endif + +# autodetect C++11 support +include ../../common/examples-common.inc + +ifeq ($(shell uname), Linux) +ifeq ($(target), android) +LIBS+= --sysroot=$(SYSROOT) +run_cmd=../../common/android.linux.launcher.sh +else +LIBS+= -lrt +endif +else ifeq ($(shell uname), Darwin) +override CXXFLAGS += -Wl,-rpath,$(TBBROOT)/lib +endif + +all: release test + +release: *.cpp + $(CXX) -O2 -DNDEBUG $(CXXFLAGS) -o $(PROG) $^ -ltbb $(LIBS) $(CXX0XFLAGS) + +debug: *.cpp + $(CXX) -O0 -g -DTBB_USE_DEBUG $(CXXFLAGS) -o $(PROG) $^ -ltbb_debug $(LIBS) $(CXX0XFLAGS) + +clean: + $(RM) $(PROG) *.o *.d + +test: + $(run_cmd) ./$(PROG) $(ARGS) + +perf_build: release + +perf_run: + $(run_cmd) ./$(PROG) $(PERF_RUN_ARGS) diff --git a/xdl/third_party/tbb/examples/concurrent_priority_queue/shortpath/Makefile.windows b/xdl/third_party/tbb/examples/concurrent_priority_queue/shortpath/Makefile.windows new file mode 100644 index 00000000..be78d4c0 --- /dev/null +++ b/xdl/third_party/tbb/examples/concurrent_priority_queue/shortpath/Makefile.windows @@ -0,0 +1,50 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +# Common Makefile that builds and runs example. + +# Just specify your program basename +PROG=shortpath +ARGS=4 N=1000 start=0 end=999 verbose +PERF_RUN_ARGS=auto N=1000 start=0 end=99 silent + +# Trying to find if icl.exe is set +CXX1 = $(TBB_CXX)- +CXX2 = $(CXX1:icl.exe-=icl.exe) +CXX = $(CXX2:-=cl.exe) + +# The C++ compiler options +MYCXXFLAGS = /TP /EHsc /W3 /nologo /D _CONSOLE /D _MBCS /D WIN32 /D _CRT_SECURE_NO_DEPRECATE $(CXXFLAGS) +MYLDFLAGS =/INCREMENTAL:NO /NOLOGO /DEBUG /FIXED:NO $(LDFLAGS) + +all: release test +release: + $(CXX) *.cpp /MD /O2 /D NDEBUG $(MYCXXFLAGS) /link tbb.lib $(LIBS) $(MYLDFLAGS) /OUT:$(PROG).exe +debug: + $(CXX) *.cpp /MDd /Od /Zi /D TBB_USE_DEBUG /D _DEBUG $(MYCXXFLAGS) /link tbb_debug.lib $(LIBS) $(MYLDFLAGS) /OUT:$(PROG).exe +clean: + @cmd.exe /C del $(PROG).exe *.obj *.?db *.manifest +test: + $(PROG) $(ARGS) +compiler_check: + @$(CXX) >nul 2>&1 || echo "$(CXX) command not found. Check if CXX=$(CXX) is set properly" + +perf_build: release + +perf_run: + $(PROG) $(PERF_RUN_ARGS) diff --git a/xdl/third_party/tbb/examples/concurrent_priority_queue/shortpath/msvs/shortpath.sln b/xdl/third_party/tbb/examples/concurrent_priority_queue/shortpath/msvs/shortpath.sln new file mode 100644 index 00000000..c4c6ba27 --- /dev/null +++ b/xdl/third_party/tbb/examples/concurrent_priority_queue/shortpath/msvs/shortpath.sln @@ -0,0 +1,28 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.40629.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "shortpath", "shortpath.vcxproj", "{3AA40693-F93D-4D4B-B32E-068F511A252A}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {3AA40693-F93D-4D4B-B32E-068F511A252A}.Debug|Win32.ActiveCfg = Debug|Win32 + {3AA40693-F93D-4D4B-B32E-068F511A252A}.Debug|Win32.Build.0 = Debug|Win32 + {3AA40693-F93D-4D4B-B32E-068F511A252A}.Debug|x64.ActiveCfg = Debug|x64 + {3AA40693-F93D-4D4B-B32E-068F511A252A}.Debug|x64.Build.0 = Debug|x64 + {3AA40693-F93D-4D4B-B32E-068F511A252A}.Release|Win32.ActiveCfg = Release|Win32 + {3AA40693-F93D-4D4B-B32E-068F511A252A}.Release|Win32.Build.0 = Release|Win32 + {3AA40693-F93D-4D4B-B32E-068F511A252A}.Release|x64.ActiveCfg = Release|x64 + {3AA40693-F93D-4D4B-B32E-068F511A252A}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/xdl/third_party/tbb/examples/concurrent_priority_queue/shortpath/msvs/shortpath.vcxproj b/xdl/third_party/tbb/examples/concurrent_priority_queue/shortpath/msvs/shortpath.vcxproj new file mode 100644 index 00000000..22aed9c8 --- /dev/null +++ b/xdl/third_party/tbb/examples/concurrent_priority_queue/shortpath/msvs/shortpath.vcxproj @@ -0,0 +1,201 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + shortpath + {3AA40693-F93D-4D4B-B32E-068F511A252A} + shortpath + Win32Proj + + + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.40219.1 + $(TEMP)\tbb_examples\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Configuration)\ + false + $(TEMP)\tbb_examples\$(Platform)\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Platform)\$(Configuration)\ + false + $(TEMP)\tbb_examples\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Configuration)\ + false + $(TEMP)\tbb_examples\$(Platform)\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Platform)\$(Configuration)\ + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG;%(PreprocessorDefinitions) + MultiThreadedDebugDLL + + + ProgramDatabase + + + tbb_debug.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc12;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc12;%(AdditionalLibraryDirectories) + true + Console + MachineX86 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 debug "$(OutDir)" + + + + + X64 + + + Disabled + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG;%(PreprocessorDefinitions) + MultiThreadedDebugDLL + + + ProgramDatabase + + + tbb_debug.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc12;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc12;%(AdditionalLibraryDirectories) + true + Console + MachineX64 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 debug "$(OutDir)" + + + + + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + + + ProgramDatabase + + + tbb.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc12;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc12;%(AdditionalLibraryDirectories) + true + Console + true + true + MachineX86 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 release "$(OutDir)" + + + + + X64 + + + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + + + ProgramDatabase + + + tbb.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc12;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc12;%(AdditionalLibraryDirectories) + true + Console + true + true + MachineX64 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 release "$(OutDir)" + + + + + + + + + + + + \ No newline at end of file diff --git a/xdl/third_party/tbb/examples/concurrent_priority_queue/shortpath/readme.html b/xdl/third_party/tbb/examples/concurrent_priority_queue/shortpath/readme.html new file mode 100644 index 00000000..dd730e88 --- /dev/null +++ b/xdl/third_party/tbb/examples/concurrent_priority_queue/shortpath/readme.html @@ -0,0 +1,427 @@ + + + + + + Intel® Threading Building Blocks. Shortpath sample + + + + + +

+ This directory contains a simple example that solves the single source + shortest path problem. +

+ It is parameterized by N, a number of nodes, and a start and end node in [0..N). + A graph is generated with N nodes and some random number of connections between those nodes. + A parallel algorithm based on A* is used to find the shortest path. +

+ This algorithm varies from serial A* in that it needs to add nodes back to + the open set when the g estimate (shortest path from start to the node) is improved, + even if the node has already been "visited". This is because nodes are added and removed + from the open-set in parallel, resulting in some less optimal paths being explored. + The open-set is implemented with the concurrent_priority_queue. +

+ Note that since we re-visit nodes, the f estimate (on which the priority queue is sorted) + is not technically needed, so we could use this same parallel algorithm with just a concurrent_queue. + However, keeping the f estimate and using concurrent_priority_queue + results in much better performance. +

+ Silent mode prints run time only, + regular mode prints the shortest path length, + and verbose mode prints out the shortest path. +

+ The generated graph follows a pattern in which the closer two pairs of + node ids are together, the fewer hops there are in a typical path + between those nodes. So, for example, the path between 5 and 7 likely + has few hops whereas 14 to 78 has more and 0 to 9999 has even more, + etc. +

+ +
+
System Requirements
+ +
+

+ For the most up to date system requirements, see the release notes. +

+
+
+ +
+
Files
+ +
+
+
shortpath.cpp +
Driver. +
Makefile +
Makefile for building the example. +
+
+
+ +
+
Directories
+ +
+
+
msvs +
Contains Microsoft* Visual Studio* workspace for building and running the example with the Intel® C++ Compiler (Windows* systems only). +
xcode +
Contains macOS* Xcode* workspace for building and running the example (macOS* systems only). +
+

For information about the minimum supported version of IDE, see release notes.

+
+
+ +
+
Build instructions
+ +
+

General build directions can be found here.

+
+
+ +
+
Usage
+ +
+
+
shortpath -h +
Prints the help for command line options +
shortpath [#threads=value] [verbose] [silent] [N=value] [start=value] [end=value] [#threads] +
#threads is the number of threads to use; a range of the form low[:high] where low and optional high are non-negative integers, or 'auto' for a platform-specific default number.
+ verbose print full path to screen
+ silent limits output to timing info; overrides verbose
+ N number of nodes in graph
+ start node to start path at
+ end node to end path at
+
To run a short version of this example, e.g., for use with Intel® Parallel Inspector: +
Build a debug version of the example + (see the build instructions). +
Run it with a small problem size and the desired number of threads, e.g., shortpath 4 N=20 start=0 end=19. +
+
+
+ +
+ Up to parent directory +
+
+
Legal Information
+ +
+

+ Intel and the Intel logo are trademarks of Intel Corporation in the U.S. and/or other countries. +
* Other names and brands may be claimed as the property of others. +
© 2018, Intel Corporation +

+
+
+ + + diff --git a/xdl/third_party/tbb/examples/concurrent_priority_queue/shortpath/shortpath.cpp b/xdl/third_party/tbb/examples/concurrent_priority_queue/shortpath/shortpath.cpp new file mode 100644 index 00000000..0d380c85 --- /dev/null +++ b/xdl/third_party/tbb/examples/concurrent_priority_queue/shortpath/shortpath.cpp @@ -0,0 +1,369 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +#include +#include +#include + +#include "tbb/atomic.h" +#include "tbb/tick_count.h" +#include "tbb/task_scheduler_init.h" +#include "tbb/task_group.h" +#include "tbb/concurrent_priority_queue.h" +#include "tbb/spin_mutex.h" +#include "tbb/parallel_for.h" +#include "tbb/blocked_range.h" +#include "../../common/utility/utility.h" +#include "../../common/utility/fast_random.h" + +#if defined(_MSC_VER) && defined(_Wp64) + // Workaround for overzealous compiler warnings in /Wp64 mode + #pragma warning (disable: 4267) +#endif /* _MSC_VER && _Wp64 */ + +using namespace std; +using namespace tbb; + +struct point { + double x, y; + point() {} + point(double _x, double _y) : x(_x), y(_y) {} + point(const point& p) : x(p.x), y(p.y) {} +}; + +double get_distance(const point& p1, const point& p2) { + double xdiff=p1.x-p2.x, ydiff=p1.y-p2.y; + return sqrt(xdiff*xdiff + ydiff*ydiff); +} + +// generates random points on 2D plane within a box of maxsize width & height +point generate_random_point(utility::FastRandom& mr) { + const size_t maxsize=500; + double x = (double)(mr.get() % maxsize); + double y = (double)(mr.get() % maxsize); + return point(x,y); +} + +// weighted toss makes closer nodes (in the point vector) heavily connected +bool die_toss(size_t a, size_t b, utility::FastRandom& mr) { + int node_diff = std::abs((int)(a-b)); + // near nodes + if (node_diff < 16) return true; + // mid nodes + if (node_diff < 64) return ((int)mr.get() % 8 == 0); + // far nodes + if (node_diff < 512) return ((int)mr.get() % 16 == 0); + return false; +} + +typedef vector point_set; +typedef size_t vertex_id; +typedef std::pair vertex_rec; +typedef vector > edge_set; + +bool verbose = false; // prints bin details and other diagnostics to screen +bool silent = false; // suppress all output except for time +size_t N = 1000; // number of vertices +size_t src = 0; // start of path +size_t dst = N-1; // end of path +double INF=100000.0; // infinity +size_t grainsize = 16; // number of vertices per task on average +size_t max_spawn; // max tasks to spawn +tbb::atomic num_spawn; // number of active tasks + +point_set vertices; // vertices +edge_set edges; // edges +vector predecessor; // for recreating path from src to dst + +vector f_distance; // estimated distances at particular vertex +vector g_distance; // current shortest distances from src vertex +spin_mutex *locks; // a lock for each vertex +task_group *sp_group; // task group for tasks executing sub-problems + +class compare_f { +public: + bool operator()(const vertex_rec& u, const vertex_rec& v) const { + return u.second>v.second; + } +}; + +concurrent_priority_queue open_set; // tentative vertices + +void shortpath_helper(); + +#if !__TBB_CPP11_LAMBDAS_PRESENT +class shortpath_helper_functor { +public: + shortpath_helper_functor() {}; + void operator() () const { shortpath_helper(); } +}; +#endif + +void shortpath() { + sp_group = new task_group; + g_distance[src] = 0.0; // src's distance from src is zero + f_distance[src] = get_distance(vertices[src], vertices[dst]); // estimate distance from src to dst + open_set.push(make_pair(src,f_distance[src])); // push src into open_set +#if __TBB_CPP11_LAMBDAS_PRESENT + sp_group->run([](){ shortpath_helper(); }); +#else + sp_group->run( shortpath_helper_functor() ); +#endif + sp_group->wait(); + delete sp_group; +} + +void shortpath_helper() { + vertex_rec u_rec; + while (open_set.try_pop(u_rec)) { + vertex_id u = u_rec.first; + if (u==dst) continue; + double f = u_rec.second; + double old_g_u = 0.0; + { + spin_mutex::scoped_lock l(locks[u]); + if (f > f_distance[u]) continue; // prune search space + old_g_u = g_distance[u]; + } + for (size_t i=0; irun([]{ shortpath_helper(); }); +#else + sp_group->run( shortpath_helper_functor() ); +#endif + } + else --num_spawn; + } + } + } + --num_spawn; +} + +void make_path(vertex_id src, vertex_id dst, vector& path) { + vertex_id at = predecessor[dst]; + if (at == N) path.push_back(src); + else if (at == src) { path.push_back(src); path.push_back(dst); } + else { make_path(src, at, path); path.push_back(dst); } +} + +void print_path() { + vector path; + double path_length=0.0; + make_path(src, dst, path); + if (verbose) printf("\n "); + for (size_t i=0; i", (int)path[i]); + else printf("(%4d)\n", (int)path[i]); + } + } + if (verbose) printf("Total distance = %5.1f\n", path_length); + else if (!silent) printf(" %5.1f\n", path_length); +} + +int get_default_num_threads() { + static int threads = 0; + if (threads == 0) + threads = tbb::task_scheduler_init::default_num_threads(); + return threads; +} + +#if !__TBB_CPP11_LAMBDAS_PRESENT +class gen_vertices { +public: + gen_vertices() {} + void operator() (blocked_range& r) const { + utility::FastRandom my_random((unsigned int)r.begin()); + for (size_t i=r.begin(); i!=r.end(); ++i) { + vertices[i] = generate_random_point(my_random); + } + } +}; + +class gen_edges { +public: + gen_edges() {} + void operator() (blocked_range& r) const { + utility::FastRandom my_random((unsigned int)r.begin()); + for (size_t i=r.begin(); i!=r.end(); ++i) { + for (size_t j=0; j& r) const { + for (size_t i=r.begin(); i!=r.end(); ++i) { + f_distance[i] = g_distance[i] = INF; + predecessor[i] = N; + } + } +}; +#endif + +void InitializeGraph() { + task_scheduler_init init(get_default_num_threads()); + vertices.resize(N); + edges.resize(N); + predecessor.resize(N); + g_distance.resize(N); + f_distance.resize(N); + locks = new spin_mutex[N]; + if (verbose) printf("Generating vertices...\n"); +#if __TBB_CPP11_LAMBDAS_PRESENT + parallel_for(blocked_range(0,N,64), + [&](blocked_range& r) { + utility::FastRandom my_random(r.begin()); + for (size_t i=r.begin(); i!=r.end(); ++i) { + vertices[i] = generate_random_point(my_random); + } + }, simple_partitioner()); +#else + parallel_for(blocked_range(0,N,64), gen_vertices(), simple_partitioner()); +#endif + if (verbose) printf("Generating edges...\n"); +#if __TBB_CPP11_LAMBDAS_PRESENT + parallel_for(blocked_range(0,N,64), + [&](blocked_range& r) { + utility::FastRandom my_random(r.begin()); + for (size_t i=r.begin(); i!=r.end(); ++i) { + for (size_t j=0; j(0,N,64), gen_edges(), simple_partitioner()); +#endif + for (size_t i=0; i(0,N), + [&](blocked_range& r) { + for (size_t i=r.begin(); i!=r.end(); ++i) { + f_distance[i] = g_distance[i] = INF; + predecessor[i] = N; + } + }); +#else + parallel_for(blocked_range(0,N), reset_vertices()); +#endif +} + +int main(int argc, char *argv[]) { + try { + utility::thread_number_range threads(get_default_num_threads); + utility::parse_cli_arguments(argc, argv, + utility::cli_argument_pack() + //"-h" option for displaying help is present implicitly + .positional_arg(threads,"#threads",utility::thread_number_range_desc) + .arg(verbose,"verbose"," print diagnostic output to screen") + .arg(silent,"silent"," limits output to timing info; overrides verbose") + .arg(N,"N"," number of vertices") + .arg(src,"start"," start of path") + .arg(dst,"end"," end of path") + ); + if (silent) verbose = false; // make silent override verbose + else + printf("shortpath will run with %d vertices to find shortest path between vertices" + " %d and %d using %d:%d threads.\n", + (int)N, (int)src, (int)dst, (int)threads.first, (int)threads.last); + + if (dst >= N) { + if (verbose) + printf("end value %d is invalid for %d vertices; correcting to %d\n", (int)dst, (int)N, (int)N-1); + dst = N-1; + } + + num_spawn = 0; + max_spawn = N/grainsize; + tick_count t0, t1; + InitializeGraph(); + for (int n_thr=threads.first; n_thr<=threads.last; n_thr=threads.step(n_thr)) { + ResetGraph(); + task_scheduler_init init(n_thr); + t0 = tick_count::now(); + shortpath(); + t1 = tick_count::now(); + if (!silent) { + if (predecessor[dst] != N) { + printf("%d threads: [%6.6f] The shortest path from vertex %d to vertex %d is:", + (int)n_thr, (t1-t0).seconds(), (int)src, (int)dst); + print_path(); + } + else { + printf("%d threads: [%6.6f] There is no path from vertex %d to vertex %d\n", + (int)n_thr, (t1-t0).seconds(), (int)src, (int)dst); + } + } else + utility::report_elapsed_time((t1-t0).seconds()); + } + ReleaseGraph(); + return 0; + } catch(std::exception& e) { + cerr<<"error occurred. error text is :\"" </dev/null)) +CXX=icc +endif # which icc + +ifeq ($(shell uname), Linux) +ifeq ($(target), android) +LIBS+= --sysroot=$(SYSROOT) +run_cmd=../../common/android.linux.launcher.sh +else +LIBS+= -lrt +endif +else ifeq ($(shell uname), Darwin) +override CXXFLAGS += -Wl,-rpath,$(TBBROOT)/lib +endif + +all: release test + +release: *.cpp + $(CXX) -O2 -DNDEBUG $(CXXFLAGS) -o $(PROG) $^ -ltbb $(LIBS) + +debug: *.cpp + $(CXX) -O0 -g -DTBB_USE_DEBUG $(CXXFLAGS) -o $(PROG) $^ -ltbb_debug $(LIBS) + +profile: override CXXFLAGS += -DTBB_USE_THREADING_TOOLS -g +profile: release + +clean: + $(RM) $(PROG) *.o *.d + +test: + $(run_cmd) ./$(PROG) $(ARGS) + +perf_build: release + +perf_run: + $(run_cmd) ./$(PROG) $(PERF_RUN_ARGS) diff --git a/xdl/third_party/tbb/examples/graph/binpack/Makefile.windows b/xdl/third_party/tbb/examples/graph/binpack/Makefile.windows new file mode 100644 index 00000000..ebab52d4 --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/binpack/Makefile.windows @@ -0,0 +1,52 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +# Common Makefile that builds and runs example. + +# Just specify your program basename +PROG=binpack +ARGS= 4 N=1000 +PERF_RUN_ARGS=auto N=1000 silent + +# Trying to find if icl.exe is set +CXX1 = $(TBB_CXX)- +CXX2 = $(CXX1:icl.exe-=icl.exe) +CXX = $(CXX2:-=cl.exe) + +# The C++ compiler options +MYCXXFLAGS = /TP /EHsc /W3 /nologo /D _CONSOLE /D _MBCS /D WIN32 /D _CRT_SECURE_NO_DEPRECATE $(CXXFLAGS) +MYLDFLAGS =/INCREMENTAL:NO /NOLOGO /DEBUG /FIXED:NO $(LDFLAGS) + +all: release test +release: + $(CXX) *.cpp /MD /O2 /D NDEBUG $(MYCXXFLAGS) /link tbb.lib $(LIBS) $(MYLDFLAGS) /OUT:$(PROG).exe +debug: + $(CXX) *.cpp /MDd /Od /Zi /D TBB_USE_DEBUG /D _DEBUG $(MYCXXFLAGS) /link tbb_debug.lib $(LIBS) $(MYLDFLAGS) /OUT:$(PROG).exe +profile: + $(CXX) *.cpp /MD /O2 /Zi /D NDEBUG $(MYCXXFLAGS) /D TBB_USE_THREADING_TOOLS /link tbb.lib $(LIBS) $(MYLDFLAGS) /OUT:$(PROG).exe +clean: + @cmd.exe /C del $(PROG).exe *.obj *.?db *.manifest +test: + $(PROG) $(ARGS) +compiler_check: + @$(CXX) >nul 2>&1 || echo "$(CXX) command not found. Check if CXX=$(CXX) is set properly" + +perf_build: release + +perf_run: + $(PROG) $(PERF_RUN_ARGS) diff --git a/xdl/third_party/tbb/examples/graph/binpack/binpack.cpp b/xdl/third_party/tbb/examples/graph/binpack/binpack.cpp new file mode 100644 index 00000000..944e2071 --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/binpack/binpack.cpp @@ -0,0 +1,300 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + + +/* Bin-packing algorithm that attempts to use minimal number of bins B of + size V to contain N items of varying sizes. */ + +#include +#include +#include +#include +#include "tbb/atomic.h" +#include "tbb/task_scheduler_init.h" +#include "tbb/tick_count.h" +#include "tbb/flow_graph.h" +#include "../../common/utility/utility.h" + +using tbb::tick_count; +using tbb::task_scheduler_init; +using namespace tbb::flow; + +typedef size_t size_type; // to represent non-zero indices, capacities, etc. +typedef size_t value_type; // the type of items we are attempting to pack into bins +typedef std::vector bin; // we use a simple vector to represent a bin +// Our bin packers will be function nodes in the graph that take value_type items and +// return a dummy value. They will also implicitly send packed bins to the bin_buffer +// node, and unused items back to the value_pool node: +typedef multifunction_node, rejecting> bin_packer; +// Items are placed into a pool that all bin packers grab from, represent by a queue_node: +typedef queue_node value_pool; +// Packed bins are placed in this buffer waiting to be serially printed and/or accounted for: +typedef buffer_node bin_buffer; +// Packed bins are taken from the_bin_buffer and processed by the_writer: +typedef function_node bin_writer; +// Items are injected into the graph when this node sends them to the_value_pool: +typedef source_node value_source; + +// User-specified globals with default values +size_type V = 42; // desired capacity for each bin +size_type N = 1000; // number of elements to generate +bool verbose = false; // prints bin details and other diagnostics to screen +bool silent = false; // suppress all output except for time +int num_bin_packers=-1; // number of concurrent bin packers in operation; default is #threads; + // larger values can result in more bins at less than full capacity +size_type optimality=1; // 1 (default) is highest the algorithm can obtain; larger numbers run faster + +// Calculated globals +size_type min_B; // lower bound on the optimal number of bins +size_type B; // the answer, i.e. number of bins used by the algorithm +size_type *input_array; // stores randomly generated input values +value_type item_sum; // sum of all randomly generated input values +tbb::atomic packed_sum; // sum of all values currently packed into all bins +tbb::atomic packed_items; // number of values currently packed into all bins +tbb::atomic active_bins; // number of active bin_packers +bin_packer **bins; // the array of bin packers + +// This class is the Body type for bin_packer +class bin_filler { + typedef bin_packer::output_ports_type ports_type; + bin my_bin; // the current bin that this bin_filler is packing + size_type my_used; // capacity of bin used by current contents (not to be confused with my_bin.size()) + size_type relax, relax_val; // relaxation counter for determining when to settle for a non-full bin + bin_packer* my_bin_packer; // ptr to the bin packer that this body object is associated with + size_type bin_index; // index of the encapsulating bin packer in the global bins array + value_type looking_for; // the minimum size of item this bin_packer will accept + value_pool* the_value_pool; // the queue of incoming values + bool done; // flag to indicate that this binpacker has been deactivated + public: + bin_filler(size_t bidx, value_pool* _q) : + my_used(0), relax(0), relax_val(0), my_bin_packer(NULL), bin_index(bidx), looking_for(V), the_value_pool(_q), done(false) {} + void operator()(const value_type& item, ports_type& p) { + if (!my_bin_packer) my_bin_packer = bins[bin_index]; + if (done) get<0>(p).try_put(item); // this bin_packer is done packing items; put item back to pool + else if (item > V) { // signal that packed_sum has reached item_sum at some point + size_type remaining = active_bins--; + if (remaining == 1 && packed_sum == item_sum) { // this is the last bin and it has seen everything + // this bin_packer may not have seen everything, so stay active + if (my_used>0) get<1>(p).try_put(my_bin); + my_bin.clear(); + my_used = 0; + looking_for = V; + ++active_bins; + } + else if (remaining == 1) { // this is the last bin, but there are remaining items + get<0>(p).try_put(V+1); // send out signal + ++active_bins; + } + else if (remaining > 1) { // this is not the last bin; deactivate + if (my_used < V/(1+optimality*.1)) { // this bin is ill-utilized; throw back items and deactivate + packed_sum -= my_used; + packed_items -= my_bin.size(); + for (size_type i=0; i(p).try_put(my_bin[i]); + the_value_pool->remove_successor(*my_bin_packer); // deactivate + done = true; + get<0>(p).try_put(V+1); // send out signal + } + else { // this bin is well-utilized; send out bin and deactivate + the_value_pool->remove_successor(*my_bin_packer); // build no more bins + done = true; + if (my_used>0) get<1>(p).try_put(my_bin); + get<0>(p).try_put(V+1); // send out signal + } + } + } + else if (item <= V-my_used && item >= looking_for) { // this item can be packed + my_bin.push_back(item); + my_used += item; + packed_sum += item; + ++packed_items; + looking_for = V-my_used; + relax = 0; + if (packed_sum == item_sum) { + get<0>(p).try_put(V+1); // send out signal + } + if (my_used == V) { + get<1>(p).try_put(my_bin); + my_bin.clear(); + my_used = 0; + looking_for = V; + } + } + else { // this item can't be packed; relax constraints + ++relax; + if (relax >= (N-packed_items)/optimality) { // this bin_packer has looked through enough items + relax = 0; + --looking_for; // accept a wider range of items + if (looking_for == 0 && my_used < V/(1+optimality*.1) && my_used > 0 && active_bins > 1) { + // this bin_packer is ill-utilized and can't find items; deactivate and throw back items + size_type remaining = active_bins--; + if (remaining > 1) { // not the last bin_packer + the_value_pool->remove_successor(*my_bin_packer); // deactivate + done = true; + } + else active_bins++; // can't deactivate last bin_packer + packed_sum -= my_used; + packed_items -= my_bin.size(); + for (size_type i=0; i(p).try_put(my_bin[i]); + my_bin.clear(); + my_used = 0; + } + else if (looking_for == 0 && (my_used >= V/(1+optimality*.1) || active_bins == 1)) { + // this bin_packer can't find items but is well-utilized, so send it out and reset + get<1>(p).try_put(my_bin); + my_bin.clear(); + my_used = 0; + looking_for = V; + } + } + get<0>(p).try_put(item); // put unused item back to pool + } + } +}; + +// source node uses this to send the values to the value_pool +class item_generator { + size_type counter; +public: + item_generator() : counter(0) {} + bool operator()(value_type& m) { + if (counter my_max) my_max = sum; + avg += sum; + running_count += sum; + if (verbose) + std::cout << "]=" << sum << "; Done/Packed/Total cap: " << running_count << "/" << packed_sum << "/" << item_sum + << " items:" << item_count << "/" << packed_items << "/" << N << " B=" << B << std::endl; + if (item_count == N) { // should be the last; print stats + avg = avg/(double)B; + if (!silent) + std::cout << "SUMMARY: #Bins used: " << B << "; Avg size: " << avg << "; Max size: " << my_max + << "; Min size: " << my_min << "\n Lower bound on optimal #bins: " << min_B + << "; Start #bins: " << num_bin_packers << std::endl; + } + return continue_msg(); // need to return something + } +}; + +int get_default_num_threads() { + static int threads = 0; + if (threads == 0) + threads = task_scheduler_init::default_num_threads(); + return threads; +} + +int main(int argc, char *argv[]) { + try { + utility::thread_number_range threads(get_default_num_threads); + utility::parse_cli_arguments(argc, argv, + utility::cli_argument_pack() + //"-h" option for displaying help is present implicitly + .positional_arg(threads,"#threads",utility::thread_number_range_desc) + .arg(verbose,"verbose"," print diagnostic output to screen") + .arg(silent,"silent"," limits output to timing info; overrides verbose") + .arg(N,"N"," number of values to pack") + .arg(V,"V"," capacity of each bin") + .arg(num_bin_packers,"#packers"," number of concurrent bin packers to use " + "(default=#threads)") + .arg(optimality,"optimality","controls optimality of solution; 1 is highest, use\n" + " larger numbers for less optimal but faster solution") + ); + + if (silent) verbose = false; // make silent override verbose + // Generate random input data + srand(42); + input_array = new value_type[N]; + item_sum = 0; + for (size_type i=0; i(*(bins[i])), the_value_pool); + make_edge(output_port<1>(*(bins[i])), the_bin_buffer); + } + bin_writer the_writer(g, 1, bin_printer()); + make_edge(the_bin_buffer, the_writer); + the_source.activate(); + g.wait_for_all(); + for (int i=0; i + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + binpack + {C931C7A2-074E-4150-9E7A-39A03250411E} + binpack + Win32Proj + + + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.40219.1 + $(TEMP)\tbb_examples\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Configuration)\ + false + $(TEMP)\tbb_examples\$(Platform)\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Platform)\$(Configuration)\ + false + $(TEMP)\tbb_examples\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Configuration)\ + false + $(TEMP)\tbb_examples\$(Platform)\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Platform)\$(Configuration)\ + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG;%(PreprocessorDefinitions) + MultiThreadedDebugDLL + + + ProgramDatabase + + + tbb_debug.lib;tbbmalloc_debug.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc12;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc12;%(AdditionalLibraryDirectories) + true + Console + MachineX86 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 debug "$(OutDir)" + + + + + X64 + + + Disabled + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG;%(PreprocessorDefinitions) + MultiThreadedDebugDLL + + + ProgramDatabase + + + tbb_debug.lib;tbbmalloc_debug.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc12;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc12;%(AdditionalLibraryDirectories) + true + Console + MachineX64 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 debug "$(OutDir)" + + + + + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + + + ProgramDatabase + + + tbb.lib;tbbmalloc.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc12;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc12;%(AdditionalLibraryDirectories) + true + Console + true + true + MachineX86 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 release "$(OutDir)" + + + + + X64 + + + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + + + ProgramDatabase + + + tbb.lib;tbbmalloc.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc12;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc12;%(AdditionalLibraryDirectories) + true + Console + true + true + MachineX64 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 release "$(OutDir)" + + + + + + + + + + + + \ No newline at end of file diff --git a/xdl/third_party/tbb/examples/graph/binpack/readme.html b/xdl/third_party/tbb/examples/graph/binpack/readme.html new file mode 100644 index 00000000..e05804a0 --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/binpack/readme.html @@ -0,0 +1,415 @@ + + + + + + Intel® Threading Building Blocks. Binpack sample + + + + + +

+ This directory contains a simple tbb::flow example that performs + binpacking of N integer values into a near-optimal number of bins + of capacity V. +

+ It features a source_node which passes randomly + generated integer values of size<=V to a queue_node. Multiple + function_nodes set about taking values from this queue_node and + packing them into bins according to a best-fit policy. Items that + cannot be made to fit are rejected and returned to the queue. When + a bin is packed as well as it can be, it is passed to a buffer_node + where it waits to be picked up by another function_node. This final + function nodes gathers stats about the bin and optionally prints its + contents. When all bins are accounted for, it optionally prints a + summary of the quality of the bin-packing. +

+ +
+
System Requirements
+ +
+

+ For the most up to date system requirements, see the release notes. +

+
+
+ +
+
Files
+ +
+
+
binpack.cpp +
Driver. +
Makefile +
Makefile for building the example. +
+
+
+ +
+
Directories
+ +
+
+
msvs +
Contains Microsoft* Visual Studio* workspace for building and running the example with the Intel® C++ Compiler (Windows* systems only). +
xcode +
Contains Xcode* IDE workspace for building and running the example (macOS* systems only). +
+

For information about the minimum supported version of IDE, see release notes.

+
+
+ +
+
Build instructions
+ +
+

General build directions can be found here.

+
+
+ +
+
Usage
+ +
+
+
binpack -h +
Prints the help for command line options +
binpack [#threads=value] [verbose] [silent] [N=value] [V=value] [#packers=value] [optimality=value] [#threads] +
#threads is the number of threads to use; a range of the form low[:high] where low and optional high are non-negative integers, or 'auto' for a platform-specific default number.
+ verbose print diagnostic output to screen
+ silent limits output to timing info; overrides verbose
+ N number of values to pack
+ V capacity of each bin
+ #packers number of concurrent bin packers to use (default=#threads)
+ optimality controls optimality of solution; 1 is highest, use larger numbers for less optimal but faster solution
+
To run a short version of this example, e.g., for use with Intel® Parallel Inspector: +
Build a debug version of the example + (see the build instructions). +
Run it with a small problem size and the desired number of threads, e.g., binpack 4 N=100. +
+
+
+ +
+ Up to parent directory +
+
+
Legal Information
+ +
+

+ Intel and the Intel logo are trademarks of Intel Corporation in the U.S. and/or other countries. +
* Other names and brands may be claimed as the property of others. +
© 2018, Intel Corporation +

+
+
+ + + diff --git a/xdl/third_party/tbb/examples/graph/binpack/xcode/binpack.xcodeproj/project.pbxproj b/xdl/third_party/tbb/examples/graph/binpack/xcode/binpack.xcodeproj/project.pbxproj new file mode 100644 index 00000000..5d282c4b --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/binpack/xcode/binpack.xcodeproj/project.pbxproj @@ -0,0 +1,306 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + A1F593A60B8F042A00073279 /* binpack.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F593A50B8F042A00073279 /* binpack.cpp */; }; +/* End PBXBuildFile section */ + +/* Begin PBXBuildRule section */ + C3C58950218B599300DAC94C /* PBXBuildRule */ = { + isa = PBXBuildRule; + compilerSpec = com.intel.compilers.icc.latest; + fileType = sourcecode.cpp; + isEditable = 1; + outputFiles = ( + ); + script = "# Type a script or drag a script file from your workspace to insert its path.\n"; + }; +/* End PBXBuildRule section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 8DD76F690486A84900D96B5E /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 12; + dstPath = ""; + dstSubfolderSpec = 16; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 8DD76F6C0486A84900D96B5E /* Binpack */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = Binpack; sourceTree = BUILT_PRODUCTS_DIR; }; + A1F593A50B8F042A00073279 /* binpack.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = binpack.cpp; path = ../binpack.cpp; sourceTree = SOURCE_ROOT; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 8DD76F660486A84900D96B5E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 08FB7794FE84155DC02AAC07 /* Binpack */ = { + isa = PBXGroup; + children = ( + 08FB7795FE84155DC02AAC07 /* Source */, + 1AB674ADFE9D54B511CA2CBB /* Products */, + ); + name = Binpack; + sourceTree = ""; + }; + 08FB7795FE84155DC02AAC07 /* Source */ = { + isa = PBXGroup; + children = ( + A1F593A50B8F042A00073279 /* binpack.cpp */, + ); + name = Source; + sourceTree = ""; + }; + 1AB674ADFE9D54B511CA2CBB /* Products */ = { + isa = PBXGroup; + children = ( + 8DD76F6C0486A84900D96B5E /* Binpack */, + ); + name = Products; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 8DD76F620486A84900D96B5E /* Binpack */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "Binpack" */; + buildPhases = ( + 8DD76F640486A84900D96B5E /* Sources */, + 8DD76F660486A84900D96B5E /* Frameworks */, + 8DD76F690486A84900D96B5E /* CopyFiles */, + ); + buildRules = ( + C3C58950218B599300DAC94C /* PBXBuildRule */, + ); + dependencies = ( + ); + name = Binpack; + productInstallPath = "$(HOME)/bin"; + productName = Binpack; + productReference = 8DD76F6C0486A84900D96B5E /* Binpack */; + productType = "com.apple.product-type.tool"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 08FB7793FE84155DC02AAC07 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1000; + }; + buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "binpack" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 1; + knownRegions = ( + en, + ); + mainGroup = 08FB7794FE84155DC02AAC07 /* Binpack */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 8DD76F620486A84900D96B5E /* Binpack */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + 8DD76F640486A84900D96B5E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + A1F593A60B8F042A00073279 /* binpack.cpp in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + A1F593C60B8F0E6E00073279 /* Debug64 */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_VERSION = ""; + HEADER_SEARCH_PATHS = "$(inherited)"; + ICC_CXX_LANG_DIALECT = "c++11"; + INSTALL_PATH = "$(HOME)/bin"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited)"; + LIBRARY_SEARCH_PATHS = "$(inherited)"; + PRODUCT_NAME = Binpack; + ZERO_LINK = NO; + }; + name = Debug64; + }; + A1F593C70B8F0E6E00073279 /* Release64 */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_GENERATE_DEBUGGING_SYMBOLS = NO; + GCC_VERSION = ""; + HEADER_SEARCH_PATHS = "$(inherited)"; + ICC_CXX_LANG_DIALECT = "c++11"; + INSTALL_PATH = "$(HOME)/bin"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited)"; + LIBRARY_SEARCH_PATHS = "$(inherited)"; + PRODUCT_NAME = Binpack; + ZERO_LINK = NO; + }; + name = Release64; + }; + A1F593C80B8F0E6E00073279 /* Debug64 */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_ENABLE_CPP_RTTI = YES; + GCC_MODEL_TUNING = ""; + GCC_NO_COMMON_BLOCKS = YES; + GCC_VERSION = ""; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(TBBROOT)/include", + /opt/intel/tbb/include, + ); + LD_RUNPATH_SEARCH_PATHS = "$(TBBROOT)/lib /opt/intel/tbb/lib"; + LIBRARY_SEARCH_PATHS = ( + "$(TBBROOT)/lib", + /opt/intel/tbb/lib, + ); + MACOSX_DEPLOYMENT_TARGET = 10.11; + ONLY_ACTIVE_ARCH = YES; + OTHER_CPLUSPLUSFLAGS = ( + "$(OTHER_CFLAGS)", + "-m64", + ); + OTHER_LDFLAGS = ( + "-m64", + "-ltbb_debug", + ); + PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO; + SYMROOT = "/tmp/tbb-$(USER)"; + VALID_ARCHS = x86_64; + }; + name = Debug64; + }; + A1F593C90B8F0E6E00073279 /* Release64 */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_ENABLE_CPP_RTTI = YES; + GCC_MODEL_TUNING = ""; + GCC_NO_COMMON_BLOCKS = YES; + GCC_VERSION = ""; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(TBBROOT)/include", + /opt/intel/tbb/include, + ); + LD_RUNPATH_SEARCH_PATHS = "$(TBBROOT)/lib /opt/intel/tbb/lib"; + LIBRARY_SEARCH_PATHS = ( + "$(TBBROOT)/lib", + /opt/intel/tbb/lib, + ); + MACOSX_DEPLOYMENT_TARGET = 10.11; + OTHER_CPLUSPLUSFLAGS = ( + "$(OTHER_CFLAGS)", + "-m64", + ); + OTHER_LDFLAGS = ( + "-m64", + "-ltbb", + ); + PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO; + SYMROOT = "/tmp/tbb-$(USER)"; + VALID_ARCHS = x86_64; + }; + name = Release64; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "Binpack" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A1F593C60B8F0E6E00073279 /* Debug64 */, + A1F593C70B8F0E6E00073279 /* Release64 */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug64; + }; + 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "binpack" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A1F593C80B8F0E6E00073279 /* Debug64 */, + A1F593C90B8F0E6E00073279 /* Release64 */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug64; + }; +/* End XCConfigurationList section */ + }; + rootObject = 08FB7793FE84155DC02AAC07 /* Project object */; +} diff --git a/xdl/third_party/tbb/examples/graph/cholesky/Makefile b/xdl/third_party/tbb/examples/graph/cholesky/Makefile new file mode 100644 index 00000000..5f8b60e3 --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/cholesky/Makefile @@ -0,0 +1,59 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +# GNU Makefile that builds and runs example. +run_cmd= +PROG=cholesky +ARGS=4 2 + +# The C++ compiler +ifneq (,$(shell which icpc 2>/dev/null)) +CXX=icpc +endif # which icpc + +ifeq ($(shell uname), Darwin) +override CXXFLAGS += -Wl,-rpath,$(TBBROOT)/lib -Wl,-rpath,$(MKLROOT)/lib +# MKL support +override MKL_LIBS += -lmkl_intel_lp64 -lmkl_sequential -lmkl_core +else +ifeq ($(shell uname), Linux) +LIBS+= -lrt +endif +# MKL support +override MKL_LIBS += -lmkl_rt +endif + +# C++0x support +override CXXFLAGS += -std=c++0x + +all: release test + +release: *.cpp + $(CXX) -O2 -DNDEBUG $(CXXFLAGS) -o $(PROG) $^ -ltbb $(MKL_LIBS) $(LIBS) + +debug: *.cpp + $(CXX) -O0 -g -DTBB_USE_DEBUG $(CXXFLAGS) -o $(PROG) $^ -ltbb_debug $(MKL_LIBS) $(LIBS) + +profile: override CXXFLAGS += -DTBB_USE_THREADING_TOOLS -g +profile: release + +clean: + $(RM) $(PROG) *.o *.d + +test: + $(run_cmd) ./$(PROG) $(ARGS) diff --git a/xdl/third_party/tbb/examples/graph/cholesky/Makefile.windows b/xdl/third_party/tbb/examples/graph/cholesky/Makefile.windows new file mode 100644 index 00000000..d244a6ac --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/cholesky/Makefile.windows @@ -0,0 +1,52 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +# Common Makefile that builds and runs example. + +# Just specify your program basename +PROG=Cholesky +ARGS=4 2 + +# Trying to find if icl.exe is set +CXX1 = $(TBB_CXX)- +CXX2 = $(CXX1:icl.exe-=icl.exe) +CXX = $(CXX2:-=cl.exe) + +# The C++ compiler options +MYCXXFLAGS = /TP /EHsc /W3 /nologo /D _CONSOLE /D _MBCS /D WIN32 /D _WIN32_WINNT=0x0501 $(CXXFLAGS) +MYLDFLAGS = /INCREMENTAL:NO /NOLOGO /DEBUG /FIXED:NO $(LDFLAGS) + +# MKL support +MKL_LIBS1 = $(TBB_TARGET_ARCH) +MKL_LIBS2 = $(MKL_LIBS1:ia32=mkl_core.lib mkl_sequential.lib mkl_intel_c.lib) +MKL_LIBS = $(MKL_LIBS2:intel64=mkl_core.lib mkl_sequential.lib mkl_intel_lp64.lib) + +all: release test +release: compiler_check + $(CXX) *.cpp /MD /O2 /D NDEBUG $(MYCXXFLAGS) /link tbb.lib $(MKL_LIBS) $(LIBS) $(MYLDFLAGS) /OUT:$(PROG).exe +debug: compiler_check + $(CXX) *.cpp /MDd /Od /Zi /D TBB_USE_DEBUG /D _DEBUG $(MYCXXFLAGS) /link tbb_debug.lib $(MKL_LIBS) $(LIBS) $(MYLDFLAGS) /OUT:$(PROG).exe +profile: compiler_check + $(CXX) *.cpp /MD /O2 /Zi /D NDEBUG $(MYCXXFLAGS) /D TBB_USE_THREADING_TOOLS /link tbb.lib $(MKL_LIBS) $(LIBS) $(MYLDFLAGS) /OUT:$(PROG).exe +clean: + @cmd.exe /C del $(PROG).exe *.obj *.?db *.manifest +test: + $(PROG) $(ARGS) +compiler_check: + @echo compiler_test>compiler_test && @$(CXX) /E compiler_test >nul 2>&1 || echo "$(CXX) command not found. Check if CXX=$(CXX) is set properly" + @cmd.exe /C del compiler_test diff --git a/xdl/third_party/tbb/examples/graph/cholesky/cholesky.cpp b/xdl/third_party/tbb/examples/graph/cholesky/cholesky.cpp new file mode 100644 index 00000000..d11c9401 --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/cholesky/cholesky.cpp @@ -0,0 +1,715 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +#include +#include +#include +#include +#include +#include + +#include "mkl_lapack.h" +#include "mkl.h" + +#include "tbb/tbb_config.h" +#include "tbb/flow_graph.h" +#include "tbb/tick_count.h" +#include "tbb/task_scheduler_init.h" + +// Application command line arguments parsing +#include "../../common/utility/utility.h" + +/************************************************************ + FORWARD DECLARATIONS +************************************************************/ + +/********************************************** + Read or generate a positive-definite matrix + -- reads from file if fname != NULL + -- sets n to matrix size + -- allocates and reads values in to A + -- otherwise generates a matrix + -- uses n to determine size + -- allocates and generates values in to A +**********************************************/ +void matrix_init( double * &A, int &n, const char *fname ); + +/********************************************** + Writes a lower triangular matrix to a file + -- first line of file is n + -- subsequently 1 row per line +**********************************************/ +void matrix_write ( double *A, int n, const char *fname, bool is_triangular = false ); + +/************************************************************ + GLOBAL VARIABLES +************************************************************/ +bool g_benchmark_run = false; +int g_num_tbb_threads = tbb::task_scheduler_init::default_num_threads(); +int g_n = -1, g_b = -1, g_num_trials = 1; +char *g_input_file_name = NULL; +char *g_output_prefix = NULL; +std::string g_alg_name; + +// Creates tiled array +static double ***create_tile_array( double *A, int n, int b ) { + const int p = n/b; + double ***tile = (double ***)calloc( sizeof( double ** ), p ); + + for ( int j = 0; j < p; ++j ) { + tile[j] = (double **)calloc( sizeof( double * ), p ); + } + + for ( int j = 0; j < p; ++j ) { + for ( int i = 0; i < p; ++i ) { + double *temp_block = (double *)calloc( sizeof( double ), b*b ); + + for ( int A_j = j*b, T_j = 0; T_j < b; ++A_j, ++T_j ) { + for ( int A_i = i*b, T_i = 0; T_i < b; ++A_i, ++T_i ) { + temp_block[T_j*b+T_i] = A[A_j*n+A_i]; + } + } + + tile[j][i] = temp_block; + } + } + return tile; +} + +static void collapse_tile_array( double ***tile, double *A, int n, int b ) { + const int p = n/b; + + for ( int j = 0; j < p; ++j ) { + for ( int i = 0; i < p; ++i ) { + double *temp_block = tile[j][i]; + + for ( int A_j = j*b, T_j = 0; T_j < b; ++A_j, ++T_j ) { + for ( int A_i = i*b, T_i = 0; T_i < b; ++A_i, ++T_i ) { + A[A_j*n+A_i] = temp_block[T_j*b+T_i]; + } + } + + free( temp_block ); + tile[j][i] = NULL; + } + + free( tile[j] ); + } + + free( tile ); +} + +/************************************************************ + Helper base class: algorithm +************************************************************/ +class algorithm { + + std::string name; + bool is_tiled; + + bool check_if_valid( double *A0, double *C, double *A, int n ) { + char transa = 'n', transb = 't'; + double alpha = 1; + double beta = 0; + + for ( int i = 0; i < n; ++i ) { + for ( int j = i+1; j < n; ++j ) { + A0[j*n+i] = 0.; + } + } + + dgemm ( &transa, &transb, &n, &n, &n, &alpha, A0, &n, A0, &n, &beta, C, &n ); + + for ( int j = 0; j < n; ++j ) { + for ( int i = 0; i < n; ++i ) { + const double epsilon = std::abs( A[j*n+i]*0.1 ); + + if ( std::abs( C[j*n+i] - A[j*n+i] ) > epsilon ) { + printf( "ERROR: %s did not validate at C(%d,%d) = %lf != A(%d,%d) = %lf\n", + name.c_str(), i, j, C[j*n+i], i, j, A[j*n+i] ); + printf( "ERROR: %g; %g < %g < %g\n", epsilon, A[j*n+i] - epsilon, C[j*n+i], A[j*n+i] + epsilon ); + return false; + } + } + } + return true; + } + +public: + algorithm( const std::string& alg_name, bool t ) : name(alg_name), is_tiled(t) {} + + double operator() ( double *A, int n, int b, int trials ) { + tbb::tick_count t0, t1; + double elapsed_time = 0.0; + double *A0 = (double *)calloc( sizeof( double ), n*n ); + double *C = (double *)calloc( sizeof( double ), n*n ); + + for ( int t = 0; t < trials+1; ++t ) { + if ( is_tiled ) { + double ***tile = create_tile_array( A, n, b ); + t0 = tbb::tick_count::now(); + func( tile, n, b ); + t1 = tbb::tick_count::now(); + + collapse_tile_array( tile, A0, n, b ); + } + else { + memcpy( A0, A, sizeof( double )*n*n ); + t0 = tbb::tick_count::now(); + func( A0, n, b ); + t1 = tbb::tick_count::now(); + } + + if ( t ) elapsed_time += (t1-t0).seconds(); + + if( !g_benchmark_run && !check_if_valid( A0, C, A, n ) ) { + if ( g_output_prefix ) { + std::string s( g_output_prefix ); + s += "_" + name + ".txt"; + matrix_write( A0, g_n, s.c_str(), true ); + free( A0 ); + free( C ); + return 0.; + } + } + } + + if ( g_output_prefix ) { + std::string s( g_output_prefix ); + s += "_" + name + ".txt"; + matrix_write( A0, g_n, s.c_str(), true ); + } + + printf( "%s %d %d %d %d %lf %lf\n", name.c_str(), g_num_tbb_threads, trials, n, b, elapsed_time, elapsed_time/trials ); + free( A0 ); + free( C ); + return elapsed_time; + } + +protected: + // Main algorithm body function must be defined in any direved class + virtual void func( void * ptr, int n, int b ) = 0; +}; + +/***********************************************************/ + +static void call_dpotf2( double ***tile, int b, int k ) { + double *A_block = tile[k][k]; + char uplo = 'l'; + int info = 0; + dpotf2( &uplo, &b, A_block, &b, &info ); + return; +} + +static void call_dtrsm( double ***tile, int b, int k, int j ) { + double *A_block = tile[k][j]; + double *L_block = tile[k][k]; + char uplo = 'l', side = 'r', transa = 't', diag = 'n'; + double alpha = 1; + dtrsm( &side, &uplo, &transa, &diag, &b, &b, &alpha, L_block, &b, A_block, &b ); + return; +} + +static void call_dsyr2k( double ***tile, int b, int k, int j, int i ) { + double *A_block = tile[i][j]; + char transa = 'n', transb = 't'; + char uplo = 'l'; + double alpha = -1; + double beta = 1; + + if ( i == j ) { // Diagonal block + double *L_block = tile[k][i]; + dsyrk( &uplo, &transa, &b, &b, &alpha, L_block, &b, &beta, A_block, &b ); + } else { // Non-diagonal block + double *L2_block = tile[k][i]; + double *L1_block = tile[k][j]; + dgemm( &transa, &transb, &b, &b, &b, &alpha, L1_block, &b, L2_block, &b, &beta, A_block, &b ); + } + return; +} + +class algorithm_crout : public algorithm +{ +public: + algorithm_crout() : algorithm("crout_cholesky", true) {} + +protected: + virtual void func( void * ptr, int n, int b ) { + double ***tile = (double ***)ptr; + const int p = n/b; + + for ( int k = 0; k < p; ++k ) { + call_dpotf2( tile, b, k ); + + for ( int j = k+1; j < p; ++j ) { + call_dtrsm( tile, b, k, j ); + + for ( int i = k+1; i <= j; ++i ) { + call_dsyr2k( tile, b, k, j, i ); + } + } + } + } +}; + +class algorithm_dpotrf : public algorithm +{ +public: + algorithm_dpotrf() : algorithm("dpotrf_cholesky", false) {} + +protected: + virtual void func( void * ptr, int n, int /* b */ ) { + double *A = (double *)ptr; + int lda = n; + int info = 0; + char uplo = 'l'; + dpotrf( &uplo, &n, A, &lda, &info ); + } +}; + +/************************************************************ + Begin data join graph based version of cholesky +************************************************************/ + +typedef union { + char a[4]; + size_t tag; +} tag_t; + +typedef double * tile_t; + +typedef std::pair< tag_t, tile_t > tagged_tile_t; +typedef tbb::flow::tuple< tagged_tile_t > t1_t; +typedef tbb::flow::tuple< tagged_tile_t, tagged_tile_t > t2_t; +typedef tbb::flow::tuple< tagged_tile_t, tagged_tile_t, tagged_tile_t > t3_t; + +typedef tbb::flow::multifunction_node< tagged_tile_t, t1_t > dpotf2_node_t; +typedef tbb::flow::multifunction_node< t2_t, t2_t > dtrsm_node_t; +typedef tbb::flow::multifunction_node< t3_t, t3_t > dsyr2k_node_t; + +typedef tbb::flow::join_node< t2_t, tbb::flow::tag_matching > dtrsm_join_t; +typedef tbb::flow::join_node< t3_t, tbb::flow::tag_matching > dsyr2k_join_t; + +class dpotf2_body { + int p; + int b; +public: + dpotf2_body( int p_, int b_ ) : p(p_), b(b_) {} + + void operator()( const tagged_tile_t &in, dpotf2_node_t::output_ports_type &ports ) { + int k = in.first.a[0]; + tile_t A_block = in.second; + tag_t t; + t.tag = 0; + t.a[0] = k; + char uplo = 'l'; + int info = 0; + dpotf2( &uplo, &b, A_block, &b, &info ); + + // Send to dtrsms in same column + // k == k j == k + t.a[2] = k; + for ( int j = k+1; j < p; ++j ) { + t.a[1] = j; + tbb::flow::get<0>( ports ).try_put( std::make_pair( t, A_block ) ); + } + } +}; + +class dtrsm_body { + int p; + int b; +public: + dtrsm_body( int p_, int b_ ) : p(p_), b(b_) {} + + void operator()( const t2_t &in, dtrsm_node_t::output_ports_type &ports ) { + using tbb::flow::get; + + tagged_tile_t in0 = get<0>( in ); + tagged_tile_t in1 = get<1>( in ); + int k = in0.first.a[0]; + int j = in0.first.a[1]; + tile_t L_block = in0.second; + tile_t A_block = in1.second; + tag_t t; + t.tag = 0; + t.a[0] = k; + char uplo = 'l', side = 'r', transa = 't', diag = 'n'; + double alpha = 1; + dtrsm( &side, &uplo, &transa, &diag, &b, &b, &alpha, L_block, &b, A_block, &b); + + // Send to rest of my row + t.a[1] = j; + for ( int i = k+1; i <= j; ++i ) { + t.a[2] = i; + get<0>( ports ).try_put( std::make_pair( t, A_block ) ); + } + + // Send to transposed row + t.a[2] = j; + for ( int i = j; i < p; ++i ) { + t.a[1] = i; + get<1>( ports ).try_put( std::make_pair( t, A_block ) ); + } + } +}; + +class dsyr2k_body { + int p; + int b; +public: + dsyr2k_body( int p_, int b_ ) : p(p_), b(b_) {} + + void operator()( const t3_t &in, dsyr2k_node_t::output_ports_type &ports ) { + using tbb::flow::get; + + tag_t t; + t.tag = 0; + char transa = 'n', transb = 't'; + char uplo = 'l'; + double alpha = -1; + double beta = 1; + + tagged_tile_t in0 = get<0>( in ); + tagged_tile_t in1 = get<1>( in ); + tagged_tile_t in2 = get<2>( in ); + int k = in2.first.a[0]; + int j = in2.first.a[1]; + int i = in2.first.a[2]; + + tile_t A_block = in2.second; + if ( i == j ) { // Diagonal block + tile_t L_block = in0.second; + dsyrk( &uplo, &transa, &b, &b, &alpha, L_block, &b, &beta, A_block, &b ); + } else { // Non-diagonal block + tile_t L1_block = in0.second; + tile_t L2_block = in1.second; + dgemm( &transa, &transb, &b, &b, &b, &alpha, L1_block, &b, L2_block, &b, &beta, A_block, &b ); + } + + // All outputs flow to next step + t.a[0] = k+1; + t.a[1] = j; + t.a[2] = i; + if ( k != p-1 && j == k+1 && i == k+1 ) { + get<0>( ports ).try_put( std::make_pair( t, A_block ) ); + } + + if ( k < p-2 ) { + if ( i == k+1 && j > i ) { + t.a[0] = k+1; + t.a[1] = j; + get<1>( ports ).try_put( std::make_pair( t, A_block ) ); + } + + if ( j != k+1 && i != k+1 ) { + t.a[0] = k+1; + t.a[1] = j; + t.a[2] = i; + get<2>( ports ).try_put( std::make_pair( t, A_block ) ); + } + } + } +}; + +struct tagged_tile_to_size_t { + size_t operator()( const tagged_tile_t &t ) { + return t.first.tag; + } +}; + +class algorithm_join : public algorithm +{ +public: + algorithm_join() : algorithm("data_join_cholesky", true) {} + +protected: + virtual void func( void * ptr, int n, int b ) { + using tbb::flow::unlimited; + using tbb::flow::output_port; + using tbb::flow::input_port; + + double ***tile = (double ***)ptr; + const int p = n/b; + tbb::flow::graph g; + + dpotf2_node_t dpotf2_node( g, unlimited, dpotf2_body(p, b) ); + dtrsm_node_t dtrsm_node( g, unlimited, dtrsm_body(p, b) ); + dsyr2k_node_t dsyr2k_node( g, unlimited, dsyr2k_body(p, b) ); + dtrsm_join_t dtrsm_join( g, tagged_tile_to_size_t(), tagged_tile_to_size_t() ); + dsyr2k_join_t dsyr2k_join( g, tagged_tile_to_size_t(), tagged_tile_to_size_t(), tagged_tile_to_size_t() ); + + make_edge( output_port<0>( dsyr2k_node ), dpotf2_node ); + + make_edge( output_port<0>( dpotf2_node ), input_port<0>( dtrsm_join ) ); + make_edge( output_port<1>( dsyr2k_node ), input_port<1>( dtrsm_join ) ); + make_edge( dtrsm_join, dtrsm_node ); + + make_edge( output_port<0>( dtrsm_node ), input_port<0>( dsyr2k_join ) ); + make_edge( output_port<1>( dtrsm_node ), input_port<1>( dsyr2k_join ) ); + make_edge( output_port<2>( dsyr2k_node ), input_port<2>( dsyr2k_join ) ); + make_edge( dsyr2k_join, dsyr2k_node ); + + // Now we need to send out the tiles to their first nodes + tag_t t; + t.tag = 0; + t.a[0] = 0; + t.a[1] = 0; + t.a[2] = 0; + + // Send to feedback input of first dpotf2 + // k == 0, j == 0, i == 0 + dpotf2_node.try_put( std::make_pair( t, tile[0][0] ) ); + + // Send to feedback input (port 1) of each dtrsm + // k == 0, j == 1..p-1 + for ( int j = 1; j < p; ++j ) { + t.a[1] = j; + input_port<1>( dtrsm_join ).try_put( std::make_pair( t, tile[0][j] ) ); + } + + // Send to feedback input (port 2) of each dsyr2k + // k == 0 + for ( int i = 1; i < p; ++i ) { + t.a[2] = i; + + for ( int j = i; j < p; ++j ) { + t.a[1] = j; + input_port<2>( dsyr2k_join ).try_put( std::make_pair( t, tile[i][j] ) ); + } + } + + g.wait_for_all(); + } +}; + +/************************************************************ + End data join graph based version of cholesky +************************************************************/ + +/************************************************************ + Begin dependence graph based version of cholesky +************************************************************/ + +typedef tbb::flow::continue_node< tbb::flow::continue_msg > continue_type; +typedef continue_type * continue_ptr_type; + +#if !__TBB_CPP11_LAMBDAS_PRESENT +// Using helper functor classes (instead of built-in C++ 11 lambda functions) +class call_dpotf2_functor +{ + double ***tile; + int b, k; +public: + call_dpotf2_functor( double ***tile_, int b_, int k_ ) + : tile(tile_), b(b_), k(k_) {} + + void operator()( const tbb::flow::continue_msg & ) { call_dpotf2( tile, b, k ); } +}; + +class call_dtrsm_functor +{ + double ***tile; + int b, k, j; +public: + call_dtrsm_functor( double ***tile_, int b_, int k_, int j_ ) + : tile(tile_), b(b_), k(k_), j(j_) {} + + void operator()( const tbb::flow::continue_msg & ) { call_dtrsm( tile, b, k, j ); } +}; + +class call_dsyr2k_functor +{ + double ***tile; + int b, k, j, i; +public: + call_dsyr2k_functor( double ***tile_, int b_, int k_, int j_, int i_ ) + : tile(tile_), b(b_), k(k_), j(j_), i(i_) {} + + void operator()( const tbb::flow::continue_msg & ) { call_dsyr2k( tile, b, k, j, i ); } +}; + +#endif // !__TBB_CPP11_LAMBDAS_PRESENT + +class algorithm_depend : public algorithm +{ +public: + algorithm_depend() : algorithm("depend_cholesky", true) {} + +protected: + virtual void func( void * ptr, int n, int b ) { + double ***tile = (double ***)ptr; + + const int p = n/b; + continue_ptr_type *c = new continue_ptr_type[p]; + continue_ptr_type **t = new continue_ptr_type *[p]; + continue_ptr_type ***u = new continue_ptr_type **[p]; + + tbb::flow::graph g; + for ( int k = p-1; k >= 0; --k ) { + c[k] = new continue_type( g, +#if __TBB_CPP11_LAMBDAS_PRESENT + [=]( const tbb::flow::continue_msg & ) { call_dpotf2( tile, b, k ); } ); +#else + call_dpotf2_functor( tile, b, k ) ); +#endif // __TBB_CPP11_LAMBDAS_PRESENT + t[k] = new continue_ptr_type[p]; + u[k] = new continue_ptr_type *[p]; + + for ( int j = k+1; j < p; ++j ) { + t[k][j] = new continue_type( g, +#if __TBB_CPP11_LAMBDAS_PRESENT + [=]( const tbb::flow::continue_msg & ) { call_dtrsm( tile, b, k, j ); } ); +#else + call_dtrsm_functor( tile, b, k, j ) ); +#endif // __TBB_CPP11_LAMBDAS_PRESENT + make_edge( *c[k], *t[k][j] ); + u[k][j] = new continue_ptr_type[p]; + + for ( int i = k+1; i <= j; ++i ) { + u[k][j][i] = new continue_type( g, +#if __TBB_CPP11_LAMBDAS_PRESENT + [=]( const tbb::flow::continue_msg & ) { call_dsyr2k( tile, b, k, j, i ); } ); +#else + call_dsyr2k_functor( tile, b, k, j, i ) ); +#endif // __TBB_CPP11_LAMBDAS_PRESENT + + if ( k < p-2 && k+1 != j && k+1 != i ) { + make_edge( *u[k][j][i], *u[k+1][j][i] ); + } + + make_edge( *t[k][j], *u[k][j][i] ); + + if ( i != j ) { + make_edge( *t[k][i], *u[k][j][i] ); + } + + if ( k < p-2 && j > i && i == k+1 ) { + make_edge( *u[k][j][i], *t[i][j] ); + } + } + } + + if ( k != p-1 ) { + make_edge( *u[k][k+1][k+1], *c[k+1] ); + } + } + + c[0]->try_put( tbb::flow::continue_msg() ); + g.wait_for_all(); + } +}; // class algorithm_depend + +/************************************************************ + End dependence graph based version of cholesky +************************************************************/ + +bool process_args( int argc, char *argv[] ) { + utility::parse_cli_arguments( argc, argv, + utility::cli_argument_pack() + //"-h" option for displaying help is present implicitly + .positional_arg( g_n, "size", "the row/column size of NxN matrix (size <= 46000)" ) + .positional_arg( g_b, "blocksize", "the block size; size must be a multiple of the blocksize" ) + .positional_arg( g_num_trials, "num_trials", "the number of times to run each algorithm" ) + .positional_arg( g_output_prefix, "output_prefix", + "if provided the prefix will be preappended to output files:\n" + " output_prefix_posdef.txt\n" + " output_prefix_X.txt; where X is the algorithm used\n" + " if output_prefix is not provided, no output will be written" ) + .positional_arg( g_alg_name, "algorithm", "name of the used algorithm - can be dpotrf, crout, depend or join" ) + .positional_arg( g_num_tbb_threads, "num_tbb_threads", "number of started TBB threads" ) + + .arg( g_input_file_name, "input_file", "if provided it will be read to get the input matrix" ) + .arg( g_benchmark_run, "-x", "skips all validation" ) + ); + + if ( g_n > 46000 ) { + printf( "ERROR: invalid 'size' value (must be less or equal 46000): %d\n", g_n ); + return false; + } + + if ( g_n%g_b != 0 ) { + printf( "ERROR: size %d must be a multiple of the blocksize %d\n", g_n, g_b ); + return false; + } + + if ( g_n/g_b > 256 ) { + // Because tile index size is 1 byte only in tag_t type + printf( "ERROR: size / blocksize must be less or equal 256, but %d / %d = %d\n", g_n, g_b, g_n/g_b ); + return false; + } + + if ( g_b == -1 || (g_n == -1 && g_input_file_name == NULL) ) { + return false; + } + + return true; +} + +int main(int argc, char *argv[]) { + typedef std::map< std::string, algorithm * > algmap_t; + algmap_t algmap; + + // Init algorithms + algmap.insert(std::pair("dpotrf", new algorithm_dpotrf)); + algmap.insert(std::pair("crout", new algorithm_crout)); + algmap.insert(std::pair("depend", new algorithm_depend)); + algmap.insert(std::pair("join", new algorithm_join)); + + if ( !process_args( argc, argv ) ) { + printf( "ERROR: Invalid arguments. Run: %s -h\n", argv[0] ); + exit( 1 ); + } + + tbb::task_scheduler_init init( g_num_tbb_threads ); + double *A = NULL; + + // Read input matrix + matrix_init( A, g_n, g_input_file_name ); + + // Write input matrix if output_prefix is set and we didn't read from a file + if ( !g_input_file_name && g_output_prefix ) { + std::string s( g_output_prefix ); + s += "_posdef.txt"; + matrix_write( A, g_n, s.c_str() ); + } + + if ( g_alg_name.empty() ) { + for ( algmap_t::iterator i = algmap.begin(); i != algmap.end(); ++i ) { + algorithm* const alg = i->second; + (*alg)( A, g_n, g_b, g_num_trials ); + } + } + else { + algmap_t::iterator alg_iter = algmap.find(g_alg_name); + + if ( alg_iter != algmap.end() ) { + algorithm* const alg = alg_iter->second; + (*alg)( A, g_n, g_b, g_num_trials ); + } + else { + printf( "ERROR: Invalid algorithm name: %s\n", g_alg_name.c_str() ); + exit( 2 ); + } + } + + free( A ); + return 0; +} diff --git a/xdl/third_party/tbb/examples/graph/cholesky/init.cpp b/xdl/third_party/tbb/examples/graph/cholesky/init.cpp new file mode 100644 index 00000000..4fd8992a --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/cholesky/init.cpp @@ -0,0 +1,138 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +#include +#include +#include +#include +#include + +static void posdef_gen( double * A, int n ) +{ + /* Allocate memory for the matrix and its transpose */ + double *L = (double *)calloc( sizeof( double ), n*n ); + assert( L ); + + double *LT = (double *)calloc( sizeof( double ), n*n) ; + assert( LT ); + + memset( A, 0, sizeof( double )*n*n ); + + /* Generate a conditioned matrix and fill it with random numbers */ + for ( int j = 0; j < n; ++j ) { + for ( int k = 0; k < j; ++k ) { + // The initial value has to be between [0,1]. + L[k*n+j] = ( ( (j*k) / ((double)(j+1)) / ((double)(k+2)) * 2.0) - 1.0 ) / ((double)n); + } + + L[j*n+j] = 1; + } + + /* Compute transpose of the matrix */ + for ( int i = 0; i < n; ++i ) { + for ( int j = 0; j < n; ++j ) { + LT[j*n+i] = L[i*n+j]; + } + } + cblas_dgemm( CblasColMajor, CblasNoTrans, CblasNoTrans, n, n, n, 1, L, n, LT, n, 0, A, n ); + + free( L ); + free( LT ); +} + +// Read the matrix from the input file +void matrix_init( double * &A, int &n, const char *fname ) { + if( fname ) { + int i; + int j; + FILE *fp; + + fp = fopen( fname, "r" ); + if ( fp == NULL ) { + fprintf( stderr, "\nFile does not exist\n" ); + exit( 0 ); + } + if ( fscanf( fp, "%d", &n ) <= 0 ) { + fprintf( stderr,"\nCouldn't read n from %s\n", fname ); + exit( 1 ); + } + A = (double *)calloc( sizeof( double ), n*n ); + for ( i = 0; i < n; ++i ) { + for ( j = 0; j <= i; ++j ) { + if( fscanf( fp, "%lf ", &A[i*n+j] ) <= 0) { + fprintf( stderr,"\nMatrix size incorrect %i %i\n", i, j ); + exit( 1 ); + } + if ( i != j ) { + A[j*n+i] = A[i*n+j]; + } + } + } + fclose( fp ); + } else { + A = (double *)calloc( sizeof( double ), n*n ); + posdef_gen( A, n ); + } +} + +// write matrix to file +void matrix_write ( double *A, int n, const char *fname, bool is_triangular = false ) +{ + if( fname ) { + int i = 0; + int j = 0; + FILE *fp = NULL; + + fp = fopen( fname, "w" ); + if ( fp == NULL ) { + fprintf( stderr, "\nCould not open file %s for writing.\n", fname ); + exit( 0 ); + } + fprintf( fp, "%d\n", n ); + for ( i = 0; i < n; ++i) { + for ( j = 0; j <= i; ++j ) { + fprintf( fp, "%lf ", A[j*n+i] ); + } + if ( !is_triangular ) { + for ( ; j < n; ++j ) { + fprintf( fp, "%lf ", A[i*n+j] ); + } + } else { + for ( ; j < n; ++j ) { + fprintf( fp, "%lf ", 0.0 ); + } + } + fprintf( fp, "\n" ); + } + if ( is_triangular ) { + fprintf( fp, "\n" ); + for ( i = 0; i < n; ++i ) { + for ( j = 0; j < i; ++j ) { + fprintf( fp, "%lf ", 0.0 ); + } + for ( ; j < n; ++j ) { + fprintf( fp, "%lf ", A[i*n+j] ); + } + fprintf( fp, "\n" ); + } + } + fclose( fp ); + } +} diff --git a/xdl/third_party/tbb/examples/graph/cholesky/msvs/cholesky.sln b/xdl/third_party/tbb/examples/graph/cholesky/msvs/cholesky.sln new file mode 100644 index 00000000..87ed855b --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/cholesky/msvs/cholesky.sln @@ -0,0 +1,28 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.40629.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cholesky", "cholesky.vcxproj", "{3AA40693-F93D-4D4B-B32E-068F511A252E}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {3AA40693-F93D-4D4B-B32E-068F511A252E}.Debug|Win32.ActiveCfg = Debug|Win32 + {3AA40693-F93D-4D4B-B32E-068F511A252E}.Debug|Win32.Build.0 = Debug|Win32 + {3AA40693-F93D-4D4B-B32E-068F511A252E}.Debug|x64.ActiveCfg = Debug|x64 + {3AA40693-F93D-4D4B-B32E-068F511A252E}.Debug|x64.Build.0 = Debug|x64 + {3AA40693-F93D-4D4B-B32E-068F511A252E}.Release|Win32.ActiveCfg = Release|Win32 + {3AA40693-F93D-4D4B-B32E-068F511A252E}.Release|Win32.Build.0 = Release|Win32 + {3AA40693-F93D-4D4B-B32E-068F511A252E}.Release|x64.ActiveCfg = Release|x64 + {3AA40693-F93D-4D4B-B32E-068F511A252E}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/xdl/third_party/tbb/examples/graph/cholesky/msvs/cholesky.vcxproj b/xdl/third_party/tbb/examples/graph/cholesky/msvs/cholesky.vcxproj new file mode 100644 index 00000000..d906a466 --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/cholesky/msvs/cholesky.vcxproj @@ -0,0 +1,206 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + cholesky + {3AA40693-F93D-4D4B-B32E-068F511A252E} + cholesky + Win32Proj + + + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.40219.1 + $(TEMP)\tbb_examples\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Configuration)\ + false + $(TEMP)\tbb_examples\$(Platform)\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Platform)\$(Configuration)\ + false + $(TEMP)\tbb_examples\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Configuration)\ + false + $(TEMP)\tbb_examples\$(Platform)\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Platform)\$(Configuration)\ + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + $(TBBROOT)\include;$(MKLROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG;%(PreprocessorDefinitions) + MultiThreadedDebugDLL + + + ProgramDatabase + GenerateParallelCode + + + tbb_debug.lib;mkl_rt.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc12;$(MKLROOT)\lib\ia32;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc12;%(AdditionalLibraryDirectories) + true + Console + MachineX86 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 debug "$(OutDir)" + + + + + X64 + + + Disabled + $(TBBROOT)\include;$(MKLROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG;%(PreprocessorDefinitions) + MultiThreadedDebugDLL + + + ProgramDatabase + GenerateParallelCode + + + tbb_debug.lib;mkl_rt.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc12;$(MKLROOT)\lib\intel64;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc12;%(AdditionalLibraryDirectories) + true + Console + MachineX64 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 debug "$(OutDir)" + + + + + $(TBBROOT)\include;$(MKLROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + + + ProgramDatabase + GenerateParallelCode + + + tbb.lib;mkl_rt.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc12;$(MKLROOT)\lib\ia32;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc12;%(AdditionalLibraryDirectories) + true + Console + true + true + MachineX86 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 release "$(OutDir)" + + + + + X64 + + + $(TBBROOT)\include;$(MKLROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + + + ProgramDatabase + GenerateParallelCode + + + tbb.lib;mkl_rt.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc12;$(MKLROOT)\lib\intel64;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc12;%(AdditionalLibraryDirectories) + true + Console + true + true + MachineX64 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 release "$(OutDir)" + + + + + + + + + + + + + \ No newline at end of file diff --git a/xdl/third_party/tbb/examples/graph/cholesky/readme.html b/xdl/third_party/tbb/examples/graph/cholesky/readme.html new file mode 100644 index 00000000..cb82eba3 --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/cholesky/readme.html @@ -0,0 +1,415 @@ + + + + + + Intel® Threading Building Blocks. Cholesky sample + + + + + +

+ This directory contains an example of several versions of Cholesky Factorization algorithm. +
+
dpotrf: An implementation that calls the Intel® Math Kernel Library (Intel® MKL) dpotrf function to directly perform the factorization. This can be a serial implementation or threaded implementation depending on the version of the Intel MKL library that is linked against. +
+
crout: A serial implementation that uses the Crout-Cholesky algorithm for factorization. The same approach is parallelized for the other Intel® Threading Building Blocks (Intel® TBB) based approaches below. +
+
depend: A parallel version of Crout-Cholesky factorization that uses an Intel TBB flow graph. This version uses a dependence graph made solely of continue_node objects. This an inspector-executor approach, where a loop nest that is similar to the serial implementation is used to create an unrolled version of the computation. Where the Intel MKL calls would have been made in the original serial implementation of Crout-Cholesky, instead nodes are created and these nodes are linked by edges to the other nodes that they are dependent upon. The resulting graph is relatively large, with a node for each instance of each Intel MKL call. For example, there are many nodes that call dtrsm; one for each invocation of dtrsm in the serial implementation. The is very little overhead in message management for this version and so it is often the highest performing. +
+
join: A parallel version of Crout-Cholesky factorization that uses an Intel TBB flow graph. This version uses a data flow approach. This is a small, compact graph that passes tiles along its edges. There is one node per type of Intel MKL call, plus join_nodes that combine the inputs required for each call. So for example, there is only a single node that applies all calls to dtrsm. This node is invoked when the tiles that hold the inputs and outputs for an invocation are matched together in the tag-matching join_node that precedes it. The tag represents the iteration values of the i, j, k loops in the serial implementation at that invocation of the call. There is some overhead in message matching and forwarding, so it may not perform as well as the dependence graph implementation. +
+
This sample code requires a recent Intel TBB library (one that supports the flow graph). And also the Intel MKL library. +

+ +
+
System Requirements
+ +
+

+ For the most up to date system requirements, see the release notes. +

+
+
+ +
+
Files
+ +
+
+
cholesky.cpp +
Source code for example. +
init.cpp +
Source code for example. +
Makefile +
Makefile for building the example. +
+
+
+ +
+
Directories
+ +
+
+
msvs +
Contains Microsoft* Visual Studio* workspace for building and running the example (Windows* systems only). +
xcode +
Contains Xcode* IDE workspace for building and running the example (macOS* systems only). +
+

For information about the minimum supported version of IDE, see release notes.

+
+
+ +
+
Build instructions
+ +
+

General build directions can be found here.

+

Also, you need to source Intel MKL environment variables.

+
+
+ +
+
Usage
+ +
+
+
cholesky [size=value] [blocksize=value] [num_trials=value] [output_prefix=value] [algorithm=value] [num_tbb_threads=value] [input_file=value] [-x] [-h] [size [blocksize [num_trials [output_prefix [algorithm [num_tbb_threads]]]]]] +
where: +
size - the row/column size of NxN matrix (size <= 46000) +
blocksize - the block size; size must be a multiple of the blocksize +
num_trials - the number of times to run each algorithm +
output_prefix - if provided the prefix will be prepended to output files: + output_prefix_posdef.txt and + output_prefix_X.txt; where X is the algorithm used +
if output_prefix is not provided, no output will be written +
algorithm - name of the used algorithm - can be dpotrf, crout, depend or join +
num_tbb_threads - number of started TBB threads +
input_file - if provided it will be read to get the input matrix +
-x - skips all validation +
-h - show this message +
+
+
+ +
+ Up to parent directory +
+
+
Legal Information
+ +
+

+ Intel and the Intel logo are trademarks of Intel Corporation in the U.S. and/or other countries. +
* Other names and brands may be claimed as the property of others. +
© 2018, Intel Corporation +

+
+
+ + + diff --git a/xdl/third_party/tbb/examples/graph/cholesky/xcode/cholesky.xcodeproj/project.pbxproj b/xdl/third_party/tbb/examples/graph/cholesky/xcode/cholesky.xcodeproj/project.pbxproj new file mode 100644 index 00000000..6529166d --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/cholesky/xcode/cholesky.xcodeproj/project.pbxproj @@ -0,0 +1,316 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + A1F593A60B8F042A00073279 /* Cholesky.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F593A50B8F042A00073279 /* Cholesky.cpp */; }; + A1F593A60B8F053A00073279 /* init.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F593A50B8F053A00073279 /* init.cpp */; }; +/* End PBXBuildFile section */ + +/* Begin PBXBuildRule section */ + C3C58951218B5ACC00DAC94C /* PBXBuildRule */ = { + isa = PBXBuildRule; + compilerSpec = com.intel.compilers.icc.latest; + fileType = sourcecode.cpp; + isEditable = 1; + outputFiles = ( + ); + script = "# Type a script or drag a script file from your workspace to insert its path.\n"; + }; +/* End PBXBuildRule section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 8DD76F690486A84900D96B5E /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 12; + dstPath = ""; + dstSubfolderSpec = 16; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 8DD76F6C0486A84900D96B5E /* Cholesky */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = Cholesky; sourceTree = BUILT_PRODUCTS_DIR; }; + A1F593A50B8F042A00073279 /* Cholesky.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = Cholesky.cpp; path = ../Cholesky.cpp; sourceTree = SOURCE_ROOT; }; + A1F593A50B8F053A00073279 /* init.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = init.cpp; path = ../init.cpp; sourceTree = SOURCE_ROOT; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 8DD76F660486A84900D96B5E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 08FB7794FE84155DC02AAC07 /* Cholesky */ = { + isa = PBXGroup; + children = ( + 08FB7795FE84155DC02AAC07 /* Source */, + 1AB674ADFE9D54B511CA2CBB /* Products */, + ); + name = Cholesky; + sourceTree = ""; + }; + 08FB7795FE84155DC02AAC07 /* Source */ = { + isa = PBXGroup; + children = ( + A1F593A50B8F042A00073279 /* Cholesky.cpp */, + A1F593A50B8F053A00073279 /* init.cpp */, + ); + name = Source; + sourceTree = ""; + }; + 1AB674ADFE9D54B511CA2CBB /* Products */ = { + isa = PBXGroup; + children = ( + 8DD76F6C0486A84900D96B5E /* Cholesky */, + ); + name = Products; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 8DD76F620486A84900D96B5E /* Cholesky */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "Cholesky" */; + buildPhases = ( + 8DD76F640486A84900D96B5E /* Sources */, + 8DD76F660486A84900D96B5E /* Frameworks */, + 8DD76F690486A84900D96B5E /* CopyFiles */, + ); + buildRules = ( + C3C58951218B5ACC00DAC94C /* PBXBuildRule */, + ); + dependencies = ( + ); + name = Cholesky; + productInstallPath = "$(HOME)/bin"; + productName = Cholesky; + productReference = 8DD76F6C0486A84900D96B5E /* Cholesky */; + productType = "com.apple.product-type.tool"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 08FB7793FE84155DC02AAC07 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1000; + }; + buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "cholesky" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 1; + knownRegions = ( + en, + ); + mainGroup = 08FB7794FE84155DC02AAC07 /* Cholesky */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 8DD76F620486A84900D96B5E /* Cholesky */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + 8DD76F640486A84900D96B5E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + A1F593A60B8F042A00073279 /* Cholesky.cpp in Sources */, + A1F593A60B8F053A00073279 /* init.cpp in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + A1F593C60B8F0E6E00073279 /* Debug64 */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_VERSION = ""; + HEADER_SEARCH_PATHS = "$(inherited)"; + ICC_CXX_LANG_DIALECT = "c++11"; + INSTALL_PATH = "$(HOME)/bin"; + LIBRARY_SEARCH_PATHS = "$(inherited)"; + PRODUCT_NAME = Cholesky; + ZERO_LINK = NO; + }; + name = Debug64; + }; + A1F593C70B8F0E6E00073279 /* Release64 */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_GENERATE_DEBUGGING_SYMBOLS = NO; + GCC_VERSION = ""; + HEADER_SEARCH_PATHS = "$(inherited)"; + ICC_CXX_LANG_DIALECT = "c++11"; + INSTALL_PATH = "$(HOME)/bin"; + LIBRARY_SEARCH_PATHS = "$(inherited)"; + PRODUCT_NAME = Cholesky; + ZERO_LINK = NO; + }; + name = Release64; + }; + A1F593C80B8F0E6E00073279 /* Debug64 */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_ENABLE_CPP_RTTI = YES; + GCC_MODEL_TUNING = ""; + GCC_NO_COMMON_BLOCKS = YES; + GCC_VERSION = ""; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + /opt/intel/tbb/include, + /opt/intel/mkl/include, + ); + ICC_CXX_LANG_DIALECT = "c++11"; + LD_RUNPATH_SEARCH_PATHS = "$(TBBROOT)/lib /opt/intel/tbb/lib $(MKLROOT)/lib /opt/intel/mkl/lib"; + LIBRARY_SEARCH_PATHS = ( + /opt/intel/tbb/lib, + /opt/intel/mkl/lib, + ); + MACOSX_DEPLOYMENT_TARGET = 10.11; + ONLY_ACTIVE_ARCH = YES; + OTHER_CPLUSPLUSFLAGS = ( + "$(OTHER_CFLAGS)", + "-m64", + ); + OTHER_LDFLAGS = ( + "-m64", + "-ltbb_debug", + "-lmkl_intel_lp64", + "-lmkl_sequential", + "-lmkl_core", + ); + PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO; + SYMROOT = "/tmp/tbb-$(USER)"; + VALID_ARCHS = x86_64; + }; + name = Debug64; + }; + A1F593C90B8F0E6E00073279 /* Release64 */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_ENABLE_CPP_RTTI = YES; + GCC_MODEL_TUNING = ""; + GCC_NO_COMMON_BLOCKS = YES; + GCC_VERSION = ""; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + /opt/intel/tbb/include, + /opt/intel/mkl/include, + ); + ICC_CXX_LANG_DIALECT = "c++11"; + LD_RUNPATH_SEARCH_PATHS = "$(TBBROOT)/lib /opt/intel/tbb/lib $(MKLROOT)/lib /opt/intel/mkl/lib"; + LIBRARY_SEARCH_PATHS = ( + /opt/intel/tbb/lib, + /opt/intel/mkl/lib, + ); + MACOSX_DEPLOYMENT_TARGET = 10.11; + OTHER_CPLUSPLUSFLAGS = ( + "$(OTHER_CFLAGS)", + "-m64", + ); + OTHER_LDFLAGS = ( + "-m64", + "-ltbb", + "-lmkl_intel_lp64", + "-lmkl_sequential", + "-lmkl_core", + ); + PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO; + SYMROOT = "/tmp/tbb-$(USER)"; + VALID_ARCHS = x86_64; + }; + name = Release64; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "Cholesky" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A1F593C60B8F0E6E00073279 /* Debug64 */, + A1F593C70B8F0E6E00073279 /* Release64 */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug64; + }; + 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "cholesky" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A1F593C80B8F0E6E00073279 /* Debug64 */, + A1F593C90B8F0E6E00073279 /* Release64 */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug64; + }; +/* End XCConfigurationList section */ + }; + rootObject = 08FB7793FE84155DC02AAC07 /* Project object */; +} diff --git a/xdl/third_party/tbb/examples/graph/dining_philosophers/Makefile b/xdl/third_party/tbb/examples/graph/dining_philosophers/Makefile new file mode 100644 index 00000000..63d42734 --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/dining_philosophers/Makefile @@ -0,0 +1,58 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +# GNU Makefile that builds and runs example. +run_cmd= +PROG=dining_philosophers +ARGS= auto 5 +LIGHT_ARGS= auto 3 + +ifneq (,$(shell which icc 2>/dev/null)) +CXX=icc +endif # icc + +ifeq ($(shell uname), Linux) +ifeq ($(target), android) +LIBS+= --sysroot=$(SYSROOT) +run_cmd=../../common/android.linux.launcher.sh +else +LIBS+= -lrt +endif +else ifeq ($(shell uname), Darwin) +override CXXFLAGS += -Wl,-rpath,$(TBBROOT)/lib +endif + +all: release test + +release: dining_philosophers.cpp + $(CXX) -O2 -DNDEBUG -D_CONSOLE $(CXXFLAGS) -o $(PROG) $^ -ltbb $(LIBS) + +debug: dining_philosophers.cpp + $(CXX) -O0 -D_CONSOLE -g -DTBB_USE_DEBUG $(CXXFLAGS) -o $(PROG) $^ -ltbb_debug $(LIBS) + +profile: override CXXFLAGS += -DTBB_USE_THREADING_TOOLS -g +profile: release + +clean: + rm -f $(PROG) *.o *.d + +test: + $(run_cmd) ./$(PROG) $(ARGS) + +light_test: + $(run_cmd) ./$(PROG) $(LIGHT_ARGS) diff --git a/xdl/third_party/tbb/examples/graph/dining_philosophers/Makefile.windows b/xdl/third_party/tbb/examples/graph/dining_philosophers/Makefile.windows new file mode 100644 index 00000000..6a3267b6 --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/dining_philosophers/Makefile.windows @@ -0,0 +1,48 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +# Common Makefile that builds and runs example. + +# Just specify your program basename +PROG=dining_philosophers +ARGS= auto 5 +LIGHT_ARGS= auto 3 + +# Trying to find if icl.exe is set +CXX1 = $(TBB_CXX)- +CXX2 = $(CXX1:icl.exe-=icl.exe) +CXX = $(CXX2:-=cl.exe) + +# The C++ compiler options +MYCXXFLAGS = /TP /EHsc /W3 /nologo /D _CONSOLE /D _MBCS /D WIN32 /D _CRT_SECURE_NO_DEPRECATE $(CXXFLAGS) +MYLDFLAGS =/INCREMENTAL:NO /NOLOGO /DEBUG /FIXED:NO $(LDFLAGS) + +all: release test +release: + $(CXX) ./dining_philosophers.cpp /MD /O2 /D NDEBUG $(MYCXXFLAGS) /link tbb.lib $(LIBS) $(MYLDFLAGS) /OUT:$(PROG).exe +debug: + $(CXX) ./dining_philosophers.cpp /MDd /Od /Zi /D _DEBUG $(MYCXXFLAGS) /link tbb_debug.lib $(LIBS) $(MYLDFLAGS) /OUT:$(PROG).exe +profile: + $(CXX) ./dining_philosophers.cpp /MD /O2 /Zi /D NDEBUG $(MYCXXFLAGS) /D TBB_USE_THREADING_TOOLS /link tbb.lib $(LIBS) $(MYLDFLAGS) /OUT:$(PROG).exe +clean: + @cmd.exe /C del $(PROG).exe *.obj *.?db *.manifest +test: + $(PROG) $(ARGS) +light_test: + $(PROG) $(LIGHT_ARGS) + diff --git a/xdl/third_party/tbb/examples/graph/dining_philosophers/dining_philosophers.cpp b/xdl/third_party/tbb/examples/graph/dining_philosophers/dining_philosophers.cpp new file mode 100644 index 00000000..66b18b64 --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/dining_philosophers/dining_philosophers.cpp @@ -0,0 +1,306 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +#if _MSC_VER + // Suppress "decorated name length exceeded, name was truncated" warning + #pragma warning (disable: 4503) +#endif + +#include "tbb/flow_graph.h" +#include "tbb/task_scheduler_init.h" +#include "tbb/tick_count.h" +#include "tbb/tbb_thread.h" +#include "tbb/atomic.h" +#include "tbb/spin_mutex.h" +#include +#include "../../common/utility/utility.h" +#include +#include + +// Each philosopher is an object, and is invoked in the think() function_node, the +// eat() function_node and forward() multifunction_node. +// +// The graph is constructed, and each think() function_node is started with a continue_msg. +// +// The philosopher will think, then gather two chopsticks, eat, place the chopsticks back, +// and if they have not completed the required number of cycles, will start to think() again +// by sending a continue_msg to their corresponding think() function_node. +// +// The reserving join has as its inputs the left and right chopstick queues an a queue +// that stores the continue_msg emitted by the function_node after think()ing is done. +// When all three inputs are available, a tuple of the inputs will be forwarded to the +// eat() function_node. The output of the eat() function_node is sent to the forward() +// multifunction_node. + +const tbb::tick_count::interval_t think_time(1.0); +const tbb::tick_count::interval_t eat_time(1.0); +const int num_times = 10; + +tbb::tick_count t0; +bool verbose = false; + +const char *names[] = { "Archimedes", "Bakunin", "Confucius", "Democritus", "Euclid" + , "Favorinus", "Geminus", "Heraclitus", "Ichthyas", "Jason of Nysa", + "Kant", "Lavrov", "Metrocles", "Nausiphanes", "Onatas", "Phaedrus", + "Quillot", "Russell", "Socrates", "Thales", "Udayana", + "Vernadsky", "Wittgenstein", "Xenophilus", "Yen Yuan", "Zenodotus" +}; +const int NumPhilosophers = sizeof(names) / sizeof(char*); + +struct RunOptions { + utility::thread_number_range threads; + int number_of_philosophers; + bool silent; + RunOptions(utility::thread_number_range threads_, int number_of_philosophers_, bool silent_) : + threads(threads_), number_of_philosophers(number_of_philosophers_), silent(silent_) { } +}; + +RunOptions ParseCommandLine(int argc, char *argv[]) { + int auto_threads = tbb::task_scheduler_init::default_num_threads(); + utility::thread_number_range threads(tbb::task_scheduler_init::default_num_threads, auto_threads, auto_threads); + int nPhilosophers = 5; + bool verbose = false; + char charbuf[100]; + std::sprintf(charbuf, "%d", NumPhilosophers); + std::string pCount = "how many philosophers, from 2-"; + pCount += charbuf; + + utility::cli_argument_pack cli_pack; + cli_pack.positional_arg(threads, "n-of_threads", utility::thread_number_range_desc) + .positional_arg(nPhilosophers, "n-of-philosophers", pCount) + .arg(verbose,"verbose","verbose output"); + utility::parse_cli_arguments(argc, argv, cli_pack); + if(nPhilosophers < 2 || nPhilosophers > NumPhilosophers) { + std::cout << "Number of philosophers (" << nPhilosophers << ") out of range [2:" << NumPhilosophers << "]\n"; + std::cout << cli_pack.usage_string(argv[0]) << std::flush; + std::exit(1); + } + return RunOptions(threads, nPhilosophers,!verbose); +} + + +tbb::spin_mutex my_mutex; + +class chopstick {}; + +using namespace tbb::flow; + +typedef tbb::flow::tuple join_output; +typedef join_node< join_output, reserving > join_node_type; + +typedef function_node think_node_type; +typedef function_node eat_node_type; +typedef multifunction_node forward_node_type; + +class philosopher { +public: + + philosopher( const char *name ) : + my_name(name), my_count(num_times) { } + + ~philosopher() { + } + + void check(); + const char *name() const { return my_name; } + +private: + + friend std::ostream& operator<<(std::ostream& o, philosopher const &p); + + const char *my_name; + int my_count; + + friend class think_node_body; + friend class eat_node_body; + friend class forward_node_body; + + void think( ); + void eat(); + void forward( const continue_msg &in, forward_node_type::output_ports_type &out_ports ); +}; + +std::ostream& operator<<(std::ostream& o, philosopher const &p) { + o << "< philosopher[" << reinterpret_cast(const_cast(&p)) << "] " << p.name() + << ", my_count=" << p.my_count; + return o; +} + +class think_node_body { + philosopher& my_philosopher; +public: + think_node_body( philosopher &p ) : my_philosopher(p) { } + think_node_body( const think_node_body &other ) : my_philosopher(other.my_philosopher) { } + continue_msg operator()( continue_msg /*m*/) { + my_philosopher.think(); + return continue_msg(); + } +}; + +class eat_node_body { + philosopher &my_philosopher; +public: + eat_node_body( philosopher &p) : my_philosopher(p) {} + eat_node_body( const eat_node_body &other ) : my_philosopher(other.my_philosopher) { } + continue_msg operator()(const join_output &in) { + my_philosopher.eat(); + return continue_msg(); + } +}; + +class forward_node_body { + philosopher &my_philosopher; +public: + forward_node_body( philosopher &p) : my_philosopher(p) {} + forward_node_body( const forward_node_body &other ) : my_philosopher(other.my_philosopher) { } + void operator()( const continue_msg &in, forward_node_type::output_ports_type &out) { + my_philosopher.forward( in, out); + } +}; + +void philosopher::check() { + if ( my_count != 0 ) { + std::printf("ERROR: philosopher %s still had to run %d more times\n", name(), my_count); + std::exit(1); + } +} + +void philosopher::forward( const continue_msg &/*in*/, forward_node_type::output_ports_type &out_ports ) { + if(my_count < 0) abort(); + --my_count; + (void)tbb::flow::get<1>(out_ports).try_put(chopstick()); + (void)tbb::flow::get<2>(out_ports).try_put(chopstick()); + if (my_count > 0) { + (void)tbb::flow::get<0>(out_ports).try_put(continue_msg()); //start thinking again + } else { + if(verbose) { + tbb::spin_mutex::scoped_lock lock(my_mutex); + std::printf("%s has left the building\n", name()); + } + } +} + +void philosopher::eat() { + if(verbose) { + tbb::spin_mutex::scoped_lock lock(my_mutex); + std::printf("%s eating\n", name()); + } + tbb::this_tbb_thread::sleep(eat_time); + if(verbose) { + tbb::spin_mutex::scoped_lock lock(my_mutex); + std::printf("%s done eating\n", name()); + } +} + +void philosopher::think() { + if(verbose) { + tbb::spin_mutex::scoped_lock lock(my_mutex); + std::printf("%s thinking\n", name()); + } + tbb::this_tbb_thread::sleep(think_time); + if(verbose) { + tbb::spin_mutex::scoped_lock lock(my_mutex); + std::printf("%s done thinking\n", name()); + } +} + +typedef queue_node thinking_done_type; + +int main(int argc, char *argv[]) { + try { + tbb::tick_count main_time = tbb::tick_count::now(); + int num_threads; + int num_philosophers; + + RunOptions options = ParseCommandLine(argc, argv); + num_philosophers = options.number_of_philosophers; + verbose = !options.silent; + + for(num_threads = options.threads.first; num_threads <= options.threads.last; num_threads = options.threads.step(num_threads)) { + + tbb::task_scheduler_init init(num_threads); + + graph g; + + if(verbose) std::cout << std::endl << num_philosophers << " philosophers with " + << num_threads << " threads" << std::endl << std::endl; + t0 = tbb::tick_count::now(); + + std::vector > places(num_philosophers, queue_node(g)); + std::vector philosophers; + philosophers.reserve(num_philosophers); + std::vector think_nodes; + think_nodes.reserve(num_philosophers); + std::vector done_vector(num_philosophers, thinking_done_type(g)); + std::vector join_vector(num_philosophers,join_node_type(g)); + std::vector eat_nodes; + eat_nodes.reserve(num_philosophers); + std::vector forward_nodes; + forward_nodes.reserve(num_philosophers); + for ( int i = 0; i < num_philosophers; ++i ) { + places[i].try_put(chopstick()); + philosophers.push_back( philosopher( names[i] ) ); // allowed because of default generated assignment + if(verbose) { + tbb::spin_mutex::scoped_lock lock(my_mutex); + std::cout << "Built philosopher " << philosophers[i] << std::endl; + } + think_nodes.push_back(new think_node_type(g, unlimited, think_node_body(philosophers[i]))); + eat_nodes.push_back( new eat_node_type(g, unlimited, eat_node_body(philosophers[i]))); + forward_nodes.push_back( new forward_node_type(g, unlimited, forward_node_body(philosophers[i]))); + } + + // attach chopstick buffers and think function_nodes to joins + for(int i = 0; i < num_philosophers; ++i) { + make_edge( *think_nodes[i], done_vector[i] ); + make_edge( done_vector[i], input_port<0>(join_vector[i]) ); + make_edge( places[i], input_port<1>(join_vector[i]) ); // left chopstick + make_edge( places[(i+1) % num_philosophers], input_port<2>(join_vector[i]) ); // right chopstick + make_edge( join_vector[i], *eat_nodes[i] ); + make_edge( *eat_nodes[i], *forward_nodes[i] ); + make_edge( output_port<0>(*forward_nodes[i]), *think_nodes[i] ); + make_edge( output_port<1>(*forward_nodes[i]), places[i] ); + make_edge( output_port<2>(*forward_nodes[i]), places[(i+1) % num_philosophers] ); + } + + // start all the philosophers thinking + for(int i = 0; i < num_philosophers; ++i) think_nodes[i]->try_put(continue_msg()); + + g.wait_for_all(); + + tbb::tick_count t1 = tbb::tick_count::now(); + if(verbose) std::cout << std::endl << num_philosophers << " philosophers with " + << num_threads << " threads have taken " << (t1-t0).seconds() << "seconds" << std::endl; + + for ( int i = 0; i < num_philosophers; ++i ) philosophers[i].check(); + + for(int i = 0; i < num_philosophers; ++i) { + delete think_nodes[i]; + delete eat_nodes[i]; + delete forward_nodes[i]; + } + } + + utility::report_elapsed_time((tbb::tick_count::now() - main_time).seconds()); + return 0; + } catch(std::exception& e) { + std::cerr<<"error occurred. error text is :\"" < + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + dining_philosophers + {3894d1d2-a574-4937-ad56-726758efe5b7} + dining_philosophers + Win32Proj + + + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.40219.1 + $(TEMP)\tbb_examples\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Configuration)\ + false + $(TEMP)\tbb_examples\$(Platform)\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Platform)\$(Configuration)\ + false + $(TEMP)\tbb_examples\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Configuration)\ + false + $(TEMP)\tbb_examples\$(Platform)\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Platform)\$(Configuration)\ + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG;%(PreprocessorDefinitions) + MultiThreadedDebugDLL + + + ProgramDatabase + + + tbb_debug.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc12;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc12;%(AdditionalLibraryDirectories) + true + Console + MachineX86 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 debug "$(OutDir)" + + + + + X64 + + + Disabled + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG;%(PreprocessorDefinitions) + MultiThreadedDebugDLL + + + ProgramDatabase + + + tbb_debug.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc12;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc12;%(AdditionalLibraryDirectories) + true + Console + MachineX64 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 debug "$(OutDir)" + + + + + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + + + ProgramDatabase + + + tbb.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc12;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc12;%(AdditionalLibraryDirectories) + true + Console + true + true + MachineX86 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 release "$(OutDir)" + + + + + X64 + + + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + + + ProgramDatabase + + + tbb.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc12;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc12;%(AdditionalLibraryDirectories) + true + Console + true + true + MachineX64 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 release "$(OutDir)" + + + + + + + + + + + + \ No newline at end of file diff --git a/xdl/third_party/tbb/examples/graph/dining_philosophers/readme.html b/xdl/third_party/tbb/examples/graph/dining_philosophers/readme.html new file mode 100644 index 00000000..ada56dd7 --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/dining_philosophers/readme.html @@ -0,0 +1,383 @@ + + + + + + Intel® Threading Building Blocks. Dining_philosophers sample + + + + + +

+ The Dining Philosophers problem demonstrates tbb::flow and the use of the reserving join node to + solve the potential deadlock. +

+ This program runs some number of philosophers in parallel, each thinking and then waiting for chopsticks + to be available before eating. Eating and thinking are implemented with sleep(). The chopstick positions are represented by a queue_node with one item. +

+ +
+
System Requirements
+ +
+

+ For the most up to date system requirements, see the release notes. +

+
+
+ +
+
Files
+ +
+
+
dining_philosophers.cpp +
Source code for the example. +
Makefile +
Makefile for building the example. +
+
+
+ +
+
Directories
+ +
+
+
msvs +
Contains Microsoft* Visual Studio* workspace for building and running the example (Windows* systems only). +
xcode +
Contains Xcode* IDE workspace for building and running the example (macOS* systems only). +
+

For information about the minimum supported version of IDE, see release notes.

+
+
+ +
+
Build instructions
+ +
+

General build directions can be found here.

+
+
+ +
+ Up to parent directory +
+
+
Legal Information
+ +
+

+ Intel and the Intel logo are trademarks of Intel Corporation in the U.S. and/or other countries. +
* Other names and brands may be claimed as the property of others. +
© 2018, Intel Corporation +

+
+
+ + + diff --git a/xdl/third_party/tbb/examples/graph/dining_philosophers/xcode/dining_philosophers.xcodeproj/project.pbxproj b/xdl/third_party/tbb/examples/graph/dining_philosophers/xcode/dining_philosophers.xcodeproj/project.pbxproj new file mode 100644 index 00000000..83e62661 --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/dining_philosophers/xcode/dining_philosophers.xcodeproj/project.pbxproj @@ -0,0 +1,314 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + A1F593A60B8F042A00073279 /* dining_philosophers.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F593A50B8F042A00073279 /* dining_philosophers.cpp */; }; +/* End PBXBuildFile section */ + +/* Begin PBXBuildRule section */ + C3C58955218B5FE200DAC94C /* PBXBuildRule */ = { + isa = PBXBuildRule; + compilerSpec = com.intel.compilers.icc.latest; + fileType = sourcecode.cpp; + isEditable = 1; + outputFiles = ( + ); + script = "# Type a script or drag a script file from your workspace to insert its path.\n"; + }; +/* End PBXBuildRule section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 8DD76F690486A84900D96B5E /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 12; + dstPath = ""; + dstSubfolderSpec = 16; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 8DD76F6C0486A84900D96B5E /* dining_philosophers */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = dining_philosophers; sourceTree = BUILT_PRODUCTS_DIR; }; + A1F593A50B8F042A00073279 /* dining_philosophers.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = dining_philosophers.cpp; path = ../dining_philosophers.cpp; sourceTree = SOURCE_ROOT; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 8DD76F660486A84900D96B5E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 08FB7794FE84155DC02AAC07 /* dining_philosophers */ = { + isa = PBXGroup; + children = ( + 08FB7795FE84155DC02AAC07 /* Source */, + 1AB674ADFE9D54B511CA2CBB /* Products */, + ); + name = dining_philosophers; + sourceTree = ""; + }; + 08FB7795FE84155DC02AAC07 /* Source */ = { + isa = PBXGroup; + children = ( + A1F593A50B8F042A00073279 /* dining_philosophers.cpp */, + ); + name = Source; + sourceTree = ""; + }; + 1AB674ADFE9D54B511CA2CBB /* Products */ = { + isa = PBXGroup; + children = ( + 8DD76F6C0486A84900D96B5E /* dining_philosophers */, + ); + name = Products; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 8DD76F620486A84900D96B5E /* dining_philosophers */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "dining_philosophers" */; + buildPhases = ( + 8DD76F640486A84900D96B5E /* Sources */, + 8DD76F660486A84900D96B5E /* Frameworks */, + 8DD76F690486A84900D96B5E /* CopyFiles */, + ); + buildRules = ( + C3C58955218B5FE200DAC94C /* PBXBuildRule */, + ); + dependencies = ( + ); + name = dining_philosophers; + productInstallPath = "$(HOME)/bin"; + productName = dining_philosophers; + productReference = 8DD76F6C0486A84900D96B5E /* dining_philosophers */; + productType = "com.apple.product-type.tool"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 08FB7793FE84155DC02AAC07 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1000; + }; + buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "dining_philosophers" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 1; + knownRegions = ( + en, + ); + mainGroup = 08FB7794FE84155DC02AAC07 /* dining_philosophers */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 8DD76F620486A84900D96B5E /* dining_philosophers */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + 8DD76F640486A84900D96B5E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + A1F593A60B8F042A00073279 /* dining_philosophers.cpp in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + A1F593C60B8F0E6E00073279 /* Debug64 */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_VERSION = ""; + HEADER_SEARCH_PATHS = "$(inherited)"; + ICC_CXX_LANG_DIALECT = "c++11"; + INSTALL_PATH = "$(HOME)/bin"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited)"; + LIBRARY_SEARCH_PATHS = "$(inherited)"; + OTHER_LDFLAGS = ( + "-m64", + "-ltbb_debug", + ); + PRODUCT_NAME = dining_philosophers; + ZERO_LINK = NO; + }; + name = Debug64; + }; + A1F593C70B8F0E6E00073279 /* Release64 */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_GENERATE_DEBUGGING_SYMBOLS = NO; + GCC_VERSION = ""; + HEADER_SEARCH_PATHS = "$(inherited)"; + ICC_CXX_LANG_DIALECT = "c++11"; + INSTALL_PATH = "$(HOME)/bin"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited)"; + LIBRARY_SEARCH_PATHS = "$(inherited)"; + OTHER_LDFLAGS = ( + "-m64", + "-ltbb", + ); + PRODUCT_NAME = dining_philosophers; + ZERO_LINK = NO; + }; + name = Release64; + }; + A1F593C80B8F0E6E00073279 /* Debug64 */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_ENABLE_CPP_RTTI = YES; + GCC_MODEL_TUNING = ""; + GCC_NO_COMMON_BLOCKS = YES; + GCC_VERSION = ""; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(TBBROOT)/include", + /opt/intel/tbb/include, + ); + LD_RUNPATH_SEARCH_PATHS = "$(TBBROOT)/lib /opt/intel/tbb/lib"; + LIBRARY_SEARCH_PATHS = ( + "$(TBBROOT)/lib", + /opt/intel/tbb/lib, + ); + MACOSX_DEPLOYMENT_TARGET = 10.11; + ONLY_ACTIVE_ARCH = YES; + OTHER_CPLUSPLUSFLAGS = ( + "$(OTHER_CFLAGS)", + "-m64", + ); + OTHER_LDFLAGS = ( + "-m64", + "-ltbb_debug", + ); + PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO; + SYMROOT = "/tmp/tbb-$(USER)"; + VALID_ARCHS = x86_64; + }; + name = Debug64; + }; + A1F593C90B8F0E6E00073279 /* Release64 */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_ENABLE_CPP_RTTI = YES; + GCC_MODEL_TUNING = ""; + GCC_NO_COMMON_BLOCKS = YES; + GCC_VERSION = ""; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(TBBROOT)/include", + /opt/intel/tbb/include, + ); + LD_RUNPATH_SEARCH_PATHS = "$(TBBROOT)/lib /opt/intel/tbb/lib"; + LIBRARY_SEARCH_PATHS = ( + "$(TBBROOT)/lib", + /opt/intel/tbb/lib, + ); + MACOSX_DEPLOYMENT_TARGET = 10.11; + OTHER_CPLUSPLUSFLAGS = ( + "$(OTHER_CFLAGS)", + "-m64", + ); + OTHER_LDFLAGS = ( + "-m64", + "-ltbb", + ); + PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO; + SYMROOT = "/tmp/tbb-$(USER)"; + VALID_ARCHS = x86_64; + }; + name = Release64; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "dining_philosophers" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A1F593C60B8F0E6E00073279 /* Debug64 */, + A1F593C70B8F0E6E00073279 /* Release64 */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug64; + }; + 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "dining_philosophers" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A1F593C80B8F0E6E00073279 /* Debug64 */, + A1F593C90B8F0E6E00073279 /* Release64 */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug64; + }; +/* End XCConfigurationList section */ + }; + rootObject = 08FB7793FE84155DC02AAC07 /* Project object */; +} diff --git a/xdl/third_party/tbb/examples/graph/fgbzip2/Makefile b/xdl/third_party/tbb/examples/graph/fgbzip2/Makefile new file mode 100644 index 00000000..0b01b048 --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/fgbzip2/Makefile @@ -0,0 +1,60 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +# GNU Makefile that builds and runs example. + +run_cmd= +PROG=fgbzip2 +ARGS=-b=9 -a=async_node $(PROG) +PERF_RUN_ARGS=-b=9 -a=async_node $(PROG) + +# icpc by default +ifneq (,$(shell which icc 2>/dev/null)) + CXX=icpc +endif + +# autodetect C++11 support +include ../../common/examples-common.inc + +ifeq ($(shell uname), Linux) +LIBS+= -lrt -lpthread +else ifeq ($(shell uname), Darwin) +override CXXFLAGS += -Wl,-rpath,$(TBBROOT)/lib +endif + +all: release test + +release: + $(CXX) -O2 -DNDEBUG *.cpp $(CXXFLAGS) -o $(PROG) -ltbb $(LIBS) $(CXX0XFLAGS) + +debug: + $(CXX) -O0 -g -DTBB_USE_DEBUG *.cpp $(CXXFLAGS) -o $(PROG) -ltbb_debug $(LIBS) $(CXX0XFLAGS) + +profile: override CXXFLAGS += -DTBB_USE_THREADING_TOOLS -g +profile: release + +clean: + $(RM) $(PROG) *.o *.d *.bz2 + +test: + $(run_cmd) ./$(PROG) $(ARGS) + +perf_build: release + +perf_run: + $(run_cmd) ./$(PROG) $(PERF_RUN_ARGS) diff --git a/xdl/third_party/tbb/examples/graph/fgbzip2/Makefile.windows b/xdl/third_party/tbb/examples/graph/fgbzip2/Makefile.windows new file mode 100644 index 00000000..e3a539d2 --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/fgbzip2/Makefile.windows @@ -0,0 +1,57 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +# Common Makefile that builds and runs example. + +# Just specify your program basename +run_cmd= +PROG=fgbzip2 +ARGS=-b=9 -a=async_node $(PROG).exe +PERF_RUN_ARGS=-b=9 -a=async_node $(PROG).exe + +# Trying to find if icl.exe is set +CXX1 = $(TBB_CXX)- +CXX2 = $(CXX1:icl.exe-=icl.exe) +CXX = $(CXX2:-=cl.exe) + +# The C++ compiler options +MYCXXFLAGS = /EHsc /W3 /nologo /D _CONSOLE /D _MBCS /D WIN32 /D _CRT_SECURE_NO_WARNINGS /D _CRT_NONSTDC_NO_DEPRECATE /wd4267 /wd4244 +MYLDFLAGS =/INCREMENTAL:NO /NOLOGO /DEBUG /FIXED:NO $(LDFLAGS) + +all: release test + +release: + $(CXX) *.cpp /MD /O2 /Zi /D NDEBUG $(MYCXXFLAGS) /link tbb.lib $(LIBS) $(MYLDFLAGS) /OUT:$(PROG).exe + +debug: + $(CXX) *.cpp /MDd /Od /Zi /D TBB_USE_DEBUG /D _DEBUG $(MYCXXFLAGS) /link tbb_debug.lib $(LIBS) $(MYLDFLAGS) /OUT:$(PROG).exe + +profile: + $(CXX) *.cpp /MD /O2 /Zi /D NDEBUG $(MYCXXFLAGS) /D TBB_USE_THREADING_TOOLS /link tbb.lib $(LIBS) $(MYLDFLAGS) /OUT:$(PROG).exe + +clean: + @cmd.exe /C del $(PROG).exe *.obj *.?db *.manifest *.bz2 + +test: + $(PROG) $(ARGS) + +perf_build: release + +perf_run: + $(PROG) $(PERF_RUN_ARGS) + diff --git a/xdl/third_party/tbb/examples/graph/fgbzip2/blocksort.cpp b/xdl/third_party/tbb/examples/graph/fgbzip2/blocksort.cpp new file mode 100644 index 00000000..60dffb44 --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/fgbzip2/blocksort.cpp @@ -0,0 +1,1146 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +/*-------------------------------------------------------------*/ +/*--- Block sorting machinery ---*/ +/*--- blocksort.cpp ---*/ +/*-------------------------------------------------------------*/ + +/* ------------------------------------------------------------------ + The original source for this example: + This file is part of bzip2/libbzip2, a program and library for + lossless, block-sorting data compression. + + bzip2/libbzip2 version 1.0.6 of 6 September 2010 + Copyright (C) 1996-2010 Julian Seward + + This program, "bzip2", the associated library "libbzip2", and all + documentation, are copyright (C) 1996-2010 Julian R Seward. 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. The origin of this software must not be misrepresented; you must + not claim that you wrote the original software. If you use this + software in a product, an acknowledgment in the product + documentation would be appreciated but is not required. + + 3. Altered source versions must be plainly marked as such, and must + not be misrepresented as being the original software. + + 4. The name of the author may not be used to endorse or promote + products derived from this software without specific prior written + permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. + + Julian Seward, jseward@bzip.org + bzip2/libbzip2 version 1.0.6 of 6 September 2010 + ------------------------------------------------------------------ */ + + +#include "bzlib_private.h" + +/*---------------------------------------------*/ +/*--- Fallback O(N log(N)^2) sorting ---*/ +/*--- algorithm, for repetitive blocks ---*/ +/*---------------------------------------------*/ + +/*---------------------------------------------*/ +static +__inline__ +void fallbackSimpleSort ( UInt32* fmap, + UInt32* eclass, + Int32 lo, + Int32 hi ) +{ + Int32 i, j, tmp; + UInt32 ec_tmp; + + if (lo == hi) return; + + if (hi - lo > 3) { + for ( i = hi-4; i >= lo; i-- ) { + tmp = fmap[i]; + ec_tmp = eclass[tmp]; + for ( j = i+4; j <= hi && ec_tmp > eclass[fmap[j]]; j += 4 ) + fmap[j-4] = fmap[j]; + fmap[j-4] = tmp; + } + } + + for ( i = hi-1; i >= lo; i-- ) { + tmp = fmap[i]; + ec_tmp = eclass[tmp]; + for ( j = i+1; j <= hi && ec_tmp > eclass[fmap[j]]; j++ ) + fmap[j-1] = fmap[j]; + fmap[j-1] = tmp; + } +} + + +/*---------------------------------------------*/ +#define fswap(zz1, zz2) \ + { Int32 zztmp = zz1; zz1 = zz2; zz2 = zztmp; } + +#define fvswap(zzp1, zzp2, zzn) \ +{ \ + Int32 yyp1 = (zzp1); \ + Int32 yyp2 = (zzp2); \ + Int32 yyn = (zzn); \ + while (yyn > 0) { \ + fswap(fmap[yyp1], fmap[yyp2]); \ + yyp1++; yyp2++; yyn--; \ + } \ +} + + +#define fmin(a,b) ((a) < (b)) ? (a) : (b) + +#define fpush(lz,hz) { stackLo[sp] = lz; \ + stackHi[sp] = hz; \ + sp++; } + +#define fpop(lz,hz) { sp--; \ + lz = stackLo[sp]; \ + hz = stackHi[sp]; } + +#define FALLBACK_QSORT_SMALL_THRESH 10 +#define FALLBACK_QSORT_STACK_SIZE 100 + + +static +void fallbackQSort3 ( UInt32* fmap, + UInt32* eclass, + Int32 loSt, + Int32 hiSt ) +{ + Int32 unLo, unHi, ltLo, gtHi, n, m; + Int32 sp, lo, hi; + UInt32 med, r, r3; + Int32 stackLo[FALLBACK_QSORT_STACK_SIZE]; + Int32 stackHi[FALLBACK_QSORT_STACK_SIZE]; + + r = 0; + + sp = 0; + fpush ( loSt, hiSt ); + + while (sp > 0) { + + AssertH ( sp < FALLBACK_QSORT_STACK_SIZE - 1, 1004 ); + + fpop ( lo, hi ); + if (hi - lo < FALLBACK_QSORT_SMALL_THRESH) { + fallbackSimpleSort ( fmap, eclass, lo, hi ); + continue; + } + + /* Random partitioning. Median of 3 sometimes fails to + avoid bad cases. Median of 9 seems to help but + looks rather expensive. This too seems to work but + is cheaper. Guidance for the magic constants + 7621 and 32768 is taken from Sedgewick's algorithms + book, chapter 35. + */ + r = ((r * 7621) + 1) % 32768; + r3 = r % 3; + if (r3 == 0) med = eclass[fmap[lo]]; else + if (r3 == 1) med = eclass[fmap[(lo+hi)>>1]]; else + med = eclass[fmap[hi]]; + + unLo = ltLo = lo; + unHi = gtHi = hi; + + while (1) { + while (1) { + if (unLo > unHi) break; + n = (Int32)eclass[fmap[unLo]] - (Int32)med; + if (n == 0) { + fswap(fmap[unLo], fmap[ltLo]); + ltLo++; unLo++; + continue; + }; + if (n > 0) break; + unLo++; + } + while (1) { + if (unLo > unHi) break; + n = (Int32)eclass[fmap[unHi]] - (Int32)med; + if (n == 0) { + fswap(fmap[unHi], fmap[gtHi]); + gtHi--; unHi--; + continue; + }; + if (n < 0) break; + unHi--; + } + if (unLo > unHi) break; + fswap(fmap[unLo], fmap[unHi]); unLo++; unHi--; + } + + AssertD ( unHi == unLo-1, "fallbackQSort3(2)" ); + + if (gtHi < ltLo) continue; + + n = fmin(ltLo-lo, unLo-ltLo); fvswap(lo, unLo-n, n); + m = fmin(hi-gtHi, gtHi-unHi); fvswap(unLo, hi-m+1, m); + + n = lo + unLo - ltLo - 1; + m = hi - (gtHi - unHi) + 1; + + if (n - lo > hi - m) { + fpush ( lo, n ); + fpush ( m, hi ); + } else { + fpush ( m, hi ); + fpush ( lo, n ); + } + } +} + +#undef fmin +#undef fpush +#undef fpop +#undef fswap +#undef fvswap +#undef FALLBACK_QSORT_SMALL_THRESH +#undef FALLBACK_QSORT_STACK_SIZE + + +/*---------------------------------------------*/ +/* Pre: + nblock > 0 + eclass exists for [0 .. nblock-1] + ((UChar*)eclass) [0 .. nblock-1] holds block + ptr exists for [0 .. nblock-1] + + Post: + ((UChar*)eclass) [0 .. nblock-1] holds block + All other areas of eclass destroyed + fmap [0 .. nblock-1] holds sorted order + bhtab [ 0 .. 2+(nblock/32) ] destroyed +*/ + +#define SET_BH(zz) bhtab[(zz) >> 5] |= (1 << ((zz) & 31)) +#define CLEAR_BH(zz) bhtab[(zz) >> 5] &= ~(1 << ((zz) & 31)) +#define ISSET_BH(zz) (bhtab[(zz) >> 5] & (1 << ((zz) & 31))) +#define WORD_BH(zz) bhtab[(zz) >> 5] +#define UNALIGNED_BH(zz) ((zz) & 0x01f) + +static +void fallbackSort ( UInt32* fmap, + UInt32* eclass, + UInt32* bhtab, + Int32 nblock, + Int32 verb ) +{ + Int32 ftab[257]; + Int32 ftabCopy[256]; + Int32 H, i, j, k, l, r, cc, cc1; + Int32 nNotDone; + Int32 nBhtab; + UChar* eclass8 = (UChar*)eclass; + + /*-- + Initial 1-char radix sort to generate + initial fmap and initial BH bits. + --*/ + if (verb >= 4) + VPrintf0 ( " bucket sorting ...\n" ); + for (i = 0; i < 257; i++) ftab[i] = 0; + for (i = 0; i < nblock; i++) ftab[eclass8[i]]++; + for (i = 0; i < 256; i++) ftabCopy[i] = ftab[i]; + for (i = 1; i < 257; i++) ftab[i] += ftab[i-1]; + + for (i = 0; i < nblock; i++) { + j = eclass8[i]; + k = ftab[j] - 1; + ftab[j] = k; + fmap[k] = i; + } + + nBhtab = 2 + (nblock / 32); + for (i = 0; i < nBhtab; i++) bhtab[i] = 0; + for (i = 0; i < 256; i++) SET_BH(ftab[i]); + + /*-- + Inductively refine the buckets. Kind-of an + "exponential radix sort" (!), inspired by the + Manber-Myers suffix array construction algorithm. + --*/ + + /*-- set sentinel bits for block-end detection --*/ + for (i = 0; i < 32; i++) { + SET_BH(nblock + 2*i); + CLEAR_BH(nblock + 2*i + 1); + } + + /*-- the log(N) loop --*/ + H = 1; + while (1) { + + if (verb >= 4) + VPrintf1 ( " depth %6d has ", H ); + + j = 0; + for (i = 0; i < nblock; i++) { + if (ISSET_BH(i)) j = i; + k = fmap[i] - H; if (k < 0) k += nblock; + eclass[k] = j; + } + + nNotDone = 0; + r = -1; + while (1) { + + /*-- find the next non-singleton bucket --*/ + k = r + 1; + while (ISSET_BH(k) && UNALIGNED_BH(k)) k++; + if (ISSET_BH(k)) { + while (WORD_BH(k) == 0xffffffff) k += 32; + while (ISSET_BH(k)) k++; + } + l = k - 1; + if (l >= nblock) break; + while (!ISSET_BH(k) && UNALIGNED_BH(k)) k++; + if (!ISSET_BH(k)) { + while (WORD_BH(k) == 0x00000000) k += 32; + while (!ISSET_BH(k)) k++; + } + r = k - 1; + if (r >= nblock) break; + + /*-- now [l, r] bracket current bucket --*/ + if (r > l) { + nNotDone += (r - l + 1); + fallbackQSort3 ( fmap, eclass, l, r ); + + /*-- scan bucket and generate header bits-- */ + cc = -1; + for (i = l; i <= r; i++) { + cc1 = eclass[fmap[i]]; + if (cc != cc1) { SET_BH(i); cc = cc1; }; + } + } + } + + if (verb >= 4) + VPrintf1 ( "%6d unresolved strings\n", nNotDone ); + + H *= 2; + if (H > nblock || nNotDone == 0) break; + } + + /*-- + Reconstruct the original block in + eclass8 [0 .. nblock-1], since the + previous phase destroyed it. + --*/ + if (verb >= 4) + VPrintf0 ( " reconstructing block ...\n" ); + j = 0; + for (i = 0; i < nblock; i++) { + while (ftabCopy[j] == 0) j++; + ftabCopy[j]--; + eclass8[fmap[i]] = (UChar)j; + } + AssertH ( j < 256, 1005 ); +} + +#undef SET_BH +#undef CLEAR_BH +#undef ISSET_BH +#undef WORD_BH +#undef UNALIGNED_BH + + +/*---------------------------------------------*/ +/*--- The main, O(N^2 log(N)) sorting ---*/ +/*--- algorithm. Faster for "normal" ---*/ +/*--- non-repetitive blocks. ---*/ +/*---------------------------------------------*/ + +/*---------------------------------------------*/ +static +__inline__ +Bool mainGtU ( UInt32 i1, + UInt32 i2, + UChar* block, + UInt16* quadrant, + UInt32 nblock, + Int32* budget ) +{ + Int32 k; + UChar c1, c2; + UInt16 s1, s2; + + AssertD ( i1 != i2, "mainGtU" ); + /* 1 */ + c1 = block[i1]; c2 = block[i2]; + if (c1 != c2) return (c1 > c2); + i1++; i2++; + /* 2 */ + c1 = block[i1]; c2 = block[i2]; + if (c1 != c2) return (c1 > c2); + i1++; i2++; + /* 3 */ + c1 = block[i1]; c2 = block[i2]; + if (c1 != c2) return (c1 > c2); + i1++; i2++; + /* 4 */ + c1 = block[i1]; c2 = block[i2]; + if (c1 != c2) return (c1 > c2); + i1++; i2++; + /* 5 */ + c1 = block[i1]; c2 = block[i2]; + if (c1 != c2) return (c1 > c2); + i1++; i2++; + /* 6 */ + c1 = block[i1]; c2 = block[i2]; + if (c1 != c2) return (c1 > c2); + i1++; i2++; + /* 7 */ + c1 = block[i1]; c2 = block[i2]; + if (c1 != c2) return (c1 > c2); + i1++; i2++; + /* 8 */ + c1 = block[i1]; c2 = block[i2]; + if (c1 != c2) return (c1 > c2); + i1++; i2++; + /* 9 */ + c1 = block[i1]; c2 = block[i2]; + if (c1 != c2) return (c1 > c2); + i1++; i2++; + /* 10 */ + c1 = block[i1]; c2 = block[i2]; + if (c1 != c2) return (c1 > c2); + i1++; i2++; + /* 11 */ + c1 = block[i1]; c2 = block[i2]; + if (c1 != c2) return (c1 > c2); + i1++; i2++; + /* 12 */ + c1 = block[i1]; c2 = block[i2]; + if (c1 != c2) return (c1 > c2); + i1++; i2++; + + k = nblock + 8; + + do { + /* 1 */ + c1 = block[i1]; c2 = block[i2]; + if (c1 != c2) return (c1 > c2); + s1 = quadrant[i1]; s2 = quadrant[i2]; + if (s1 != s2) return (s1 > s2); + i1++; i2++; + /* 2 */ + c1 = block[i1]; c2 = block[i2]; + if (c1 != c2) return (c1 > c2); + s1 = quadrant[i1]; s2 = quadrant[i2]; + if (s1 != s2) return (s1 > s2); + i1++; i2++; + /* 3 */ + c1 = block[i1]; c2 = block[i2]; + if (c1 != c2) return (c1 > c2); + s1 = quadrant[i1]; s2 = quadrant[i2]; + if (s1 != s2) return (s1 > s2); + i1++; i2++; + /* 4 */ + c1 = block[i1]; c2 = block[i2]; + if (c1 != c2) return (c1 > c2); + s1 = quadrant[i1]; s2 = quadrant[i2]; + if (s1 != s2) return (s1 > s2); + i1++; i2++; + /* 5 */ + c1 = block[i1]; c2 = block[i2]; + if (c1 != c2) return (c1 > c2); + s1 = quadrant[i1]; s2 = quadrant[i2]; + if (s1 != s2) return (s1 > s2); + i1++; i2++; + /* 6 */ + c1 = block[i1]; c2 = block[i2]; + if (c1 != c2) return (c1 > c2); + s1 = quadrant[i1]; s2 = quadrant[i2]; + if (s1 != s2) return (s1 > s2); + i1++; i2++; + /* 7 */ + c1 = block[i1]; c2 = block[i2]; + if (c1 != c2) return (c1 > c2); + s1 = quadrant[i1]; s2 = quadrant[i2]; + if (s1 != s2) return (s1 > s2); + i1++; i2++; + /* 8 */ + c1 = block[i1]; c2 = block[i2]; + if (c1 != c2) return (c1 > c2); + s1 = quadrant[i1]; s2 = quadrant[i2]; + if (s1 != s2) return (s1 > s2); + i1++; i2++; + + if (i1 >= nblock) i1 -= nblock; + if (i2 >= nblock) i2 -= nblock; + + k -= 8; + (*budget)--; + } + while (k >= 0); + + return False; +} + + +/*---------------------------------------------*/ +/*-- + Knuth's increments seem to work better + than Incerpi-Sedgewick here. Possibly + because the number of elements to sort + is usually small, typically <= 20. +--*/ +static +Int32 incs[14] = { 1, 4, 13, 40, 121, 364, 1093, 3280, + 9841, 29524, 88573, 265720, + 797161, 2391484 }; + +static +void mainSimpleSort ( UInt32* ptr, + UChar* block, + UInt16* quadrant, + Int32 nblock, + Int32 lo, + Int32 hi, + Int32 d, + Int32* budget ) +{ + Int32 i, j, h, bigN, hp; + UInt32 v; + + bigN = hi - lo + 1; + if (bigN < 2) return; + + hp = 0; + while (incs[hp] < bigN) hp++; + hp--; + + for (; hp >= 0; hp--) { + h = incs[hp]; + + i = lo + h; + while (True) { + + /*-- copy 1 --*/ + if (i > hi) break; + v = ptr[i]; + j = i; + while ( mainGtU ( + ptr[j-h]+d, v+d, block, quadrant, nblock, budget + ) ) { + ptr[j] = ptr[j-h]; + j = j - h; + if (j <= (lo + h - 1)) break; + } + ptr[j] = v; + i++; + + /*-- copy 2 --*/ + if (i > hi) break; + v = ptr[i]; + j = i; + while ( mainGtU ( + ptr[j-h]+d, v+d, block, quadrant, nblock, budget + ) ) { + ptr[j] = ptr[j-h]; + j = j - h; + if (j <= (lo + h - 1)) break; + } + ptr[j] = v; + i++; + + /*-- copy 3 --*/ + if (i > hi) break; + v = ptr[i]; + j = i; + while ( mainGtU ( + ptr[j-h]+d, v+d, block, quadrant, nblock, budget + ) ) { + ptr[j] = ptr[j-h]; + j = j - h; + if (j <= (lo + h - 1)) break; + } + ptr[j] = v; + i++; + + if (*budget < 0) return; + } + } +} + + +/*---------------------------------------------*/ +/*-- + The following is an implementation of + an elegant 3-way quicksort for strings, + described in a paper "Fast Algorithms for + Sorting and Searching Strings", by Robert + Sedgewick and Jon L. Bentley. +--*/ + +#define mswap(zz1, zz2) \ + { Int32 zztmp = zz1; zz1 = zz2; zz2 = zztmp; } + +#define mvswap(zzp1, zzp2, zzn) \ +{ \ + Int32 yyp1 = (zzp1); \ + Int32 yyp2 = (zzp2); \ + Int32 yyn = (zzn); \ + while (yyn > 0) { \ + mswap(ptr[yyp1], ptr[yyp2]); \ + yyp1++; yyp2++; yyn--; \ + } \ +} + +static +__inline__ +UChar mmed3 ( UChar a, UChar b, UChar c ) +{ + UChar t; + if (a > b) { t = a; a = b; b = t; }; + if (b > c) { + b = c; + if (a > b) b = a; + } + return b; +} + +#define mmin(a,b) ((a) < (b)) ? (a) : (b) + +#define mpush(lz,hz,dz) { stackLo[sp] = lz; \ + stackHi[sp] = hz; \ + stackD [sp] = dz; \ + sp++; } + +#define mpop(lz,hz,dz) { sp--; \ + lz = stackLo[sp]; \ + hz = stackHi[sp]; \ + dz = stackD [sp]; } + + +#define mnextsize(az) (nextHi[az]-nextLo[az]) + +#define mnextswap(az,bz) \ + { Int32 tz; \ + tz = nextLo[az]; nextLo[az] = nextLo[bz]; nextLo[bz] = tz; \ + tz = nextHi[az]; nextHi[az] = nextHi[bz]; nextHi[bz] = tz; \ + tz = nextD [az]; nextD [az] = nextD [bz]; nextD [bz] = tz; } + + +#define MAIN_QSORT_SMALL_THRESH 20 +#define MAIN_QSORT_DEPTH_THRESH (BZ_N_RADIX + BZ_N_QSORT) +#define MAIN_QSORT_STACK_SIZE 100 + +static +void mainQSort3 ( UInt32* ptr, + UChar* block, + UInt16* quadrant, + Int32 nblock, + Int32 loSt, + Int32 hiSt, + Int32 dSt, + Int32* budget ) +{ + Int32 unLo, unHi, ltLo, gtHi, n, m, med; + Int32 sp, lo, hi, d; + + Int32 stackLo[MAIN_QSORT_STACK_SIZE]; + Int32 stackHi[MAIN_QSORT_STACK_SIZE]; + Int32 stackD [MAIN_QSORT_STACK_SIZE]; + + Int32 nextLo[3]; + Int32 nextHi[3]; + Int32 nextD [3]; + + sp = 0; + mpush ( loSt, hiSt, dSt ); + + while (sp > 0) { + + AssertH ( sp < MAIN_QSORT_STACK_SIZE - 2, 1001 ); + + mpop ( lo, hi, d ); + if (hi - lo < MAIN_QSORT_SMALL_THRESH || + d > MAIN_QSORT_DEPTH_THRESH) { + mainSimpleSort ( ptr, block, quadrant, nblock, lo, hi, d, budget ); + if (*budget < 0) return; + continue; + } + + med = (Int32) + mmed3 ( block[ptr[ lo ]+d], + block[ptr[ hi ]+d], + block[ptr[ (lo+hi)>>1 ]+d] ); + + unLo = ltLo = lo; + unHi = gtHi = hi; + + while (True) { + while (True) { + if (unLo > unHi) break; + n = ((Int32)block[ptr[unLo]+d]) - med; + if (n == 0) { + mswap(ptr[unLo], ptr[ltLo]); + ltLo++; unLo++; continue; + }; + if (n > 0) break; + unLo++; + } + while (True) { + if (unLo > unHi) break; + n = ((Int32)block[ptr[unHi]+d]) - med; + if (n == 0) { + mswap(ptr[unHi], ptr[gtHi]); + gtHi--; unHi--; continue; + }; + if (n < 0) break; + unHi--; + } + if (unLo > unHi) break; + mswap(ptr[unLo], ptr[unHi]); unLo++; unHi--; + } + + AssertD ( unHi == unLo-1, "mainQSort3(2)" ); + + if (gtHi < ltLo) { + mpush(lo, hi, d+1 ); + continue; + } + + n = mmin(ltLo-lo, unLo-ltLo); mvswap(lo, unLo-n, n); + m = mmin(hi-gtHi, gtHi-unHi); mvswap(unLo, hi-m+1, m); + + n = lo + unLo - ltLo - 1; + m = hi - (gtHi - unHi) + 1; + + nextLo[0] = lo; nextHi[0] = n; nextD[0] = d; + nextLo[1] = m; nextHi[1] = hi; nextD[1] = d; + nextLo[2] = n+1; nextHi[2] = m-1; nextD[2] = d+1; + + if (mnextsize(0) < mnextsize(1)) mnextswap(0,1); + if (mnextsize(1) < mnextsize(2)) mnextswap(1,2); + if (mnextsize(0) < mnextsize(1)) mnextswap(0,1); + + AssertD (mnextsize(0) >= mnextsize(1), "mainQSort3(8)" ); + AssertD (mnextsize(1) >= mnextsize(2), "mainQSort3(9)" ); + + mpush (nextLo[0], nextHi[0], nextD[0]); + mpush (nextLo[1], nextHi[1], nextD[1]); + mpush (nextLo[2], nextHi[2], nextD[2]); + } +} + +#undef mswap +#undef mvswap +#undef mpush +#undef mpop +#undef mmin +#undef mnextsize +#undef mnextswap +#undef MAIN_QSORT_SMALL_THRESH +#undef MAIN_QSORT_DEPTH_THRESH +#undef MAIN_QSORT_STACK_SIZE + + +/*---------------------------------------------*/ +/* Pre: + nblock > N_OVERSHOOT + block32 exists for [0 .. nblock-1 +N_OVERSHOOT] + ((UChar*)block32) [0 .. nblock-1] holds block + ptr exists for [0 .. nblock-1] + + Post: + ((UChar*)block32) [0 .. nblock-1] holds block + All other areas of block32 destroyed + ftab [0 .. 65536 ] destroyed + ptr [0 .. nblock-1] holds sorted order + if (*budget < 0), sorting was abandoned +*/ + +#define BIGFREQ(b) (ftab[((b)+1) << 8] - ftab[(b) << 8]) +#define SETMASK (1 << 21) +#define CLEARMASK (~(SETMASK)) + +static +void mainSort ( UInt32* ptr, + UChar* block, + UInt16* quadrant, + UInt32* ftab, + Int32 nblock, + Int32 verb, + Int32* budget ) +{ + Int32 i, j, k, ss, sb; + Int32 runningOrder[256]; + Bool bigDone[256]; + Int32 copyStart[256]; + Int32 copyEnd [256]; + UChar c1; + Int32 numQSorted; + UInt16 s; + if (verb >= 4) VPrintf0 ( " main sort initialise ...\n" ); + + /*-- set up the 2-byte frequency table --*/ + for (i = 65536; i >= 0; i--) ftab[i] = 0; + + j = block[0] << 8; + i = nblock-1; + for (; i >= 3; i -= 4) { + quadrant[i] = 0; + j = (j >> 8) | ( ((UInt16)block[i]) << 8); + ftab[j]++; + quadrant[i-1] = 0; + j = (j >> 8) | ( ((UInt16)block[i-1]) << 8); + ftab[j]++; + quadrant[i-2] = 0; + j = (j >> 8) | ( ((UInt16)block[i-2]) << 8); + ftab[j]++; + quadrant[i-3] = 0; + j = (j >> 8) | ( ((UInt16)block[i-3]) << 8); + ftab[j]++; + } + for (; i >= 0; i--) { + quadrant[i] = 0; + j = (j >> 8) | ( ((UInt16)block[i]) << 8); + ftab[j]++; + } + + /*-- (emphasises close relationship of block & quadrant) --*/ + for (i = 0; i < BZ_N_OVERSHOOT; i++) { + block [nblock+i] = block[i]; + quadrant[nblock+i] = 0; + } + + if (verb >= 4) VPrintf0 ( " bucket sorting ...\n" ); + + /*-- Complete the initial radix sort --*/ + for (i = 1; i <= 65536; i++) ftab[i] += ftab[i-1]; + + s = block[0] << 8; + i = nblock-1; + for (; i >= 3; i -= 4) { + s = (s >> 8) | (block[i] << 8); + j = ftab[s] -1; + ftab[s] = j; + ptr[j] = i; + s = (s >> 8) | (block[i-1] << 8); + j = ftab[s] -1; + ftab[s] = j; + ptr[j] = i-1; + s = (s >> 8) | (block[i-2] << 8); + j = ftab[s] -1; + ftab[s] = j; + ptr[j] = i-2; + s = (s >> 8) | (block[i-3] << 8); + j = ftab[s] -1; + ftab[s] = j; + ptr[j] = i-3; + } + for (; i >= 0; i--) { + s = (s >> 8) | (block[i] << 8); + j = ftab[s] -1; + ftab[s] = j; + ptr[j] = i; + } + + /*-- + Now ftab contains the first loc of every small bucket. + Calculate the running order, from smallest to largest + big bucket. + --*/ + for (i = 0; i <= 255; i++) { + bigDone [i] = False; + runningOrder[i] = i; + } + + { + Int32 vv; + Int32 h = 1; + do h = 3 * h + 1; while (h <= 256); + do { + h = h / 3; + for (i = h; i <= 255; i++) { + vv = runningOrder[i]; + j = i; + while ( BIGFREQ(runningOrder[j-h]) > BIGFREQ(vv) ) { + runningOrder[j] = runningOrder[j-h]; + j = j - h; + if (j <= (h - 1)) goto zero; + } + zero: + runningOrder[j] = vv; + } + } while (h != 1); + } + + /*-- + The main sorting loop. + --*/ + + numQSorted = 0; + + for (i = 0; i <= 255; i++) { + + /*-- + Process big buckets, starting with the least full. + Basically this is a 3-step process in which we call + mainQSort3 to sort the small buckets [ss, j], but + also make a big effort to avoid the calls if we can. + --*/ + ss = runningOrder[i]; + + /*-- + Step 1: + Complete the big bucket [ss] by quicksorting + any unsorted small buckets [ss, j], for j != ss. + Hopefully previous pointer-scanning phases have already + completed many of the small buckets [ss, j], so + we don't have to sort them at all. + --*/ + for (j = 0; j <= 255; j++) { + if (j != ss) { + sb = (ss << 8) + j; + if ( ! (ftab[sb] & SETMASK) ) { + Int32 lo = ftab[sb] & CLEARMASK; + Int32 hi = (ftab[sb+1] & CLEARMASK) - 1; + if (hi > lo) { + if (verb >= 4) + VPrintf4 ( " qsort [0x%x, 0x%x] " + "done %d this %d\n", + ss, j, numQSorted, hi - lo + 1 ); + mainQSort3 ( + ptr, block, quadrant, nblock, + lo, hi, BZ_N_RADIX, budget + ); + numQSorted += (hi - lo + 1); + if (*budget < 0) return; + } + } + ftab[sb] |= SETMASK; + } + } + + AssertH ( !bigDone[ss], 1006 ); + + /*-- + Step 2: + Now scan this big bucket [ss] so as to synthesise the + sorted order for small buckets [t, ss] for all t, + including, magically, the bucket [ss,ss] too. + This will avoid doing Real Work in subsequent Step 1's. + --*/ + { + for (j = 0; j <= 255; j++) { + copyStart[j] = ftab[(j << 8) + ss] & CLEARMASK; + copyEnd [j] = (ftab[(j << 8) + ss + 1] & CLEARMASK) - 1; + } + for (j = ftab[ss << 8] & CLEARMASK; j < copyStart[ss]; j++) { + k = ptr[j]-1; if (k < 0) k += nblock; + c1 = block[k]; + if (!bigDone[c1]) + ptr[ copyStart[c1]++ ] = k; + } + for (j = (ftab[(ss+1) << 8] & CLEARMASK) - 1; j > copyEnd[ss]; j--) { + k = ptr[j]-1; if (k < 0) k += nblock; + c1 = block[k]; + if (!bigDone[c1]) + ptr[ copyEnd[c1]-- ] = k; + } + } + + AssertH ( (copyStart[ss]-1 == copyEnd[ss]) + || + /* Extremely rare case missing in bzip2-1.0.0 and 1.0.1. + Necessity for this case is demonstrated by compressing + a sequence of approximately 48.5 million of character + 251; 1.0.0/1.0.1 will then die here. */ + (copyStart[ss] == 0 && copyEnd[ss] == nblock-1), + 1007 ) + + for (j = 0; j <= 255; j++) ftab[(j << 8) + ss] |= SETMASK; + + /*-- + Step 3: + The [ss] big bucket is now done. Record this fact, + and update the quadrant descriptors. Remember to + update quadrants in the overshoot area too, if + necessary. The "if (i < 255)" test merely skips + this updating for the last bucket processed, since + updating for the last bucket is pointless. + + The quadrant array provides a way to incrementally + cache sort orderings, as they appear, so as to + make subsequent comparisons in fullGtU() complete + faster. For repetitive blocks this makes a big + difference (but not big enough to be able to avoid + the fallback sorting mechanism, exponential radix sort). + + The precise meaning is: at all times: + + for 0 <= i < nblock and 0 <= j <= nblock + + if block[i] != block[j], + + then the relative values of quadrant[i] and + quadrant[j] are meaningless. + + else { + if quadrant[i] < quadrant[j] + then the string starting at i lexicographically + precedes the string starting at j + + else if quadrant[i] > quadrant[j] + then the string starting at j lexicographically + precedes the string starting at i + + else + the relative ordering of the strings starting + at i and j has not yet been determined. + } + --*/ + bigDone[ss] = True; + + if (i < 255) { + Int32 bbStart = ftab[ss << 8] & CLEARMASK; + Int32 bbSize = (ftab[(ss+1) << 8] & CLEARMASK) - bbStart; + Int32 shifts = 0; + + while ((bbSize >> shifts) > 65534) shifts++; + + for (j = bbSize-1; j >= 0; j--) { + Int32 a2update = ptr[bbStart + j]; + UInt16 qVal = (UInt16)(j >> shifts); + quadrant[a2update] = qVal; + if (a2update < BZ_N_OVERSHOOT) + quadrant[a2update + nblock] = qVal; + } + AssertH ( ((bbSize-1) >> shifts) <= 65535, 1002 ); + } + + } + + if (verb >= 4) + VPrintf3 ( " %d pointers, %d sorted, %d scanned\n", + nblock, numQSorted, nblock - numQSorted ); +} + +#undef BIGFREQ +#undef SETMASK +#undef CLEARMASK + + +/*---------------------------------------------*/ +/* Pre: + nblock > 0 + arr2 exists for [0 .. nblock-1 +N_OVERSHOOT] + ((UChar*)arr2) [0 .. nblock-1] holds block + arr1 exists for [0 .. nblock-1] + + Post: + ((UChar*)arr2) [0 .. nblock-1] holds block + All other areas of block destroyed + ftab [ 0 .. 65536 ] destroyed + arr1 [0 .. nblock-1] holds sorted order +*/ +void BZ2_blockSort ( EState* s ) +{ + UInt32* ptr = s->ptr; + UChar* block = s->block; + UInt32* ftab = s->ftab; + Int32 nblock = s->nblock; + Int32 verb = s->verbosity; + Int32 wfact = s->workFactor; + UInt16* quadrant; + Int32 budget; + Int32 budgetInit; + Int32 i; + + if (nblock < 10000) { + fallbackSort ( s->arr1, s->arr2, ftab, nblock, verb ); + } else { + /* Calculate the location for quadrant, remembering to get + the alignment right. Assumes that &(block[0]) is at least + 2-byte aligned -- this should be ok since block is really + the first section of arr2. + */ + i = nblock+BZ_N_OVERSHOOT; + if (i & 1) i++; + quadrant = (UInt16*)(&(block[i])); + + /* (wfact-1) / 3 puts the default-factor-30 + transition point at very roughly the same place as + with v0.1 and v0.9.0. + Not that it particularly matters any more, since the + resulting compressed stream is now the same regardless + of whether or not we use the main sort or fallback sort. + */ + if (wfact < 1 ) wfact = 1; + if (wfact > 100) wfact = 100; + budgetInit = nblock * ((wfact-1) / 3); + budget = budgetInit; + + mainSort ( ptr, block, quadrant, ftab, nblock, verb, &budget ); + if (verb >= 3) + VPrintf3 ( " %d work, %d block, ratio %5.2f\n", + budgetInit - budget, + nblock, + (float)(budgetInit - budget) / + (float)(nblock==0 ? 1 : nblock) ); + if (budget < 0) { + if (verb >= 2) + VPrintf0 ( " too repetitive; using fallback" + " sorting algorithm\n" ); + fallbackSort ( s->arr1, s->arr2, ftab, nblock, verb ); + } + } + + s->origPtr = -1; + for (i = 0; i < s->nblock; i++) + if (ptr[i] == 0) + { s->origPtr = i; break; }; + + AssertH( s->origPtr != -1, 1003 ); +} + + +/*-------------------------------------------------------------*/ +/*--- end blocksort.c ---*/ +/*-------------------------------------------------------------*/ diff --git a/xdl/third_party/tbb/examples/graph/fgbzip2/bzlib.cpp b/xdl/third_party/tbb/examples/graph/fgbzip2/bzlib.cpp new file mode 100644 index 00000000..8a413061 --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/fgbzip2/bzlib.cpp @@ -0,0 +1,1624 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +/*-------------------------------------------------------------*/ +/*--- Library top-level functions. ---*/ +/*--- bzlib.cpp ---*/ +/*-------------------------------------------------------------*/ + +/* ------------------------------------------------------------------ + The original source for this example: + This file is part of bzip2/libbzip2, a program and library for + lossless, block-sorting data compression. + + bzip2/libbzip2 version 1.0.6 of 6 September 2010 + Copyright (C) 1996-2010 Julian Seward + + This program, "bzip2", the associated library "libbzip2", and all + documentation, are copyright (C) 1996-2010 Julian R Seward. 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. The origin of this software must not be misrepresented; you must + not claim that you wrote the original software. If you use this + software in a product, an acknowledgment in the product + documentation would be appreciated but is not required. + + 3. Altered source versions must be plainly marked as such, and must + not be misrepresented as being the original software. + + 4. The name of the author may not be used to endorse or promote + products derived from this software without specific prior written + permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. + + Julian Seward, jseward@bzip.org + bzip2/libbzip2 version 1.0.6 of 6 September 2010 + ------------------------------------------------------------------ */ + +/* CHANGES + 0.9.0 -- original version. + 0.9.0a/b -- no changes in this file. + 0.9.0c -- made zero-length BZ_FLUSH work correctly in bzCompress(). + fixed bzWrite/bzRead to ignore zero-length requests. + fixed bzread to correctly handle read requests after EOF. + wrong parameter order in call to bzDecompressInit in + bzBuffToBuffDecompress. Fixed. +*/ + +#include "bzlib_private.h" + + +/*---------------------------------------------------*/ +/*--- Compression stuff ---*/ +/*---------------------------------------------------*/ + + +/*---------------------------------------------------*/ +#ifndef BZ_NO_STDIO +void BZ2_bz__AssertH__fail ( int errcode ) +{ + fprintf(stderr, + "\n\nbzip2/libbzip2: internal error number %d.\n" + "This is a bug in bzip2/libbzip2, %s.\n" + "Please report it to me at: jseward@bzip.org. If this happened\n" + "when you were using some program which uses libbzip2 as a\n" + "component, you should also report this bug to the author(s)\n" + "of that program. Please make an effort to report this bug;\n" + "timely and accurate bug reports eventually lead to higher\n" + "quality software. Thanks. Julian Seward, 10 December 2007.\n\n", + errcode, + BZ2_bzlibVersion() + ); + + if (errcode == 1007) { + fprintf(stderr, + "\n*** A special note about internal error number 1007 ***\n" + "\n" + "Experience suggests that a common cause of i.e. 1007\n" + "is unreliable memory or other hardware. The 1007 assertion\n" + "just happens to cross-check the results of huge numbers of\n" + "memory reads/writes, and so acts (unintendedly) as a stress\n" + "test of your memory system.\n" + "\n" + "I suggest the following: try compressing the file again,\n" + "possibly monitoring progress in detail with the -vv flag.\n" + "\n" + "* If the error cannot be reproduced, and/or happens at different\n" + " points in compression, you may have a flaky memory system.\n" + " Try a memory-test program. I have used Memtest86\n" + " (www.memtest86.com). At the time of writing it is free (GPLd).\n" + " Memtest86 tests memory much more thorougly than your BIOSs\n" + " power-on test, and may find failures that the BIOS doesn't.\n" + "\n" + "* If the error can be repeatably reproduced, this is a bug in\n" + " bzip2, and I would very much like to hear about it. Please\n" + " let me know, and, ideally, save a copy of the file causing the\n" + " problem -- without which I will be unable to investigate it.\n" + "\n" + ); + } + + exit(3); +} +#endif + + +/*---------------------------------------------------*/ +static +int bz_config_ok ( void ) +{ + if (sizeof(int) != 4) return 0; + if (sizeof(short) != 2) return 0; + if (sizeof(char) != 1) return 0; + return 1; +} + + +/*---------------------------------------------------*/ +static +void* default_bzalloc ( void* opaque, Int32 items, Int32 size ) +{ + void* v = malloc ( items * size ); + return v; +} + +static +void default_bzfree ( void* opaque, void* addr ) +{ + if (addr != NULL) free ( addr ); +} + + +/*---------------------------------------------------*/ +static +void prepare_new_block ( EState* s ) +{ + Int32 i; + s->nblock = 0; + s->numZ = 0; + s->state_out_pos = 0; + BZ_INITIALISE_CRC ( s->blockCRC ); + for (i = 0; i < 256; i++) s->inUse[i] = False; + s->blockNo++; +} + + +/*---------------------------------------------------*/ +static +void init_RL ( EState* s ) +{ + s->state_in_ch = 256; + s->state_in_len = 0; +} + + +static +Bool isempty_RL ( EState* s ) +{ + if (s->state_in_ch < 256 && s->state_in_len > 0) + return False; else + return True; +} + + +/*---------------------------------------------------*/ +int BZ_API(BZ2_bzCompressInit) + ( bz_stream* strm, + int blockSize100k, + int verbosity, + int workFactor ) +{ + Int32 n; + EState* s; + + if (!bz_config_ok()) return BZ_CONFIG_ERROR; + + if (strm == NULL || + blockSize100k < 1 || blockSize100k > 9 || + workFactor < 0 || workFactor > 250) + return BZ_PARAM_ERROR; + + if (workFactor == 0) workFactor = 30; + if (strm->bzalloc == NULL) strm->bzalloc = default_bzalloc; + if (strm->bzfree == NULL) strm->bzfree = default_bzfree; + + s = (EState*)BZALLOC( sizeof(EState) ); + if (s == NULL) return BZ_MEM_ERROR; + s->strm = strm; + + s->arr1 = NULL; + s->arr2 = NULL; + s->ftab = NULL; + + n = 100000 * blockSize100k; + s->arr1 = (UInt32*)BZALLOC( n * sizeof(UInt32) ); + s->arr2 = (UInt32*)BZALLOC( (n+BZ_N_OVERSHOOT) * sizeof(UInt32) ); + s->ftab = (UInt32*)BZALLOC( 65537 * sizeof(UInt32) ); + + if (s->arr1 == NULL || s->arr2 == NULL || s->ftab == NULL) { + if (s->arr1 != NULL) BZFREE(s->arr1); + if (s->arr2 != NULL) BZFREE(s->arr2); + if (s->ftab != NULL) BZFREE(s->ftab); + if (s != NULL) BZFREE(s); + return BZ_MEM_ERROR; + } + + s->blockNo = 0; + s->state = BZ_S_INPUT; + s->mode = BZ_M_RUNNING; + s->combinedCRC = 0; + s->blockSize100k = blockSize100k; + s->nblockMAX = 100000 * blockSize100k - 19; + s->verbosity = verbosity; + s->workFactor = workFactor; + + s->block = (UChar*)s->arr2; + s->mtfv = (UInt16*)s->arr1; + s->zbits = NULL; + s->ptr = (UInt32*)s->arr1; + + strm->state = s; + strm->total_in_lo32 = 0; + strm->total_in_hi32 = 0; + strm->total_out_lo32 = 0; + strm->total_out_hi32 = 0; + init_RL ( s ); + prepare_new_block ( s ); + return BZ_OK; +} + + +/*---------------------------------------------------*/ +static +void add_pair_to_block ( EState* s ) +{ + Int32 i; + UChar ch = (UChar)(s->state_in_ch); + for (i = 0; i < s->state_in_len; i++) { + BZ_UPDATE_CRC( s->blockCRC, ch ); + } + s->inUse[s->state_in_ch] = True; + switch (s->state_in_len) { + case 1: + s->block[s->nblock] = (UChar)ch; s->nblock++; + break; + case 2: + s->block[s->nblock] = (UChar)ch; s->nblock++; + s->block[s->nblock] = (UChar)ch; s->nblock++; + break; + case 3: + s->block[s->nblock] = (UChar)ch; s->nblock++; + s->block[s->nblock] = (UChar)ch; s->nblock++; + s->block[s->nblock] = (UChar)ch; s->nblock++; + break; + default: + s->inUse[s->state_in_len-4] = True; + s->block[s->nblock] = (UChar)ch; s->nblock++; + s->block[s->nblock] = (UChar)ch; s->nblock++; + s->block[s->nblock] = (UChar)ch; s->nblock++; + s->block[s->nblock] = (UChar)ch; s->nblock++; + s->block[s->nblock] = ((UChar)(s->state_in_len-4)); + s->nblock++; + break; + } +} + + +/*---------------------------------------------------*/ +static +void flush_RL ( EState* s ) +{ + if (s->state_in_ch < 256) add_pair_to_block ( s ); + init_RL ( s ); +} + + +/*---------------------------------------------------*/ +#define ADD_CHAR_TO_BLOCK(zs,zchh0) \ +{ \ + UInt32 zchh = (UInt32)(zchh0); \ + /*-- fast track the common case --*/ \ + if (zchh != zs->state_in_ch && \ + zs->state_in_len == 1) { \ + UChar ch = (UChar)(zs->state_in_ch); \ + BZ_UPDATE_CRC( zs->blockCRC, ch ); \ + zs->inUse[zs->state_in_ch] = True; \ + zs->block[zs->nblock] = (UChar)ch; \ + zs->nblock++; \ + zs->state_in_ch = zchh; \ + } \ + else \ + /*-- general, uncommon cases --*/ \ + if (zchh != zs->state_in_ch || \ + zs->state_in_len == 255) { \ + if (zs->state_in_ch < 256) \ + add_pair_to_block ( zs ); \ + zs->state_in_ch = zchh; \ + zs->state_in_len = 1; \ + } else { \ + zs->state_in_len++; \ + } \ +} + + +/*---------------------------------------------------*/ +static +Bool copy_input_until_stop ( EState* s ) +{ + Bool progress_in = False; + + if (s->mode == BZ_M_RUNNING) { + + /*-- fast track the common case --*/ + while (True) { + /*-- block full? --*/ + if (s->nblock >= s->nblockMAX) break; + /*-- no input? --*/ + if (s->strm->avail_in == 0) break; + progress_in = True; + ADD_CHAR_TO_BLOCK ( s, (UInt32)(*((UChar*)(s->strm->next_in))) ); + s->strm->next_in++; + s->strm->avail_in--; + s->strm->total_in_lo32++; + if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++; + } + + } else { + + /*-- general, uncommon case --*/ + while (True) { + /*-- block full? --*/ + if (s->nblock >= s->nblockMAX) break; + /*-- no input? --*/ + if (s->strm->avail_in == 0) break; + /*-- flush/finish end? --*/ + if (s->avail_in_expect == 0) break; + progress_in = True; + ADD_CHAR_TO_BLOCK ( s, (UInt32)(*((UChar*)(s->strm->next_in))) ); + s->strm->next_in++; + s->strm->avail_in--; + s->strm->total_in_lo32++; + if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++; + s->avail_in_expect--; + } + } + return progress_in; +} + + +/*---------------------------------------------------*/ +static +Bool copy_output_until_stop ( EState* s ) +{ + Bool progress_out = False; + + while (True) { + + /*-- no output space? --*/ + if (s->strm->avail_out == 0) break; + + /*-- block done? --*/ + if (s->state_out_pos >= s->numZ) break; + + progress_out = True; + *(s->strm->next_out) = s->zbits[s->state_out_pos]; + s->state_out_pos++; + s->strm->avail_out--; + s->strm->next_out++; + s->strm->total_out_lo32++; + if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++; + } + + return progress_out; +} + + +/*---------------------------------------------------*/ +static +Bool handle_compress ( bz_stream* strm ) +{ + Bool progress_in = False; + Bool progress_out = False; + EState* s = (EState*)strm->state; + + while (True) { + + if (s->state == BZ_S_OUTPUT) { + progress_out |= copy_output_until_stop ( s ); + if (s->state_out_pos < s->numZ) break; + if (s->mode == BZ_M_FINISHING && + s->avail_in_expect == 0 && + isempty_RL(s)) break; + prepare_new_block ( s ); + s->state = BZ_S_INPUT; + if (s->mode == BZ_M_FLUSHING && + s->avail_in_expect == 0 && + isempty_RL(s)) break; + } + + if (s->state == BZ_S_INPUT) { + progress_in |= copy_input_until_stop ( s ); + if (s->mode != BZ_M_RUNNING && s->avail_in_expect == 0) { + flush_RL ( s ); + BZ2_compressBlock ( s, (Bool)(s->mode == BZ_M_FINISHING) ); + s->state = BZ_S_OUTPUT; + } + else + if (s->nblock >= s->nblockMAX) { + BZ2_compressBlock ( s, False ); + s->state = BZ_S_OUTPUT; + } + else + if (s->strm->avail_in == 0) { + break; + } + } + + } + + return progress_in || progress_out; +} + + +/*---------------------------------------------------*/ +int BZ_API(BZ2_bzCompress) ( bz_stream *strm, int action ) +{ + Bool progress; + EState* s; + if (strm == NULL) return BZ_PARAM_ERROR; + s = (EState*)strm->state; + if (s == NULL) return BZ_PARAM_ERROR; + if (s->strm != strm) return BZ_PARAM_ERROR; + + preswitch: + switch (s->mode) { + + case BZ_M_IDLE: + return BZ_SEQUENCE_ERROR; + + case BZ_M_RUNNING: + if (action == BZ_RUN) { + progress = handle_compress ( strm ); + return progress ? BZ_RUN_OK : BZ_PARAM_ERROR; + } + else + if (action == BZ_FLUSH) { + s->avail_in_expect = strm->avail_in; + s->mode = BZ_M_FLUSHING; + goto preswitch; + } + else + if (action == BZ_FINISH) { + s->avail_in_expect = strm->avail_in; + s->mode = BZ_M_FINISHING; + goto preswitch; + } + else + return BZ_PARAM_ERROR; + + case BZ_M_FLUSHING: + if (action != BZ_FLUSH) return BZ_SEQUENCE_ERROR; + if (s->avail_in_expect != s->strm->avail_in) + return BZ_SEQUENCE_ERROR; + progress = handle_compress ( strm ); + if (s->avail_in_expect > 0 || !isempty_RL(s) || + s->state_out_pos < s->numZ) return BZ_FLUSH_OK; + s->mode = BZ_M_RUNNING; + return BZ_RUN_OK; + + case BZ_M_FINISHING: + if (action != BZ_FINISH) return BZ_SEQUENCE_ERROR; + if (s->avail_in_expect != s->strm->avail_in) + return BZ_SEQUENCE_ERROR; + progress = handle_compress ( strm ); + if (!progress) return BZ_SEQUENCE_ERROR; + if (s->avail_in_expect > 0 || !isempty_RL(s) || + s->state_out_pos < s->numZ) return BZ_FINISH_OK; + s->mode = BZ_M_IDLE; + return BZ_STREAM_END; + } + return BZ_OK; /*--not reached--*/ +} + + +/*---------------------------------------------------*/ +int BZ_API(BZ2_bzCompressEnd) ( bz_stream *strm ) +{ + EState* s; + if (strm == NULL) return BZ_PARAM_ERROR; + s = (EState*)strm->state; + if (s == NULL) return BZ_PARAM_ERROR; + if (s->strm != strm) return BZ_PARAM_ERROR; + + if (s->arr1 != NULL) BZFREE(s->arr1); + if (s->arr2 != NULL) BZFREE(s->arr2); + if (s->ftab != NULL) BZFREE(s->ftab); + BZFREE(strm->state); + + strm->state = NULL; + + return BZ_OK; +} + + +/*---------------------------------------------------*/ +/*--- Decompression stuff ---*/ +/*---------------------------------------------------*/ + +/*---------------------------------------------------*/ +int BZ_API(BZ2_bzDecompressInit) + ( bz_stream* strm, + int verbosity, + int small ) +{ + DState* s; + + if (!bz_config_ok()) return BZ_CONFIG_ERROR; + + if (strm == NULL) return BZ_PARAM_ERROR; + if (small != 0 && small != 1) return BZ_PARAM_ERROR; + if (verbosity < 0 || verbosity > 4) return BZ_PARAM_ERROR; + + if (strm->bzalloc == NULL) strm->bzalloc = default_bzalloc; + if (strm->bzfree == NULL) strm->bzfree = default_bzfree; + + s = (DState*)BZALLOC( sizeof(DState) ); + if (s == NULL) return BZ_MEM_ERROR; + s->strm = strm; + strm->state = s; + s->state = BZ_X_MAGIC_1; + s->bsLive = 0; + s->bsBuff = 0; + s->calculatedCombinedCRC = 0; + strm->total_in_lo32 = 0; + strm->total_in_hi32 = 0; + strm->total_out_lo32 = 0; + strm->total_out_hi32 = 0; + s->smallDecompress = (Bool)small; + s->ll4 = NULL; + s->ll16 = NULL; + s->tt = NULL; + s->currBlockNo = 0; + s->verbosity = verbosity; + + return BZ_OK; +} + + +/*---------------------------------------------------*/ +/* Return True iff data corruption is discovered. + Returns False if there is no problem. +*/ +static +Bool unRLE_obuf_to_output_FAST ( DState* s ) +{ + UChar k1; + + if (s->blockRandomised) { + + while (True) { + /* try to finish existing run */ + while (True) { + if (s->strm->avail_out == 0) return False; + if (s->state_out_len == 0) break; + *( (UChar*)(s->strm->next_out) ) = s->state_out_ch; + BZ_UPDATE_CRC ( s->calculatedBlockCRC, s->state_out_ch ); + s->state_out_len--; + s->strm->next_out++; + s->strm->avail_out--; + s->strm->total_out_lo32++; + if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++; + } + + /* can a new run be started? */ + if (s->nblock_used == s->save_nblock+1) return False; + + /* Only caused by corrupt data stream? */ + if (s->nblock_used > s->save_nblock+1) + return True; + + s->state_out_len = 1; + s->state_out_ch = s->k0; + BZ_GET_FAST(k1); BZ_RAND_UPD_MASK; + k1 ^= BZ_RAND_MASK; s->nblock_used++; + if (s->nblock_used == s->save_nblock+1) continue; + if (k1 != s->k0) { s->k0 = k1; continue; }; + + s->state_out_len = 2; + BZ_GET_FAST(k1); BZ_RAND_UPD_MASK; + k1 ^= BZ_RAND_MASK; s->nblock_used++; + if (s->nblock_used == s->save_nblock+1) continue; + if (k1 != s->k0) { s->k0 = k1; continue; }; + + s->state_out_len = 3; + BZ_GET_FAST(k1); BZ_RAND_UPD_MASK; + k1 ^= BZ_RAND_MASK; s->nblock_used++; + if (s->nblock_used == s->save_nblock+1) continue; + if (k1 != s->k0) { s->k0 = k1; continue; }; + + BZ_GET_FAST(k1); BZ_RAND_UPD_MASK; + k1 ^= BZ_RAND_MASK; s->nblock_used++; + s->state_out_len = ((Int32)k1) + 4; + BZ_GET_FAST(s->k0); BZ_RAND_UPD_MASK; + s->k0 ^= BZ_RAND_MASK; s->nblock_used++; + } + + } else { + + /* restore */ + UInt32 c_calculatedBlockCRC = s->calculatedBlockCRC; + UChar c_state_out_ch = s->state_out_ch; + Int32 c_state_out_len = s->state_out_len; + Int32 c_nblock_used = s->nblock_used; + Int32 c_k0 = s->k0; + UInt32* c_tt = s->tt; + UInt32 c_tPos = s->tPos; + char* cs_next_out = s->strm->next_out; + unsigned int cs_avail_out = s->strm->avail_out; + Int32 ro_blockSize100k = s->blockSize100k; + /* end restore */ + + UInt32 avail_out_INIT = cs_avail_out; + Int32 s_save_nblockPP = s->save_nblock+1; + unsigned int total_out_lo32_old; + + while (True) { + + /* try to finish existing run */ + if (c_state_out_len > 0) { + while (True) { + if (cs_avail_out == 0) goto return_notr; + if (c_state_out_len == 1) break; + *( (UChar*)(cs_next_out) ) = c_state_out_ch; + BZ_UPDATE_CRC ( c_calculatedBlockCRC, c_state_out_ch ); + c_state_out_len--; + cs_next_out++; + cs_avail_out--; + } + s_state_out_len_eq_one: + { + if (cs_avail_out == 0) { + c_state_out_len = 1; goto return_notr; + }; + *( (UChar*)(cs_next_out) ) = c_state_out_ch; + BZ_UPDATE_CRC ( c_calculatedBlockCRC, c_state_out_ch ); + cs_next_out++; + cs_avail_out--; + } + } + /* Only caused by corrupt data stream? */ + if (c_nblock_used > s_save_nblockPP) + return True; + + /* can a new run be started? */ + if (c_nblock_used == s_save_nblockPP) { + c_state_out_len = 0; goto return_notr; + }; + c_state_out_ch = c_k0; + BZ_GET_FAST_C(k1); c_nblock_used++; + if (k1 != c_k0) { + c_k0 = k1; goto s_state_out_len_eq_one; + }; + if (c_nblock_used == s_save_nblockPP) + goto s_state_out_len_eq_one; + + c_state_out_len = 2; + BZ_GET_FAST_C(k1); c_nblock_used++; + if (c_nblock_used == s_save_nblockPP) continue; + if (k1 != c_k0) { c_k0 = k1; continue; }; + + c_state_out_len = 3; + BZ_GET_FAST_C(k1); c_nblock_used++; + if (c_nblock_used == s_save_nblockPP) continue; + if (k1 != c_k0) { c_k0 = k1; continue; }; + + BZ_GET_FAST_C(k1); c_nblock_used++; + c_state_out_len = ((Int32)k1) + 4; + BZ_GET_FAST_C(c_k0); c_nblock_used++; + } + + return_notr: + total_out_lo32_old = s->strm->total_out_lo32; + s->strm->total_out_lo32 += (avail_out_INIT - cs_avail_out); + if (s->strm->total_out_lo32 < total_out_lo32_old) + s->strm->total_out_hi32++; + + /* save */ + s->calculatedBlockCRC = c_calculatedBlockCRC; + s->state_out_ch = c_state_out_ch; + s->state_out_len = c_state_out_len; + s->nblock_used = c_nblock_used; + s->k0 = c_k0; + s->tt = c_tt; + s->tPos = c_tPos; + s->strm->next_out = cs_next_out; + s->strm->avail_out = cs_avail_out; + /* end save */ + } + return False; +} + + + +/*---------------------------------------------------*/ +Int32 BZ2_indexIntoF ( Int32 indx, Int32 *cftab ) +{ + Int32 nb, na, mid; + nb = 0; + na = 256; + do { + mid = (nb + na) >> 1; + if (indx >= cftab[mid]) nb = mid; else na = mid; + } + while (na - nb != 1); + return nb; +} + + +/*---------------------------------------------------*/ +/* Return True iff data corruption is discovered. + Returns False if there is no problem. +*/ +static +Bool unRLE_obuf_to_output_SMALL ( DState* s ) +{ + UChar k1; + + if (s->blockRandomised) { + + while (True) { + /* try to finish existing run */ + while (True) { + if (s->strm->avail_out == 0) return False; + if (s->state_out_len == 0) break; + *( (UChar*)(s->strm->next_out) ) = s->state_out_ch; + BZ_UPDATE_CRC ( s->calculatedBlockCRC, s->state_out_ch ); + s->state_out_len--; + s->strm->next_out++; + s->strm->avail_out--; + s->strm->total_out_lo32++; + if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++; + } + + /* can a new run be started? */ + if (s->nblock_used == s->save_nblock+1) return False; + + /* Only caused by corrupt data stream? */ + if (s->nblock_used > s->save_nblock+1) + return True; + + s->state_out_len = 1; + s->state_out_ch = s->k0; + BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK; + k1 ^= BZ_RAND_MASK; s->nblock_used++; + if (s->nblock_used == s->save_nblock+1) continue; + if (k1 != s->k0) { s->k0 = k1; continue; }; + + s->state_out_len = 2; + BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK; + k1 ^= BZ_RAND_MASK; s->nblock_used++; + if (s->nblock_used == s->save_nblock+1) continue; + if (k1 != s->k0) { s->k0 = k1; continue; }; + + s->state_out_len = 3; + BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK; + k1 ^= BZ_RAND_MASK; s->nblock_used++; + if (s->nblock_used == s->save_nblock+1) continue; + if (k1 != s->k0) { s->k0 = k1; continue; }; + + BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK; + k1 ^= BZ_RAND_MASK; s->nblock_used++; + s->state_out_len = ((Int32)k1) + 4; + BZ_GET_SMALL(s->k0); BZ_RAND_UPD_MASK; + s->k0 ^= BZ_RAND_MASK; s->nblock_used++; + } + + } else { + + while (True) { + /* try to finish existing run */ + while (True) { + if (s->strm->avail_out == 0) return False; + if (s->state_out_len == 0) break; + *( (UChar*)(s->strm->next_out) ) = s->state_out_ch; + BZ_UPDATE_CRC ( s->calculatedBlockCRC, s->state_out_ch ); + s->state_out_len--; + s->strm->next_out++; + s->strm->avail_out--; + s->strm->total_out_lo32++; + if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++; + } + + /* can a new run be started? */ + if (s->nblock_used == s->save_nblock+1) return False; + + /* Only caused by corrupt data stream? */ + if (s->nblock_used > s->save_nblock+1) + return True; + + s->state_out_len = 1; + s->state_out_ch = s->k0; + BZ_GET_SMALL(k1); s->nblock_used++; + if (s->nblock_used == s->save_nblock+1) continue; + if (k1 != s->k0) { s->k0 = k1; continue; }; + + s->state_out_len = 2; + BZ_GET_SMALL(k1); s->nblock_used++; + if (s->nblock_used == s->save_nblock+1) continue; + if (k1 != s->k0) { s->k0 = k1; continue; }; + + s->state_out_len = 3; + BZ_GET_SMALL(k1); s->nblock_used++; + if (s->nblock_used == s->save_nblock+1) continue; + if (k1 != s->k0) { s->k0 = k1; continue; }; + + BZ_GET_SMALL(k1); s->nblock_used++; + s->state_out_len = ((Int32)k1) + 4; + BZ_GET_SMALL(s->k0); s->nblock_used++; + } + + } +} + + +/*---------------------------------------------------*/ +int BZ_API(BZ2_bzDecompress) ( bz_stream *strm ) +{ + Bool corrupt; + DState* s; + if (strm == NULL) return BZ_PARAM_ERROR; + s = (DState*)strm->state; + if (s == NULL) return BZ_PARAM_ERROR; + if (s->strm != strm) return BZ_PARAM_ERROR; + + while (True) { + if (s->state == BZ_X_IDLE) return BZ_SEQUENCE_ERROR; + if (s->state == BZ_X_OUTPUT) { + if (s->smallDecompress) + corrupt = unRLE_obuf_to_output_SMALL ( s ); else + corrupt = unRLE_obuf_to_output_FAST ( s ); + if (corrupt) return BZ_DATA_ERROR; + if (s->nblock_used == s->save_nblock+1 && s->state_out_len == 0) { + BZ_FINALISE_CRC ( s->calculatedBlockCRC ); + if (s->verbosity >= 3) + VPrintf2 ( " {0x%08x, 0x%08x}", s->storedBlockCRC, + s->calculatedBlockCRC ); + if (s->verbosity >= 2) VPrintf0 ( "]" ); + if (s->calculatedBlockCRC != s->storedBlockCRC) + return BZ_DATA_ERROR; + s->calculatedCombinedCRC + = (s->calculatedCombinedCRC << 1) | + (s->calculatedCombinedCRC >> 31); + s->calculatedCombinedCRC ^= s->calculatedBlockCRC; + s->state = BZ_X_BLKHDR_1; + } else { + return BZ_OK; + } + } + if (s->state >= BZ_X_MAGIC_1) { + Int32 r = BZ2_decompress ( s ); + if (r == BZ_STREAM_END) { + if (s->verbosity >= 3) + VPrintf2 ( "\n combined CRCs: stored = 0x%08x, computed = 0x%08x", + s->storedCombinedCRC, s->calculatedCombinedCRC ); + if (s->calculatedCombinedCRC != s->storedCombinedCRC) + return BZ_DATA_ERROR; + return r; + } + if (s->state != BZ_X_OUTPUT) return r; + } + } + + AssertH ( 0, 6001 ); + + return 0; /*NOTREACHED*/ +} + + +/*---------------------------------------------------*/ +int BZ_API(BZ2_bzDecompressEnd) ( bz_stream *strm ) +{ + DState* s; + if (strm == NULL) return BZ_PARAM_ERROR; + s = (DState*)strm->state; + if (s == NULL) return BZ_PARAM_ERROR; + if (s->strm != strm) return BZ_PARAM_ERROR; + + if (s->tt != NULL) BZFREE(s->tt); + if (s->ll16 != NULL) BZFREE(s->ll16); + if (s->ll4 != NULL) BZFREE(s->ll4); + + BZFREE(strm->state); + strm->state = NULL; + + return BZ_OK; +} + + +#ifndef BZ_NO_STDIO +/*---------------------------------------------------*/ +/*--- File I/O stuff ---*/ +/*---------------------------------------------------*/ + +#define BZ_SETERR(eee) \ +{ \ + if (bzerror != NULL) *bzerror = eee; \ + if (bzf != NULL) bzf->lastErr = eee; \ +} + +typedef + struct { + FILE* handle; + Char buf[BZ_MAX_UNUSED]; + Int32 bufN; + Bool writing; + bz_stream strm; + Int32 lastErr; + Bool initialisedOk; + } + bzFile; + + +/*---------------------------------------------*/ +static Bool myfeof ( FILE* f ) +{ + Int32 c = fgetc ( f ); + if (c == EOF) return True; + ungetc ( c, f ); + return False; +} + + +/*---------------------------------------------------*/ +BZFILE* BZ_API(BZ2_bzWriteOpen) + ( int* bzerror, + FILE* f, + int blockSize100k, + int verbosity, + int workFactor ) +{ + Int32 ret; + bzFile* bzf = NULL; + + BZ_SETERR(BZ_OK); + + if (f == NULL || + (blockSize100k < 1 || blockSize100k > 9) || + (workFactor < 0 || workFactor > 250) || + (verbosity < 0 || verbosity > 4)) + { BZ_SETERR(BZ_PARAM_ERROR); return NULL; }; + + if (ferror(f)) + { BZ_SETERR(BZ_IO_ERROR); return NULL; }; + + bzf = (bzFile*)malloc ( sizeof(bzFile) ); + if (bzf == NULL) + { BZ_SETERR(BZ_MEM_ERROR); return NULL; }; + + BZ_SETERR(BZ_OK); + bzf->initialisedOk = False; + bzf->bufN = 0; + bzf->handle = f; + bzf->writing = True; + bzf->strm.bzalloc = NULL; + bzf->strm.bzfree = NULL; + bzf->strm.opaque = NULL; + + if (workFactor == 0) workFactor = 30; + ret = BZ2_bzCompressInit ( &(bzf->strm), blockSize100k, + verbosity, workFactor ); + if (ret != BZ_OK) + { BZ_SETERR(ret); free(bzf); return NULL; }; + + bzf->strm.avail_in = 0; + bzf->initialisedOk = True; + return bzf; +} + + + +/*---------------------------------------------------*/ +void BZ_API(BZ2_bzWrite) + ( int* bzerror, + BZFILE* b, + void* buf, + int len ) +{ + Int32 n, n2, ret; + bzFile* bzf = (bzFile*)b; + + BZ_SETERR(BZ_OK); + if (bzf == NULL || buf == NULL || len < 0) + { BZ_SETERR(BZ_PARAM_ERROR); return; }; + if (!(bzf->writing)) + { BZ_SETERR(BZ_SEQUENCE_ERROR); return; }; + if (ferror(bzf->handle)) + { BZ_SETERR(BZ_IO_ERROR); return; }; + + if (len == 0) + { BZ_SETERR(BZ_OK); return; }; + + bzf->strm.avail_in = len; + bzf->strm.next_in = (char*)buf; + + while (True) { + bzf->strm.avail_out = BZ_MAX_UNUSED; + bzf->strm.next_out = bzf->buf; + ret = BZ2_bzCompress ( &(bzf->strm), BZ_RUN ); + if (ret != BZ_RUN_OK) + { BZ_SETERR(ret); return; }; + + if (bzf->strm.avail_out < BZ_MAX_UNUSED) { + n = BZ_MAX_UNUSED - bzf->strm.avail_out; + n2 = fwrite ( (void*)(bzf->buf), sizeof(UChar), + n, bzf->handle ); + if (n != n2 || ferror(bzf->handle)) + { BZ_SETERR(BZ_IO_ERROR); return; }; + } + + if (bzf->strm.avail_in == 0) + { BZ_SETERR(BZ_OK); return; }; + } +} + + +/*---------------------------------------------------*/ +void BZ_API(BZ2_bzWriteClose) + ( int* bzerror, + BZFILE* b, + int abandon, + unsigned int* nbytes_in, + unsigned int* nbytes_out ) +{ + BZ2_bzWriteClose64 ( bzerror, b, abandon, + nbytes_in, NULL, nbytes_out, NULL ); +} + + +void BZ_API(BZ2_bzWriteClose64) + ( int* bzerror, + BZFILE* b, + int abandon, + unsigned int* nbytes_in_lo32, + unsigned int* nbytes_in_hi32, + unsigned int* nbytes_out_lo32, + unsigned int* nbytes_out_hi32 ) +{ + Int32 n, n2, ret; + bzFile* bzf = (bzFile*)b; + + if (bzf == NULL) + { BZ_SETERR(BZ_OK); return; }; + if (!(bzf->writing)) + { BZ_SETERR(BZ_SEQUENCE_ERROR); return; }; + if (ferror(bzf->handle)) + { BZ_SETERR(BZ_IO_ERROR); return; }; + + if (nbytes_in_lo32 != NULL) *nbytes_in_lo32 = 0; + if (nbytes_in_hi32 != NULL) *nbytes_in_hi32 = 0; + if (nbytes_out_lo32 != NULL) *nbytes_out_lo32 = 0; + if (nbytes_out_hi32 != NULL) *nbytes_out_hi32 = 0; + + if ((!abandon) && bzf->lastErr == BZ_OK) { + while (True) { + bzf->strm.avail_out = BZ_MAX_UNUSED; + bzf->strm.next_out = bzf->buf; + ret = BZ2_bzCompress ( &(bzf->strm), BZ_FINISH ); + if (ret != BZ_FINISH_OK && ret != BZ_STREAM_END) + { BZ_SETERR(ret); return; }; + + if (bzf->strm.avail_out < BZ_MAX_UNUSED) { + n = BZ_MAX_UNUSED - bzf->strm.avail_out; + n2 = fwrite ( (void*)(bzf->buf), sizeof(UChar), + n, bzf->handle ); + if (n != n2 || ferror(bzf->handle)) + { BZ_SETERR(BZ_IO_ERROR); return; }; + } + + if (ret == BZ_STREAM_END) break; + } + } + + if ( !abandon && !ferror ( bzf->handle ) ) { + fflush ( bzf->handle ); + if (ferror(bzf->handle)) + { BZ_SETERR(BZ_IO_ERROR); return; }; + } + + if (nbytes_in_lo32 != NULL) + *nbytes_in_lo32 = bzf->strm.total_in_lo32; + if (nbytes_in_hi32 != NULL) + *nbytes_in_hi32 = bzf->strm.total_in_hi32; + if (nbytes_out_lo32 != NULL) + *nbytes_out_lo32 = bzf->strm.total_out_lo32; + if (nbytes_out_hi32 != NULL) + *nbytes_out_hi32 = bzf->strm.total_out_hi32; + + BZ_SETERR(BZ_OK); + BZ2_bzCompressEnd ( &(bzf->strm) ); + free ( bzf ); +} + + +/*---------------------------------------------------*/ +BZFILE* BZ_API(BZ2_bzReadOpen) + ( int* bzerror, + FILE* f, + int verbosity, + int small, + void* unused, + int nUnused ) +{ + bzFile* bzf = NULL; + int ret; + + BZ_SETERR(BZ_OK); + + if (f == NULL || + (small != 0 && small != 1) || + (verbosity < 0 || verbosity > 4) || + (unused == NULL && nUnused != 0) || + (unused != NULL && (nUnused < 0 || nUnused > BZ_MAX_UNUSED))) + { BZ_SETERR(BZ_PARAM_ERROR); return NULL; }; + + if (ferror(f)) + { BZ_SETERR(BZ_IO_ERROR); return NULL; }; + + bzf = (bzFile*)malloc ( sizeof(bzFile) ); + if (bzf == NULL) + { BZ_SETERR(BZ_MEM_ERROR); return NULL; }; + + BZ_SETERR(BZ_OK); + + bzf->initialisedOk = False; + bzf->handle = f; + bzf->bufN = 0; + bzf->writing = False; + bzf->strm.bzalloc = NULL; + bzf->strm.bzfree = NULL; + bzf->strm.opaque = NULL; + + while (nUnused > 0) { + bzf->buf[bzf->bufN] = *((UChar*)(unused)); bzf->bufN++; + unused = ((void*)( 1 + ((UChar*)(unused)) )); + nUnused--; + } + + ret = BZ2_bzDecompressInit ( &(bzf->strm), verbosity, small ); + if (ret != BZ_OK) + { BZ_SETERR(ret); free(bzf); return NULL; }; + + bzf->strm.avail_in = bzf->bufN; + bzf->strm.next_in = bzf->buf; + + bzf->initialisedOk = True; + return bzf; +} + + +/*---------------------------------------------------*/ +void BZ_API(BZ2_bzReadClose) ( int *bzerror, BZFILE *b ) +{ + bzFile* bzf = (bzFile*)b; + + BZ_SETERR(BZ_OK); + if (bzf == NULL) + { BZ_SETERR(BZ_OK); return; }; + + if (bzf->writing) + { BZ_SETERR(BZ_SEQUENCE_ERROR); return; }; + + if (bzf->initialisedOk) + (void)BZ2_bzDecompressEnd ( &(bzf->strm) ); + free ( bzf ); +} + + +/*---------------------------------------------------*/ +int BZ_API(BZ2_bzRead) + ( int* bzerror, + BZFILE* b, + void* buf, + int len ) +{ + Int32 n, ret; + bzFile* bzf = (bzFile*)b; + + BZ_SETERR(BZ_OK); + + if (bzf == NULL || buf == NULL || len < 0) + { BZ_SETERR(BZ_PARAM_ERROR); return 0; }; + + if (bzf->writing) + { BZ_SETERR(BZ_SEQUENCE_ERROR); return 0; }; + + if (len == 0) + { BZ_SETERR(BZ_OK); return 0; }; + + bzf->strm.avail_out = len; + bzf->strm.next_out = (char*)buf; + + while (True) { + + if (ferror(bzf->handle)) + { BZ_SETERR(BZ_IO_ERROR); return 0; }; + + if (bzf->strm.avail_in == 0 && !myfeof(bzf->handle)) { + n = fread ( bzf->buf, sizeof(UChar), + BZ_MAX_UNUSED, bzf->handle ); + if (ferror(bzf->handle)) + { BZ_SETERR(BZ_IO_ERROR); return 0; }; + bzf->bufN = n; + bzf->strm.avail_in = bzf->bufN; + bzf->strm.next_in = bzf->buf; + } + + ret = BZ2_bzDecompress ( &(bzf->strm) ); + + if (ret != BZ_OK && ret != BZ_STREAM_END) + { BZ_SETERR(ret); return 0; }; + + if (ret == BZ_OK && myfeof(bzf->handle) && + bzf->strm.avail_in == 0 && bzf->strm.avail_out > 0) + { BZ_SETERR(BZ_UNEXPECTED_EOF); return 0; }; + + if (ret == BZ_STREAM_END) + { BZ_SETERR(BZ_STREAM_END); + return len - bzf->strm.avail_out; }; + if (bzf->strm.avail_out == 0) + { BZ_SETERR(BZ_OK); return len; }; + + } + + return 0; /*not reached*/ +} + + +/*---------------------------------------------------*/ +void BZ_API(BZ2_bzReadGetUnused) + ( int* bzerror, + BZFILE* b, + void** unused, + int* nUnused ) +{ + bzFile* bzf = (bzFile*)b; + if (bzf == NULL) + { BZ_SETERR(BZ_PARAM_ERROR); return; }; + if (bzf->lastErr != BZ_STREAM_END) + { BZ_SETERR(BZ_SEQUENCE_ERROR); return; }; + if (unused == NULL || nUnused == NULL) + { BZ_SETERR(BZ_PARAM_ERROR); return; }; + + BZ_SETERR(BZ_OK); + *nUnused = bzf->strm.avail_in; + *unused = bzf->strm.next_in; +} +#endif + + +/*---------------------------------------------------*/ +/*--- Misc convenience stuff ---*/ +/*---------------------------------------------------*/ + +/*---------------------------------------------------*/ +int BZ_API(BZ2_bzBuffToBuffCompress) + ( char* dest, + unsigned int* destLen, + char* source, + unsigned int sourceLen, + int blockSize100k, + int verbosity, + int workFactor ) +{ + bz_stream strm; + int ret; + + if (dest == NULL || destLen == NULL || + source == NULL || + blockSize100k < 1 || blockSize100k > 9 || + verbosity < 0 || verbosity > 4 || + workFactor < 0 || workFactor > 250) + return BZ_PARAM_ERROR; + + if (workFactor == 0) workFactor = 30; + strm.bzalloc = NULL; + strm.bzfree = NULL; + strm.opaque = NULL; + ret = BZ2_bzCompressInit ( &strm, blockSize100k, + verbosity, workFactor ); + if (ret != BZ_OK) return ret; + + strm.next_in = source; + strm.next_out = dest; + strm.avail_in = sourceLen; + strm.avail_out = *destLen; + + ret = BZ2_bzCompress ( &strm, BZ_FINISH ); + if (ret == BZ_FINISH_OK) goto output_overflow; + if (ret != BZ_STREAM_END) goto errhandler; + + /* normal termination */ + *destLen -= strm.avail_out; + BZ2_bzCompressEnd ( &strm ); + return BZ_OK; + + output_overflow: + BZ2_bzCompressEnd ( &strm ); + return BZ_OUTBUFF_FULL; + + errhandler: + BZ2_bzCompressEnd ( &strm ); + return ret; +} + + +/*---------------------------------------------------*/ +int BZ_API(BZ2_bzBuffToBuffDecompress) + ( char* dest, + unsigned int* destLen, + char* source, + unsigned int sourceLen, + int small, + int verbosity ) +{ + bz_stream strm; + int ret; + + if (dest == NULL || destLen == NULL || + source == NULL || + (small != 0 && small != 1) || + verbosity < 0 || verbosity > 4) + return BZ_PARAM_ERROR; + + strm.bzalloc = NULL; + strm.bzfree = NULL; + strm.opaque = NULL; + ret = BZ2_bzDecompressInit ( &strm, verbosity, small ); + if (ret != BZ_OK) return ret; + + strm.next_in = source; + strm.next_out = dest; + strm.avail_in = sourceLen; + strm.avail_out = *destLen; + + ret = BZ2_bzDecompress ( &strm ); + if (ret == BZ_OK) goto output_overflow_or_eof; + if (ret != BZ_STREAM_END) goto errhandler; + + /* normal termination */ + *destLen -= strm.avail_out; + BZ2_bzDecompressEnd ( &strm ); + return BZ_OK; + + output_overflow_or_eof: + if (strm.avail_out > 0) { + BZ2_bzDecompressEnd ( &strm ); + return BZ_UNEXPECTED_EOF; + } else { + BZ2_bzDecompressEnd ( &strm ); + return BZ_OUTBUFF_FULL; + }; + + errhandler: + BZ2_bzDecompressEnd ( &strm ); + return ret; +} + + +/*---------------------------------------------------*/ +/*-- + Code contributed by Yoshioka Tsuneo (tsuneo@rr.iij4u.or.jp) + to support better zlib compatibility. + This code is not _officially_ part of libbzip2 (yet); + I haven't tested it, documented it, or considered the + threading-safeness of it. + If this code breaks, please contact both Yoshioka and me. +--*/ +/*---------------------------------------------------*/ + +/*---------------------------------------------------*/ +/*-- + return version like "0.9.5d, 4-Sept-1999". +--*/ +const char * BZ_API(BZ2_bzlibVersion)(void) +{ + return BZ_VERSION; +} + + +#ifndef BZ_NO_STDIO +/*---------------------------------------------------*/ + +#if defined(_WIN32) || defined(OS2) || defined(MSDOS) +# include +# include +# define SET_BINARY_MODE(file) setmode(fileno(file),O_BINARY) +#else +# define SET_BINARY_MODE(file) +#endif +static +BZFILE * bzopen_or_bzdopen + ( const char *path, /* no use when bzdopen */ + int fd, /* no use when bzdopen */ + const char *mode, + int open_mode) /* bzopen: 0, bzdopen:1 */ +{ + int bzerr; + char unused[BZ_MAX_UNUSED]; + int blockSize100k = 9; + int writing = 0; + char mode2[10] = ""; + FILE *fp = NULL; + BZFILE *bzfp = NULL; + int verbosity = 0; + int workFactor = 30; + int smallMode = 0; + int nUnused = 0; + + if (mode == NULL) return NULL; + while (*mode) { + switch (*mode) { + case 'r': + writing = 0; break; + case 'w': + writing = 1; break; + case 's': + smallMode = 1; break; + default: + if (isdigit((int)(*mode))) { + blockSize100k = *mode-BZ_HDR_0; + } + } + mode++; + } + strcat(mode2, writing ? "w" : "r" ); + strcat(mode2,"b"); /* binary mode */ + + if (open_mode==0) { + if (path==NULL || strcmp(path,"")==0) { + fp = (writing ? stdout : stdin); + SET_BINARY_MODE(fp); + } else { + fp = fopen(path,mode2); + } + } else { +#ifdef BZ_STRICT_ANSI + fp = NULL; +#else + fp = fdopen(fd,mode2); +#endif + } + if (fp == NULL) return NULL; + + if (writing) { + /* Guard against total chaos and anarchy -- JRS */ + if (blockSize100k < 1) blockSize100k = 1; + if (blockSize100k > 9) blockSize100k = 9; + bzfp = BZ2_bzWriteOpen(&bzerr,fp,blockSize100k, + verbosity,workFactor); + } else { + bzfp = BZ2_bzReadOpen(&bzerr,fp,verbosity,smallMode, + unused,nUnused); + } + if (bzfp == NULL) { + if (fp != stdin && fp != stdout) fclose(fp); + return NULL; + } + return bzfp; +} + + +/*---------------------------------------------------*/ +/*-- + open file for read or write. + ex) bzopen("file","w9") + case path="" or NULL => use stdin or stdout. +--*/ +BZFILE * BZ_API(BZ2_bzopen) + ( const char *path, + const char *mode ) +{ + return bzopen_or_bzdopen(path,-1,mode,/*bzopen*/0); +} + + +/*---------------------------------------------------*/ +BZFILE * BZ_API(BZ2_bzdopen) + ( int fd, + const char *mode ) +{ + return bzopen_or_bzdopen(NULL,fd,mode,/*bzdopen*/1); +} + + +/*---------------------------------------------------*/ +int BZ_API(BZ2_bzread) (BZFILE* b, void* buf, int len ) +{ + int bzerr, nread; + if (((bzFile*)b)->lastErr == BZ_STREAM_END) return 0; + nread = BZ2_bzRead(&bzerr,b,buf,len); + if (bzerr == BZ_OK || bzerr == BZ_STREAM_END) { + return nread; + } else { + return -1; + } +} + + +/*---------------------------------------------------*/ +int BZ_API(BZ2_bzwrite) (BZFILE* b, void* buf, int len ) +{ + int bzerr; + + BZ2_bzWrite(&bzerr,b,buf,len); + if(bzerr == BZ_OK){ + return len; + }else{ + return -1; + } +} + + +/*---------------------------------------------------*/ +int BZ_API(BZ2_bzflush) (BZFILE *b) +{ + /* do nothing now... */ + return 0; +} + + +/*---------------------------------------------------*/ +void BZ_API(BZ2_bzclose) (BZFILE* b) +{ + int bzerr; + FILE *fp; + + if (b==NULL) {return;} + fp = ((bzFile *)b)->handle; + if(((bzFile*)b)->writing){ + BZ2_bzWriteClose(&bzerr,b,0,NULL,NULL); + if(bzerr != BZ_OK){ + BZ2_bzWriteClose(NULL,b,1,NULL,NULL); + } + }else{ + BZ2_bzReadClose(&bzerr,b); + } + if(fp!=stdin && fp!=stdout){ + fclose(fp); + } +} + + +/*---------------------------------------------------*/ +/*-- + return last error code +--*/ +static const char *bzerrorstrings[] = { + "OK" + ,"SEQUENCE_ERROR" + ,"PARAM_ERROR" + ,"MEM_ERROR" + ,"DATA_ERROR" + ,"DATA_ERROR_MAGIC" + ,"IO_ERROR" + ,"UNEXPECTED_EOF" + ,"OUTBUFF_FULL" + ,"CONFIG_ERROR" + ,"???" /* for future */ + ,"???" /* for future */ + ,"???" /* for future */ + ,"???" /* for future */ + ,"???" /* for future */ + ,"???" /* for future */ +}; + + +const char * BZ_API(BZ2_bzerror) (BZFILE *b, int *errnum) +{ + int err = ((bzFile *)b)->lastErr; + + if(err>0) err = 0; + *errnum = err; + return bzerrorstrings[err*-1]; +} +#endif + + +/*-------------------------------------------------------------*/ +/*--- end bzlib.c ---*/ +/*-------------------------------------------------------------*/ diff --git a/xdl/third_party/tbb/examples/graph/fgbzip2/bzlib.h b/xdl/third_party/tbb/examples/graph/fgbzip2/bzlib.h new file mode 100644 index 00000000..cfd22210 --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/fgbzip2/bzlib.h @@ -0,0 +1,334 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +/*-------------------------------------------------------------*/ +/*--- Public header file for the library. ---*/ +/*--- bzlib.h ---*/ +/*-------------------------------------------------------------*/ + +/* ------------------------------------------------------------------ + The original source for this example: + This file is part of bzip2/libbzip2, a program and library for + lossless, block-sorting data compression. + + bzip2/libbzip2 version 1.0.6 of 6 September 2010 + Copyright (C) 1996-2010 Julian Seward + + This program, "bzip2", the associated library "libbzip2", and all + documentation, are copyright (C) 1996-2010 Julian R Seward. 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. The origin of this software must not be misrepresented; you must + not claim that you wrote the original software. If you use this + software in a product, an acknowledgment in the product + documentation would be appreciated but is not required. + + 3. Altered source versions must be plainly marked as such, and must + not be misrepresented as being the original software. + + 4. The name of the author may not be used to endorse or promote + products derived from this software without specific prior written + permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. + + Julian Seward, jseward@bzip.org + bzip2/libbzip2 version 1.0.6 of 6 September 2010 + ------------------------------------------------------------------ */ + + +#ifndef _BZLIB_H +#define _BZLIB_H + +#ifdef __cplusplus +extern "C" { +#endif + +#define BZ_RUN 0 +#define BZ_FLUSH 1 +#define BZ_FINISH 2 + +#define BZ_OK 0 +#define BZ_RUN_OK 1 +#define BZ_FLUSH_OK 2 +#define BZ_FINISH_OK 3 +#define BZ_STREAM_END 4 +#define BZ_SEQUENCE_ERROR (-1) +#define BZ_PARAM_ERROR (-2) +#define BZ_MEM_ERROR (-3) +#define BZ_DATA_ERROR (-4) +#define BZ_DATA_ERROR_MAGIC (-5) +#define BZ_IO_ERROR (-6) +#define BZ_UNEXPECTED_EOF (-7) +#define BZ_OUTBUFF_FULL (-8) +#define BZ_CONFIG_ERROR (-9) + +typedef + struct { + char *next_in; + unsigned int avail_in; + unsigned int total_in_lo32; + unsigned int total_in_hi32; + + char *next_out; + unsigned int avail_out; + unsigned int total_out_lo32; + unsigned int total_out_hi32; + + void *state; + + void *(*bzalloc)(void *,int,int); + void (*bzfree)(void *,void *); + void *opaque; + } + bz_stream; + + +#ifndef BZ_IMPORT +#define BZ_EXPORT +#endif + +#ifndef BZ_NO_STDIO +/* Need a definitition for FILE */ +#include +#endif + +#ifdef _WIN32 +# include +# ifdef small + /* windows.h define small to char */ +# undef small +# endif +# ifdef BZ_EXPORT +# define BZ_API(func) WINAPI func +# define BZ_EXTERN extern +# else + /* import windows dll dynamically */ +# define BZ_API(func) (WINAPI * func) +# define BZ_EXTERN +# endif +#else +# define BZ_API(func) func +# define BZ_EXTERN extern +#endif + + +/*-- Core (low-level) library functions --*/ + +BZ_EXTERN int BZ_API(BZ2_bzCompressInit) ( + bz_stream* strm, + int blockSize100k, + int verbosity, + int workFactor + ); + +BZ_EXTERN int BZ_API(BZ2_bzCompress) ( + bz_stream* strm, + int action + ); + +BZ_EXTERN int BZ_API(BZ2_bzCompressEnd) ( + bz_stream* strm + ); + +BZ_EXTERN int BZ_API(BZ2_bzDecompressInit) ( + bz_stream *strm, + int verbosity, + int small + ); + +BZ_EXTERN int BZ_API(BZ2_bzDecompress) ( + bz_stream* strm + ); + +BZ_EXTERN int BZ_API(BZ2_bzDecompressEnd) ( + bz_stream *strm + ); + + + +/*-- High(er) level library functions --*/ + +#ifndef BZ_NO_STDIO +#define BZ_MAX_UNUSED 5000 + +typedef void BZFILE; + +BZ_EXTERN BZFILE* BZ_API(BZ2_bzReadOpen) ( + int* bzerror, + FILE* f, + int verbosity, + int small, + void* unused, + int nUnused + ); + +BZ_EXTERN void BZ_API(BZ2_bzReadClose) ( + int* bzerror, + BZFILE* b + ); + +BZ_EXTERN void BZ_API(BZ2_bzReadGetUnused) ( + int* bzerror, + BZFILE* b, + void** unused, + int* nUnused + ); + +BZ_EXTERN int BZ_API(BZ2_bzRead) ( + int* bzerror, + BZFILE* b, + void* buf, + int len + ); + +BZ_EXTERN BZFILE* BZ_API(BZ2_bzWriteOpen) ( + int* bzerror, + FILE* f, + int blockSize100k, + int verbosity, + int workFactor + ); + +BZ_EXTERN void BZ_API(BZ2_bzWrite) ( + int* bzerror, + BZFILE* b, + void* buf, + int len + ); + +BZ_EXTERN void BZ_API(BZ2_bzWriteClose) ( + int* bzerror, + BZFILE* b, + int abandon, + unsigned int* nbytes_in, + unsigned int* nbytes_out + ); + +BZ_EXTERN void BZ_API(BZ2_bzWriteClose64) ( + int* bzerror, + BZFILE* b, + int abandon, + unsigned int* nbytes_in_lo32, + unsigned int* nbytes_in_hi32, + unsigned int* nbytes_out_lo32, + unsigned int* nbytes_out_hi32 + ); +#endif + + +/*-- Utility functions --*/ + +BZ_EXTERN int BZ_API(BZ2_bzBuffToBuffCompress) ( + char* dest, + unsigned int* destLen, + char* source, + unsigned int sourceLen, + int blockSize100k, + int verbosity, + int workFactor + ); + +BZ_EXTERN int BZ_API(BZ2_bzBuffToBuffDecompress) ( + char* dest, + unsigned int* destLen, + char* source, + unsigned int sourceLen, + int small, + int verbosity + ); + + +/*-- + Code contributed by Yoshioka Tsuneo (tsuneo@rr.iij4u.or.jp) + to support better zlib compatibility. + This code is not _officially_ part of libbzip2 (yet); + I haven't tested it, documented it, or considered the + threading-safeness of it. + If this code breaks, please contact both Yoshioka and me. +--*/ + +BZ_EXTERN const char * BZ_API(BZ2_bzlibVersion) ( + void + ); + +#ifndef BZ_NO_STDIO +BZ_EXTERN BZFILE * BZ_API(BZ2_bzopen) ( + const char *path, + const char *mode + ); + +BZ_EXTERN BZFILE * BZ_API(BZ2_bzdopen) ( + int fd, + const char *mode + ); + +BZ_EXTERN int BZ_API(BZ2_bzread) ( + BZFILE* b, + void* buf, + int len + ); + +BZ_EXTERN int BZ_API(BZ2_bzwrite) ( + BZFILE* b, + void* buf, + int len + ); + +BZ_EXTERN int BZ_API(BZ2_bzflush) ( + BZFILE* b + ); + +BZ_EXTERN void BZ_API(BZ2_bzclose) ( + BZFILE* b + ); + +BZ_EXTERN const char * BZ_API(BZ2_bzerror) ( + BZFILE *b, + int *errnum + ); +#endif + +#ifdef __cplusplus +} +#endif + +#endif + +/*-------------------------------------------------------------*/ +/*--- end bzlib.h ---*/ +/*-------------------------------------------------------------*/ diff --git a/xdl/third_party/tbb/examples/graph/fgbzip2/bzlib_private.h b/xdl/third_party/tbb/examples/graph/fgbzip2/bzlib_private.h new file mode 100644 index 00000000..14f03760 --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/fgbzip2/bzlib_private.h @@ -0,0 +1,561 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +/*-------------------------------------------------------------*/ +/*--- Private header file for the library. ---*/ +/*--- bzlib_private.h ---*/ +/*-------------------------------------------------------------*/ + +/* ------------------------------------------------------------------ + The original source for this example: + This file is part of bzip2/libbzip2, a program and library for + lossless, block-sorting data compression. + + bzip2/libbzip2 version 1.0.6 of 6 September 2010 + Copyright (C) 1996-2010 Julian Seward + + This program, "bzip2", the associated library "libbzip2", and all + documentation, are copyright (C) 1996-2010 Julian R Seward. 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. The origin of this software must not be misrepresented; you must + not claim that you wrote the original software. If you use this + software in a product, an acknowledgment in the product + documentation would be appreciated but is not required. + + 3. Altered source versions must be plainly marked as such, and must + not be misrepresented as being the original software. + + 4. The name of the author may not be used to endorse or promote + products derived from this software without specific prior written + permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. + + Julian Seward, jseward@bzip.org + bzip2/libbzip2 version 1.0.6 of 6 September 2010 + ------------------------------------------------------------------ */ + + +#ifndef _BZLIB_PRIVATE_H +#define _BZLIB_PRIVATE_H + +#include + +#ifndef BZ_NO_STDIO +#include +#include +#include +#endif + +#include "bzlib.h" + + + +/*-- General stuff. --*/ + +#define BZ_VERSION "1.0.6, 6-Sept-2010" + +typedef char Char; +typedef unsigned char Bool; +typedef unsigned char UChar; +typedef int Int32; +typedef unsigned int UInt32; +typedef short Int16; +typedef unsigned short UInt16; + +#define True ((Bool)1) +#define False ((Bool)0) + +#ifndef __GNUC__ +#define __inline__ /* */ +#endif + +#ifndef BZ_NO_STDIO + +extern void BZ2_bz__AssertH__fail ( int errcode ); +#define AssertH(cond,errcode) \ + { if (!(cond)) BZ2_bz__AssertH__fail ( errcode ); } + +#if BZ_DEBUG +#define AssertD(cond,msg) \ + { if (!(cond)) { \ + fprintf ( stderr, \ + "\n\nlibbzip2(debug build): internal error\n\t%s\n", msg );\ + exit(1); \ + }} +#else +#define AssertD(cond,msg) /* */ +#endif + +#define VPrintf0(zf) \ + fprintf(stderr,zf) +#define VPrintf1(zf,za1) \ + fprintf(stderr,zf,za1) +#define VPrintf2(zf,za1,za2) \ + fprintf(stderr,zf,za1,za2) +#define VPrintf3(zf,za1,za2,za3) \ + fprintf(stderr,zf,za1,za2,za3) +#define VPrintf4(zf,za1,za2,za3,za4) \ + fprintf(stderr,zf,za1,za2,za3,za4) +#define VPrintf5(zf,za1,za2,za3,za4,za5) \ + fprintf(stderr,zf,za1,za2,za3,za4,za5) + +#else + +extern void bz_internal_error ( int errcode ); +#define AssertH(cond,errcode) \ + { if (!(cond)) bz_internal_error ( errcode ); } +#define AssertD(cond,msg) do { } while (0) +#define VPrintf0(zf) do { } while (0) +#define VPrintf1(zf,za1) do { } while (0) +#define VPrintf2(zf,za1,za2) do { } while (0) +#define VPrintf3(zf,za1,za2,za3) do { } while (0) +#define VPrintf4(zf,za1,za2,za3,za4) do { } while (0) +#define VPrintf5(zf,za1,za2,za3,za4,za5) do { } while (0) + +#endif + + +#define BZALLOC(nnn) (strm->bzalloc)(strm->opaque,(nnn),1) +#define BZFREE(ppp) (strm->bzfree)(strm->opaque,(ppp)) + + +/*-- Header bytes. --*/ + +#define BZ_HDR_B 0x42 /* 'B' */ +#define BZ_HDR_Z 0x5a /* 'Z' */ +#define BZ_HDR_h 0x68 /* 'h' */ +#define BZ_HDR_0 0x30 /* '0' */ + +/*-- Constants for the back end. --*/ + +#define BZ_MAX_ALPHA_SIZE 258 +#define BZ_MAX_CODE_LEN 23 + +#define BZ_RUNA 0 +#define BZ_RUNB 1 + +#define BZ_N_GROUPS 6 +#define BZ_G_SIZE 50 +#define BZ_N_ITERS 4 + +#define BZ_MAX_SELECTORS (2 + (900000 / BZ_G_SIZE)) + + + +/*-- Stuff for randomising repetitive blocks. --*/ + +extern Int32 BZ2_rNums[512]; + +#define BZ_RAND_DECLS \ + Int32 rNToGo; \ + Int32 rTPos \ + +#define BZ_RAND_INIT_MASK \ + s->rNToGo = 0; \ + s->rTPos = 0 \ + +#define BZ_RAND_MASK ((s->rNToGo == 1) ? 1 : 0) + +#define BZ_RAND_UPD_MASK \ + if (s->rNToGo == 0) { \ + s->rNToGo = BZ2_rNums[s->rTPos]; \ + s->rTPos++; \ + if (s->rTPos == 512) s->rTPos = 0; \ + } \ + s->rNToGo--; + + + +/*-- Stuff for doing CRCs. --*/ + +extern UInt32 BZ2_crc32Table[256]; + +#define BZ_INITIALISE_CRC(crcVar) \ +{ \ + crcVar = 0xffffffffL; \ +} + +#define BZ_FINALISE_CRC(crcVar) \ +{ \ + crcVar = ~(crcVar); \ +} + +#define BZ_UPDATE_CRC(crcVar,cha) \ +{ \ + crcVar = (crcVar << 8) ^ \ + BZ2_crc32Table[(crcVar >> 24) ^ \ + ((UChar)cha)]; \ +} + + + +/*-- States and modes for compression. --*/ + +#define BZ_M_IDLE 1 +#define BZ_M_RUNNING 2 +#define BZ_M_FLUSHING 3 +#define BZ_M_FINISHING 4 + +#define BZ_S_OUTPUT 1 +#define BZ_S_INPUT 2 + +#define BZ_N_RADIX 2 +#define BZ_N_QSORT 12 +#define BZ_N_SHELL 18 +#define BZ_N_OVERSHOOT (BZ_N_RADIX + BZ_N_QSORT + BZ_N_SHELL + 2) + + + + +/*-- Structure holding all the compression-side stuff. --*/ + +typedef + struct { + /* pointer back to the struct bz_stream */ + bz_stream* strm; + + /* mode this stream is in, and whether inputting */ + /* or outputting data */ + Int32 mode; + Int32 state; + + /* remembers avail_in when flush/finish requested */ + UInt32 avail_in_expect; + + /* for doing the block sorting */ + UInt32* arr1; + UInt32* arr2; + UInt32* ftab; + Int32 origPtr; + + /* aliases for arr1 and arr2 */ + UInt32* ptr; + UChar* block; + UInt16* mtfv; + UChar* zbits; + + /* for deciding when to use the fallback sorting algorithm */ + Int32 workFactor; + + /* run-length-encoding of the input */ + UInt32 state_in_ch; + Int32 state_in_len; + BZ_RAND_DECLS; + + /* input and output limits and current posns */ + Int32 nblock; + Int32 nblockMAX; + Int32 numZ; + Int32 state_out_pos; + + /* map of bytes used in block */ + Int32 nInUse; + Bool inUse[256]; + UChar unseqToSeq[256]; + + /* the buffer for bit stream creation */ + UInt32 bsBuff; + Int32 bsLive; + + /* block and combined CRCs */ + UInt32 blockCRC; + UInt32 combinedCRC; + + /* misc administratium */ + Int32 verbosity; + Int32 blockNo; + Int32 blockSize100k; + + /* stuff for coding the MTF values */ + Int32 nMTF; + Int32 mtfFreq [BZ_MAX_ALPHA_SIZE]; + UChar selector [BZ_MAX_SELECTORS]; + UChar selectorMtf[BZ_MAX_SELECTORS]; + + UChar len [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; + Int32 code [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; + Int32 rfreq [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; + /* second dimension: only 3 needed; 4 makes index calculations faster */ + UInt32 len_pack[BZ_MAX_ALPHA_SIZE][4]; + + } + EState; + + + +/*-- externs for compression. --*/ + +extern void +BZ2_blockSort ( EState* ); + +extern void +BZ2_compressBlock ( EState*, Bool ); + +extern void +BZ2_bsInitWrite ( EState* ); + +extern void +BZ2_hbAssignCodes ( Int32*, UChar*, Int32, Int32, Int32 ); + +extern void +BZ2_hbMakeCodeLengths ( UChar*, Int32*, Int32, Int32 ); + + + +/*-- states for decompression. --*/ + +#define BZ_X_IDLE 1 +#define BZ_X_OUTPUT 2 + +#define BZ_X_MAGIC_1 10 +#define BZ_X_MAGIC_2 11 +#define BZ_X_MAGIC_3 12 +#define BZ_X_MAGIC_4 13 +#define BZ_X_BLKHDR_1 14 +#define BZ_X_BLKHDR_2 15 +#define BZ_X_BLKHDR_3 16 +#define BZ_X_BLKHDR_4 17 +#define BZ_X_BLKHDR_5 18 +#define BZ_X_BLKHDR_6 19 +#define BZ_X_BCRC_1 20 +#define BZ_X_BCRC_2 21 +#define BZ_X_BCRC_3 22 +#define BZ_X_BCRC_4 23 +#define BZ_X_RANDBIT 24 +#define BZ_X_ORIGPTR_1 25 +#define BZ_X_ORIGPTR_2 26 +#define BZ_X_ORIGPTR_3 27 +#define BZ_X_MAPPING_1 28 +#define BZ_X_MAPPING_2 29 +#define BZ_X_SELECTOR_1 30 +#define BZ_X_SELECTOR_2 31 +#define BZ_X_SELECTOR_3 32 +#define BZ_X_CODING_1 33 +#define BZ_X_CODING_2 34 +#define BZ_X_CODING_3 35 +#define BZ_X_MTF_1 36 +#define BZ_X_MTF_2 37 +#define BZ_X_MTF_3 38 +#define BZ_X_MTF_4 39 +#define BZ_X_MTF_5 40 +#define BZ_X_MTF_6 41 +#define BZ_X_ENDHDR_2 42 +#define BZ_X_ENDHDR_3 43 +#define BZ_X_ENDHDR_4 44 +#define BZ_X_ENDHDR_5 45 +#define BZ_X_ENDHDR_6 46 +#define BZ_X_CCRC_1 47 +#define BZ_X_CCRC_2 48 +#define BZ_X_CCRC_3 49 +#define BZ_X_CCRC_4 50 + + + +/*-- Constants for the fast MTF decoder. --*/ + +#define MTFA_SIZE 4096 +#define MTFL_SIZE 16 + + + +/*-- Structure holding all the decompression-side stuff. --*/ + +typedef + struct { + /* pointer back to the struct bz_stream */ + bz_stream* strm; + + /* state indicator for this stream */ + Int32 state; + + /* for doing the final run-length decoding */ + UChar state_out_ch; + Int32 state_out_len; + Bool blockRandomised; + BZ_RAND_DECLS; + + /* the buffer for bit stream reading */ + UInt32 bsBuff; + Int32 bsLive; + + /* misc administratium */ + Int32 blockSize100k; + Bool smallDecompress; + Int32 currBlockNo; + Int32 verbosity; + + /* for undoing the Burrows-Wheeler transform */ + Int32 origPtr; + UInt32 tPos; + Int32 k0; + Int32 unzftab[256]; + Int32 nblock_used; + Int32 cftab[257]; + Int32 cftabCopy[257]; + + /* for undoing the Burrows-Wheeler transform (FAST) */ + UInt32 *tt; + + /* for undoing the Burrows-Wheeler transform (SMALL) */ + UInt16 *ll16; + UChar *ll4; + + /* stored and calculated CRCs */ + UInt32 storedBlockCRC; + UInt32 storedCombinedCRC; + UInt32 calculatedBlockCRC; + UInt32 calculatedCombinedCRC; + + /* map of bytes used in block */ + Int32 nInUse; + Bool inUse[256]; + Bool inUse16[16]; + UChar seqToUnseq[256]; + + /* for decoding the MTF values */ + UChar mtfa [MTFA_SIZE]; + Int32 mtfbase[256 / MTFL_SIZE]; + UChar selector [BZ_MAX_SELECTORS]; + UChar selectorMtf[BZ_MAX_SELECTORS]; + UChar len [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; + + Int32 limit [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; + Int32 base [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; + Int32 perm [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; + Int32 minLens[BZ_N_GROUPS]; + + /* save area for scalars in the main decompress code */ + Int32 save_i; + Int32 save_j; + Int32 save_t; + Int32 save_alphaSize; + Int32 save_nGroups; + Int32 save_nSelectors; + Int32 save_EOB; + Int32 save_groupNo; + Int32 save_groupPos; + Int32 save_nextSym; + Int32 save_nblockMAX; + Int32 save_nblock; + Int32 save_es; + Int32 save_N; + Int32 save_curr; + Int32 save_zt; + Int32 save_zn; + Int32 save_zvec; + Int32 save_zj; + Int32 save_gSel; + Int32 save_gMinlen; + Int32* save_gLimit; + Int32* save_gBase; + Int32* save_gPerm; + + } + DState; + + + +/*-- Macros for decompression. --*/ + +#define BZ_GET_FAST(cccc) \ + /* c_tPos is unsigned, hence test < 0 is pointless. */ \ + if (s->tPos >= (UInt32)100000 * (UInt32)s->blockSize100k) return True; \ + s->tPos = s->tt[s->tPos]; \ + cccc = (UChar)(s->tPos & 0xff); \ + s->tPos >>= 8; + +#define BZ_GET_FAST_C(cccc) \ + /* c_tPos is unsigned, hence test < 0 is pointless. */ \ + if (c_tPos >= (UInt32)100000 * (UInt32)ro_blockSize100k) return True; \ + c_tPos = c_tt[c_tPos]; \ + cccc = (UChar)(c_tPos & 0xff); \ + c_tPos >>= 8; + +#define SET_LL4(i,n) \ + { if (((i) & 0x1) == 0) \ + s->ll4[(i) >> 1] = (s->ll4[(i) >> 1] & 0xf0) | (n); else \ + s->ll4[(i) >> 1] = (s->ll4[(i) >> 1] & 0x0f) | ((n) << 4); \ + } + +#define GET_LL4(i) \ + ((((UInt32)(s->ll4[(i) >> 1])) >> (((i) << 2) & 0x4)) & 0xF) + +#define SET_LL(i,n) \ + { s->ll16[i] = (UInt16)(n & 0x0000ffff); \ + SET_LL4(i, n >> 16); \ + } + +#define GET_LL(i) \ + (((UInt32)s->ll16[i]) | (GET_LL4(i) << 16)) + +#define BZ_GET_SMALL(cccc) \ + /* c_tPos is unsigned, hence test < 0 is pointless. */ \ + if (s->tPos >= (UInt32)100000 * (UInt32)s->blockSize100k) return True; \ + cccc = BZ2_indexIntoF ( s->tPos, s->cftab ); \ + s->tPos = GET_LL(s->tPos); + + +/*-- externs for decompression. --*/ + +extern Int32 +BZ2_indexIntoF ( Int32, Int32* ); + +extern Int32 +BZ2_decompress ( DState* ); + +extern void +BZ2_hbCreateDecodeTables ( Int32*, Int32*, Int32*, UChar*, + Int32, Int32, Int32 ); + + +#endif + + +/*-- BZ_NO_STDIO seems to make NULL disappear on some platforms. --*/ + +#ifdef BZ_NO_STDIO +#ifndef NULL +#define NULL 0 +#endif +#endif + + +/*-------------------------------------------------------------*/ +/*--- end bzlib_private.h ---*/ +/*-------------------------------------------------------------*/ diff --git a/xdl/third_party/tbb/examples/graph/fgbzip2/compress.cpp b/xdl/third_party/tbb/examples/graph/fgbzip2/compress.cpp new file mode 100644 index 00000000..46ab18a1 --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/fgbzip2/compress.cpp @@ -0,0 +1,724 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +/*-------------------------------------------------------------*/ +/*--- Compression machinery (not incl block sorting) ---*/ +/*--- compress.cpp ---*/ +/*-------------------------------------------------------------*/ + +/* ------------------------------------------------------------------ + The original source for this example: + This file is part of bzip2/libbzip2, a program and library for + lossless, block-sorting data compression. + + bzip2/libbzip2 version 1.0.6 of 6 September 2010 + Copyright (C) 1996-2010 Julian Seward + + This program, "bzip2", the associated library "libbzip2", and all + documentation, are copyright (C) 1996-2010 Julian R Seward. 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. The origin of this software must not be misrepresented; you must + not claim that you wrote the original software. If you use this + software in a product, an acknowledgment in the product + documentation would be appreciated but is not required. + + 3. Altered source versions must be plainly marked as such, and must + not be misrepresented as being the original software. + + 4. The name of the author may not be used to endorse or promote + products derived from this software without specific prior written + permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. + + Julian Seward, jseward@bzip.org + bzip2/libbzip2 version 1.0.6 of 6 September 2010 + ------------------------------------------------------------------ */ + + +/* CHANGES + 0.9.0 -- original version. + 0.9.0a/b -- no changes in this file. + 0.9.0c -- changed setting of nGroups in sendMTFValues() + so as to do a bit better on small files +*/ + +#include "bzlib_private.h" + + +/*---------------------------------------------------*/ +/*--- Bit stream I/O ---*/ +/*---------------------------------------------------*/ + +/*---------------------------------------------------*/ +void BZ2_bsInitWrite ( EState* s ) +{ + s->bsLive = 0; + s->bsBuff = 0; +} + + +/*---------------------------------------------------*/ +static +void bsFinishWrite ( EState* s ) +{ + while (s->bsLive > 0) { + s->zbits[s->numZ] = (UChar)(s->bsBuff >> 24); + s->numZ++; + s->bsBuff <<= 8; + s->bsLive -= 8; + } +} + + +/*---------------------------------------------------*/ +#define bsNEEDW(nz) \ +{ \ + while (s->bsLive >= 8) { \ + s->zbits[s->numZ] \ + = (UChar)(s->bsBuff >> 24); \ + s->numZ++; \ + s->bsBuff <<= 8; \ + s->bsLive -= 8; \ + } \ +} + + +/*---------------------------------------------------*/ +static +__inline__ +void bsW ( EState* s, Int32 n, UInt32 v ) +{ + bsNEEDW ( n ); + s->bsBuff |= (v << (32 - s->bsLive - n)); + s->bsLive += n; +} + + +/*---------------------------------------------------*/ +static +void bsPutUInt32 ( EState* s, UInt32 u ) +{ + bsW ( s, 8, (u >> 24) & 0xffL ); + bsW ( s, 8, (u >> 16) & 0xffL ); + bsW ( s, 8, (u >> 8) & 0xffL ); + bsW ( s, 8, u & 0xffL ); +} + + +/*---------------------------------------------------*/ +static +void bsPutUChar ( EState* s, UChar c ) +{ + bsW( s, 8, (UInt32)c ); +} + + +/*---------------------------------------------------*/ +/*--- The back end proper ---*/ +/*---------------------------------------------------*/ + +/*---------------------------------------------------*/ +static +void makeMaps_e ( EState* s ) +{ + Int32 i; + s->nInUse = 0; + for (i = 0; i < 256; i++) + if (s->inUse[i]) { + s->unseqToSeq[i] = s->nInUse; + s->nInUse++; + } +} + + +/*---------------------------------------------------*/ +static +void generateMTFValues ( EState* s ) +{ + UChar yy[256]; + Int32 i, j; + Int32 zPend; + Int32 wr; + Int32 EOB; + + /* + After sorting (eg, here), + s->arr1 [ 0 .. s->nblock-1 ] holds sorted order, + and + ((UChar*)s->arr2) [ 0 .. s->nblock-1 ] + holds the original block data. + + The first thing to do is generate the MTF values, + and put them in + ((UInt16*)s->arr1) [ 0 .. s->nblock-1 ]. + Because there are strictly fewer or equal MTF values + than block values, ptr values in this area are overwritten + with MTF values only when they are no longer needed. + + The final compressed bitstream is generated into the + area starting at + (UChar*) (&((UChar*)s->arr2)[s->nblock]) + + These storage aliases are set up in bzCompressInit(), + except for the last one, which is arranged in + compressBlock(). + */ + UInt32* ptr = s->ptr; + UChar* block = s->block; + UInt16* mtfv = s->mtfv; + + makeMaps_e ( s ); + EOB = s->nInUse+1; + + for (i = 0; i <= EOB; i++) s->mtfFreq[i] = 0; + + wr = 0; + zPend = 0; + for (i = 0; i < s->nInUse; i++) yy[i] = (UChar) i; + + for (i = 0; i < s->nblock; i++) { + UChar ll_i; + AssertD ( wr <= i, "generateMTFValues(1)" ); + j = ptr[i]-1; if (j < 0) j += s->nblock; + ll_i = s->unseqToSeq[block[j]]; + AssertD ( ll_i < s->nInUse, "generateMTFValues(2a)" ); + + if (yy[0] == ll_i) { + zPend++; + } else { + + if (zPend > 0) { + zPend--; + while (True) { + if (zPend & 1) { + mtfv[wr] = BZ_RUNB; wr++; + s->mtfFreq[BZ_RUNB]++; + } else { + mtfv[wr] = BZ_RUNA; wr++; + s->mtfFreq[BZ_RUNA]++; + } + if (zPend < 2) break; + zPend = (zPend - 2) / 2; + }; + zPend = 0; + } + { + UChar rtmp; + UChar* ryy_j; + UChar rll_i; + rtmp = yy[1]; + yy[1] = yy[0]; + ryy_j = &(yy[1]); + rll_i = ll_i; + while ( rll_i != rtmp ) { + UChar rtmp2; + ryy_j++; + rtmp2 = rtmp; + rtmp = *ryy_j; + *ryy_j = rtmp2; + }; + yy[0] = rtmp; + j = ryy_j - &(yy[0]); + mtfv[wr] = j+1; wr++; s->mtfFreq[j+1]++; + } + + } + } + + if (zPend > 0) { + zPend--; + while (True) { + if (zPend & 1) { + mtfv[wr] = BZ_RUNB; wr++; + s->mtfFreq[BZ_RUNB]++; + } else { + mtfv[wr] = BZ_RUNA; wr++; + s->mtfFreq[BZ_RUNA]++; + } + if (zPend < 2) break; + zPend = (zPend - 2) / 2; + }; + zPend = 0; + } + + mtfv[wr] = EOB; wr++; s->mtfFreq[EOB]++; + + s->nMTF = wr; +} + + +/*---------------------------------------------------*/ +#define BZ_LESSER_ICOST 0 +#define BZ_GREATER_ICOST 15 + +static +void sendMTFValues ( EState* s ) +{ + Int32 v, t, i, j, gs, ge, totc, bt, bc, iter; + Int32 nSelectors, alphaSize, minLen, maxLen, selCtr; + Int32 nGroups, nBytes; + + /*-- + UChar len [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; + is a global since the decoder also needs it. + + Int32 code[BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; + Int32 rfreq[BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; + are also globals only used in this proc. + Made global to keep stack frame size small. + --*/ + + + UInt16 cost[BZ_N_GROUPS]; + Int32 fave[BZ_N_GROUPS]; + + UInt16* mtfv = s->mtfv; + + if (s->verbosity >= 3) + VPrintf3( " %d in block, %d after MTF & 1-2 coding, " + "%d+2 syms in use\n", + s->nblock, s->nMTF, s->nInUse ); + + alphaSize = s->nInUse+2; + for (t = 0; t < BZ_N_GROUPS; t++) + for (v = 0; v < alphaSize; v++) + s->len[t][v] = BZ_GREATER_ICOST; + + /*--- Decide how many coding tables to use ---*/ + AssertH ( s->nMTF > 0, 3001 ); + if (s->nMTF < 200) nGroups = 2; else + if (s->nMTF < 600) nGroups = 3; else + if (s->nMTF < 1200) nGroups = 4; else + if (s->nMTF < 2400) nGroups = 5; else + nGroups = 6; + + /*--- Generate an initial set of coding tables ---*/ + { + Int32 nPart, remF, tFreq, aFreq; + + nPart = nGroups; + remF = s->nMTF; + gs = 0; + while (nPart > 0) { + tFreq = remF / nPart; + ge = gs-1; + aFreq = 0; + while (aFreq < tFreq && ge < alphaSize-1) { + ge++; + aFreq += s->mtfFreq[ge]; + } + + if (ge > gs + && nPart != nGroups && nPart != 1 + && ((nGroups-nPart) % 2 == 1)) { + aFreq -= s->mtfFreq[ge]; + ge--; + } + + if (s->verbosity >= 3) + VPrintf5( " initial group %d, [%d .. %d], " + "has %d syms (%4.1f%%)\n", + nPart, gs, ge, aFreq, + (100.0 * (float)aFreq) / (float)(s->nMTF) ); + + for (v = 0; v < alphaSize; v++) + if (v >= gs && v <= ge) + s->len[nPart-1][v] = BZ_LESSER_ICOST; else + s->len[nPart-1][v] = BZ_GREATER_ICOST; + + nPart--; + gs = ge+1; + remF -= aFreq; + } + } + + /*--- + Iterate up to BZ_N_ITERS times to improve the tables. + ---*/ + for (iter = 0; iter < BZ_N_ITERS; iter++) { + + for (t = 0; t < nGroups; t++) fave[t] = 0; + + for (t = 0; t < nGroups; t++) + for (v = 0; v < alphaSize; v++) + s->rfreq[t][v] = 0; + + /*--- + Set up an auxiliary length table which is used to fast-track + the common case (nGroups == 6). + ---*/ + if (nGroups == 6) { + for (v = 0; v < alphaSize; v++) { + s->len_pack[v][0] = (s->len[1][v] << 16) | s->len[0][v]; + s->len_pack[v][1] = (s->len[3][v] << 16) | s->len[2][v]; + s->len_pack[v][2] = (s->len[5][v] << 16) | s->len[4][v]; + } + } + + nSelectors = 0; + totc = 0; + gs = 0; + while (True) { + + /*--- Set group start & end marks. --*/ + if (gs >= s->nMTF) break; + ge = gs + BZ_G_SIZE - 1; + if (ge >= s->nMTF) ge = s->nMTF-1; + + /*-- + Calculate the cost of this group as coded + by each of the coding tables. + --*/ + for (t = 0; t < nGroups; t++) cost[t] = 0; + + if (nGroups == 6 && 50 == ge-gs+1) { + /*--- fast track the common case ---*/ + UInt32 cost01, cost23, cost45; + UInt16 icv; + cost01 = cost23 = cost45 = 0; + +# define BZ_ITER(nn) \ + icv = mtfv[gs+(nn)]; \ + cost01 += s->len_pack[icv][0]; \ + cost23 += s->len_pack[icv][1]; \ + cost45 += s->len_pack[icv][2]; \ + + BZ_ITER(0); BZ_ITER(1); BZ_ITER(2); BZ_ITER(3); BZ_ITER(4); + BZ_ITER(5); BZ_ITER(6); BZ_ITER(7); BZ_ITER(8); BZ_ITER(9); + BZ_ITER(10); BZ_ITER(11); BZ_ITER(12); BZ_ITER(13); BZ_ITER(14); + BZ_ITER(15); BZ_ITER(16); BZ_ITER(17); BZ_ITER(18); BZ_ITER(19); + BZ_ITER(20); BZ_ITER(21); BZ_ITER(22); BZ_ITER(23); BZ_ITER(24); + BZ_ITER(25); BZ_ITER(26); BZ_ITER(27); BZ_ITER(28); BZ_ITER(29); + BZ_ITER(30); BZ_ITER(31); BZ_ITER(32); BZ_ITER(33); BZ_ITER(34); + BZ_ITER(35); BZ_ITER(36); BZ_ITER(37); BZ_ITER(38); BZ_ITER(39); + BZ_ITER(40); BZ_ITER(41); BZ_ITER(42); BZ_ITER(43); BZ_ITER(44); + BZ_ITER(45); BZ_ITER(46); BZ_ITER(47); BZ_ITER(48); BZ_ITER(49); + +# undef BZ_ITER + + cost[0] = cost01 & 0xffff; cost[1] = cost01 >> 16; + cost[2] = cost23 & 0xffff; cost[3] = cost23 >> 16; + cost[4] = cost45 & 0xffff; cost[5] = cost45 >> 16; + + } else { + /*--- slow version which correctly handles all situations ---*/ + for (i = gs; i <= ge; i++) { + UInt16 icv = mtfv[i]; + for (t = 0; t < nGroups; t++) cost[t] += s->len[t][icv]; + } + } + + /*-- + Find the coding table which is best for this group, + and record its identity in the selector table. + --*/ + bc = 999999999; bt = -1; + for (t = 0; t < nGroups; t++) + if (cost[t] < bc) { bc = cost[t]; bt = t; }; + totc += bc; + fave[bt]++; + s->selector[nSelectors] = bt; + nSelectors++; + + /*-- + Increment the symbol frequencies for the selected table. + --*/ + if (nGroups == 6 && 50 == ge-gs+1) { + /*--- fast track the common case ---*/ + +# define BZ_ITUR(nn) s->rfreq[bt][ mtfv[gs+(nn)] ]++ + + BZ_ITUR(0); BZ_ITUR(1); BZ_ITUR(2); BZ_ITUR(3); BZ_ITUR(4); + BZ_ITUR(5); BZ_ITUR(6); BZ_ITUR(7); BZ_ITUR(8); BZ_ITUR(9); + BZ_ITUR(10); BZ_ITUR(11); BZ_ITUR(12); BZ_ITUR(13); BZ_ITUR(14); + BZ_ITUR(15); BZ_ITUR(16); BZ_ITUR(17); BZ_ITUR(18); BZ_ITUR(19); + BZ_ITUR(20); BZ_ITUR(21); BZ_ITUR(22); BZ_ITUR(23); BZ_ITUR(24); + BZ_ITUR(25); BZ_ITUR(26); BZ_ITUR(27); BZ_ITUR(28); BZ_ITUR(29); + BZ_ITUR(30); BZ_ITUR(31); BZ_ITUR(32); BZ_ITUR(33); BZ_ITUR(34); + BZ_ITUR(35); BZ_ITUR(36); BZ_ITUR(37); BZ_ITUR(38); BZ_ITUR(39); + BZ_ITUR(40); BZ_ITUR(41); BZ_ITUR(42); BZ_ITUR(43); BZ_ITUR(44); + BZ_ITUR(45); BZ_ITUR(46); BZ_ITUR(47); BZ_ITUR(48); BZ_ITUR(49); + +# undef BZ_ITUR + + } else { + /*--- slow version which correctly handles all situations ---*/ + for (i = gs; i <= ge; i++) + s->rfreq[bt][ mtfv[i] ]++; + } + + gs = ge+1; + } + if (s->verbosity >= 3) { + VPrintf2 ( " pass %d: size is %d, grp uses are ", + iter+1, totc/8 ); + for (t = 0; t < nGroups; t++) + VPrintf1 ( "%d ", fave[t] ); + VPrintf0 ( "\n" ); + } + + /*-- + Recompute the tables based on the accumulated frequencies. + --*/ + /* maxLen was changed from 20 to 17 in bzip2-1.0.3. See + comment in huffman.c for details. */ + for (t = 0; t < nGroups; t++) + BZ2_hbMakeCodeLengths ( &(s->len[t][0]), &(s->rfreq[t][0]), + alphaSize, 17 /*20*/ ); + } + + + AssertH( nGroups < 8, 3002 ); + AssertH( nSelectors < 32768 && + nSelectors <= (2 + (900000 / BZ_G_SIZE)), + 3003 ); + + + /*--- Compute MTF values for the selectors. ---*/ + { + UChar pos[BZ_N_GROUPS], ll_i, tmp2, tmp; + for (i = 0; i < nGroups; i++) pos[i] = i; + for (i = 0; i < nSelectors; i++) { + ll_i = s->selector[i]; + j = 0; + tmp = pos[j]; + while ( ll_i != tmp ) { + j++; + tmp2 = tmp; + tmp = pos[j]; + pos[j] = tmp2; + }; + pos[0] = tmp; + s->selectorMtf[i] = j; + } + }; + + /*--- Assign actual codes for the tables. --*/ + for (t = 0; t < nGroups; t++) { + minLen = 32; + maxLen = 0; + for (i = 0; i < alphaSize; i++) { + if (s->len[t][i] > maxLen) maxLen = s->len[t][i]; + if (s->len[t][i] < minLen) minLen = s->len[t][i]; + } + AssertH ( !(maxLen > 17 /*20*/ ), 3004 ); + AssertH ( !(minLen < 1), 3005 ); + BZ2_hbAssignCodes ( &(s->code[t][0]), &(s->len[t][0]), + minLen, maxLen, alphaSize ); + } + + /*--- Transmit the mapping table. ---*/ + { + Bool inUse16[16]; + for (i = 0; i < 16; i++) { + inUse16[i] = False; + for (j = 0; j < 16; j++) + if (s->inUse[i * 16 + j]) inUse16[i] = True; + } + + nBytes = s->numZ; + for (i = 0; i < 16; i++) + if (inUse16[i]) bsW(s,1,1); else bsW(s,1,0); + + for (i = 0; i < 16; i++) + if (inUse16[i]) + for (j = 0; j < 16; j++) { + if (s->inUse[i * 16 + j]) bsW(s,1,1); else bsW(s,1,0); + } + + if (s->verbosity >= 3) + VPrintf1( " bytes: mapping %d, ", s->numZ-nBytes ); + } + + /*--- Now the selectors. ---*/ + nBytes = s->numZ; + bsW ( s, 3, nGroups ); + bsW ( s, 15, nSelectors ); + for (i = 0; i < nSelectors; i++) { + for (j = 0; j < s->selectorMtf[i]; j++) bsW(s,1,1); + bsW(s,1,0); + } + if (s->verbosity >= 3) + VPrintf1( "selectors %d, ", s->numZ-nBytes ); + + /*--- Now the coding tables. ---*/ + nBytes = s->numZ; + + for (t = 0; t < nGroups; t++) { + Int32 curr = s->len[t][0]; + bsW ( s, 5, curr ); + for (i = 0; i < alphaSize; i++) { + while (curr < s->len[t][i]) { bsW(s,2,2); curr++; /* 10 */ }; + while (curr > s->len[t][i]) { bsW(s,2,3); curr--; /* 11 */ }; + bsW ( s, 1, 0 ); + } + } + + if (s->verbosity >= 3) + VPrintf1 ( "code lengths %d, ", s->numZ-nBytes ); + + /*--- And finally, the block data proper ---*/ + nBytes = s->numZ; + selCtr = 0; + gs = 0; + while (True) { + if (gs >= s->nMTF) break; + ge = gs + BZ_G_SIZE - 1; + if (ge >= s->nMTF) ge = s->nMTF-1; + AssertH ( s->selector[selCtr] < nGroups, 3006 ); + + if (nGroups == 6 && 50 == ge-gs+1) { + /*--- fast track the common case ---*/ + UInt16 mtfv_i; + UChar* s_len_sel_selCtr + = &(s->len[s->selector[selCtr]][0]); + Int32* s_code_sel_selCtr + = &(s->code[s->selector[selCtr]][0]); + +# define BZ_ITAH(nn) \ + mtfv_i = mtfv[gs+(nn)]; \ + bsW ( s, \ + s_len_sel_selCtr[mtfv_i], \ + s_code_sel_selCtr[mtfv_i] ) + + BZ_ITAH(0); BZ_ITAH(1); BZ_ITAH(2); BZ_ITAH(3); BZ_ITAH(4); + BZ_ITAH(5); BZ_ITAH(6); BZ_ITAH(7); BZ_ITAH(8); BZ_ITAH(9); + BZ_ITAH(10); BZ_ITAH(11); BZ_ITAH(12); BZ_ITAH(13); BZ_ITAH(14); + BZ_ITAH(15); BZ_ITAH(16); BZ_ITAH(17); BZ_ITAH(18); BZ_ITAH(19); + BZ_ITAH(20); BZ_ITAH(21); BZ_ITAH(22); BZ_ITAH(23); BZ_ITAH(24); + BZ_ITAH(25); BZ_ITAH(26); BZ_ITAH(27); BZ_ITAH(28); BZ_ITAH(29); + BZ_ITAH(30); BZ_ITAH(31); BZ_ITAH(32); BZ_ITAH(33); BZ_ITAH(34); + BZ_ITAH(35); BZ_ITAH(36); BZ_ITAH(37); BZ_ITAH(38); BZ_ITAH(39); + BZ_ITAH(40); BZ_ITAH(41); BZ_ITAH(42); BZ_ITAH(43); BZ_ITAH(44); + BZ_ITAH(45); BZ_ITAH(46); BZ_ITAH(47); BZ_ITAH(48); BZ_ITAH(49); + +# undef BZ_ITAH + + } else { + /*--- slow version which correctly handles all situations ---*/ + for (i = gs; i <= ge; i++) { + bsW ( s, + s->len [s->selector[selCtr]] [mtfv[i]], + s->code [s->selector[selCtr]] [mtfv[i]] ); + } + } + + + gs = ge+1; + selCtr++; + } + AssertH( selCtr == nSelectors, 3007 ); + + if (s->verbosity >= 3) + VPrintf1( "codes %d\n", s->numZ-nBytes ); +} + + +/*---------------------------------------------------*/ +void BZ2_compressBlock ( EState* s, Bool is_last_block ) +{ + if (s->nblock > 0) { + + BZ_FINALISE_CRC ( s->blockCRC ); + s->combinedCRC = (s->combinedCRC << 1) | (s->combinedCRC >> 31); + s->combinedCRC ^= s->blockCRC; + if (s->blockNo > 1) s->numZ = 0; + + if (s->verbosity >= 2) + VPrintf4( " block %d: crc = 0x%08x, " + "combined CRC = 0x%08x, size = %d\n", + s->blockNo, s->blockCRC, s->combinedCRC, s->nblock ); + + BZ2_blockSort ( s ); + } + + s->zbits = (UChar*) (&((UChar*)s->arr2)[s->nblock]); + + /*-- If this is the first block, create the stream header. --*/ + if (s->blockNo == 1) { + BZ2_bsInitWrite ( s ); + bsPutUChar ( s, BZ_HDR_B ); + bsPutUChar ( s, BZ_HDR_Z ); + bsPutUChar ( s, BZ_HDR_h ); + bsPutUChar ( s, (UChar)(BZ_HDR_0 + s->blockSize100k) ); + } + + if (s->nblock > 0) { + + bsPutUChar ( s, 0x31 ); bsPutUChar ( s, 0x41 ); + bsPutUChar ( s, 0x59 ); bsPutUChar ( s, 0x26 ); + bsPutUChar ( s, 0x53 ); bsPutUChar ( s, 0x59 ); + + /*-- Now the block's CRC, so it is in a known place. --*/ + bsPutUInt32 ( s, s->blockCRC ); + + /*-- + Now a single bit indicating (non-)randomisation. + As of version 0.9.5, we use a better sorting algorithm + which makes randomisation unnecessary. So always set + the randomised bit to 'no'. Of course, the decoder + still needs to be able to handle randomised blocks + so as to maintain backwards compatibility with + older versions of bzip2. + --*/ + bsW(s,1,0); + + bsW ( s, 24, s->origPtr ); + generateMTFValues ( s ); + sendMTFValues ( s ); + } + + + /*-- If this is the last block, add the stream trailer. --*/ + if (is_last_block) { + + bsPutUChar ( s, 0x17 ); bsPutUChar ( s, 0x72 ); + bsPutUChar ( s, 0x45 ); bsPutUChar ( s, 0x38 ); + bsPutUChar ( s, 0x50 ); bsPutUChar ( s, 0x90 ); + bsPutUInt32 ( s, s->combinedCRC ); + if (s->verbosity >= 2) + VPrintf1( " final combined CRC = 0x%08x\n ", s->combinedCRC ); + bsFinishWrite ( s ); + } +} + + +/*-------------------------------------------------------------*/ +/*--- end compress.c ---*/ +/*-------------------------------------------------------------*/ diff --git a/xdl/third_party/tbb/examples/graph/fgbzip2/crctable.cpp b/xdl/third_party/tbb/examples/graph/fgbzip2/crctable.cpp new file mode 100644 index 00000000..a64504f5 --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/fgbzip2/crctable.cpp @@ -0,0 +1,156 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +/*-------------------------------------------------------------*/ +/*--- Table for doing CRCs ---*/ +/*--- crctable.cpp ---*/ +/*-------------------------------------------------------------*/ + +/* ------------------------------------------------------------------ + The original source for this example: + This file is part of bzip2/libbzip2, a program and library for + lossless, block-sorting data compression. + + bzip2/libbzip2 version 1.0.6 of 6 September 2010 + Copyright (C) 1996-2010 Julian Seward + + This program, "bzip2", the associated library "libbzip2", and all + documentation, are copyright (C) 1996-2010 Julian R Seward. 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. The origin of this software must not be misrepresented; you must + not claim that you wrote the original software. If you use this + software in a product, an acknowledgment in the product + documentation would be appreciated but is not required. + + 3. Altered source versions must be plainly marked as such, and must + not be misrepresented as being the original software. + + 4. The name of the author may not be used to endorse or promote + products derived from this software without specific prior written + permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. + + Julian Seward, jseward@bzip.org + bzip2/libbzip2 version 1.0.6 of 6 September 2010 + ------------------------------------------------------------------ */ + + +#include "bzlib_private.h" + +/*-- + I think this is an implementation of the AUTODIN-II, + Ethernet & FDDI 32-bit CRC standard. Vaguely derived + from code by Rob Warnock, in Section 51 of the + comp.compression FAQ. +--*/ + +UInt32 BZ2_crc32Table[256] = { + + /*-- Ugly, innit? --*/ + + 0x00000000L, 0x04c11db7L, 0x09823b6eL, 0x0d4326d9L, + 0x130476dcL, 0x17c56b6bL, 0x1a864db2L, 0x1e475005L, + 0x2608edb8L, 0x22c9f00fL, 0x2f8ad6d6L, 0x2b4bcb61L, + 0x350c9b64L, 0x31cd86d3L, 0x3c8ea00aL, 0x384fbdbdL, + 0x4c11db70L, 0x48d0c6c7L, 0x4593e01eL, 0x4152fda9L, + 0x5f15adacL, 0x5bd4b01bL, 0x569796c2L, 0x52568b75L, + 0x6a1936c8L, 0x6ed82b7fL, 0x639b0da6L, 0x675a1011L, + 0x791d4014L, 0x7ddc5da3L, 0x709f7b7aL, 0x745e66cdL, + 0x9823b6e0L, 0x9ce2ab57L, 0x91a18d8eL, 0x95609039L, + 0x8b27c03cL, 0x8fe6dd8bL, 0x82a5fb52L, 0x8664e6e5L, + 0xbe2b5b58L, 0xbaea46efL, 0xb7a96036L, 0xb3687d81L, + 0xad2f2d84L, 0xa9ee3033L, 0xa4ad16eaL, 0xa06c0b5dL, + 0xd4326d90L, 0xd0f37027L, 0xddb056feL, 0xd9714b49L, + 0xc7361b4cL, 0xc3f706fbL, 0xceb42022L, 0xca753d95L, + 0xf23a8028L, 0xf6fb9d9fL, 0xfbb8bb46L, 0xff79a6f1L, + 0xe13ef6f4L, 0xe5ffeb43L, 0xe8bccd9aL, 0xec7dd02dL, + 0x34867077L, 0x30476dc0L, 0x3d044b19L, 0x39c556aeL, + 0x278206abL, 0x23431b1cL, 0x2e003dc5L, 0x2ac12072L, + 0x128e9dcfL, 0x164f8078L, 0x1b0ca6a1L, 0x1fcdbb16L, + 0x018aeb13L, 0x054bf6a4L, 0x0808d07dL, 0x0cc9cdcaL, + 0x7897ab07L, 0x7c56b6b0L, 0x71159069L, 0x75d48ddeL, + 0x6b93dddbL, 0x6f52c06cL, 0x6211e6b5L, 0x66d0fb02L, + 0x5e9f46bfL, 0x5a5e5b08L, 0x571d7dd1L, 0x53dc6066L, + 0x4d9b3063L, 0x495a2dd4L, 0x44190b0dL, 0x40d816baL, + 0xaca5c697L, 0xa864db20L, 0xa527fdf9L, 0xa1e6e04eL, + 0xbfa1b04bL, 0xbb60adfcL, 0xb6238b25L, 0xb2e29692L, + 0x8aad2b2fL, 0x8e6c3698L, 0x832f1041L, 0x87ee0df6L, + 0x99a95df3L, 0x9d684044L, 0x902b669dL, 0x94ea7b2aL, + 0xe0b41de7L, 0xe4750050L, 0xe9362689L, 0xedf73b3eL, + 0xf3b06b3bL, 0xf771768cL, 0xfa325055L, 0xfef34de2L, + 0xc6bcf05fL, 0xc27dede8L, 0xcf3ecb31L, 0xcbffd686L, + 0xd5b88683L, 0xd1799b34L, 0xdc3abdedL, 0xd8fba05aL, + 0x690ce0eeL, 0x6dcdfd59L, 0x608edb80L, 0x644fc637L, + 0x7a089632L, 0x7ec98b85L, 0x738aad5cL, 0x774bb0ebL, + 0x4f040d56L, 0x4bc510e1L, 0x46863638L, 0x42472b8fL, + 0x5c007b8aL, 0x58c1663dL, 0x558240e4L, 0x51435d53L, + 0x251d3b9eL, 0x21dc2629L, 0x2c9f00f0L, 0x285e1d47L, + 0x36194d42L, 0x32d850f5L, 0x3f9b762cL, 0x3b5a6b9bL, + 0x0315d626L, 0x07d4cb91L, 0x0a97ed48L, 0x0e56f0ffL, + 0x1011a0faL, 0x14d0bd4dL, 0x19939b94L, 0x1d528623L, + 0xf12f560eL, 0xf5ee4bb9L, 0xf8ad6d60L, 0xfc6c70d7L, + 0xe22b20d2L, 0xe6ea3d65L, 0xeba91bbcL, 0xef68060bL, + 0xd727bbb6L, 0xd3e6a601L, 0xdea580d8L, 0xda649d6fL, + 0xc423cd6aL, 0xc0e2d0ddL, 0xcda1f604L, 0xc960ebb3L, + 0xbd3e8d7eL, 0xb9ff90c9L, 0xb4bcb610L, 0xb07daba7L, + 0xae3afba2L, 0xaafbe615L, 0xa7b8c0ccL, 0xa379dd7bL, + 0x9b3660c6L, 0x9ff77d71L, 0x92b45ba8L, 0x9675461fL, + 0x8832161aL, 0x8cf30badL, 0x81b02d74L, 0x857130c3L, + 0x5d8a9099L, 0x594b8d2eL, 0x5408abf7L, 0x50c9b640L, + 0x4e8ee645L, 0x4a4ffbf2L, 0x470cdd2bL, 0x43cdc09cL, + 0x7b827d21L, 0x7f436096L, 0x7200464fL, 0x76c15bf8L, + 0x68860bfdL, 0x6c47164aL, 0x61043093L, 0x65c52d24L, + 0x119b4be9L, 0x155a565eL, 0x18197087L, 0x1cd86d30L, + 0x029f3d35L, 0x065e2082L, 0x0b1d065bL, 0x0fdc1becL, + 0x3793a651L, 0x3352bbe6L, 0x3e119d3fL, 0x3ad08088L, + 0x2497d08dL, 0x2056cd3aL, 0x2d15ebe3L, 0x29d4f654L, + 0xc5a92679L, 0xc1683bceL, 0xcc2b1d17L, 0xc8ea00a0L, + 0xd6ad50a5L, 0xd26c4d12L, 0xdf2f6bcbL, 0xdbee767cL, + 0xe3a1cbc1L, 0xe760d676L, 0xea23f0afL, 0xeee2ed18L, + 0xf0a5bd1dL, 0xf464a0aaL, 0xf9278673L, 0xfde69bc4L, + 0x89b8fd09L, 0x8d79e0beL, 0x803ac667L, 0x84fbdbd0L, + 0x9abc8bd5L, 0x9e7d9662L, 0x933eb0bbL, 0x97ffad0cL, + 0xafb010b1L, 0xab710d06L, 0xa6322bdfL, 0xa2f33668L, + 0xbcb4666dL, 0xb8757bdaL, 0xb5365d03L, 0xb1f740b4L +}; + + +/*-------------------------------------------------------------*/ +/*--- end crctable.c ---*/ +/*-------------------------------------------------------------*/ diff --git a/xdl/third_party/tbb/examples/graph/fgbzip2/decompress.cpp b/xdl/third_party/tbb/examples/graph/fgbzip2/decompress.cpp new file mode 100644 index 00000000..85b0a14a --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/fgbzip2/decompress.cpp @@ -0,0 +1,698 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +/*-------------------------------------------------------------*/ +/*--- Decompression machinery ---*/ +/*--- decompress.cpp ---*/ +/*-------------------------------------------------------------*/ + +/* ------------------------------------------------------------------ + The original source for this example: + This file is part of bzip2/libbzip2, a program and library for + lossless, block-sorting data compression. + + bzip2/libbzip2 version 1.0.6 of 6 September 2010 + Copyright (C) 1996-2010 Julian Seward + + This program, "bzip2", the associated library "libbzip2", and all + documentation, are copyright (C) 1996-2010 Julian R Seward. 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. The origin of this software must not be misrepresented; you must + not claim that you wrote the original software. If you use this + software in a product, an acknowledgment in the product + documentation would be appreciated but is not required. + + 3. Altered source versions must be plainly marked as such, and must + not be misrepresented as being the original software. + + 4. The name of the author may not be used to endorse or promote + products derived from this software without specific prior written + permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. + + Julian Seward, jseward@bzip.org + bzip2/libbzip2 version 1.0.6 of 6 September 2010 + ------------------------------------------------------------------ */ + + +#include "bzlib_private.h" + + +/*---------------------------------------------------*/ +static +void makeMaps_d ( DState* s ) +{ + Int32 i; + s->nInUse = 0; + for (i = 0; i < 256; i++) + if (s->inUse[i]) { + s->seqToUnseq[s->nInUse] = i; + s->nInUse++; + } +} + + +/*---------------------------------------------------*/ +#define RETURN(rrr) \ + { retVal = rrr; goto save_state_and_return; }; + +#define GET_BITS(lll,vvv,nnn) \ + case lll: s->state = lll; \ + while (True) { \ + if (s->bsLive >= nnn) { \ + UInt32 v; \ + v = (s->bsBuff >> \ + (s->bsLive-nnn)) & ((1 << nnn)-1); \ + s->bsLive -= nnn; \ + vvv = v; \ + break; \ + } \ + if (s->strm->avail_in == 0) RETURN(BZ_OK); \ + s->bsBuff \ + = (s->bsBuff << 8) | \ + ((UInt32) \ + (*((UChar*)(s->strm->next_in)))); \ + s->bsLive += 8; \ + s->strm->next_in++; \ + s->strm->avail_in--; \ + s->strm->total_in_lo32++; \ + if (s->strm->total_in_lo32 == 0) \ + s->strm->total_in_hi32++; \ + } + +#define GET_UCHAR(lll,uuu) \ + GET_BITS(lll,uuu,8) + +#define GET_BIT(lll,uuu) \ + GET_BITS(lll,uuu,1) + +/*---------------------------------------------------*/ +#define GET_MTF_VAL(label1,label2,lval) \ +{ \ + if (groupPos == 0) { \ + groupNo++; \ + if (groupNo >= nSelectors) \ + RETURN(BZ_DATA_ERROR); \ + groupPos = BZ_G_SIZE; \ + gSel = s->selector[groupNo]; \ + gMinlen = s->minLens[gSel]; \ + gLimit = &(s->limit[gSel][0]); \ + gPerm = &(s->perm[gSel][0]); \ + gBase = &(s->base[gSel][0]); \ + } \ + groupPos--; \ + zn = gMinlen; \ + GET_BITS(label1, zvec, zn); \ + while (1) { \ + if (zn > 20 /* the longest code */) \ + RETURN(BZ_DATA_ERROR); \ + if (zvec <= gLimit[zn]) break; \ + zn++; \ + GET_BIT(label2, zj); \ + zvec = (zvec << 1) | zj; \ + }; \ + if (zvec - gBase[zn] < 0 \ + || zvec - gBase[zn] >= BZ_MAX_ALPHA_SIZE) \ + RETURN(BZ_DATA_ERROR); \ + lval = gPerm[zvec - gBase[zn]]; \ +} + + +/*---------------------------------------------------*/ +Int32 BZ2_decompress ( DState* s ) +{ + UChar uc; + Int32 retVal; + Int32 minLen, maxLen; + bz_stream* strm = s->strm; + + /* stuff that needs to be saved/restored */ + Int32 i; + Int32 j; + Int32 t; + Int32 alphaSize; + Int32 nGroups; + Int32 nSelectors; + Int32 EOB; + Int32 groupNo; + Int32 groupPos; + Int32 nextSym; + Int32 nblockMAX; + Int32 nblock; + Int32 es; + Int32 N; + Int32 curr; + Int32 zt; + Int32 zn; + Int32 zvec; + Int32 zj; + Int32 gSel; + Int32 gMinlen; + Int32* gLimit; + Int32* gBase; + Int32* gPerm; + + if (s->state == BZ_X_MAGIC_1) { + /*initialise the save area*/ + s->save_i = 0; + s->save_j = 0; + s->save_t = 0; + s->save_alphaSize = 0; + s->save_nGroups = 0; + s->save_nSelectors = 0; + s->save_EOB = 0; + s->save_groupNo = 0; + s->save_groupPos = 0; + s->save_nextSym = 0; + s->save_nblockMAX = 0; + s->save_nblock = 0; + s->save_es = 0; + s->save_N = 0; + s->save_curr = 0; + s->save_zt = 0; + s->save_zn = 0; + s->save_zvec = 0; + s->save_zj = 0; + s->save_gSel = 0; + s->save_gMinlen = 0; + s->save_gLimit = NULL; + s->save_gBase = NULL; + s->save_gPerm = NULL; + } + + /*restore from the save area*/ + i = s->save_i; + j = s->save_j; + t = s->save_t; + alphaSize = s->save_alphaSize; + nGroups = s->save_nGroups; + nSelectors = s->save_nSelectors; + EOB = s->save_EOB; + groupNo = s->save_groupNo; + groupPos = s->save_groupPos; + nextSym = s->save_nextSym; + nblockMAX = s->save_nblockMAX; + nblock = s->save_nblock; + es = s->save_es; + N = s->save_N; + curr = s->save_curr; + zt = s->save_zt; + zn = s->save_zn; + zvec = s->save_zvec; + zj = s->save_zj; + gSel = s->save_gSel; + gMinlen = s->save_gMinlen; + gLimit = s->save_gLimit; + gBase = s->save_gBase; + gPerm = s->save_gPerm; + + retVal = BZ_OK; + + switch (s->state) { + + GET_UCHAR(BZ_X_MAGIC_1, uc); + if (uc != BZ_HDR_B) RETURN(BZ_DATA_ERROR_MAGIC); + + GET_UCHAR(BZ_X_MAGIC_2, uc); + if (uc != BZ_HDR_Z) RETURN(BZ_DATA_ERROR_MAGIC); + + GET_UCHAR(BZ_X_MAGIC_3, uc) + if (uc != BZ_HDR_h) RETURN(BZ_DATA_ERROR_MAGIC); + + GET_BITS(BZ_X_MAGIC_4, s->blockSize100k, 8) + if (s->blockSize100k < (BZ_HDR_0 + 1) || + s->blockSize100k > (BZ_HDR_0 + 9)) RETURN(BZ_DATA_ERROR_MAGIC); + s->blockSize100k -= BZ_HDR_0; + + if (s->smallDecompress) { + s->ll16 = (UInt16*)BZALLOC( s->blockSize100k * 100000 * sizeof(UInt16) ); + s->ll4 = (UChar*)BZALLOC( + ((1 + s->blockSize100k * 100000) >> 1) * sizeof(UChar) + ); + if (s->ll16 == NULL || s->ll4 == NULL) RETURN(BZ_MEM_ERROR); + } else { + s->tt = (UInt32*)BZALLOC( s->blockSize100k * 100000 * sizeof(Int32) ); + if (s->tt == NULL) RETURN(BZ_MEM_ERROR); + } + + GET_UCHAR(BZ_X_BLKHDR_1, uc); + + if (uc == 0x17) goto endhdr_2; + if (uc != 0x31) RETURN(BZ_DATA_ERROR); + GET_UCHAR(BZ_X_BLKHDR_2, uc); + if (uc != 0x41) RETURN(BZ_DATA_ERROR); + GET_UCHAR(BZ_X_BLKHDR_3, uc); + if (uc != 0x59) RETURN(BZ_DATA_ERROR); + GET_UCHAR(BZ_X_BLKHDR_4, uc); + if (uc != 0x26) RETURN(BZ_DATA_ERROR); + GET_UCHAR(BZ_X_BLKHDR_5, uc); + if (uc != 0x53) RETURN(BZ_DATA_ERROR); + GET_UCHAR(BZ_X_BLKHDR_6, uc); + if (uc != 0x59) RETURN(BZ_DATA_ERROR); + + s->currBlockNo++; + if (s->verbosity >= 2) + VPrintf1 ( "\n [%d: huff+mtf ", s->currBlockNo ); + + s->storedBlockCRC = 0; + GET_UCHAR(BZ_X_BCRC_1, uc); + s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc); + GET_UCHAR(BZ_X_BCRC_2, uc); + s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc); + GET_UCHAR(BZ_X_BCRC_3, uc); + s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc); + GET_UCHAR(BZ_X_BCRC_4, uc); + s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc); + + GET_BITS(BZ_X_RANDBIT, s->blockRandomised, 1); + + s->origPtr = 0; + GET_UCHAR(BZ_X_ORIGPTR_1, uc); + s->origPtr = (s->origPtr << 8) | ((Int32)uc); + GET_UCHAR(BZ_X_ORIGPTR_2, uc); + s->origPtr = (s->origPtr << 8) | ((Int32)uc); + GET_UCHAR(BZ_X_ORIGPTR_3, uc); + s->origPtr = (s->origPtr << 8) | ((Int32)uc); + + if (s->origPtr < 0) + RETURN(BZ_DATA_ERROR); + if (s->origPtr > 10 + 100000*s->blockSize100k) + RETURN(BZ_DATA_ERROR); + + /*--- Receive the mapping table ---*/ + for (i = 0; i < 16; i++) { + GET_BIT(BZ_X_MAPPING_1, uc); + if (uc == 1) + s->inUse16[i] = True; else + s->inUse16[i] = False; + } + + for (i = 0; i < 256; i++) s->inUse[i] = False; + + for (i = 0; i < 16; i++) + if (s->inUse16[i]) + for (j = 0; j < 16; j++) { + GET_BIT(BZ_X_MAPPING_2, uc); + if (uc == 1) s->inUse[i * 16 + j] = True; + } + makeMaps_d ( s ); + if (s->nInUse == 0) RETURN(BZ_DATA_ERROR); + alphaSize = s->nInUse+2; + + /*--- Now the selectors ---*/ + GET_BITS(BZ_X_SELECTOR_1, nGroups, 3); + if (nGroups < 2 || nGroups > 6) RETURN(BZ_DATA_ERROR); + GET_BITS(BZ_X_SELECTOR_2, nSelectors, 15); + if (nSelectors < 1) RETURN(BZ_DATA_ERROR); + for (i = 0; i < nSelectors; i++) { + j = 0; + while (True) { + GET_BIT(BZ_X_SELECTOR_3, uc); + if (uc == 0) break; + j++; + if (j >= nGroups) RETURN(BZ_DATA_ERROR); + } + s->selectorMtf[i] = j; + } + + /*--- Undo the MTF values for the selectors. ---*/ + { + UChar pos[BZ_N_GROUPS], tmp, v; + for (v = 0; v < nGroups; v++) pos[v] = v; + + for (i = 0; i < nSelectors; i++) { + v = s->selectorMtf[i]; + tmp = pos[v]; + while (v > 0) { pos[v] = pos[v-1]; v--; } + pos[0] = tmp; + s->selector[i] = tmp; + } + } + + /*--- Now the coding tables ---*/ + for (t = 0; t < nGroups; t++) { + GET_BITS(BZ_X_CODING_1, curr, 5); + for (i = 0; i < alphaSize; i++) { + while (True) { + if (curr < 1 || curr > 20) RETURN(BZ_DATA_ERROR); + GET_BIT(BZ_X_CODING_2, uc); + if (uc == 0) break; + GET_BIT(BZ_X_CODING_3, uc); + if (uc == 0) curr++; else curr--; + } + s->len[t][i] = curr; + } + } + + /*--- Create the Huffman decoding tables ---*/ + for (t = 0; t < nGroups; t++) { + minLen = 32; + maxLen = 0; + for (i = 0; i < alphaSize; i++) { + if (s->len[t][i] > maxLen) maxLen = s->len[t][i]; + if (s->len[t][i] < minLen) minLen = s->len[t][i]; + } + BZ2_hbCreateDecodeTables ( + &(s->limit[t][0]), + &(s->base[t][0]), + &(s->perm[t][0]), + &(s->len[t][0]), + minLen, maxLen, alphaSize + ); + s->minLens[t] = minLen; + } + + /*--- Now the MTF values ---*/ + + EOB = s->nInUse+1; + nblockMAX = 100000 * s->blockSize100k; + groupNo = -1; + groupPos = 0; + + for (i = 0; i <= 255; i++) s->unzftab[i] = 0; + + /*-- MTF init --*/ + { + Int32 ii, jj, kk; + kk = MTFA_SIZE-1; + for (ii = 256 / MTFL_SIZE - 1; ii >= 0; ii--) { + for (jj = MTFL_SIZE-1; jj >= 0; jj--) { + s->mtfa[kk] = (UChar)(ii * MTFL_SIZE + jj); + kk--; + } + s->mtfbase[ii] = kk + 1; + } + } + /*-- end MTF init --*/ + + nblock = 0; + GET_MTF_VAL(BZ_X_MTF_1, BZ_X_MTF_2, nextSym); + + while (True) { + + if (nextSym == EOB) break; + + if (nextSym == BZ_RUNA || nextSym == BZ_RUNB) { + + es = -1; + N = 1; + do { + /* Check that N doesn't get too big, so that es doesn't + go negative. The maximum value that can be + RUNA/RUNB encoded is equal to the block size (post + the initial RLE), viz, 900k, so bounding N at 2 + million should guard against overflow without + rejecting any legitimate inputs. */ + if (N >= 2*1024*1024) RETURN(BZ_DATA_ERROR); + if (nextSym == BZ_RUNA) es = es + (0+1) * N; else + if (nextSym == BZ_RUNB) es = es + (1+1) * N; + N = N * 2; + GET_MTF_VAL(BZ_X_MTF_3, BZ_X_MTF_4, nextSym); + } + while (nextSym == BZ_RUNA || nextSym == BZ_RUNB); + + es++; + uc = s->seqToUnseq[ s->mtfa[s->mtfbase[0]] ]; + s->unzftab[uc] += es; + + if (s->smallDecompress) + while (es > 0) { + if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR); + s->ll16[nblock] = (UInt16)uc; + nblock++; + es--; + } + else + while (es > 0) { + if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR); + s->tt[nblock] = (UInt32)uc; + nblock++; + es--; + }; + + continue; + + } else { + + if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR); + + /*-- uc = MTF ( nextSym-1 ) --*/ + { + Int32 ii, jj, kk, pp, lno, off; + UInt32 nn; + nn = (UInt32)(nextSym - 1); + + if (nn < MTFL_SIZE) { + /* avoid general-case expense */ + pp = s->mtfbase[0]; + uc = s->mtfa[pp+nn]; + while (nn > 3) { + Int32 z = pp+nn; + s->mtfa[(z) ] = s->mtfa[(z)-1]; + s->mtfa[(z)-1] = s->mtfa[(z)-2]; + s->mtfa[(z)-2] = s->mtfa[(z)-3]; + s->mtfa[(z)-3] = s->mtfa[(z)-4]; + nn -= 4; + } + while (nn > 0) { + s->mtfa[(pp+nn)] = s->mtfa[(pp+nn)-1]; nn--; + }; + s->mtfa[pp] = uc; + } else { + /* general case */ + lno = nn / MTFL_SIZE; + off = nn % MTFL_SIZE; + pp = s->mtfbase[lno] + off; + uc = s->mtfa[pp]; + while (pp > s->mtfbase[lno]) { + s->mtfa[pp] = s->mtfa[pp-1]; pp--; + }; + s->mtfbase[lno]++; + while (lno > 0) { + s->mtfbase[lno]--; + s->mtfa[s->mtfbase[lno]] + = s->mtfa[s->mtfbase[lno-1] + MTFL_SIZE - 1]; + lno--; + } + s->mtfbase[0]--; + s->mtfa[s->mtfbase[0]] = uc; + if (s->mtfbase[0] == 0) { + kk = MTFA_SIZE-1; + for (ii = 256 / MTFL_SIZE-1; ii >= 0; ii--) { + for (jj = MTFL_SIZE-1; jj >= 0; jj--) { + s->mtfa[kk] = s->mtfa[s->mtfbase[ii] + jj]; + kk--; + } + s->mtfbase[ii] = kk + 1; + } + } + } + } + /*-- end uc = MTF ( nextSym-1 ) --*/ + + s->unzftab[s->seqToUnseq[uc]]++; + if (s->smallDecompress) + s->ll16[nblock] = (UInt16)(s->seqToUnseq[uc]); else + s->tt[nblock] = (UInt32)(s->seqToUnseq[uc]); + nblock++; + + GET_MTF_VAL(BZ_X_MTF_5, BZ_X_MTF_6, nextSym); + continue; + } + } + + /* Now we know what nblock is, we can do a better sanity + check on s->origPtr. + */ + if (s->origPtr < 0 || s->origPtr >= nblock) + RETURN(BZ_DATA_ERROR); + + /*-- Set up cftab to facilitate generation of T^(-1) --*/ + /* Check: unzftab entries in range. */ + for (i = 0; i <= 255; i++) { + if (s->unzftab[i] < 0 || s->unzftab[i] > nblock) + RETURN(BZ_DATA_ERROR); + } + /* Actually generate cftab. */ + s->cftab[0] = 0; + for (i = 1; i <= 256; i++) s->cftab[i] = s->unzftab[i-1]; + for (i = 1; i <= 256; i++) s->cftab[i] += s->cftab[i-1]; + /* Check: cftab entries in range. */ + for (i = 0; i <= 256; i++) { + if (s->cftab[i] < 0 || s->cftab[i] > nblock) { + /* s->cftab[i] can legitimately be == nblock */ + RETURN(BZ_DATA_ERROR); + } + } + /* Check: cftab entries non-descending. */ + for (i = 1; i <= 256; i++) { + if (s->cftab[i-1] > s->cftab[i]) { + RETURN(BZ_DATA_ERROR); + } + } + + s->state_out_len = 0; + s->state_out_ch = 0; + BZ_INITIALISE_CRC ( s->calculatedBlockCRC ); + s->state = BZ_X_OUTPUT; + if (s->verbosity >= 2) VPrintf0 ( "rt+rld" ); + + if (s->smallDecompress) { + + /*-- Make a copy of cftab, used in generation of T --*/ + for (i = 0; i <= 256; i++) s->cftabCopy[i] = s->cftab[i]; + + /*-- compute the T vector --*/ + for (i = 0; i < nblock; i++) { + uc = (UChar)(s->ll16[i]); + SET_LL(i, s->cftabCopy[uc]); + s->cftabCopy[uc]++; + } + + /*-- Compute T^(-1) by pointer reversal on T --*/ + i = s->origPtr; + j = GET_LL(i); + do { + Int32 tmp = GET_LL(j); + SET_LL(j, i); + i = j; + j = tmp; + } + while (i != s->origPtr); + + s->tPos = s->origPtr; + s->nblock_used = 0; + if (s->blockRandomised) { + BZ_RAND_INIT_MASK; + BZ_GET_SMALL(s->k0); s->nblock_used++; + BZ_RAND_UPD_MASK; s->k0 ^= BZ_RAND_MASK; + } else { + BZ_GET_SMALL(s->k0); s->nblock_used++; + } + + } else { + + /*-- compute the T^(-1) vector --*/ + for (i = 0; i < nblock; i++) { + uc = (UChar)(s->tt[i] & 0xff); + s->tt[s->cftab[uc]] |= (i << 8); + s->cftab[uc]++; + } + + s->tPos = s->tt[s->origPtr] >> 8; + s->nblock_used = 0; + if (s->blockRandomised) { + BZ_RAND_INIT_MASK; + BZ_GET_FAST(s->k0); s->nblock_used++; + BZ_RAND_UPD_MASK; s->k0 ^= BZ_RAND_MASK; + } else { + BZ_GET_FAST(s->k0); s->nblock_used++; + } + + } + + RETURN(BZ_OK); + + + + endhdr_2: + + GET_UCHAR(BZ_X_ENDHDR_2, uc); + if (uc != 0x72) RETURN(BZ_DATA_ERROR); + GET_UCHAR(BZ_X_ENDHDR_3, uc); + if (uc != 0x45) RETURN(BZ_DATA_ERROR); + GET_UCHAR(BZ_X_ENDHDR_4, uc); + if (uc != 0x38) RETURN(BZ_DATA_ERROR); + GET_UCHAR(BZ_X_ENDHDR_5, uc); + if (uc != 0x50) RETURN(BZ_DATA_ERROR); + GET_UCHAR(BZ_X_ENDHDR_6, uc); + if (uc != 0x90) RETURN(BZ_DATA_ERROR); + + s->storedCombinedCRC = 0; + GET_UCHAR(BZ_X_CCRC_1, uc); + s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc); + GET_UCHAR(BZ_X_CCRC_2, uc); + s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc); + GET_UCHAR(BZ_X_CCRC_3, uc); + s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc); + GET_UCHAR(BZ_X_CCRC_4, uc); + s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc); + + s->state = BZ_X_IDLE; + RETURN(BZ_STREAM_END); + + default: AssertH ( False, 4001 ); + } + + AssertH ( False, 4002 ); + + save_state_and_return: + + s->save_i = i; + s->save_j = j; + s->save_t = t; + s->save_alphaSize = alphaSize; + s->save_nGroups = nGroups; + s->save_nSelectors = nSelectors; + s->save_EOB = EOB; + s->save_groupNo = groupNo; + s->save_groupPos = groupPos; + s->save_nextSym = nextSym; + s->save_nblockMAX = nblockMAX; + s->save_nblock = nblock; + s->save_es = es; + s->save_N = N; + s->save_curr = curr; + s->save_zt = zt; + s->save_zn = zn; + s->save_zvec = zvec; + s->save_zj = zj; + s->save_gSel = gSel; + s->save_gMinlen = gMinlen; + s->save_gLimit = gLimit; + s->save_gBase = gBase; + s->save_gPerm = gPerm; + + return retVal; +} + + +/*-------------------------------------------------------------*/ +/*--- end decompress.c ---*/ +/*-------------------------------------------------------------*/ diff --git a/xdl/third_party/tbb/examples/graph/fgbzip2/fgbzip2.cpp b/xdl/third_party/tbb/examples/graph/fgbzip2/fgbzip2.cpp new file mode 100644 index 00000000..8ab1da2b --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/fgbzip2/fgbzip2.cpp @@ -0,0 +1,501 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +#define TBB_PREVIEW_FLOW_GRAPH_FEATURES 1 +#include "tbb/tbb_config.h" +#include "../../common/utility/utility.h" + +#if __TBB_PREVIEW_ASYNC_MSG && __TBB_CPP11_LAMBDAS_PRESENT + +#include +#include +#include +#include +#include + +#include "bzlib.h" + +#include "tbb/flow_graph.h" +#include "tbb/tick_count.h" +#include "tbb/compat/thread" +#include "tbb/concurrent_queue.h" + +// TODO: change memory allocation/deallocation to be managed in constructor/destructor +struct Buffer { + size_t len; + char* b; +}; + +struct BufferMsg { + + BufferMsg() {} + BufferMsg(Buffer& inputBuffer, Buffer& outputBuffer, size_t seqId, bool isLast = false) + : inputBuffer(inputBuffer), outputBuffer(outputBuffer), seqId(seqId), isLast(isLast) {} + + static BufferMsg createBufferMsg(size_t seqId, size_t chunkSize) { + Buffer inputBuffer; + inputBuffer.b = new char[chunkSize]; + inputBuffer.len = chunkSize; + + Buffer outputBuffer; + size_t compressedChunkSize = chunkSize * 1.01 + 600; // compression overhead + outputBuffer.b = new char[compressedChunkSize]; + outputBuffer.len = compressedChunkSize; + + return BufferMsg(inputBuffer, outputBuffer, seqId); + } + + static void destroyBufferMsg(const BufferMsg& destroyMsg) { + delete[] destroyMsg.inputBuffer.b; + delete[] destroyMsg.outputBuffer.b; + } + + void markLast(size_t lastId) { + isLast = true; + seqId = lastId; + } + + size_t seqId; + Buffer inputBuffer; + Buffer outputBuffer; + bool isLast; +}; + +class BufferCompressor { +public: + + BufferCompressor(int blockSizeIn100KB) : m_blockSize(blockSizeIn100KB) {} + + BufferMsg operator()(BufferMsg buffer) const { + if (!buffer.isLast) { + unsigned int outSize = buffer.outputBuffer.len; + BZ2_bzBuffToBuffCompress(buffer.outputBuffer.b, &outSize, + buffer.inputBuffer.b, buffer.inputBuffer.len, + m_blockSize, 0, 30); + buffer.outputBuffer.len = outSize; + } + return buffer; + } + +private: + int m_blockSize; +}; + +class IOOperations { +public: + + IOOperations(std::ifstream& inputStream, std::ofstream& outputStream, size_t chunkSize) + : m_inputStream(inputStream), m_outputStream(outputStream), m_chunkSize(chunkSize), m_chunksRead(0) {} + + void readChunk(Buffer& buffer) { + m_inputStream.read(buffer.b, m_chunkSize); + buffer.len = static_cast(m_inputStream.gcount()); + m_chunksRead++; + } + + void writeChunk(const Buffer& buffer) { + m_outputStream.write(buffer.b, buffer.len); + } + + size_t chunksRead() const { + return m_chunksRead; + } + + size_t chunkSize() const { + return m_chunkSize; + } + + bool hasDataToRead() const { + return m_inputStream.is_open() && !m_inputStream.eof(); + } + +private: + + std::ifstream& m_inputStream; + std::ofstream& m_outputStream; + + size_t m_chunkSize; + size_t m_chunksRead; +}; + +//----------------------------------------------------------------------------------------------------------------------- +//---------------------------------------Compression example based on async_node----------------------------------------- +//----------------------------------------------------------------------------------------------------------------------- + +typedef tbb::flow::async_node< tbb::flow::continue_msg, BufferMsg > async_file_reader_node; +typedef tbb::flow::async_node< BufferMsg, tbb::flow::continue_msg > async_file_writer_node; + +class AsyncNodeActivity { +public: + + AsyncNodeActivity(IOOperations& io) + : m_io(io), m_fileWriterThread(&AsyncNodeActivity::writingLoop, this) {} + + ~AsyncNodeActivity() { + m_fileReaderThread.join(); + m_fileWriterThread.join(); + } + + void submitRead(async_file_reader_node::gateway_type& gateway) { + gateway.reserve_wait(); + std::thread(&AsyncNodeActivity::readingLoop, this, std::ref(gateway)).swap(m_fileReaderThread); + } + + void submitWrite(const BufferMsg& bufferMsg) { + m_writeQueue.push(bufferMsg); + } + +private: + + void readingLoop(async_file_reader_node::gateway_type& gateway) { + while (m_io.hasDataToRead()) { + BufferMsg bufferMsg = BufferMsg::createBufferMsg(m_io.chunksRead(), m_io.chunkSize()); + m_io.readChunk(bufferMsg.inputBuffer); + gateway.try_put(bufferMsg); + } + sendLastMessage(gateway); + gateway.release_wait(); + } + + void writingLoop() { + BufferMsg buffer; + m_writeQueue.pop(buffer); + while (!buffer.isLast) { + m_io.writeChunk(buffer.outputBuffer); + m_writeQueue.pop(buffer); + } + } + + void sendLastMessage(async_file_reader_node::gateway_type& gateway) { + BufferMsg lastMsg; + lastMsg.markLast(m_io.chunksRead()); + gateway.try_put(lastMsg); + } + + IOOperations& m_io; + + tbb::concurrent_bounded_queue< BufferMsg > m_writeQueue; + + std::thread m_fileReaderThread; + std::thread m_fileWriterThread; +}; + +void fgCompressionAsyncNode(IOOperations& io, int blockSizeIn100KB) { + tbb::flow::graph g; + + AsyncNodeActivity asyncNodeActivity(io); + + async_file_reader_node file_reader(g, tbb::flow::unlimited, [&asyncNodeActivity](const tbb::flow::continue_msg& msg, async_file_reader_node::gateway_type& gateway) { + asyncNodeActivity.submitRead(gateway); + }); + + tbb::flow::function_node< BufferMsg, BufferMsg > compressor(g, tbb::flow::unlimited, BufferCompressor(blockSizeIn100KB)); + + tbb::flow::sequencer_node< BufferMsg > ordering(g, [](const BufferMsg& bufferMsg)->size_t { + return bufferMsg.seqId; + }); + + // The node is serial to preserve the right order of buffers set by the preceding sequencer_node + async_file_writer_node output_writer(g, tbb::flow::serial, [&asyncNodeActivity](const BufferMsg& bufferMsg, async_file_writer_node::gateway_type& gateway) { + asyncNodeActivity.submitWrite(bufferMsg); + }); + + make_edge(file_reader, compressor); + make_edge(compressor, ordering); + make_edge(ordering, output_writer); + + file_reader.try_put(tbb::flow::continue_msg()); + + g.wait_for_all(); +} + +//----------------------------------------------------------------------------------------------------------------------- +//------------------------------------------Compression example based on async_msg--------------------------------------- +//----------------------------------------------------------------------------------------------------------------------- + +typedef tbb::flow::async_msg< BufferMsg > async_msg_type; + +class AsyncMsgActivity { +public: + + AsyncMsgActivity(tbb::flow::graph& g, IOOperations& io) + : m_io(io), m_graph(g), m_fileReaderThread(&AsyncMsgActivity::readingLoop, this), + m_fileWriterThread(&AsyncMsgActivity::writingLoop, this) + { + // Graph synchronization starts here and ends + // when the last buffer was written in "writing thread" + m_graph.increment_wait_count(); + } + + ~AsyncMsgActivity() { + m_fileReaderThread.join(); + m_fileWriterThread.join(); + + // Lets release resources that async + // activity and graph were acquired + freeBuffers(); + } + + async_msg_type submitRead(BufferMsg& bufferMsg) { + async_msg_type msg; + work_type readWork = { bufferMsg, msg }; + m_readQueue.push(readWork); + return msg; + } + + async_msg_type submitWrite(const BufferMsg& bufferMsg) { + async_msg_type msg; + work_type writeWork = { bufferMsg, msg }; + m_writeQueue.push(writeWork); + return msg; + } + +private: + + struct work_type { + BufferMsg bufferMsg; + async_msg_type msg; + }; + + void readingLoop() { + work_type readWork; + m_readQueue.pop(readWork); + + // Reading thread waits for buffers to be received + // (the graph reuses limitted number of buffers) + // and reads the file while there is something to read + while (m_io.hasDataToRead()) { + readWork.bufferMsg.seqId = m_io.chunksRead(); + m_io.readChunk(readWork.bufferMsg.inputBuffer); + readWork.msg.set(readWork.bufferMsg); + m_readQueue.pop(readWork); + } + + // Pass message with an end flag to the graph + sendLastMessage(readWork); + } + + void sendLastMessage(work_type& work) { + work.bufferMsg.markLast(m_io.chunksRead()); + work.msg.set(work.bufferMsg); + } + + void writingLoop() { + work_type writeWork; + m_writeQueue.pop(writeWork); + + // Writing thread writes all buffers that it gets + // and reuses them. At the end all reusing buffers + // is stored in read queue + while (!writeWork.bufferMsg.isLast) { + m_io.writeChunk(writeWork.bufferMsg.outputBuffer); + writeWork.msg.set(writeWork.bufferMsg); + m_writeQueue.pop(writeWork); + } + + // Store last message to the reading queue to free resources later + writeWork.msg.set(writeWork.bufferMsg); + + // After all buffers have been written + // the synchronization ends + m_graph.decrement_wait_count(); + } + + void freeBuffers() { + int buffersNumber = m_readQueue.size(); + for (int i = 0; i < buffersNumber; i++) { + work_type workToDelete; + m_readQueue.pop(workToDelete); + BufferMsg::destroyBufferMsg(workToDelete.bufferMsg); + } + } + + IOOperations& m_io; + + tbb::flow::graph& m_graph; + + tbb::concurrent_bounded_queue< work_type > m_writeQueue; + tbb::concurrent_bounded_queue< work_type > m_readQueue; + + std::thread m_fileReaderThread; + std::thread m_fileWriterThread; +}; + +void fgCompressionAsyncMsg(IOOperations& io, int blockSizeIn100KB, size_t memoryLimitIn1MB) { + // Memory limit sets the number of buffers that can be reused + int buffersNumber = memoryLimitIn1MB * 1000 * 1024 / io.chunkSize(); + + tbb::flow::graph g; + + AsyncMsgActivity asyncMsgActivity(g, io); + + tbb::flow::function_node< BufferMsg, async_msg_type > file_reader(g, tbb::flow::unlimited, [&asyncMsgActivity](BufferMsg bufferMsg) -> async_msg_type { + return asyncMsgActivity.submitRead(bufferMsg); + }); + + tbb::flow::function_node< BufferMsg, BufferMsg > compressor(g, tbb::flow::unlimited, BufferCompressor(blockSizeIn100KB)); + + tbb::flow::sequencer_node< BufferMsg > ordering(g, [](const BufferMsg& bufferMsg) -> size_t { + return bufferMsg.seqId; + }); + + // The node is serial to preserve the right order of buffers set by the preceding sequencer_node + tbb::flow::function_node< BufferMsg, async_msg_type > output_writer(g, tbb::flow::serial, [&asyncMsgActivity](const BufferMsg& bufferMsg) -> async_msg_type { + return asyncMsgActivity.submitWrite(bufferMsg); + }); + + make_edge(file_reader, compressor); + make_edge(compressor, ordering); + make_edge(ordering, output_writer); + make_edge(output_writer, file_reader); + + // Creating buffers to be reused in read/compress/write graph loop + for (int i = 0; i < buffersNumber; i++) { + BufferMsg reuseBufferMsg = BufferMsg::createBufferMsg(0, io.chunkSize()); + file_reader.try_put(reuseBufferMsg); + } + + g.wait_for_all(); +} + +//----------------------------------------------------------------------------------------------------------------------- +//---------------------------------------------Simple compression example------------------------------------------------ +//----------------------------------------------------------------------------------------------------------------------- + +void fgCompression(IOOperations& io, int blockSizeIn100KB) { + tbb::flow::graph g; + + tbb::flow::source_node< BufferMsg > file_reader(g, [&io](BufferMsg& bufferMsg)->bool { + if (io.hasDataToRead()) { + bufferMsg = BufferMsg::createBufferMsg(io.chunksRead(), io.chunkSize()); + io.readChunk(bufferMsg.inputBuffer); + return true; + } + return false; + }); + + tbb::flow::function_node< BufferMsg, BufferMsg > compressor(g, tbb::flow::unlimited, BufferCompressor(blockSizeIn100KB)); + + tbb::flow::sequencer_node< BufferMsg > ordering(g, [](const BufferMsg& buffer)->size_t { + return buffer.seqId; + }); + + tbb::flow::function_node< BufferMsg > output_writer(g, tbb::flow::serial, [&io](const BufferMsg& bufferMsg) { + io.writeChunk(bufferMsg.outputBuffer); + BufferMsg::destroyBufferMsg(bufferMsg); + }); + + make_edge(file_reader, compressor); + make_edge(compressor, ordering); + make_edge(ordering, output_writer); + + g.wait_for_all(); +} + +//----------------------------------------------------------------------------------------------------------------------- + +bool endsWith(const std::string& str, const std::string& suffix) { + return str.find(suffix, str.length() - suffix.length()) != std::string::npos; +} + +//----------------------------------------------------------------------------------------------------------------------- + +int main(int argc, char* argv[]) { + try { + tbb::tick_count mainStartTime = tbb::tick_count::now(); + + const std::string archiveExtension = ".bz2"; + bool verbose = false; + std::string asyncType; + std::string inputFileName; + int blockSizeIn100KB = 1; // block size in 100KB chunks + size_t memoryLimitIn1MB = 1; // memory limit for compression in megabytes granularity + + utility::parse_cli_arguments(argc, argv, + utility::cli_argument_pack() + //"-h" option for displaying help is present implicitly + .arg(blockSizeIn100KB, "-b", "\t block size in 100KB chunks, [1 .. 9]") + .arg(verbose, "-v", "verbose mode") + .arg(memoryLimitIn1MB, "-l", "used memory limit for compression algorithm in 1MB (minimum) granularity") + .arg(asyncType, "-a", "name of the used graph async implementation - can be async_node or async_msg") + .positional_arg(inputFileName, "filename", "input file name") + ); + + if (inputFileName.empty()) { + throw std::invalid_argument("Input file name is not specified. Try 'fgbzip2 -h' for more information."); + } + + if (blockSizeIn100KB < 1 || blockSizeIn100KB > 9) { + throw std::invalid_argument("Incorrect block size. Try 'fgbzip2 -h' for more information."); + } + + if (memoryLimitIn1MB < 1) { + throw std::invalid_argument("Incorrect memory limit size. Try 'fgbzip2 -h' for more information."); + } + + if (verbose) std::cout << "Input file name: " << inputFileName << std::endl; + if (endsWith(inputFileName, archiveExtension)) { + throw std::invalid_argument("Input file already have " + archiveExtension + " extension."); + } + + std::ifstream inputStream(inputFileName.c_str(), std::ios::in | std::ios::binary); + if (!inputStream.is_open()) { + throw std::invalid_argument("Cannot open " + inputFileName + " file."); + } + + std::string outputFileName(inputFileName + archiveExtension); + + std::ofstream outputStream(outputFileName.c_str(), std::ios::out | std::ios::binary | std::ios::trunc); + if (!outputStream.is_open()) { + throw std::invalid_argument("Cannot open " + outputFileName + " file."); + } + + // General interface to work with I/O buffers operations + size_t chunkSize = blockSizeIn100KB * 100 * 1024; + IOOperations io(inputStream, outputStream, chunkSize); + + if (asyncType.empty()) { + if (verbose) std::cout << "Running flow graph based compression algorithm." << std::endl; + fgCompression(io, blockSizeIn100KB); + } else if (asyncType == "async_node") { + if (verbose) std::cout << "Running flow graph based compression algorithm with async_node based asynchronious IO operations." << std::endl; + fgCompressionAsyncNode(io, blockSizeIn100KB); + } else if (asyncType == "async_msg") { + if (verbose) std::cout << "Running flow graph based compression algorithm with async_msg based asynchronious IO operations. Using limited memory: " << memoryLimitIn1MB << "MB." << std::endl; + fgCompressionAsyncMsg(io, blockSizeIn100KB, memoryLimitIn1MB); + } + + inputStream.close(); + outputStream.close(); + + utility::report_elapsed_time((tbb::tick_count::now() - mainStartTime).seconds()); + + return 0; + } catch (std::exception& e) { + std::cerr << "Error occurred. Error text is : \"" << e.what() << "\"\n"; + return -1; + } +} +#else +int main() { + utility::report_skipped(); + return 0; +} +#endif /* __TBB_PREVIEW_ASYNC_NODE && __TBB_CPP11_LAMBDAS_PRESENT */ diff --git a/xdl/third_party/tbb/examples/graph/fgbzip2/huffman.cpp b/xdl/third_party/tbb/examples/graph/fgbzip2/huffman.cpp new file mode 100644 index 00000000..717e053d --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/fgbzip2/huffman.cpp @@ -0,0 +1,257 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +/*-------------------------------------------------------------*/ +/*--- Huffman coding low-level stuff ---*/ +/*--- huffman.cpp ---*/ +/*-------------------------------------------------------------*/ + +/* ------------------------------------------------------------------ + The original source for this example: + This file is part of bzip2/libbzip2, a program and library for + lossless, block-sorting data compression. + + bzip2/libbzip2 version 1.0.6 of 6 September 2010 + Copyright (C) 1996-2010 Julian Seward + + This program, "bzip2", the associated library "libbzip2", and all + documentation, are copyright (C) 1996-2010 Julian R Seward. 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. The origin of this software must not be misrepresented; you must + not claim that you wrote the original software. If you use this + software in a product, an acknowledgment in the product + documentation would be appreciated but is not required. + + 3. Altered source versions must be plainly marked as such, and must + not be misrepresented as being the original software. + + 4. The name of the author may not be used to endorse or promote + products derived from this software without specific prior written + permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. + + Julian Seward, jseward@bzip.org + bzip2/libbzip2 version 1.0.6 of 6 September 2010 + ------------------------------------------------------------------ */ + + +#include "bzlib_private.h" + +/*---------------------------------------------------*/ +#define WEIGHTOF(zz0) ((zz0) & 0xffffff00) +#define DEPTHOF(zz1) ((zz1) & 0x000000ff) +#define MYMAX(zz2,zz3) ((zz2) > (zz3) ? (zz2) : (zz3)) + +#define ADDWEIGHTS(zw1,zw2) \ + (WEIGHTOF(zw1)+WEIGHTOF(zw2)) | \ + (1 + MYMAX(DEPTHOF(zw1),DEPTHOF(zw2))) + +#define UPHEAP(z) \ +{ \ + Int32 zz, tmp; \ + zz = z; tmp = heap[zz]; \ + while (weight[tmp] < weight[heap[zz >> 1]]) { \ + heap[zz] = heap[zz >> 1]; \ + zz >>= 1; \ + } \ + heap[zz] = tmp; \ +} + +#define DOWNHEAP(z) \ +{ \ + Int32 zz, yy, tmp; \ + zz = z; tmp = heap[zz]; \ + while (True) { \ + yy = zz << 1; \ + if (yy > nHeap) break; \ + if (yy < nHeap && \ + weight[heap[yy+1]] < weight[heap[yy]]) \ + yy++; \ + if (weight[tmp] < weight[heap[yy]]) break; \ + heap[zz] = heap[yy]; \ + zz = yy; \ + } \ + heap[zz] = tmp; \ +} + + +/*---------------------------------------------------*/ +void BZ2_hbMakeCodeLengths ( UChar *len, + Int32 *freq, + Int32 alphaSize, + Int32 maxLen ) +{ + /*-- + Nodes and heap entries run from 1. Entry 0 + for both the heap and nodes is a sentinel. + --*/ + Int32 nNodes, nHeap, n1, n2, i, j, k; + Bool tooLong; + + Int32 heap [ BZ_MAX_ALPHA_SIZE + 2 ]; + Int32 weight [ BZ_MAX_ALPHA_SIZE * 2 ]; + Int32 parent [ BZ_MAX_ALPHA_SIZE * 2 ]; + + for (i = 0; i < alphaSize; i++) + weight[i+1] = (freq[i] == 0 ? 1 : freq[i]) << 8; + + while (True) { + + nNodes = alphaSize; + nHeap = 0; + + heap[0] = 0; + weight[0] = 0; + parent[0] = -2; + + for (i = 1; i <= alphaSize; i++) { + parent[i] = -1; + nHeap++; + heap[nHeap] = i; + UPHEAP(nHeap); + } + + AssertH( nHeap < (BZ_MAX_ALPHA_SIZE+2), 2001 ); + + while (nHeap > 1) { + n1 = heap[1]; heap[1] = heap[nHeap]; nHeap--; DOWNHEAP(1); + n2 = heap[1]; heap[1] = heap[nHeap]; nHeap--; DOWNHEAP(1); + nNodes++; + parent[n1] = parent[n2] = nNodes; + weight[nNodes] = ADDWEIGHTS(weight[n1], weight[n2]); + parent[nNodes] = -1; + nHeap++; + heap[nHeap] = nNodes; + UPHEAP(nHeap); + } + + AssertH( nNodes < (BZ_MAX_ALPHA_SIZE * 2), 2002 ); + + tooLong = False; + for (i = 1; i <= alphaSize; i++) { + j = 0; + k = i; + while (parent[k] >= 0) { k = parent[k]; j++; } + len[i-1] = j; + if (j > maxLen) tooLong = True; + } + + if (! tooLong) break; + + /* 17 Oct 04: keep-going condition for the following loop used + to be 'i < alphaSize', which missed the last element, + theoretically leading to the possibility of the compressor + looping. However, this count-scaling step is only needed if + one of the generated Huffman code words is longer than + maxLen, which up to and including version 1.0.2 was 20 bits, + which is extremely unlikely. In version 1.0.3 maxLen was + changed to 17 bits, which has minimal effect on compression + ratio, but does mean this scaling step is used from time to + time, enough to verify that it works. + + This means that bzip2-1.0.3 and later will only produce + Huffman codes with a maximum length of 17 bits. However, in + order to preserve backwards compatibility with bitstreams + produced by versions pre-1.0.3, the decompressor must still + handle lengths of up to 20. */ + + for (i = 1; i <= alphaSize; i++) { + j = weight[i] >> 8; + j = 1 + (j / 2); + weight[i] = j << 8; + } + } +} + + +/*---------------------------------------------------*/ +void BZ2_hbAssignCodes ( Int32 *code, + UChar *length, + Int32 minLen, + Int32 maxLen, + Int32 alphaSize ) +{ + Int32 n, vec, i; + + vec = 0; + for (n = minLen; n <= maxLen; n++) { + for (i = 0; i < alphaSize; i++) + if (length[i] == n) { code[i] = vec; vec++; }; + vec <<= 1; + } +} + + +/*---------------------------------------------------*/ +void BZ2_hbCreateDecodeTables ( Int32 *limit, + Int32 *base, + Int32 *perm, + UChar *length, + Int32 minLen, + Int32 maxLen, + Int32 alphaSize ) +{ + Int32 pp, i, j, vec; + + pp = 0; + for (i = minLen; i <= maxLen; i++) + for (j = 0; j < alphaSize; j++) + if (length[j] == i) { perm[pp] = j; pp++; }; + + for (i = 0; i < BZ_MAX_CODE_LEN; i++) base[i] = 0; + for (i = 0; i < alphaSize; i++) base[length[i]+1]++; + + for (i = 1; i < BZ_MAX_CODE_LEN; i++) base[i] += base[i-1]; + + for (i = 0; i < BZ_MAX_CODE_LEN; i++) limit[i] = 0; + vec = 0; + + for (i = minLen; i <= maxLen; i++) { + vec += (base[i+1] - base[i]); + limit[i] = vec-1; + vec <<= 1; + } + for (i = minLen + 1; i <= maxLen; i++) + base[i] = ((limit[i-1] + 1) << 1) - base[i]; +} + + +/*-------------------------------------------------------------*/ +/*--- end huffman.c ---*/ +/*-------------------------------------------------------------*/ diff --git a/xdl/third_party/tbb/examples/graph/fgbzip2/msvs/fgbzip2.sln b/xdl/third_party/tbb/examples/graph/fgbzip2/msvs/fgbzip2.sln new file mode 100644 index 00000000..663e94a8 --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/fgbzip2/msvs/fgbzip2.sln @@ -0,0 +1,28 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.40629.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fgbzip2", "fgbzip2.vcxproj", "{C931C7A2-074E-4150-9E7A-39A03250411E}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {C931C7A2-074E-4150-9E7A-39A03250411E}.Debug|Win32.ActiveCfg = Debug|Win32 + {C931C7A2-074E-4150-9E7A-39A03250411E}.Debug|Win32.Build.0 = Debug|Win32 + {C931C7A2-074E-4150-9E7A-39A03250411E}.Debug|x64.ActiveCfg = Debug|x64 + {C931C7A2-074E-4150-9E7A-39A03250411E}.Debug|x64.Build.0 = Debug|x64 + {C931C7A2-074E-4150-9E7A-39A03250411E}.Release|Win32.ActiveCfg = Release|Win32 + {C931C7A2-074E-4150-9E7A-39A03250411E}.Release|Win32.Build.0 = Release|Win32 + {C931C7A2-074E-4150-9E7A-39A03250411E}.Release|x64.ActiveCfg = Release|x64 + {C931C7A2-074E-4150-9E7A-39A03250411E}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/xdl/third_party/tbb/examples/graph/fgbzip2/msvs/fgbzip2.vcxproj b/xdl/third_party/tbb/examples/graph/fgbzip2/msvs/fgbzip2.vcxproj new file mode 100644 index 00000000..bf28d99e --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/fgbzip2/msvs/fgbzip2.vcxproj @@ -0,0 +1,216 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + fgbzip2 + {C931C7A2-074E-4150-9E7A-39A03250411E} + fgbzip2 + Win32Proj + + + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.40219.1 + $(TEMP)\tbb_examples\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Configuration)\ + false + $(TEMP)\tbb_examples\$(Platform)\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Platform)\$(Configuration)\ + false + $(TEMP)\tbb_examples\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Configuration)\ + false + $(TEMP)\tbb_examples\$(Platform)\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Platform)\$(Configuration)\ + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + TBB_PREVIEW_FLOW_GRAPH_NODES;WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG;%(PreprocessorDefinitions) + MultiThreadedDebugDLL + + + ProgramDatabase + true + + + tbb_debug.lib;tbbmalloc_debug.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc12;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc12;%(AdditionalLibraryDirectories) + true + Console + MachineX86 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 debug "$(OutDir)" + + + + + X64 + + + Disabled + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + TBB_PREVIEW_FLOW_GRAPH_NODES;WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG;%(PreprocessorDefinitions) + MultiThreadedDebugDLL + + + ProgramDatabase + true + + + tbb_debug.lib;tbbmalloc_debug.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc12;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc12;%(AdditionalLibraryDirectories) + true + Console + MachineX64 + false + + + Copying DLLs and PDBs + REM call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 debug "$(OutDir)" + + + + + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + TBB_PREVIEW_FLOW_GRAPH_NODES;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + + + ProgramDatabase + true + + + tbb.lib;tbbmalloc.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc12;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc12;%(AdditionalLibraryDirectories) + true + Console + true + true + MachineX86 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 release "$(OutDir)" + + + + + X64 + + + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + TBB_PREVIEW_FLOW_GRAPH_NODES;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + + + ProgramDatabase + true + + + tbb.lib;tbbmalloc.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc12;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc12;%(AdditionalLibraryDirectories) + true + Console + true + true + MachineX64 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 release "$(OutDir)" + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/xdl/third_party/tbb/examples/graph/fgbzip2/randtable.cpp b/xdl/third_party/tbb/examples/graph/fgbzip2/randtable.cpp new file mode 100644 index 00000000..67f9a371 --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/fgbzip2/randtable.cpp @@ -0,0 +1,136 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +/*-------------------------------------------------------------*/ +/*--- Table for randomising repetitive blocks ---*/ +/*--- randtable.cpp ---*/ +/*-------------------------------------------------------------*/ + +/* ------------------------------------------------------------------ + The original source for this example: + This file is part of bzip2/libbzip2, a program and library for + lossless, block-sorting data compression. + + bzip2/libbzip2 version 1.0.6 of 6 September 2010 + Copyright (C) 1996-2010 Julian Seward + + This program, "bzip2", the associated library "libbzip2", and all + documentation, are copyright (C) 1996-2010 Julian R Seward. 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. The origin of this software must not be misrepresented; you must + not claim that you wrote the original software. If you use this + software in a product, an acknowledgment in the product + documentation would be appreciated but is not required. + + 3. Altered source versions must be plainly marked as such, and must + not be misrepresented as being the original software. + + 4. The name of the author may not be used to endorse or promote + products derived from this software without specific prior written + permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. + + Julian Seward, jseward@bzip.org + bzip2/libbzip2 version 1.0.6 of 6 September 2010 + ------------------------------------------------------------------ */ + + +#include "bzlib_private.h" + + +/*---------------------------------------------*/ +Int32 BZ2_rNums[512] = { + 619, 720, 127, 481, 931, 816, 813, 233, 566, 247, + 985, 724, 205, 454, 863, 491, 741, 242, 949, 214, + 733, 859, 335, 708, 621, 574, 73, 654, 730, 472, + 419, 436, 278, 496, 867, 210, 399, 680, 480, 51, + 878, 465, 811, 169, 869, 675, 611, 697, 867, 561, + 862, 687, 507, 283, 482, 129, 807, 591, 733, 623, + 150, 238, 59, 379, 684, 877, 625, 169, 643, 105, + 170, 607, 520, 932, 727, 476, 693, 425, 174, 647, + 73, 122, 335, 530, 442, 853, 695, 249, 445, 515, + 909, 545, 703, 919, 874, 474, 882, 500, 594, 612, + 641, 801, 220, 162, 819, 984, 589, 513, 495, 799, + 161, 604, 958, 533, 221, 400, 386, 867, 600, 782, + 382, 596, 414, 171, 516, 375, 682, 485, 911, 276, + 98, 553, 163, 354, 666, 933, 424, 341, 533, 870, + 227, 730, 475, 186, 263, 647, 537, 686, 600, 224, + 469, 68, 770, 919, 190, 373, 294, 822, 808, 206, + 184, 943, 795, 384, 383, 461, 404, 758, 839, 887, + 715, 67, 618, 276, 204, 918, 873, 777, 604, 560, + 951, 160, 578, 722, 79, 804, 96, 409, 713, 940, + 652, 934, 970, 447, 318, 353, 859, 672, 112, 785, + 645, 863, 803, 350, 139, 93, 354, 99, 820, 908, + 609, 772, 154, 274, 580, 184, 79, 626, 630, 742, + 653, 282, 762, 623, 680, 81, 927, 626, 789, 125, + 411, 521, 938, 300, 821, 78, 343, 175, 128, 250, + 170, 774, 972, 275, 999, 639, 495, 78, 352, 126, + 857, 956, 358, 619, 580, 124, 737, 594, 701, 612, + 669, 112, 134, 694, 363, 992, 809, 743, 168, 974, + 944, 375, 748, 52, 600, 747, 642, 182, 862, 81, + 344, 805, 988, 739, 511, 655, 814, 334, 249, 515, + 897, 955, 664, 981, 649, 113, 974, 459, 893, 228, + 433, 837, 553, 268, 926, 240, 102, 654, 459, 51, + 686, 754, 806, 760, 493, 403, 415, 394, 687, 700, + 946, 670, 656, 610, 738, 392, 760, 799, 887, 653, + 978, 321, 576, 617, 626, 502, 894, 679, 243, 440, + 680, 879, 194, 572, 640, 724, 926, 56, 204, 700, + 707, 151, 457, 449, 797, 195, 791, 558, 945, 679, + 297, 59, 87, 824, 713, 663, 412, 693, 342, 606, + 134, 108, 571, 364, 631, 212, 174, 643, 304, 329, + 343, 97, 430, 751, 497, 314, 983, 374, 822, 928, + 140, 206, 73, 263, 980, 736, 876, 478, 430, 305, + 170, 514, 364, 692, 829, 82, 855, 953, 676, 246, + 369, 970, 294, 750, 807, 827, 150, 790, 288, 923, + 804, 378, 215, 828, 592, 281, 565, 555, 710, 82, + 896, 831, 547, 261, 524, 462, 293, 465, 502, 56, + 661, 821, 976, 991, 658, 869, 905, 758, 745, 193, + 768, 550, 608, 933, 378, 286, 215, 979, 792, 961, + 61, 688, 793, 644, 986, 403, 106, 366, 905, 644, + 372, 567, 466, 434, 645, 210, 389, 550, 919, 135, + 780, 773, 635, 389, 707, 100, 626, 958, 165, 504, + 920, 176, 193, 713, 857, 265, 203, 50, 668, 108, + 645, 990, 626, 197, 510, 357, 358, 850, 858, 364, + 936, 638 +}; + + +/*-------------------------------------------------------------*/ +/*--- end randtable.c ---*/ +/*-------------------------------------------------------------*/ diff --git a/xdl/third_party/tbb/examples/graph/fgbzip2/readme.html b/xdl/third_party/tbb/examples/graph/fgbzip2/readme.html new file mode 100644 index 00000000..0f3e9aff --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/fgbzip2/readme.html @@ -0,0 +1,466 @@ + + + + + + Intel® Threading Building Blocks. fgbzip2 sample + + + + + +

+ fgbzip2 is a parallel implementation of bzip2 block-sorting file compressor that uses tbb::flow. + The output of this application is fully compatible with bzip2 v1.0.6 or newer. +

+ + This example includes software developed by Julian R Seward. See + here for copyright information. + +
+ It exemplifies support for asynchronous capabilities in the flow graph API, in particular async_node and async_msg. +

+ This example uses C++11 lambda expressions. Specifying a compiler option such as -std=c++11 or similar might be necessary in order to build the example. + For more information please refer to the documentation for the compiler you use. +

+
+
System Requirements
+ +
+

+ For the most up to date system requirements, see the release notes. +

+
+
+ +
+
Files
+ +
+
+
fgbzip2.cpp +
Flow Graph implementation of bzip2 compressor. +
blocksort.cpp +
Block sorting machinery of libbzip2. +
bzlib.cpp +
libbzip2 top-level functions. +
bzlib.h +
Public header file for the libbzip2. +
bzlib_private.h +
Private header file for the libbzip2. +
compress.cpp +
Compression machinery of libbzip2. +
crctable.cpp +
libbzip2 table for doing CRCs. +
decompress.cpp +
Decompression machinery of libbzip2. +
huffman.cpp +
Huffman coding low-level stuff of libbzip2. +
randtable.cpp +
libbzip2 table for randomising repetitive blocks. +
Makefile +
Makefile for building the example. +
+
+
+ +
+
Directories
+ +
+
+
msvs +
Contains Microsoft* Visual Studio* workspace for building and running the example (Windows* systems only). +
xcode +
Contains Xcode* IDE workspace for building and running the example (macOS* systems only). +
+

For information about the minimum supported version of IDE, see release notes.

+
+
+ +
+
Build instructions
+ +
+

General build directions can be found here.

+
+
+ +
+
Usage
+ +
+
+
fgbzip2 -h +
Prints the help for command line options +
fgbzip2 [-b=value] [-v] [-l=value] [-a=value] [filename] +
-b block size in 100 KB chunks, [1 .. 9]
+ -v print diagnostic output to screen
+ -l used memory limit for compression algorithm with 1 MB (minimum) granularity
+ -a name of the used graph async realization - can be async_node or async_msg
+ filename name of the file to compress
+
To run a short version of this example, e.g., for use with Intel® Parallel Inspector: +
Build a debug version of the example + (see the build instructions). +
Run it with a small problem size, e.g., fgbzip2 -b=1 -a fgbzip2. +
+
+
+ +
+ Up to parent directory +
+ +
+
Legal Information
+ +
+

+ Intel and the Intel logo are trademarks of Intel Corporation in the U.S. and/or other countries. +
* Other names and brands may be claimed as the property of others. +
© 2018, Intel Corporation +

+ +

+ The "libbzip2" sources for this example is + Copyright (c) 1996-2010 Julian R Seward. + 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. The origin of this software must not be misrepresented; you must + not claim that you wrote the original software. If you use this + software in a product, an acknowledgment in the product + documentation would be appreciated but is not required. +
  3. Altered source versions must be plainly marked as such, and must + not be misrepresented as being the original software. +
  4. The name of the author may not be used to endorse or promote + products derived from this software without specific prior written + permission. +
+

+

+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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/xdl/third_party/tbb/examples/graph/fgbzip2/xcode/fgbzip2.xcodeproj/project.pbxproj b/xdl/third_party/tbb/examples/graph/fgbzip2/xcode/fgbzip2.xcodeproj/project.pbxproj new file mode 100644 index 00000000..dceabccd --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/fgbzip2/xcode/fgbzip2.xcodeproj/project.pbxproj @@ -0,0 +1,337 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + A1F593A60B8F042A00073279 /* fgbzip2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F593A50B8F042A00073279 /* fgbzip2.cpp */; }; + EAA00DB11B443FB000A83D1A /* blocksort.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EAA00D931B443FB000A83D1A /* blocksort.cpp */; }; + EAA00DB31B443FB000A83D1A /* bzlib.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EAA00D961B443FB000A83D1A /* bzlib.cpp */; }; + EAA00DB51B443FB000A83D1A /* compress.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EAA00D991B443FB000A83D1A /* compress.cpp */; }; + EAA00DB71B443FB000A83D1A /* crctable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EAA00D9B1B443FB000A83D1A /* crctable.cpp */; }; + EAA00DB91B443FB000A83D1A /* decompress.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EAA00D9D1B443FB000A83D1A /* decompress.cpp */; }; + EAA00DBB1B443FB000A83D1A /* huffman.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EAA00DA11B443FB000A83D1A /* huffman.cpp */; }; + EAA00DBE1B443FB000A83D1A /* randtable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EAA00DAB1B443FB000A83D1A /* randtable.cpp */; }; +/* End PBXBuildFile section */ + +/* Begin PBXBuildRule section */ + C3C58956218B620500DAC94C /* PBXBuildRule */ = { + isa = PBXBuildRule; + compilerSpec = com.intel.compilers.icc.latest; + fileType = sourcecode.cpp; + isEditable = 1; + outputFiles = ( + ); + script = "# Type a script or drag a script file from your workspace to insert its path.\n"; + }; +/* End PBXBuildRule section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 8DD76F690486A84900D96B5E /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 12; + dstPath = ""; + dstSubfolderSpec = 16; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 8DD76F6C0486A84900D96B5E /* fgbzip2 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = fgbzip2; sourceTree = BUILT_PRODUCTS_DIR; }; + A1F593A50B8F042A00073279 /* fgbzip2.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = fgbzip2.cpp; path = ../fgbzip2.cpp; sourceTree = SOURCE_ROOT; }; + EAA00D931B443FB000A83D1A /* blocksort.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = blocksort.cpp; path = ../blocksort.cpp; sourceTree = ""; }; + EAA00D951B443FB000A83D1A /* bzlib_private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = bzlib_private.h; path = ../bzlib_private.h; sourceTree = ""; }; + EAA00D961B443FB000A83D1A /* bzlib.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = bzlib.cpp; path = ../bzlib.cpp; sourceTree = ""; }; + EAA00D971B443FB000A83D1A /* bzlib.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = bzlib.h; path = ../bzlib.h; sourceTree = ""; }; + EAA00D991B443FB000A83D1A /* compress.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = compress.cpp; path = ../compress.cpp; sourceTree = ""; }; + EAA00D9B1B443FB000A83D1A /* crctable.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = crctable.cpp; path = ../crctable.cpp; sourceTree = ""; }; + EAA00D9D1B443FB000A83D1A /* decompress.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = decompress.cpp; path = ../decompress.cpp; sourceTree = ""; }; + EAA00DA11B443FB000A83D1A /* huffman.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = huffman.cpp; path = ../huffman.cpp; sourceTree = ""; }; + EAA00DAB1B443FB000A83D1A /* randtable.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = randtable.cpp; path = ../randtable.cpp; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 8DD76F660486A84900D96B5E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 08FB7794FE84155DC02AAC07 /* fgbzip2 */ = { + isa = PBXGroup; + children = ( + 08FB7795FE84155DC02AAC07 /* Source */, + 1AB674ADFE9D54B511CA2CBB /* Products */, + ); + name = fgbzip2; + sourceTree = ""; + }; + 08FB7795FE84155DC02AAC07 /* Source */ = { + isa = PBXGroup; + children = ( + EAA00D931B443FB000A83D1A /* blocksort.cpp */, + EAA00D951B443FB000A83D1A /* bzlib_private.h */, + EAA00D961B443FB000A83D1A /* bzlib.cpp */, + EAA00D971B443FB000A83D1A /* bzlib.h */, + EAA00D991B443FB000A83D1A /* compress.cpp */, + EAA00D9B1B443FB000A83D1A /* crctable.cpp */, + EAA00D9D1B443FB000A83D1A /* decompress.cpp */, + EAA00DA11B443FB000A83D1A /* huffman.cpp */, + EAA00DAB1B443FB000A83D1A /* randtable.cpp */, + A1F593A50B8F042A00073279 /* fgbzip2.cpp */, + ); + name = Source; + sourceTree = ""; + }; + 1AB674ADFE9D54B511CA2CBB /* Products */ = { + isa = PBXGroup; + children = ( + 8DD76F6C0486A84900D96B5E /* fgbzip2 */, + ); + name = Products; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 8DD76F620486A84900D96B5E /* fgbzip2 */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "fgbzip2" */; + buildPhases = ( + 8DD76F640486A84900D96B5E /* Sources */, + 8DD76F660486A84900D96B5E /* Frameworks */, + 8DD76F690486A84900D96B5E /* CopyFiles */, + ); + buildRules = ( + C3C58956218B620500DAC94C /* PBXBuildRule */, + ); + dependencies = ( + ); + name = fgbzip2; + productInstallPath = "$(HOME)/bin"; + productName = fgbzip2; + productReference = 8DD76F6C0486A84900D96B5E /* fgbzip2 */; + productType = "com.apple.product-type.tool"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 08FB7793FE84155DC02AAC07 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1000; + }; + buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "fgbzip2" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 1; + knownRegions = ( + en, + ); + mainGroup = 08FB7794FE84155DC02AAC07 /* fgbzip2 */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 8DD76F620486A84900D96B5E /* fgbzip2 */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + 8DD76F640486A84900D96B5E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + EAA00DB91B443FB000A83D1A /* decompress.cpp in Sources */, + EAA00DBB1B443FB000A83D1A /* huffman.cpp in Sources */, + EAA00DB31B443FB000A83D1A /* bzlib.cpp in Sources */, + EAA00DB71B443FB000A83D1A /* crctable.cpp in Sources */, + A1F593A60B8F042A00073279 /* fgbzip2.cpp in Sources */, + EAA00DB11B443FB000A83D1A /* blocksort.cpp in Sources */, + EAA00DBE1B443FB000A83D1A /* randtable.cpp in Sources */, + EAA00DB51B443FB000A83D1A /* compress.cpp in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 1DEB923208733DC60010E9CD /* Debug64 */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + HEADER_SEARCH_PATHS = "$(inherited)"; + ICC_CXX_LANG_DIALECT = "c++11"; + INSTALL_PATH = "$(HOME)/bin"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited)"; + LIBRARY_SEARCH_PATHS = "$(inherited)"; + PRODUCT_NAME = fgbzip2; + ZERO_LINK = NO; + }; + name = Debug64; + }; + 1DEB923308733DC60010E9CD /* Release64 */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_GENERATE_DEBUGGING_SYMBOLS = NO; + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + HEADER_SEARCH_PATHS = "$(inherited)"; + ICC_CXX_LANG_DIALECT = "c++11"; + INSTALL_PATH = "$(HOME)/bin"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited)"; + LIBRARY_SEARCH_PATHS = "$(inherited)"; + PRODUCT_NAME = fgbzip2; + ZERO_LINK = NO; + }; + name = Release64; + }; + 1DEB923608733DC60010E9CD /* Debug64 */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_ENABLE_CPP_RTTI = YES; + GCC_MODEL_TUNING = ""; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREPROCESSOR_DEFINITIONS = TBB_PREVIEW_FLOW_GRAPH_NODES; + GCC_VERSION = ""; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(TBBROOT)/include", + /opt/intel/tbb/include, + ); + ICC_CXX_LANG_DIALECT = "c++11"; + LD_RUNPATH_SEARCH_PATHS = "$(TBBROOT)/lib /opt/intel/tbb/lib"; + LIBRARY_SEARCH_PATHS = ( + "$(TBBROOT)/lib", + /opt/intel/tbb/lib, + ); + MACOSX_DEPLOYMENT_TARGET = 10.11; + ONLY_ACTIVE_ARCH = YES; + OTHER_LDFLAGS = ( + "-m64", + "-ltbb_debug", + ); + PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO; + SYMROOT = "/tmp/tbb-$(USER)"; + VALID_ARCHS = x86_64; + }; + name = Debug64; + }; + 1DEB923708733DC60010E9CD /* Release64 */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_ENABLE_CPP_RTTI = YES; + GCC_MODEL_TUNING = ""; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREPROCESSOR_DEFINITIONS = TBB_PREVIEW_FLOW_GRAPH_NODES; + GCC_VERSION = ""; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(TBBROOT)/include", + /opt/intel/tbb/include, + ); + ICC_CXX_LANG_DIALECT = "c++11"; + LD_RUNPATH_SEARCH_PATHS = "$(TBBROOT)/lib /opt/intel/tbb/lib"; + LIBRARY_SEARCH_PATHS = ( + "$(TBBROOT)/lib", + /opt/intel/tbb/lib, + ); + MACOSX_DEPLOYMENT_TARGET = 10.11; + ONLY_ACTIVE_ARCH = YES; + OTHER_LDFLAGS = ( + "-m64", + "-ltbb", + ); + PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO; + SYMROOT = "/tmp/tbb-$(USER)"; + VALID_ARCHS = x86_64; + }; + name = Release64; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "fgbzip2" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1DEB923208733DC60010E9CD /* Debug64 */, + 1DEB923308733DC60010E9CD /* Release64 */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug64; + }; + 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "fgbzip2" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1DEB923608733DC60010E9CD /* Debug64 */, + 1DEB923708733DC60010E9CD /* Release64 */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug64; + }; +/* End XCConfigurationList section */ + }; + rootObject = 08FB7793FE84155DC02AAC07 /* Project object */; +} diff --git a/xdl/third_party/tbb/examples/graph/index.html b/xdl/third_party/tbb/examples/graph/index.html new file mode 100644 index 00000000..095b92bc --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/index.html @@ -0,0 +1,358 @@ + + + + + + Intel® Threading Building Blocks (Intel® TBB). Samples on Intel® TBB Flow Graph feature + + + + + +

+ This directory has examples of the Intel TBB Flow Graph feature. +

+ +
+
Directories
+ +
+
+
dining_philosophers +
An implementation of dining philosophers in graph using the reserving join node. +
binpack +
A solution to the binpacking problem using a queue_node, a buffer_node and function_nodes. +
logic_sim +
A simplistic example of a collection of digital logic gates that can be easily composed into larger circuits. +
som +
A simple example of a Kohonen Self-Organizing Map using cancellation. +
fgbzip2 +
A parallel implementation of bzip2 block-sorting file compressor. +
cholesky +
Several versions of Cholesky Factorization algorithm implementation. +
stereo +
An implementation of stereo image creation from two images (anaglyph effect). +
matmult +
Matrix multiplication Gen kernel implementation with the flow graph interface. +
+
+
+
+ Up to parent directory +
+
+
Legal Information:
+ +
+

+ Intel and the Intel logo are trademarks of Intel Corporation in the U.S. and/or other countries. +
* Other names and brands may be claimed as the property of others. +
© 2018, Intel Corporation +

+
+
+ + + diff --git a/xdl/third_party/tbb/examples/graph/logic_sim/D_latch.h b/xdl/third_party/tbb/examples/graph/logic_sim/D_latch.h new file mode 100644 index 00000000..de14d9c8 --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/logic_sim/D_latch.h @@ -0,0 +1,60 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +#ifndef __TBBexample_graph_logicsim_dlatch_H +#define __TBBexample_graph_logicsim_dlatch_H 1 + +#include "basics.h" + +class D_latch : public composite_node< tuple< signal_t, signal_t >, tuple< signal_t, signal_t > > { + broadcast_node D_port; + broadcast_node E_port; + not_gate a_not; + and_gate<2> first_and; + and_gate<2> second_and; + nor_gate<2> first_nor; + nor_gate<2> second_nor; + graph& my_graph; + typedef composite_node< tuple< signal_t, signal_t >, tuple< signal_t, signal_t > > base_type; + + public: + D_latch(graph& g) : base_type(g), my_graph(g), D_port(g), E_port(g), a_not(g), first_and(g), second_and(g), + first_nor(g), second_nor(g) + { + make_edge(D_port, input_port<0>(a_not)); + make_edge(D_port, input_port<1>(second_and)); + make_edge(E_port, input_port<1>(first_and)); + make_edge(E_port, input_port<0>(second_and)); + make_edge(a_not, input_port<0>(first_and)); + make_edge(first_and, input_port<0>(first_nor)); + make_edge(second_and, input_port<1>(second_nor)); + make_edge(first_nor, input_port<0>(second_nor)); + make_edge(second_nor, input_port<1>(first_nor)); + + base_type::input_ports_type input_tuple(D_port, E_port); + base_type::output_ports_type output_tuple(output_port<0>(first_nor), output_port<0>(second_nor)); + + base_type::set_external_ports(input_tuple, output_tuple); + base_type::add_visible_nodes(D_port, E_port, a_not, first_and, second_and, first_nor, second_nor); + } + ~D_latch() {} +}; + +#endif /* __TBBexample_graph_logicsim_dlatch_H */ diff --git a/xdl/third_party/tbb/examples/graph/logic_sim/Makefile b/xdl/third_party/tbb/examples/graph/logic_sim/Makefile new file mode 100644 index 00000000..0a7d6f6c --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/logic_sim/Makefile @@ -0,0 +1,61 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +# GNU Makefile that builds and runs example. +run_cmd= +PROG=test_all +ARGS=4 +PERF_RUN_ARGS=auto silent + +# The C++ compiler +ifneq (,$(shell which icc 2>/dev/null)) +CXX=icc +endif # which icc + +ifeq ($(shell uname), Linux) +ifeq ($(target), android) +LIBS+= --sysroot=$(SYSROOT) +run_cmd=../../common/android.linux.launcher.sh +else +LIBS+= -lrt +endif +else ifeq ($(shell uname), Darwin) +override CXXFLAGS += -Wl,-rpath,$(TBBROOT)/lib +endif + +all: release test + +release: *.cpp + $(CXX) -O2 -DNDEBUG $(CXXFLAGS) -o $(PROG) $(PROG).cpp -std=c++0x -ltbb $(LIBS) + +debug: *.cpp + $(CXX) -O0 -g -DTBB_USE_DEBUG $(CXXFLAGS) -o $(PROG) $(PROG).cpp -std=c++0x -ltbb_debug $(LIBS) + +profile: override CXXFLAGS += -DTBB_USE_THREADING_TOOLS -g +profile: release + +clean: + $(RM) $(PROG) *.o *.d + +test: + $(run_cmd) ./$(PROG) $(ARGS) + +perf_build: release + +perf_run: + $(run_cmd) ./$(PROG) $(PERF_RUN_ARGS) diff --git a/xdl/third_party/tbb/examples/graph/logic_sim/Makefile.windows b/xdl/third_party/tbb/examples/graph/logic_sim/Makefile.windows new file mode 100644 index 00000000..b7d25e13 --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/logic_sim/Makefile.windows @@ -0,0 +1,56 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +# Common Makefile that builds and runs example. +PROG=test_all +ARGS=4 +PERF_RUN_ARGS=auto silent + +# Try to find icl.exe +CXX1 = $(TBB_CXX)- +CXX2 = $(CXX1:icl.exe-=icl.exe) +CXX = $(CXX2:-=cl.exe) + +# The C++ compiler options +MYCXXFLAGS = /TP /EHsc /W3 /nologo /D _CONSOLE /D _MBCS /D WIN32 /D _CRT_SECURE_NO_DEPRECATE $(CXXFLAGS) +MYLDFLAGS =/INCREMENTAL:NO /NOLOGO /DEBUG /FIXED:NO $(LDFLAGS) + +all: release test + +release: *.cpp + $(CXX) $(PROG).cpp /MD /O2 /D NDEBUG $(MYCXXFLAGS) /link tbb.lib $(LIBS) $(MYLDFLAGS) /OUT:$(PROG).exe + +debug: *.cpp + $(CXX) $(PROG).cpp /MDd /Od /Zi /D TBB_USE_DEBUG /D _DEBUG $(MYCXXFLAGS) /link tbb_debug.lib $(LIBS) $(MYLDFLAGS) /OUT:$(PROG).exe + +profile: *.cpp + $(CXX) $(PROG).cpp /MD /O2 /Zi /D NDEBUG $(MYCXXFLAGS) /D TBB_USE_THREADING_TOOLS /link tbb.lib $(LIBS) $(MYLDFLAGS) /OUT:$(PROG).exe + +clean: + @cmd.exe /C del $(PROG).exe *.obj *.?db *.manifest + +test: + $(PROG) $(ARGS) + +compiler_check: + @$(CXX) >nul 2>&1 || echo "$(CXX) command not found. Check if CXX=$(CXX) is set properly" + +perf_build: release + +perf_run: + $(PROG) $(PERF_RUN_ARGS) diff --git a/xdl/third_party/tbb/examples/graph/logic_sim/basics.h b/xdl/third_party/tbb/examples/graph/logic_sim/basics.h new file mode 100644 index 00000000..527ca92f --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/logic_sim/basics.h @@ -0,0 +1,560 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +#ifndef __TBBexample_graph_logicsim_basics_H +#define __TBBexample_graph_logicsim_basics_H 1 + +#include +#include +#include "tbb/atomic.h" +#include "tbb/task_scheduler_init.h" +#include "tbb/tick_count.h" +#include "tbb/flow_graph.h" +#include "../../common/utility/utility.h" + +#ifndef _WIN32 +#include +#include + +void rt_sleep(int msec) { + usleep(msec*1000); +} + +#else //_WIN32 + +#undef OLDUNIXTIME +#undef STDTIME + +#include + +void rt_sleep(int msec) { + Sleep(msec); +} +#endif /* _WIN32 */ + +using namespace std; +using namespace tbb; +using namespace tbb::flow; + +typedef enum { low=0, high, undefined } signal_t; + +template class gate; + +template<> +class gate<1> : public composite_node< tuple< signal_t >, tuple< signal_t > > { +protected: + typedef indexer_node input_port_t; + typedef multifunction_node< input_port_t::output_type, tuple > gate_fn_t; + typedef gate_fn_t::output_ports_type ports_type; + typedef composite_node< tuple< signal_t >, tuple< signal_t > > base_type; +public: + template + gate(graph& g, Body b) : base_type(g), my_graph(g), in_ports(g), gate_fn(g, 1, b) { + make_edge(in_ports, gate_fn); + base_type::input_ports_type input_tuple(input_port<0>(in_ports)); + base_type::output_ports_type output_tuple(output_port<0>(gate_fn)); + base_type::set_external_ports(input_tuple, output_tuple); + base_type::add_visible_nodes(in_ports, gate_fn); + } + virtual ~gate() {} + gate& operator=(const gate& src) { return *this; } +protected: + graph& my_graph; +private: + input_port_t in_ports; + gate_fn_t gate_fn; +}; + +template<> +class gate<2> : public composite_node< tuple< signal_t, signal_t >, tuple< signal_t > > { +protected: + typedef indexer_node input_port_t; + typedef multifunction_node< input_port_t::output_type, tuple > gate_fn_t; + typedef gate_fn_t::output_ports_type ports_type; + typedef composite_node< tuple< signal_t, signal_t >, tuple< signal_t > > base_type; +public: + template + gate(graph& g, Body b) : base_type(g), my_graph(g), in_ports(g), gate_fn(g, 1, b) { + make_edge(in_ports, gate_fn); + base_type::input_ports_type input_tuple(input_port<0>(in_ports),input_port<1>(in_ports)); + base_type::output_ports_type output_tuple(output_port<0>(gate_fn)); + base_type::set_external_ports(input_tuple, output_tuple); + base_type::add_visible_nodes(in_ports, gate_fn); + } + virtual ~gate() {} + gate& operator=(const gate& src) { return *this; } +protected: + graph& my_graph; +private: + input_port_t in_ports; + gate_fn_t gate_fn; +}; + +template<> +class gate<3> : public composite_node< tuple< signal_t, signal_t, signal_t >, tuple< signal_t > > { +protected: + typedef indexer_node input_port_t; + typedef multifunction_node< input_port_t::output_type, tuple > gate_fn_t; + typedef gate_fn_t::output_ports_type ports_type; + typedef composite_node< tuple< signal_t, signal_t, signal_t >, tuple< signal_t > > base_type; +public: + template + gate(graph& g, Body b) : base_type(g), my_graph(g), in_ports(g), gate_fn(g, 1, b) { + make_edge(in_ports, gate_fn); + base_type::input_ports_type input_tuple(input_port<0>(in_ports),input_port<1>(in_ports),input_port<2>(in_ports)); + base_type::output_ports_type output_tuple(output_port<0>(gate_fn)); + base_type::set_external_ports(input_tuple, output_tuple); + base_type::add_visible_nodes(in_ports, gate_fn); + } + virtual ~gate() {} + gate& operator=(const gate& src) { return *this; } +protected: + graph& my_graph; +private: + input_port_t in_ports; + gate_fn_t gate_fn; +}; + +template<> +class gate<4> : public composite_node< tuple< signal_t, signal_t, signal_t, signal_t >, tuple< signal_t > > { +protected: + typedef indexer_node input_port_t; + typedef multifunction_node< input_port_t::output_type, tuple > gate_fn_t; + typedef gate_fn_t::output_ports_type ports_type; + typedef composite_node< tuple< signal_t, signal_t, signal_t, signal_t >, tuple< signal_t > > base_type; +public: + template + gate(graph& g, Body b) : base_type(g), my_graph(g), in_ports(g), gate_fn(g, 1, b) { + make_edge(in_ports, gate_fn); + base_type::input_ports_type input_tuple(input_port<0>(in_ports),input_port<1>(in_ports),input_port<2>(in_ports), input_port<3>(in_ports)); + base_type::output_ports_type output_tuple(output_port<0>(gate_fn)); + base_type::set_external_ports(input_tuple, output_tuple); + base_type::add_visible_nodes(in_ports, gate_fn); + } + virtual ~gate() {} + gate& operator=(const gate& src) { return *this; } +protected: + graph& my_graph; +private: + input_port_t in_ports; + gate_fn_t gate_fn; +}; + +// Input devices +class steady_signal { + graph& my_graph; + signal_t init_signal; + write_once_node signal_node; + public: + steady_signal(graph& g, signal_t v) : + my_graph(g), init_signal(v), signal_node(g) {} + steady_signal(const steady_signal& src) : + my_graph(src.my_graph), init_signal(src.init_signal), + signal_node(src.my_graph) {} + ~steady_signal() {} + // Assignment is ignored + steady_signal& operator=(const steady_signal& src) { return *this; } + sender& get_out() { return signal_node; } + void activate() { signal_node.try_put(init_signal); } +}; + +class pulse { + class clock_body { + size_t& ms; + int& reps; + signal_t val; + public: + clock_body(size_t& _ms, int& _reps) : ms(_ms), reps(_reps), val(low) {} + bool operator()(signal_t& out) { + rt_sleep((int)ms); + if (reps>0) --reps; + if (val==low) val = high; + else val = low; + out = val; + return reps>0 || reps == -1; + } + }; + graph& my_graph; + size_t ms, init_ms; + int reps, init_reps; + source_node clock_node; + +public: + pulse(graph& g, size_t _ms=1000, int _reps=-1) : + my_graph(g), ms(_ms), init_ms(_ms), reps(_reps), init_reps(_reps), + clock_node(g, clock_body(ms, reps), false) + {} + pulse(const pulse& src) : + my_graph(src.my_graph), ms(src.init_ms), init_ms(src.init_ms), + reps(src.init_reps), init_reps(src.init_reps), + clock_node(src.my_graph, clock_body(ms, reps), false) + {} + ~pulse() {} + // Assignment changes the behavior of LHS to that of the RHS, but doesn't change owning graph + pulse& operator=(const pulse& src) { + ms = src.ms; init_ms = src.init_ms; reps = src.reps; init_reps = src.init_reps; + return *this; + } + sender& get_out() { return clock_node; } + void activate() { clock_node.activate(); } + void reset() { reps = init_reps; } +}; + +class push_button { + graph& my_graph; + overwrite_node push_button_node; + public: + push_button(graph& g) : my_graph(g), push_button_node(g) { + push_button_node.try_put(low); + } + push_button(const push_button& src) : + my_graph(src.my_graph), push_button_node(src.my_graph) { + push_button_node.try_put(low); + } + ~push_button() {} + // Assignment is ignored + push_button& operator=(const push_button& src) { return *this; } + sender& get_out() { return push_button_node; } + void press() { push_button_node.try_put(high); } + void release() { push_button_node.try_put(low); } +}; + +class toggle { + graph& my_graph; + signal_t state; + overwrite_node toggle_node; + public: + toggle(graph& g) : my_graph(g), state(undefined), toggle_node(g) {} + toggle(const toggle& src) : my_graph(src.my_graph), state(undefined), + toggle_node(src.my_graph) {} + ~toggle() {} + // Assignment ignored + toggle& operator=(const toggle& src) { return *this; } + sender& get_out() { return toggle_node; } + void flip() { + if (state==high) state = low; + else state = high; + toggle_node.try_put(state); + } + void activate() { + state = low; + toggle_node.try_put(state); + } +}; + +// Basic gates +class buffer : public gate<1> { + using gate<1>::my_graph; + typedef gate<1>::ports_type ports_type; + class buffer_body { + signal_t state; + bool touched; + public: + buffer_body() : state(undefined), touched(false) {} + void operator()(const input_port_t::output_type &v, ports_type& p) { + if (!touched || state != cast_to(v)) { + state = cast_to(v); + tbb::flow::get<0>(p).try_put(state); + touched = true; + } + } + }; +public: + buffer(graph& g) : gate<1>(g, buffer_body()) {} + buffer(const buffer& src) : gate<1>(src.my_graph, buffer_body()) {} + ~buffer() {} +}; + +class not_gate : public gate<1> { + using gate<1>::my_graph; + typedef gate<1>::ports_type ports_type; + class not_body { + signal_t port; + bool touched; + public: + not_body() : port(undefined), touched(false) {} + void operator()(const input_port_t::output_type &v, ports_type& p) { + if (!touched || port != cast_to(v)) { + port = cast_to(v); + signal_t state = low; + if (port==low) state = high; + tbb::flow::get<0>(p).try_put(state); + touched = true; + } + } + }; + public: + not_gate(graph& g) : gate<1>(g, not_body()) {} + not_gate(const not_gate& src) : gate<1>(src.my_graph, not_body()) {} + ~not_gate() {} +}; + +template +class and_gate : public gate { + using gate::my_graph; + typedef typename gate::ports_type ports_type; + typedef typename gate::input_port_t::output_type from_input; + class and_body { + signal_t *ports; + signal_t state; + bool touched; + public: + and_body() : state(undefined), touched(false) { + ports = new signal_t[N]; + for (int i=0; i(v); + signal_t new_state=high; + size_t i=0; + while (i(p).try_put(state); + touched = true; + } + } + }; + public: + and_gate(graph& g) : gate(g, and_body()) {} + and_gate(const and_gate& src) : gate(src.my_graph, and_body()) {} + ~and_gate() {} +}; + +template +class or_gate : public gate { + using gate::my_graph; + typedef typename gate::ports_type ports_type; + typedef typename gate::input_port_t::output_type from_input; + class or_body { + signal_t *ports; + signal_t state; + bool touched; + public: + or_body() : state(undefined), touched(false) { + ports = new signal_t[N]; + for (int i=0; i(v); + signal_t new_state=low; + size_t i=0; + while (i(p).try_put(state); + touched = true; + } + } + }; +public: + or_gate(graph& g) : gate(g, or_body()) {} + or_gate(const or_gate& src) : gate(src.my_graph, or_body()) {} + ~or_gate() {} +}; + +template +class xor_gate : public gate { + using gate::my_graph; + typedef typename gate::ports_type ports_type; + typedef typename gate::input_port_t input_port_t; + class xor_body { + signal_t *ports; + signal_t state; + bool touched; + public: + xor_body() : state(undefined), touched(false) { + ports = new signal_t[N]; + for (int i=0; i(v); + signal_t new_state=low; + size_t i=0, highs=0; + while (i 0) { new_state = low; break; } + else if (ports[i] == high ) { ++highs; } + ++i; + } + if (!touched || state != new_state) { + state = new_state; + tbb::flow::get<0>(p).try_put(state); + touched = true; + } + } + }; + public: + xor_gate(graph& g) : gate(g, xor_body()) {} + xor_gate(const xor_gate& src) : gate(src.my_graph, xor_body()) {} + ~xor_gate() {} +}; + +template +class nor_gate : public gate { + using gate::my_graph; + typedef typename gate::ports_type ports_type; + typedef typename gate::input_port_t input_port_t; + class nor_body { + signal_t *ports; + signal_t state; + bool touched; + public: + nor_body() : state(undefined), touched(false) { + ports = new signal_t[N]; + for (int i=0; i(v); + signal_t new_state=low; + size_t i=0; + while (i(p).try_put(state); + touched = true; + } + } + }; + public: + nor_gate(graph& g) : gate(g, nor_body()) {} + nor_gate(const nor_gate& src) : gate(src.my_graph, nor_body()) {} + ~nor_gate() {} +}; + +// Output devices +class led { + class led_body { + signal_t &state; + string &label; + bool report_changes; + bool touched; + public: + led_body(signal_t &s, string &l, bool r) : + state(s), label(l), report_changes(r), touched(false) + {} + continue_msg operator()(signal_t b) { + if (!touched || b!=state) { + state = b; + if (state != undefined && report_changes) { + if (state) printf("%s: (*)\n", label.c_str()); + else printf("%s: ( )\n", label.c_str()); + } + touched = false; + } + return continue_msg(); + } + }; + graph& my_graph; + string label; + signal_t state; + bool report_changes; + function_node led_node; + public: + led(graph& g, string l, bool rc=false) : my_graph(g), label(l), state(undefined), + report_changes(rc), + led_node(g, 1, led_body(state, label, report_changes)) + {} + led(const led& src) : my_graph(src.my_graph), label(src.label), state(undefined), + report_changes(src.report_changes), + led_node(src.my_graph, 1, led_body(state, label, report_changes)) + {} + ~led() {} + // Assignment changes the behavior of LHS to that of the RHS, but doesn't change owning graph + // state is set to undefined so that next signal changes it + led& operator=(const led& src) { + label = src.label; state = undefined; report_changes = src.report_changes; + return *this; + } + receiver& get_in() { return led_node; } + void display() { + if (state == high) printf("%s: (*)\n", label.c_str()); + else if (state == low) printf("%s: ( )\n", label.c_str()); + else printf("%s: (u)\n", label.c_str()); + } + signal_t get_value() { return state; } +}; + +class digit : public gate<4> { + using gate<4>::my_graph; + typedef gate<4>::ports_type ports_type; + typedef gate<4>::input_port_t input_port_t; + class digit_body { + signal_t ports[4]; + static const int N = 4; + unsigned int &state; + string &label; + bool& report_changes; + public: + digit_body(unsigned int &s, string &l, bool& r) : state(s), label(l), report_changes(r) { + for (int i=0; i(v); + if (ports[0] == high) ++new_state; + if (ports[1] == high) new_state += 2; + if (ports[2] == high) new_state += 4; + if (ports[3] == high) new_state += 8; + if (state != new_state) { + state = new_state; + if (report_changes) { + printf("%s: %x\n", label.c_str(), state); + } + } + } + }; + string label; + unsigned int state; + bool report_changes; + public: + digit(graph& g, string l, bool rc=false) : + gate<4>(g, digit_body(state, label, report_changes)), + label(l), state(0), report_changes(rc) {} + digit(const digit& src) : + gate<4>(src.my_graph, digit_body(state, label, report_changes)), + label(src.label), state(0), report_changes(src.report_changes) {} + ~digit() {} + // Assignment changes the behavior of LHS to that of the RHS, but doesn't change owning graph. + // state is reset as in constructors + digit& operator=(const digit& src) { + label = src.label; state = 0; report_changes = src.report_changes; + return *this; + } + void display() { printf("%s: %x\n", label.c_str(), state); } + unsigned int get_value() { return state; } +}; + +#endif /* __TBBexample_graph_logicsim_basics_H */ diff --git a/xdl/third_party/tbb/examples/graph/logic_sim/four_bit_adder.h b/xdl/third_party/tbb/examples/graph/logic_sim/four_bit_adder.h new file mode 100644 index 00000000..0818eb4d --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/logic_sim/four_bit_adder.h @@ -0,0 +1,62 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +#ifndef __TBBexample_graph_logicsim_fba_H +#define __TBBexample_graph_logicsim_fba_H 1 + +#include "one_bit_adder.h" + +typedef composite_node< tuple< signal_t, signal_t, signal_t, signal_t, signal_t, signal_t, signal_t, signal_t, signal_t >, + tuple< signal_t, signal_t, signal_t, signal_t, signal_t > > fba_base_type; + +class four_bit_adder : public fba_base_type { + graph& my_graph; + std::vector four_adders; + +public: + four_bit_adder(graph& g) : fba_base_type(g), my_graph(g), four_adders(4, one_bit_adder(g)) { + make_connections(); + set_up_composite(); + } + four_bit_adder(const four_bit_adder& src) : + fba_base_type(src.my_graph), my_graph(src.my_graph), four_adders(4, one_bit_adder(src.my_graph)) + { + make_connections(); + set_up_composite(); + } + ~four_bit_adder() {} + +private: + void make_connections() { + make_edge(output_port<1>(four_adders[0]), input_port<0>(four_adders[1])); + make_edge(output_port<1>(four_adders[1]), input_port<0>(four_adders[2])); + make_edge(output_port<1>(four_adders[2]), input_port<0>(four_adders[3])); + } + void set_up_composite() { + + fba_base_type::input_ports_type input_tuple(input_port<0>(four_adders[0]/*CI*/), input_port<1>(four_adders[0]), input_port<2>(four_adders[0]), input_port<1>(four_adders[1]), input_port<2>(four_adders[1]), input_port<1>(four_adders[2]), input_port<2>(four_adders[2]), input_port<1>(four_adders[3]), input_port<2>(four_adders[3])); + + fba_base_type::output_ports_type output_tuple(output_port<0>(four_adders[0]), output_port<0>(four_adders[1]), output_port<0>(four_adders[2]), output_port<0>(four_adders[3]),output_port<1>(four_adders[3]/*CO*/)); + + fba_base_type::set_external_ports(input_tuple, output_tuple); + } +}; + +#endif /* __TBBexample_graph_logicsim_fba_H */ diff --git a/xdl/third_party/tbb/examples/graph/logic_sim/msvs/logic_sim.sln b/xdl/third_party/tbb/examples/graph/logic_sim/msvs/logic_sim.sln new file mode 100644 index 00000000..04ccab98 --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/logic_sim/msvs/logic_sim.sln @@ -0,0 +1,28 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.40629.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "logic_sim", "logic_sim.vcxproj", "{6E9B1702-78E0-4D64-B771-8B274D963B58}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {6E9B1702-78E0-4D64-B771-8B274D963B58}.Debug|Win32.ActiveCfg = Debug|Win32 + {6E9B1702-78E0-4D64-B771-8B274D963B58}.Debug|Win32.Build.0 = Debug|Win32 + {6E9B1702-78E0-4D64-B771-8B274D963B58}.Debug|x64.ActiveCfg = Debug|x64 + {6E9B1702-78E0-4D64-B771-8B274D963B58}.Debug|x64.Build.0 = Debug|x64 + {6E9B1702-78E0-4D64-B771-8B274D963B58}.Release|Win32.ActiveCfg = Release|Win32 + {6E9B1702-78E0-4D64-B771-8B274D963B58}.Release|Win32.Build.0 = Release|Win32 + {6E9B1702-78E0-4D64-B771-8B274D963B58}.Release|x64.ActiveCfg = Release|x64 + {6E9B1702-78E0-4D64-B771-8B274D963B58}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/xdl/third_party/tbb/examples/graph/logic_sim/msvs/logic_sim.vcxproj b/xdl/third_party/tbb/examples/graph/logic_sim/msvs/logic_sim.vcxproj new file mode 100644 index 00000000..922e86b2 --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/logic_sim/msvs/logic_sim.vcxproj @@ -0,0 +1,201 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + logic_sim + {6E9B1702-78E0-4D64-B771-8B274D963B58} + test_all + Win32Proj + + + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.40219.1 + $(TEMP)\tbb_examples\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Configuration)\ + false + $(TEMP)\tbb_examples\$(Platform)\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Platform)\$(Configuration)\ + false + $(TEMP)\tbb_examples\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Configuration)\ + false + $(TEMP)\tbb_examples\$(Platform)\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Platform)\$(Configuration)\ + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG;%(PreprocessorDefinitions) + MultiThreadedDebugDLL + + + ProgramDatabase + + + tbb_debug.lib;tbbmalloc_debug.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc12;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc12;%(AdditionalLibraryDirectories) + true + Console + MachineX86 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 debug "$(OutDir)" + + + + + X64 + + + Disabled + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG;%(PreprocessorDefinitions) + MultiThreadedDebugDLL + + + ProgramDatabase + + + tbb_debug.lib;tbbmalloc_debug.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc12;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc12;%(AdditionalLibraryDirectories) + true + Console + MachineX64 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 debug "$(OutDir)" + + + + + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + + + ProgramDatabase + + + tbb.lib;tbbmalloc.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc12;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc12;%(AdditionalLibraryDirectories) + true + Console + true + true + MachineX86 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 release "$(OutDir)" + + + + + X64 + + + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + + + ProgramDatabase + + + tbb.lib;tbbmalloc.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc12;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc12;%(AdditionalLibraryDirectories) + true + Console + true + true + MachineX64 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 release "$(OutDir)" + + + + + + + + + + + + \ No newline at end of file diff --git a/xdl/third_party/tbb/examples/graph/logic_sim/one_bit_adder.h b/xdl/third_party/tbb/examples/graph/logic_sim/one_bit_adder.h new file mode 100644 index 00000000..4ba65a0b --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/logic_sim/one_bit_adder.h @@ -0,0 +1,103 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +#ifndef __TBBexample_graph_logicsim_oba_H +#define __TBBexample_graph_logicsim_oba_H 1 + +namespace P { + //input ports + const int CI = 0; + const int A0 = 1; + const int B0 = 2; + const int A1 = 3; + const int B1 = 4; + const int A2 = 5; + const int B2 = 6; + const int A3 = 7; + const int B3 = 8; + + //output_ports + const int S0 = 0; + const int S1 = 1; + const int S2 = 2; + const int S3 = 3; + +#if USE_TWO_BIT_FULL_ADDER + const int CO = 2; +#else + const int CO = 4; +#endif +} + +#include "basics.h" + +class one_bit_adder : public composite_node< tuple< signal_t, signal_t, signal_t >, tuple< signal_t, signal_t > > { + broadcast_node A_port; + broadcast_node B_port; + broadcast_node CI_port; + xor_gate<2> FirstXOR; + xor_gate<2> SecondXOR; + and_gate<2> FirstAND; + and_gate<2> SecondAND; + or_gate<2> FirstOR; + graph& my_graph; + typedef composite_node< tuple< signal_t, signal_t, signal_t >, tuple< signal_t, signal_t > > base_type; + +public: + one_bit_adder(graph& g) : base_type(g), my_graph(g), A_port(g), B_port(g), CI_port(g), FirstXOR(g), + SecondXOR(g), FirstAND(g), SecondAND(g), FirstOR(g) { + make_connections(); + set_up_composite(); + } + one_bit_adder(const one_bit_adder& src) : + base_type(src.my_graph), my_graph(src.my_graph), A_port(src.my_graph), B_port(src.my_graph), + CI_port(src.my_graph), FirstXOR(src.my_graph), SecondXOR(src.my_graph), + FirstAND(src.my_graph), SecondAND(src.my_graph), FirstOR(src.my_graph) + { + make_connections(); + set_up_composite(); + } + + ~one_bit_adder() {} + +private: + void make_connections() { + + make_edge(A_port, input_port<0>(FirstXOR)); + make_edge(A_port, input_port<0>(FirstAND)); + make_edge(B_port, input_port<1>(FirstXOR)); + make_edge(B_port, input_port<1>(FirstAND)); + make_edge(CI_port, input_port<1>(SecondXOR)); + make_edge(CI_port, input_port<1>(SecondAND)); + make_edge(FirstXOR, input_port<0>(SecondXOR)); + make_edge(FirstXOR, input_port<0>(SecondAND)); + make_edge(SecondAND, input_port<0>(FirstOR)); + make_edge(FirstAND, input_port<1>(FirstOR)); + } + + void set_up_composite() { + base_type::input_ports_type input_tuple(CI_port, A_port, B_port); + base_type::output_ports_type output_tuple(output_port<0>(SecondXOR), output_port<0>(FirstOR)); + base_type::set_external_ports( input_tuple, output_tuple); + base_type::add_visible_nodes(A_port, B_port, CI_port, FirstXOR, SecondXOR, FirstAND, SecondAND, FirstOR ); + } +}; + +#endif /* __TBBexample_graph_logicsim_oba_H */ diff --git a/xdl/third_party/tbb/examples/graph/logic_sim/readme.html b/xdl/third_party/tbb/examples/graph/logic_sim/readme.html new file mode 100644 index 00000000..23947d7d --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/logic_sim/readme.html @@ -0,0 +1,406 @@ + + + + + + Intel® Threading Building Blocks. logic_sim sample + + + + + +

+ This directory contains a simple tbb::flow example that performs + simplistic digital logic simulations with basic logic gates that can + be easily composed to create more interesting circuits. It + exemplifies the multifunction_node and the indexer_node CPF, among others.

+ +
+
System Requirements
+ +
+

+ For the most up to date system requirements, see the release notes. +

+
+
+ +
+
Files
+ +
+
+
basics.h +
Several I/O devices and basic gates. +
one_bit_adder.h +
A one-bit full adder composed of basic gates. +
four_bit_adder.h +
A four-bit full adder composed of one-bit adders. +
D_latch.h +
A D-latch composed of basic gates. +
test_all.cpp +
A simple test program that exercises the code in the headers. +
Makefile +
Makefile for building the example. +
+
+
+ +
+
Directories
+ +
+
+
msvs +
Contains Microsoft* Visual Studio* workspace for building and running the example with the Intel® C++ Compiler (Windows* systems only). +
+

For information about the minimum supported version of IDE, see release notes.

+
+
+ +
+
Build instructions
+ +
+

General build directions can be found here.

+
+
+ +
+
Usage
+ +
+
+
test_all -h +
Prints the help for command line options +
test_all [#threads=value] [verbose] [silent] [#threads] +
#threads is the number of threads to use; a range of the form low[:high] where low and optional high are non-negative integers, or 'auto' for a platform-specific default number.
+ verbose print diagnostic output to screen
+ silent limits output to timing info; overrides verbose
+
To run a short version of this example, e.g., for use with Intel® Parallel Inspector: +
Build a debug version of the example + (see the build instructions). +
Run it with the desired number of threads, e.g., test_all 4. +
+
+
+ +
+ Up to parent directory +
+
+
Legal Information
+ +
+

+ Intel and the Intel logo are trademarks of Intel Corporation in the U.S. and/or other countries. +
* Other names and brands may be claimed as the property of others. +
© 2018, Intel Corporation +

+
+
+ + + diff --git a/xdl/third_party/tbb/examples/graph/logic_sim/test_all.cpp b/xdl/third_party/tbb/examples/graph/logic_sim/test_all.cpp new file mode 100644 index 00000000..0e8574dd --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/logic_sim/test_all.cpp @@ -0,0 +1,646 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +#include "tbb/tbb_config.h" +#include + +#include "../../common/utility/utility.h" + +#if __TBB_FLOW_GRAPH_CPP11_FEATURES + +#if _MSC_VER +#pragma warning (disable: 4503) // Suppress "decorated name length exceeded, name was truncated" warning +#endif + +#define USE_TWO_BIT_FULL_ADDER 1 + +#include "basics.h" +#include "one_bit_adder.h" +#if USE_TWO_BIT_FULL_ADDER +#include "two_bit_adder.h" +#else +#include "four_bit_adder.h" +#endif +#include "D_latch.h" +#include + +// User-specified globals with default values +bool verbose = false; // prints bin details and other diagnostics to screen +bool silent = false; // suppress all output except for time + +int get_default_num_threads() { + static int threads = 0; + if (threads == 0) + threads = tbb::task_scheduler_init::default_num_threads(); + return threads; +} + +#endif // __TBB_FLOW_GRAPH_CPP11_FEATURES + +int main(int argc, char *argv[]) { +#if __TBB_FLOW_GRAPH_CPP11_FEATURES + try { + utility::thread_number_range threads(get_default_num_threads); + utility::parse_cli_arguments(argc, argv, + utility::cli_argument_pack() + //"-h" option for displaying help is present implicitly + .positional_arg(threads,"#threads",utility::thread_number_range_desc) + .arg(verbose,"verbose"," print diagnostic output to screen") + .arg(silent,"silent"," limits output to timing info; overrides verbose") + ); + + if (silent) verbose = false; // make silent override verbose + + tick_count start = tick_count::now(); + for(int p = threads.first; p <= threads.last; p = threads.step(p)) { + task_scheduler_init init(p); + if (!silent) cout << "graph test running on " << p << " threads.\n"; + + graph g; + + { // test buffer: 0, 1 + buffer b(g); + toggle input(g); + led output(g, "OUTPUT", false); // false means we will explicitly call display to see LED + + make_edge(input.get_out(), input_port<0>(b)); + make_edge(output_port<0>(b), output.get_in()); + + if (!silent) printf("Testing buffer...\n"); + input.activate(); // 0 + g.wait_for_all(); + if (!silent) output.display(); + assert(output.get_value() == low); + input.flip(); // 1 + g.wait_for_all(); + if (!silent) output.display(); + assert(output.get_value() == high); + } + + { // test not_gate: 0, 1 + not_gate n(g); + toggle input(g); + led output(g, "OUTPUT", false); + + make_edge(input.get_out(), input_port<0>(n)); + make_edge(output_port<0>(n), output.get_in()); + + if (!silent) printf("Testing not_gate...\n"); + input.activate(); // 0 + g.wait_for_all(); + if (!silent) output.display(); + assert(output.get_value() == high); + input.flip(); // 1 + g.wait_for_all(); + if (!silent) output.display(); + assert(output.get_value() == low); + } + + { // test two-input and_gate: 00, 01, 10, 11 + and_gate<2> a(g); + toggle input0(g); + toggle input1(g); + led output(g, "OUTPUT", false); + + make_edge(input0.get_out(), input_port<0>(a)); + make_edge(input1.get_out(), input_port<1>(a)); + make_edge(output_port<0>(a), output.get_in()); + + if (!silent) printf("Testing and_gate...\n"); + input1.activate(); input0.activate(); // 0 0 + g.wait_for_all(); + if (!silent) output.display(); + assert(output.get_value() == low); + input0.flip(); // 0 1 + g.wait_for_all(); + if (!silent) output.display(); + assert(output.get_value() == low); + input1.flip(); input0.flip(); // 1 0 + g.wait_for_all(); + if (!silent) output.display(); + assert(output.get_value() == low); + input0.flip(); // 1 1 + g.wait_for_all(); + if (!silent) output.display(); + assert(output.get_value() == high); + } + + { // test three-input or_gate: 000, 001, 010, 100, 011, 101, 110, 111 + or_gate<3> o(g); + toggle input0(g); + toggle input1(g); + toggle input2(g); + led output(g, "OUTPUT", false); + + make_edge(input0.get_out(), input_port<0>(o)); + make_edge(input1.get_out(), input_port<1>(o)); + make_edge(input2.get_out(), input_port<2>(o)); + make_edge(output_port<0>(o), output.get_in()); + + if (!silent) printf("Testing or_gate...\n"); + input2.activate(); input1.activate(); input0.activate(); // 0 0 0 + g.wait_for_all(); + if (!silent) output.display(); + assert(output.get_value() == low); + input0.flip(); // 0 0 1 + g.wait_for_all(); + if (!silent) output.display(); + assert(output.get_value() == high); + input1.flip(); input0.flip(); // 0 1 0 + g.wait_for_all(); + if (!silent) output.display(); + assert(output.get_value() == high); + input2.flip(); input1.flip(); // 1 0 0 + g.wait_for_all(); + if (!silent) output.display(); + assert(output.get_value() == high); + input2.flip(); input1.flip(); input0.flip(); // 0 1 1 + g.wait_for_all(); + if (!silent) output.display(); + assert(output.get_value() == high); + input2.flip(); input1.flip(); // 1 0 1 + g.wait_for_all(); + if (!silent) output.display(); + assert(output.get_value() == high); + input1.flip(); input0.flip(); // 1 1 0 + g.wait_for_all(); + if (!silent) output.display(); + assert(output.get_value() == high); + input0.flip(); // 1 1 1 + g.wait_for_all(); + if (!silent) output.display(); + assert(output.get_value() == high); + } + + { // test two-input xor_gate: 00, 01, 10, 11 + xor_gate<2> x(g); + toggle input0(g); + toggle input1(g); + led output(g, "OUTPUT", false); + + make_edge(input0.get_out(), input_port<0>(x)); + make_edge(input1.get_out(), input_port<1>(x)); + make_edge(output_port<0>(x), output.get_in()); + + if (!silent) printf("Testing xor_gate...\n"); + input1.activate(); input0.activate(); // 0 0 + g.wait_for_all(); + if (!silent) output.display(); + assert(output.get_value() == low); + input0.flip(); // 0 1 + g.wait_for_all(); + if (!silent) output.display(); + assert(output.get_value() == high); + input1.flip(); input0.flip(); // 1 0 + g.wait_for_all(); + if (!silent) output.display(); + assert(output.get_value() == high); + input0.flip(); // 1 1 + g.wait_for_all(); + if (!silent) output.display(); + assert(output.get_value() == low); + } + + + { // test two-input nor_gate: 00, 01, 10, 11 + nor_gate<2> n(g); + toggle input0(g); + toggle input1(g); + led output(g, "OUTPUT", false); + + make_edge(input0.get_out(), input_port<0>(n)); + make_edge(input1.get_out(), input_port<1>(n)); + make_edge(output_port<0>(n), output.get_in()); + + if (!silent) printf("Testing nor_gate...\n"); + input1.activate(); input0.activate(); // 0 0 + g.wait_for_all(); + if (!silent) output.display(); + assert(output.get_value() == high); + input0.flip(); // 0 1 + g.wait_for_all(); + if (!silent) output.display(); + assert(output.get_value() == low); + input1.flip(); input0.flip(); // 1 0 + g.wait_for_all(); + if (!silent) output.display(); + assert(output.get_value() == low); + input0.flip(); // 1 1 + g.wait_for_all(); + if (!silent) output.display(); + assert(output.get_value() == low); + } + + { // test steady_signal and digit + steady_signal input0(g, high); + steady_signal input1(g, low); + and_gate<2> a(g); + or_gate<2> o(g); + xor_gate<2> x(g); + nor_gate<2> n(g); + digit output(g, "OUTPUT", false); + + make_edge(input0.get_out(), input_port<0>(a)); + make_edge(input1.get_out(), input_port<1>(a)); + make_edge(output_port<0>(a), input_port<0>(output)); + + make_edge(input0.get_out(), input_port<0>(o)); + make_edge(input1.get_out(), input_port<1>(o)); + make_edge(output_port<0>(o), input_port<1>(output)); + + make_edge(input0.get_out(), input_port<0>(x)); + make_edge(input1.get_out(), input_port<1>(x)); + make_edge(output_port<0>(x), input_port<2>(output)); + + make_edge(input0.get_out(), input_port<0>(n)); + make_edge(input1.get_out(), input_port<1>(n)); + make_edge(output_port<0>(n), input_port<3>(output)); + + if (!silent) printf("Testing steady_signal...\n"); + input0.activate(); // 1 + input1.activate(); // 0 + g.wait_for_all(); + if (!silent) output.display(); + assert(output.get_value() == 6); + } + + { // test push_button + push_button p(g); + buffer b(g); + led output(g, "OUTPUT", !silent); // true means print all LED state changes + + make_edge(p.get_out(), input_port<0>(b)); + make_edge(output_port<0>(b), output.get_in()); + + if (!silent) printf("Testing push_button...\n"); + p.press(); + p.release(); + p.press(); + p.release(); + g.wait_for_all(); + } + + { // test one_bit_adder + one_bit_adder my_adder(g); + toggle A(g); + toggle B(g); + toggle CarryIN(g); + led Sum(g, "SUM"); + led CarryOUT(g, "CarryOUT"); + + make_edge(A.get_out(), input_port(my_adder)); + make_edge(B.get_out(), input_port(my_adder)); + make_edge(CarryIN.get_out(), input_port(my_adder)); + make_edge(output_port(my_adder), Sum.get_in()); + make_edge(output_port<1>(my_adder), CarryOUT.get_in()); + + A.activate(); + B.activate(); + CarryIN.activate(); + + if (!silent) printf("A on\n"); + A.flip(); + g.wait_for_all(); + if (!silent) Sum.display(); + if (!silent) CarryOUT.display(); + assert((Sum.get_value() == high) && (CarryOUT.get_value() == low)); + + if (!silent) printf("A off\n"); + A.flip(); + g.wait_for_all(); + if (!silent) Sum.display(); + if (!silent) CarryOUT.display(); + assert((Sum.get_value() == low) && (CarryOUT.get_value() == low)); + + if (!silent) printf("B on\n"); + B.flip(); + g.wait_for_all(); + if (!silent) Sum.display(); + if (!silent) CarryOUT.display(); + assert((Sum.get_value() == high) && (CarryOUT.get_value() == low)); + if (!silent) printf("B off\n"); + B.flip(); + g.wait_for_all(); + if (!silent) Sum.display(); + if (!silent) CarryOUT.display(); + assert((Sum.get_value() == low) && (CarryOUT.get_value() == low)); + + if (!silent) printf("CarryIN on\n"); + CarryIN.flip(); + g.wait_for_all(); + if (!silent) Sum.display(); + if (!silent) CarryOUT.display(); + assert((Sum.get_value() == high) && (CarryOUT.get_value() == low)); + if (!silent) printf("CarryIN off\n"); + CarryIN.flip(); + g.wait_for_all(); + if (!silent) Sum.display(); + if (!silent) CarryOUT.display(); + assert((Sum.get_value() == low) && (CarryOUT.get_value() == low)); + + if (!silent) printf("A&B on\n"); + A.flip(); + B.flip(); + g.wait_for_all(); + if (!silent) Sum.display(); + if (!silent) CarryOUT.display(); + assert((Sum.get_value() == low) && (CarryOUT.get_value() == high)); + if (!silent) printf("A&B off\n"); + A.flip(); + B.flip(); + g.wait_for_all(); + if (!silent) Sum.display(); + if (!silent) CarryOUT.display(); + assert((Sum.get_value() == low) && (CarryOUT.get_value() == low)); + + if (!silent) printf("A&CarryIN on\n"); + A.flip(); + CarryIN.flip(); + g.wait_for_all(); + if (!silent) Sum.display(); + if (!silent) CarryOUT.display(); + assert((Sum.get_value() == low) && (CarryOUT.get_value() == high)); + if (!silent) printf("A&CarryIN off\n"); + A.flip(); + CarryIN.flip(); + g.wait_for_all(); + if (!silent) Sum.display(); + if (!silent) CarryOUT.display(); + assert((Sum.get_value() == low) && (CarryOUT.get_value() == low)); + + if (!silent) printf("B&CarryIN on\n"); + B.flip(); + CarryIN.flip(); + g.wait_for_all(); + if (!silent) Sum.display(); + if (!silent) CarryOUT.display(); + assert((Sum.get_value() == low) && (CarryOUT.get_value() == high)); + if (!silent) printf("B&CarryIN off\n"); + B.flip(); + CarryIN.flip(); + g.wait_for_all(); + if (!silent) Sum.display(); + if (!silent) CarryOUT.display(); + assert((Sum.get_value() == low) && (CarryOUT.get_value() == low)); + + if (!silent) printf("A&B&CarryIN on\n"); + A.flip(); + B.flip(); + CarryIN.flip(); + g.wait_for_all(); + if (!silent) Sum.display(); + if (!silent) CarryOUT.display(); + assert((Sum.get_value() == high) && (CarryOUT.get_value() == high)); + if (!silent) printf("A&B&CarryIN off\n"); + A.flip(); + B.flip(); + CarryIN.flip(); + g.wait_for_all(); + if (!silent) Sum.display(); + if (!silent) CarryOUT.display(); + assert((Sum.get_value() == low) && (CarryOUT.get_value() == low)); + } + +#if USE_TWO_BIT_FULL_ADDER + { // test two_bit_adder + if (!silent) printf("testing two_bit adder\n"); + two_bit_adder two_adder(g); + std::vector A(2, toggle(g)); + std::vector B(2, toggle(g)); + toggle CarryIN(g); + digit Sum(g, "SUM"); + led CarryOUT(g, "CarryOUT"); + + make_edge(A[0].get_out(), input_port(two_adder)); + make_edge(B[0].get_out(), input_port(two_adder)); + make_edge(output_port(two_adder), input_port<0>(Sum)); + + make_edge(A[1].get_out(), input_port(two_adder)); + make_edge(B[1].get_out(), input_port(two_adder)); + make_edge(output_port(two_adder), input_port<1>(Sum)); + + make_edge(CarryIN.get_out(), input_port(two_adder)); + make_edge(output_port(two_adder), CarryOUT.get_in()); + + // Activate all switches at low state + for (int i=0; i<2; ++i) { + A[i].activate(); + B[i].activate(); + } + CarryIN.activate(); + + if (!silent) printf("1+0\n"); + A[0].flip(); + g.wait_for_all(); + if (!silent) Sum.display(); + if (!silent) CarryOUT.display(); + assert((Sum.get_value() == 1) && (CarryOUT.get_value() == low)); + + if (!silent) printf("0+1\n"); + A[0].flip(); + B[0].flip(); + g.wait_for_all(); + if (!silent) Sum.display(); + if (!silent) CarryOUT.display(); + assert((Sum.get_value() == 1) && (CarryOUT.get_value() == low)); + } +#else + { // test four_bit_adder + four_bit_adder four_adder(g); + std::vector A(4, toggle(g)); + std::vector B(4, toggle(g)); + toggle CarryIN(g); + digit Sum(g, "SUM"); + led CarryOUT(g, "CarryOUT"); + + make_edge(A[0].get_out(), input_port(four_adder)); + make_edge(B[0].get_out(), input_port(four_adder)); + make_edge(output_port(four_adder), input_port<0>(Sum)); + + make_edge(A[1].get_out(), input_port(four_adder)); + make_edge(B[1].get_out(), input_port(four_adder)); + make_edge(output_port(four_adder), input_port<1>(Sum)); + + make_edge(A[2].get_out(), input_port(four_adder)); + make_edge(B[2].get_out(), input_port(four_adder)); + make_edge(output_port(four_adder), input_port<2>(Sum)); + + make_edge(A[3].get_out(), input_port(four_adder)); + make_edge(B[3].get_out(), input_port(four_adder)); + make_edge(output_port(four_adder), input_port<3>(Sum)); + + make_edge(CarryIN.get_out(), input_port(four_adder)); + make_edge(output_port(four_adder), CarryOUT.get_in()); + + // Activate all switches at low state + for (int i=0; i<4; ++i) { + A[i].activate(); + B[i].activate(); + } + CarryIN.activate(); + + if (!silent) printf("1+0\n"); + A[0].flip(); + g.wait_for_all(); + if (!silent) Sum.display(); + if (!silent) CarryOUT.display(); + assert((Sum.get_value() == 1) && (CarryOUT.get_value() == low)); + + if (!silent) printf("0+1\n"); + A[0].flip(); + B[0].flip(); + g.wait_for_all(); + if (!silent) Sum.display(); + if (!silent) CarryOUT.display(); + assert((Sum.get_value() == 1) && (CarryOUT.get_value() == low)); + + if (!silent) printf("3+4\n"); + A[0].flip(); + A[1].flip(); + B[0].flip(); + B[2].flip(); + g.wait_for_all(); + if (!silent) Sum.display(); + if (!silent) CarryOUT.display(); + assert((Sum.get_value() == 7) && (CarryOUT.get_value() == low)); + + if (!silent) printf("6+1\n"); + A[0].flip(); + A[2].flip(); + B[0].flip(); + B[2].flip(); + g.wait_for_all(); + if (!silent) Sum.display(); + if (!silent) CarryOUT.display(); + assert((Sum.get_value() == 7) && (CarryOUT.get_value() == low)); + + if (!silent) printf("0+0+carry\n"); + A[1].flip(); + A[2].flip(); + B[0].flip(); + CarryIN.flip(); + g.wait_for_all(); + if (!silent) Sum.display(); + if (!silent) CarryOUT.display(); + assert((Sum.get_value() == 1) && (CarryOUT.get_value() == low)); + + if (!silent) printf("15+15+carry\n"); + A[0].flip(); + A[1].flip(); + A[2].flip(); + A[3].flip(); + B[0].flip(); + B[1].flip(); + B[2].flip(); + B[3].flip(); + g.wait_for_all(); + if (!silent) Sum.display(); + if (!silent) CarryOUT.display(); + assert((Sum.get_value() == 0xf) && (CarryOUT.get_value() == high)); + + if (!silent) printf("8+8\n"); + A[0].flip(); + A[1].flip(); + A[2].flip(); + B[0].flip(); + B[1].flip(); + B[2].flip(); + CarryIN.flip(); + g.wait_for_all(); + if (!silent) Sum.display(); + if (!silent) CarryOUT.display(); + assert((Sum.get_value() == 0) && (CarryOUT.get_value() == high)); + + if (!silent) printf("0+0\n"); + A[3].flip(); + B[3].flip(); + g.wait_for_all(); + if (!silent) Sum.display(); + if (!silent) CarryOUT.display(); + assert((Sum.get_value() == 0) && (CarryOUT.get_value() == low)); + } +#endif + + { // test D_latch + D_latch my_d_latch(g); + toggle D(g); + pulse E(g, 500, 4); // clock changes every 500ms; stops after 4 changes + led Q(g, " Q", verbose); // if true, LEDs print at every state change + led notQ(g, "~Q", verbose); + + make_edge(D.get_out(), input_port<0>(my_d_latch)); + make_edge(E.get_out(), input_port<1>(my_d_latch)); + make_edge(output_port<0>(my_d_latch), Q.get_in()); + make_edge(output_port<1>(my_d_latch), notQ.get_in()); + + D.activate(); + + if (!silent) printf("Toggling D\n"); + E.activate(); + D.flip(); + g.wait_for_all(); + if (!silent && !verbose) { Q.display(); notQ.display(); } + assert((Q.get_value() == high) && (notQ.get_value() == low)); + E.reset(); + + if (!silent) printf("Toggling D\n"); + E.activate(); + D.flip(); + g.wait_for_all(); + if (!silent && !verbose) { Q.display(); notQ.display(); } + assert((Q.get_value() == low) && (notQ.get_value() == high)); + E.reset(); + + if (!silent) printf("Toggling D\n"); + E.activate(); + D.flip(); + g.wait_for_all(); + if (!silent && !verbose) { Q.display(); notQ.display(); } + assert((Q.get_value() == high) && (notQ.get_value() == low)); + E.reset(); + + if (!silent) printf("Toggling D\n"); + E.activate(); + D.flip(); + g.wait_for_all(); + if (!silent && !verbose) { Q.display(); notQ.display(); } + assert((Q.get_value() == low) && (notQ.get_value() == high)); + E.reset(); + + if (!silent) printf("Toggling D\n"); + E.activate(); + D.flip(); + g.wait_for_all(); + if (!silent && !verbose) { Q.display(); notQ.display(); } + assert((Q.get_value() == high) && (notQ.get_value() == low)); + } + } + utility::report_elapsed_time((tbb::tick_count::now() - start).seconds()); + return 0; + } catch(std::exception& e) { + cerr<<"error occurred. error text is :\"" <, + tuple< signal_t, signal_t, signal_t > > { + graph& my_graph; + std::vector two_adders; + typedef composite_node< tuple< signal_t, signal_t, signal_t, signal_t, signal_t >, + tuple< signal_t, signal_t, signal_t > > base_type; + public: + two_bit_adder(graph& g) : base_type(g), my_graph(g), two_adders(2, one_bit_adder(g)) { + make_connections(); + set_up_composite(); + } + two_bit_adder(const two_bit_adder& src) : + base_type(src.my_graph), my_graph(src.my_graph), two_adders(2, one_bit_adder(src.my_graph)) + { + make_connections(); + set_up_composite(); + } + ~two_bit_adder() {} + +private: + void make_connections() { + make_edge(output_port<1>(two_adders[0]), input_port<0>(two_adders[1])); + } + void set_up_composite() { + + base_type::input_ports_type input_tuple(input_port<0>(two_adders[0]/*CI*/), input_port<1>(two_adders[0]), input_port<2>(two_adders[0]), input_port<1>(two_adders[1]), input_port<2>(two_adders[1])); + + base_type::output_ports_type output_tuple(output_port<0>(two_adders[0]), output_port<0>(two_adders[1]),output_port<1>(two_adders[1]/*CO*/)); + base_type::set_external_ports(input_tuple, output_tuple); + } +}; + +#endif /* __TBBexample_graph_logicsim_tba_H */ + diff --git a/xdl/third_party/tbb/examples/graph/matmult/Makefile b/xdl/third_party/tbb/examples/graph/matmult/Makefile new file mode 100644 index 00000000..413bab9f --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/matmult/Makefile @@ -0,0 +1,59 @@ +# Copyright (c) 2016-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +# GNU Makefile that builds and runs example. + +run_cmd= +PROG=matmult +ARGS= + +# icpc by default +ifneq (,$(shell which icc 2>/dev/null)) + CXX=icpc +endif + +# autodetect C++11 support +include ../../common/examples-common.inc + +ifeq ($(shell uname), Linux) +LIBS+= -lrt -lpthread -lcilkrts +else ifeq ($(shell uname), Darwin) +override CXXFLAGS += -Wl,-rpath,$(TBBROOT)/lib +endif + +all: release test + +release: + $(CXX) -O2 -DNDEBUG *.cpp $(CXXFLAGS) -o $(PROG) -ltbb $(LIBS) $(CXX0XFLAGS) + +debug: + $(CXX) -O0 -g -DTBB_USE_DEBUG *.cpp $(CXXFLAGS) -o $(PROG) -ltbb_debug $(LIBS) $(CXX0XFLAGS) + +profile: override CXXFLAGS += -DTBB_USE_THREADING_TOOLS -g +profile: release + +clean: + $(RM) $(PROG) *.o *.d + +test: + $(run_cmd) ./$(PROG) $(ARGS) + +perf_build: release + +perf_run: + $(run_cmd) ./$(PROG) diff --git a/xdl/third_party/tbb/examples/graph/matmult/Makefile.windows b/xdl/third_party/tbb/examples/graph/matmult/Makefile.windows new file mode 100644 index 00000000..e8611453 --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/matmult/Makefile.windows @@ -0,0 +1,56 @@ +# Copyright (c) 2016-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +# Common Makefile that builds and runs example. + +# Just specify your program basename +run_cmd= +PROG=matmult +ARGS= + +# Trying to find if icl.exe is set +CXX1 = $(TBB_CXX)- +CXX2 = $(CXX1:icl.exe-=icl.exe) +CXX = $(CXX2:-=cl.exe) + +# The C++ compiler options +MYCXXFLAGS = /EHsc /W3 /nologo /D _CONSOLE /D _MBCS /D WIN32 /D _CRT_SECURE_NO_WARNINGS /D _CRT_NONSTDC_NO_DEPRECATE /wd4267 /wd4244 +MYLDFLAGS = /INCREMENTAL:NO /NOLOGO /DEBUG /FIXED:NO $(LDFLAGS) + +all: release test + +release: + $(CXX) *.cpp /MD /O2 /Zi /D NDEBUG $(MYCXXFLAGS) /link tbb.lib $(LIBS) $(MYLDFLAGS) /OUT:$(PROG).exe + +debug: + $(CXX) *.cpp /MDd /Od /Zi /D TBB_USE_DEBUG /D _DEBUG $(MYCXXFLAGS) /link tbb_debug.lib $(LIBS) $(MYLDFLAGS) /OUT:$(PROG).exe + +profile: + $(CXX) *.cpp /MD /O2 /Zi /D NDEBUG $(MYCXXFLAGS) /D TBB_USE_THREADING_TOOLS /link tbb.lib $(LIBS) $(MYLDFLAGS) /OUT:$(PROG).exe + +clean: + @cmd.exe /C del $(PROG).exe *.obj *.?db *.manifest + +test: + $(PROG) $(ARGS) + +perf_build: release + +perf_run: + $(PROG) $(PERF_RUN_ARGS) + diff --git a/xdl/third_party/tbb/examples/graph/matmult/matmult.cpp b/xdl/third_party/tbb/examples/graph/matmult/matmult.cpp new file mode 100644 index 00000000..42879223 --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/matmult/matmult.cpp @@ -0,0 +1,374 @@ +/* + Copyright (c) 2016-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +// ------------------------------------------------------------------------------------------------- +// This is an example of a matrix multiplication Gen kernel usage with TBB Flow Graph. +// It exemplifies support for compute offload to Intel(R) Graphics Technology in the flow graph API. +// ------------------------------------------------------------------------------------------------- + +#define TBB_PREVIEW_FLOW_GRAPH_NODES 1 +#define TBB_PREVIEW_FLOW_GRAPH_FEATURES 1 + +#include "tbb/tbb_config.h" +#include "../../common/utility/utility.h" + +#if __TBB_PREVIEW_GFX_FACTORY && __TBB_PREVIEW_STREAMING_NODE + +#if _MSC_VER +#pragma warning(disable : 4503) // suppress warning C4503: decorated name length exceeded, name was truncated +#endif + +// ------------------------------------------------------------------------------------------------- + +#include + +#include +#include + +#include "tbb/tick_count.h" +#include "tbb/flow_graph.h" +#include "tbb/gfx_factory.h" + +// ------------------------------------------------------------------------------------------------- + +#define SLM_TILE_X (4*8) +#define SLM_TILE_Y (4*8) +#define SLM_TILE_K (4*8) + +#define SIZE_X (2*SLM_TILE_X) +#define SIZE_Y (2*SLM_TILE_Y) +#define SIZE_K (2*SLM_TILE_X) + +#ifdef __GFX__ +#define BARRIER _gfx_gpgpu_thread_barrier() +#else +#define BARRIER +#endif + +#define TILE_Y 8 +#define TILE_K 8 +#define TILE_X 8 + +// The naive straightforward algorithm used to obtain reference results on CPU +void matmult_naive(const float* A, const float* B, float* C) { + for (int y = 0; y < SIZE_Y; y++) { + for (int x = 0; x < SIZE_X; x++) { + C[y * SIZE_Y + x] = (float)0; + + for (int k = 0; k < SIZE_K; k++) { + C[y * SIZE_Y + x] += A[y * SIZE_K + k] * B[k * SIZE_K + x]; + } + } + } +} + +// Shared Local Memory based algorithm +__declspec(target(gfx_kernel)) +void matmult_tiled_slm(const float A[][SIZE_K], const float B[][SIZE_X], float C[][SIZE_X]) { + // The parallel loop nest below iterates over "supertiles" in the resulting + // matrix C and it is parallelized across thread groups, 1 iteration per + // group, which effectively means that the loop nest is peeled off. + // This kernel is programmed so that each thread group calculates one + // resulting supertile in matrix C. + _Cilk_for _Thread_group(int tg_y = 0; tg_y < SIZE_Y; tg_y += SLM_TILE_Y) { + _Cilk_for _Thread_group(int tg_x = 0; tg_x < SIZE_X; tg_x += SLM_TILE_X) { + // declare "supertiles" of each matrix to be allocated in SLM + __thread_group_local float slm_atile[SLM_TILE_Y][SLM_TILE_K]; + __thread_group_local float slm_btile[SLM_TILE_K][SLM_TILE_X]; + __thread_group_local float slm_ctile[SLM_TILE_Y][SLM_TILE_X]; + + // initialize the result supertile (in parallel) + //slm_ctile[:][:] = (float)0; + _Cilk_for(int i0 = 0; i0 < SLM_TILE_Y; i0++) + _Cilk_for(int i1 = 0; i1 < SLM_TILE_X; i1++) + slm_ctile[i0][i1] = (float)0; + + // calculate the dot product of supertiles: + for (int super_k = 0; super_k < SIZE_K; super_k += SLM_TILE_K) { + // cache A's and B's "supertiles" in SLM (in parallel) + //slm_atile[:][:] = A[tg_y:SLM_TILE_Y][super_k:SLM_TILE_K]; + _Cilk_for(int i0 = 0; i0 < SLM_TILE_Y; i0++) + _Cilk_for(int i1 = 0; i1 < SLM_TILE_K; i1++) + slm_atile[i0][i1] = A[tg_y + i0][super_k + i1]; + + //slm_btile[:][:] = B[super_k:SLM_TILE_K][tg_x:SLM_TILE_X]; + _Cilk_for(int i0 = 0; i0 < SLM_TILE_K; i0++) + _Cilk_for(int i1 = 0; i1 < SLM_TILE_X; i1++) + slm_btile[i0][i1] = B[super_k + i0][tg_x + i1]; + + // need a barrier, since every tile in tiles are used by + // multiple threads in the group + BARRIER; + + // now multiply the supertiles as usual matrices (in parallel) + // ... + // ... using the most effective tiled algorithm: + _Cilk_for(int t_y = 0; t_y < SLM_TILE_Y; t_y += TILE_Y) { + _Cilk_for(int t_x = 0; t_x < SLM_TILE_X; t_x += TILE_X) { + // allocate tiles in registers + float atile[TILE_Y][TILE_K], btile[TILE_X]; + float ctile[TILE_Y][TILE_X]; + + // ... and initialize ctile to zero + ctile[:][:] = (float)0; + + // calculate the dot product of the tiles + for (int k = 0; k < SLM_TILE_K; k += TILE_K) { + atile[:][:] = slm_atile[t_y:TILE_Y][k:TILE_K]; + + for (int k_ind = 0; k_ind < TILE_K; k_ind++) { + btile[:] = slm_btile[k + k_ind][t_x:TILE_X]; + + // multiply current btile row by atile's + // current element and add up to corresponding + // ctile row + for (int y_ind = 0; y_ind < TILE_Y; y_ind++) { + ctile[y_ind][:] += atile[y_ind][k_ind] * + btile[:]; + } + } + } + // flush the thread-local ctile (registers) into the + // thread group-local supertile (SLM) adding up + // elements + slm_ctile[t_y:TILE_Y][t_x:TILE_X] += ctile[:][:]; + } + } + + // barrier to make sure + // (1) next iteration of the loop does not overwrite a and b + // SLM tiles used in the above calculation of slm_ctile + // (2) on the last iteration of the loop, all threads wait + // for the SLM ctile calculation to be completed before + // writing it back to memory below this loop + BARRIER; + } + + // write (in parallel) the result supertile back to memory: + //C[tg_y:SLM_TILE_Y][tg_x:SLM_TILE_X] = slm_ctile[:][:]; + _Cilk_for(int i0 = 0; i0 < SLM_TILE_Y; i0++) + _Cilk_for(int i1 = 0; i1 < SLM_TILE_X; i1++) + C[tg_y + i0][tg_x + i1] = slm_ctile[i0][i1]; + + // next iteration of the loop zeroes out slm_ctile - make sure this + // always happens after slm_ctile has been dumped to memory (above + // loop nest completes): + BARRIER; + } + } +} + +// Matrix initialization function +void init_matrix(int width, int height, float* matrix) { + for (int j = 0; j < height; j++) { + for (int i = 0; i < width; i++) { + matrix[j * height + i] = (float)(j * 4 + i); + } + } +} + +// Validate matrix with reference values +bool validate_mat(char *title, int size_y, int size_x, const float* mat, const float* ref_mat) { + int err_cnt = 0; + printf("verifying %s...", title); + fflush(stdout); + + for (int y = 0; y < size_y; y++) { + for (int x = 0; x < size_x; x++) { + float val = mat[y * size_y + x]; + float gold_val = ref_mat[y * size_y + x]; + + if (val != gold_val) { + if (err_cnt == 0) { + printf("\n"); + } + if (++err_cnt < 10) { + std::cout << + " ERROR at [" << y << "][" << x << "]: " << + val << "(should be " << gold_val << ")" << std::endl; + } + } + } + } + if (err_cnt == 0) { + printf(" ok\n"); + } else { + printf("FAILED\n"); + } + return err_cnt == 0; +} + +// ---------------------------------------------------------------------------- +// Helper types and functions +// ---------------------------------------------------------------------------- + +struct matrix_size { + int columns; + int rows; +}; + +typedef std::tuple< tbb::flow::gfx_buffer, + tbb::flow::gfx_buffer, + tbb::flow::gfx_buffer > kernel_args_type; +typedef kernel_args_type cpu_args_type; +typedef kernel_args_type validation_args_type; + +// Constructs flow graph with three computation nodes that all make matrixes multiplication +// - CPU node - obtains reference result on CPU +// - CPU SLM node - Intel(R) Cilk(TM) based matrixes multiplication implementation on CPU +// - GPU node - obtains result on GPU using GFX offload API +void mat_multiplication() { + + //------------------------------------------ + // TBB Flow Graph nodes declaration section + //------------------------------------------ + + tbb::flow::graph g; + tbb::flow::gfx_factory factory(g); + + // Enqueue task for running on Gen + tbb::flow::split_node< kernel_args_type > gpu_slm_split_n(g); + tbb::flow::streaming_node< kernel_args_type, tbb::flow::queueing, tbb::flow::gfx_factory > gpu_slm_mat_mult_n(g, matmult_tiled_slm, tbb::flow::gfx_factory::dummy_device_selector(), factory); + + // Obtain SLM algorithm result on CPU + tbb::flow::function_node< cpu_args_type, tbb::flow::gfx_buffer > cpu_slm_mat_mult_n(g, tbb::flow::unlimited, [](const cpu_args_type& args) -> tbb::flow::gfx_buffer { + // Get references to matrixes + const tbb::flow::gfx_buffer& A_MATRIX = std::get<0>(args); + const tbb::flow::gfx_buffer& B_MATRIX = std::get<1>(args); + tbb::flow::gfx_buffer CPU_SLM_MATRIX = std::get<2>(args); + + matmult_tiled_slm((float(*)[SIZE_K])A_MATRIX.data(), (float(*)[SIZE_X])B_MATRIX.data(), (float(*)[SIZE_X])CPU_SLM_MATRIX.data()); + + return CPU_SLM_MATRIX; + }); + + // Obtain reference result on CPU + tbb::flow::function_node< cpu_args_type, tbb::flow::gfx_buffer > cpu_naive_mat_mult_n(g, tbb::flow::unlimited, [](const cpu_args_type& args) -> tbb::flow::gfx_buffer { + // Get references to matrixes + const tbb::flow::gfx_buffer& A_MATRIX = std::get<0>(args); + const tbb::flow::gfx_buffer& B_MATRIX = std::get<1>(args); + tbb::flow::gfx_buffer CPU_NAIVE_MATRIX = std::get<2>(args); + + matmult_naive(A_MATRIX.data(), B_MATRIX.data(), CPU_NAIVE_MATRIX.data()); + + return CPU_NAIVE_MATRIX; + }); + + // Validate computed matrixes + tbb::flow::join_node< validation_args_type > validation_join_n(g); + tbb::flow::function_node< validation_args_type > mat_validation_n(g, tbb::flow::unlimited, [](const validation_args_type& result) { + // Get references to matrixes + const tbb::flow::gfx_buffer& GPU_SLM_MAT = std::get<0>(result); + const tbb::flow::gfx_buffer& CPU_SLM_MAT = std::get<1>(result); + const tbb::flow::gfx_buffer& CPU_NAIVE_MAT = std::get<2>(result); + + // Verify results + // Check that slm algorithm produces correct results on CPU: + validate_mat("matrix multiply: 'SLM' CPU vs. CPU", SIZE_Y, SIZE_X, CPU_SLM_MAT.data(), CPU_NAIVE_MAT.data()); + // Verify Gen results: + validate_mat("matrix multiply: SLM Gen vs. CPU", SIZE_Y, SIZE_X, GPU_SLM_MAT.data(), CPU_NAIVE_MAT.data()); + }); + + //----------------------------------------- + // Make edge section - connecting nodes + //----------------------------------------- + + // Prepare main graph input ports for data + make_edge(tbb::flow::output_port<0>(gpu_slm_split_n), tbb::flow::input_port<0>(gpu_slm_mat_mult_n)); + make_edge(tbb::flow::output_port<1>(gpu_slm_split_n), tbb::flow::input_port<1>(gpu_slm_mat_mult_n)); + make_edge(tbb::flow::output_port<2>(gpu_slm_split_n), tbb::flow::input_port<2>(gpu_slm_mat_mult_n)); + + // Join results + make_edge(tbb::flow::output_port<2>(gpu_slm_mat_mult_n), tbb::flow::input_port<0>(validation_join_n)); + make_edge(cpu_slm_mat_mult_n, tbb::flow::input_port<1>(validation_join_n)); + make_edge(cpu_naive_mat_mult_n, tbb::flow::input_port<2>(validation_join_n)); + + //Verify correctness + make_edge(validation_join_n, mat_validation_n); + + // Set args for GFX kernel. + // Default behaviour if not set. + gpu_slm_mat_mult_n.set_args(tbb::flow::port_ref<0, 2>); + + //----------------------------------------- + // Input sizes and matrixes initialization + //----------------------------------------- + + const matrix_size A_MATRIX_SIZE = { SIZE_Y, SIZE_K }; + const matrix_size B_MATRIX_SIZE = { SIZE_K, SIZE_X }; + const matrix_size GPU_SLM_MATRIX_SIZE = { SIZE_Y, SIZE_X }; + const matrix_size CPU_SLM_MATRIX_SIZE = { SIZE_Y, SIZE_X }; + const matrix_size CPU_NAIVE_MATRIX_SIZE = { SIZE_Y, SIZE_X }; + + tbb::flow::gfx_buffer A_MATRIX(A_MATRIX_SIZE.columns * A_MATRIX_SIZE.rows); + tbb::flow::gfx_buffer B_MATRIX(B_MATRIX_SIZE.columns * B_MATRIX_SIZE.rows); + tbb::flow::gfx_buffer GPU_SLM_MATRIX(GPU_SLM_MATRIX_SIZE.columns * GPU_SLM_MATRIX_SIZE.rows); + tbb::flow::gfx_buffer CPU_SLM_MATRIX(CPU_SLM_MATRIX_SIZE.columns * CPU_SLM_MATRIX_SIZE.rows); + tbb::flow::gfx_buffer CPU_NAIVE_MATRIX(CPU_NAIVE_MATRIX_SIZE.columns * CPU_NAIVE_MATRIX_SIZE.rows); + + // Intitialize input matrixes + init_matrix(A_MATRIX_SIZE.columns, A_MATRIX_SIZE.rows, A_MATRIX.data()); + init_matrix(B_MATRIX_SIZE.columns, B_MATRIX_SIZE.rows, B_MATRIX.data()); + + // Make tuples with input data for graph + kernel_args_type GPU_SLM_INPUT = std::make_tuple(A_MATRIX, B_MATRIX, GPU_SLM_MATRIX); + kernel_args_type CPU_SLM_INPUT = std::make_tuple(A_MATRIX, B_MATRIX, CPU_SLM_MATRIX); + kernel_args_type CPU_NAIVE_INPUT = std::make_tuple(A_MATRIX, B_MATRIX, CPU_NAIVE_MATRIX); + + //----------------------------------------- + // Send input to the graph and run it + //----------------------------------------- + + gpu_slm_split_n.try_put(GPU_SLM_INPUT); + cpu_slm_mat_mult_n.try_put(CPU_SLM_INPUT); + cpu_naive_mat_mult_n.try_put(CPU_NAIVE_INPUT); + + // Run graph + g.wait_for_all(); +} + +//--------------------------------------------------------------------------------- + +int main(int argc, char* argv[]) { + try { + tbb::tick_count mainStartTime = tbb::tick_count::now(); + + utility::parse_cli_arguments(argc, argv, + utility::cli_argument_pack() + //"-h" option for displaying help is present implicitly + ); + + // Compute matrices and verify result + mat_multiplication(); + + utility::report_elapsed_time((tbb::tick_count::now() - mainStartTime).seconds()); + return 0; + } catch (std::exception& e) { + std::cerr << "Error occurred. Error text is : \"" << e.what() << "\"\n"; + return -1; + } +} + +#else +int main() { + utility::report_skipped(); + return 0; +} +#endif /* __TBB_PREVIEW_GFX_FACTORY && __TBB_PREVIEW_STREAMING_NODE */ diff --git a/xdl/third_party/tbb/examples/graph/matmult/msvs/matmult.sln b/xdl/third_party/tbb/examples/graph/matmult/msvs/matmult.sln new file mode 100644 index 00000000..73f132ca --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/matmult/msvs/matmult.sln @@ -0,0 +1,28 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.40629.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "matmult", "matmult.vcxproj", "{517E31A4-BEED-481A-A5A7-5B37B82A1C16}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {517E31A4-BEED-481A-A5A7-5B37B82A1C16}.Debug|Win32.ActiveCfg = Debug|Win32 + {517E31A4-BEED-481A-A5A7-5B37B82A1C16}.Debug|Win32.Build.0 = Debug|Win32 + {517E31A4-BEED-481A-A5A7-5B37B82A1C16}.Debug|x64.ActiveCfg = Debug|x64 + {517E31A4-BEED-481A-A5A7-5B37B82A1C16}.Debug|x64.Build.0 = Debug|x64 + {517E31A4-BEED-481A-A5A7-5B37B82A1C16}.Release|Win32.ActiveCfg = Release|Win32 + {517E31A4-BEED-481A-A5A7-5B37B82A1C16}.Release|Win32.Build.0 = Release|Win32 + {517E31A4-BEED-481A-A5A7-5B37B82A1C16}.Release|x64.ActiveCfg = Release|x64 + {517E31A4-BEED-481A-A5A7-5B37B82A1C16}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/xdl/third_party/tbb/examples/graph/matmult/msvs/matmult.vcxproj b/xdl/third_party/tbb/examples/graph/matmult/msvs/matmult.vcxproj new file mode 100644 index 00000000..e9ebbeee --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/matmult/msvs/matmult.vcxproj @@ -0,0 +1,145 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {517E31A4-BEED-481A-A5A7-5B37B82A1C16} + matmult + + + + Application + true + v120 + MultiByte + + + Application + true + v120 + MultiByte + + + Application + false + v120 + true + MultiByte + + + Application + false + v120 + true + MultiByte + + + + + + + + + + + + + + + + + + + $(SolutionDir)$(Platform)\$(Configuration)\ + $(SolutionDir)$(Platform)\$(ProjectName)\$(Configuration)\ + + + $(SolutionDir)$(Platform)\$(Configuration)\ + $(SolutionDir)$(Platform)\$(ProjectName)\$(Configuration)\ + + + $(SolutionDir)$(Platform)\$(Configuration)\ + $(SolutionDir)$(Platform)\$(ProjectName)\$(Configuration)\ + + + $(SolutionDir)$(Platform)\$(ProjectName)\$(Configuration)\ + + + + Level3 + Disabled + true + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include; + + + true + $(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc12;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc12; + + + + + Level3 + Disabled + true + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include; + + + true + $(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc12;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc12; + + + + + Level3 + MaxSpeed + true + true + true + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include; + + + true + true + true + $(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc12;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc12; + + + + + Level3 + MaxSpeed + true + true + true + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include; + + + true + true + true + $(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc12;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc12; + + + + + + + + + \ No newline at end of file diff --git a/xdl/third_party/tbb/examples/graph/matmult/readme.html b/xdl/third_party/tbb/examples/graph/matmult/readme.html new file mode 100644 index 00000000..ffc2e7e3 --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/matmult/readme.html @@ -0,0 +1,414 @@ + + + + + + Intel® Threading Building Blocks. matmult sample + + + + + +

+ The Matmult is an example of a Gen kernel implementing matrix multiplication. +
+
+ It exemplifies support for compute offload to Intel® Graphics Technology in the flow graph API. +

+ This example uses C++11 features. Specifying a compiler option such as -std=c++11 or similar might be necessary in order to build the example. + For more information please refer to the documentation for the compiler you use. +

+
+
System Requirements
+ +
+

+ For the most up to date system requirements, see the release notes. +

+

For detailed Intel® Graphics Technology requirements, please refer to article Getting Started With Compute Offload to Intel® Graphics Technology +

+
+
+ +
+
Files
+ +
+
+
matmult.cpp +
Matrix multiplication Gen kernel implementation with the flow graph interface. +
Makefile +
Makefile for building the example. +
+
+
+ +
+
Directories
+ +
+
+
msvs +
Contains Microsoft* Visual Studio* workspace for building and running the example (Windows* systems only). +
+

For information about the minimum supported version of IDE, see release notes.

+
+
+ +
+
Build instructions
+ +
+

General build directions can be found here.

+
+
+ +
+
Usage
+ +
+
+
matmult -h +
Prints the help for command line options +
matmult [-v] +
To run a short version of this example, e.g., for use with Intel® Parallel Inspector: +
Build a debug version of the example + (see the build instructions). +
+
+
+ +
+ Up to parent directory +
+ +
+
Legal Information
+ +
+

+ Intel and the Intel logo are trademarks of Intel Corporation in the U.S. and/or other countries. +
* Other names and brands may be claimed as the property of others. +
© 2018, Intel Corporation +

+ +

+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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/xdl/third_party/tbb/examples/graph/som/Makefile b/xdl/third_party/tbb/examples/graph/som/Makefile new file mode 100644 index 00000000..7312e071 --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/som/Makefile @@ -0,0 +1,63 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +# GNU Makefile that builds and runs example. +NAME=som +EXE=$(NAME).exe +ARGS= +LIGHT_ARGS=4 + +# The C++ compiler +ifneq (,$(shell which icc 2>/dev/null)) +CXX=icc +endif # icc + +override CXXFLAGS += $(UI_CXXFLAGS) + +SRCFILES = som_graph.cpp som.cpp + +ifeq ($(shell uname), Linux) +LIBS+= -lrt +else ifeq ($(shell uname), Darwin) +override CXXFLAGS += -Wl,-rpath,$(TBBROOT)/lib +endif + +all: release test + +release: $(SRCFILES) +ifeq ($(compiler),xl) + # Avoiding "1586-346 (U) An error occurred during code generation. The code generation return code was 40." with -O3. + $(CXX) -O2 -DNDEBUG $(CXXFLAGS) -o $(EXE) $(SRCFILES) -ltbb -ltbbmalloc $(LIBS) +else + $(CXX) -O3 -DNDEBUG $(CXXFLAGS) -o $(EXE) $(SRCFILES) -ltbb -ltbbmalloc $(LIBS) +endif + +debug: $(SRCFILES) + $(CXX) -g -O0 -DTBB_USE_DEBUG -D_DEBUG $(CXXFLAGS) -o $(EXE) $(SRCFILES) -ltbb_debug -ltbbmalloc_debug $(LIBS) + +profile: override CXXFLAGS += -DTBB_USE_THREADING_TOOLS -g +profile: release + +clean: + $(RM) $(EXE) *.o *.d + +test: + $(run_cmd) ./$(EXE) $(ARGS) + +light_test: + $(run_cmd) ./$(EXE) $(LIGHT_ARGS) diff --git a/xdl/third_party/tbb/examples/graph/som/Makefile.windows b/xdl/third_party/tbb/examples/graph/som/Makefile.windows new file mode 100644 index 00000000..d0bfdc11 --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/som/Makefile.windows @@ -0,0 +1,48 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +# Common Makefile that builds and runs example. + +# Just specify your program basename +PROG=som +ARGS= +LIGHT_ARGS=4 + +# Trying to find if icl.exe is set +CXX1 = $(TBB_CXX)- +CXX2 = $(CXX1:icl.exe-=icl.exe) +CXX = $(CXX2:-=cl.exe) + +# The C++ compiler options +MYCXXFLAGS = /TP /EHsc /W3 /nologo /D _CONSOLE /D _MBCS /D WIN32 /D _CRT_SECURE_NO_DEPRECATE $(CXXFLAGS) +MYLDFLAGS =/INCREMENTAL:NO /NOLOGO /DEBUG /FIXED:NO $(LDFLAGS) + +all: release test +release: + $(CXX) ./som_graph.cpp ./som.cpp /MD /O2 /D NDEBUG $(MYCXXFLAGS) /link tbb.lib $(LIBS) $(MYLDFLAGS) /OUT:$(PROG).exe +debug: + $(CXX) ./som_graph.cpp ./som.cpp /MDd /Od /Zi /D _DEBUG $(MYCXXFLAGS) /link tbb_debug.lib $(LIBS) $(MYLDFLAGS) /OUT:$(PROG).exe +profile: + $(CXX) ./som_graph.cpp ./som.cpp /MD /O2 /Zi /D NDEBUG $(MYCXXFLAGS) /D TBB_USE_THREADING_TOOLS /link tbb.lib $(LIBS) $(MYLDFLAGS) /OUT:$(PROG).exe +clean: + @cmd.exe /C del $(PROG).exe *.obj *.?db *.manifest +test: + $(PROG) $(ARGS) +light_test: + $(PROG) $(LIGHT_ARGS) + diff --git a/xdl/third_party/tbb/examples/graph/som/msvs/som.sln b/xdl/third_party/tbb/examples/graph/som/msvs/som.sln new file mode 100644 index 00000000..d9bff897 --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/som/msvs/som.sln @@ -0,0 +1,28 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.40629.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "som", "som.vcxproj", "{B2AE2EDC-697B-4C85-AC0D-E3E523D20D6D}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {B2AE2EDC-697B-4C85-AC0D-E3E523D20D6D}.Debug|Win32.ActiveCfg = Debug|Win32 + {B2AE2EDC-697B-4C85-AC0D-E3E523D20D6D}.Debug|Win32.Build.0 = Debug|Win32 + {B2AE2EDC-697B-4C85-AC0D-E3E523D20D6D}.Debug|x64.ActiveCfg = Debug|x64 + {B2AE2EDC-697B-4C85-AC0D-E3E523D20D6D}.Debug|x64.Build.0 = Debug|x64 + {B2AE2EDC-697B-4C85-AC0D-E3E523D20D6D}.Release|Win32.ActiveCfg = Release|Win32 + {B2AE2EDC-697B-4C85-AC0D-E3E523D20D6D}.Release|Win32.Build.0 = Release|Win32 + {B2AE2EDC-697B-4C85-AC0D-E3E523D20D6D}.Release|x64.ActiveCfg = Release|x64 + {B2AE2EDC-697B-4C85-AC0D-E3E523D20D6D}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/xdl/third_party/tbb/examples/graph/som/msvs/som.vcxproj b/xdl/third_party/tbb/examples/graph/som/msvs/som.vcxproj new file mode 100644 index 00000000..a29633e9 --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/som/msvs/som.vcxproj @@ -0,0 +1,217 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + som + {b2ae2edc-697b-4c85-ac0d-e3e523d20d6d} + som + Win32Proj + + + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.40219.1 + $(TEMP)\tbb_examples\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Configuration)\ + false + $(TEMP)\tbb_examples\$(Platform)\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Platform)\$(Configuration)\ + false + $(TEMP)\tbb_examples\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Configuration)\ + false + $(TEMP)\tbb_examples\$(Platform)\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Platform)\$(Configuration)\ + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG;%(PreprocessorDefinitions) + MultiThreadedDebugDLL + + + ProgramDatabase + + + tbb_debug.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc12;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc12;%(AdditionalLibraryDirectories) + true + Console + false + false + + + MachineX86 + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 debug "$(OutDir)" + + + + + X64 + + + Disabled + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG;%(PreprocessorDefinitions) + MultiThreadedDebugDLL + + + ProgramDatabase + + + tbb_debug.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc12;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc12;%(AdditionalLibraryDirectories) + true + Console + false + false + + + MachineX64 + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 debug "$(OutDir)" + + + + + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + + + ProgramDatabase + + + tbb.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc12;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc12;%(AdditionalLibraryDirectories) + true + Console + true + true + false + false + + + MachineX86 + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 release "$(OutDir)" + + + + + X64 + + + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + + + ProgramDatabase + + + tbb.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc12;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc12;%(AdditionalLibraryDirectories) + true + Console + true + true + false + false + + + MachineX64 + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 release "$(OutDir)" + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/xdl/third_party/tbb/examples/graph/som/readme.html b/xdl/third_party/tbb/examples/graph/som/readme.html new file mode 100644 index 00000000..18e34d50 --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/som/readme.html @@ -0,0 +1,391 @@ + + + + + + Intel® Threading Building Blocks. Self-Organizing Map (SOM) sample + + + + + +

+ The Self-Organizing Map demonstrates tbb::flow and the use of cancellation in scheduling multiple iterations of + map updates. +

+ For tutorials on Self-organizing Maps, see here and + here. +

+ The program trains the map with several examples, splitting the map into subsections and looking for best-match + for multiple examples. When an example is used to update the map, the graphs examining the sections being + updated for the next example are cancelled and restarted after the update. +

+ +
+
System Requirements
+ +
+

+ For the most up to date system requirements, see the release notes. +

+
+
+ +
+
Files
+ +
+
+
som_graph.cpp +
The main program. +
som.cpp +
Utilities for handling the map. +
som.h +
Definitions and utilities. +
Makefile +
Makefile for building the example. +
+
+
+ +
+
Directories
+ +
+
+
msvs +
Contains Microsoft* Visual Studio* workspace for building and running the example (Windows* systems only). +
xcode +
Contains Xcode* IDE workspace for building and running the example (macOS* systems only). +
+

For information about the minimum supported version of IDE, see release notes.

+
+
+ +
+
Build instructions
+ +
+

General build directions can be found here.

+
+
+ +
+ Up to parent directory +
+
+
Legal Information
+ +
+

+ Intel and the Intel logo are trademarks of Intel Corporation in the U.S. and/or other countries. +
* Other names and brands may be claimed as the property of others. +
© 2018, Intel Corporation +

+
+
+ + + diff --git a/xdl/third_party/tbb/examples/graph/som/som.cpp b/xdl/third_party/tbb/examples/graph/som/som.cpp new file mode 100644 index 00000000..89b58da4 --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/som/som.cpp @@ -0,0 +1,217 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +// +// Self-organizing map in TBB flow::graph +// +// we will do a color map (the simple example.) +// +// serial algorithm +// +// initialize map with vectors (could be random, gradient, or something else) +// for some number of iterations +// update radius r, weight of change L +// for each example V +// find the best matching unit +// for each part of map within radius of BMU W +// update vector: W(t+1) = W(t) + w(dist)*L*(V - W(t)) + +#include "som.h" +#include "tbb/task.h" + +std::ostream& operator<<( std::ostream &out, const SOM_element &s) { + out << "("; + for(int i=0;i<(int)s.w.size();++i) { + out << s.w[i]; + if(i < (int)s.w.size()-1) { + out << ","; + } + } + out << ")"; + return out; +} + +void remark_SOM_element(const SOM_element &s) { + printf("("); + for(int i=0;i<(int)s.w.size();++i) { + printf("%g",s.w[i]); + if(i < (int)s.w.size()-1) { + printf(","); + } + } + printf(")"); +} + +std::ostream& operator<<( std::ostream &out, const search_result_type &s) { + out << "<"; + out << get(s); + out << ", " << get(s); + out << ", "; + out << get(s); + out << ">"; + return out; +} + +void remark_search_result_type(const search_result_type &s) { + printf("<%g,%d,%d>", get(s), get(s), get(s)); +} + +double +randval( double lowlimit, double highlimit) { + return double(rand()) / double(RAND_MAX) * (highlimit - lowlimit) + lowlimit; +} + +void +find_data_ranges(teaching_vector_type &teaching, SOM_element &max_range, SOM_element &min_range ) { + if(teaching.size() == 0) return; + max_range = min_range = teaching[0]; + for(int i = 1; i < (int)teaching.size(); ++i) { + max_range.elementwise_max(teaching[i]); + min_range.elementwise_min(teaching[i]); + } +} + +void add_fraction_of_difference( SOM_element &to, SOM_element const &from, double frac) { + for(int i = 0; i < (int)from.size(); ++i) { + to[i] += frac*(from[i] - to[i]); + } +} + +double +distance_squared(SOM_element x, SOM_element y) { + double rval = 0.0; for(int i=0;i<(int)x.size();++i) { + double diff = x[i] - y[i]; + rval += diff*diff; + } + return rval; +} + +void SOMap::initialize(InitializeType it, SOM_element &max_range, SOM_element &min_range) { + for(int x = 0; x < xMax; ++x) { + for(int y = 0; y < yMax; ++y) { + for( int i = 0; i < (int)max_range.size(); ++i) { + if(it == InitializeRandom) { + my_map[x][y][i] = (randval(min_range[i], max_range[i])); + } + else if(it == InitializeGradient) { + my_map[x][y][i] = ((double)(x+y)/(xMax+yMax)*(max_range[i]-min_range[i]) + min_range[i]); + } + } + } + } +} + +// subsquare [low,high) +double +SOMap::BMU_range( const SOM_element &s, int &xval, int &yval, subsquare_type &r) { + double min_distance_squared = DBL_MAX; + task &my_task = task::self(); + int min_x = -1; + int min_y = -1; + for(int x = r.rows().begin(); x != r.rows().end(); ++x) { + for( int y = r.cols().begin(); y != r.cols().end(); ++y) { + double dist = distance_squared(s,my_map[x][y]); + if(dist < min_distance_squared) { + min_distance_squared = dist; + min_x = x; + min_y = y; + } + if(cancel_test && my_task.is_cancelled()) { + xval = r.rows().begin(); + yval = r.cols().begin(); + return DBL_MAX; + } + } + } + xval = min_x; + yval = min_y; + return sqrt(min_distance_squared); +} + +void +SOMap::epoch_update_range( SOM_element const &s, int epoch, int min_x, int min_y, double radius, double learning_rate, blocked_range &r) { + int min_xiter = (int)((double)min_x - radius); + if(min_xiter < 0) min_xiter = 0; + int max_xiter = (int)((double)min_x + radius); + if(max_xiter > (int)my_map.size()-1) max_xiter = (int)my_map.size()-1; + for(int xx = r.begin(); xx <= r.end(); ++xx) { + double xrsq = (xx-min_x)*(xx-min_x); + double ysq = radius*radius - xrsq; // max extent of y influence + double yd; + if(ysq > 0) { + yd = sqrt(ysq); + int lb = (int)(min_y - yd); + int ub = (int)(min_y + yd); + for(int yy = lb; yy < ub; ++yy) { + if(yy >= 0 && yy < (int)my_map[xx].size()) { + // [xx, yy] is in the range of the update. + double my_rsq = xrsq + (yy-min_y)*(yy-min_y); // distance from BMU squared + double theta = exp(-(radius*radius) /(2.0* my_rsq)); + add_fraction_of_difference(my_map[xx][yy], s, theta * learning_rate); + } + } + } + } +} + +void SOMap::teach(teaching_vector_type &in) { + for(int i = 0; i < nPasses; ++i ) { + int j = (int)(randval(0, (double)in.size())); // this won't be reproducible. + if(j == in.size()) --j; + + int min_x = -1; + int min_y = -1; + subsquare_type br2(0, (int)my_map.size(), 1, 0, (int)my_map[0].size(), 1); + (void) BMU_range(in[j],min_x, min_y, br2); // just need min_x, min_y + // radius of interest + double radius = max_radius * exp(-(double)i*radius_decay_rate); + // update circle is min_xiter to max_xiter inclusive. + double learning_rate = max_learning_rate * exp( -(double)i * learning_decay_rate); + epoch_update(in[j], i, min_x, min_y, radius, learning_rate); + } +} + +void SOMap::debug_output() { + printf("SOMap:\n"); + for(int i = 0; i < (int)(this->my_map.size()); ++i) { + for(int j = 0; j < (int)(this->my_map[i].size()); ++j) { + printf( "map[%d, %d] == ", i, j ); + remark_SOM_element( this->my_map[i][j] ); + printf("\n"); + } + } +} + +#define RED 0 +#define GREEN 1 +#define BLUE 2 + +void readInputData() { + my_teaching.push_back(SOM_element()); + my_teaching.push_back(SOM_element()); + my_teaching.push_back(SOM_element()); + my_teaching.push_back(SOM_element()); + my_teaching.push_back(SOM_element()); + my_teaching[0][RED] = 1.0; my_teaching[0][GREEN] = 0.0; my_teaching[0][BLUE] = 0.0; + my_teaching[1][RED] = 0.0; my_teaching[1][GREEN] = 1.0; my_teaching[1][BLUE] = 0.0; + my_teaching[2][RED] = 0.0; my_teaching[2][GREEN] = 0.0; my_teaching[2][BLUE] = 1.0; + my_teaching[3][RED] = 0.3; my_teaching[3][GREEN] = 0.3; my_teaching[3][BLUE] = 0.0; + my_teaching[4][RED] = 0.5; my_teaching[4][GREEN] = 0.5; my_teaching[4][BLUE] = 0.9; +} diff --git a/xdl/third_party/tbb/examples/graph/som/som.h b/xdl/third_party/tbb/examples/graph/som/som.h new file mode 100644 index 00000000..9d46e7fa --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/som/som.h @@ -0,0 +1,161 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +// +// Self-organizing map +// +// support for self-ordering maps +#ifndef __SOM_H__ +#define __SOM_H__ + +#include +#include +#include +#include +#include +#include + +#include "tbb/flow_graph.h" +#include "tbb/blocked_range2d.h" + +using namespace tbb; +using namespace tbb::flow; + +typedef blocked_range2d subsquare_type; +typedef tuple search_result_type; + +std::ostream& operator<<( std::ostream &out, const search_result_type &s); + +#define RADIUS 0 // for the std::gets +#define XV 1 +#define YV 2 + +// to have single definitions of static variables, define _MAIN_C_ in the main program +// +#ifdef _MAIN_C_ +#define DEFINE // nothing +#define INIT(n) = n +#else // not in main file +#define DEFINE extern +#define INIT(n) // nothing +#endif // _MAIN_C_ + +DEFINE int nElements INIT(3); // length of input vectors, matching vector in map +DEFINE double max_learning_rate INIT(0.8); // decays exponentially +DEFINE double radius_decay_rate; +DEFINE double learning_decay_rate INIT(0.005); +DEFINE double max_radius; +DEFINE bool extra_debug INIT(false); +DEFINE bool cancel_test INIT(false); + +DEFINE int xMax INIT(100); +DEFINE int yMax INIT(100); +DEFINE int nPasses INIT(100); + +enum InitializeType { InitializeRandom, InitializeGradient }; +#define RED 0 +#define GREEN 1 +#define BLUE 2 +class SOM_element; +void remark_SOM_element(const SOM_element &s); + +// all SOM_element vectors are the same length (nElements), so we do not have +// to range-check the vector accesses. +class SOM_element { + std::vector w; +public: + friend std::ostream& operator<<( std::ostream &out, const SOM_element &s); + friend void remark_SOM_element(const SOM_element &s); + SOM_element() : w(nElements,0.0) {} + double &operator[](int indx) { return w.at(indx); } + const double &operator[](int indx) const { return w.at(indx); } + bool operator==(SOM_element const &other) const { + for(size_t i=0;i other.w[i]) w[i] = other.w[i]; + } + size_t size() const { return w.size(); } +}; + +typedef std::vector teaching_vector_type; + +DEFINE SOM_element max_range; +DEFINE SOM_element min_range; + +extern double randval( double lowlimit, double highlimit); + +extern void find_data_ranges(teaching_vector_type &teaching, SOM_element &max_range, SOM_element &min_range ); + +extern void add_fraction_of_difference( SOM_element &to, SOM_element &from, double frac); + +DEFINE teaching_vector_type my_teaching; + +class SOMap { + std::vector< std::vector< SOM_element > > my_map; +public: + SOMap(int xSize, int ySize) { + my_map.reserve(xSize); + for(int i = 0; i < xSize; ++i) { + my_map.push_back(teaching_vector_type()); + my_map[i].reserve(ySize); + for(int j = 0; j < ySize;++j) { + my_map[i].push_back(SOM_element()); + } + } + } + size_t size() { return my_map.size(); } + void initialize(InitializeType it, SOM_element &max_range, SOM_element &min_range); + teaching_vector_type &operator[](int indx) { return my_map[indx]; } + SOM_element &at(int xVal, int yVal) { return my_map[xVal][yVal]; } + SOM_element &at(search_result_type const &s) { return my_map[flow::get<1>(s)][flow::get<2>(s)]; } + void epoch_update( SOM_element const &s, int epoch, int min_x, int min_y, double radius, double learning_rate) { + int min_xiter = (int)((double)min_x - radius); + if(min_xiter < 0) min_xiter = 0; + int max_xiter = (int)((double)min_x + radius); + if(max_xiter > (int)my_map.size()-1) max_xiter = (int)(my_map.size()-1); + blocked_range br1(min_xiter, max_xiter, 1); + epoch_update_range(s, epoch, min_x, min_y, radius, learning_rate, br1); + } + void epoch_update_range( SOM_element const &s, int epoch, int min_x, int min_y, double radius, double learning_rate, blocked_range &r); + void teach( teaching_vector_type &id); + void debug_output(); + // find BMU given an input, returns distance + double BMU_range(const SOM_element &s, int &xval, int &yval, subsquare_type &r); + double BMU(const SOM_element &s, int &xval, int &yval) { + subsquare_type br(0,(int)my_map.size(),1,0,(int)my_map[0].size(),1); + return BMU_range(s, xval, yval, br); + } +}; + +extern double distance_squared(SOM_element x, SOM_element y); +void remark_SOM_element(const SOM_element &s); + +extern void readInputData(); +#endif // __SOM_H__ diff --git a/xdl/third_party/tbb/examples/graph/som/som_graph.cpp b/xdl/third_party/tbb/examples/graph/som/som_graph.cpp new file mode 100644 index 00000000..18759047 --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/som/som_graph.cpp @@ -0,0 +1,423 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +// +// Self-organizing map in TBB flow::graph +// +// This is an example of the use of cancellation in a graph. After a point in searching for +// the best match for an example, two examples are looked for simultaneously. When the +// earlier example is found and the update radius is determined, the affected searches +// for the subsequent example are cancelled, and after the update they are restarted. +// As the update radius shrinks fewer searches are cancelled, and by the last iterations +// virtually all the work done for the speculating example is useful. +// +// first, a simple implementation with only one example vector +// at a time. +// +// we will do a color map (the simple example.) +// +// graph algorithm +// +// for some number of iterations +// update radius r, weight of change L +// for each example V +// use graph to find BMU +// for each part of map within radius of BMU W +// update vector: W(t+1) = W(t) + w(dist)*L*(V - W(t)) + +#define _MAIN_C_ 1 +#include "som.h" + +#include "tbb/task_scheduler_init.h" +#include "tbb/flow_graph.h" +#include "tbb/blocked_range2d.h" +#include "tbb/tick_count.h" +#include "../../common/utility/utility.h" + +#define RED 0 +#define GREEN 1 +#define BLUE 2 + +static int xranges = 1; +static int yranges = 1; +static int xsize = -1; +static int ysize = -1; + +static int global_i = 0; +static int speculation_start; +std::vector function_node_execs; +static int xRangeMax = 3; +static int yRangeMax = 3; +static bool dont_speculate = false; +static search_result_type last_update; + +class BMU_search_body { + SOMap &my_map; + subsquare_type my_square; + int &fn_tally; +public: + BMU_search_body(SOMap &_m, subsquare_type &_sq, int &fnt) : my_map(_m), my_square(_sq), fn_tally(fnt) { } + BMU_search_body( const BMU_search_body &other) : my_map(other.my_map), my_square(other.my_square), fn_tally(other.fn_tally) { } + search_result_type operator()(const SOM_element s) { + int my_x; + int my_y; + double min_dist = my_map.BMU_range(s, my_x, my_y, my_square); + ++fn_tally; // count how many times this function_node executed + return search_result_type(min_dist, my_x, my_y); + } +}; + +typedef function_node search_node; +typedef broadcast_node b_node; +typedef std::vector< search_node *> search_node_vector_type; +typedef std::vector< search_node_vector_type > search_node_array_type; +typedef std::vector< graph *> graph_vector_type; +typedef std::vector< graph_vector_type > graph_array_type; + +#define SPECULATION_CNT 2 + +graph *g[SPECULATION_CNT]; // main graph; there should only be one per epoch +b_node *send_to[SPECULATION_CNT]; // broadcast node to send exemplar to all function_nodes +queue_node *q[SPECULATION_CNT]; // queue for function nodes to put their results in +// each function_node should have its own graph +search_node_array_type* s_array[SPECULATION_CNT]; // 2d array of function nodes +graph_array_type* g_array[SPECULATION_CNT]; // 2d array of graphs + +// build a set of SPECULATION_CNT graphs, each of which consists of a broadcast_node, +// xranges x yranges function_nodes, and one queue_node for output. +// once speculation starts, if i % SPECULATION_CNT is the current graph, (i+1) % SPECULATION_CNT +// is the first speculation, and so on. +void +build_BMU_graph(SOMap &map1) { + // build current graph + xsize = ((int)map1.size() + xranges - 1) / xranges; + ysize = ((int)map1[0].size() + yranges - 1) / yranges; + function_node_execs.clear(); + function_node_execs.reserve(xranges*yranges+1); + for(int ii = 0; ii < xranges*yranges+1;++ii) function_node_execs.push_back(0); + + for(int scnt = 0; scnt < SPECULATION_CNT; ++scnt) { + g[scnt] = new graph; + send_to[scnt] = new b_node(*(g[scnt])); // broadcast node to the function_nodes + q[scnt] = new queue_node(*(g[scnt])); // output queue + + // create the function_nodes, tie to the graph + s_array[scnt] = new search_node_array_type; + s_array[scnt]->reserve(xranges); + g_array[scnt] = new graph_array_type; + g_array[scnt]->reserve(xranges); + for(int i = 0; i < (int)map1.size(); i += xsize) { + int xindex = i / xsize; + s_array[scnt]->push_back(search_node_vector_type()); + (*s_array[scnt])[xindex].reserve(yranges); + g_array[scnt]->push_back(graph_vector_type()); + (*g_array[scnt])[xindex].reserve(yranges); + for( int j = 0; j < (int)map1[0].size(); j += ysize) { + int offset = (i/xsize)*yranges + (j / ysize); + int xmax = (i + xsize) > (int)map1.size() ? (int)map1.size() : i + xsize; + int ymax = (j + ysize) > (int)map1[0].size() ? (int)map1[0].size() : j + ysize; + subsquare_type sst(i,xmax,1,j,ymax,1); + BMU_search_body bb(map1,sst,function_node_execs[offset]); + graph *g_local = new graph; + search_node *s = new search_node(*g_local, serial, bb); // copies Body + (*g_array[scnt])[xindex].push_back(g_local); + (*s_array[scnt])[xindex].push_back(s); + make_edge(*(send_to[scnt]), *s); // broadcast_node -> function_node + make_edge(*s, *(q[scnt])); // function_node -> queue_node + } + } + } +} + +// Wait for the 2D array of flow::graphs. +void wait_for_all_graphs(int cIndex) { // cIndex ranges over [0 .. SPECULATION_CNT - 1] + for(int x = 0; x < xranges; ++x) { + for(int y = 0; y < yranges; ++y) { + (*g_array[cIndex])[x][y]->wait_for_all(); + } + } +} + +void +destroy_BMU_graph() { + for(int scnt = 0; scnt < SPECULATION_CNT; ++scnt) { + for( int i = 0; i < (int)(*s_array[scnt]).size(); ++i ) { + for(int j = 0; j < (int)(*s_array[scnt])[i].size(); ++j) { + delete (*s_array[scnt])[i][j]; + delete (*g_array[scnt])[i][j]; + } + } + (*s_array[scnt]).clear(); + delete s_array[scnt]; + (*g_array[scnt]).clear(); + delete g_array[scnt]; + delete q[scnt]; + delete send_to[scnt]; + delete g[scnt]; + } +} + +void find_subrange_overlap(int const &xval, int const &yval, double const &radius, int &xlow, int &xhigh, int &ylow, int &yhigh) { + xlow = int((xval-radius)/xsize); + xhigh = int((xval+radius)/xsize); + ylow = int((yval-radius)/ysize); + yhigh = int((yval+radius)/ysize); + // circle may fall partly outside map + if(xlow < 0) xlow = 0; + if(xhigh >= xranges) xhigh = xranges - 1; + if(ylow < 0) ylow = 0; + if(yhigh >= yranges) yhigh = yranges - 1; +} + +bool overlap( int &xval, int &yval, search_result_type &sr) { + int xlow, xhigh, ylow, yhigh; + find_subrange_overlap(get(sr), get(sr), get(sr), xlow, xhigh, ylow, yhigh); + return xval >= xlow && xval <= xhigh && yval >= ylow && yval <= yhigh; +} + +void +cancel_submaps(int &xval, int &yval, double &radius, int indx) { + int xlow; + int xhigh; + int ylow; + int yhigh; + find_subrange_overlap(xval, yval, radius, xlow, xhigh, ylow, yhigh); + for(int x = xlow; x <= xhigh; ++x) { + for(int y = ylow; y <= yhigh; ++y) { + (*g_array[indx])[x][y]->root_task()->cancel_group_execution(); + } + } +} + +void +restart_submaps(int &xval, int &yval, double &radius, int indx, SOM_element &vector) { + int xlow; + int xhigh; + int ylow; + int yhigh; + find_subrange_overlap(xval, yval, radius, xlow, xhigh, ylow, yhigh); + for(int x = xlow; x <= xhigh; ++x) { + for(int y = ylow; y <= yhigh; ++y) { + // have to reset the graph + (*g_array[indx])[x][y]->root_task()->context()->reset(); + // and re-submit the exemplar for search. + (*s_array[indx])[x][y]->try_put(vector); + } + } +} + +search_result_type +graph_BMU( int indx ) { // indx ranges over [0 .. SPECULATION_CNT -1] + wait_for_all_graphs(indx); // wait for the array of subgraphs + (g[indx])->wait_for_all(); + std::vector all_srs(xRangeMax*yRangeMax,search_result_type(DBL_MAX,-1,-1)); + search_result_type sr; + search_result_type min_sr; + get(min_sr) = DBL_MAX; + int result_count = 0; + while((q[indx])->try_get(sr)) { + ++result_count; + // figure which submap this came from + int x = get(sr) / xsize; + int y = get(sr) / ysize; + int offset = x*yranges+y; // linearized subscript + all_srs[offset] = sr; + if(get(sr) < get(min_sr)) + min_sr = sr; + else if(get(sr) == get(min_sr)) { + if(get(sr) < get(min_sr)) { + min_sr = sr; + } + else if((get(sr) == get(min_sr) && + get(sr) < get(min_sr))) + { + min_sr = sr; + } + } + } + return min_sr; + // end of one epoch +} + +void graph_teach(SOMap &map1, teaching_vector_type &in) { + build_BMU_graph(map1); + // normally the training would pick random exemplars to teach the SOM. We need + // the process to be reproducible, so we will pick the exemplars in order, [0, in.size()) + int next_j = 0; + for(int epoch = 0; epoch < nPasses; ++epoch) { + global_i = epoch; + bool canceled_submaps = false; + int j = next_j; // try to make reproducible + next_j = (epoch+1) % in.size(); + search_result_type min_sr; + if(epoch < speculation_start) { + (send_to[epoch%SPECULATION_CNT])->try_put(in[j]); + } + else if(epoch == speculation_start) { + (send_to[epoch%SPECULATION_CNT])->try_put(in[j]); + if(epoch < nPasses-1) { + (send_to[(epoch+1)%SPECULATION_CNT])->try_put(in[next_j]); + } + } + else if(epoch < nPasses - 1) { + (send_to[(epoch+1)%SPECULATION_CNT])->try_put(in[next_j]); + } + min_sr = graph_BMU(epoch % SPECULATION_CNT); //calls wait_for_all() + double min_distance = get<0>(min_sr); + double radius = max_radius * exp(-(double)epoch*radius_decay_rate); + double learning_rate = max_learning_rate * exp(-(double)epoch * learning_decay_rate); + if(epoch >= speculation_start && epoch < (nPasses - 1)) { + // have to cancel the affected submaps + cancel_submaps(get(min_sr), get(min_sr), radius, (epoch+1)%SPECULATION_CNT); + canceled_submaps = true; + } + map1.epoch_update(in[j], epoch, get<1>(min_sr), get<2>(min_sr), radius, learning_rate); + ++global_i; + if(canceled_submaps) { + // do I have to wait for all the non-canceled speculative graph to complete first? + // yes, in case a canceled task was already executing. + wait_for_all_graphs((epoch+1) % SPECULATION_CNT); // wait for the array of subgraphs + restart_submaps(get<1>(min_sr), get<2>(min_sr), radius, (epoch+1)%SPECULATION_CNT, in[next_j]); + } + + last_update = min_sr; + get(last_update) = radius; // not smallest value, but range of effect + } + destroy_BMU_graph(); +} + +static const double serial_time_adjust = 1.25; +static double radius_fraction = 3.0; + +int +main(int argc, char** argv) { + int l_speculation_start; + utility::thread_number_range threads( + task_scheduler_init::default_num_threads, + task_scheduler_init::default_num_threads() // run only the default number of threads if none specified + ); + + utility::parse_cli_arguments(argc,argv, + utility::cli_argument_pack() + //"-h" option for for displaying help is present implicitly + .positional_arg(threads,"n-of-threads","number of threads to use; a range of the form low[:high], where low and optional high are non-negative integers or 'auto' for the TBB default.") + // .positional_arg(InputFileName,"input-file","input file name") + // .positional_arg(OutputFileName,"output-file","output file name") + .positional_arg(radius_fraction, "radius-fraction","size of radius at which to start speculating") + .positional_arg(nPasses, "number-of-epochs","number of examples used in learning phase") + .arg(cancel_test, "cancel-test", "test for cancel signal while finding BMU") + .arg(extra_debug, "debug", "additional output") + .arg(dont_speculate,"nospeculate","don't speculate in SOM map teaching") + ); + + readInputData(); + max_radius = (xMax < yMax) ? yMax / 2 : xMax / 2; + // need this value for the 1x1 timing below + radius_decay_rate = -(log(1.0/(double)max_radius) / (double)nPasses); + find_data_ranges(my_teaching, max_range, min_range ); + if(extra_debug) { + printf( "Data range: "); + remark_SOM_element(min_range); + printf( " to "); + remark_SOM_element(max_range); + printf( "\n"); + } + + // find how much time is taken for the single function_node case. + // adjust nPasses so the 1x1 time is somewhere around serial_time_adjust seconds. + // make sure the example test runs for at least 0.5 second. + for(;;) { + task_scheduler_init init(1); + SOMap map1(xMax,yMax); + speculation_start = nPasses + 1; // Don't speculate + + xranges = 1; + yranges = 1; + map1.initialize(InitializeGradient, max_range, min_range); + tick_count t0 = tick_count::now(); + graph_teach(map1, my_teaching); + tick_count t1 = tick_count::now(); + double nSeconds = (t1-t0).seconds(); + if(nSeconds < 0.5) { + xMax *= 2; + yMax *= 2; + continue; + } + double size_adjust = sqrt(serial_time_adjust / nSeconds); + xMax = (int)((double)xMax * size_adjust); + yMax = (int)((double)yMax * size_adjust); + max_radius = (xMax < yMax) ? yMax / 2 : xMax / 2; + radius_decay_rate = log((double)max_radius) / (double)nPasses; + + if(extra_debug) { + printf("original 1x1 case ran in %g seconds\n", nSeconds); + printf(" Size of table == %d x %d\n", xMax, yMax); + printf(" radius_decay_rate == %g\n", radius_decay_rate); + } + break; + } + + // the "max_radius" starts at 1/2*radius_fraction the table size. To start the speculation when the radius is + // 1 / n * the table size, the constant in the log below should be n / 2. so 2 == 1/4, 3 == 1/6th, + // et c. + if(dont_speculate) { + l_speculation_start = nPasses + 1; + if ( extra_debug )printf("speculation will not be done\n"); + } + else { + if(radius_fraction < 1.0 ) { + if ( extra_debug )printf("Warning: radius_fraction should be >= 1. Setting to 1.\n"); + radius_fraction = 1.0; + } + l_speculation_start = (int)((double)nPasses * log(radius_fraction) / log((double)nPasses)); + if ( extra_debug )printf( "We will start speculation at iteration %d\n", l_speculation_start ); + } + double single_time; // for speedup calculations + for(int p = threads.first; p <= threads.last; ++p) { + task_scheduler_init init(p); + if ( extra_debug )printf( " -------------- Running with %d threads. ------------\n", p); + // run the SOM build for a series of subranges + for(xranges = 1; xranges <= xRangeMax; ++xranges) { + for(yranges = xranges; yranges <= yRangeMax; ++yranges) { + if(xranges == 1 && yranges == 1) { + // don't pointlessly speculate if we're only running one subrange. + speculation_start = nPasses + 1; + } + else { + speculation_start = l_speculation_start; + } + SOMap map1(xMax, yMax); + map1.initialize(InitializeGradient, max_range, min_range); + + if(extra_debug) printf( "Start learning for [%d,%d] ----------- \n", xranges,yranges); + tick_count t0 = tick_count::now(); + graph_teach(map1, my_teaching); + tick_count t1 = tick_count::now(); + + if ( extra_debug )printf( "Done learning for [%d,%d], which took %g seconds ", xranges,yranges, (t1-t0).seconds()); + if(xranges == 1 && yranges == 1) single_time = (t1-t0).seconds(); + if ( extra_debug )printf( ": speedup == %g\n", single_time / (t1-t0).seconds()); + + } // yranges + } // xranges + } // #threads p + printf("done\n"); + return 0; +} diff --git a/xdl/third_party/tbb/examples/graph/som/xcode/som.xcodeproj/project.pbxproj b/xdl/third_party/tbb/examples/graph/som/xcode/som.xcodeproj/project.pbxproj new file mode 100644 index 00000000..41fd598f --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/som/xcode/som.xcodeproj/project.pbxproj @@ -0,0 +1,312 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 522FF8DD11F573FC00A587B2 /* som_graph.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 522FF8DB11F573FC00A587B2 /* som_graph.cpp */; }; + 522FF8DE11F573FC00A587B2 /* som.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 522FF8DC11F573FC00A587B2 /* som.cpp */; }; +/* End PBXBuildFile section */ + +/* Begin PBXBuildRule section */ + C3C58957218B643900DAC94C /* PBXBuildRule */ = { + isa = PBXBuildRule; + compilerSpec = com.intel.compilers.icc.latest; + fileType = sourcecode.cpp; + isEditable = 1; + outputFiles = ( + ); + script = "# Type a script or drag a script file from your workspace to insert its path.\n"; + }; +/* End PBXBuildRule section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 8DD76F690486A84900D96B5E /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 12; + dstPath = ""; + dstSubfolderSpec = 16; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 522FF8DB11F573FC00A587B2 /* som_graph.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = som_graph.cpp; path = ../som_graph.cpp; sourceTree = SOURCE_ROOT; }; + 522FF8DC11F573FC00A587B2 /* som.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = som.cpp; path = ../som.cpp; sourceTree = SOURCE_ROOT; }; + 8DD76F6C0486A84900D96B5E /* som */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = som; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 8DD76F660486A84900D96B5E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 08FB7794FE84155DC02AAC07 /* som */ = { + isa = PBXGroup; + children = ( + 08FB7795FE84155DC02AAC07 /* Source */, + 1AB674ADFE9D54B511CA2CBB /* Products */, + ); + name = som; + sourceTree = ""; + }; + 08FB7795FE84155DC02AAC07 /* Source */ = { + isa = PBXGroup; + children = ( + 522FF8DB11F573FC00A587B2 /* som_graph.cpp */, + 522FF8DC11F573FC00A587B2 /* som.cpp */, + ); + name = Source; + sourceTree = ""; + }; + 1AB674ADFE9D54B511CA2CBB /* Products */ = { + isa = PBXGroup; + children = ( + 8DD76F6C0486A84900D96B5E /* som */, + ); + name = Products; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 8DD76F620486A84900D96B5E /* som */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "som" */; + buildPhases = ( + 8DD76F640486A84900D96B5E /* Sources */, + 8DD76F660486A84900D96B5E /* Frameworks */, + 8DD76F690486A84900D96B5E /* CopyFiles */, + ); + buildRules = ( + C3C58957218B643900DAC94C /* PBXBuildRule */, + ); + dependencies = ( + ); + name = som; + productInstallPath = "$(HOME)/bin"; + productName = som; + productReference = 8DD76F6C0486A84900D96B5E /* som */; + productType = "com.apple.product-type.tool"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 08FB7793FE84155DC02AAC07 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1000; + }; + buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "som" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 1; + knownRegions = ( + en, + ); + mainGroup = 08FB7794FE84155DC02AAC07 /* som */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 8DD76F620486A84900D96B5E /* som */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + 8DD76F640486A84900D96B5E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 522FF8DD11F573FC00A587B2 /* som_graph.cpp in Sources */, + 522FF8DE11F573FC00A587B2 /* som.cpp in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + A1F593C60B8F0E6E00073279 /* Debug64 */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = _CONSOLE; + GCC_VERSION = ""; + HEADER_SEARCH_PATHS = "$(inherited)"; + ICC_CXX_LANG_DIALECT = "c++11"; + INSTALL_PATH = "$(HOME)/bin"; + LIBRARY_SEARCH_PATHS = "$(inherited)"; + PRODUCT_NAME = som; + ZERO_LINK = NO; + }; + name = Debug64; + }; + A1F593C70B8F0E6E00073279 /* Release64 */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_GENERATE_DEBUGGING_SYMBOLS = NO; + GCC_PREPROCESSOR_DEFINITIONS = _CONSOLE; + GCC_VERSION = ""; + HEADER_SEARCH_PATHS = "$(inherited)"; + ICC_CXX_LANG_DIALECT = "c++11"; + INSTALL_PATH = "$(HOME)/bin"; + LIBRARY_SEARCH_PATHS = "$(inherited)"; + PRODUCT_NAME = som; + ZERO_LINK = NO; + }; + name = Release64; + }; + A1F593C80B8F0E6E00073279 /* Debug64 */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_ENABLE_CPP_RTTI = YES; + GCC_MODEL_TUNING = ""; + GCC_NO_COMMON_BLOCKS = YES; + GCC_VERSION = ""; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(TBBROOT)/include", + /opt/intel/tbb/include, + ); + ICC_CXX_LANG_DIALECT = "c++11"; + LD_RUNPATH_SEARCH_PATHS = "$(TBBROOT)/lib /opt/intel/tbb/lib"; + LIBRARY_SEARCH_PATHS = ( + "$(TBBROOT)/lib", + /opt/intel/tbb/lib, + ); + MACOSX_DEPLOYMENT_TARGET = 10.11; + ONLY_ACTIVE_ARCH = YES; + OTHER_CPLUSPLUSFLAGS = ( + "$(OTHER_CFLAGS)", + "-m64", + ); + OTHER_LDFLAGS = ( + "-m64", + "-ltbb_debug", + ); + PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO; + SYMROOT = "/tmp/tbb-$(USER)"; + VALID_ARCHS = x86_64; + }; + name = Debug64; + }; + A1F593C90B8F0E6E00073279 /* Release64 */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_ENABLE_CPP_RTTI = YES; + GCC_MODEL_TUNING = ""; + GCC_NO_COMMON_BLOCKS = YES; + GCC_VERSION = ""; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(TBBROOT)/include", + /opt/intel/tbb/include, + ); + ICC_CXX_LANG_DIALECT = "c++11"; + LD_RUNPATH_SEARCH_PATHS = "$(TBBROOT)/lib /opt/intel/tbb/lib"; + LIBRARY_SEARCH_PATHS = ( + "$(TBBROOT)/lib", + /opt/intel/tbb/lib, + ); + MACOSX_DEPLOYMENT_TARGET = 10.11; + OTHER_CPLUSPLUSFLAGS = ( + "$(OTHER_CFLAGS)", + "-m64", + ); + OTHER_LDFLAGS = ( + "-m64", + "-ltbb", + ); + PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO; + SYMROOT = "/tmp/tbb-$(USER)"; + VALID_ARCHS = x86_64; + }; + name = Release64; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "som" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A1F593C60B8F0E6E00073279 /* Debug64 */, + A1F593C70B8F0E6E00073279 /* Release64 */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug64; + }; + 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "som" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A1F593C80B8F0E6E00073279 /* Debug64 */, + A1F593C90B8F0E6E00073279 /* Release64 */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug64; + }; +/* End XCConfigurationList section */ + }; + rootObject = 08FB7793FE84155DC02AAC07 /* Project object */; +} diff --git a/xdl/third_party/tbb/examples/graph/stereo/Makefile b/xdl/third_party/tbb/examples/graph/stereo/Makefile new file mode 100644 index 00000000..404dafa3 --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/stereo/Makefile @@ -0,0 +1,74 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +# GNU Makefile that builds and runs example. +run_cmd= +PROG=stereo +ARGS= +PERF_RUN_ARGS= + +# icpc by default +ifneq (,$(shell which icc 2>/dev/null)) +CXX=icpc +endif + +# autodetect C++11 support +include ../../common/examples-common.inc + +# TBB libs +TBBLIB=-ltbb +TBBLIB_DEBUG=-ltbb_debug + +# OpenCL lib +OPENCL_LIB=-lOpenCL + +ifeq ($(shell uname), Linux) +ifeq ($(target), android) +LIBS+= --sysroot=$(SYSROOT) +run_cmd=../../common/android.linux.launcher.sh +else +LIBS+= -lrt +endif +else +ifeq ($(shell uname),Darwin) +override CXXFLAGS += -Wl,-rpath,$(TBBROOT)/lib +override OPENCL_LIB=-framework OpenCL +endif +endif + +all: release test + +release: *.cpp + $(CXX) -O2 -DNDEBUG $(CXXFLAGS) -o $(PROG) $^ $(TBBLIB) $(OPENCL_LIB) $(LIBS) $(CXX0XFLAGS) + +debug: *.cpp + $(CXX) -O0 -g -DTBB_USE_DEBUG $(CXXFLAGS) -o $(PROG) $^ $(TBBLIB_DEBUG) $(OPENCL_LIB) $(LIBS) $(CXX0XFLAGS) + +profile: override CXXFLAGS += -DTBB_USE_THREADING_TOOLS -g +profile: release + +clean: + $(RM) $(PROG) *.o *.d + +test: + $(run_cmd) ./$(PROG) $(ARGS) + +perf_build: release + +perf_run: + $(run_cmd) ./$(PROG) $(PERF_RUN_ARGS) diff --git a/xdl/third_party/tbb/examples/graph/stereo/Makefile.windows b/xdl/third_party/tbb/examples/graph/stereo/Makefile.windows new file mode 100644 index 00000000..032fa95d --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/stereo/Makefile.windows @@ -0,0 +1,59 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +# Common Makefile that builds and runs example. + +# Just specify your program basename +PROG=stereo +ARGS= +PERF_RUN_ARGS= + +# Trying to find if icl.exe is set +CXX1 = $(TBB_CXX)- +CXX2 = $(CXX1:icl.exe-=icl.exe) +CXX = $(CXX2:-=cl.exe) + +# TBB libs +TBBLIB=tbb.lib +TBBLIB_DEBUG=tbb_debug.lib + +# OpenCL lib +OPENCL_LIB=OpenCL.lib + +# The C++ compiler options +MYCXXFLAGS=/TP /EHsc /W3 /nologo /D _CONSOLE /D _MBCS /D WIN32 /D _CRT_SECURE_NO_DEPRECATE /D _CRT_SECURE_NO_WARNINGS /D _SCL_SECURE_NO_WARNINGS $(CXXFLAGS) +MYLDFLAGS=/INCREMENTAL:NO /NOLOGO /DEBUG $(LDFLAGS) + +all: release test +release: + $(CXX) *.cpp /MD /O2 /D NDEBUG $(MYCXXFLAGS) /link $(TBBLIB) $(OPENCL_LIB) $(MYLDFLAGS) /OUT:$(PROG).exe +debug: + $(CXX) *.cpp /MDd /Od /Zi /D TBB_USE_DEBUG /D _DEBUG $(MYCXXFLAGS) /link $(TBBLIB_DEBUG) $(OPENCL_LIB) $(MYLDFLAGS) /OUT:$(PROG).exe +profile: + $(CXX) *.cpp /MD /O2 /Zi /D NDEBUG $(MYCXXFLAGS) /D TBB_USE_THREADING_TOOLS /link $(TBBLIB) $(OPENCL_LIB) $(MYLDFLAGS) /OUT:$(PROG).exe +clean: + @cmd.exe /C del $(PROG).exe *.obj *.?db *.manifest +test: + $(PROG) $(ARGS) +compiler_check: + @$(CXX) >nul 2>&1 || echo "$(CXX) command not found. Check if CXX=$(CXX) is set properly" + +perf_build: release + +perf_run: + $(PROG) $(PERF_RUN_ARGS) diff --git a/xdl/third_party/tbb/examples/graph/stereo/imageEffects.cl b/xdl/third_party/tbb/examples/graph/stereo/imageEffects.cl new file mode 100644 index 00000000..7c77955e --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/stereo/imageEffects.cl @@ -0,0 +1,56 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +__constant int redChannelOffset = 0; +__constant int greenChannelOffset = 1; +__constant int blueChannelOffset = 2; +__constant int channelsPerPixel = 4; +__constant uint channelIncreaseValue = 10; + +__kernel void mergeImages( __global uchar* bufferLeft, __global uchar* bufferRight, uint width) { + const int indexWidth = get_global_id(0); + const int indexHeight = get_global_id(1); + + const int pixelIndex = channelsPerPixel * width * indexHeight + channelsPerPixel * indexWidth; + const int pixelGreenChannelIndex = pixelIndex + greenChannelOffset; + const int pixelBlueChannelIndex = pixelIndex + blueChannelOffset; + + bufferLeft[pixelGreenChannelIndex] = (bufferRight[pixelGreenChannelIndex] + bufferLeft[pixelGreenChannelIndex]) / 2; + bufferLeft[pixelBlueChannelIndex] = bufferRight[pixelBlueChannelIndex]; +} + +__kernel void applyLeftImageEffect( __global uchar* bufferLeft, uint width) { + const int indexWidth = get_global_id(0); + const int indexHeight = get_global_id(1); + + const int pixelRedChannelIndex = channelsPerPixel * width * indexHeight + channelsPerPixel * indexWidth + redChannelOffset; + + bufferLeft[pixelRedChannelIndex] = convert_uchar_sat(bufferLeft[pixelRedChannelIndex] + channelIncreaseValue); +} + +__kernel void applyRightImageEffect( __global uchar* bufferRight, uint width) { + const int indexWidth = get_global_id(0); + const int indexHeight = get_global_id(1); + + const int pixelBlueChannelIndex = channelsPerPixel * width * indexHeight + channelsPerPixel * indexWidth + blueChannelOffset; + + bufferRight[pixelBlueChannelIndex] = convert_uchar_sat(bufferRight[pixelBlueChannelIndex] + channelIncreaseValue); + +} diff --git a/xdl/third_party/tbb/examples/graph/stereo/lodepng.cpp b/xdl/third_party/tbb/examples/graph/stereo/lodepng.cpp new file mode 100644 index 00000000..5080f5a0 --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/stereo/lodepng.cpp @@ -0,0 +1,6227 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +/* +LodePNG version 20160409 + +Copyright (c) 2005-2016 Lode Vandevenne + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + + 3. This notice may not be removed or altered from any source + distribution. +*/ + +/* +The manual and changelog are in the header file "lodepng.h" +Rename this file to lodepng.cpp to use it for C++, or to lodepng.c to use it for C. +*/ + +#include "lodepng.h" + +#include +#include +#include + +/*Visual Studio: A few warning types are not desired here.*/ +#if defined(_MSC_VER) && (_MSC_VER >= 1310) +#pragma warning( disable : 4244 ) /*implicit conversions: not warned by gcc -Wall -Wextra and requires too much casts*/ +#pragma warning( disable : 4996 ) /*VS does not like fopen, but fopen_s is not standard C so unusable here*/ +#endif /*_MSC_VER */ + +const char* LODEPNG_VERSION_STRING = "20160409"; + +/* +This source file is built up in the following large parts. The code sections +with the "LODEPNG_COMPILE_" #defines divide this up further in an intermixed way. +-Tools for C and common code for PNG and Zlib +-C Code for Zlib (huffman, deflate, ...) +-C Code for PNG (file format chunks, adam7, PNG filters, color conversions, ...) +-The C++ wrapper around all of the above +*/ + +/*The malloc, realloc and free functions defined here with "lodepng_" in front +of the name, so that you can easily change them to others related to your +platform if needed. Everything else in the code calls these. Pass +-DLODEPNG_NO_COMPILE_ALLOCATORS to the compiler, or comment out +#define LODEPNG_COMPILE_ALLOCATORS in the header, to disable the ones here and +define them in your own project's source files without needing to change +lodepng source code. Don't forget to remove "static" if you copypaste them +from here.*/ + +#ifdef LODEPNG_COMPILE_ALLOCATORS +static void* lodepng_malloc(size_t size) +{ + return malloc(size); +} + +static void* lodepng_realloc(void* ptr, size_t new_size) +{ + return realloc(ptr, new_size); +} + +static void lodepng_free(void* ptr) +{ + free(ptr); +} +#else /*LODEPNG_COMPILE_ALLOCATORS*/ +void* lodepng_malloc(size_t size); +void* lodepng_realloc(void* ptr, size_t new_size); +void lodepng_free(void* ptr); +#endif /*LODEPNG_COMPILE_ALLOCATORS*/ + +/* ////////////////////////////////////////////////////////////////////////// */ +/* ////////////////////////////////////////////////////////////////////////// */ +/* // Tools for C, and common code for PNG and Zlib. // */ +/* ////////////////////////////////////////////////////////////////////////// */ +/* ////////////////////////////////////////////////////////////////////////// */ + +/* +Often in case of an error a value is assigned to a variable and then it breaks +out of a loop (to go to the cleanup phase of a function). This macro does that. +It makes the error handling code shorter and more readable. + +Example: if(!uivector_resizev(&frequencies_ll, 286, 0)) ERROR_BREAK(83); +*/ +#define CERROR_BREAK(errorvar, code)\ +{\ + errorvar = code;\ + break;\ +} + +/*version of CERROR_BREAK that assumes the common case where the error variable is named "error"*/ +#define ERROR_BREAK(code) CERROR_BREAK(error, code) + +/*Set error var to the error code, and return it.*/ +#define CERROR_RETURN_ERROR(errorvar, code)\ +{\ + errorvar = code;\ + return code;\ +} + +/*Try the code, if it returns error, also return the error.*/ +#define CERROR_TRY_RETURN(call)\ +{\ + unsigned error = call;\ + if(error) return error;\ +} + +/*Set error var to the error code, and return from the void function.*/ +#define CERROR_RETURN(errorvar, code)\ +{\ + errorvar = code;\ + return;\ +} + +/* +About uivector, ucvector and string: +-All of them wrap dynamic arrays or text strings in a similar way. +-LodePNG was originally written in C++. The vectors replace the std::vectors that were used in the C++ version. +-The string tools are made to avoid problems with compilers that declare things like strncat as deprecated. +-They're not used in the interface, only internally in this file as static functions. +-As with many other structs in this file, the init and cleanup functions serve as ctor and dtor. +*/ + +#ifdef LODEPNG_COMPILE_ZLIB +/*dynamic vector of unsigned ints*/ +typedef struct uivector +{ + unsigned* data; + size_t size; /*size in number of unsigned longs*/ + size_t allocsize; /*allocated size in bytes*/ +} uivector; + +static void uivector_cleanup(void* p) +{ + ((uivector*)p)->size = ((uivector*)p)->allocsize = 0; + lodepng_free(((uivector*)p)->data); + ((uivector*)p)->data = NULL; +} + +/*returns 1 if success, 0 if failure ==> nothing done*/ +static unsigned uivector_reserve(uivector* p, size_t allocsize) +{ + if(allocsize > p->allocsize) + { + size_t newsize = (allocsize > p->allocsize * 2) ? allocsize : (allocsize * 3 / 2); + void* data = lodepng_realloc(p->data, newsize); + if(data) + { + p->allocsize = newsize; + p->data = (unsigned*)data; + } + else return 0; /*error: not enough memory*/ + } + return 1; +} + +/*returns 1 if success, 0 if failure ==> nothing done*/ +static unsigned uivector_resize(uivector* p, size_t size) +{ + if(!uivector_reserve(p, size * sizeof(unsigned))) return 0; + p->size = size; + return 1; /*success*/ +} + +/*resize and give all new elements the value*/ +static unsigned uivector_resizev(uivector* p, size_t size, unsigned value) +{ + size_t oldsize = p->size, i; + if(!uivector_resize(p, size)) return 0; + for(i = oldsize; i < size; ++i) p->data[i] = value; + return 1; +} + +static void uivector_init(uivector* p) +{ + p->data = NULL; + p->size = p->allocsize = 0; +} + +#ifdef LODEPNG_COMPILE_ENCODER +/*returns 1 if success, 0 if failure ==> nothing done*/ +static unsigned uivector_push_back(uivector* p, unsigned c) +{ + if(!uivector_resize(p, p->size + 1)) return 0; + p->data[p->size - 1] = c; + return 1; +} +#endif /*LODEPNG_COMPILE_ENCODER*/ +#endif /*LODEPNG_COMPILE_ZLIB*/ + +/* /////////////////////////////////////////////////////////////////////////// */ + +/*dynamic vector of unsigned chars*/ +typedef struct ucvector +{ + unsigned char* data; + size_t size; /*used size*/ + size_t allocsize; /*allocated size*/ +} ucvector; + +/*returns 1 if success, 0 if failure ==> nothing done*/ +static unsigned ucvector_reserve(ucvector* p, size_t allocsize) +{ + if(allocsize > p->allocsize) + { + size_t newsize = (allocsize > p->allocsize * 2) ? allocsize : (allocsize * 3 / 2); + void* data = lodepng_realloc(p->data, newsize); + if(data) + { + p->allocsize = newsize; + p->data = (unsigned char*)data; + } + else return 0; /*error: not enough memory*/ + } + return 1; +} + +/*returns 1 if success, 0 if failure ==> nothing done*/ +static unsigned ucvector_resize(ucvector* p, size_t size) +{ + if(!ucvector_reserve(p, size * sizeof(unsigned char))) return 0; + p->size = size; + return 1; /*success*/ +} + +#ifdef LODEPNG_COMPILE_PNG + +static void ucvector_cleanup(void* p) +{ + ((ucvector*)p)->size = ((ucvector*)p)->allocsize = 0; + lodepng_free(((ucvector*)p)->data); + ((ucvector*)p)->data = NULL; +} + +static void ucvector_init(ucvector* p) +{ + p->data = NULL; + p->size = p->allocsize = 0; +} +#endif /*LODEPNG_COMPILE_PNG*/ + +#ifdef LODEPNG_COMPILE_ZLIB +/*you can both convert from vector to buffer&size and vica versa. If you use +init_buffer to take over a buffer and size, it is not needed to use cleanup*/ +static void ucvector_init_buffer(ucvector* p, unsigned char* buffer, size_t size) +{ + p->data = buffer; + p->allocsize = p->size = size; +} +#endif /*LODEPNG_COMPILE_ZLIB*/ + +#if (defined(LODEPNG_COMPILE_PNG) && defined(LODEPNG_COMPILE_ANCILLARY_CHUNKS)) || defined(LODEPNG_COMPILE_ENCODER) +/*returns 1 if success, 0 if failure ==> nothing done*/ +static unsigned ucvector_push_back(ucvector* p, unsigned char c) +{ + if(!ucvector_resize(p, p->size + 1)) return 0; + p->data[p->size - 1] = c; + return 1; +} +#endif /*defined(LODEPNG_COMPILE_PNG) || defined(LODEPNG_COMPILE_ENCODER)*/ + + +/* ////////////////////////////////////////////////////////////////////////// */ + +#ifdef LODEPNG_COMPILE_PNG +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS +/*returns 1 if success, 0 if failure ==> nothing done*/ +static unsigned string_resize(char** out, size_t size) +{ + char* data = (char*)lodepng_realloc(*out, size + 1); + if(data) + { + data[size] = 0; /*null termination char*/ + *out = data; + } + return data != 0; +} + +/*init a {char*, size_t} pair for use as string*/ +static void string_init(char** out) +{ + *out = NULL; + string_resize(out, 0); +} + +/*free the above pair again*/ +static void string_cleanup(char** out) +{ + lodepng_free(*out); + *out = NULL; +} + +static void string_set(char** out, const char* in) +{ + size_t insize = strlen(in), i; + if(string_resize(out, insize)) + { + for(i = 0; i != insize; ++i) + { + (*out)[i] = in[i]; + } + } +} +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ +#endif /*LODEPNG_COMPILE_PNG*/ + +/* ////////////////////////////////////////////////////////////////////////// */ + +unsigned lodepng_read32bitInt(const unsigned char* buffer) +{ + return (unsigned)((buffer[0] << 24) | (buffer[1] << 16) | (buffer[2] << 8) | buffer[3]); +} + +#if defined(LODEPNG_COMPILE_PNG) || defined(LODEPNG_COMPILE_ENCODER) +/*buffer must have at least 4 allocated bytes available*/ +static void lodepng_set32bitInt(unsigned char* buffer, unsigned value) +{ + buffer[0] = (unsigned char)((value >> 24) & 0xff); + buffer[1] = (unsigned char)((value >> 16) & 0xff); + buffer[2] = (unsigned char)((value >> 8) & 0xff); + buffer[3] = (unsigned char)((value ) & 0xff); +} +#endif /*defined(LODEPNG_COMPILE_PNG) || defined(LODEPNG_COMPILE_ENCODER)*/ + +#ifdef LODEPNG_COMPILE_ENCODER +static void lodepng_add32bitInt(ucvector* buffer, unsigned value) +{ + ucvector_resize(buffer, buffer->size + 4); /*todo: give error if resize failed*/ + lodepng_set32bitInt(&buffer->data[buffer->size - 4], value); +} +#endif /*LODEPNG_COMPILE_ENCODER*/ + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / File IO / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +#ifdef LODEPNG_COMPILE_DISK + +/* returns negative value on error. This should be pure C compatible, so no fstat. */ +static long lodepng_filesize(const char* filename) +{ + FILE* file; + long size; + file = fopen(filename, "rb"); + if(!file) return -1; + + if(fseek(file, 0, SEEK_END) != 0) + { + fclose(file); + return -1; + } + + size = ftell(file); + /* It may give LONG_MAX as directory size, this is invalid for us. */ + if(size == LONG_MAX) size = -1; + + fclose(file); + return size; +} + +/* load file into buffer that already has the correct allocated size. Returns error code.*/ +static unsigned lodepng_buffer_file(unsigned char* out, size_t size, const char* filename) +{ + FILE* file; + size_t readsize; + file = fopen(filename, "rb"); + if(!file) return 78; + + readsize = fread(out, 1, size, file); + fclose(file); + + if (readsize != size) return 78; + return 0; +} + +unsigned lodepng_load_file(unsigned char** out, size_t* outsize, const char* filename) +{ + long size = lodepng_filesize(filename); + if (size < 0) return 78; + *outsize = (size_t)size; + + *out = (unsigned char*)lodepng_malloc((size_t)size); + if(!(*out) && size > 0) return 83; /*the above malloc failed*/ + + return lodepng_buffer_file(*out, (size_t)size, filename); +} + +/*write given buffer to the file, overwriting the file, it doesn't append to it.*/ +unsigned lodepng_save_file(const unsigned char* buffer, size_t buffersize, const char* filename) +{ + FILE* file; + file = fopen(filename, "wb" ); + if(!file) return 79; + fwrite((char*)buffer , 1 , buffersize, file); + fclose(file); + return 0; +} + +#endif /*LODEPNG_COMPILE_DISK*/ + +/* ////////////////////////////////////////////////////////////////////////// */ +/* ////////////////////////////////////////////////////////////////////////// */ +/* // End of common code and tools. Begin of Zlib related code. // */ +/* ////////////////////////////////////////////////////////////////////////// */ +/* ////////////////////////////////////////////////////////////////////////// */ + +#ifdef LODEPNG_COMPILE_ZLIB +#ifdef LODEPNG_COMPILE_ENCODER +/*TODO: this ignores potential out of memory errors*/ +#define addBitToStream(/*size_t**/ bitpointer, /*ucvector**/ bitstream, /*unsigned char*/ bit)\ +{\ + /*add a new byte at the end*/\ + if(((*bitpointer) & 7) == 0) ucvector_push_back(bitstream, (unsigned char)0);\ + /*earlier bit of huffman code is in a lesser significant bit of an earlier byte*/\ + (bitstream->data[bitstream->size - 1]) |= (bit << ((*bitpointer) & 0x7));\ + ++(*bitpointer);\ +} + +static void addBitsToStream(size_t* bitpointer, ucvector* bitstream, unsigned value, size_t nbits) +{ + size_t i; + for(i = 0; i != nbits; ++i) addBitToStream(bitpointer, bitstream, (unsigned char)((value >> i) & 1)); +} + +static void addBitsToStreamReversed(size_t* bitpointer, ucvector* bitstream, unsigned value, size_t nbits) +{ + size_t i; + for(i = 0; i != nbits; ++i) addBitToStream(bitpointer, bitstream, (unsigned char)((value >> (nbits - 1 - i)) & 1)); +} +#endif /*LODEPNG_COMPILE_ENCODER*/ + +#ifdef LODEPNG_COMPILE_DECODER + +#define READBIT(bitpointer, bitstream) ((bitstream[bitpointer >> 3] >> (bitpointer & 0x7)) & (unsigned char)1) + +static unsigned char readBitFromStream(size_t* bitpointer, const unsigned char* bitstream) +{ + unsigned char result = (unsigned char)(READBIT(*bitpointer, bitstream)); + ++(*bitpointer); + return result; +} + +static unsigned readBitsFromStream(size_t* bitpointer, const unsigned char* bitstream, size_t nbits) +{ + unsigned result = 0, i; + for(i = 0; i != nbits; ++i) + { + result += ((unsigned)READBIT(*bitpointer, bitstream)) << i; + ++(*bitpointer); + } + return result; +} +#endif /*LODEPNG_COMPILE_DECODER*/ + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / Deflate - Huffman / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +#define FIRST_LENGTH_CODE_INDEX 257 +#define LAST_LENGTH_CODE_INDEX 285 +/*256 literals, the end code, some length codes, and 2 unused codes*/ +#define NUM_DEFLATE_CODE_SYMBOLS 288 +/*the distance codes have their own symbols, 30 used, 2 unused*/ +#define NUM_DISTANCE_SYMBOLS 32 +/*the code length codes. 0-15: code lengths, 16: copy previous 3-6 times, 17: 3-10 zeros, 18: 11-138 zeros*/ +#define NUM_CODE_LENGTH_CODES 19 + +/*the base lengths represented by codes 257-285*/ +static const unsigned LENGTHBASE[29] + = {3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, + 67, 83, 99, 115, 131, 163, 195, 227, 258}; + +/*the extra bits used by codes 257-285 (added to base length)*/ +static const unsigned LENGTHEXTRA[29] + = {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, + 4, 4, 4, 4, 5, 5, 5, 5, 0}; + +/*the base backwards distances (the bits of distance codes appear after length codes and use their own huffman tree)*/ +static const unsigned DISTANCEBASE[30] + = {1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, + 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577}; + +/*the extra bits of backwards distances (added to base)*/ +static const unsigned DISTANCEEXTRA[30] + = {0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, + 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13}; + +/*the order in which "code length alphabet code lengths" are stored, out of this +the huffman tree of the dynamic huffman tree lengths is generated*/ +static const unsigned CLCL_ORDER[NUM_CODE_LENGTH_CODES] + = {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; + +/* ////////////////////////////////////////////////////////////////////////// */ + +/* +Huffman tree struct, containing multiple representations of the tree +*/ +typedef struct HuffmanTree +{ + unsigned* tree2d; + unsigned* tree1d; + unsigned* lengths; /*the lengths of the codes of the 1d-tree*/ + unsigned maxbitlen; /*maximum number of bits a single code can get*/ + unsigned numcodes; /*number of symbols in the alphabet = number of codes*/ +} HuffmanTree; + +/*function used for debug purposes to draw the tree in ascii art with C++*/ +/* +static void HuffmanTree_draw(HuffmanTree* tree) +{ + std::cout << "tree. length: " << tree->numcodes << " maxbitlen: " << tree->maxbitlen << std::endl; + for(size_t i = 0; i != tree->tree1d.size; ++i) + { + if(tree->lengths.data[i]) + std::cout << i << " " << tree->tree1d.data[i] << " " << tree->lengths.data[i] << std::endl; + } + std::cout << std::endl; +}*/ + +static void HuffmanTree_init(HuffmanTree* tree) +{ + tree->tree2d = 0; + tree->tree1d = 0; + tree->lengths = 0; +} + +static void HuffmanTree_cleanup(HuffmanTree* tree) +{ + lodepng_free(tree->tree2d); + lodepng_free(tree->tree1d); + lodepng_free(tree->lengths); +} + +/*the tree representation used by the decoder. return value is error*/ +static unsigned HuffmanTree_make2DTree(HuffmanTree* tree) +{ + unsigned nodefilled = 0; /*up to which node it is filled*/ + unsigned treepos = 0; /*position in the tree (1 of the numcodes columns)*/ + unsigned n, i; + + tree->tree2d = (unsigned*)lodepng_malloc(tree->numcodes * 2 * sizeof(unsigned)); + if(!tree->tree2d) return 83; /*alloc fail*/ + + /* + convert tree1d[] to tree2d[][]. In the 2D array, a value of 32767 means + uninited, a value >= numcodes is an address to another bit, a value < numcodes + is a code. The 2 rows are the 2 possible bit values (0 or 1), there are as + many columns as codes - 1. + A good huffman tree has N * 2 - 1 nodes, of which N - 1 are internal nodes. + Here, the internal nodes are stored (what their 0 and 1 option point to). + There is only memory for such good tree currently, if there are more nodes + (due to too long length codes), error 55 will happen + */ + for(n = 0; n < tree->numcodes * 2; ++n) + { + tree->tree2d[n] = 32767; /*32767 here means the tree2d isn't filled there yet*/ + } + + for(n = 0; n < tree->numcodes; ++n) /*the codes*/ + { + for(i = 0; i != tree->lengths[n]; ++i) /*the bits for this code*/ + { + unsigned char bit = (unsigned char)((tree->tree1d[n] >> (tree->lengths[n] - i - 1)) & 1); + /*oversubscribed, see comment in lodepng_error_text*/ + if(treepos > 2147483647 || treepos + 2 > tree->numcodes) return 55; + if(tree->tree2d[2 * treepos + bit] == 32767) /*not yet filled in*/ + { + if(i + 1 == tree->lengths[n]) /*last bit*/ + { + tree->tree2d[2 * treepos + bit] = n; /*put the current code in it*/ + treepos = 0; + } + else + { + /*put address of the next step in here, first that address has to be found of course + (it's just nodefilled + 1)...*/ + ++nodefilled; + /*addresses encoded with numcodes added to it*/ + tree->tree2d[2 * treepos + bit] = nodefilled + tree->numcodes; + treepos = nodefilled; + } + } + else treepos = tree->tree2d[2 * treepos + bit] - tree->numcodes; + } + } + + for(n = 0; n < tree->numcodes * 2; ++n) + { + if(tree->tree2d[n] == 32767) tree->tree2d[n] = 0; /*remove possible remaining 32767's*/ + } + + return 0; +} + +/* +Second step for the ...makeFromLengths and ...makeFromFrequencies functions. +numcodes, lengths and maxbitlen must already be filled in correctly. return +value is error. +*/ +static unsigned HuffmanTree_makeFromLengths2(HuffmanTree* tree) +{ + uivector blcount; + uivector nextcode; + unsigned error = 0; + unsigned bits, n; + + uivector_init(&blcount); + uivector_init(&nextcode); + + tree->tree1d = (unsigned*)lodepng_malloc(tree->numcodes * sizeof(unsigned)); + if(!tree->tree1d) error = 83; /*alloc fail*/ + + if(!uivector_resizev(&blcount, tree->maxbitlen + 1, 0) + || !uivector_resizev(&nextcode, tree->maxbitlen + 1, 0)) + error = 83; /*alloc fail*/ + + if(!error) + { + /*step 1: count number of instances of each code length*/ + for(bits = 0; bits != tree->numcodes; ++bits) ++blcount.data[tree->lengths[bits]]; + /*step 2: generate the nextcode values*/ + for(bits = 1; bits <= tree->maxbitlen; ++bits) + { + nextcode.data[bits] = (nextcode.data[bits - 1] + blcount.data[bits - 1]) << 1; + } + /*step 3: generate all the codes*/ + for(n = 0; n != tree->numcodes; ++n) + { + if(tree->lengths[n] != 0) tree->tree1d[n] = nextcode.data[tree->lengths[n]]++; + } + } + + uivector_cleanup(&blcount); + uivector_cleanup(&nextcode); + + if(!error) return HuffmanTree_make2DTree(tree); + else return error; +} + +/* +given the code lengths (as stored in the PNG file), generate the tree as defined +by Deflate. maxbitlen is the maximum bits that a code in the tree can have. +return value is error. +*/ +static unsigned HuffmanTree_makeFromLengths(HuffmanTree* tree, const unsigned* bitlen, + size_t numcodes, unsigned maxbitlen) +{ + unsigned i; + tree->lengths = (unsigned*)lodepng_malloc(numcodes * sizeof(unsigned)); + if(!tree->lengths) return 83; /*alloc fail*/ + for(i = 0; i != numcodes; ++i) tree->lengths[i] = bitlen[i]; + tree->numcodes = (unsigned)numcodes; /*number of symbols*/ + tree->maxbitlen = maxbitlen; + return HuffmanTree_makeFromLengths2(tree); +} + +#ifdef LODEPNG_COMPILE_ENCODER + +/*BPM: Boundary Package Merge, see "A Fast and Space-Economical Algorithm for Length-Limited Coding", +Jyrki Katajainen, Alistair Moffat, Andrew Turpin, 1995.*/ + +/*chain node for boundary package merge*/ +typedef struct BPMNode +{ + int weight; /*the sum of all weights in this chain*/ + unsigned index; /*index of this leaf node (called "count" in the paper)*/ + struct BPMNode* tail; /*the next nodes in this chain (null if last)*/ + int in_use; +} BPMNode; + +/*lists of chains*/ +typedef struct BPMLists +{ + /*memory pool*/ + unsigned memsize; + BPMNode* memory; + unsigned numfree; + unsigned nextfree; + BPMNode** freelist; + /*two heads of lookahead chains per list*/ + unsigned listsize; + BPMNode** chains0; + BPMNode** chains1; +} BPMLists; + +/*creates a new chain node with the given parameters, from the memory in the lists */ +static BPMNode* bpmnode_create(BPMLists* lists, int weight, unsigned index, BPMNode* tail) +{ + unsigned i; + BPMNode* result; + + /*memory full, so garbage collect*/ + if(lists->nextfree >= lists->numfree) + { + /*mark only those that are in use*/ + for(i = 0; i != lists->memsize; ++i) lists->memory[i].in_use = 0; + for(i = 0; i != lists->listsize; ++i) + { + BPMNode* node; + for(node = lists->chains0[i]; node != 0; node = node->tail) node->in_use = 1; + for(node = lists->chains1[i]; node != 0; node = node->tail) node->in_use = 1; + } + /*collect those that are free*/ + lists->numfree = 0; + for(i = 0; i != lists->memsize; ++i) + { + if(!lists->memory[i].in_use) lists->freelist[lists->numfree++] = &lists->memory[i]; + } + lists->nextfree = 0; + } + + result = lists->freelist[lists->nextfree++]; + result->weight = weight; + result->index = index; + result->tail = tail; + return result; +} + +static int bpmnode_compare(const void* a, const void* b) +{ + int wa = ((const BPMNode*)a)->weight; + int wb = ((const BPMNode*)b)->weight; + if(wa < wb) return -1; + if(wa > wb) return 1; + /*make the qsort a stable sort*/ + return ((const BPMNode*)a)->index < ((const BPMNode*)b)->index ? 1 : -1; +} + +/*Boundary Package Merge step, numpresent is the amount of leaves, and c is the current chain.*/ +static void boundaryPM(BPMLists* lists, BPMNode* leaves, size_t numpresent, int c, int num) +{ + unsigned lastindex = lists->chains1[c]->index; + + if(c == 0) + { + if(lastindex >= numpresent) return; + lists->chains0[c] = lists->chains1[c]; + lists->chains1[c] = bpmnode_create(lists, leaves[lastindex].weight, lastindex + 1, 0); + } + else + { + /*sum of the weights of the head nodes of the previous lookahead chains.*/ + int sum = lists->chains0[c - 1]->weight + lists->chains1[c - 1]->weight; + lists->chains0[c] = lists->chains1[c]; + if(lastindex < numpresent && sum > leaves[lastindex].weight) + { + lists->chains1[c] = bpmnode_create(lists, leaves[lastindex].weight, lastindex + 1, lists->chains1[c]->tail); + return; + } + lists->chains1[c] = bpmnode_create(lists, sum, lastindex, lists->chains1[c - 1]); + /*in the end we are only interested in the chain of the last list, so no + need to recurse if we're at the last one (this gives measurable speedup)*/ + if(num + 1 < (int)(2 * numpresent - 2)) + { + boundaryPM(lists, leaves, numpresent, c - 1, num); + boundaryPM(lists, leaves, numpresent, c - 1, num); + } + } +} + +unsigned lodepng_huffman_code_lengths(unsigned* lengths, const unsigned* frequencies, + size_t numcodes, unsigned maxbitlen) +{ + unsigned error = 0; + unsigned i; + size_t numpresent = 0; /*number of symbols with non-zero frequency*/ + BPMNode* leaves; /*the symbols, only those with > 0 frequency*/ + + if(numcodes == 0) return 80; /*error: a tree of 0 symbols is not supposed to be made*/ + if(( (size_t)1 << maxbitlen) < numcodes) return 80; /*error: represent all symbols*/ + + leaves = (BPMNode*)lodepng_malloc(numcodes * sizeof(*leaves)); + if(!leaves) return 83; /*alloc fail*/ + + for(i = 0; i != numcodes; ++i) + { + if(frequencies[i] > 0) + { + leaves[numpresent].weight = (int)frequencies[i]; + leaves[numpresent].index = i; + ++numpresent; + } + } + + for(i = 0; i != numcodes; ++i) lengths[i] = 0; + + /*ensure at least two present symbols. There should be at least one symbol + according to RFC 1951 section 3.2.7. Some decoders incorrectly require two. To + make these work as well ensure there are at least two symbols. The + Package-Merge code below also doesn't work correctly if there's only one + symbol, it'd give it the theoritical 0 bits but in practice zlib wants 1 bit*/ + if(numpresent == 0) + { + lengths[0] = lengths[1] = 1; /*note that for RFC 1951 section 3.2.7, only lengths[0] = 1 is needed*/ + } + else if(numpresent == 1) + { + lengths[leaves[0].index] = 1; + lengths[leaves[0].index == 0 ? 1 : 0] = 1; + } + else + { + BPMLists lists; + BPMNode* node; + + qsort(leaves, numpresent, sizeof(BPMNode), bpmnode_compare); + + lists.listsize = maxbitlen; + lists.memsize = 2 * maxbitlen * (maxbitlen + 1); + lists.nextfree = 0; + lists.numfree = lists.memsize; + lists.memory = (BPMNode*)lodepng_malloc(lists.memsize * sizeof(*lists.memory)); + lists.freelist = (BPMNode**)lodepng_malloc(lists.memsize * sizeof(BPMNode*)); + lists.chains0 = (BPMNode**)lodepng_malloc(lists.listsize * sizeof(BPMNode*)); + lists.chains1 = (BPMNode**)lodepng_malloc(lists.listsize * sizeof(BPMNode*)); + if(!lists.memory || !lists.freelist || !lists.chains0 || !lists.chains1) error = 83; /*alloc fail*/ + + if(!error) + { + for(i = 0; i != lists.memsize; ++i) lists.freelist[i] = &lists.memory[i]; + + bpmnode_create(&lists, leaves[0].weight, 1, 0); + bpmnode_create(&lists, leaves[1].weight, 2, 0); + + for(i = 0; i != lists.listsize; ++i) + { + lists.chains0[i] = &lists.memory[0]; + lists.chains1[i] = &lists.memory[1]; + } + + /*each boundaryPM call adds one chain to the last list, and we need 2 * numpresent - 2 chains.*/ + for(i = 2; i != 2 * numpresent - 2; ++i) boundaryPM(&lists, leaves, numpresent, (int)maxbitlen - 1, (int)i); + + for(node = lists.chains1[maxbitlen - 1]; node; node = node->tail) + { + for(i = 0; i != node->index; ++i) ++lengths[leaves[i].index]; + } + } + + lodepng_free(lists.memory); + lodepng_free(lists.freelist); + lodepng_free(lists.chains0); + lodepng_free(lists.chains1); + } + + lodepng_free(leaves); + return error; +} + +/*Create the Huffman tree given the symbol frequencies*/ +static unsigned HuffmanTree_makeFromFrequencies(HuffmanTree* tree, const unsigned* frequencies, + size_t mincodes, size_t numcodes, unsigned maxbitlen) +{ + unsigned error = 0; + while(!frequencies[numcodes - 1] && numcodes > mincodes) --numcodes; /*trim zeroes*/ + tree->maxbitlen = maxbitlen; + tree->numcodes = (unsigned)numcodes; /*number of symbols*/ + tree->lengths = (unsigned*)lodepng_realloc(tree->lengths, numcodes * sizeof(unsigned)); + if(!tree->lengths) return 83; /*alloc fail*/ + /*initialize all lengths to 0*/ + memset(tree->lengths, 0, numcodes * sizeof(unsigned)); + + error = lodepng_huffman_code_lengths(tree->lengths, frequencies, numcodes, maxbitlen); + if(!error) error = HuffmanTree_makeFromLengths2(tree); + return error; +} + +static unsigned HuffmanTree_getCode(const HuffmanTree* tree, unsigned index) +{ + return tree->tree1d[index]; +} + +static unsigned HuffmanTree_getLength(const HuffmanTree* tree, unsigned index) +{ + return tree->lengths[index]; +} +#endif /*LODEPNG_COMPILE_ENCODER*/ + +/*get the literal and length code tree of a deflated block with fixed tree, as per the deflate specification*/ +static unsigned generateFixedLitLenTree(HuffmanTree* tree) +{ + unsigned i, error = 0; + unsigned* bitlen = (unsigned*)lodepng_malloc(NUM_DEFLATE_CODE_SYMBOLS * sizeof(unsigned)); + if(!bitlen) return 83; /*alloc fail*/ + + /*288 possible codes: 0-255=literals, 256=endcode, 257-285=lengthcodes, 286-287=unused*/ + for(i = 0; i <= 143; ++i) bitlen[i] = 8; + for(i = 144; i <= 255; ++i) bitlen[i] = 9; + for(i = 256; i <= 279; ++i) bitlen[i] = 7; + for(i = 280; i <= 287; ++i) bitlen[i] = 8; + + error = HuffmanTree_makeFromLengths(tree, bitlen, NUM_DEFLATE_CODE_SYMBOLS, 15); + + lodepng_free(bitlen); + return error; +} + +/*get the distance code tree of a deflated block with fixed tree, as specified in the deflate specification*/ +static unsigned generateFixedDistanceTree(HuffmanTree* tree) +{ + unsigned i, error = 0; + unsigned* bitlen = (unsigned*)lodepng_malloc(NUM_DISTANCE_SYMBOLS * sizeof(unsigned)); + if(!bitlen) return 83; /*alloc fail*/ + + /*there are 32 distance codes, but 30-31 are unused*/ + for(i = 0; i != NUM_DISTANCE_SYMBOLS; ++i) bitlen[i] = 5; + error = HuffmanTree_makeFromLengths(tree, bitlen, NUM_DISTANCE_SYMBOLS, 15); + + lodepng_free(bitlen); + return error; +} + +#ifdef LODEPNG_COMPILE_DECODER + +/* +returns the code, or (unsigned)(-1) if error happened +inbitlength is the length of the complete buffer, in bits (so its byte length times 8) +*/ +static unsigned huffmanDecodeSymbol(const unsigned char* in, size_t* bp, + const HuffmanTree* codetree, size_t inbitlength) +{ + unsigned treepos = 0, ct; + for(;;) + { + if(*bp >= inbitlength) return (unsigned)(-1); /*error: end of input memory reached without endcode*/ + /* + decode the symbol from the tree. The "readBitFromStream" code is inlined in + the expression below because this is the biggest bottleneck while decoding + */ + ct = codetree->tree2d[(treepos << 1) + READBIT(*bp, in)]; + ++(*bp); + if(ct < codetree->numcodes) return ct; /*the symbol is decoded, return it*/ + else treepos = ct - codetree->numcodes; /*symbol not yet decoded, instead move tree position*/ + + if(treepos >= codetree->numcodes) return (unsigned)(-1); /*error: it appeared outside the codetree*/ + } +} +#endif /*LODEPNG_COMPILE_DECODER*/ + +#ifdef LODEPNG_COMPILE_DECODER + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / Inflator (Decompressor) / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +/*get the tree of a deflated block with fixed tree, as specified in the deflate specification*/ +static void getTreeInflateFixed(HuffmanTree* tree_ll, HuffmanTree* tree_d) +{ + /*TODO: check for out of memory errors*/ + generateFixedLitLenTree(tree_ll); + generateFixedDistanceTree(tree_d); +} + +/*get the tree of a deflated block with dynamic tree, the tree itself is also Huffman compressed with a known tree*/ +static unsigned getTreeInflateDynamic(HuffmanTree* tree_ll, HuffmanTree* tree_d, + const unsigned char* in, size_t* bp, size_t inlength) +{ + /*make sure that length values that aren't filled in will be 0, or a wrong tree will be generated*/ + unsigned error = 0; + unsigned n, HLIT, HDIST, HCLEN, i; + size_t inbitlength = inlength * 8; + + /*see comments in deflateDynamic for explanation of the context and these variables, it is analogous*/ + unsigned* bitlen_ll = 0; /*lit,len code lengths*/ + unsigned* bitlen_d = 0; /*dist code lengths*/ + /*code length code lengths ("clcl"), the bit lengths of the huffman tree used to compress bitlen_ll and bitlen_d*/ + unsigned* bitlen_cl = 0; + HuffmanTree tree_cl; /*the code tree for code length codes (the huffman tree for compressed huffman trees)*/ + + if((*bp) + 14 > (inlength << 3)) return 49; /*error: the bit pointer is or will go past the memory*/ + + /*number of literal/length codes + 257. Unlike the spec, the value 257 is added to it here already*/ + HLIT = readBitsFromStream(bp, in, 5) + 257; + /*number of distance codes. Unlike the spec, the value 1 is added to it here already*/ + HDIST = readBitsFromStream(bp, in, 5) + 1; + /*number of code length codes. Unlike the spec, the value 4 is added to it here already*/ + HCLEN = readBitsFromStream(bp, in, 4) + 4; + + if((*bp) + HCLEN * 3 > (inlength << 3)) return 50; /*error: the bit pointer is or will go past the memory*/ + + HuffmanTree_init(&tree_cl); + + while(!error) + { + /*read the code length codes out of 3 * (amount of code length codes) bits*/ + + bitlen_cl = (unsigned*)lodepng_malloc(NUM_CODE_LENGTH_CODES * sizeof(unsigned)); + if(!bitlen_cl) ERROR_BREAK(83 /*alloc fail*/); + + for(i = 0; i != NUM_CODE_LENGTH_CODES; ++i) + { + if(i < HCLEN) bitlen_cl[CLCL_ORDER[i]] = readBitsFromStream(bp, in, 3); + else bitlen_cl[CLCL_ORDER[i]] = 0; /*if not, it must stay 0*/ + } + + error = HuffmanTree_makeFromLengths(&tree_cl, bitlen_cl, NUM_CODE_LENGTH_CODES, 7); + if(error) break; + + /*now we can use this tree to read the lengths for the tree that this function will return*/ + bitlen_ll = (unsigned*)lodepng_malloc(NUM_DEFLATE_CODE_SYMBOLS * sizeof(unsigned)); + bitlen_d = (unsigned*)lodepng_malloc(NUM_DISTANCE_SYMBOLS * sizeof(unsigned)); + if(!bitlen_ll || !bitlen_d) ERROR_BREAK(83 /*alloc fail*/); + for(i = 0; i != NUM_DEFLATE_CODE_SYMBOLS; ++i) bitlen_ll[i] = 0; + for(i = 0; i != NUM_DISTANCE_SYMBOLS; ++i) bitlen_d[i] = 0; + + /*i is the current symbol we're reading in the part that contains the code lengths of lit/len and dist codes*/ + i = 0; + while(i < HLIT + HDIST) + { + unsigned code = huffmanDecodeSymbol(in, bp, &tree_cl, inbitlength); + if(code <= 15) /*a length code*/ + { + if(i < HLIT) bitlen_ll[i] = code; + else bitlen_d[i - HLIT] = code; + ++i; + } + else if(code == 16) /*repeat previous*/ + { + unsigned replength = 3; /*read in the 2 bits that indicate repeat length (3-6)*/ + unsigned value; /*set value to the previous code*/ + + if(i == 0) ERROR_BREAK(54); /*can't repeat previous if i is 0*/ + + if((*bp + 2) > inbitlength) ERROR_BREAK(50); /*error, bit pointer jumps past memory*/ + replength += readBitsFromStream(bp, in, 2); + + if(i < HLIT + 1) value = bitlen_ll[i - 1]; + else value = bitlen_d[i - HLIT - 1]; + /*repeat this value in the next lengths*/ + for(n = 0; n < replength; ++n) + { + if(i >= HLIT + HDIST) ERROR_BREAK(13); /*error: i is larger than the amount of codes*/ + if(i < HLIT) bitlen_ll[i] = value; + else bitlen_d[i - HLIT] = value; + ++i; + } + } + else if(code == 17) /*repeat "0" 3-10 times*/ + { + unsigned replength = 3; /*read in the bits that indicate repeat length*/ + if((*bp + 3) > inbitlength) ERROR_BREAK(50); /*error, bit pointer jumps past memory*/ + replength += readBitsFromStream(bp, in, 3); + + /*repeat this value in the next lengths*/ + for(n = 0; n < replength; ++n) + { + if(i >= HLIT + HDIST) ERROR_BREAK(14); /*error: i is larger than the amount of codes*/ + + if(i < HLIT) bitlen_ll[i] = 0; + else bitlen_d[i - HLIT] = 0; + ++i; + } + } + else if(code == 18) /*repeat "0" 11-138 times*/ + { + unsigned replength = 11; /*read in the bits that indicate repeat length*/ + if((*bp + 7) > inbitlength) ERROR_BREAK(50); /*error, bit pointer jumps past memory*/ + replength += readBitsFromStream(bp, in, 7); + + /*repeat this value in the next lengths*/ + for(n = 0; n < replength; ++n) + { + if(i >= HLIT + HDIST) ERROR_BREAK(15); /*error: i is larger than the amount of codes*/ + + if(i < HLIT) bitlen_ll[i] = 0; + else bitlen_d[i - HLIT] = 0; + ++i; + } + } + else /*if(code == (unsigned)(-1))*/ /*huffmanDecodeSymbol returns (unsigned)(-1) in case of error*/ + { + if(code == (unsigned)(-1)) + { + /*return error code 10 or 11 depending on the situation that happened in huffmanDecodeSymbol + (10=no endcode, 11=wrong jump outside of tree)*/ + error = (*bp) > inbitlength ? 10 : 11; + } + else error = 16; /*unexisting code, this can never happen*/ + break; + } + } + if(error) break; + + if(bitlen_ll[256] == 0) ERROR_BREAK(64); /*the length of the end code 256 must be larger than 0*/ + + /*now we've finally got HLIT and HDIST, so generate the code trees, and the function is done*/ + error = HuffmanTree_makeFromLengths(tree_ll, bitlen_ll, NUM_DEFLATE_CODE_SYMBOLS, 15); + if(error) break; + error = HuffmanTree_makeFromLengths(tree_d, bitlen_d, NUM_DISTANCE_SYMBOLS, 15); + + break; /*end of error-while*/ + } + + lodepng_free(bitlen_cl); + lodepng_free(bitlen_ll); + lodepng_free(bitlen_d); + HuffmanTree_cleanup(&tree_cl); + + return error; +} + +/*inflate a block with dynamic of fixed Huffman tree*/ +static unsigned inflateHuffmanBlock(ucvector* out, const unsigned char* in, size_t* bp, + size_t* pos, size_t inlength, unsigned btype) +{ + unsigned error = 0; + HuffmanTree tree_ll; /*the huffman tree for literal and length codes*/ + HuffmanTree tree_d; /*the huffman tree for distance codes*/ + size_t inbitlength = inlength * 8; + + HuffmanTree_init(&tree_ll); + HuffmanTree_init(&tree_d); + + if(btype == 1) getTreeInflateFixed(&tree_ll, &tree_d); + else if(btype == 2) error = getTreeInflateDynamic(&tree_ll, &tree_d, in, bp, inlength); + + while(!error) /*decode all symbols until end reached, breaks at end code*/ + { + /*code_ll is literal, length or end code*/ + unsigned code_ll = huffmanDecodeSymbol(in, bp, &tree_ll, inbitlength); + if(code_ll <= 255) /*literal symbol*/ + { + /*ucvector_push_back would do the same, but for some reason the two lines below run 10% faster*/ + if(!ucvector_resize(out, (*pos) + 1)) ERROR_BREAK(83 /*alloc fail*/); + out->data[*pos] = (unsigned char)code_ll; + ++(*pos); + } + else if(code_ll >= FIRST_LENGTH_CODE_INDEX && code_ll <= LAST_LENGTH_CODE_INDEX) /*length code*/ + { + unsigned code_d, distance; + unsigned numextrabits_l, numextrabits_d; /*extra bits for length and distance*/ + size_t start, forward, backward, length; + + /*part 1: get length base*/ + length = LENGTHBASE[code_ll - FIRST_LENGTH_CODE_INDEX]; + + /*part 2: get extra bits and add the value of that to length*/ + numextrabits_l = LENGTHEXTRA[code_ll - FIRST_LENGTH_CODE_INDEX]; + if((*bp + numextrabits_l) > inbitlength) ERROR_BREAK(51); /*error, bit pointer will jump past memory*/ + length += readBitsFromStream(bp, in, numextrabits_l); + + /*part 3: get distance code*/ + code_d = huffmanDecodeSymbol(in, bp, &tree_d, inbitlength); + if(code_d > 29) + { + if(code_ll == (unsigned)(-1)) /*huffmanDecodeSymbol returns (unsigned)(-1) in case of error*/ + { + /*return error code 10 or 11 depending on the situation that happened in huffmanDecodeSymbol + (10=no endcode, 11=wrong jump outside of tree)*/ + error = (*bp) > inlength * 8 ? 10 : 11; + } + else error = 18; /*error: invalid distance code (30-31 are never used)*/ + break; + } + distance = DISTANCEBASE[code_d]; + + /*part 4: get extra bits from distance*/ + numextrabits_d = DISTANCEEXTRA[code_d]; + if((*bp + numextrabits_d) > inbitlength) ERROR_BREAK(51); /*error, bit pointer will jump past memory*/ + distance += readBitsFromStream(bp, in, numextrabits_d); + + /*part 5: fill in all the out[n] values based on the length and dist*/ + start = (*pos); + if(distance > start) ERROR_BREAK(52); /*too long backward distance*/ + backward = start - distance; + + if(!ucvector_resize(out, (*pos) + length)) ERROR_BREAK(83 /*alloc fail*/); + if (distance < length) { + for(forward = 0; forward < length; ++forward) + { + out->data[(*pos)++] = out->data[backward++]; + } + } else { + memcpy(out->data + *pos, out->data + backward, length); + *pos += length; + } + } + else if(code_ll == 256) + { + break; /*end code, break the loop*/ + } + else /*if(code == (unsigned)(-1))*/ /*huffmanDecodeSymbol returns (unsigned)(-1) in case of error*/ + { + /*return error code 10 or 11 depending on the situation that happened in huffmanDecodeSymbol + (10=no endcode, 11=wrong jump outside of tree)*/ + error = ((*bp) > inlength * 8) ? 10 : 11; + break; + } + } + + HuffmanTree_cleanup(&tree_ll); + HuffmanTree_cleanup(&tree_d); + + return error; +} + +static unsigned inflateNoCompression(ucvector* out, const unsigned char* in, size_t* bp, size_t* pos, size_t inlength) +{ + size_t p; + unsigned LEN, NLEN, n, error = 0; + + /*go to first boundary of byte*/ + while(((*bp) & 0x7) != 0) ++(*bp); + p = (*bp) / 8; /*byte position*/ + + /*read LEN (2 bytes) and NLEN (2 bytes)*/ + if(p + 4 >= inlength) return 52; /*error, bit pointer will jump past memory*/ + LEN = in[p] + 256u * in[p + 1]; p += 2; + NLEN = in[p] + 256u * in[p + 1]; p += 2; + + /*check if 16-bit NLEN is really the one's complement of LEN*/ + if(LEN + NLEN != 65535) return 21; /*error: NLEN is not one's complement of LEN*/ + + if(!ucvector_resize(out, (*pos) + LEN)) return 83; /*alloc fail*/ + + /*read the literal data: LEN bytes are now stored in the out buffer*/ + if(p + LEN > inlength) return 23; /*error: reading outside of in buffer*/ + for(n = 0; n < LEN; ++n) out->data[(*pos)++] = in[p++]; + + (*bp) = p * 8; + + return error; +} + +static unsigned lodepng_inflatev(ucvector* out, + const unsigned char* in, size_t insize, + const LodePNGDecompressSettings* settings) +{ + /*bit pointer in the "in" data, current byte is bp >> 3, current bit is bp & 0x7 (from lsb to msb of the byte)*/ + size_t bp = 0; + unsigned BFINAL = 0; + size_t pos = 0; /*byte position in the out buffer*/ + unsigned error = 0; + + (void)settings; + + while(!BFINAL) + { + unsigned BTYPE; + if(bp + 2 >= insize * 8) return 52; /*error, bit pointer will jump past memory*/ + BFINAL = readBitFromStream(&bp, in); + BTYPE = 1u * readBitFromStream(&bp, in); + BTYPE += 2u * readBitFromStream(&bp, in); + + if(BTYPE == 3) return 20; /*error: invalid BTYPE*/ + else if(BTYPE == 0) error = inflateNoCompression(out, in, &bp, &pos, insize); /*no compression*/ + else error = inflateHuffmanBlock(out, in, &bp, &pos, insize, BTYPE); /*compression, BTYPE 01 or 10*/ + + if(error) return error; + } + + return error; +} + +unsigned lodepng_inflate(unsigned char** out, size_t* outsize, + const unsigned char* in, size_t insize, + const LodePNGDecompressSettings* settings) +{ + unsigned error; + ucvector v; + ucvector_init_buffer(&v, *out, *outsize); + error = lodepng_inflatev(&v, in, insize, settings); + *out = v.data; + *outsize = v.size; + return error; +} + +static unsigned inflate(unsigned char** out, size_t* outsize, + const unsigned char* in, size_t insize, + const LodePNGDecompressSettings* settings) +{ + if(settings->custom_inflate) + { + return settings->custom_inflate(out, outsize, in, insize, settings); + } + else + { + return lodepng_inflate(out, outsize, in, insize, settings); + } +} + +#endif /*LODEPNG_COMPILE_DECODER*/ + +#ifdef LODEPNG_COMPILE_ENCODER + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / Deflator (Compressor) / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +static const size_t MAX_SUPPORTED_DEFLATE_LENGTH = 258; + +/*bitlen is the size in bits of the code*/ +static void addHuffmanSymbol(size_t* bp, ucvector* compressed, unsigned code, unsigned bitlen) +{ + addBitsToStreamReversed(bp, compressed, code, bitlen); +} + +/*search the index in the array, that has the largest value smaller than or equal to the given value, +given array must be sorted (if no value is smaller, it returns the size of the given array)*/ +static size_t searchCodeIndex(const unsigned* array, size_t array_size, size_t value) +{ + /*binary search (only small gain over linear). TODO: use CPU log2 instruction for getting symbols instead*/ + size_t left = 1; + size_t right = array_size - 1; + + while(left <= right) { + size_t mid = (left + right) >> 1; + if (array[mid] >= value) right = mid - 1; + else left = mid + 1; + } + if(left >= array_size || array[left] > value) left--; + return left; +} + +static void addLengthDistance(uivector* values, size_t length, size_t distance) +{ + /*values in encoded vector are those used by deflate: + 0-255: literal bytes + 256: end + 257-285: length/distance pair (length code, followed by extra length bits, distance code, extra distance bits) + 286-287: invalid*/ + + unsigned length_code = (unsigned)searchCodeIndex(LENGTHBASE, 29, length); + unsigned extra_length = (unsigned)(length - LENGTHBASE[length_code]); + unsigned dist_code = (unsigned)searchCodeIndex(DISTANCEBASE, 30, distance); + unsigned extra_distance = (unsigned)(distance - DISTANCEBASE[dist_code]); + + uivector_push_back(values, length_code + FIRST_LENGTH_CODE_INDEX); + uivector_push_back(values, extra_length); + uivector_push_back(values, dist_code); + uivector_push_back(values, extra_distance); +} + +/*3 bytes of data get encoded into two bytes. The hash cannot use more than 3 +bytes as input because 3 is the minimum match length for deflate*/ +static const unsigned HASH_NUM_VALUES = 65536; +static const unsigned HASH_BIT_MASK = 65535; /*HASH_NUM_VALUES - 1, but C90 does not like that as initializer*/ + +typedef struct Hash +{ + int* head; /*hash value to head circular pos - can be outdated if went around window*/ + /*circular pos to prev circular pos*/ + unsigned short* chain; + int* val; /*circular pos to hash value*/ + + /*TODO: do this not only for zeros but for any repeated byte. However for PNG + it's always going to be the zeros that dominate, so not important for PNG*/ + int* headz; /*similar to head, but for chainz*/ + unsigned short* chainz; /*those with same amount of zeros*/ + unsigned short* zeros; /*length of zeros streak, used as a second hash chain*/ +} Hash; + +static unsigned hash_init(Hash* hash, unsigned windowsize) +{ + unsigned i; + hash->head = (int*)lodepng_malloc(sizeof(int) * HASH_NUM_VALUES); + hash->val = (int*)lodepng_malloc(sizeof(int) * windowsize); + hash->chain = (unsigned short*)lodepng_malloc(sizeof(unsigned short) * windowsize); + + hash->zeros = (unsigned short*)lodepng_malloc(sizeof(unsigned short) * windowsize); + hash->headz = (int*)lodepng_malloc(sizeof(int) * (MAX_SUPPORTED_DEFLATE_LENGTH + 1)); + hash->chainz = (unsigned short*)lodepng_malloc(sizeof(unsigned short) * windowsize); + + if(!hash->head || !hash->chain || !hash->val || !hash->headz|| !hash->chainz || !hash->zeros) + { + return 83; /*alloc fail*/ + } + + /*initialize hash table*/ + for(i = 0; i != HASH_NUM_VALUES; ++i) hash->head[i] = -1; + for(i = 0; i != windowsize; ++i) hash->val[i] = -1; + for(i = 0; i != windowsize; ++i) hash->chain[i] = i; /*same value as index indicates uninitialized*/ + + for(i = 0; i <= MAX_SUPPORTED_DEFLATE_LENGTH; ++i) hash->headz[i] = -1; + for(i = 0; i != windowsize; ++i) hash->chainz[i] = i; /*same value as index indicates uninitialized*/ + + return 0; +} + +static void hash_cleanup(Hash* hash) +{ + lodepng_free(hash->head); + lodepng_free(hash->val); + lodepng_free(hash->chain); + + lodepng_free(hash->zeros); + lodepng_free(hash->headz); + lodepng_free(hash->chainz); +} + + + +static unsigned getHash(const unsigned char* data, size_t size, size_t pos) +{ + unsigned result = 0; + if(pos + 2 < size) + { + /*A simple shift and xor hash is used. Since the data of PNGs is dominated + by zeroes due to the filters, a better hash does not have a significant + effect on speed in traversing the chain, and causes more time spend on + calculating the hash.*/ + result ^= (unsigned)(data[pos + 0] << 0u); + result ^= (unsigned)(data[pos + 1] << 4u); + result ^= (unsigned)(data[pos + 2] << 8u); + } else { + size_t amount, i; + if(pos >= size) return 0; + amount = size - pos; + for(i = 0; i != amount; ++i) result ^= (unsigned)(data[pos + i] << (i * 8u)); + } + return result & HASH_BIT_MASK; +} + +static unsigned countZeros(const unsigned char* data, size_t size, size_t pos) +{ + const unsigned char* start = data + pos; + const unsigned char* end = start + MAX_SUPPORTED_DEFLATE_LENGTH; + if(end > data + size) end = data + size; + data = start; + while(data != end && *data == 0) ++data; + /*subtracting two addresses returned as 32-bit number (max value is MAX_SUPPORTED_DEFLATE_LENGTH)*/ + return (unsigned)(data - start); +} + +/*wpos = pos & (windowsize - 1)*/ +static void updateHashChain(Hash* hash, int wpos, unsigned hashval, unsigned short numzeros) +{ + hash->val[wpos] = (int)hashval; + if(hash->head[hashval] != -1) hash->chain[wpos] = hash->head[hashval]; + hash->head[hashval] = wpos; + + hash->zeros[wpos] = numzeros; + if(hash->headz[numzeros] != -1) hash->chainz[wpos] = hash->headz[numzeros]; + hash->headz[numzeros] = wpos; +} + +/* +LZ77-encode the data. Return value is error code. The input are raw bytes, the output +is in the form of unsigned integers with codes representing for example literal bytes, or +length/distance pairs. +It uses a hash table technique to let it encode faster. When doing LZ77 encoding, a +sliding window (of windowsize) is used, and all past bytes in that window can be used as +the "dictionary". A brute force search through all possible distances would be slow, and +this hash technique is one out of several ways to speed this up. +*/ +static unsigned encodeLZ77(uivector* out, Hash* hash, + const unsigned char* in, size_t inpos, size_t insize, unsigned windowsize, + unsigned minmatch, unsigned nicematch, unsigned lazymatching) +{ + size_t pos; + unsigned i, error = 0; + /*for large window lengths, assume the user wants no compression loss. Otherwise, max hash chain length speedup.*/ + unsigned maxchainlength = windowsize >= 8192 ? windowsize : windowsize / 8; + unsigned maxlazymatch = windowsize >= 8192 ? MAX_SUPPORTED_DEFLATE_LENGTH : 64; + + unsigned usezeros = 1; /*not sure if setting it to false for windowsize < 8192 is better or worse*/ + unsigned numzeros = 0; + + unsigned offset; /*the offset represents the distance in LZ77 terminology*/ + unsigned length; + unsigned lazy = 0; + unsigned lazylength = 0, lazyoffset = 0; + unsigned hashval; + unsigned current_offset, current_length; + unsigned prev_offset; + const unsigned char *lastptr, *foreptr, *backptr; + unsigned hashpos; + + if(windowsize == 0 || windowsize > 32768) return 60; /*error: windowsize smaller/larger than allowed*/ + if((windowsize & (windowsize - 1)) != 0) return 90; /*error: must be power of two*/ + + if(nicematch > MAX_SUPPORTED_DEFLATE_LENGTH) nicematch = MAX_SUPPORTED_DEFLATE_LENGTH; + + for(pos = inpos; pos < insize; ++pos) + { + unsigned int wpos = pos & (windowsize - 1); /*position for in 'circular' hash buffers*/ + unsigned chainlength = 0; + + hashval = getHash(in, insize, pos); + + if(usezeros && hashval == 0) + { + if(numzeros == 0) numzeros = countZeros(in, insize, pos); + else if(pos + numzeros > insize || in[pos + numzeros - 1] != 0) --numzeros; + } + else + { + numzeros = 0; + } + + updateHashChain(hash, wpos, hashval, numzeros); + + /*the length and offset found for the current position*/ + length = 0; + offset = 0; + + hashpos = hash->chain[wpos]; + + lastptr = &in[insize < pos + MAX_SUPPORTED_DEFLATE_LENGTH ? insize : pos + MAX_SUPPORTED_DEFLATE_LENGTH]; + + /*search for the longest string*/ + prev_offset = 0; + for(;;) + { + if(chainlength++ >= maxchainlength) break; + current_offset = hashpos <= wpos ? wpos - hashpos : wpos - hashpos + windowsize; + + if(current_offset < prev_offset) break; /*stop when went completely around the circular buffer*/ + prev_offset = current_offset; + if(current_offset > 0) + { + /*test the next characters*/ + foreptr = &in[pos]; + backptr = &in[pos - current_offset]; + + /*common case in PNGs is lots of zeros. Quickly skip over them as a speedup*/ + if(numzeros >= 3) + { + unsigned skip = hash->zeros[hashpos]; + if(skip > numzeros) skip = numzeros; + backptr += skip; + foreptr += skip; + } + + while(foreptr != lastptr && *backptr == *foreptr) /*maximum supported length by deflate is max length*/ + { + ++backptr; + ++foreptr; + } + current_length = (unsigned)(foreptr - &in[pos]); + + if(current_length > length) + { + length = current_length; /*the longest length*/ + offset = current_offset; /*the offset that is related to this longest length*/ + /*jump out once a length of max length is found (speed gain). This also jumps + out if length is MAX_SUPPORTED_DEFLATE_LENGTH*/ + if(current_length >= nicematch) break; + } + } + + if(hashpos == hash->chain[hashpos]) break; + + if(numzeros >= 3 && length > numzeros) + { + hashpos = hash->chainz[hashpos]; + if(hash->zeros[hashpos] != numzeros) break; + } + else + { + hashpos = hash->chain[hashpos]; + /*outdated hash value, happens if particular value was not encountered in whole last window*/ + if(hash->val[hashpos] != (int)hashval) break; + } + } + + if(lazymatching) + { + if(!lazy && length >= 3 && length <= maxlazymatch && length < MAX_SUPPORTED_DEFLATE_LENGTH) + { + lazy = 1; + lazylength = length; + lazyoffset = offset; + continue; /*try the next byte*/ + } + if(lazy) + { + lazy = 0; + if(pos == 0) ERROR_BREAK(81); + if(length > lazylength + 1) + { + /*push the previous character as literal*/ + if(!uivector_push_back(out, in[pos - 1])) ERROR_BREAK(83 /*alloc fail*/); + } + else + { + length = lazylength; + offset = lazyoffset; + hash->head[hashval] = -1; /*the same hashchain update will be done, this ensures no wrong alteration*/ + hash->headz[numzeros] = -1; /*idem*/ + --pos; + } + } + } + if(length >= 3 && offset > windowsize) ERROR_BREAK(86 /*too big (or overflown negative) offset*/); + + /*encode it as length/distance pair or literal value*/ + if(length < 3) /*only lengths of 3 or higher are supported as length/distance pair*/ + { + if(!uivector_push_back(out, in[pos])) ERROR_BREAK(83 /*alloc fail*/); + } + else if(length < minmatch || (length == 3 && offset > 4096)) + { + /*compensate for the fact that longer offsets have more extra bits, a + length of only 3 may be not worth it then*/ + if(!uivector_push_back(out, in[pos])) ERROR_BREAK(83 /*alloc fail*/); + } + else + { + addLengthDistance(out, length, offset); + for(i = 1; i < length; ++i) + { + ++pos; + wpos = pos & (windowsize - 1); + hashval = getHash(in, insize, pos); + if(usezeros && hashval == 0) + { + if(numzeros == 0) numzeros = countZeros(in, insize, pos); + else if(pos + numzeros > insize || in[pos + numzeros - 1] != 0) --numzeros; + } + else + { + numzeros = 0; + } + updateHashChain(hash, wpos, hashval, numzeros); + } + } + } /*end of the loop through each character of input*/ + + return error; +} + +/* /////////////////////////////////////////////////////////////////////////// */ + +static unsigned deflateNoCompression(ucvector* out, const unsigned char* data, size_t datasize) +{ + /*non compressed deflate block data: 1 bit BFINAL,2 bits BTYPE,(5 bits): it jumps to start of next byte, + 2 bytes LEN, 2 bytes NLEN, LEN bytes literal DATA*/ + + size_t i, j, numdeflateblocks = (datasize + 65534) / 65535; + unsigned datapos = 0; + for(i = 0; i != numdeflateblocks; ++i) + { + unsigned BFINAL, BTYPE, LEN, NLEN; + unsigned char firstbyte; + + BFINAL = (i == numdeflateblocks - 1); + BTYPE = 0; + + firstbyte = (unsigned char)(BFINAL + ((BTYPE & 1) << 1) + ((BTYPE & 2) << 1)); + ucvector_push_back(out, firstbyte); + + LEN = 65535; + if(datasize - datapos < 65535) LEN = (unsigned)datasize - datapos; + NLEN = 65535 - LEN; + + ucvector_push_back(out, (unsigned char)(LEN & 255)); + ucvector_push_back(out, (unsigned char)(LEN >> 8)); + ucvector_push_back(out, (unsigned char)(NLEN & 255)); + ucvector_push_back(out, (unsigned char)(NLEN >> 8)); + + /*Decompressed data*/ + for(j = 0; j < 65535 && datapos < datasize; ++j) + { + ucvector_push_back(out, data[datapos++]); + } + } + + return 0; +} + +/* +write the lz77-encoded data, which has lit, len and dist codes, to compressed stream using huffman trees. +tree_ll: the tree for lit and len codes. +tree_d: the tree for distance codes. +*/ +static void writeLZ77data(size_t* bp, ucvector* out, const uivector* lz77_encoded, + const HuffmanTree* tree_ll, const HuffmanTree* tree_d) +{ + size_t i = 0; + for(i = 0; i != lz77_encoded->size; ++i) + { + unsigned val = lz77_encoded->data[i]; + addHuffmanSymbol(bp, out, HuffmanTree_getCode(tree_ll, val), HuffmanTree_getLength(tree_ll, val)); + if(val > 256) /*for a length code, 3 more things have to be added*/ + { + unsigned length_index = val - FIRST_LENGTH_CODE_INDEX; + unsigned n_length_extra_bits = LENGTHEXTRA[length_index]; + unsigned length_extra_bits = lz77_encoded->data[++i]; + + unsigned distance_code = lz77_encoded->data[++i]; + + unsigned distance_index = distance_code; + unsigned n_distance_extra_bits = DISTANCEEXTRA[distance_index]; + unsigned distance_extra_bits = lz77_encoded->data[++i]; + + addBitsToStream(bp, out, length_extra_bits, n_length_extra_bits); + addHuffmanSymbol(bp, out, HuffmanTree_getCode(tree_d, distance_code), + HuffmanTree_getLength(tree_d, distance_code)); + addBitsToStream(bp, out, distance_extra_bits, n_distance_extra_bits); + } + } +} + +/*Deflate for a block of type "dynamic", that is, with freely, optimally, created huffman trees*/ +static unsigned deflateDynamic(ucvector* out, size_t* bp, Hash* hash, + const unsigned char* data, size_t datapos, size_t dataend, + const LodePNGCompressSettings* settings, unsigned final) +{ + unsigned error = 0; + + /* + A block is compressed as follows: The PNG data is lz77 encoded, resulting in + literal bytes and length/distance pairs. This is then huffman compressed with + two huffman trees. One huffman tree is used for the lit and len values ("ll"), + another huffman tree is used for the dist values ("d"). These two trees are + stored using their code lengths, and to compress even more these code lengths + are also run-length encoded and huffman compressed. This gives a huffman tree + of code lengths "cl". The code lenghts used to describe this third tree are + the code length code lengths ("clcl"). + */ + + /*The lz77 encoded data, represented with integers since there will also be length and distance codes in it*/ + uivector lz77_encoded; + HuffmanTree tree_ll; /*tree for lit,len values*/ + HuffmanTree tree_d; /*tree for distance codes*/ + HuffmanTree tree_cl; /*tree for encoding the code lengths representing tree_ll and tree_d*/ + uivector frequencies_ll; /*frequency of lit,len codes*/ + uivector frequencies_d; /*frequency of dist codes*/ + uivector frequencies_cl; /*frequency of code length codes*/ + uivector bitlen_lld; /*lit,len,dist code lenghts (int bits), literally (without repeat codes).*/ + uivector bitlen_lld_e; /*bitlen_lld encoded with repeat codes (this is a rudemtary run length compression)*/ + /*bitlen_cl is the code length code lengths ("clcl"). The bit lengths of codes to represent tree_cl + (these are written as is in the file, it would be crazy to compress these using yet another huffman + tree that needs to be represented by yet another set of code lengths)*/ + uivector bitlen_cl; + size_t datasize = dataend - datapos; + + /* + Due to the huffman compression of huffman tree representations ("two levels"), there are some anologies: + bitlen_lld is to tree_cl what data is to tree_ll and tree_d. + bitlen_lld_e is to bitlen_lld what lz77_encoded is to data. + bitlen_cl is to bitlen_lld_e what bitlen_lld is to lz77_encoded. + */ + + unsigned BFINAL = final; + size_t numcodes_ll, numcodes_d, i; + unsigned HLIT, HDIST, HCLEN; + + uivector_init(&lz77_encoded); + HuffmanTree_init(&tree_ll); + HuffmanTree_init(&tree_d); + HuffmanTree_init(&tree_cl); + uivector_init(&frequencies_ll); + uivector_init(&frequencies_d); + uivector_init(&frequencies_cl); + uivector_init(&bitlen_lld); + uivector_init(&bitlen_lld_e); + uivector_init(&bitlen_cl); + + /*This while loop never loops due to a break at the end, it is here to + allow breaking out of it to the cleanup phase on error conditions.*/ + while(!error) + { + if(settings->use_lz77) + { + error = encodeLZ77(&lz77_encoded, hash, data, datapos, dataend, settings->windowsize, + settings->minmatch, settings->nicematch, settings->lazymatching); + if(error) break; + } + else + { + if(!uivector_resize(&lz77_encoded, datasize)) ERROR_BREAK(83 /*alloc fail*/); + for(i = datapos; i < dataend; ++i) lz77_encoded.data[i - datapos] = data[i]; /*no LZ77, but still will be Huffman compressed*/ + } + + if(!uivector_resizev(&frequencies_ll, 286, 0)) ERROR_BREAK(83 /*alloc fail*/); + if(!uivector_resizev(&frequencies_d, 30, 0)) ERROR_BREAK(83 /*alloc fail*/); + + /*Count the frequencies of lit, len and dist codes*/ + for(i = 0; i != lz77_encoded.size; ++i) + { + unsigned symbol = lz77_encoded.data[i]; + ++frequencies_ll.data[symbol]; + if(symbol > 256) + { + unsigned dist = lz77_encoded.data[i + 2]; + ++frequencies_d.data[dist]; + i += 3; + } + } + frequencies_ll.data[256] = 1; /*there will be exactly 1 end code, at the end of the block*/ + + /*Make both huffman trees, one for the lit and len codes, one for the dist codes*/ + error = HuffmanTree_makeFromFrequencies(&tree_ll, frequencies_ll.data, 257, frequencies_ll.size, 15); + if(error) break; + /*2, not 1, is chosen for mincodes: some buggy PNG decoders require at least 2 symbols in the dist tree*/ + error = HuffmanTree_makeFromFrequencies(&tree_d, frequencies_d.data, 2, frequencies_d.size, 15); + if(error) break; + + numcodes_ll = tree_ll.numcodes; if(numcodes_ll > 286) numcodes_ll = 286; + numcodes_d = tree_d.numcodes; if(numcodes_d > 30) numcodes_d = 30; + /*store the code lengths of both generated trees in bitlen_lld*/ + for(i = 0; i != numcodes_ll; ++i) uivector_push_back(&bitlen_lld, HuffmanTree_getLength(&tree_ll, (unsigned)i)); + for(i = 0; i != numcodes_d; ++i) uivector_push_back(&bitlen_lld, HuffmanTree_getLength(&tree_d, (unsigned)i)); + + /*run-length compress bitlen_ldd into bitlen_lld_e by using repeat codes 16 (copy length 3-6 times), + 17 (3-10 zeroes), 18 (11-138 zeroes)*/ + for(i = 0; i != (unsigned)bitlen_lld.size; ++i) + { + unsigned j = 0; /*amount of repititions*/ + while(i + j + 1 < (unsigned)bitlen_lld.size && bitlen_lld.data[i + j + 1] == bitlen_lld.data[i]) ++j; + + if(bitlen_lld.data[i] == 0 && j >= 2) /*repeat code for zeroes*/ + { + ++j; /*include the first zero*/ + if(j <= 10) /*repeat code 17 supports max 10 zeroes*/ + { + uivector_push_back(&bitlen_lld_e, 17); + uivector_push_back(&bitlen_lld_e, j - 3); + } + else /*repeat code 18 supports max 138 zeroes*/ + { + if(j > 138) j = 138; + uivector_push_back(&bitlen_lld_e, 18); + uivector_push_back(&bitlen_lld_e, j - 11); + } + i += (j - 1); + } + else if(j >= 3) /*repeat code for value other than zero*/ + { + size_t k; + unsigned num = j / 6, rest = j % 6; + uivector_push_back(&bitlen_lld_e, bitlen_lld.data[i]); + for(k = 0; k < num; ++k) + { + uivector_push_back(&bitlen_lld_e, 16); + uivector_push_back(&bitlen_lld_e, 6 - 3); + } + if(rest >= 3) + { + uivector_push_back(&bitlen_lld_e, 16); + uivector_push_back(&bitlen_lld_e, rest - 3); + } + else j -= rest; + i += j; + } + else /*too short to benefit from repeat code*/ + { + uivector_push_back(&bitlen_lld_e, bitlen_lld.data[i]); + } + } + + /*generate tree_cl, the huffmantree of huffmantrees*/ + + if(!uivector_resizev(&frequencies_cl, NUM_CODE_LENGTH_CODES, 0)) ERROR_BREAK(83 /*alloc fail*/); + for(i = 0; i != bitlen_lld_e.size; ++i) + { + ++frequencies_cl.data[bitlen_lld_e.data[i]]; + /*after a repeat code come the bits that specify the number of repetitions, + those don't need to be in the frequencies_cl calculation*/ + if(bitlen_lld_e.data[i] >= 16) ++i; + } + + error = HuffmanTree_makeFromFrequencies(&tree_cl, frequencies_cl.data, + frequencies_cl.size, frequencies_cl.size, 7); + if(error) break; + + if(!uivector_resize(&bitlen_cl, tree_cl.numcodes)) ERROR_BREAK(83 /*alloc fail*/); + for(i = 0; i != tree_cl.numcodes; ++i) + { + /*lenghts of code length tree is in the order as specified by deflate*/ + bitlen_cl.data[i] = HuffmanTree_getLength(&tree_cl, CLCL_ORDER[i]); + } + while(bitlen_cl.data[bitlen_cl.size - 1] == 0 && bitlen_cl.size > 4) + { + /*remove zeros at the end, but minimum size must be 4*/ + if(!uivector_resize(&bitlen_cl, bitlen_cl.size - 1)) ERROR_BREAK(83 /*alloc fail*/); + } + if(error) break; + + /* + Write everything into the output + + After the BFINAL and BTYPE, the dynamic block consists out of the following: + - 5 bits HLIT, 5 bits HDIST, 4 bits HCLEN + - (HCLEN+4)*3 bits code lengths of code length alphabet + - HLIT + 257 code lenghts of lit/length alphabet (encoded using the code length + alphabet, + possible repetition codes 16, 17, 18) + - HDIST + 1 code lengths of distance alphabet (encoded using the code length + alphabet, + possible repetition codes 16, 17, 18) + - compressed data + - 256 (end code) + */ + + /*Write block type*/ + addBitToStream(bp, out, BFINAL); + addBitToStream(bp, out, 0); /*first bit of BTYPE "dynamic"*/ + addBitToStream(bp, out, 1); /*second bit of BTYPE "dynamic"*/ + + /*write the HLIT, HDIST and HCLEN values*/ + HLIT = (unsigned)(numcodes_ll - 257); + HDIST = (unsigned)(numcodes_d - 1); + HCLEN = (unsigned)bitlen_cl.size - 4; + /*trim zeroes for HCLEN. HLIT and HDIST were already trimmed at tree creation*/ + while(!bitlen_cl.data[HCLEN + 4 - 1] && HCLEN > 0) --HCLEN; + addBitsToStream(bp, out, HLIT, 5); + addBitsToStream(bp, out, HDIST, 5); + addBitsToStream(bp, out, HCLEN, 4); + + /*write the code lenghts of the code length alphabet*/ + for(i = 0; i != HCLEN + 4; ++i) addBitsToStream(bp, out, bitlen_cl.data[i], 3); + + /*write the lenghts of the lit/len AND the dist alphabet*/ + for(i = 0; i != bitlen_lld_e.size; ++i) + { + addHuffmanSymbol(bp, out, HuffmanTree_getCode(&tree_cl, bitlen_lld_e.data[i]), + HuffmanTree_getLength(&tree_cl, bitlen_lld_e.data[i])); + /*extra bits of repeat codes*/ + if(bitlen_lld_e.data[i] == 16) addBitsToStream(bp, out, bitlen_lld_e.data[++i], 2); + else if(bitlen_lld_e.data[i] == 17) addBitsToStream(bp, out, bitlen_lld_e.data[++i], 3); + else if(bitlen_lld_e.data[i] == 18) addBitsToStream(bp, out, bitlen_lld_e.data[++i], 7); + } + + /*write the compressed data symbols*/ + writeLZ77data(bp, out, &lz77_encoded, &tree_ll, &tree_d); + /*error: the length of the end code 256 must be larger than 0*/ + if(HuffmanTree_getLength(&tree_ll, 256) == 0) ERROR_BREAK(64); + + /*write the end code*/ + addHuffmanSymbol(bp, out, HuffmanTree_getCode(&tree_ll, 256), HuffmanTree_getLength(&tree_ll, 256)); + + break; /*end of error-while*/ + } + + /*cleanup*/ + uivector_cleanup(&lz77_encoded); + HuffmanTree_cleanup(&tree_ll); + HuffmanTree_cleanup(&tree_d); + HuffmanTree_cleanup(&tree_cl); + uivector_cleanup(&frequencies_ll); + uivector_cleanup(&frequencies_d); + uivector_cleanup(&frequencies_cl); + uivector_cleanup(&bitlen_lld_e); + uivector_cleanup(&bitlen_lld); + uivector_cleanup(&bitlen_cl); + + return error; +} + +static unsigned deflateFixed(ucvector* out, size_t* bp, Hash* hash, + const unsigned char* data, + size_t datapos, size_t dataend, + const LodePNGCompressSettings* settings, unsigned final) +{ + HuffmanTree tree_ll; /*tree for literal values and length codes*/ + HuffmanTree tree_d; /*tree for distance codes*/ + + unsigned BFINAL = final; + unsigned error = 0; + size_t i; + + HuffmanTree_init(&tree_ll); + HuffmanTree_init(&tree_d); + + generateFixedLitLenTree(&tree_ll); + generateFixedDistanceTree(&tree_d); + + addBitToStream(bp, out, BFINAL); + addBitToStream(bp, out, 1); /*first bit of BTYPE*/ + addBitToStream(bp, out, 0); /*second bit of BTYPE*/ + + if(settings->use_lz77) /*LZ77 encoded*/ + { + uivector lz77_encoded; + uivector_init(&lz77_encoded); + error = encodeLZ77(&lz77_encoded, hash, data, datapos, dataend, settings->windowsize, + settings->minmatch, settings->nicematch, settings->lazymatching); + if(!error) writeLZ77data(bp, out, &lz77_encoded, &tree_ll, &tree_d); + uivector_cleanup(&lz77_encoded); + } + else /*no LZ77, but still will be Huffman compressed*/ + { + for(i = datapos; i < dataend; ++i) + { + addHuffmanSymbol(bp, out, HuffmanTree_getCode(&tree_ll, data[i]), HuffmanTree_getLength(&tree_ll, data[i])); + } + } + /*add END code*/ + if(!error) addHuffmanSymbol(bp, out, HuffmanTree_getCode(&tree_ll, 256), HuffmanTree_getLength(&tree_ll, 256)); + + /*cleanup*/ + HuffmanTree_cleanup(&tree_ll); + HuffmanTree_cleanup(&tree_d); + + return error; +} + +static unsigned lodepng_deflatev(ucvector* out, const unsigned char* in, size_t insize, + const LodePNGCompressSettings* settings) +{ + unsigned error = 0; + size_t i, blocksize, numdeflateblocks; + size_t bp = 0; /*the bit pointer*/ + Hash hash; + + if(settings->btype > 2) return 61; + else if(settings->btype == 0) return deflateNoCompression(out, in, insize); + else if(settings->btype == 1) blocksize = insize; + else /*if(settings->btype == 2)*/ + { + /*on PNGs, deflate blocks of 65-262k seem to give most dense encoding*/ + blocksize = insize / 8 + 8; + if(blocksize < 65536) blocksize = 65536; + if(blocksize > 262144) blocksize = 262144; + } + + numdeflateblocks = (insize + blocksize - 1) / blocksize; + if(numdeflateblocks == 0) numdeflateblocks = 1; + + error = hash_init(&hash, settings->windowsize); + if(error) return error; + + for(i = 0; i != numdeflateblocks && !error; ++i) + { + unsigned final = (i == numdeflateblocks - 1); + size_t start = i * blocksize; + size_t end = start + blocksize; + if(end > insize) end = insize; + + if(settings->btype == 1) error = deflateFixed(out, &bp, &hash, in, start, end, settings, final); + else if(settings->btype == 2) error = deflateDynamic(out, &bp, &hash, in, start, end, settings, final); + } + + hash_cleanup(&hash); + + return error; +} + +unsigned lodepng_deflate(unsigned char** out, size_t* outsize, + const unsigned char* in, size_t insize, + const LodePNGCompressSettings* settings) +{ + unsigned error; + ucvector v; + ucvector_init_buffer(&v, *out, *outsize); + error = lodepng_deflatev(&v, in, insize, settings); + *out = v.data; + *outsize = v.size; + return error; +} + +static unsigned deflate(unsigned char** out, size_t* outsize, + const unsigned char* in, size_t insize, + const LodePNGCompressSettings* settings) +{ + if(settings->custom_deflate) + { + return settings->custom_deflate(out, outsize, in, insize, settings); + } + else + { + return lodepng_deflate(out, outsize, in, insize, settings); + } +} + +#endif /*LODEPNG_COMPILE_DECODER*/ + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / Adler32 */ +/* ////////////////////////////////////////////////////////////////////////// */ + +static unsigned update_adler32(unsigned adler, const unsigned char* data, unsigned len) +{ + unsigned s1 = adler & 0xffff; + unsigned s2 = (adler >> 16) & 0xffff; + + while(len > 0) + { + /*at least 5550 sums can be done before the sums overflow, saving a lot of module divisions*/ + unsigned amount = len > 5550 ? 5550 : len; + len -= amount; + while(amount > 0) + { + s1 += (*data++); + s2 += s1; + --amount; + } + s1 %= 65521; + s2 %= 65521; + } + + return (s2 << 16) | s1; +} + +/*Return the adler32 of the bytes data[0..len-1]*/ +static unsigned adler32(const unsigned char* data, unsigned len) +{ + return update_adler32(1L, data, len); +} + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / Zlib / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +#ifdef LODEPNG_COMPILE_DECODER + +unsigned lodepng_zlib_decompress(unsigned char** out, size_t* outsize, const unsigned char* in, + size_t insize, const LodePNGDecompressSettings* settings) +{ + unsigned error = 0; + unsigned CM, CINFO, FDICT; + + if(insize < 2) return 53; /*error, size of zlib data too small*/ + /*read information from zlib header*/ + if((in[0] * 256 + in[1]) % 31 != 0) + { + /*error: 256 * in[0] + in[1] must be a multiple of 31, the FCHECK value is supposed to be made that way*/ + return 24; + } + + CM = in[0] & 15; + CINFO = (in[0] >> 4) & 15; + /*FCHECK = in[1] & 31;*/ /*FCHECK is already tested above*/ + FDICT = (in[1] >> 5) & 1; + /*FLEVEL = (in[1] >> 6) & 3;*/ /*FLEVEL is not used here*/ + + if(CM != 8 || CINFO > 7) + { + /*error: only compression method 8: inflate with sliding window of 32k is supported by the PNG spec*/ + return 25; + } + if(FDICT != 0) + { + /*error: the specification of PNG says about the zlib stream: + "The additional flags shall not specify a preset dictionary."*/ + return 26; + } + + error = inflate(out, outsize, in + 2, insize - 2, settings); + if(error) return error; + + if(!settings->ignore_adler32) + { + unsigned ADLER32 = lodepng_read32bitInt(&in[insize - 4]); + unsigned checksum = adler32(*out, (unsigned)(*outsize)); + if(checksum != ADLER32) return 58; /*error, adler checksum not correct, data must be corrupted*/ + } + + return 0; /*no error*/ +} + +static unsigned zlib_decompress(unsigned char** out, size_t* outsize, const unsigned char* in, + size_t insize, const LodePNGDecompressSettings* settings) +{ + if(settings->custom_zlib) + { + return settings->custom_zlib(out, outsize, in, insize, settings); + } + else + { + return lodepng_zlib_decompress(out, outsize, in, insize, settings); + } +} + +#endif /*LODEPNG_COMPILE_DECODER*/ + +#ifdef LODEPNG_COMPILE_ENCODER + +unsigned lodepng_zlib_compress(unsigned char** out, size_t* outsize, const unsigned char* in, + size_t insize, const LodePNGCompressSettings* settings) +{ + /*initially, *out must be NULL and outsize 0, if you just give some random *out + that's pointing to a non allocated buffer, this'll crash*/ + ucvector outv; + size_t i; + unsigned error; + unsigned char* deflatedata = 0; + size_t deflatesize = 0; + + /*zlib data: 1 byte CMF (CM+CINFO), 1 byte FLG, deflate data, 4 byte ADLER32 checksum of the Decompressed data*/ + unsigned CMF = 120; /*0b01111000: CM 8, CINFO 7. With CINFO 7, any window size up to 32768 can be used.*/ + unsigned FLEVEL = 0; + unsigned FDICT = 0; + unsigned CMFFLG = 256 * CMF + FDICT * 32 + FLEVEL * 64; + unsigned FCHECK = 31 - CMFFLG % 31; + CMFFLG += FCHECK; + + /*ucvector-controlled version of the output buffer, for dynamic array*/ + ucvector_init_buffer(&outv, *out, *outsize); + + ucvector_push_back(&outv, (unsigned char)(CMFFLG >> 8)); + ucvector_push_back(&outv, (unsigned char)(CMFFLG & 255)); + + error = deflate(&deflatedata, &deflatesize, in, insize, settings); + + if(!error) + { + unsigned ADLER32 = adler32(in, (unsigned)insize); + for(i = 0; i != deflatesize; ++i) ucvector_push_back(&outv, deflatedata[i]); + lodepng_free(deflatedata); + lodepng_add32bitInt(&outv, ADLER32); + } + + *out = outv.data; + *outsize = outv.size; + + return error; +} + +/* compress using the default or custom zlib function */ +static unsigned zlib_compress(unsigned char** out, size_t* outsize, const unsigned char* in, + size_t insize, const LodePNGCompressSettings* settings) +{ + if(settings->custom_zlib) + { + return settings->custom_zlib(out, outsize, in, insize, settings); + } + else + { + return lodepng_zlib_compress(out, outsize, in, insize, settings); + } +} + +#endif /*LODEPNG_COMPILE_ENCODER*/ + +#else /*no LODEPNG_COMPILE_ZLIB*/ + +#ifdef LODEPNG_COMPILE_DECODER +static unsigned zlib_decompress(unsigned char** out, size_t* outsize, const unsigned char* in, + size_t insize, const LodePNGDecompressSettings* settings) +{ + if(!settings->custom_zlib) return 87; /*no custom zlib function provided */ + return settings->custom_zlib(out, outsize, in, insize, settings); +} +#endif /*LODEPNG_COMPILE_DECODER*/ +#ifdef LODEPNG_COMPILE_ENCODER +static unsigned zlib_compress(unsigned char** out, size_t* outsize, const unsigned char* in, + size_t insize, const LodePNGCompressSettings* settings) +{ + if(!settings->custom_zlib) return 87; /*no custom zlib function provided */ + return settings->custom_zlib(out, outsize, in, insize, settings); +} +#endif /*LODEPNG_COMPILE_ENCODER*/ + +#endif /*LODEPNG_COMPILE_ZLIB*/ + +/* ////////////////////////////////////////////////////////////////////////// */ + +#ifdef LODEPNG_COMPILE_ENCODER + +/*this is a good tradeoff between speed and compression ratio*/ +#define DEFAULT_WINDOWSIZE 2048 + +void lodepng_compress_settings_init(LodePNGCompressSettings* settings) +{ + /*compress with dynamic huffman tree (not in the mathematical sense, just not the predefined one)*/ + settings->btype = 2; + settings->use_lz77 = 1; + settings->windowsize = DEFAULT_WINDOWSIZE; + settings->minmatch = 3; + settings->nicematch = 128; + settings->lazymatching = 1; + + settings->custom_zlib = 0; + settings->custom_deflate = 0; + settings->custom_context = 0; +} + +const LodePNGCompressSettings lodepng_default_compress_settings = {2, 1, DEFAULT_WINDOWSIZE, 3, 128, 1, 0, 0, 0}; + + +#endif /*LODEPNG_COMPILE_ENCODER*/ + +#ifdef LODEPNG_COMPILE_DECODER + +void lodepng_decompress_settings_init(LodePNGDecompressSettings* settings) +{ + settings->ignore_adler32 = 0; + + settings->custom_zlib = 0; + settings->custom_inflate = 0; + settings->custom_context = 0; +} + +const LodePNGDecompressSettings lodepng_default_decompress_settings = {0, 0, 0, 0}; + +#endif /*LODEPNG_COMPILE_DECODER*/ + +/* ////////////////////////////////////////////////////////////////////////// */ +/* ////////////////////////////////////////////////////////////////////////// */ +/* // End of Zlib related code. Begin of PNG related code. // */ +/* ////////////////////////////////////////////////////////////////////////// */ +/* ////////////////////////////////////////////////////////////////////////// */ + +#ifdef LODEPNG_COMPILE_PNG + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / CRC32 / */ +/* ////////////////////////////////////////////////////////////////////////// */ + + +#ifndef LODEPNG_NO_COMPILE_CRC +/* CRC polynomial: 0xedb88320 */ +static unsigned lodepng_crc32_table[256] = { + 0u, 1996959894u, 3993919788u, 2567524794u, 124634137u, 1886057615u, 3915621685u, 2657392035u, + 249268274u, 2044508324u, 3772115230u, 2547177864u, 162941995u, 2125561021u, 3887607047u, 2428444049u, + 498536548u, 1789927666u, 4089016648u, 2227061214u, 450548861u, 1843258603u, 4107580753u, 2211677639u, + 325883990u, 1684777152u, 4251122042u, 2321926636u, 335633487u, 1661365465u, 4195302755u, 2366115317u, + 997073096u, 1281953886u, 3579855332u, 2724688242u, 1006888145u, 1258607687u, 3524101629u, 2768942443u, + 901097722u, 1119000684u, 3686517206u, 2898065728u, 853044451u, 1172266101u, 3705015759u, 2882616665u, + 651767980u, 1373503546u, 3369554304u, 3218104598u, 565507253u, 1454621731u, 3485111705u, 3099436303u, + 671266974u, 1594198024u, 3322730930u, 2970347812u, 795835527u, 1483230225u, 3244367275u, 3060149565u, + 1994146192u, 31158534u, 2563907772u, 4023717930u, 1907459465u, 112637215u, 2680153253u, 3904427059u, + 2013776290u, 251722036u, 2517215374u, 3775830040u, 2137656763u, 141376813u, 2439277719u, 3865271297u, + 1802195444u, 476864866u, 2238001368u, 4066508878u, 1812370925u, 453092731u, 2181625025u, 4111451223u, + 1706088902u, 314042704u, 2344532202u, 4240017532u, 1658658271u, 366619977u, 2362670323u, 4224994405u, + 1303535960u, 984961486u, 2747007092u, 3569037538u, 1256170817u, 1037604311u, 2765210733u, 3554079995u, + 1131014506u, 879679996u, 2909243462u, 3663771856u, 1141124467u, 855842277u, 2852801631u, 3708648649u, + 1342533948u, 654459306u, 3188396048u, 3373015174u, 1466479909u, 544179635u, 3110523913u, 3462522015u, + 1591671054u, 702138776u, 2966460450u, 3352799412u, 1504918807u, 783551873u, 3082640443u, 3233442989u, + 3988292384u, 2596254646u, 62317068u, 1957810842u, 3939845945u, 2647816111u, 81470997u, 1943803523u, + 3814918930u, 2489596804u, 225274430u, 2053790376u, 3826175755u, 2466906013u, 167816743u, 2097651377u, + 4027552580u, 2265490386u, 503444072u, 1762050814u, 4150417245u, 2154129355u, 426522225u, 1852507879u, + 4275313526u, 2312317920u, 282753626u, 1742555852u, 4189708143u, 2394877945u, 397917763u, 1622183637u, + 3604390888u, 2714866558u, 953729732u, 1340076626u, 3518719985u, 2797360999u, 1068828381u, 1219638859u, + 3624741850u, 2936675148u, 906185462u, 1090812512u, 3747672003u, 2825379669u, 829329135u, 1181335161u, + 3412177804u, 3160834842u, 628085408u, 1382605366u, 3423369109u, 3138078467u, 570562233u, 1426400815u, + 3317316542u, 2998733608u, 733239954u, 1555261956u, 3268935591u, 3050360625u, 752459403u, 1541320221u, + 2607071920u, 3965973030u, 1969922972u, 40735498u, 2617837225u, 3943577151u, 1913087877u, 83908371u, + 2512341634u, 3803740692u, 2075208622u, 213261112u, 2463272603u, 3855990285u, 2094854071u, 198958881u, + 2262029012u, 4057260610u, 1759359992u, 534414190u, 2176718541u, 4139329115u, 1873836001u, 414664567u, + 2282248934u, 4279200368u, 1711684554u, 285281116u, 2405801727u, 4167216745u, 1634467795u, 376229701u, + 2685067896u, 3608007406u, 1308918612u, 956543938u, 2808555105u, 3495958263u, 1231636301u, 1047427035u, + 2932959818u, 3654703836u, 1088359270u, 936918000u, 2847714899u, 3736837829u, 1202900863u, 817233897u, + 3183342108u, 3401237130u, 1404277552u, 615818150u, 3134207493u, 3453421203u, 1423857449u, 601450431u, + 3009837614u, 3294710456u, 1567103746u, 711928724u, 3020668471u, 3272380065u, 1510334235u, 755167117u +}; + +/*Return the CRC of the bytes buf[0..len-1].*/ +unsigned lodepng_crc32(const unsigned char* data, size_t length) +{ + unsigned r = 0xffffffffu; + size_t i; + for(i = 0; i < length; ++i) + { + r = lodepng_crc32_table[(r ^ data[i]) & 0xff] ^ (r >> 8); + } + return r ^ 0xffffffffu; +} +#else /* !LODEPNG_NO_COMPILE_CRC */ +unsigned lodepng_crc32(const unsigned char* data, size_t length); +#endif /* !LODEPNG_NO_COMPILE_CRC */ + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / Reading and writing single bits and bytes from/to stream for LodePNG / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +static unsigned char readBitFromReversedStream(size_t* bitpointer, const unsigned char* bitstream) +{ + unsigned char result = (unsigned char)((bitstream[(*bitpointer) >> 3] >> (7 - ((*bitpointer) & 0x7))) & 1); + ++(*bitpointer); + return result; +} + +static unsigned readBitsFromReversedStream(size_t* bitpointer, const unsigned char* bitstream, size_t nbits) +{ + unsigned result = 0; + size_t i; + for(i = nbits - 1; i < nbits; --i) + { + result += (unsigned)readBitFromReversedStream(bitpointer, bitstream) << i; + } + return result; +} + +#ifdef LODEPNG_COMPILE_DECODER +static void setBitOfReversedStream0(size_t* bitpointer, unsigned char* bitstream, unsigned char bit) +{ + /*the current bit in bitstream must be 0 for this to work*/ + if(bit) + { + /*earlier bit of huffman code is in a lesser significant bit of an earlier byte*/ + bitstream[(*bitpointer) >> 3] |= (bit << (7 - ((*bitpointer) & 0x7))); + } + ++(*bitpointer); +} +#endif /*LODEPNG_COMPILE_DECODER*/ + +static void setBitOfReversedStream(size_t* bitpointer, unsigned char* bitstream, unsigned char bit) +{ + /*the current bit in bitstream may be 0 or 1 for this to work*/ + if(bit == 0) bitstream[(*bitpointer) >> 3] &= (unsigned char)(~(1 << (7 - ((*bitpointer) & 0x7)))); + else bitstream[(*bitpointer) >> 3] |= (1 << (7 - ((*bitpointer) & 0x7))); + ++(*bitpointer); +} + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / PNG chunks / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +unsigned lodepng_chunk_length(const unsigned char* chunk) +{ + return lodepng_read32bitInt(&chunk[0]); +} + +void lodepng_chunk_type(char type[5], const unsigned char* chunk) +{ + unsigned i; + for(i = 0; i != 4; ++i) type[i] = (char)chunk[4 + i]; + type[4] = 0; /*null termination char*/ +} + +unsigned char lodepng_chunk_type_equals(const unsigned char* chunk, const char* type) +{ + if(strlen(type) != 4) return 0; + return (chunk[4] == type[0] && chunk[5] == type[1] && chunk[6] == type[2] && chunk[7] == type[3]); +} + +unsigned char lodepng_chunk_ancillary(const unsigned char* chunk) +{ + return((chunk[4] & 32) != 0); +} + +unsigned char lodepng_chunk_private(const unsigned char* chunk) +{ + return((chunk[6] & 32) != 0); +} + +unsigned char lodepng_chunk_safetocopy(const unsigned char* chunk) +{ + return((chunk[7] & 32) != 0); +} + +unsigned char* lodepng_chunk_data(unsigned char* chunk) +{ + return &chunk[8]; +} + +const unsigned char* lodepng_chunk_data_const(const unsigned char* chunk) +{ + return &chunk[8]; +} + +unsigned lodepng_chunk_check_crc(const unsigned char* chunk) +{ + unsigned length = lodepng_chunk_length(chunk); + unsigned CRC = lodepng_read32bitInt(&chunk[length + 8]); + /*the CRC is taken of the data and the 4 chunk type letters, not the length*/ + unsigned checksum = lodepng_crc32(&chunk[4], length + 4); + if(CRC != checksum) return 1; + else return 0; +} + +void lodepng_chunk_generate_crc(unsigned char* chunk) +{ + unsigned length = lodepng_chunk_length(chunk); + unsigned CRC = lodepng_crc32(&chunk[4], length + 4); + lodepng_set32bitInt(chunk + 8 + length, CRC); +} + +unsigned char* lodepng_chunk_next(unsigned char* chunk) +{ + unsigned total_chunk_length = lodepng_chunk_length(chunk) + 12; + return &chunk[total_chunk_length]; +} + +const unsigned char* lodepng_chunk_next_const(const unsigned char* chunk) +{ + unsigned total_chunk_length = lodepng_chunk_length(chunk) + 12; + return &chunk[total_chunk_length]; +} + +unsigned lodepng_chunk_append(unsigned char** out, size_t* outlength, const unsigned char* chunk) +{ + unsigned i; + unsigned total_chunk_length = lodepng_chunk_length(chunk) + 12; + unsigned char *chunk_start, *new_buffer; + size_t new_length = (*outlength) + total_chunk_length; + if(new_length < total_chunk_length || new_length < (*outlength)) return 77; /*integer overflow happened*/ + + new_buffer = (unsigned char*)lodepng_realloc(*out, new_length); + if(!new_buffer) return 83; /*alloc fail*/ + (*out) = new_buffer; + (*outlength) = new_length; + chunk_start = &(*out)[new_length - total_chunk_length]; + + for(i = 0; i != total_chunk_length; ++i) chunk_start[i] = chunk[i]; + + return 0; +} + +unsigned lodepng_chunk_create(unsigned char** out, size_t* outlength, unsigned length, + const char* type, const unsigned char* data) +{ + unsigned i; + unsigned char *chunk, *new_buffer; + size_t new_length = (*outlength) + length + 12; + if(new_length < length + 12 || new_length < (*outlength)) return 77; /*integer overflow happened*/ + new_buffer = (unsigned char*)lodepng_realloc(*out, new_length); + if(!new_buffer) return 83; /*alloc fail*/ + (*out) = new_buffer; + (*outlength) = new_length; + chunk = &(*out)[(*outlength) - length - 12]; + + /*1: length*/ + lodepng_set32bitInt(chunk, (unsigned)length); + + /*2: chunk name (4 letters)*/ + chunk[4] = (unsigned char)type[0]; + chunk[5] = (unsigned char)type[1]; + chunk[6] = (unsigned char)type[2]; + chunk[7] = (unsigned char)type[3]; + + /*3: the data*/ + for(i = 0; i != length; ++i) chunk[8 + i] = data[i]; + + /*4: CRC (of the chunkname characters and the data)*/ + lodepng_chunk_generate_crc(chunk); + + return 0; +} + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / Color types and such / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +/*return type is a LodePNG error code*/ +static unsigned checkColorValidity(LodePNGColorType colortype, unsigned bd) /*bd = bitdepth*/ +{ + switch(colortype) + { + case 0: if(!(bd == 1 || bd == 2 || bd == 4 || bd == 8 || bd == 16)) return 37; break; /*grey*/ + case 2: if(!( bd == 8 || bd == 16)) return 37; break; /*RGB*/ + case 3: if(!(bd == 1 || bd == 2 || bd == 4 || bd == 8 )) return 37; break; /*palette*/ + case 4: if(!( bd == 8 || bd == 16)) return 37; break; /*grey + alpha*/ + case 6: if(!( bd == 8 || bd == 16)) return 37; break; /*RGBA*/ + default: return 31; + } + return 0; /*allowed color type / bits combination*/ +} + +static unsigned getNumColorChannels(LodePNGColorType colortype) +{ + switch(colortype) + { + case 0: return 1; /*grey*/ + case 2: return 3; /*RGB*/ + case 3: return 1; /*palette*/ + case 4: return 2; /*grey + alpha*/ + case 6: return 4; /*RGBA*/ + } + return 0; /*unexisting color type*/ +} + +static unsigned lodepng_get_bpp_lct(LodePNGColorType colortype, unsigned bitdepth) +{ + /*bits per pixel is amount of channels * bits per channel*/ + return getNumColorChannels(colortype) * bitdepth; +} + +/* ////////////////////////////////////////////////////////////////////////// */ + +void lodepng_color_mode_init(LodePNGColorMode* info) +{ + info->key_defined = 0; + info->key_r = info->key_g = info->key_b = 0; + info->colortype = LCT_RGBA; + info->bitdepth = 8; + info->palette = 0; + info->palettesize = 0; +} + +void lodepng_color_mode_cleanup(LodePNGColorMode* info) +{ + lodepng_palette_clear(info); +} + +unsigned lodepng_color_mode_copy(LodePNGColorMode* dest, const LodePNGColorMode* source) +{ + size_t i; + lodepng_color_mode_cleanup(dest); + *dest = *source; + if(source->palette) + { + dest->palette = (unsigned char*)lodepng_malloc(1024); + if(!dest->palette && source->palettesize) return 83; /*alloc fail*/ + for(i = 0; i != source->palettesize * 4; ++i) dest->palette[i] = source->palette[i]; + } + return 0; +} + +static int lodepng_color_mode_equal(const LodePNGColorMode* a, const LodePNGColorMode* b) +{ + size_t i; + if(a->colortype != b->colortype) return 0; + if(a->bitdepth != b->bitdepth) return 0; + if(a->key_defined != b->key_defined) return 0; + if(a->key_defined) + { + if(a->key_r != b->key_r) return 0; + if(a->key_g != b->key_g) return 0; + if(a->key_b != b->key_b) return 0; + } + /*if one of the palette sizes is 0, then we consider it to be the same as the + other: it means that e.g. the palette was not given by the user and should be + considered the same as the palette inside the PNG.*/ + if(1/*a->palettesize != 0 && b->palettesize != 0*/) { + if(a->palettesize != b->palettesize) return 0; + for(i = 0; i != a->palettesize * 4; ++i) + { + if(a->palette[i] != b->palette[i]) return 0; + } + } + return 1; +} + +void lodepng_palette_clear(LodePNGColorMode* info) +{ + if(info->palette) lodepng_free(info->palette); + info->palette = 0; + info->palettesize = 0; +} + +unsigned lodepng_palette_add(LodePNGColorMode* info, + unsigned char r, unsigned char g, unsigned char b, unsigned char a) +{ + unsigned char* data; + /*the same resize technique as C++ std::vectors is used, and here it's made so that for a palette with + the max of 256 colors, it'll have the exact alloc size*/ + if(!info->palette) /*allocate palette if empty*/ + { + /*room for 256 colors with 4 bytes each*/ + data = (unsigned char*)lodepng_realloc(info->palette, 1024); + if(!data) return 83; /*alloc fail*/ + else info->palette = data; + } + info->palette[4 * info->palettesize + 0] = r; + info->palette[4 * info->palettesize + 1] = g; + info->palette[4 * info->palettesize + 2] = b; + info->palette[4 * info->palettesize + 3] = a; + ++info->palettesize; + return 0; +} + +unsigned lodepng_get_bpp(const LodePNGColorMode* info) +{ + /*calculate bits per pixel out of colortype and bitdepth*/ + return lodepng_get_bpp_lct(info->colortype, info->bitdepth); +} + +unsigned lodepng_get_channels(const LodePNGColorMode* info) +{ + return getNumColorChannels(info->colortype); +} + +unsigned lodepng_is_greyscale_type(const LodePNGColorMode* info) +{ + return info->colortype == LCT_GREY || info->colortype == LCT_GREY_ALPHA; +} + +unsigned lodepng_is_alpha_type(const LodePNGColorMode* info) +{ + return (info->colortype & 4) != 0; /*4 or 6*/ +} + +unsigned lodepng_is_palette_type(const LodePNGColorMode* info) +{ + return info->colortype == LCT_PALETTE; +} + +unsigned lodepng_has_palette_alpha(const LodePNGColorMode* info) +{ + size_t i; + for(i = 0; i != info->palettesize; ++i) + { + if(info->palette[i * 4 + 3] < 255) return 1; + } + return 0; +} + +unsigned lodepng_can_have_alpha(const LodePNGColorMode* info) +{ + return info->key_defined + || lodepng_is_alpha_type(info) + || lodepng_has_palette_alpha(info); +} + +size_t lodepng_get_raw_size(unsigned w, unsigned h, const LodePNGColorMode* color) +{ + /*will not overflow for any color type if roughly w * h < 268435455*/ + size_t bpp = lodepng_get_bpp(color); + size_t n = w * h; + return ((n / 8) * bpp) + ((n & 7) * bpp + 7) / 8; +} + +size_t lodepng_get_raw_size_lct(unsigned w, unsigned h, LodePNGColorType colortype, unsigned bitdepth) +{ + /*will not overflow for any color type if roughly w * h < 268435455*/ + size_t bpp = lodepng_get_bpp_lct(colortype, bitdepth); + size_t n = w * h; + return ((n / 8) * bpp) + ((n & 7) * bpp + 7) / 8; +} + + +#ifdef LODEPNG_COMPILE_PNG +#ifdef LODEPNG_COMPILE_DECODER +/*in an idat chunk, each scanline is a multiple of 8 bits, unlike the lodepng output buffer*/ +static size_t lodepng_get_raw_size_idat(unsigned w, unsigned h, const LodePNGColorMode* color) +{ + /*will not overflow for any color type if roughly w * h < 268435455*/ + size_t bpp = lodepng_get_bpp(color); + size_t line = ((w / 8) * bpp) + ((w & 7) * bpp + 7) / 8; + return h * line; +} +#endif /*LODEPNG_COMPILE_DECODER*/ +#endif /*LODEPNG_COMPILE_PNG*/ + +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + +static void LodePNGUnknownChunks_init(LodePNGInfo* info) +{ + unsigned i; + for(i = 0; i != 3; ++i) info->unknown_chunks_data[i] = 0; + for(i = 0; i != 3; ++i) info->unknown_chunks_size[i] = 0; +} + +static void LodePNGUnknownChunks_cleanup(LodePNGInfo* info) +{ + unsigned i; + for(i = 0; i != 3; ++i) lodepng_free(info->unknown_chunks_data[i]); +} + +static unsigned LodePNGUnknownChunks_copy(LodePNGInfo* dest, const LodePNGInfo* src) +{ + unsigned i; + + LodePNGUnknownChunks_cleanup(dest); + + for(i = 0; i != 3; ++i) + { + size_t j; + dest->unknown_chunks_size[i] = src->unknown_chunks_size[i]; + dest->unknown_chunks_data[i] = (unsigned char*)lodepng_malloc(src->unknown_chunks_size[i]); + if(!dest->unknown_chunks_data[i] && dest->unknown_chunks_size[i]) return 83; /*alloc fail*/ + for(j = 0; j < src->unknown_chunks_size[i]; ++j) + { + dest->unknown_chunks_data[i][j] = src->unknown_chunks_data[i][j]; + } + } + + return 0; +} + +/******************************************************************************/ + +static void LodePNGText_init(LodePNGInfo* info) +{ + info->text_num = 0; + info->text_keys = NULL; + info->text_strings = NULL; +} + +static void LodePNGText_cleanup(LodePNGInfo* info) +{ + size_t i; + for(i = 0; i != info->text_num; ++i) + { + string_cleanup(&info->text_keys[i]); + string_cleanup(&info->text_strings[i]); + } + lodepng_free(info->text_keys); + lodepng_free(info->text_strings); +} + +static unsigned LodePNGText_copy(LodePNGInfo* dest, const LodePNGInfo* source) +{ + size_t i = 0; + dest->text_keys = 0; + dest->text_strings = 0; + dest->text_num = 0; + for(i = 0; i != source->text_num; ++i) + { + CERROR_TRY_RETURN(lodepng_add_text(dest, source->text_keys[i], source->text_strings[i])); + } + return 0; +} + +void lodepng_clear_text(LodePNGInfo* info) +{ + LodePNGText_cleanup(info); +} + +unsigned lodepng_add_text(LodePNGInfo* info, const char* key, const char* str) +{ + char** new_keys = (char**)(lodepng_realloc(info->text_keys, sizeof(char*) * (info->text_num + 1))); + char** new_strings = (char**)(lodepng_realloc(info->text_strings, sizeof(char*) * (info->text_num + 1))); + if(!new_keys || !new_strings) + { + lodepng_free(new_keys); + lodepng_free(new_strings); + return 83; /*alloc fail*/ + } + + ++info->text_num; + info->text_keys = new_keys; + info->text_strings = new_strings; + + string_init(&info->text_keys[info->text_num - 1]); + string_set(&info->text_keys[info->text_num - 1], key); + + string_init(&info->text_strings[info->text_num - 1]); + string_set(&info->text_strings[info->text_num - 1], str); + + return 0; +} + +/******************************************************************************/ + +static void LodePNGIText_init(LodePNGInfo* info) +{ + info->itext_num = 0; + info->itext_keys = NULL; + info->itext_langtags = NULL; + info->itext_transkeys = NULL; + info->itext_strings = NULL; +} + +static void LodePNGIText_cleanup(LodePNGInfo* info) +{ + size_t i; + for(i = 0; i != info->itext_num; ++i) + { + string_cleanup(&info->itext_keys[i]); + string_cleanup(&info->itext_langtags[i]); + string_cleanup(&info->itext_transkeys[i]); + string_cleanup(&info->itext_strings[i]); + } + lodepng_free(info->itext_keys); + lodepng_free(info->itext_langtags); + lodepng_free(info->itext_transkeys); + lodepng_free(info->itext_strings); +} + +static unsigned LodePNGIText_copy(LodePNGInfo* dest, const LodePNGInfo* source) +{ + size_t i = 0; + dest->itext_keys = 0; + dest->itext_langtags = 0; + dest->itext_transkeys = 0; + dest->itext_strings = 0; + dest->itext_num = 0; + for(i = 0; i != source->itext_num; ++i) + { + CERROR_TRY_RETURN(lodepng_add_itext(dest, source->itext_keys[i], source->itext_langtags[i], + source->itext_transkeys[i], source->itext_strings[i])); + } + return 0; +} + +void lodepng_clear_itext(LodePNGInfo* info) +{ + LodePNGIText_cleanup(info); +} + +unsigned lodepng_add_itext(LodePNGInfo* info, const char* key, const char* langtag, + const char* transkey, const char* str) +{ + char** new_keys = (char**)(lodepng_realloc(info->itext_keys, sizeof(char*) * (info->itext_num + 1))); + char** new_langtags = (char**)(lodepng_realloc(info->itext_langtags, sizeof(char*) * (info->itext_num + 1))); + char** new_transkeys = (char**)(lodepng_realloc(info->itext_transkeys, sizeof(char*) * (info->itext_num + 1))); + char** new_strings = (char**)(lodepng_realloc(info->itext_strings, sizeof(char*) * (info->itext_num + 1))); + if(!new_keys || !new_langtags || !new_transkeys || !new_strings) + { + lodepng_free(new_keys); + lodepng_free(new_langtags); + lodepng_free(new_transkeys); + lodepng_free(new_strings); + return 83; /*alloc fail*/ + } + + ++info->itext_num; + info->itext_keys = new_keys; + info->itext_langtags = new_langtags; + info->itext_transkeys = new_transkeys; + info->itext_strings = new_strings; + + string_init(&info->itext_keys[info->itext_num - 1]); + string_set(&info->itext_keys[info->itext_num - 1], key); + + string_init(&info->itext_langtags[info->itext_num - 1]); + string_set(&info->itext_langtags[info->itext_num - 1], langtag); + + string_init(&info->itext_transkeys[info->itext_num - 1]); + string_set(&info->itext_transkeys[info->itext_num - 1], transkey); + + string_init(&info->itext_strings[info->itext_num - 1]); + string_set(&info->itext_strings[info->itext_num - 1], str); + + return 0; +} +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + +void lodepng_info_init(LodePNGInfo* info) +{ + lodepng_color_mode_init(&info->color); + info->interlace_method = 0; + info->compression_method = 0; + info->filter_method = 0; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + info->background_defined = 0; + info->background_r = info->background_g = info->background_b = 0; + + LodePNGText_init(info); + LodePNGIText_init(info); + + info->time_defined = 0; + info->phys_defined = 0; + + LodePNGUnknownChunks_init(info); +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ +} + +void lodepng_info_cleanup(LodePNGInfo* info) +{ + lodepng_color_mode_cleanup(&info->color); +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + LodePNGText_cleanup(info); + LodePNGIText_cleanup(info); + + LodePNGUnknownChunks_cleanup(info); +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ +} + +unsigned lodepng_info_copy(LodePNGInfo* dest, const LodePNGInfo* source) +{ + lodepng_info_cleanup(dest); + *dest = *source; + lodepng_color_mode_init(&dest->color); + CERROR_TRY_RETURN(lodepng_color_mode_copy(&dest->color, &source->color)); + +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + CERROR_TRY_RETURN(LodePNGText_copy(dest, source)); + CERROR_TRY_RETURN(LodePNGIText_copy(dest, source)); + + LodePNGUnknownChunks_init(dest); + CERROR_TRY_RETURN(LodePNGUnknownChunks_copy(dest, source)); +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + return 0; +} + +void lodepng_info_swap(LodePNGInfo* a, LodePNGInfo* b) +{ + LodePNGInfo temp = *a; + *a = *b; + *b = temp; +} + +/* ////////////////////////////////////////////////////////////////////////// */ + +/*index: bitgroup index, bits: bitgroup size(1, 2 or 4), in: bitgroup value, out: octet array to add bits to*/ +static void addColorBits(unsigned char* out, size_t index, unsigned bits, unsigned in) +{ + unsigned m = bits == 1 ? 7 : bits == 2 ? 3 : 1; /*8 / bits - 1*/ + /*p = the partial index in the byte, e.g. with 4 palettebits it is 0 for first half or 1 for second half*/ + unsigned p = index & m; + in &= (1u << bits) - 1u; /*filter out any other bits of the input value*/ + in = in << (bits * (m - p)); + if(p == 0) out[index * bits / 8] = in; + else out[index * bits / 8] |= in; +} + +typedef struct ColorTree ColorTree; + +/* +One node of a color tree +This is the data structure used to count the number of unique colors and to get a palette +index for a color. It's like an octree, but because the alpha channel is used too, each +node has 16 instead of 8 children. +*/ +struct ColorTree +{ + ColorTree* children[16]; /*up to 16 pointers to ColorTree of next level*/ + int index; /*the payload. Only has a meaningful value if this is in the last level*/ +}; + +static void color_tree_init(ColorTree* tree) +{ + int i; + for(i = 0; i != 16; ++i) tree->children[i] = 0; + tree->index = -1; +} + +static void color_tree_cleanup(ColorTree* tree) +{ + int i; + for(i = 0; i != 16; ++i) + { + if(tree->children[i]) + { + color_tree_cleanup(tree->children[i]); + lodepng_free(tree->children[i]); + } + } +} + +/*returns -1 if color not present, its index otherwise*/ +static int color_tree_get(ColorTree* tree, unsigned char r, unsigned char g, unsigned char b, unsigned char a) +{ + int bit = 0; + for(bit = 0; bit < 8; ++bit) + { + int i = 8 * ((r >> bit) & 1) + 4 * ((g >> bit) & 1) + 2 * ((b >> bit) & 1) + 1 * ((a >> bit) & 1); + if(!tree->children[i]) return -1; + else tree = tree->children[i]; + } + return tree ? tree->index : -1; +} + +#ifdef LODEPNG_COMPILE_ENCODER +static int color_tree_has(ColorTree* tree, unsigned char r, unsigned char g, unsigned char b, unsigned char a) +{ + return color_tree_get(tree, r, g, b, a) >= 0; +} +#endif /*LODEPNG_COMPILE_ENCODER*/ + +/*color is not allowed to already exist. +Index should be >= 0 (it's signed to be compatible with using -1 for "doesn't exist")*/ +static void color_tree_add(ColorTree* tree, + unsigned char r, unsigned char g, unsigned char b, unsigned char a, unsigned index) +{ + int bit; + for(bit = 0; bit < 8; ++bit) + { + int i = 8 * ((r >> bit) & 1) + 4 * ((g >> bit) & 1) + 2 * ((b >> bit) & 1) + 1 * ((a >> bit) & 1); + if(!tree->children[i]) + { + tree->children[i] = (ColorTree*)lodepng_malloc(sizeof(ColorTree)); + color_tree_init(tree->children[i]); + } + tree = tree->children[i]; + } + tree->index = (int)index; +} + +/*put a pixel, given its RGBA color, into image of any color type*/ +static unsigned rgba8ToPixel(unsigned char* out, size_t i, + const LodePNGColorMode* mode, ColorTree* tree /*for palette*/, + unsigned char r, unsigned char g, unsigned char b, unsigned char a) +{ + if(mode->colortype == LCT_GREY) + { + unsigned char grey = r; /*((unsigned short)r + g + b) / 3*/; + if(mode->bitdepth == 8) out[i] = grey; + else if(mode->bitdepth == 16) out[i * 2 + 0] = out[i * 2 + 1] = grey; + else + { + /*take the most significant bits of grey*/ + grey = (grey >> (8 - mode->bitdepth)) & ((1 << mode->bitdepth) - 1); + addColorBits(out, i, mode->bitdepth, grey); + } + } + else if(mode->colortype == LCT_RGB) + { + if(mode->bitdepth == 8) + { + out[i * 3 + 0] = r; + out[i * 3 + 1] = g; + out[i * 3 + 2] = b; + } + else + { + out[i * 6 + 0] = out[i * 6 + 1] = r; + out[i * 6 + 2] = out[i * 6 + 3] = g; + out[i * 6 + 4] = out[i * 6 + 5] = b; + } + } + else if(mode->colortype == LCT_PALETTE) + { + int index = color_tree_get(tree, r, g, b, a); + if(index < 0) return 82; /*color not in palette*/ + if(mode->bitdepth == 8) out[i] = index; + else addColorBits(out, i, mode->bitdepth, (unsigned)index); + } + else if(mode->colortype == LCT_GREY_ALPHA) + { + unsigned char grey = r; /*((unsigned short)r + g + b) / 3*/; + if(mode->bitdepth == 8) + { + out[i * 2 + 0] = grey; + out[i * 2 + 1] = a; + } + else if(mode->bitdepth == 16) + { + out[i * 4 + 0] = out[i * 4 + 1] = grey; + out[i * 4 + 2] = out[i * 4 + 3] = a; + } + } + else if(mode->colortype == LCT_RGBA) + { + if(mode->bitdepth == 8) + { + out[i * 4 + 0] = r; + out[i * 4 + 1] = g; + out[i * 4 + 2] = b; + out[i * 4 + 3] = a; + } + else + { + out[i * 8 + 0] = out[i * 8 + 1] = r; + out[i * 8 + 2] = out[i * 8 + 3] = g; + out[i * 8 + 4] = out[i * 8 + 5] = b; + out[i * 8 + 6] = out[i * 8 + 7] = a; + } + } + + return 0; /*no error*/ +} + +/*put a pixel, given its RGBA16 color, into image of any color 16-bitdepth type*/ +static void rgba16ToPixel(unsigned char* out, size_t i, + const LodePNGColorMode* mode, + unsigned short r, unsigned short g, unsigned short b, unsigned short a) +{ + if(mode->colortype == LCT_GREY) + { + unsigned short grey = r; /*((unsigned)r + g + b) / 3*/; + out[i * 2 + 0] = (grey >> 8) & 255; + out[i * 2 + 1] = grey & 255; + } + else if(mode->colortype == LCT_RGB) + { + out[i * 6 + 0] = (r >> 8) & 255; + out[i * 6 + 1] = r & 255; + out[i * 6 + 2] = (g >> 8) & 255; + out[i * 6 + 3] = g & 255; + out[i * 6 + 4] = (b >> 8) & 255; + out[i * 6 + 5] = b & 255; + } + else if(mode->colortype == LCT_GREY_ALPHA) + { + unsigned short grey = r; /*((unsigned)r + g + b) / 3*/; + out[i * 4 + 0] = (grey >> 8) & 255; + out[i * 4 + 1] = grey & 255; + out[i * 4 + 2] = (a >> 8) & 255; + out[i * 4 + 3] = a & 255; + } + else if(mode->colortype == LCT_RGBA) + { + out[i * 8 + 0] = (r >> 8) & 255; + out[i * 8 + 1] = r & 255; + out[i * 8 + 2] = (g >> 8) & 255; + out[i * 8 + 3] = g & 255; + out[i * 8 + 4] = (b >> 8) & 255; + out[i * 8 + 5] = b & 255; + out[i * 8 + 6] = (a >> 8) & 255; + out[i * 8 + 7] = a & 255; + } +} + +/*Get RGBA8 color of pixel with index i (y * width + x) from the raw image with given color type.*/ +static void getPixelColorRGBA8(unsigned char* r, unsigned char* g, + unsigned char* b, unsigned char* a, + const unsigned char* in, size_t i, + const LodePNGColorMode* mode) +{ + if(mode->colortype == LCT_GREY) + { + if(mode->bitdepth == 8) + { + *r = *g = *b = in[i]; + if(mode->key_defined && *r == mode->key_r) *a = 0; + else *a = 255; + } + else if(mode->bitdepth == 16) + { + *r = *g = *b = in[i * 2 + 0]; + if(mode->key_defined && 256U * in[i * 2 + 0] + in[i * 2 + 1] == mode->key_r) *a = 0; + else *a = 255; + } + else + { + unsigned highest = ((1U << mode->bitdepth) - 1U); /*highest possible value for this bit depth*/ + size_t j = i * mode->bitdepth; + unsigned value = readBitsFromReversedStream(&j, in, mode->bitdepth); + *r = *g = *b = (value * 255) / highest; + if(mode->key_defined && value == mode->key_r) *a = 0; + else *a = 255; + } + } + else if(mode->colortype == LCT_RGB) + { + if(mode->bitdepth == 8) + { + *r = in[i * 3 + 0]; *g = in[i * 3 + 1]; *b = in[i * 3 + 2]; + if(mode->key_defined && *r == mode->key_r && *g == mode->key_g && *b == mode->key_b) *a = 0; + else *a = 255; + } + else + { + *r = in[i * 6 + 0]; + *g = in[i * 6 + 2]; + *b = in[i * 6 + 4]; + if(mode->key_defined && 256U * in[i * 6 + 0] + in[i * 6 + 1] == mode->key_r + && 256U * in[i * 6 + 2] + in[i * 6 + 3] == mode->key_g + && 256U * in[i * 6 + 4] + in[i * 6 + 5] == mode->key_b) *a = 0; + else *a = 255; + } + } + else if(mode->colortype == LCT_PALETTE) + { + unsigned index; + if(mode->bitdepth == 8) index = in[i]; + else + { + size_t j = i * mode->bitdepth; + index = readBitsFromReversedStream(&j, in, mode->bitdepth); + } + + if(index >= mode->palettesize) + { + /*This is an error according to the PNG spec, but common PNG decoders make it black instead. + Done here too, slightly faster due to no error handling needed.*/ + *r = *g = *b = 0; + *a = 255; + } + else + { + *r = mode->palette[index * 4 + 0]; + *g = mode->palette[index * 4 + 1]; + *b = mode->palette[index * 4 + 2]; + *a = mode->palette[index * 4 + 3]; + } + } + else if(mode->colortype == LCT_GREY_ALPHA) + { + if(mode->bitdepth == 8) + { + *r = *g = *b = in[i * 2 + 0]; + *a = in[i * 2 + 1]; + } + else + { + *r = *g = *b = in[i * 4 + 0]; + *a = in[i * 4 + 2]; + } + } + else if(mode->colortype == LCT_RGBA) + { + if(mode->bitdepth == 8) + { + *r = in[i * 4 + 0]; + *g = in[i * 4 + 1]; + *b = in[i * 4 + 2]; + *a = in[i * 4 + 3]; + } + else + { + *r = in[i * 8 + 0]; + *g = in[i * 8 + 2]; + *b = in[i * 8 + 4]; + *a = in[i * 8 + 6]; + } + } +} + +/*Similar to getPixelColorRGBA8, but with all the for loops inside of the color +mode test cases, optimized to convert the colors much faster, when converting +to RGBA or RGB with 8 bit per cannel. buffer must be RGBA or RGB output with +enough memory, if has_alpha is true the output is RGBA. mode has the color mode +of the input buffer.*/ +static void getPixelColorsRGBA8(unsigned char* buffer, size_t numpixels, + unsigned has_alpha, const unsigned char* in, + const LodePNGColorMode* mode) +{ + unsigned num_channels = has_alpha ? 4 : 3; + size_t i; + if(mode->colortype == LCT_GREY) + { + if(mode->bitdepth == 8) + { + for(i = 0; i != numpixels; ++i, buffer += num_channels) + { + buffer[0] = buffer[1] = buffer[2] = in[i]; + if(has_alpha) buffer[3] = mode->key_defined && in[i] == mode->key_r ? 0 : 255; + } + } + else if(mode->bitdepth == 16) + { + for(i = 0; i != numpixels; ++i, buffer += num_channels) + { + buffer[0] = buffer[1] = buffer[2] = in[i * 2]; + if(has_alpha) buffer[3] = mode->key_defined && 256U * in[i * 2 + 0] + in[i * 2 + 1] == mode->key_r ? 0 : 255; + } + } + else + { + unsigned highest = ((1U << mode->bitdepth) - 1U); /*highest possible value for this bit depth*/ + size_t j = 0; + for(i = 0; i != numpixels; ++i, buffer += num_channels) + { + unsigned value = readBitsFromReversedStream(&j, in, mode->bitdepth); + buffer[0] = buffer[1] = buffer[2] = (value * 255) / highest; + if(has_alpha) buffer[3] = mode->key_defined && value == mode->key_r ? 0 : 255; + } + } + } + else if(mode->colortype == LCT_RGB) + { + if(mode->bitdepth == 8) + { + for(i = 0; i != numpixels; ++i, buffer += num_channels) + { + buffer[0] = in[i * 3 + 0]; + buffer[1] = in[i * 3 + 1]; + buffer[2] = in[i * 3 + 2]; + if(has_alpha) buffer[3] = mode->key_defined && buffer[0] == mode->key_r + && buffer[1]== mode->key_g && buffer[2] == mode->key_b ? 0 : 255; + } + } + else + { + for(i = 0; i != numpixels; ++i, buffer += num_channels) + { + buffer[0] = in[i * 6 + 0]; + buffer[1] = in[i * 6 + 2]; + buffer[2] = in[i * 6 + 4]; + if(has_alpha) buffer[3] = mode->key_defined + && 256U * in[i * 6 + 0] + in[i * 6 + 1] == mode->key_r + && 256U * in[i * 6 + 2] + in[i * 6 + 3] == mode->key_g + && 256U * in[i * 6 + 4] + in[i * 6 + 5] == mode->key_b ? 0 : 255; + } + } + } + else if(mode->colortype == LCT_PALETTE) + { + unsigned index; + size_t j = 0; + for(i = 0; i != numpixels; ++i, buffer += num_channels) + { + if(mode->bitdepth == 8) index = in[i]; + else index = readBitsFromReversedStream(&j, in, mode->bitdepth); + + if(index >= mode->palettesize) + { + /*This is an error according to the PNG spec, but most PNG decoders make it black instead. + Done here too, slightly faster due to no error handling needed.*/ + buffer[0] = buffer[1] = buffer[2] = 0; + if(has_alpha) buffer[3] = 255; + } + else + { + buffer[0] = mode->palette[index * 4 + 0]; + buffer[1] = mode->palette[index * 4 + 1]; + buffer[2] = mode->palette[index * 4 + 2]; + if(has_alpha) buffer[3] = mode->palette[index * 4 + 3]; + } + } + } + else if(mode->colortype == LCT_GREY_ALPHA) + { + if(mode->bitdepth == 8) + { + for(i = 0; i != numpixels; ++i, buffer += num_channels) + { + buffer[0] = buffer[1] = buffer[2] = in[i * 2 + 0]; + if(has_alpha) buffer[3] = in[i * 2 + 1]; + } + } + else + { + for(i = 0; i != numpixels; ++i, buffer += num_channels) + { + buffer[0] = buffer[1] = buffer[2] = in[i * 4 + 0]; + if(has_alpha) buffer[3] = in[i * 4 + 2]; + } + } + } + else if(mode->colortype == LCT_RGBA) + { + if(mode->bitdepth == 8) + { + for(i = 0; i != numpixels; ++i, buffer += num_channels) + { + buffer[0] = in[i * 4 + 0]; + buffer[1] = in[i * 4 + 1]; + buffer[2] = in[i * 4 + 2]; + if(has_alpha) buffer[3] = in[i * 4 + 3]; + } + } + else + { + for(i = 0; i != numpixels; ++i, buffer += num_channels) + { + buffer[0] = in[i * 8 + 0]; + buffer[1] = in[i * 8 + 2]; + buffer[2] = in[i * 8 + 4]; + if(has_alpha) buffer[3] = in[i * 8 + 6]; + } + } + } +} + +/*Get RGBA16 color of pixel with index i (y * width + x) from the raw image with +given color type, but the given color type must be 16-bit itself.*/ +static void getPixelColorRGBA16(unsigned short* r, unsigned short* g, unsigned short* b, unsigned short* a, + const unsigned char* in, size_t i, const LodePNGColorMode* mode) +{ + if(mode->colortype == LCT_GREY) + { + *r = *g = *b = 256 * in[i * 2 + 0] + in[i * 2 + 1]; + if(mode->key_defined && 256U * in[i * 2 + 0] + in[i * 2 + 1] == mode->key_r) *a = 0; + else *a = 65535; + } + else if(mode->colortype == LCT_RGB) + { + *r = 256u * in[i * 6 + 0] + in[i * 6 + 1]; + *g = 256u * in[i * 6 + 2] + in[i * 6 + 3]; + *b = 256u * in[i * 6 + 4] + in[i * 6 + 5]; + if(mode->key_defined + && 256u * in[i * 6 + 0] + in[i * 6 + 1] == mode->key_r + && 256u * in[i * 6 + 2] + in[i * 6 + 3] == mode->key_g + && 256u * in[i * 6 + 4] + in[i * 6 + 5] == mode->key_b) *a = 0; + else *a = 65535; + } + else if(mode->colortype == LCT_GREY_ALPHA) + { + *r = *g = *b = 256u * in[i * 4 + 0] + in[i * 4 + 1]; + *a = 256u * in[i * 4 + 2] + in[i * 4 + 3]; + } + else if(mode->colortype == LCT_RGBA) + { + *r = 256u * in[i * 8 + 0] + in[i * 8 + 1]; + *g = 256u * in[i * 8 + 2] + in[i * 8 + 3]; + *b = 256u * in[i * 8 + 4] + in[i * 8 + 5]; + *a = 256u * in[i * 8 + 6] + in[i * 8 + 7]; + } +} + +unsigned lodepng_convert(unsigned char* out, const unsigned char* in, + const LodePNGColorMode* mode_out, const LodePNGColorMode* mode_in, + unsigned w, unsigned h) +{ + unsigned int i; + ColorTree tree; + size_t numpixels = w * h; + + if(lodepng_color_mode_equal(mode_out, mode_in)) + { + size_t numbytes = lodepng_get_raw_size(w, h, mode_in); + for(i = 0; i != numbytes; ++i) out[i] = in[i]; + return 0; + } + + if(mode_out->colortype == LCT_PALETTE) + { + size_t palettesize = mode_out->palettesize; + const unsigned char* palette = mode_out->palette; + size_t palsize = (size_t)1 << mode_out->bitdepth; + /*if the user specified output palette but did not give the values, assume + they want the values of the input color type (assuming that one is palette). + Note that we never create a new palette ourselves.*/ + if(palettesize == 0) + { + palettesize = mode_in->palettesize; + palette = mode_in->palette; + } + if(palettesize < palsize) palsize = palettesize; + color_tree_init(&tree); + for(i = 0; i != palsize; ++i) + { + const unsigned char* p = &palette[i * 4]; + color_tree_add(&tree, p[0], p[1], p[2], p[3], i); + } + } + + if(mode_in->bitdepth == 16 && mode_out->bitdepth == 16) + { + for(i = 0; i != numpixels; ++i) + { + unsigned short r = 0, g = 0, b = 0, a = 0; + getPixelColorRGBA16(&r, &g, &b, &a, in, i, mode_in); + rgba16ToPixel(out, i, mode_out, r, g, b, a); + } + } + else if(mode_out->bitdepth == 8 && mode_out->colortype == LCT_RGBA) + { + getPixelColorsRGBA8(out, numpixels, 1, in, mode_in); + } + else if(mode_out->bitdepth == 8 && mode_out->colortype == LCT_RGB) + { + getPixelColorsRGBA8(out, numpixels, 0, in, mode_in); + } + else + { + unsigned char r = 0, g = 0, b = 0, a = 0; + for(i = 0; i != numpixels; ++i) + { + getPixelColorRGBA8(&r, &g, &b, &a, in, i, mode_in); + CERROR_TRY_RETURN(rgba8ToPixel(out, i, mode_out, &tree, r, g, b, a)); + } + } + + if(mode_out->colortype == LCT_PALETTE) + { + color_tree_cleanup(&tree); + } + + return 0; /*no error*/ +} + +#ifdef LODEPNG_COMPILE_ENCODER + +void lodepng_color_profile_init(LodePNGColorProfile* profile) +{ + profile->colored = 0; + profile->key = 0; + profile->alpha = 0; + profile->key_r = profile->key_g = profile->key_b = 0; + profile->numcolors = 0; + profile->bits = 1; +} + +/*function used for debug purposes with C++*/ +/*void printColorProfile(LodePNGColorProfile* p) +{ + std::cout << "colored: " << (int)p->colored << ", "; + std::cout << "key: " << (int)p->key << ", "; + std::cout << "key_r: " << (int)p->key_r << ", "; + std::cout << "key_g: " << (int)p->key_g << ", "; + std::cout << "key_b: " << (int)p->key_b << ", "; + std::cout << "alpha: " << (int)p->alpha << ", "; + std::cout << "numcolors: " << (int)p->numcolors << ", "; + std::cout << "bits: " << (int)p->bits << std::endl; +}*/ + +/*Returns how many bits needed to represent given value (max 8 bit)*/ +static unsigned getValueRequiredBits(unsigned char value) +{ + if(value == 0 || value == 255) return 1; + /*The scaling of 2-bit and 4-bit values uses multiples of 85 and 17*/ + if(value % 17 == 0) return value % 85 == 0 ? 2 : 4; + return 8; +} + +/*profile must already have been inited with mode. +It's ok to set some parameters of profile to done already.*/ +unsigned lodepng_get_color_profile(LodePNGColorProfile* profile, + const unsigned char* in, unsigned w, unsigned h, + const LodePNGColorMode* mode) +{ + unsigned error = 0; + size_t i; + ColorTree tree; + size_t numpixels = w * h; + + unsigned colored_done = lodepng_is_greyscale_type(mode) ? 1 : 0; + unsigned alpha_done = lodepng_can_have_alpha(mode) ? 0 : 1; + unsigned numcolors_done = 0; + unsigned bpp = lodepng_get_bpp(mode); + unsigned bits_done = bpp == 1 ? 1 : 0; + unsigned maxnumcolors = 257; + unsigned sixteen = 0; + if(bpp <= 8) maxnumcolors = bpp == 1 ? 2 : (bpp == 2 ? 4 : (bpp == 4 ? 16 : 256)); + + color_tree_init(&tree); + + /*Check if the 16-bit input is truly 16-bit*/ + if(mode->bitdepth == 16) + { + unsigned short r, g, b, a; + for(i = 0; i != numpixels; ++i) + { + getPixelColorRGBA16(&r, &g, &b, &a, in, i, mode); + if((r & 255) != ((r >> 8) & 255) || (g & 255) != ((g >> 8) & 255) || + (b & 255) != ((b >> 8) & 255) || (a & 255) != ((a >> 8) & 255)) /*first and second byte differ*/ + { + sixteen = 1; + break; + } + } + } + + if(sixteen) + { + unsigned short r = 0, g = 0, b = 0, a = 0; + profile->bits = 16; + bits_done = numcolors_done = 1; /*counting colors no longer useful, palette doesn't support 16-bit*/ + + for(i = 0; i != numpixels; ++i) + { + getPixelColorRGBA16(&r, &g, &b, &a, in, i, mode); + + if(!colored_done && (r != g || r != b)) + { + profile->colored = 1; + colored_done = 1; + } + + if(!alpha_done) + { + unsigned matchkey = (r == profile->key_r && g == profile->key_g && b == profile->key_b); + if(a != 65535 && (a != 0 || (profile->key && !matchkey))) + { + profile->alpha = 1; + alpha_done = 1; + if(profile->bits < 8) profile->bits = 8; /*PNG has no alphachannel modes with less than 8-bit per channel*/ + } + else if(a == 0 && !profile->alpha && !profile->key) + { + profile->key = 1; + profile->key_r = r; + profile->key_g = g; + profile->key_b = b; + } + else if(a == 65535 && profile->key && matchkey) + { + /* Color key cannot be used if an opaque pixel also has that RGB color. */ + profile->alpha = 1; + alpha_done = 1; + } + } + if(alpha_done && numcolors_done && colored_done && bits_done) break; + } + + if(profile->key && !profile->alpha) + { + for(i = 0; i != numpixels; ++i) + { + getPixelColorRGBA16(&r, &g, &b, &a, in, i, mode); + if(a != 0 && r == profile->key_r && g == profile->key_g && b == profile->key_b) + { + /* Color key cannot be used if an opaque pixel also has that RGB color. */ + profile->alpha = 1; + alpha_done = 1; + } + } + } + } + else /* < 16-bit */ + { + unsigned char r = 0, g = 0, b = 0, a = 0; + for(i = 0; i != numpixels; ++i) + { + getPixelColorRGBA8(&r, &g, &b, &a, in, i, mode); + + if(!bits_done && profile->bits < 8) + { + /*only r is checked, < 8 bits is only relevant for greyscale*/ + unsigned bits = getValueRequiredBits(r); + if(bits > profile->bits) profile->bits = bits; + } + bits_done = (profile->bits >= bpp); + + if(!colored_done && (r != g || r != b)) + { + profile->colored = 1; + colored_done = 1; + if(profile->bits < 8) profile->bits = 8; /*PNG has no colored modes with less than 8-bit per channel*/ + } + + if(!alpha_done) + { + unsigned matchkey = (r == profile->key_r && g == profile->key_g && b == profile->key_b); + if(a != 255 && (a != 0 || (profile->key && !matchkey))) + { + profile->alpha = 1; + alpha_done = 1; + if(profile->bits < 8) profile->bits = 8; /*PNG has no alphachannel modes with less than 8-bit per channel*/ + } + else if(a == 0 && !profile->alpha && !profile->key) + { + profile->key = 1; + profile->key_r = r; + profile->key_g = g; + profile->key_b = b; + } + else if(a == 255 && profile->key && matchkey) + { + /* Color key cannot be used if an opaque pixel also has that RGB color. */ + profile->alpha = 1; + alpha_done = 1; + if(profile->bits < 8) profile->bits = 8; /*PNG has no alphachannel modes with less than 8-bit per channel*/ + } + } + + if(!numcolors_done) + { + if(!color_tree_has(&tree, r, g, b, a)) + { + color_tree_add(&tree, r, g, b, a, profile->numcolors); + if(profile->numcolors < 256) + { + unsigned char* p = profile->palette; + unsigned n = profile->numcolors; + p[n * 4 + 0] = r; + p[n * 4 + 1] = g; + p[n * 4 + 2] = b; + p[n * 4 + 3] = a; + } + ++profile->numcolors; + numcolors_done = profile->numcolors >= maxnumcolors; + } + } + + if(alpha_done && numcolors_done && colored_done && bits_done) break; + } + + if(profile->key && !profile->alpha) + { + for(i = 0; i != numpixels; ++i) + { + getPixelColorRGBA8(&r, &g, &b, &a, in, i, mode); + if(a != 0 && r == profile->key_r && g == profile->key_g && b == profile->key_b) + { + /* Color key cannot be used if an opaque pixel also has that RGB color. */ + profile->alpha = 1; + alpha_done = 1; + } + } + } + + /*make the profile's key always 16-bit for consistency - repeat each byte twice*/ + profile->key_r += (profile->key_r << 8); + profile->key_g += (profile->key_g << 8); + profile->key_b += (profile->key_b << 8); + } + + color_tree_cleanup(&tree); + return error; +} + +/*Automatically chooses color type that gives smallest amount of bits in the +output image, e.g. grey if there are only greyscale pixels, palette if there +are less than 256 colors, ... +Updates values of mode with a potentially smaller color model. mode_out should +contain the user chosen color model, but will be overwritten with the new chosen one.*/ +unsigned lodepng_auto_choose_color(LodePNGColorMode* mode_out, + const unsigned char* image, unsigned w, unsigned h, + const LodePNGColorMode* mode_in) +{ + LodePNGColorProfile prof; + unsigned error = 0; + unsigned i, n, palettebits, grey_ok, palette_ok; + + lodepng_color_profile_init(&prof); + error = lodepng_get_color_profile(&prof, image, w, h, mode_in); + if(error) return error; + mode_out->key_defined = 0; + + if(prof.key && w * h <= 16) + { + prof.alpha = 1; /*too few pixels to justify tRNS chunk overhead*/ + if(prof.bits < 8) prof.bits = 8; /*PNG has no alphachannel modes with less than 8-bit per channel*/ + } + grey_ok = !prof.colored && !prof.alpha; /*grey without alpha, with potentially low bits*/ + n = prof.numcolors; + palettebits = n <= 2 ? 1 : (n <= 4 ? 2 : (n <= 16 ? 4 : 8)); + palette_ok = n <= 256 && (n * 2 < w * h) && prof.bits <= 8; + if(w * h < n * 2) palette_ok = 0; /*don't add palette overhead if image has only a few pixels*/ + if(grey_ok && prof.bits <= palettebits) palette_ok = 0; /*grey is less overhead*/ + + if(palette_ok) + { + unsigned char* p = prof.palette; + lodepng_palette_clear(mode_out); /*remove potential earlier palette*/ + for(i = 0; i != prof.numcolors; ++i) + { + error = lodepng_palette_add(mode_out, p[i * 4 + 0], p[i * 4 + 1], p[i * 4 + 2], p[i * 4 + 3]); + if(error) break; + } + + mode_out->colortype = LCT_PALETTE; + mode_out->bitdepth = palettebits; + + if(mode_in->colortype == LCT_PALETTE && mode_in->palettesize >= mode_out->palettesize + && mode_in->bitdepth == mode_out->bitdepth) + { + /*If input should have same palette colors, keep original to preserve its order and prevent conversion*/ + lodepng_color_mode_cleanup(mode_out); + lodepng_color_mode_copy(mode_out, mode_in); + } + } + else /*8-bit or 16-bit per channel*/ + { + mode_out->bitdepth = prof.bits; + mode_out->colortype = prof.alpha ? (prof.colored ? LCT_RGBA : LCT_GREY_ALPHA) + : (prof.colored ? LCT_RGB : LCT_GREY); + + if(prof.key && !prof.alpha) + { + unsigned mask = (1u << mode_out->bitdepth) - 1u; /*profile always uses 16-bit, mask converts it*/ + mode_out->key_r = prof.key_r & mask; + mode_out->key_g = prof.key_g & mask; + mode_out->key_b = prof.key_b & mask; + mode_out->key_defined = 1; + } + } + + return error; +} + +#endif /* #ifdef LODEPNG_COMPILE_ENCODER */ + +/* +Paeth predicter, used by PNG filter type 4 +The parameters are of type short, but should come from unsigned chars, the shorts +are only needed to make the paeth calculation correct. +*/ +static unsigned char paethPredictor(short a, short b, short c) +{ + short pa = abs(b - c); + short pb = abs(a - c); + short pc = abs(a + b - c - c); + + if(pc < pa && pc < pb) return (unsigned char)c; + else if(pb < pa) return (unsigned char)b; + else return (unsigned char)a; +} + +/*shared values used by multiple Adam7 related functions*/ + +static const unsigned ADAM7_IX[7] = { 0, 4, 0, 2, 0, 1, 0 }; /*x start values*/ +static const unsigned ADAM7_IY[7] = { 0, 0, 4, 0, 2, 0, 1 }; /*y start values*/ +static const unsigned ADAM7_DX[7] = { 8, 8, 4, 4, 2, 2, 1 }; /*x delta values*/ +static const unsigned ADAM7_DY[7] = { 8, 8, 8, 4, 4, 2, 2 }; /*y delta values*/ + +/* +Outputs various dimensions and positions in the image related to the Adam7 reduced images. +passw: output containing the width of the 7 passes +passh: output containing the height of the 7 passes +filter_passstart: output containing the index of the start and end of each + reduced image with filter bytes +padded_passstart output containing the index of the start and end of each + reduced image when without filter bytes but with padded scanlines +passstart: output containing the index of the start and end of each reduced + image without padding between scanlines, but still padding between the images +w, h: width and height of non-interlaced image +bpp: bits per pixel +"padded" is only relevant if bpp is less than 8 and a scanline or image does not + end at a full byte +*/ +static void Adam7_getpassvalues(unsigned passw[7], unsigned passh[7], size_t filter_passstart[8], + size_t padded_passstart[8], size_t passstart[8], unsigned w, unsigned h, unsigned bpp) +{ + /*the passstart values have 8 values: the 8th one indicates the byte after the end of the 7th (= last) pass*/ + unsigned i; + + /*calculate width and height in pixels of each pass*/ + for(i = 0; i != 7; ++i) + { + passw[i] = (w + ADAM7_DX[i] - ADAM7_IX[i] - 1) / ADAM7_DX[i]; + passh[i] = (h + ADAM7_DY[i] - ADAM7_IY[i] - 1) / ADAM7_DY[i]; + if(passw[i] == 0) passh[i] = 0; + if(passh[i] == 0) passw[i] = 0; + } + + filter_passstart[0] = padded_passstart[0] = passstart[0] = 0; + for(i = 0; i != 7; ++i) + { + /*if passw[i] is 0, it's 0 bytes, not 1 (no filtertype-byte)*/ + filter_passstart[i + 1] = filter_passstart[i] + + ((passw[i] && passh[i]) ? passh[i] * (1 + (passw[i] * bpp + 7) / 8) : 0); + /*bits padded if needed to fill full byte at end of each scanline*/ + padded_passstart[i + 1] = padded_passstart[i] + passh[i] * ((passw[i] * bpp + 7) / 8); + /*only padded at end of reduced image*/ + passstart[i + 1] = passstart[i] + (passh[i] * passw[i] * bpp + 7) / 8; + } +} + +#ifdef LODEPNG_COMPILE_DECODER + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / PNG Decoder / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +/*read the information from the header and store it in the LodePNGInfo. return value is error*/ +unsigned lodepng_inspect(unsigned* w, unsigned* h, LodePNGState* state, + const unsigned char* in, size_t insize) +{ + LodePNGInfo* info = &state->info_png; + if(insize == 0 || in == 0) + { + CERROR_RETURN_ERROR(state->error, 48); /*error: the given data is empty*/ + } + if(insize < 33) + { + CERROR_RETURN_ERROR(state->error, 27); /*error: the data length is smaller than the length of a PNG header*/ + } + + /*when decoding a new PNG image, make sure all parameters created after previous decoding are reset*/ + lodepng_info_cleanup(info); + lodepng_info_init(info); + + if(in[0] != 137 || in[1] != 80 || in[2] != 78 || in[3] != 71 + || in[4] != 13 || in[5] != 10 || in[6] != 26 || in[7] != 10) + { + CERROR_RETURN_ERROR(state->error, 28); /*error: the first 8 bytes are not the correct PNG signature*/ + } + if(lodepng_chunk_length(in + 8) != 13) + { + CERROR_RETURN_ERROR(state->error, 94); /*error: header size must be 13 bytes*/ + } + if(!lodepng_chunk_type_equals(in + 8, "IHDR")) + { + CERROR_RETURN_ERROR(state->error, 29); /*error: it doesn't start with a IHDR chunk!*/ + } + + /*read the values given in the header*/ + *w = lodepng_read32bitInt(&in[16]); + *h = lodepng_read32bitInt(&in[20]); + info->color.bitdepth = in[24]; + info->color.colortype = (LodePNGColorType)in[25]; + info->compression_method = in[26]; + info->filter_method = in[27]; + info->interlace_method = in[28]; + + if(*w == 0 || *h == 0) + { + CERROR_RETURN_ERROR(state->error, 93); + } + + if(!state->decoder.ignore_crc) + { + unsigned CRC = lodepng_read32bitInt(&in[29]); + unsigned checksum = lodepng_crc32(&in[12], 17); + if(CRC != checksum) + { + CERROR_RETURN_ERROR(state->error, 57); /*invalid CRC*/ + } + } + + /*error: only compression method 0 is allowed in the specification*/ + if(info->compression_method != 0) CERROR_RETURN_ERROR(state->error, 32); + /*error: only filter method 0 is allowed in the specification*/ + if(info->filter_method != 0) CERROR_RETURN_ERROR(state->error, 33); + /*error: only interlace methods 0 and 1 exist in the specification*/ + if(info->interlace_method > 1) CERROR_RETURN_ERROR(state->error, 34); + + state->error = checkColorValidity(info->color.colortype, info->color.bitdepth); + return state->error; +} + +static unsigned unfilterScanline(unsigned char* recon, const unsigned char* scanline, const unsigned char* precon, + size_t bytewidth, unsigned char filterType, size_t length) +{ + /* + For PNG filter method 0 + unfilter a PNG image scanline by scanline. when the pixels are smaller than 1 byte, + the filter works byte per byte (bytewidth = 1) + precon is the previous unfiltered scanline, recon the result, scanline the current one + the incoming scanlines do NOT include the filtertype byte, that one is given in the parameter filterType instead + recon and scanline MAY be the same memory address! precon must be disjoint. + */ + + size_t i; + switch(filterType) + { + case 0: + for(i = 0; i != length; ++i) recon[i] = scanline[i]; + break; + case 1: + for(i = 0; i != bytewidth; ++i) recon[i] = scanline[i]; + for(i = bytewidth; i < length; ++i) recon[i] = scanline[i] + recon[i - bytewidth]; + break; + case 2: + if(precon) + { + for(i = 0; i != length; ++i) recon[i] = scanline[i] + precon[i]; + } + else + { + for(i = 0; i != length; ++i) recon[i] = scanline[i]; + } + break; + case 3: + if(precon) + { + for(i = 0; i != bytewidth; ++i) recon[i] = scanline[i] + (precon[i] >> 1); + for(i = bytewidth; i < length; ++i) recon[i] = scanline[i] + ((recon[i - bytewidth] + precon[i]) >> 1); + } + else + { + for(i = 0; i != bytewidth; ++i) recon[i] = scanline[i]; + for(i = bytewidth; i < length; ++i) recon[i] = scanline[i] + (recon[i - bytewidth] >> 1); + } + break; + case 4: + if(precon) + { + for(i = 0; i != bytewidth; ++i) + { + recon[i] = (scanline[i] + precon[i]); /*paethPredictor(0, precon[i], 0) is always precon[i]*/ + } + for(i = bytewidth; i < length; ++i) + { + recon[i] = (scanline[i] + paethPredictor(recon[i - bytewidth], precon[i], precon[i - bytewidth])); + } + } + else + { + for(i = 0; i != bytewidth; ++i) + { + recon[i] = scanline[i]; + } + for(i = bytewidth; i < length; ++i) + { + /*paethPredictor(recon[i - bytewidth], 0, 0) is always recon[i - bytewidth]*/ + recon[i] = (scanline[i] + recon[i - bytewidth]); + } + } + break; + default: return 36; /*error: unexisting filter type given*/ + } + return 0; +} + +static unsigned unfilter(unsigned char* out, const unsigned char* in, unsigned w, unsigned h, unsigned bpp) +{ + /* + For PNG filter method 0 + this function unfilters a single image (e.g. without interlacing this is called once, with Adam7 seven times) + out must have enough bytes allocated already, in must have the scanlines + 1 filtertype byte per scanline + w and h are image dimensions or dimensions of reduced image, bpp is bits per pixel + in and out are allowed to be the same memory address (but aren't the same size since in has the extra filter bytes) + */ + + unsigned y; + unsigned char* prevline = 0; + + /*bytewidth is used for filtering, is 1 when bpp < 8, number of bytes per pixel otherwise*/ + size_t bytewidth = (bpp + 7) / 8; + size_t linebytes = (w * bpp + 7) / 8; + + for(y = 0; y < h; ++y) + { + size_t outindex = linebytes * y; + size_t inindex = (1 + linebytes) * y; /*the extra filterbyte added to each row*/ + unsigned char filterType = in[inindex]; + + CERROR_TRY_RETURN(unfilterScanline(&out[outindex], &in[inindex + 1], prevline, bytewidth, filterType, linebytes)); + + prevline = &out[outindex]; + } + + return 0; +} + +/* +in: Adam7 interlaced image, with no padding bits between scanlines, but between + reduced images so that each reduced image starts at a byte. +out: the same pixels, but re-ordered so that they're now a non-interlaced image with size w*h +bpp: bits per pixel +out has the following size in bits: w * h * bpp. +in is possibly bigger due to padding bits between reduced images. +out must be big enough AND must be 0 everywhere if bpp < 8 in the current implementation +(because that's likely a little bit faster) +NOTE: comments about padding bits are only relevant if bpp < 8 +*/ +static void Adam7_deinterlace(unsigned char* out, const unsigned char* in, unsigned w, unsigned h, unsigned bpp) +{ + unsigned passw[7], passh[7]; + size_t filter_passstart[8], padded_passstart[8], passstart[8]; + unsigned i; + + Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp); + + if(bpp >= 8) + { + for(i = 0; i != 7; ++i) + { + unsigned x, y, b; + size_t bytewidth = bpp / 8; + for(y = 0; y < passh[i]; ++y) + for(x = 0; x < passw[i]; ++x) + { + size_t pixelinstart = passstart[i] + (y * passw[i] + x) * bytewidth; + size_t pixeloutstart = ((ADAM7_IY[i] + y * ADAM7_DY[i]) * w + ADAM7_IX[i] + x * ADAM7_DX[i]) * bytewidth; + for(b = 0; b < bytewidth; ++b) + { + out[pixeloutstart + b] = in[pixelinstart + b]; + } + } + } + } + else /*bpp < 8: Adam7 with pixels < 8 bit is a bit trickier: with bit pointers*/ + { + for(i = 0; i != 7; ++i) + { + unsigned x, y, b; + unsigned ilinebits = bpp * passw[i]; + unsigned olinebits = bpp * w; + size_t obp, ibp; /*bit pointers (for out and in buffer)*/ + for(y = 0; y < passh[i]; ++y) + for(x = 0; x < passw[i]; ++x) + { + ibp = (8 * passstart[i]) + (y * ilinebits + x * bpp); + obp = (ADAM7_IY[i] + y * ADAM7_DY[i]) * olinebits + (ADAM7_IX[i] + x * ADAM7_DX[i]) * bpp; + for(b = 0; b < bpp; ++b) + { + unsigned char bit = readBitFromReversedStream(&ibp, in); + /*note that this function assumes the out buffer is completely 0, use setBitOfReversedStream otherwise*/ + setBitOfReversedStream0(&obp, out, bit); + } + } + } + } +} + +static void removePaddingBits(unsigned char* out, const unsigned char* in, + size_t olinebits, size_t ilinebits, unsigned h) +{ + /* + After filtering there are still padding bits if scanlines have non multiple of 8 bit amounts. They need + to be removed (except at last scanline of (Adam7-reduced) image) before working with pure image buffers + for the Adam7 code, the color convert code and the output to the user. + in and out are allowed to be the same buffer, in may also be higher but still overlapping; in must + have >= ilinebits*h bits, out must have >= olinebits*h bits, olinebits must be <= ilinebits + also used to move bits after earlier such operations happened, e.g. in a sequence of reduced images from Adam7 + only useful if (ilinebits - olinebits) is a value in the range 1..7 + */ + unsigned y; + size_t diff = ilinebits - olinebits; + size_t ibp = 0, obp = 0; /*input and output bit pointers*/ + for(y = 0; y < h; ++y) + { + size_t x; + for(x = 0; x < olinebits; ++x) + { + unsigned char bit = readBitFromReversedStream(&ibp, in); + setBitOfReversedStream(&obp, out, bit); + } + ibp += diff; + } +} + +/*out must be buffer big enough to contain full image, and in must contain the full decompressed data from +the IDAT chunks (with filter index bytes and possible padding bits) +return value is error*/ +static unsigned postProcessScanlines(unsigned char* out, unsigned char* in, + unsigned w, unsigned h, const LodePNGInfo* info_png) +{ + /* + This function converts the filtered-padded-interlaced data into pure 2D image buffer with the PNG's colortype. + Steps: + *) if no Adam7: 1) unfilter 2) remove padding bits (= posible extra bits per scanline if bpp < 8) + *) if adam7: 1) 7x unfilter 2) 7x remove padding bits 3) Adam7_deinterlace + NOTE: the in buffer will be overwritten with intermediate data! + */ + unsigned bpp = lodepng_get_bpp(&info_png->color); + if(bpp == 0) return 31; /*error: invalid colortype*/ + + if(info_png->interlace_method == 0) + { + if(bpp < 8 && w * bpp != ((w * bpp + 7) / 8) * 8) + { + CERROR_TRY_RETURN(unfilter(in, in, w, h, bpp)); + removePaddingBits(out, in, w * bpp, ((w * bpp + 7) / 8) * 8, h); + } + /*we can immediately filter into the out buffer, no other steps needed*/ + else CERROR_TRY_RETURN(unfilter(out, in, w, h, bpp)); + } + else /*interlace_method is 1 (Adam7)*/ + { + unsigned passw[7], passh[7]; size_t filter_passstart[8], padded_passstart[8], passstart[8]; + unsigned i; + + Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp); + + for(i = 0; i != 7; ++i) + { + CERROR_TRY_RETURN(unfilter(&in[padded_passstart[i]], &in[filter_passstart[i]], passw[i], passh[i], bpp)); + /*TODO: possible efficiency improvement: if in this reduced image the bits fit nicely in 1 scanline, + move bytes instead of bits or move not at all*/ + if(bpp < 8) + { + /*remove padding bits in scanlines; after this there still may be padding + bits between the different reduced images: each reduced image still starts nicely at a byte*/ + removePaddingBits(&in[passstart[i]], &in[padded_passstart[i]], passw[i] * bpp, + ((passw[i] * bpp + 7) / 8) * 8, passh[i]); + } + } + + Adam7_deinterlace(out, in, w, h, bpp); + } + + return 0; +} + +static unsigned readChunk_PLTE(LodePNGColorMode* color, const unsigned char* data, size_t chunkLength) +{ + unsigned pos = 0, i; + if(color->palette) lodepng_free(color->palette); + color->palettesize = chunkLength / 3; + color->palette = (unsigned char*)lodepng_malloc(4 * color->palettesize); + if(!color->palette && color->palettesize) + { + color->palettesize = 0; + return 83; /*alloc fail*/ + } + if(color->palettesize > 256) return 38; /*error: palette too big*/ + + for(i = 0; i != color->palettesize; ++i) + { + color->palette[4 * i + 0] = data[pos++]; /*R*/ + color->palette[4 * i + 1] = data[pos++]; /*G*/ + color->palette[4 * i + 2] = data[pos++]; /*B*/ + color->palette[4 * i + 3] = 255; /*alpha*/ + } + + return 0; /* OK */ +} + +static unsigned readChunk_tRNS(LodePNGColorMode* color, const unsigned char* data, size_t chunkLength) +{ + unsigned i; + if(color->colortype == LCT_PALETTE) + { + /*error: more alpha values given than there are palette entries*/ + if(chunkLength > color->palettesize) return 38; + + for(i = 0; i != chunkLength; ++i) color->palette[4 * i + 3] = data[i]; + } + else if(color->colortype == LCT_GREY) + { + /*error: this chunk must be 2 bytes for greyscale image*/ + if(chunkLength != 2) return 30; + + color->key_defined = 1; + color->key_r = color->key_g = color->key_b = 256u * data[0] + data[1]; + } + else if(color->colortype == LCT_RGB) + { + /*error: this chunk must be 6 bytes for RGB image*/ + if(chunkLength != 6) return 41; + + color->key_defined = 1; + color->key_r = 256u * data[0] + data[1]; + color->key_g = 256u * data[2] + data[3]; + color->key_b = 256u * data[4] + data[5]; + } + else return 42; /*error: tRNS chunk not allowed for other color models*/ + + return 0; /* OK */ +} + + +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS +/*background color chunk (bKGD)*/ +static unsigned readChunk_bKGD(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) +{ + if(info->color.colortype == LCT_PALETTE) + { + /*error: this chunk must be 1 byte for indexed color image*/ + if(chunkLength != 1) return 43; + + info->background_defined = 1; + info->background_r = info->background_g = info->background_b = data[0]; + } + else if(info->color.colortype == LCT_GREY || info->color.colortype == LCT_GREY_ALPHA) + { + /*error: this chunk must be 2 bytes for greyscale image*/ + if(chunkLength != 2) return 44; + + info->background_defined = 1; + info->background_r = info->background_g = info->background_b = 256u * data[0] + data[1]; + } + else if(info->color.colortype == LCT_RGB || info->color.colortype == LCT_RGBA) + { + /*error: this chunk must be 6 bytes for greyscale image*/ + if(chunkLength != 6) return 45; + + info->background_defined = 1; + info->background_r = 256u * data[0] + data[1]; + info->background_g = 256u * data[2] + data[3]; + info->background_b = 256u * data[4] + data[5]; + } + + return 0; /* OK */ +} + +/*text chunk (tEXt)*/ +static unsigned readChunk_tEXt(LodePNGInfo* info, const unsigned char* data, unsigned int chunkLength) +{ + unsigned error = 0; + char *key = 0, *str = 0; + unsigned i; + + while(!error) /*not really a while loop, only used to break on error*/ + { + unsigned length, string2_begin; + + length = 0; + while(length < chunkLength && data[length] != 0) ++length; + /*even though it's not allowed by the standard, no error is thrown if + there's no null termination char, if the text is empty*/ + if(length < 1 || length > 79) CERROR_BREAK(error, 89); /*keyword too short or long*/ + + key = (char*)lodepng_malloc(length + 1); + if(!key) CERROR_BREAK(error, 83); /*alloc fail*/ + + key[length] = 0; + for(i = 0; i != length; ++i) key[i] = (char)data[i]; + + string2_begin = length + 1; /*skip keyword null terminator*/ + + length = chunkLength < string2_begin ? 0 : chunkLength - string2_begin; + str = (char*)lodepng_malloc(length + 1); + if(!str) CERROR_BREAK(error, 83); /*alloc fail*/ + + str[length] = 0; + for(i = 0; i != length; ++i) str[i] = (char)data[string2_begin + i]; + + error = lodepng_add_text(info, key, str); + + break; + } + + lodepng_free(key); + lodepng_free(str); + + return error; +} + +/*compressed text chunk (zTXt)*/ +static unsigned readChunk_zTXt(LodePNGInfo* info, const LodePNGDecompressSettings* zlibsettings, + const unsigned char* data, unsigned int chunkLength) +{ + unsigned error = 0; + unsigned i; + + unsigned length, string2_begin; + char *key = 0; + ucvector decoded; + + ucvector_init(&decoded); + + while(!error) /*not really a while loop, only used to break on error*/ + { + for(length = 0; length < chunkLength && data[length] != 0; ++length) ; + if(length + 2 >= chunkLength) CERROR_BREAK(error, 75); /*no null termination, corrupt?*/ + if(length < 1 || length > 79) CERROR_BREAK(error, 89); /*keyword too short or long*/ + + key = (char*)lodepng_malloc(length + 1); + if(!key) CERROR_BREAK(error, 83); /*alloc fail*/ + + key[length] = 0; + for(i = 0; i != length; ++i) key[i] = (char)data[i]; + + if(data[length + 1] != 0) CERROR_BREAK(error, 72); /*the 0 byte indicating compression must be 0*/ + + string2_begin = length + 2; + if(string2_begin > chunkLength) CERROR_BREAK(error, 75); /*no null termination, corrupt?*/ + + length = chunkLength - string2_begin; + /*will fail if zlib error, e.g. if length is too small*/ + error = zlib_decompress(&decoded.data, &decoded.size, + (unsigned char*)(&data[string2_begin]), + length, zlibsettings); + if(error) break; + ucvector_push_back(&decoded, 0); + + error = lodepng_add_text(info, key, (char*)decoded.data); + + break; + } + + lodepng_free(key); + ucvector_cleanup(&decoded); + + return error; +} + +/*international text chunk (iTXt)*/ +static unsigned readChunk_iTXt(LodePNGInfo* info, const LodePNGDecompressSettings* zlibsettings, + const unsigned char* data, unsigned int chunkLength) +{ + unsigned error = 0; + unsigned i; + + unsigned length, begin, compressed; + char *key = 0, *langtag = 0, *transkey = 0; + ucvector decoded; + ucvector_init(&decoded); + + while(!error) /*not really a while loop, only used to break on error*/ + { + /*Quick check if the chunk length isn't too small. Even without check + it'd still fail with other error checks below if it's too short. This just gives a different error code.*/ + if(chunkLength < 5) CERROR_BREAK(error, 30); /*iTXt chunk too short*/ + + /*read the key*/ + for(length = 0; length < chunkLength && data[length] != 0; ++length) ; + if(length + 3 >= chunkLength) CERROR_BREAK(error, 75); /*no null termination char, corrupt?*/ + if(length < 1 || length > 79) CERROR_BREAK(error, 89); /*keyword too short or long*/ + + key = (char*)lodepng_malloc(length + 1); + if(!key) CERROR_BREAK(error, 83); /*alloc fail*/ + + key[length] = 0; + for(i = 0; i != length; ++i) key[i] = (char)data[i]; + + /*read the compression method*/ + compressed = data[length + 1]; + if(data[length + 2] != 0) CERROR_BREAK(error, 72); /*the 0 byte indicating compression must be 0*/ + + /*even though it's not allowed by the standard, no error is thrown if + there's no null termination char, if the text is empty for the next 3 texts*/ + + /*read the langtag*/ + begin = length + 3; + length = 0; + for(i = begin; i < chunkLength && data[i] != 0; ++i) ++length; + + langtag = (char*)lodepng_malloc(length + 1); + if(!langtag) CERROR_BREAK(error, 83); /*alloc fail*/ + + langtag[length] = 0; + for(i = 0; i != length; ++i) langtag[i] = (char)data[begin + i]; + + /*read the transkey*/ + begin += length + 1; + length = 0; + for(i = begin; i < chunkLength && data[i] != 0; ++i) ++length; + + transkey = (char*)lodepng_malloc(length + 1); + if(!transkey) CERROR_BREAK(error, 83); /*alloc fail*/ + + transkey[length] = 0; + for(i = 0; i != length; ++i) transkey[i] = (char)data[begin + i]; + + /*read the actual text*/ + begin += length + 1; + + length = chunkLength < begin ? 0 : chunkLength - begin; + + if(compressed) + { + /*will fail if zlib error, e.g. if length is too small*/ + error = zlib_decompress(&decoded.data, &decoded.size, + (unsigned char*)(&data[begin]), + length, zlibsettings); + if(error) break; + if(decoded.allocsize < decoded.size) decoded.allocsize = decoded.size; + ucvector_push_back(&decoded, 0); + } + else + { + if(!ucvector_resize(&decoded, length + 1)) CERROR_BREAK(error, 83 /*alloc fail*/); + + decoded.data[length] = 0; + for(i = 0; i != length; ++i) decoded.data[i] = data[begin + i]; + } + + error = lodepng_add_itext(info, key, langtag, transkey, (char*)decoded.data); + + break; + } + + lodepng_free(key); + lodepng_free(langtag); + lodepng_free(transkey); + ucvector_cleanup(&decoded); + + return error; +} + +static unsigned readChunk_tIME(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) +{ + if(chunkLength != 7) return 73; /*invalid tIME chunk size*/ + + info->time_defined = 1; + info->time.year = 256u * data[0] + data[1]; + info->time.month = data[2]; + info->time.day = data[3]; + info->time.hour = data[4]; + info->time.minute = data[5]; + info->time.second = data[6]; + + return 0; /* OK */ +} + +static unsigned readChunk_pHYs(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) +{ + if(chunkLength != 9) return 74; /*invalid pHYs chunk size*/ + + info->phys_defined = 1; + info->phys_x = 16777216u * data[0] + 65536u * data[1] + 256u * data[2] + data[3]; + info->phys_y = 16777216u * data[4] + 65536u * data[5] + 256u * data[6] + data[7]; + info->phys_unit = data[8]; + + return 0; /* OK */ +} +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + +/*read a PNG, the result will be in the same color type as the PNG (hence "generic")*/ +static void decodeGeneric(unsigned char** out, unsigned* w, unsigned* h, + LodePNGState* state, + const unsigned char* in, size_t insize) +{ + unsigned char IEND = 0; + const unsigned char* chunk; + size_t i; + ucvector idat; /*the data from idat chunks*/ + ucvector scanlines; + size_t predict; + size_t numpixels; + size_t outsize; + + /*for unknown chunk order*/ + unsigned unknown = 0; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + unsigned critical_pos = 1; /*1 = after IHDR, 2 = after PLTE, 3 = after IDAT*/ +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + + /*provide some proper output values if error will happen*/ + *out = 0; + + state->error = lodepng_inspect(w, h, state, in, insize); /*reads header and resets other parameters in state->info_png*/ + if(state->error) return; + + numpixels = *w * *h; + + /*multiplication overflow*/ + if(*h != 0 && numpixels / *h != *w) CERROR_RETURN(state->error, 92); + /*multiplication overflow possible further below. Allows up to 2^31-1 pixel + bytes with 16-bit RGBA, the rest is room for filter bytes.*/ + if(numpixels > 268435455) CERROR_RETURN(state->error, 92); + + ucvector_init(&idat); + chunk = &in[33]; /*first byte of the first chunk after the header*/ + + /*loop through the chunks, ignoring unknown chunks and stopping at IEND chunk. + IDAT data is put at the start of the in buffer*/ + while(!IEND && !state->error) + { + unsigned chunkLength; + const unsigned char* data; /*the data in the chunk*/ + + /*error: size of the in buffer too small to contain next chunk*/ + if((size_t)((chunk - in) + 12) > insize || chunk < in) CERROR_BREAK(state->error, 30); + + /*length of the data of the chunk, excluding the length bytes, chunk type and CRC bytes*/ + chunkLength = lodepng_chunk_length(chunk); + /*error: chunk length larger than the max PNG chunk size*/ + if(chunkLength > 2147483647) CERROR_BREAK(state->error, 63); + + if((size_t)((chunk - in) + chunkLength + 12) > insize || (chunk + chunkLength + 12) < in) + { + CERROR_BREAK(state->error, 64); /*error: size of the in buffer too small to contain next chunk*/ + } + + data = lodepng_chunk_data_const(chunk); + + /*IDAT chunk, containing compressed image data*/ + if(lodepng_chunk_type_equals(chunk, "IDAT")) + { + size_t oldsize = idat.size; + if(!ucvector_resize(&idat, oldsize + chunkLength)) CERROR_BREAK(state->error, 83 /*alloc fail*/); + for(i = 0; i != chunkLength; ++i) idat.data[oldsize + i] = data[i]; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + critical_pos = 3; +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + } + /*IEND chunk*/ + else if(lodepng_chunk_type_equals(chunk, "IEND")) + { + IEND = 1; + } + /*palette chunk (PLTE)*/ + else if(lodepng_chunk_type_equals(chunk, "PLTE")) + { + state->error = readChunk_PLTE(&state->info_png.color, data, chunkLength); + if(state->error) break; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + critical_pos = 2; +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + } + /*palette transparency chunk (tRNS)*/ + else if(lodepng_chunk_type_equals(chunk, "tRNS")) + { + state->error = readChunk_tRNS(&state->info_png.color, data, chunkLength); + if(state->error) break; + } +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + /*background color chunk (bKGD)*/ + else if(lodepng_chunk_type_equals(chunk, "bKGD")) + { + state->error = readChunk_bKGD(&state->info_png, data, chunkLength); + if(state->error) break; + } + /*text chunk (tEXt)*/ + else if(lodepng_chunk_type_equals(chunk, "tEXt")) + { + if(state->decoder.read_text_chunks) + { + state->error = readChunk_tEXt(&state->info_png, data, chunkLength); + if(state->error) break; + } + } + /*compressed text chunk (zTXt)*/ + else if(lodepng_chunk_type_equals(chunk, "zTXt")) + { + if(state->decoder.read_text_chunks) + { + state->error = readChunk_zTXt(&state->info_png, &state->decoder.zlibsettings, data, chunkLength); + if(state->error) break; + } + } + /*international text chunk (iTXt)*/ + else if(lodepng_chunk_type_equals(chunk, "iTXt")) + { + if(state->decoder.read_text_chunks) + { + state->error = readChunk_iTXt(&state->info_png, &state->decoder.zlibsettings, data, chunkLength); + if(state->error) break; + } + } + else if(lodepng_chunk_type_equals(chunk, "tIME")) + { + state->error = readChunk_tIME(&state->info_png, data, chunkLength); + if(state->error) break; + } + else if(lodepng_chunk_type_equals(chunk, "pHYs")) + { + state->error = readChunk_pHYs(&state->info_png, data, chunkLength); + if(state->error) break; + } +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + else /*it's not an implemented chunk type, so ignore it: skip over the data*/ + { + /*error: unknown critical chunk (5th bit of first byte of chunk type is 0)*/ + if(!lodepng_chunk_ancillary(chunk)) CERROR_BREAK(state->error, 69); + + unknown = 1; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + if(state->decoder.remember_unknown_chunks) + { + state->error = lodepng_chunk_append(&state->info_png.unknown_chunks_data[critical_pos - 1], + &state->info_png.unknown_chunks_size[critical_pos - 1], chunk); + if(state->error) break; + } +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + } + + if(!state->decoder.ignore_crc && !unknown) /*check CRC if wanted, only on known chunk types*/ + { + if(lodepng_chunk_check_crc(chunk)) CERROR_BREAK(state->error, 57); /*invalid CRC*/ + } + + if(!IEND) chunk = lodepng_chunk_next_const(chunk); + } + + ucvector_init(&scanlines); + /*predict output size, to allocate exact size for output buffer to avoid more dynamic allocation. + If the decompressed size does not match the prediction, the image must be corrupt.*/ + if(state->info_png.interlace_method == 0) + { + /*The extra *h is added because this are the filter bytes every scanline starts with*/ + predict = lodepng_get_raw_size_idat(*w, *h, &state->info_png.color) + *h; + } + else + { + /*Adam-7 interlaced: predicted size is the sum of the 7 sub-images sizes*/ + const LodePNGColorMode* color = &state->info_png.color; + predict = 0; + predict += lodepng_get_raw_size_idat((*w + 7) >> 3, (*h + 7) >> 3, color) + ((*h + 7) >> 3); + if(*w > 4) predict += lodepng_get_raw_size_idat((*w + 3) >> 3, (*h + 7) >> 3, color) + ((*h + 7) >> 3); + predict += lodepng_get_raw_size_idat((*w + 3) >> 2, (*h + 3) >> 3, color) + ((*h + 3) >> 3); + if(*w > 2) predict += lodepng_get_raw_size_idat((*w + 1) >> 2, (*h + 3) >> 2, color) + ((*h + 3) >> 2); + predict += lodepng_get_raw_size_idat((*w + 1) >> 1, (*h + 1) >> 2, color) + ((*h + 1) >> 2); + if(*w > 1) predict += lodepng_get_raw_size_idat((*w + 0) >> 1, (*h + 1) >> 1, color) + ((*h + 1) >> 1); + predict += lodepng_get_raw_size_idat((*w + 0), (*h + 0) >> 1, color) + ((*h + 0) >> 1); + } + if(!state->error && !ucvector_reserve(&scanlines, predict)) state->error = 83; /*alloc fail*/ + if(!state->error) + { + state->error = zlib_decompress(&scanlines.data, &scanlines.size, idat.data, + idat.size, &state->decoder.zlibsettings); + if(!state->error && scanlines.size != predict) state->error = 91; /*decompressed size doesn't match prediction*/ + } + ucvector_cleanup(&idat); + + if(!state->error) + { + outsize = lodepng_get_raw_size(*w, *h, &state->info_png.color); + *out = (unsigned char*)lodepng_malloc(outsize); + if(!*out) state->error = 83; /*alloc fail*/ + } + if(!state->error) + { + for(i = 0; i < outsize; i++) (*out)[i] = 0; + state->error = postProcessScanlines(*out, scanlines.data, *w, *h, &state->info_png); + } + ucvector_cleanup(&scanlines); +} + +unsigned lodepng_decode(unsigned char** out, unsigned* w, unsigned* h, + LodePNGState* state, + const unsigned char* in, size_t insize) +{ + *out = 0; + decodeGeneric(out, w, h, state, in, insize); + if(state->error) return state->error; + if(!state->decoder.color_convert || lodepng_color_mode_equal(&state->info_raw, &state->info_png.color)) + { + /*same color type, no copying or converting of data needed*/ + /*store the info_png color settings on the info_raw so that the info_raw still reflects what colortype + the raw image has to the end user*/ + if(!state->decoder.color_convert) + { + state->error = lodepng_color_mode_copy(&state->info_raw, &state->info_png.color); + if(state->error) return state->error; + } + } + else + { + /*color conversion needed; sort of copy of the data*/ + unsigned char* data = *out; + size_t outsize; + + /*TODO: check if this works according to the statement in the documentation: "The converter can convert + from greyscale input color type, to 8-bit greyscale or greyscale with alpha"*/ + if(!(state->info_raw.colortype == LCT_RGB || state->info_raw.colortype == LCT_RGBA) + && !(state->info_raw.bitdepth == 8)) + { + return 56; /*unsupported color mode conversion*/ + } + + outsize = lodepng_get_raw_size(*w, *h, &state->info_raw); + *out = (unsigned char*)lodepng_malloc(outsize); + if(!(*out)) + { + state->error = 83; /*alloc fail*/ + } + else state->error = lodepng_convert(*out, data, &state->info_raw, + &state->info_png.color, *w, *h); + lodepng_free(data); + } + return state->error; +} + +unsigned lodepng_decode_memory(unsigned char** out, unsigned* w, unsigned* h, const unsigned char* in, + size_t insize, LodePNGColorType colortype, unsigned bitdepth) +{ + unsigned error; + LodePNGState state; + lodepng_state_init(&state); + state.info_raw.colortype = colortype; + state.info_raw.bitdepth = bitdepth; + error = lodepng_decode(out, w, h, &state, in, insize); + lodepng_state_cleanup(&state); + return error; +} + +unsigned lodepng_decode32(unsigned char** out, unsigned* w, unsigned* h, const unsigned char* in, size_t insize) +{ + return lodepng_decode_memory(out, w, h, in, insize, LCT_RGBA, 8); +} + +unsigned lodepng_decode24(unsigned char** out, unsigned* w, unsigned* h, const unsigned char* in, size_t insize) +{ + return lodepng_decode_memory(out, w, h, in, insize, LCT_RGB, 8); +} + +#ifdef LODEPNG_COMPILE_DISK +unsigned lodepng_decode_file(unsigned char** out, unsigned* w, unsigned* h, const char* filename, + LodePNGColorType colortype, unsigned bitdepth) +{ + unsigned char* buffer = 0; + size_t buffersize; + unsigned error; + error = lodepng_load_file(&buffer, &buffersize, filename); + if(!error) error = lodepng_decode_memory(out, w, h, buffer, buffersize, colortype, bitdepth); + lodepng_free(buffer); + return error; +} + +unsigned lodepng_decode32_file(unsigned char** out, unsigned* w, unsigned* h, const char* filename) +{ + return lodepng_decode_file(out, w, h, filename, LCT_RGBA, 8); +} + +unsigned lodepng_decode24_file(unsigned char** out, unsigned* w, unsigned* h, const char* filename) +{ + return lodepng_decode_file(out, w, h, filename, LCT_RGB, 8); +} +#endif /*LODEPNG_COMPILE_DISK*/ + +void lodepng_decoder_settings_init(LodePNGDecoderSettings* settings) +{ + settings->color_convert = 1; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + settings->read_text_chunks = 1; + settings->remember_unknown_chunks = 0; +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + settings->ignore_crc = 0; + lodepng_decompress_settings_init(&settings->zlibsettings); +} + +#endif /*LODEPNG_COMPILE_DECODER*/ + +#if defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_ENCODER) + +void lodepng_state_init(LodePNGState* state) +{ +#ifdef LODEPNG_COMPILE_DECODER + lodepng_decoder_settings_init(&state->decoder); +#endif /*LODEPNG_COMPILE_DECODER*/ +#ifdef LODEPNG_COMPILE_ENCODER + lodepng_encoder_settings_init(&state->encoder); +#endif /*LODEPNG_COMPILE_ENCODER*/ + lodepng_color_mode_init(&state->info_raw); + lodepng_info_init(&state->info_png); + state->error = 1; +} + +void lodepng_state_cleanup(LodePNGState* state) +{ + lodepng_color_mode_cleanup(&state->info_raw); + lodepng_info_cleanup(&state->info_png); +} + +void lodepng_state_copy(LodePNGState* dest, const LodePNGState* source) +{ + lodepng_state_cleanup(dest); + *dest = *source; + lodepng_color_mode_init(&dest->info_raw); + lodepng_info_init(&dest->info_png); + dest->error = lodepng_color_mode_copy(&dest->info_raw, &source->info_raw); if(dest->error) return; + dest->error = lodepng_info_copy(&dest->info_png, &source->info_png); if(dest->error) return; +} + +#endif /* defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_ENCODER) */ + +#ifdef LODEPNG_COMPILE_ENCODER + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / PNG Encoder / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +/*chunkName must be string of 4 characters*/ +static unsigned addChunk(ucvector* out, const char* chunkName, const unsigned char* data, size_t length) +{ + CERROR_TRY_RETURN(lodepng_chunk_create(&out->data, &out->size, (unsigned)length, chunkName, data)); + out->allocsize = out->size; /*fix the allocsize again*/ + return 0; +} + +static void writeSignature(ucvector* out) +{ + /*8 bytes PNG signature, aka the magic bytes*/ + ucvector_push_back(out, 137); + ucvector_push_back(out, 80); + ucvector_push_back(out, 78); + ucvector_push_back(out, 71); + ucvector_push_back(out, 13); + ucvector_push_back(out, 10); + ucvector_push_back(out, 26); + ucvector_push_back(out, 10); +} + +static unsigned addChunk_IHDR(ucvector* out, unsigned w, unsigned h, + LodePNGColorType colortype, unsigned bitdepth, unsigned interlace_method) +{ + unsigned error = 0; + ucvector header; + ucvector_init(&header); + + lodepng_add32bitInt(&header, w); /*width*/ + lodepng_add32bitInt(&header, h); /*height*/ + ucvector_push_back(&header, (unsigned char)bitdepth); /*bit depth*/ + ucvector_push_back(&header, (unsigned char)colortype); /*color type*/ + ucvector_push_back(&header, 0); /*compression method*/ + ucvector_push_back(&header, 0); /*filter method*/ + ucvector_push_back(&header, interlace_method); /*interlace method*/ + + error = addChunk(out, "IHDR", header.data, header.size); + ucvector_cleanup(&header); + + return error; +} + +static unsigned addChunk_PLTE(ucvector* out, const LodePNGColorMode* info) +{ + unsigned error = 0; + size_t i; + ucvector PLTE; + ucvector_init(&PLTE); + for(i = 0; i != info->palettesize * 4; ++i) + { + /*add all channels except alpha channel*/ + if(i % 4 != 3) ucvector_push_back(&PLTE, info->palette[i]); + } + error = addChunk(out, "PLTE", PLTE.data, PLTE.size); + ucvector_cleanup(&PLTE); + + return error; +} + +static unsigned addChunk_tRNS(ucvector* out, const LodePNGColorMode* info) +{ + unsigned error = 0; + size_t i; + ucvector tRNS; + ucvector_init(&tRNS); + if(info->colortype == LCT_PALETTE) + { + size_t amount = info->palettesize; + /*the tail of palette values that all have 255 as alpha, does not have to be encoded*/ + for(i = info->palettesize; i != 0; --i) + { + if(info->palette[4 * (i - 1) + 3] == 255) --amount; + else break; + } + /*add only alpha channel*/ + for(i = 0; i != amount; ++i) ucvector_push_back(&tRNS, info->palette[4 * i + 3]); + } + else if(info->colortype == LCT_GREY) + { + if(info->key_defined) + { + ucvector_push_back(&tRNS, (unsigned char)(info->key_r >> 8)); + ucvector_push_back(&tRNS, (unsigned char)(info->key_r & 255)); + } + } + else if(info->colortype == LCT_RGB) + { + if(info->key_defined) + { + ucvector_push_back(&tRNS, (unsigned char)(info->key_r >> 8)); + ucvector_push_back(&tRNS, (unsigned char)(info->key_r & 255)); + ucvector_push_back(&tRNS, (unsigned char)(info->key_g >> 8)); + ucvector_push_back(&tRNS, (unsigned char)(info->key_g & 255)); + ucvector_push_back(&tRNS, (unsigned char)(info->key_b >> 8)); + ucvector_push_back(&tRNS, (unsigned char)(info->key_b & 255)); + } + } + + error = addChunk(out, "tRNS", tRNS.data, tRNS.size); + ucvector_cleanup(&tRNS); + + return error; +} + +static unsigned addChunk_IDAT(ucvector* out, const unsigned char* data, size_t datasize, + LodePNGCompressSettings* zlibsettings) +{ + ucvector zlibdata; + unsigned error = 0; + + /*compress with the Zlib compressor*/ + ucvector_init(&zlibdata); + error = zlib_compress(&zlibdata.data, &zlibdata.size, data, datasize, zlibsettings); + if(!error) error = addChunk(out, "IDAT", zlibdata.data, zlibdata.size); + ucvector_cleanup(&zlibdata); + + return error; +} + +static unsigned addChunk_IEND(ucvector* out) +{ + unsigned error = 0; + error = addChunk(out, "IEND", 0, 0); + return error; +} + +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + +static unsigned addChunk_tEXt(ucvector* out, const char* keyword, const char* textstring) +{ + unsigned error = 0; + size_t i; + ucvector text; + ucvector_init(&text); + for(i = 0; keyword[i] != 0; ++i) ucvector_push_back(&text, (unsigned char)keyword[i]); + if(i < 1 || i > 79) return 89; /*error: invalid keyword size*/ + ucvector_push_back(&text, 0); /*0 termination char*/ + for(i = 0; textstring[i] != 0; ++i) ucvector_push_back(&text, (unsigned char)textstring[i]); + error = addChunk(out, "tEXt", text.data, text.size); + ucvector_cleanup(&text); + + return error; +} + +static unsigned addChunk_zTXt(ucvector* out, const char* keyword, const char* textstring, + LodePNGCompressSettings* zlibsettings) +{ + unsigned error = 0; + ucvector data, compressed; + size_t i, textsize = strlen(textstring); + + ucvector_init(&data); + ucvector_init(&compressed); + for(i = 0; keyword[i] != 0; ++i) ucvector_push_back(&data, (unsigned char)keyword[i]); + if(i < 1 || i > 79) return 89; /*error: invalid keyword size*/ + ucvector_push_back(&data, 0); /*0 termination char*/ + ucvector_push_back(&data, 0); /*compression method: 0*/ + + error = zlib_compress(&compressed.data, &compressed.size, + (unsigned char*)textstring, textsize, zlibsettings); + if(!error) + { + for(i = 0; i != compressed.size; ++i) ucvector_push_back(&data, compressed.data[i]); + error = addChunk(out, "zTXt", data.data, data.size); + } + + ucvector_cleanup(&compressed); + ucvector_cleanup(&data); + return error; +} + +static unsigned addChunk_iTXt(ucvector* out, unsigned compressed, const char* keyword, const char* langtag, + const char* transkey, const char* textstring, LodePNGCompressSettings* zlibsettings) +{ + unsigned error = 0; + ucvector data; + size_t i, textsize = strlen(textstring); + + ucvector_init(&data); + + for(i = 0; keyword[i] != 0; ++i) ucvector_push_back(&data, (unsigned char)keyword[i]); + if(i < 1 || i > 79) return 89; /*error: invalid keyword size*/ + ucvector_push_back(&data, 0); /*null termination char*/ + ucvector_push_back(&data, compressed ? 1 : 0); /*compression flag*/ + ucvector_push_back(&data, 0); /*compression method*/ + for(i = 0; langtag[i] != 0; ++i) ucvector_push_back(&data, (unsigned char)langtag[i]); + ucvector_push_back(&data, 0); /*null termination char*/ + for(i = 0; transkey[i] != 0; ++i) ucvector_push_back(&data, (unsigned char)transkey[i]); + ucvector_push_back(&data, 0); /*null termination char*/ + + if(compressed) + { + ucvector compressed_data; + ucvector_init(&compressed_data); + error = zlib_compress(&compressed_data.data, &compressed_data.size, + (unsigned char*)textstring, textsize, zlibsettings); + if(!error) + { + for(i = 0; i != compressed_data.size; ++i) ucvector_push_back(&data, compressed_data.data[i]); + } + ucvector_cleanup(&compressed_data); + } + else /*not compressed*/ + { + for(i = 0; textstring[i] != 0; ++i) ucvector_push_back(&data, (unsigned char)textstring[i]); + } + + if(!error) error = addChunk(out, "iTXt", data.data, data.size); + ucvector_cleanup(&data); + return error; +} + +static unsigned addChunk_bKGD(ucvector* out, const LodePNGInfo* info) +{ + unsigned error = 0; + ucvector bKGD; + ucvector_init(&bKGD); + if(info->color.colortype == LCT_GREY || info->color.colortype == LCT_GREY_ALPHA) + { + ucvector_push_back(&bKGD, (unsigned char)(info->background_r >> 8)); + ucvector_push_back(&bKGD, (unsigned char)(info->background_r & 255)); + } + else if(info->color.colortype == LCT_RGB || info->color.colortype == LCT_RGBA) + { + ucvector_push_back(&bKGD, (unsigned char)(info->background_r >> 8)); + ucvector_push_back(&bKGD, (unsigned char)(info->background_r & 255)); + ucvector_push_back(&bKGD, (unsigned char)(info->background_g >> 8)); + ucvector_push_back(&bKGD, (unsigned char)(info->background_g & 255)); + ucvector_push_back(&bKGD, (unsigned char)(info->background_b >> 8)); + ucvector_push_back(&bKGD, (unsigned char)(info->background_b & 255)); + } + else if(info->color.colortype == LCT_PALETTE) + { + ucvector_push_back(&bKGD, (unsigned char)(info->background_r & 255)); /*palette index*/ + } + + error = addChunk(out, "bKGD", bKGD.data, bKGD.size); + ucvector_cleanup(&bKGD); + + return error; +} + +static unsigned addChunk_tIME(ucvector* out, const LodePNGTime* time) +{ + unsigned error = 0; + unsigned char* data = (unsigned char*)lodepng_malloc(7); + if(!data) return 83; /*alloc fail*/ + data[0] = (unsigned char)(time->year >> 8); + data[1] = (unsigned char)(time->year & 255); + data[2] = (unsigned char)time->month; + data[3] = (unsigned char)time->day; + data[4] = (unsigned char)time->hour; + data[5] = (unsigned char)time->minute; + data[6] = (unsigned char)time->second; + error = addChunk(out, "tIME", data, 7); + lodepng_free(data); + return error; +} + +static unsigned addChunk_pHYs(ucvector* out, const LodePNGInfo* info) +{ + unsigned error = 0; + ucvector data; + ucvector_init(&data); + + lodepng_add32bitInt(&data, info->phys_x); + lodepng_add32bitInt(&data, info->phys_y); + ucvector_push_back(&data, info->phys_unit); + + error = addChunk(out, "pHYs", data.data, data.size); + ucvector_cleanup(&data); + + return error; +} + +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + +static void filterScanline(unsigned char* out, const unsigned char* scanline, const unsigned char* prevline, + size_t length, size_t bytewidth, unsigned char filterType) +{ + size_t i; + switch(filterType) + { + case 0: /*None*/ + for(i = 0; i != length; ++i) out[i] = scanline[i]; + break; + case 1: /*Sub*/ + for(i = 0; i != bytewidth; ++i) out[i] = scanline[i]; + for(i = bytewidth; i < length; ++i) out[i] = scanline[i] - scanline[i - bytewidth]; + break; + case 2: /*Up*/ + if(prevline) + { + for(i = 0; i != length; ++i) out[i] = scanline[i] - prevline[i]; + } + else + { + for(i = 0; i != length; ++i) out[i] = scanline[i]; + } + break; + case 3: /*Average*/ + if(prevline) + { + for(i = 0; i != bytewidth; ++i) out[i] = scanline[i] - (prevline[i] >> 1); + for(i = bytewidth; i < length; ++i) out[i] = scanline[i] - ((scanline[i - bytewidth] + prevline[i]) >> 1); + } + else + { + for(i = 0; i != bytewidth; ++i) out[i] = scanline[i]; + for(i = bytewidth; i < length; ++i) out[i] = scanline[i] - (scanline[i - bytewidth] >> 1); + } + break; + case 4: /*Paeth*/ + if(prevline) + { + /*paethPredictor(0, prevline[i], 0) is always prevline[i]*/ + for(i = 0; i != bytewidth; ++i) out[i] = (scanline[i] - prevline[i]); + for(i = bytewidth; i < length; ++i) + { + out[i] = (scanline[i] - paethPredictor(scanline[i - bytewidth], prevline[i], prevline[i - bytewidth])); + } + } + else + { + for(i = 0; i != bytewidth; ++i) out[i] = scanline[i]; + /*paethPredictor(scanline[i - bytewidth], 0, 0) is always scanline[i - bytewidth]*/ + for(i = bytewidth; i < length; ++i) out[i] = (scanline[i] - scanline[i - bytewidth]); + } + break; + default: return; /*unexisting filter type given*/ + } +} + +/* log2 approximation. A slight bit faster than std::log. */ +static float flog2(float f) +{ + float result = 0; + while(f > 32) { result += 4; f /= 16; } + while(f > 2) { ++result; f /= 2; } + return result + 1.442695f * (f * f * f / 3 - 3 * f * f / 2 + 3 * f - 1.83333f); +} + +static unsigned filter(unsigned char* out, const unsigned char* in, unsigned w, unsigned h, + const LodePNGColorMode* info, const LodePNGEncoderSettings* settings) +{ + /* + For PNG filter method 0 + out must be a buffer with as size: h + (w * h * bpp + 7) / 8, because there are + the scanlines with 1 extra byte per scanline + */ + + unsigned bpp = lodepng_get_bpp(info); + /*the width of a scanline in bytes, not including the filter type*/ + size_t linebytes = (w * bpp + 7) / 8; + /*bytewidth is used for filtering, is 1 when bpp < 8, number of bytes per pixel otherwise*/ + size_t bytewidth = (bpp + 7) / 8; + const unsigned char* prevline = 0; + unsigned x, y; + unsigned error = 0; + LodePNGFilterStrategy strategy = settings->filter_strategy; + + /* + There is a heuristic called the minimum sum of absolute differences heuristic, suggested by the PNG standard: + * If the image type is Palette, or the bit depth is smaller than 8, then do not filter the image (i.e. + use fixed filtering, with the filter None). + * (The other case) If the image type is Grayscale or RGB (with or without Alpha), and the bit depth is + not smaller than 8, then use adaptive filtering heuristic as follows: independently for each row, apply + all five filters and select the filter that produces the smallest sum of absolute values per row. + This heuristic is used if filter strategy is LFS_MINSUM and filter_palette_zero is true. + + If filter_palette_zero is true and filter_strategy is not LFS_MINSUM, the above heuristic is followed, + but for "the other case", whatever strategy filter_strategy is set to instead of the minimum sum + heuristic is used. + */ + if(settings->filter_palette_zero && + (info->colortype == LCT_PALETTE || info->bitdepth < 8)) strategy = LFS_ZERO; + + if(bpp == 0) return 31; /*error: invalid color type*/ + + if(strategy == LFS_ZERO) + { + for(y = 0; y != h; ++y) + { + size_t outindex = (1 + linebytes) * y; /*the extra filterbyte added to each row*/ + size_t inindex = linebytes * y; + out[outindex] = 0; /*filter type byte*/ + filterScanline(&out[outindex + 1], &in[inindex], prevline, linebytes, bytewidth, 0); + prevline = &in[inindex]; + } + } + else if(strategy == LFS_MINSUM) + { + /*adaptive filtering*/ + size_t sum[5]; + unsigned char* attempt[5]; /*five filtering attempts, one for each filter type*/ + size_t smallest = 0; + unsigned char type, bestType = 0; + + for(type = 0; type != 5; ++type) + { + attempt[type] = (unsigned char*)lodepng_malloc(linebytes); + if(!attempt[type]) return 83; /*alloc fail*/ + } + + if(!error) + { + for(y = 0; y != h; ++y) + { + /*try the 5 filter types*/ + for(type = 0; type != 5; ++type) + { + filterScanline(attempt[type], &in[y * linebytes], prevline, linebytes, bytewidth, type); + + /*calculate the sum of the result*/ + sum[type] = 0; + if(type == 0) + { + for(x = 0; x != linebytes; ++x) sum[type] += (unsigned char)(attempt[type][x]); + } + else + { + for(x = 0; x != linebytes; ++x) + { + /*For differences, each byte should be treated as signed, values above 127 are negative + (converted to signed char). Filtertype 0 isn't a difference though, so use unsigned there. + This means filtertype 0 is almost never chosen, but that is justified.*/ + unsigned char s = attempt[type][x]; + sum[type] += s < 128 ? s : (255U - s); + } + } + + /*check if this is smallest sum (or if type == 0 it's the first case so always store the values)*/ + if(type == 0 || sum[type] < smallest) + { + bestType = type; + smallest = sum[type]; + } + } + + prevline = &in[y * linebytes]; + + /*now fill the out values*/ + out[y * (linebytes + 1)] = bestType; /*the first byte of a scanline will be the filter type*/ + for(x = 0; x != linebytes; ++x) out[y * (linebytes + 1) + 1 + x] = attempt[bestType][x]; + } + } + + for(type = 0; type != 5; ++type) lodepng_free(attempt[type]); + } + else if(strategy == LFS_ENTROPY) + { + float sum[5]; + unsigned char* attempt[5]; /*five filtering attempts, one for each filter type*/ + float smallest = 0; + unsigned type, bestType = 0; + unsigned count[256]; + + for(type = 0; type != 5; ++type) + { + attempt[type] = (unsigned char*)lodepng_malloc(linebytes); + if(!attempt[type]) return 83; /*alloc fail*/ + } + + for(y = 0; y != h; ++y) + { + /*try the 5 filter types*/ + for(type = 0; type != 5; ++type) + { + filterScanline(attempt[type], &in[y * linebytes], prevline, linebytes, bytewidth, type); + for(x = 0; x != 256; ++x) count[x] = 0; + for(x = 0; x != linebytes; ++x) ++count[attempt[type][x]]; + ++count[type]; /*the filter type itself is part of the scanline*/ + sum[type] = 0; + for(x = 0; x != 256; ++x) + { + float p = count[x] / (float)(linebytes + 1); + sum[type] += count[x] == 0 ? 0 : flog2(1 / p) * p; + } + /*check if this is smallest sum (or if type == 0 it's the first case so always store the values)*/ + if(type == 0 || sum[type] < smallest) + { + bestType = type; + smallest = sum[type]; + } + } + + prevline = &in[y * linebytes]; + + /*now fill the out values*/ + out[y * (linebytes + 1)] = bestType; /*the first byte of a scanline will be the filter type*/ + for(x = 0; x != linebytes; ++x) out[y * (linebytes + 1) + 1 + x] = attempt[bestType][x]; + } + + for(type = 0; type != 5; ++type) lodepng_free(attempt[type]); + } + else if(strategy == LFS_PREDEFINED) + { + for(y = 0; y != h; ++y) + { + size_t outindex = (1 + linebytes) * y; /*the extra filterbyte added to each row*/ + size_t inindex = linebytes * y; + unsigned char type = settings->predefined_filters[y]; + out[outindex] = type; /*filter type byte*/ + filterScanline(&out[outindex + 1], &in[inindex], prevline, linebytes, bytewidth, type); + prevline = &in[inindex]; + } + } + else if(strategy == LFS_BRUTE_FORCE) + { + /*brute force filter chooser. + deflate the scanline after every filter attempt to see which one deflates best. + This is very slow and gives only slightly smaller, sometimes even larger, result*/ + size_t size[5]; + unsigned char* attempt[5]; /*five filtering attempts, one for each filter type*/ + size_t smallest = 0; + unsigned type = 0, bestType = 0; + unsigned char* dummy; + LodePNGCompressSettings zlibsettings = settings->zlibsettings; + /*use fixed tree on the attempts so that the tree is not adapted to the filtertype on purpose, + to simulate the true case where the tree is the same for the whole image. Sometimes it gives + better result with dynamic tree anyway. Using the fixed tree sometimes gives worse, but in rare + cases better compression. It does make this a bit less slow, so it's worth doing this.*/ + zlibsettings.btype = 1; + /*a custom encoder likely doesn't read the btype setting and is optimized for complete PNG + images only, so disable it*/ + zlibsettings.custom_zlib = 0; + zlibsettings.custom_deflate = 0; + for(type = 0; type != 5; ++type) + { + attempt[type] = (unsigned char*)lodepng_malloc(linebytes); + if(!attempt[type]) return 83; /*alloc fail*/ + } + for(y = 0; y != h; ++y) /*try the 5 filter types*/ + { + for(type = 0; type != 5; ++type) + { + size_t testsize = linebytes; + /*if(testsize > 8) testsize /= 8;*/ /*it already works good enough by testing a part of the row*/ + + filterScanline(attempt[type], &in[y * linebytes], prevline, linebytes, bytewidth, type); + size[type] = 0; + dummy = 0; + zlib_compress(&dummy, &size[type], attempt[type], testsize, &zlibsettings); + lodepng_free(dummy); + /*check if this is smallest size (or if type == 0 it's the first case so always store the values)*/ + if(type == 0 || size[type] < smallest) + { + bestType = type; + smallest = size[type]; + } + } + prevline = &in[y * linebytes]; + out[y * (linebytes + 1)] = bestType; /*the first byte of a scanline will be the filter type*/ + for(x = 0; x != linebytes; ++x) out[y * (linebytes + 1) + 1 + x] = attempt[bestType][x]; + } + for(type = 0; type != 5; ++type) lodepng_free(attempt[type]); + } + else return 88; /* unknown filter strategy */ + + return error; +} + +static void addPaddingBits(unsigned char* out, const unsigned char* in, + size_t olinebits, size_t ilinebits, unsigned h) +{ + /*The opposite of the removePaddingBits function + olinebits must be >= ilinebits*/ + unsigned y; + size_t diff = olinebits - ilinebits; + size_t obp = 0, ibp = 0; /*bit pointers*/ + for(y = 0; y != h; ++y) + { + size_t x; + for(x = 0; x < ilinebits; ++x) + { + unsigned char bit = readBitFromReversedStream(&ibp, in); + setBitOfReversedStream(&obp, out, bit); + } + /*obp += diff; --> no, fill in some value in the padding bits too, to avoid + "Use of uninitialised value of size ###" warning from valgrind*/ + for(x = 0; x != diff; ++x) setBitOfReversedStream(&obp, out, 0); + } +} + +/* +in: non-interlaced image with size w*h +out: the same pixels, but re-ordered according to PNG's Adam7 interlacing, with + no padding bits between scanlines, but between reduced images so that each + reduced image starts at a byte. +bpp: bits per pixel +there are no padding bits, not between scanlines, not between reduced images +in has the following size in bits: w * h * bpp. +out is possibly bigger due to padding bits between reduced images +NOTE: comments about padding bits are only relevant if bpp < 8 +*/ +static void Adam7_interlace(unsigned char* out, const unsigned char* in, unsigned w, unsigned h, unsigned bpp) +{ + unsigned passw[7], passh[7]; + size_t filter_passstart[8], padded_passstart[8], passstart[8]; + unsigned i; + + Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp); + + if(bpp >= 8) + { + for(i = 0; i != 7; ++i) + { + unsigned x, y, b; + size_t bytewidth = bpp / 8; + for(y = 0; y < passh[i]; ++y) + for(x = 0; x < passw[i]; ++x) + { + size_t pixelinstart = ((ADAM7_IY[i] + y * ADAM7_DY[i]) * w + ADAM7_IX[i] + x * ADAM7_DX[i]) * bytewidth; + size_t pixeloutstart = passstart[i] + (y * passw[i] + x) * bytewidth; + for(b = 0; b < bytewidth; ++b) + { + out[pixeloutstart + b] = in[pixelinstart + b]; + } + } + } + } + else /*bpp < 8: Adam7 with pixels < 8 bit is a bit trickier: with bit pointers*/ + { + for(i = 0; i != 7; ++i) + { + unsigned x, y, b; + unsigned ilinebits = bpp * passw[i]; + unsigned olinebits = bpp * w; + size_t obp, ibp; /*bit pointers (for out and in buffer)*/ + for(y = 0; y < passh[i]; ++y) + for(x = 0; x < passw[i]; ++x) + { + ibp = (ADAM7_IY[i] + y * ADAM7_DY[i]) * olinebits + (ADAM7_IX[i] + x * ADAM7_DX[i]) * bpp; + obp = (8 * passstart[i]) + (y * ilinebits + x * bpp); + for(b = 0; b < bpp; ++b) + { + unsigned char bit = readBitFromReversedStream(&ibp, in); + setBitOfReversedStream(&obp, out, bit); + } + } + } + } +} + +/*out must be buffer big enough to contain uncompressed IDAT chunk data, and in must contain the full image. +return value is error**/ +static unsigned preProcessScanlines(unsigned char** out, size_t* outsize, const unsigned char* in, + unsigned w, unsigned h, + const LodePNGInfo* info_png, const LodePNGEncoderSettings* settings) +{ + /* + This function converts the pure 2D image with the PNG's colortype, into filtered-padded-interlaced data. Steps: + *) if no Adam7: 1) add padding bits (= posible extra bits per scanline if bpp < 8) 2) filter + *) if adam7: 1) Adam7_interlace 2) 7x add padding bits 3) 7x filter + */ + unsigned bpp = lodepng_get_bpp(&info_png->color); + unsigned error = 0; + + if(info_png->interlace_method == 0) + { + *outsize = h + (h * ((w * bpp + 7) / 8)); /*image size plus an extra byte per scanline + possible padding bits*/ + *out = (unsigned char*)lodepng_malloc(*outsize); + if(!(*out) && (*outsize)) error = 83; /*alloc fail*/ + + if(!error) + { + /*non multiple of 8 bits per scanline, padding bits needed per scanline*/ + if(bpp < 8 && w * bpp != ((w * bpp + 7) / 8) * 8) + { + unsigned char* padded = (unsigned char*)lodepng_malloc(h * ((w * bpp + 7) / 8)); + if(!padded) error = 83; /*alloc fail*/ + if(!error) + { + addPaddingBits(padded, in, ((w * bpp + 7) / 8) * 8, w * bpp, h); + error = filter(*out, padded, w, h, &info_png->color, settings); + } + lodepng_free(padded); + } + else + { + /*we can immediately filter into the out buffer, no other steps needed*/ + error = filter(*out, in, w, h, &info_png->color, settings); + } + } + } + else /*interlace_method is 1 (Adam7)*/ + { + unsigned passw[7], passh[7]; + size_t filter_passstart[8], padded_passstart[8], passstart[8]; + unsigned char* adam7; + + Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp); + + *outsize = filter_passstart[7]; /*image size plus an extra byte per scanline + possible padding bits*/ + *out = (unsigned char*)lodepng_malloc(*outsize); + if(!(*out)) error = 83; /*alloc fail*/ + + adam7 = (unsigned char*)lodepng_malloc(passstart[7]); + if(!adam7 && passstart[7]) error = 83; /*alloc fail*/ + + if(!error) + { + unsigned i; + + Adam7_interlace(adam7, in, w, h, bpp); + for(i = 0; i != 7; ++i) + { + if(bpp < 8) + { + unsigned char* padded = (unsigned char*)lodepng_malloc(padded_passstart[i + 1] - padded_passstart[i]); + if(!padded) ERROR_BREAK(83); /*alloc fail*/ + addPaddingBits(padded, &adam7[passstart[i]], + ((passw[i] * bpp + 7) / 8) * 8, passw[i] * bpp, passh[i]); + error = filter(&(*out)[filter_passstart[i]], padded, + passw[i], passh[i], &info_png->color, settings); + lodepng_free(padded); + } + else + { + error = filter(&(*out)[filter_passstart[i]], &adam7[padded_passstart[i]], + passw[i], passh[i], &info_png->color, settings); + } + + if(error) break; + } + } + + lodepng_free(adam7); + } + + return error; +} + +/* +palette must have 4 * palettesize bytes allocated, and given in format RGBARGBARGBARGBA... +returns 0 if the palette is opaque, +returns 1 if the palette has a single color with alpha 0 ==> color key +returns 2 if the palette is semi-translucent. +*/ +static unsigned getPaletteTranslucency(const unsigned char* palette, size_t palettesize) +{ + size_t i; + unsigned key = 0; + unsigned r = 0, g = 0, b = 0; /*the value of the color with alpha 0, so long as color keying is possible*/ + for(i = 0; i != palettesize; ++i) + { + if(!key && palette[4 * i + 3] == 0) + { + r = palette[4 * i + 0]; g = palette[4 * i + 1]; b = palette[4 * i + 2]; + key = 1; + i = (size_t)(-1); /*restart from beginning, to detect earlier opaque colors with key's value*/ + } + else if(palette[4 * i + 3] != 255) return 2; + /*when key, no opaque RGB may have key's RGB*/ + else if(key && r == palette[i * 4 + 0] && g == palette[i * 4 + 1] && b == palette[i * 4 + 2]) return 2; + } + return key; +} + +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS +static unsigned addUnknownChunks(ucvector* out, unsigned char* data, size_t datasize) +{ + unsigned char* inchunk = data; + while((size_t)(inchunk - data) < datasize) + { + CERROR_TRY_RETURN(lodepng_chunk_append(&out->data, &out->size, inchunk)); + out->allocsize = out->size; /*fix the allocsize again*/ + inchunk = lodepng_chunk_next(inchunk); + } + return 0; +} +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + +unsigned lodepng_encode(unsigned char** out, size_t* outsize, + const unsigned char* image, unsigned w, unsigned h, + LodePNGState* state) +{ + LodePNGInfo info; + ucvector outv; + unsigned char* data = 0; /*uncompressed version of the IDAT chunk data*/ + size_t datasize = 0; + + /*provide some proper output values if error will happen*/ + *out = 0; + *outsize = 0; + state->error = 0; + + lodepng_info_init(&info); + lodepng_info_copy(&info, &state->info_png); + + if((info.color.colortype == LCT_PALETTE || state->encoder.force_palette) + && (info.color.palettesize == 0 || info.color.palettesize > 256)) + { + state->error = 68; /*invalid palette size, it is only allowed to be 1-256*/ + return state->error; + } + + if(state->encoder.auto_convert) + { + state->error = lodepng_auto_choose_color(&info.color, image, w, h, &state->info_raw); + } + if(state->error) return state->error; + + if(state->encoder.zlibsettings.btype > 2) + { + CERROR_RETURN_ERROR(state->error, 61); /*error: unexisting btype*/ + } + if(state->info_png.interlace_method > 1) + { + CERROR_RETURN_ERROR(state->error, 71); /*error: unexisting interlace mode*/ + } + + state->error = checkColorValidity(info.color.colortype, info.color.bitdepth); + if(state->error) return state->error; /*error: unexisting color type given*/ + state->error = checkColorValidity(state->info_raw.colortype, state->info_raw.bitdepth); + if(state->error) return state->error; /*error: unexisting color type given*/ + + if(!lodepng_color_mode_equal(&state->info_raw, &info.color)) + { + unsigned char* converted; + size_t size = (w * h * lodepng_get_bpp(&info.color) + 7) / 8; + + converted = (unsigned char*)lodepng_malloc(size); + if(!converted && size) state->error = 83; /*alloc fail*/ + if(!state->error) + { + state->error = lodepng_convert(converted, image, &info.color, &state->info_raw, w, h); + } + if(!state->error) preProcessScanlines(&data, &datasize, converted, w, h, &info, &state->encoder); + lodepng_free(converted); + } + else preProcessScanlines(&data, &datasize, image, w, h, &info, &state->encoder); + + ucvector_init(&outv); + while(!state->error) /*while only executed once, to break on error*/ + { +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + size_t i; +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + /*write signature and chunks*/ + writeSignature(&outv); + /*IHDR*/ + addChunk_IHDR(&outv, w, h, info.color.colortype, info.color.bitdepth, info.interlace_method); +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + /*unknown chunks between IHDR and PLTE*/ + if(info.unknown_chunks_data[0]) + { + state->error = addUnknownChunks(&outv, info.unknown_chunks_data[0], info.unknown_chunks_size[0]); + if(state->error) break; + } +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + /*PLTE*/ + if(info.color.colortype == LCT_PALETTE) + { + addChunk_PLTE(&outv, &info.color); + } + if(state->encoder.force_palette && (info.color.colortype == LCT_RGB || info.color.colortype == LCT_RGBA)) + { + addChunk_PLTE(&outv, &info.color); + } + /*tRNS*/ + if(info.color.colortype == LCT_PALETTE && getPaletteTranslucency(info.color.palette, info.color.palettesize) != 0) + { + addChunk_tRNS(&outv, &info.color); + } + if((info.color.colortype == LCT_GREY || info.color.colortype == LCT_RGB) && info.color.key_defined) + { + addChunk_tRNS(&outv, &info.color); + } +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + /*bKGD (must come between PLTE and the IDAt chunks*/ + if(info.background_defined) addChunk_bKGD(&outv, &info); + /*pHYs (must come before the IDAT chunks)*/ + if(info.phys_defined) addChunk_pHYs(&outv, &info); + + /*unknown chunks between PLTE and IDAT*/ + if(info.unknown_chunks_data[1]) + { + state->error = addUnknownChunks(&outv, info.unknown_chunks_data[1], info.unknown_chunks_size[1]); + if(state->error) break; + } +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + /*IDAT (multiple IDAT chunks must be consecutive)*/ + state->error = addChunk_IDAT(&outv, data, datasize, &state->encoder.zlibsettings); + if(state->error) break; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + /*tIME*/ + if(info.time_defined) addChunk_tIME(&outv, &info.time); + /*tEXt and/or zTXt*/ + for(i = 0; i != info.text_num; ++i) + { + if(strlen(info.text_keys[i]) > 79) + { + state->error = 66; /*text chunk too large*/ + break; + } + if(strlen(info.text_keys[i]) < 1) + { + state->error = 67; /*text chunk too small*/ + break; + } + if(state->encoder.text_compression) + { + addChunk_zTXt(&outv, info.text_keys[i], info.text_strings[i], &state->encoder.zlibsettings); + } + else + { + addChunk_tEXt(&outv, info.text_keys[i], info.text_strings[i]); + } + } + /*LodePNG version id in text chunk*/ + if(state->encoder.add_id) + { + unsigned alread_added_id_text = 0; + for(i = 0; i != info.text_num; ++i) + { + if(!strcmp(info.text_keys[i], "LodePNG")) + { + alread_added_id_text = 1; + break; + } + } + if(alread_added_id_text == 0) + { + addChunk_tEXt(&outv, "LodePNG", LODEPNG_VERSION_STRING); /*it's shorter as tEXt than as zTXt chunk*/ + } + } + /*iTXt*/ + for(i = 0; i != info.itext_num; ++i) + { + if(strlen(info.itext_keys[i]) > 79) + { + state->error = 66; /*text chunk too large*/ + break; + } + if(strlen(info.itext_keys[i]) < 1) + { + state->error = 67; /*text chunk too small*/ + break; + } + addChunk_iTXt(&outv, state->encoder.text_compression, + info.itext_keys[i], info.itext_langtags[i], info.itext_transkeys[i], info.itext_strings[i], + &state->encoder.zlibsettings); + } + + /*unknown chunks between IDAT and IEND*/ + if(info.unknown_chunks_data[2]) + { + state->error = addUnknownChunks(&outv, info.unknown_chunks_data[2], info.unknown_chunks_size[2]); + if(state->error) break; + } +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + addChunk_IEND(&outv); + + break; /*this isn't really a while loop; no error happened so break out now!*/ + } + + lodepng_info_cleanup(&info); + lodepng_free(data); + /*instead of cleaning the vector up, give it to the output*/ + *out = outv.data; + *outsize = outv.size; + + return state->error; +} + +unsigned lodepng_encode_memory(unsigned char** out, size_t* outsize, const unsigned char* image, + unsigned w, unsigned h, LodePNGColorType colortype, unsigned bitdepth) +{ + unsigned error; + LodePNGState state; + lodepng_state_init(&state); + state.info_raw.colortype = colortype; + state.info_raw.bitdepth = bitdepth; + state.info_png.color.colortype = colortype; + state.info_png.color.bitdepth = bitdepth; + lodepng_encode(out, outsize, image, w, h, &state); + error = state.error; + lodepng_state_cleanup(&state); + return error; +} + +unsigned lodepng_encode32(unsigned char** out, size_t* outsize, const unsigned char* image, unsigned w, unsigned h) +{ + return lodepng_encode_memory(out, outsize, image, w, h, LCT_RGBA, 8); +} + +unsigned lodepng_encode24(unsigned char** out, size_t* outsize, const unsigned char* image, unsigned w, unsigned h) +{ + return lodepng_encode_memory(out, outsize, image, w, h, LCT_RGB, 8); +} + +#ifdef LODEPNG_COMPILE_DISK +unsigned lodepng_encode_file(const char* filename, const unsigned char* image, unsigned w, unsigned h, + LodePNGColorType colortype, unsigned bitdepth) +{ + unsigned char* buffer; + size_t buffersize; + unsigned error = lodepng_encode_memory(&buffer, &buffersize, image, w, h, colortype, bitdepth); + if(!error) error = lodepng_save_file(buffer, buffersize, filename); + lodepng_free(buffer); + return error; +} + +unsigned lodepng_encode32_file(const char* filename, const unsigned char* image, unsigned w, unsigned h) +{ + return lodepng_encode_file(filename, image, w, h, LCT_RGBA, 8); +} + +unsigned lodepng_encode24_file(const char* filename, const unsigned char* image, unsigned w, unsigned h) +{ + return lodepng_encode_file(filename, image, w, h, LCT_RGB, 8); +} +#endif /*LODEPNG_COMPILE_DISK*/ + +void lodepng_encoder_settings_init(LodePNGEncoderSettings* settings) +{ + lodepng_compress_settings_init(&settings->zlibsettings); + settings->filter_palette_zero = 1; + settings->filter_strategy = LFS_MINSUM; + settings->auto_convert = 1; + settings->force_palette = 0; + settings->predefined_filters = 0; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + settings->add_id = 0; + settings->text_compression = 1; +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ +} + +#endif /*LODEPNG_COMPILE_ENCODER*/ +#endif /*LODEPNG_COMPILE_PNG*/ + +#ifdef LODEPNG_COMPILE_ERROR_TEXT +/* +This returns the description of a numerical error code in English. This is also +the documentation of all the error codes. +*/ +const char* lodepng_error_text(unsigned code) +{ + switch(code) + { + case 0: return "no error, everything went ok"; + case 1: return "nothing done yet"; /*the Encoder/Decoder has done nothing yet, error checking makes no sense yet*/ + case 10: return "end of input memory reached without huffman end code"; /*while huffman decoding*/ + case 11: return "error in code tree made it jump outside of huffman tree"; /*while huffman decoding*/ + case 13: return "problem while processing dynamic deflate block"; + case 14: return "problem while processing dynamic deflate block"; + case 15: return "problem while processing dynamic deflate block"; + case 16: return "unexisting code while processing dynamic deflate block"; + case 17: return "end of out buffer memory reached while inflating"; + case 18: return "invalid distance code while inflating"; + case 19: return "end of out buffer memory reached while inflating"; + case 20: return "invalid deflate block BTYPE encountered while decoding"; + case 21: return "NLEN is not ones complement of LEN in a deflate block"; + /*end of out buffer memory reached while inflating: + This can happen if the inflated deflate data is longer than the amount of bytes required to fill up + all the pixels of the image, given the color depth and image dimensions. Something that doesn't + happen in a normal, well encoded, PNG image.*/ + case 22: return "end of out buffer memory reached while inflating"; + case 23: return "end of in buffer memory reached while inflating"; + case 24: return "invalid FCHECK in zlib header"; + case 25: return "invalid compression method in zlib header"; + case 26: return "FDICT encountered in zlib header while it's not used for PNG"; + case 27: return "PNG file is smaller than a PNG header"; + /*Checks the magic file header, the first 8 bytes of the PNG file*/ + case 28: return "incorrect PNG signature, it's no PNG or corrupted"; + case 29: return "first chunk is not the header chunk"; + case 30: return "chunk length too large, chunk broken off at end of file"; + case 31: return "illegal PNG color type or bpp"; + case 32: return "illegal PNG compression method"; + case 33: return "illegal PNG filter method"; + case 34: return "illegal PNG interlace method"; + case 35: return "chunk length of a chunk is too large or the chunk too small"; + case 36: return "illegal PNG filter type encountered"; + case 37: return "illegal bit depth for this color type given"; + case 38: return "the palette is too big"; /*more than 256 colors*/ + case 39: return "more palette alpha values given in tRNS chunk than there are colors in the palette"; + case 40: return "tRNS chunk has wrong size for greyscale image"; + case 41: return "tRNS chunk has wrong size for RGB image"; + case 42: return "tRNS chunk appeared while it was not allowed for this color type"; + case 43: return "bKGD chunk has wrong size for palette image"; + case 44: return "bKGD chunk has wrong size for greyscale image"; + case 45: return "bKGD chunk has wrong size for RGB image"; + case 48: return "empty input buffer given to decoder. Maybe caused by non-existing file?"; + case 49: return "jumped past memory while generating dynamic huffman tree"; + case 50: return "jumped past memory while generating dynamic huffman tree"; + case 51: return "jumped past memory while inflating huffman block"; + case 52: return "jumped past memory while inflating"; + case 53: return "size of zlib data too small"; + case 54: return "repeat symbol in tree while there was no value symbol yet"; + /*jumped past tree while generating huffman tree, this could be when the + tree will have more leaves than symbols after generating it out of the + given lenghts. They call this an oversubscribed dynamic bit lengths tree in zlib.*/ + case 55: return "jumped past tree while generating huffman tree"; + case 56: return "given output image colortype or bitdepth not supported for color conversion"; + case 57: return "invalid CRC encountered (checking CRC can be disabled)"; + case 58: return "invalid ADLER32 encountered (checking ADLER32 can be disabled)"; + case 59: return "requested color conversion not supported"; + case 60: return "invalid window size given in the settings of the encoder (must be 0-32768)"; + case 61: return "invalid BTYPE given in the settings of the encoder (only 0, 1 and 2 are allowed)"; + /*LodePNG leaves the choice of RGB to greyscale conversion formula to the user.*/ + case 62: return "conversion from color to greyscale not supported"; + case 63: return "length of a chunk too long, max allowed for PNG is 2147483647 bytes per chunk"; /*(2^31-1)*/ + /*this would result in the inability of a deflated block to ever contain an end code. It must be at least 1.*/ + case 64: return "the length of the END symbol 256 in the Huffman tree is 0"; + case 66: return "the length of a text chunk keyword given to the encoder is longer than the maximum of 79 bytes"; + case 67: return "the length of a text chunk keyword given to the encoder is smaller than the minimum of 1 byte"; + case 68: return "tried to encode a PLTE chunk with a palette that has less than 1 or more than 256 colors"; + case 69: return "unknown chunk type with 'critical' flag encountered by the decoder"; + case 71: return "unexisting interlace mode given to encoder (must be 0 or 1)"; + case 72: return "while decoding, unexisting compression method encountering in zTXt or iTXt chunk (it must be 0)"; + case 73: return "invalid tIME chunk size"; + case 74: return "invalid pHYs chunk size"; + /*length could be wrong, or data chopped off*/ + case 75: return "no null termination char found while decoding text chunk"; + case 76: return "iTXt chunk too short to contain required bytes"; + case 77: return "integer overflow in buffer size"; + case 78: return "failed to open file for reading"; /*file doesn't exist or couldn't be opened for reading*/ + case 79: return "failed to open file for writing"; + case 80: return "tried creating a tree of 0 symbols"; + case 81: return "lazy matching at pos 0 is impossible"; + case 82: return "color conversion to palette requested while a color isn't in palette"; + case 83: return "memory allocation failed"; + case 84: return "given image too small to contain all pixels to be encoded"; + case 86: return "impossible offset in lz77 encoding (internal bug)"; + case 87: return "must provide custom zlib function pointer if LODEPNG_COMPILE_ZLIB is not defined"; + case 88: return "invalid filter strategy given for LodePNGEncoderSettings.filter_strategy"; + case 89: return "text chunk keyword too short or long: must have size 1-79"; + /*the windowsize in the LodePNGCompressSettings. Requiring POT(==> & instead of %) makes encoding 12% faster.*/ + case 90: return "windowsize must be a power of two"; + case 91: return "invalid decompressed idat size"; + case 92: return "too many pixels, not supported"; + case 93: return "zero width or height is invalid"; + case 94: return "header chunk must have a size of 13 bytes"; + } + return "unknown error code"; +} +#endif /*LODEPNG_COMPILE_ERROR_TEXT*/ + +/* ////////////////////////////////////////////////////////////////////////// */ +/* ////////////////////////////////////////////////////////////////////////// */ +/* // C++ Wrapper // */ +/* ////////////////////////////////////////////////////////////////////////// */ +/* ////////////////////////////////////////////////////////////////////////// */ + +#ifdef LODEPNG_COMPILE_CPP +namespace lodepng +{ + +#ifdef LODEPNG_COMPILE_DISK +unsigned load_file(std::vector& buffer, const std::string& filename) +{ + long size = lodepng_filesize(filename.c_str()); + if(size < 0) return 78; + buffer.resize((size_t)size); + return size == 0 ? 0 : lodepng_buffer_file(&buffer[0], (size_t)size, filename.c_str()); +} + +/*write given buffer to the file, overwriting the file, it doesn't append to it.*/ +unsigned save_file(const std::vector& buffer, const std::string& filename) +{ + return lodepng_save_file(buffer.empty() ? 0 : &buffer[0], buffer.size(), filename.c_str()); +} +#endif /* LODEPNG_COMPILE_DISK */ + +#ifdef LODEPNG_COMPILE_ZLIB +#ifdef LODEPNG_COMPILE_DECODER +unsigned decompress(std::vector& out, const unsigned char* in, size_t insize, + const LodePNGDecompressSettings& settings) +{ + unsigned char* buffer = 0; + size_t buffersize = 0; + unsigned error = zlib_decompress(&buffer, &buffersize, in, insize, &settings); + if(buffer) + { + out.insert(out.end(), &buffer[0], &buffer[buffersize]); + lodepng_free(buffer); + } + return error; +} + +unsigned decompress(std::vector& out, const std::vector& in, + const LodePNGDecompressSettings& settings) +{ + return decompress(out, in.empty() ? 0 : &in[0], in.size(), settings); +} +#endif /* LODEPNG_COMPILE_DECODER */ + +#ifdef LODEPNG_COMPILE_ENCODER +unsigned compress(std::vector& out, const unsigned char* in, size_t insize, + const LodePNGCompressSettings& settings) +{ + unsigned char* buffer = 0; + size_t buffersize = 0; + unsigned error = zlib_compress(&buffer, &buffersize, in, insize, &settings); + if(buffer) + { + out.insert(out.end(), &buffer[0], &buffer[buffersize]); + lodepng_free(buffer); + } + return error; +} + +unsigned compress(std::vector& out, const std::vector& in, + const LodePNGCompressSettings& settings) +{ + return compress(out, in.empty() ? 0 : &in[0], in.size(), settings); +} +#endif /* LODEPNG_COMPILE_ENCODER */ +#endif /* LODEPNG_COMPILE_ZLIB */ + + +#ifdef LODEPNG_COMPILE_PNG + +State::State() +{ + lodepng_state_init(this); +} + +State::State(const State& other) +{ + lodepng_state_init(this); + lodepng_state_copy(this, &other); +} + +State::~State() +{ + lodepng_state_cleanup(this); +} + +State& State::operator=(const State& other) +{ + lodepng_state_copy(this, &other); + return *this; +} + +#ifdef LODEPNG_COMPILE_DECODER + +unsigned decode(std::vector& out, unsigned& w, unsigned& h, const unsigned char* in, + size_t insize, LodePNGColorType colortype, unsigned bitdepth) +{ + unsigned char* buffer; + unsigned error = lodepng_decode_memory(&buffer, &w, &h, in, insize, colortype, bitdepth); + if(buffer && !error) + { + State state; + state.info_raw.colortype = colortype; + state.info_raw.bitdepth = bitdepth; + size_t buffersize = lodepng_get_raw_size(w, h, &state.info_raw); + out.insert(out.end(), &buffer[0], &buffer[buffersize]); + lodepng_free(buffer); + } + return error; +} + +unsigned decode(std::vector& out, unsigned& w, unsigned& h, + const std::vector& in, LodePNGColorType colortype, unsigned bitdepth) +{ + return decode(out, w, h, in.empty() ? 0 : &in[0], (unsigned)in.size(), colortype, bitdepth); +} + +unsigned decode(std::vector& out, unsigned& w, unsigned& h, + State& state, + const unsigned char* in, size_t insize) +{ + unsigned char* buffer = NULL; + unsigned error = lodepng_decode(&buffer, &w, &h, &state, in, insize); + if(buffer && !error) + { + size_t buffersize = lodepng_get_raw_size(w, h, &state.info_raw); + out.insert(out.end(), &buffer[0], &buffer[buffersize]); + } + lodepng_free(buffer); + return error; +} + +unsigned decode(std::vector& out, unsigned& w, unsigned& h, + State& state, + const std::vector& in) +{ + return decode(out, w, h, state, in.empty() ? 0 : &in[0], in.size()); +} + +#ifdef LODEPNG_COMPILE_DISK +unsigned decode(std::vector& out, unsigned& w, unsigned& h, const std::string& filename, + LodePNGColorType colortype, unsigned bitdepth) +{ + std::vector buffer; + unsigned error = load_file(buffer, filename); + if(error) return error; + return decode(out, w, h, buffer, colortype, bitdepth); +} +#endif /* LODEPNG_COMPILE_DECODER */ +#endif /* LODEPNG_COMPILE_DISK */ + +#ifdef LODEPNG_COMPILE_ENCODER +unsigned encode(std::vector& out, const unsigned char* in, unsigned w, unsigned h, + LodePNGColorType colortype, unsigned bitdepth) +{ + unsigned char* buffer; + size_t buffersize; + unsigned error = lodepng_encode_memory(&buffer, &buffersize, in, w, h, colortype, bitdepth); + if(buffer) + { + out.insert(out.end(), &buffer[0], &buffer[buffersize]); + lodepng_free(buffer); + } + return error; +} + +unsigned encode(std::vector& out, + const std::vector& in, unsigned w, unsigned h, + LodePNGColorType colortype, unsigned bitdepth) +{ + if(lodepng_get_raw_size_lct(w, h, colortype, bitdepth) > in.size()) return 84; + return encode(out, in.empty() ? 0 : &in[0], w, h, colortype, bitdepth); +} + +unsigned encode(std::vector& out, + const unsigned char* in, unsigned w, unsigned h, + State& state) +{ + unsigned char* buffer; + size_t buffersize; + unsigned error = lodepng_encode(&buffer, &buffersize, in, w, h, &state); + if(buffer) + { + out.insert(out.end(), &buffer[0], &buffer[buffersize]); + lodepng_free(buffer); + } + return error; +} + +unsigned encode(std::vector& out, + const std::vector& in, unsigned w, unsigned h, + State& state) +{ + if(lodepng_get_raw_size(w, h, &state.info_raw) > in.size()) return 84; + return encode(out, in.empty() ? 0 : &in[0], w, h, state); +} + +#ifdef LODEPNG_COMPILE_DISK +unsigned encode(const std::string& filename, + const unsigned char* in, unsigned w, unsigned h, + LodePNGColorType colortype, unsigned bitdepth) +{ + std::vector buffer; + unsigned error = encode(buffer, in, w, h, colortype, bitdepth); + if(!error) error = save_file(buffer, filename); + return error; +} + +unsigned encode(const std::string& filename, + const std::vector& in, unsigned w, unsigned h, + LodePNGColorType colortype, unsigned bitdepth) +{ + if(lodepng_get_raw_size_lct(w, h, colortype, bitdepth) > in.size()) return 84; + return encode(filename, in.empty() ? 0 : &in[0], w, h, colortype, bitdepth); +} +#endif /* LODEPNG_COMPILE_DISK */ +#endif /* LODEPNG_COMPILE_ENCODER */ +#endif /* LODEPNG_COMPILE_PNG */ +} /* namespace lodepng */ +#endif /*LODEPNG_COMPILE_CPP*/ diff --git a/xdl/third_party/tbb/examples/graph/stereo/lodepng.h b/xdl/third_party/tbb/examples/graph/stereo/lodepng.h new file mode 100644 index 00000000..91f769ba --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/stereo/lodepng.h @@ -0,0 +1,1778 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +/* +LodePNG version 20160409 + +Copyright (c) 2005-2016 Lode Vandevenne + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + + 3. This notice may not be removed or altered from any source + distribution. +*/ + +#ifndef LODEPNG_H +#define LODEPNG_H + +#include /*for size_t*/ + +extern const char* LODEPNG_VERSION_STRING; + +/* +The following #defines are used to create code sections. They can be disabled +to disable code sections, which can give faster compile time and smaller binary. +The "NO_COMPILE" defines are designed to be used to pass as defines to the +compiler command to disable them without modifying this header, e.g. +-DLODEPNG_NO_COMPILE_ZLIB for gcc. +In addition to those below, you can also define LODEPNG_NO_COMPILE_CRC to +allow implementing a custom lodepng_crc32. +*/ +/*deflate & zlib. If disabled, you must specify alternative zlib functions in +the custom_zlib field of the compress and decompress settings*/ +#ifndef LODEPNG_NO_COMPILE_ZLIB +#define LODEPNG_COMPILE_ZLIB +#endif +/*png encoder and png decoder*/ +#ifndef LODEPNG_NO_COMPILE_PNG +#define LODEPNG_COMPILE_PNG +#endif +/*deflate&zlib decoder and png decoder*/ +#ifndef LODEPNG_NO_COMPILE_DECODER +#define LODEPNG_COMPILE_DECODER +#endif +/*deflate&zlib encoder and png encoder*/ +#ifndef LODEPNG_NO_COMPILE_ENCODER +#define LODEPNG_COMPILE_ENCODER +#endif +/*the optional built in harddisk file loading and saving functions*/ +#ifndef LODEPNG_NO_COMPILE_DISK +#define LODEPNG_COMPILE_DISK +#endif +/*support for chunks other than IHDR, IDAT, PLTE, tRNS, IEND: ancillary and unknown chunks*/ +#ifndef LODEPNG_NO_COMPILE_ANCILLARY_CHUNKS +#define LODEPNG_COMPILE_ANCILLARY_CHUNKS +#endif +/*ability to convert error numerical codes to English text string*/ +#ifndef LODEPNG_NO_COMPILE_ERROR_TEXT +#define LODEPNG_COMPILE_ERROR_TEXT +#endif +/*Compile the default allocators (C's free, malloc and realloc). If you disable this, +you can define the functions lodepng_free, lodepng_malloc and lodepng_realloc in your +source files with custom allocators.*/ +#ifndef LODEPNG_NO_COMPILE_ALLOCATORS +#define LODEPNG_COMPILE_ALLOCATORS +#endif +/*compile the C++ version (you can disable the C++ wrapper here even when compiling for C++)*/ +#ifdef __cplusplus +#ifndef LODEPNG_NO_COMPILE_CPP +#define LODEPNG_COMPILE_CPP +#endif +#endif + +#ifdef LODEPNG_COMPILE_CPP +#include +#include +#endif /*LODEPNG_COMPILE_CPP*/ + +#ifdef LODEPNG_COMPILE_PNG +/*The PNG color types (also used for raw).*/ +typedef enum LodePNGColorType +{ + LCT_GREY = 0, /*greyscale: 1,2,4,8,16 bit*/ + LCT_RGB = 2, /*RGB: 8,16 bit*/ + LCT_PALETTE = 3, /*palette: 1,2,4,8 bit*/ + LCT_GREY_ALPHA = 4, /*greyscale with alpha: 8,16 bit*/ + LCT_RGBA = 6 /*RGB with alpha: 8,16 bit*/ +} LodePNGColorType; + +#ifdef LODEPNG_COMPILE_DECODER +/* +Converts PNG data in memory to raw pixel data. +out: Output parameter. Pointer to buffer that will contain the raw pixel data. + After decoding, its size is w * h * (bytes per pixel) bytes larger than + initially. Bytes per pixel depends on colortype and bitdepth. + Must be freed after usage with free(*out). + Note: for 16-bit per channel colors, uses big endian format like PNG does. +w: Output parameter. Pointer to width of pixel data. +h: Output parameter. Pointer to height of pixel data. +in: Memory buffer with the PNG file. +insize: size of the in buffer. +colortype: the desired color type for the raw output image. See explanation on PNG color types. +bitdepth: the desired bit depth for the raw output image. See explanation on PNG color types. +Return value: LodePNG error code (0 means no error). +*/ +unsigned lodepng_decode_memory(unsigned char** out, unsigned* w, unsigned* h, + const unsigned char* in, size_t insize, + LodePNGColorType colortype, unsigned bitdepth); + +/*Same as lodepng_decode_memory, but always decodes to 32-bit RGBA raw image*/ +unsigned lodepng_decode32(unsigned char** out, unsigned* w, unsigned* h, + const unsigned char* in, size_t insize); + +/*Same as lodepng_decode_memory, but always decodes to 24-bit RGB raw image*/ +unsigned lodepng_decode24(unsigned char** out, unsigned* w, unsigned* h, + const unsigned char* in, size_t insize); + +#ifdef LODEPNG_COMPILE_DISK +/* +Load PNG from disk, from file with given name. +Same as the other decode functions, but instead takes a filename as input. +*/ +unsigned lodepng_decode_file(unsigned char** out, unsigned* w, unsigned* h, + const char* filename, + LodePNGColorType colortype, unsigned bitdepth); + +/*Same as lodepng_decode_file, but always decodes to 32-bit RGBA raw image.*/ +unsigned lodepng_decode32_file(unsigned char** out, unsigned* w, unsigned* h, + const char* filename); + +/*Same as lodepng_decode_file, but always decodes to 24-bit RGB raw image.*/ +unsigned lodepng_decode24_file(unsigned char** out, unsigned* w, unsigned* h, + const char* filename); +#endif /*LODEPNG_COMPILE_DISK*/ +#endif /*LODEPNG_COMPILE_DECODER*/ + + +#ifdef LODEPNG_COMPILE_ENCODER +/* +Converts raw pixel data into a PNG image in memory. The colortype and bitdepth + of the output PNG image cannot be chosen, they are automatically determined + by the colortype, bitdepth and content of the input pixel data. + Note: for 16-bit per channel colors, needs big endian format like PNG does. +out: Output parameter. Pointer to buffer that will contain the PNG image data. + Must be freed after usage with free(*out). +outsize: Output parameter. Pointer to the size in bytes of the out buffer. +image: The raw pixel data to encode. The size of this buffer should be + w * h * (bytes per pixel), bytes per pixel depends on colortype and bitdepth. +w: width of the raw pixel data in pixels. +h: height of the raw pixel data in pixels. +colortype: the color type of the raw input image. See explanation on PNG color types. +bitdepth: the bit depth of the raw input image. See explanation on PNG color types. +Return value: LodePNG error code (0 means no error). +*/ +unsigned lodepng_encode_memory(unsigned char** out, size_t* outsize, + const unsigned char* image, unsigned w, unsigned h, + LodePNGColorType colortype, unsigned bitdepth); + +/*Same as lodepng_encode_memory, but always encodes from 32-bit RGBA raw image.*/ +unsigned lodepng_encode32(unsigned char** out, size_t* outsize, + const unsigned char* image, unsigned w, unsigned h); + +/*Same as lodepng_encode_memory, but always encodes from 24-bit RGB raw image.*/ +unsigned lodepng_encode24(unsigned char** out, size_t* outsize, + const unsigned char* image, unsigned w, unsigned h); + +#ifdef LODEPNG_COMPILE_DISK +/* +Converts raw pixel data into a PNG file on disk. +Same as the other encode functions, but instead takes a filename as output. +NOTE: This overwrites existing files without warning! +*/ +unsigned lodepng_encode_file(const char* filename, + const unsigned char* image, unsigned w, unsigned h, + LodePNGColorType colortype, unsigned bitdepth); + +/*Same as lodepng_encode_file, but always encodes from 32-bit RGBA raw image.*/ +unsigned lodepng_encode32_file(const char* filename, + const unsigned char* image, unsigned w, unsigned h); + +/*Same as lodepng_encode_file, but always encodes from 24-bit RGB raw image.*/ +unsigned lodepng_encode24_file(const char* filename, + const unsigned char* image, unsigned w, unsigned h); +#endif /*LODEPNG_COMPILE_DISK*/ +#endif /*LODEPNG_COMPILE_ENCODER*/ + + +#ifdef LODEPNG_COMPILE_CPP +namespace lodepng +{ +#ifdef LODEPNG_COMPILE_DECODER +/*Same as lodepng_decode_memory, but decodes to an std::vector. The colortype +is the format to output the pixels to. Default is RGBA 8-bit per channel.*/ +unsigned decode(std::vector& out, unsigned& w, unsigned& h, + const unsigned char* in, size_t insize, + LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); +unsigned decode(std::vector& out, unsigned& w, unsigned& h, + const std::vector& in, + LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); +#ifdef LODEPNG_COMPILE_DISK +/* +Converts PNG file from disk to raw pixel data in memory. +Same as the other decode functions, but instead takes a filename as input. +*/ +unsigned decode(std::vector& out, unsigned& w, unsigned& h, + const std::string& filename, + LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); +#endif /* LODEPNG_COMPILE_DISK */ +#endif /* LODEPNG_COMPILE_DECODER */ + +#ifdef LODEPNG_COMPILE_ENCODER +/*Same as lodepng_encode_memory, but encodes to an std::vector. colortype +is that of the raw input data. The output PNG color type will be auto chosen.*/ +unsigned encode(std::vector& out, + const unsigned char* in, unsigned w, unsigned h, + LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); +unsigned encode(std::vector& out, + const std::vector& in, unsigned w, unsigned h, + LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); +#ifdef LODEPNG_COMPILE_DISK +/* +Converts 32-bit RGBA raw pixel data into a PNG file on disk. +Same as the other encode functions, but instead takes a filename as output. +NOTE: This overwrites existing files without warning! +*/ +unsigned encode(const std::string& filename, + const unsigned char* in, unsigned w, unsigned h, + LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); +unsigned encode(const std::string& filename, + const std::vector& in, unsigned w, unsigned h, + LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); +#endif /* LODEPNG_COMPILE_DISK */ +#endif /* LODEPNG_COMPILE_ENCODER */ +} /* namespace lodepng */ +#endif /*LODEPNG_COMPILE_CPP*/ +#endif /*LODEPNG_COMPILE_PNG*/ + +#ifdef LODEPNG_COMPILE_ERROR_TEXT +/*Returns an English description of the numerical error code.*/ +const char* lodepng_error_text(unsigned code); +#endif /*LODEPNG_COMPILE_ERROR_TEXT*/ + +#ifdef LODEPNG_COMPILE_DECODER +/*Settings for zlib decompression*/ +typedef struct LodePNGDecompressSettings LodePNGDecompressSettings; +struct LodePNGDecompressSettings +{ + unsigned ignore_adler32; /*if 1, continue and don't give an error message if the Adler32 checksum is corrupted*/ + + /*use custom zlib decoder instead of built in one (default: null)*/ + unsigned (*custom_zlib)(unsigned char**, size_t*, + const unsigned char*, size_t, + const LodePNGDecompressSettings*); + /*use custom deflate decoder instead of built in one (default: null) + if custom_zlib is used, custom_deflate is ignored since only the built in + zlib function will call custom_deflate*/ + unsigned (*custom_inflate)(unsigned char**, size_t*, + const unsigned char*, size_t, + const LodePNGDecompressSettings*); + + const void* custom_context; /*optional custom settings for custom functions*/ +}; + +extern const LodePNGDecompressSettings lodepng_default_decompress_settings; +void lodepng_decompress_settings_init(LodePNGDecompressSettings* settings); +#endif /*LODEPNG_COMPILE_DECODER*/ + +#ifdef LODEPNG_COMPILE_ENCODER +/* +Settings for zlib compression. Tweaking these settings tweaks the balance +between speed and compression ratio. +*/ +typedef struct LodePNGCompressSettings LodePNGCompressSettings; +struct LodePNGCompressSettings /*deflate = compress*/ +{ + /*LZ77 related settings*/ + unsigned btype; /*the block type for LZ (0, 1, 2 or 3, see zlib standard). Should be 2 for proper compression.*/ + unsigned use_lz77; /*whether or not to use LZ77. Should be 1 for proper compression.*/ + unsigned windowsize; /*must be a power of two <= 32768. higher compresses more but is slower. Default value: 2048.*/ + unsigned minmatch; /*mininum lz77 length. 3 is normally best, 6 can be better for some PNGs. Default: 0*/ + unsigned nicematch; /*stop searching if >= this length found. Set to 258 for best compression. Default: 128*/ + unsigned lazymatching; /*use lazy matching: better compression but a bit slower. Default: true*/ + + /*use custom zlib encoder instead of built in one (default: null)*/ + unsigned (*custom_zlib)(unsigned char**, size_t*, + const unsigned char*, size_t, + const LodePNGCompressSettings*); + /*use custom deflate encoder instead of built in one (default: null) + if custom_zlib is used, custom_deflate is ignored since only the built in + zlib function will call custom_deflate*/ + unsigned (*custom_deflate)(unsigned char**, size_t*, + const unsigned char*, size_t, + const LodePNGCompressSettings*); + + const void* custom_context; /*optional custom settings for custom functions*/ +}; + +extern const LodePNGCompressSettings lodepng_default_compress_settings; +void lodepng_compress_settings_init(LodePNGCompressSettings* settings); +#endif /*LODEPNG_COMPILE_ENCODER*/ + +#ifdef LODEPNG_COMPILE_PNG +/* +Color mode of an image. Contains all information required to decode the pixel +bits to RGBA colors. This information is the same as used in the PNG file +format, and is used both for PNG and raw image data in LodePNG. +*/ +typedef struct LodePNGColorMode +{ + /*header (IHDR)*/ + LodePNGColorType colortype; /*color type, see PNG standard or documentation further in this header file*/ + unsigned bitdepth; /*bits per sample, see PNG standard or documentation further in this header file*/ + + /* + palette (PLTE and tRNS) + + Dynamically allocated with the colors of the palette, including alpha. + When encoding a PNG, to store your colors in the palette of the LodePNGColorMode, first use + lodepng_palette_clear, then for each color use lodepng_palette_add. + If you encode an image without alpha with palette, don't forget to put value 255 in each A byte of the palette. + + When decoding, by default you can ignore this palette, since LodePNG already + fills the palette colors in the pixels of the raw RGBA output. + + The palette is only supported for color type 3. + */ + unsigned char* palette; /*palette in RGBARGBA... order. When allocated, must be either 0, or have size 1024*/ + size_t palettesize; /*palette size in number of colors (amount of bytes is 4 * palettesize)*/ + + /* + transparent color key (tRNS) + + This color uses the same bit depth as the bitdepth value in this struct, which can be 1-bit to 16-bit. + For greyscale PNGs, r, g and b will all 3 be set to the same. + + When decoding, by default you can ignore this information, since LodePNG sets + pixels with this key to transparent already in the raw RGBA output. + + The color key is only supported for color types 0 and 2. + */ + unsigned key_defined; /*is a transparent color key given? 0 = false, 1 = true*/ + unsigned key_r; /*red/greyscale component of color key*/ + unsigned key_g; /*green component of color key*/ + unsigned key_b; /*blue component of color key*/ +} LodePNGColorMode; + +/*init, cleanup and copy functions to use with this struct*/ +void lodepng_color_mode_init(LodePNGColorMode* info); +void lodepng_color_mode_cleanup(LodePNGColorMode* info); +/*return value is error code (0 means no error)*/ +unsigned lodepng_color_mode_copy(LodePNGColorMode* dest, const LodePNGColorMode* source); + +void lodepng_palette_clear(LodePNGColorMode* info); +/*add 1 color to the palette*/ +unsigned lodepng_palette_add(LodePNGColorMode* info, + unsigned char r, unsigned char g, unsigned char b, unsigned char a); + +/*get the total amount of bits per pixel, based on colortype and bitdepth in the struct*/ +unsigned lodepng_get_bpp(const LodePNGColorMode* info); +/*get the amount of color channels used, based on colortype in the struct. +If a palette is used, it counts as 1 channel.*/ +unsigned lodepng_get_channels(const LodePNGColorMode* info); +/*is it a greyscale type? (only colortype 0 or 4)*/ +unsigned lodepng_is_greyscale_type(const LodePNGColorMode* info); +/*has it got an alpha channel? (only colortype 2 or 6)*/ +unsigned lodepng_is_alpha_type(const LodePNGColorMode* info); +/*has it got a palette? (only colortype 3)*/ +unsigned lodepng_is_palette_type(const LodePNGColorMode* info); +/*only returns true if there is a palette and there is a value in the palette with alpha < 255. +Loops through the palette to check this.*/ +unsigned lodepng_has_palette_alpha(const LodePNGColorMode* info); +/* +Check if the given color info indicates the possibility of having non-opaque pixels in the PNG image. +Returns true if the image can have translucent or invisible pixels (it still be opaque if it doesn't use such pixels). +Returns false if the image can only have opaque pixels. +In detail, it returns true only if it's a color type with alpha, or has a palette with non-opaque values, +or if "key_defined" is true. +*/ +unsigned lodepng_can_have_alpha(const LodePNGColorMode* info); +/*Returns the byte size of a raw image buffer with given width, height and color mode*/ +size_t lodepng_get_raw_size(unsigned w, unsigned h, const LodePNGColorMode* color); + +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS +/*The information of a Time chunk in PNG.*/ +typedef struct LodePNGTime +{ + unsigned year; /*2 bytes used (0-65535)*/ + unsigned month; /*1-12*/ + unsigned day; /*1-31*/ + unsigned hour; /*0-23*/ + unsigned minute; /*0-59*/ + unsigned second; /*0-60 (to allow for leap seconds)*/ +} LodePNGTime; +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + +/*Information about the PNG image, except pixels, width and height.*/ +typedef struct LodePNGInfo +{ + /*header (IHDR), palette (PLTE) and transparency (tRNS) chunks*/ + unsigned compression_method;/*compression method of the original file. Always 0.*/ + unsigned filter_method; /*filter method of the original file*/ + unsigned interlace_method; /*interlace method of the original file*/ + LodePNGColorMode color; /*color type and bits, palette and transparency of the PNG file*/ + +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + /* + suggested background color chunk (bKGD) + This color uses the same color mode as the PNG (except alpha channel), which can be 1-bit to 16-bit. + + For greyscale PNGs, r, g and b will all 3 be set to the same. When encoding + the encoder writes the red one. For palette PNGs: When decoding, the RGB value + will be stored, not a palette index. But when encoding, specify the index of + the palette in background_r, the other two are then ignored. + + The decoder does not use this background color to edit the color of pixels. + */ + unsigned background_defined; /*is a suggested background color given?*/ + unsigned background_r; /*red component of suggested background color*/ + unsigned background_g; /*green component of suggested background color*/ + unsigned background_b; /*blue component of suggested background color*/ + + /* + non-international text chunks (tEXt and zTXt) + + The char** arrays each contain num strings. The actual messages are in + text_strings, while text_keys are keywords that give a short description what + the actual text represents, e.g. Title, Author, Description, or anything else. + + A keyword is minimum 1 character and maximum 79 characters long. It's + discouraged to use a single line length longer than 79 characters for texts. + + Don't allocate these text buffers yourself. Use the init/cleanup functions + correctly and use lodepng_add_text and lodepng_clear_text. + */ + size_t text_num; /*the amount of texts in these char** buffers (there may be more texts in itext)*/ + char** text_keys; /*the keyword of a text chunk (e.g. "Comment")*/ + char** text_strings; /*the actual text*/ + + /* + international text chunks (iTXt) + Similar to the non-international text chunks, but with additional strings + "langtags" and "transkeys". + */ + size_t itext_num; /*the amount of international texts in this PNG*/ + char** itext_keys; /*the English keyword of the text chunk (e.g. "Comment")*/ + char** itext_langtags; /*language tag for this text's language, ISO/IEC 646 string, e.g. ISO 639 language tag*/ + char** itext_transkeys; /*keyword translated to the international language - UTF-8 string*/ + char** itext_strings; /*the actual international text - UTF-8 string*/ + + /*time chunk (tIME)*/ + unsigned time_defined; /*set to 1 to make the encoder generate a tIME chunk*/ + LodePNGTime time; + + /*phys chunk (pHYs)*/ + unsigned phys_defined; /*if 0, there is no pHYs chunk and the values below are undefined, if 1 else there is one*/ + unsigned phys_x; /*pixels per unit in x direction*/ + unsigned phys_y; /*pixels per unit in y direction*/ + unsigned phys_unit; /*may be 0 (unknown unit) or 1 (metre)*/ + + /* + unknown chunks + There are 3 buffers, one for each position in the PNG where unknown chunks can appear + each buffer contains all unknown chunks for that position consecutively + The 3 buffers are the unknown chunks between certain critical chunks: + 0: IHDR-PLTE, 1: PLTE-IDAT, 2: IDAT-IEND + Do not allocate or traverse this data yourself. Use the chunk traversing functions declared + later, such as lodepng_chunk_next and lodepng_chunk_append, to read/write this struct. + */ + unsigned char* unknown_chunks_data[3]; + size_t unknown_chunks_size[3]; /*size in bytes of the unknown chunks, given for protection*/ +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ +} LodePNGInfo; + +/*init, cleanup and copy functions to use with this struct*/ +void lodepng_info_init(LodePNGInfo* info); +void lodepng_info_cleanup(LodePNGInfo* info); +/*return value is error code (0 means no error)*/ +unsigned lodepng_info_copy(LodePNGInfo* dest, const LodePNGInfo* source); + +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS +void lodepng_clear_text(LodePNGInfo* info); /*use this to clear the texts again after you filled them in*/ +unsigned lodepng_add_text(LodePNGInfo* info, const char* key, const char* str); /*push back both texts at once*/ + +void lodepng_clear_itext(LodePNGInfo* info); /*use this to clear the itexts again after you filled them in*/ +unsigned lodepng_add_itext(LodePNGInfo* info, const char* key, const char* langtag, + const char* transkey, const char* str); /*push back the 4 texts of 1 chunk at once*/ +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + +/* +Converts raw buffer from one color type to another color type, based on +LodePNGColorMode structs to describe the input and output color type. +See the reference manual at the end of this header file to see which color conversions are supported. +return value = LodePNG error code (0 if all went ok, an error if the conversion isn't supported) +The out buffer must have size (w * h * bpp + 7) / 8, where bpp is the bits per pixel +of the output color type (lodepng_get_bpp). +For < 8 bpp images, there should not be padding bits at the end of scanlines. +For 16-bit per channel colors, uses big endian format like PNG does. +Return value is LodePNG error code +*/ +unsigned lodepng_convert(unsigned char* out, const unsigned char* in, + const LodePNGColorMode* mode_out, const LodePNGColorMode* mode_in, + unsigned w, unsigned h); + +#ifdef LODEPNG_COMPILE_DECODER +/* +Settings for the decoder. This contains settings for the PNG and the Zlib +decoder, but not the Info settings from the Info structs. +*/ +typedef struct LodePNGDecoderSettings +{ + LodePNGDecompressSettings zlibsettings; /*in here is the setting to ignore Adler32 checksums*/ + + unsigned ignore_crc; /*ignore CRC checksums*/ + + unsigned color_convert; /*whether to convert the PNG to the color type you want. Default: yes*/ + +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + unsigned read_text_chunks; /*if false but remember_unknown_chunks is true, they're stored in the unknown chunks*/ + /*store all bytes from unknown chunks in the LodePNGInfo (off by default, useful for a png editor)*/ + unsigned remember_unknown_chunks; +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ +} LodePNGDecoderSettings; + +void lodepng_decoder_settings_init(LodePNGDecoderSettings* settings); +#endif /*LODEPNG_COMPILE_DECODER*/ + +#ifdef LODEPNG_COMPILE_ENCODER +/*automatically use color type with less bits per pixel if losslessly possible. Default: AUTO*/ +typedef enum LodePNGFilterStrategy +{ + /*every filter at zero*/ + LFS_ZERO, + /*Use filter that gives minimum sum, as described in the official PNG filter heuristic.*/ + LFS_MINSUM, + /*Use the filter type that gives smallest Shannon entropy for this scanline. Depending + on the image, this is better or worse than minsum.*/ + LFS_ENTROPY, + /* + Brute-force-search PNG filters by compressing each filter for each scanline. + Experimental, very slow, and only rarely gives better compression than MINSUM. + */ + LFS_BRUTE_FORCE, + /*use predefined_filters buffer: you specify the filter type for each scanline*/ + LFS_PREDEFINED +} LodePNGFilterStrategy; + +/*Gives characteristics about the colors of the image, which helps decide which color model to use for encoding. +Used internally by default if "auto_convert" is enabled. Public because it's useful for custom algorithms.*/ +typedef struct LodePNGColorProfile +{ + unsigned colored; /*not greyscale*/ + unsigned key; /*if true, image is not opaque. Only if true and alpha is false, color key is possible.*/ + unsigned short key_r; /*these values are always in 16-bit bitdepth in the profile*/ + unsigned short key_g; + unsigned short key_b; + unsigned alpha; /*alpha channel or alpha palette required*/ + unsigned numcolors; /*amount of colors, up to 257. Not valid if bits == 16.*/ + unsigned char palette[1024]; /*Remembers up to the first 256 RGBA colors, in no particular order*/ + unsigned bits; /*bits per channel (not for palette). 1,2 or 4 for greyscale only. 16 if 16-bit per channel required.*/ +} LodePNGColorProfile; + +void lodepng_color_profile_init(LodePNGColorProfile* profile); + +/*Get a LodePNGColorProfile of the image.*/ +unsigned lodepng_get_color_profile(LodePNGColorProfile* profile, + const unsigned char* image, unsigned w, unsigned h, + const LodePNGColorMode* mode_in); +/*The function LodePNG uses internally to decide the PNG color with auto_convert. +Chooses an optimal color model, e.g. grey if only grey pixels, palette if < 256 colors, ...*/ +unsigned lodepng_auto_choose_color(LodePNGColorMode* mode_out, + const unsigned char* image, unsigned w, unsigned h, + const LodePNGColorMode* mode_in); + +/*Settings for the encoder.*/ +typedef struct LodePNGEncoderSettings +{ + LodePNGCompressSettings zlibsettings; /*settings for the zlib encoder, such as window size, ...*/ + + unsigned auto_convert; /*automatically choose output PNG color type. Default: true*/ + + /*If true, follows the official PNG heuristic: if the PNG uses a palette or lower than + 8 bit depth, set all filters to zero. Otherwise use the filter_strategy. Note that to + completely follow the official PNG heuristic, filter_palette_zero must be true and + filter_strategy must be LFS_MINSUM*/ + unsigned filter_palette_zero; + /*Which filter strategy to use when not using zeroes due to filter_palette_zero. + Set filter_palette_zero to 0 to ensure always using your chosen strategy. Default: LFS_MINSUM*/ + LodePNGFilterStrategy filter_strategy; + /*used if filter_strategy is LFS_PREDEFINED. In that case, this must point to a buffer with + the same length as the amount of scanlines in the image, and each value must <= 5. You + have to cleanup this buffer, LodePNG will never free it. Don't forget that filter_palette_zero + must be set to 0 to ensure this is also used on palette or low bitdepth images.*/ + const unsigned char* predefined_filters; + + /*force creating a PLTE chunk if colortype is 2 or 6 (= a suggested palette). + If colortype is 3, PLTE is _always_ created.*/ + unsigned force_palette; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + /*add LodePNG identifier and version as a text chunk, for debugging*/ + unsigned add_id; + /*encode text chunks as zTXt chunks instead of tEXt chunks, and use compression in iTXt chunks*/ + unsigned text_compression; +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ +} LodePNGEncoderSettings; + +void lodepng_encoder_settings_init(LodePNGEncoderSettings* settings); +#endif /*LODEPNG_COMPILE_ENCODER*/ + + +#if defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_ENCODER) +/*The settings, state and information for extended encoding and decoding.*/ +typedef struct LodePNGState +{ +#ifdef LODEPNG_COMPILE_DECODER + LodePNGDecoderSettings decoder; /*the decoding settings*/ +#endif /*LODEPNG_COMPILE_DECODER*/ +#ifdef LODEPNG_COMPILE_ENCODER + LodePNGEncoderSettings encoder; /*the encoding settings*/ +#endif /*LODEPNG_COMPILE_ENCODER*/ + LodePNGColorMode info_raw; /*specifies the format in which you would like to get the raw pixel buffer*/ + LodePNGInfo info_png; /*info of the PNG image obtained after decoding*/ + unsigned error; +#ifdef LODEPNG_COMPILE_CPP + /* For the lodepng::State subclass. */ + virtual ~LodePNGState(){} +#endif +} LodePNGState; + +/*init, cleanup and copy functions to use with this struct*/ +void lodepng_state_init(LodePNGState* state); +void lodepng_state_cleanup(LodePNGState* state); +void lodepng_state_copy(LodePNGState* dest, const LodePNGState* source); +#endif /* defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_ENCODER) */ + +#ifdef LODEPNG_COMPILE_DECODER +/* +Same as lodepng_decode_memory, but uses a LodePNGState to allow custom settings and +getting much more information about the PNG image and color mode. +*/ +unsigned lodepng_decode(unsigned char** out, unsigned* w, unsigned* h, + LodePNGState* state, + const unsigned char* in, size_t insize); + +/* +Read the PNG header, but not the actual data. This returns only the information +that is in the header chunk of the PNG, such as width, height and color type. The +information is placed in the info_png field of the LodePNGState. +*/ +unsigned lodepng_inspect(unsigned* w, unsigned* h, + LodePNGState* state, + const unsigned char* in, size_t insize); +#endif /*LODEPNG_COMPILE_DECODER*/ + + +#ifdef LODEPNG_COMPILE_ENCODER +/*This function allocates the out buffer with standard malloc and stores the size in *outsize.*/ +unsigned lodepng_encode(unsigned char** out, size_t* outsize, + const unsigned char* image, unsigned w, unsigned h, + LodePNGState* state); +#endif /*LODEPNG_COMPILE_ENCODER*/ + +/* +The lodepng_chunk functions are normally not needed, except to traverse the +unknown chunks stored in the LodePNGInfo struct, or add new ones to it. +It also allows traversing the chunks of an encoded PNG file yourself. + +PNG standard chunk naming conventions: +First byte: uppercase = critical, lowercase = ancillary +Second byte: uppercase = public, lowercase = private +Third byte: must be uppercase +Fourth byte: uppercase = unsafe to copy, lowercase = safe to copy +*/ + +/* +Gets the length of the data of the chunk. Total chunk length has 12 bytes more. +There must be at least 4 bytes to read from. If the result value is too large, +it may be corrupt data. +*/ +unsigned lodepng_chunk_length(const unsigned char* chunk); + +/*puts the 4-byte type in null terminated string*/ +void lodepng_chunk_type(char type[5], const unsigned char* chunk); + +/*check if the type is the given type*/ +unsigned char lodepng_chunk_type_equals(const unsigned char* chunk, const char* type); + +/*0: it's one of the critical chunk types, 1: it's an ancillary chunk (see PNG standard)*/ +unsigned char lodepng_chunk_ancillary(const unsigned char* chunk); + +/*0: public, 1: private (see PNG standard)*/ +unsigned char lodepng_chunk_private(const unsigned char* chunk); + +/*0: the chunk is unsafe to copy, 1: the chunk is safe to copy (see PNG standard)*/ +unsigned char lodepng_chunk_safetocopy(const unsigned char* chunk); + +/*get pointer to the data of the chunk, where the input points to the header of the chunk*/ +unsigned char* lodepng_chunk_data(unsigned char* chunk); +const unsigned char* lodepng_chunk_data_const(const unsigned char* chunk); + +/*returns 0 if the crc is correct, 1 if it's incorrect (0 for OK as usual!)*/ +unsigned lodepng_chunk_check_crc(const unsigned char* chunk); + +/*generates the correct CRC from the data and puts it in the last 4 bytes of the chunk*/ +void lodepng_chunk_generate_crc(unsigned char* chunk); + +/*iterate to next chunks. don't use on IEND chunk, as there is no next chunk then*/ +unsigned char* lodepng_chunk_next(unsigned char* chunk); +const unsigned char* lodepng_chunk_next_const(const unsigned char* chunk); + +/* +Appends chunk to the data in out. The given chunk should already have its chunk header. +The out variable and outlength are updated to reflect the new reallocated buffer. +Returns error code (0 if it went ok) +*/ +unsigned lodepng_chunk_append(unsigned char** out, size_t* outlength, const unsigned char* chunk); + +/* +Appends new chunk to out. The chunk to append is given by giving its length, type +and data separately. The type is a 4-letter string. +The out variable and outlength are updated to reflect the new reallocated buffer. +Returne error code (0 if it went ok) +*/ +unsigned lodepng_chunk_create(unsigned char** out, size_t* outlength, unsigned length, + const char* type, const unsigned char* data); + + +/*Calculate CRC32 of buffer*/ +unsigned lodepng_crc32(const unsigned char* buf, size_t len); +#endif /*LODEPNG_COMPILE_PNG*/ + + +#ifdef LODEPNG_COMPILE_ZLIB +/* +This zlib part can be used independently to zlib compress and decompress a +buffer. It cannot be used to create gzip files however, and it only supports the +part of zlib that is required for PNG, it does not support dictionaries. +*/ + +#ifdef LODEPNG_COMPILE_DECODER +/*Inflate a buffer. Inflate is the decompression step of deflate. Out buffer must be freed after use.*/ +unsigned lodepng_inflate(unsigned char** out, size_t* outsize, + const unsigned char* in, size_t insize, + const LodePNGDecompressSettings* settings); + +/* +Decompresses Zlib data. Reallocates the out buffer and appends the data. The +data must be according to the zlib specification. +Either, *out must be NULL and *outsize must be 0, or, *out must be a valid +buffer and *outsize its size in bytes. out must be freed by user after usage. +*/ +unsigned lodepng_zlib_decompress(unsigned char** out, size_t* outsize, + const unsigned char* in, size_t insize, + const LodePNGDecompressSettings* settings); +#endif /*LODEPNG_COMPILE_DECODER*/ + +#ifdef LODEPNG_COMPILE_ENCODER +/* +Compresses data with Zlib. Reallocates the out buffer and appends the data. +Zlib adds a small header and trailer around the deflate data. +The data is output in the format of the zlib specification. +Either, *out must be NULL and *outsize must be 0, or, *out must be a valid +buffer and *outsize its size in bytes. out must be freed by user after usage. +*/ +unsigned lodepng_zlib_compress(unsigned char** out, size_t* outsize, + const unsigned char* in, size_t insize, + const LodePNGCompressSettings* settings); + +/* +Find length-limited Huffman code for given frequencies. This function is in the +public interface only for tests, it's used internally by lodepng_deflate. +*/ +unsigned lodepng_huffman_code_lengths(unsigned* lengths, const unsigned* frequencies, + size_t numcodes, unsigned maxbitlen); + +/*Compress a buffer with deflate. See RFC 1951. Out buffer must be freed after use.*/ +unsigned lodepng_deflate(unsigned char** out, size_t* outsize, + const unsigned char* in, size_t insize, + const LodePNGCompressSettings* settings); + +#endif /*LODEPNG_COMPILE_ENCODER*/ +#endif /*LODEPNG_COMPILE_ZLIB*/ + +#ifdef LODEPNG_COMPILE_DISK +/* +Load a file from disk into buffer. The function allocates the out buffer, and +after usage you should free it. +out: output parameter, contains pointer to loaded buffer. +outsize: output parameter, size of the allocated out buffer +filename: the path to the file to load +return value: error code (0 means ok) +*/ +unsigned lodepng_load_file(unsigned char** out, size_t* outsize, const char* filename); + +/* +Save a file from buffer to disk. Warning, if it exists, this function overwrites +the file without warning! +buffer: the buffer to write +buffersize: size of the buffer to write +filename: the path to the file to save to +return value: error code (0 means ok) +*/ +unsigned lodepng_save_file(const unsigned char* buffer, size_t buffersize, const char* filename); +#endif /*LODEPNG_COMPILE_DISK*/ + +#ifdef LODEPNG_COMPILE_CPP +/* The LodePNG C++ wrapper uses std::vectors instead of manually allocated memory buffers. */ +namespace lodepng +{ +#ifdef LODEPNG_COMPILE_PNG +class State : public LodePNGState +{ + public: + State(); + State(const State& other); + virtual ~State(); + State& operator=(const State& other); +}; + +#ifdef LODEPNG_COMPILE_DECODER +/* Same as other lodepng::decode, but using a State for more settings and information. */ +unsigned decode(std::vector& out, unsigned& w, unsigned& h, + State& state, + const unsigned char* in, size_t insize); +unsigned decode(std::vector& out, unsigned& w, unsigned& h, + State& state, + const std::vector& in); +#endif /*LODEPNG_COMPILE_DECODER*/ + +#ifdef LODEPNG_COMPILE_ENCODER +/* Same as other lodepng::encode, but using a State for more settings and information. */ +unsigned encode(std::vector& out, + const unsigned char* in, unsigned w, unsigned h, + State& state); +unsigned encode(std::vector& out, + const std::vector& in, unsigned w, unsigned h, + State& state); +#endif /*LODEPNG_COMPILE_ENCODER*/ + +#ifdef LODEPNG_COMPILE_DISK +/* +Load a file from disk into an std::vector. +return value: error code (0 means ok) +*/ +unsigned load_file(std::vector& buffer, const std::string& filename); + +/* +Save the binary data in an std::vector to a file on disk. The file is overwritten +without warning. +*/ +unsigned save_file(const std::vector& buffer, const std::string& filename); +#endif /* LODEPNG_COMPILE_DISK */ +#endif /* LODEPNG_COMPILE_PNG */ + +#ifdef LODEPNG_COMPILE_ZLIB +#ifdef LODEPNG_COMPILE_DECODER +/* Zlib-decompress an unsigned char buffer */ +unsigned decompress(std::vector& out, const unsigned char* in, size_t insize, + const LodePNGDecompressSettings& settings = lodepng_default_decompress_settings); + +/* Zlib-decompress an std::vector */ +unsigned decompress(std::vector& out, const std::vector& in, + const LodePNGDecompressSettings& settings = lodepng_default_decompress_settings); +#endif /* LODEPNG_COMPILE_DECODER */ + +#ifdef LODEPNG_COMPILE_ENCODER +/* Zlib-compress an unsigned char buffer */ +unsigned compress(std::vector& out, const unsigned char* in, size_t insize, + const LodePNGCompressSettings& settings = lodepng_default_compress_settings); + +/* Zlib-compress an std::vector */ +unsigned compress(std::vector& out, const std::vector& in, + const LodePNGCompressSettings& settings = lodepng_default_compress_settings); +#endif /* LODEPNG_COMPILE_ENCODER */ +#endif /* LODEPNG_COMPILE_ZLIB */ +} /* namespace lodepng */ +#endif /*LODEPNG_COMPILE_CPP*/ + +/* +TODO: +[.] test if there are no memory leaks or security exploits - done a lot but needs to be checked often +[.] check compatibility with various compilers - done but needs to be redone for every newer version +[X] converting color to 16-bit per channel types +[ ] read all public PNG chunk types (but never let the color profile and gamma ones touch RGB values) +[ ] make sure encoder generates no chunks with size > (2^31)-1 +[ ] partial decoding (stream processing) +[X] let the "isFullyOpaque" function check color keys and transparent palettes too +[X] better name for the variables "codes", "codesD", "codelengthcodes", "clcl" and "lldl" +[ ] don't stop decoding on errors like 69, 57, 58 (make warnings) +[ ] let the C++ wrapper catch exceptions coming from the standard library and return LodePNG error codes +[ ] allow user to provide custom color conversion functions, e.g. for premultiplied alpha, padding bits or not, ... +[ ] allow user to give data (void*) to custom allocator +*/ + +#endif /*LODEPNG_H inclusion guard*/ + +/* +LodePNG Documentation +--------------------- + +0. table of contents +-------------------- + + 1. about + 1.1. supported features + 1.2. features not supported + 2. C and C++ version + 3. security + 4. decoding + 5. encoding + 6. color conversions + 6.1. PNG color types + 6.2. color conversions + 6.3. padding bits + 6.4. A note about 16-bits per channel and endianness + 7. error values + 8. chunks and PNG editing + 9. compiler support + 10. examples + 10.1. decoder C++ example + 10.2. decoder C example + 11. state settings reference + 12. changes + 13. contact information + + +1. about +-------- + +PNG is a file format to store raster images losslessly with good compression, +supporting different color types and alpha channel. + +LodePNG is a PNG codec according to the Portable Network Graphics (PNG) +Specification (Second Edition) - W3C Recommendation 10 November 2003. + +The specifications used are: + +*) Portable Network Graphics (PNG) Specification (Second Edition): + http://www.w3.org/TR/2003/REC-PNG-20031110 +*) RFC 1950 ZLIB Compressed Data Format version 3.3: + http://www.gzip.org/zlib/rfc-zlib.html +*) RFC 1951 DEFLATE Compressed Data Format Specification ver 1.3: + http://www.gzip.org/zlib/rfc-deflate.html + +The most recent version of LodePNG can currently be found at +http://lodev.org/lodepng/ + +LodePNG works both in C (ISO C90) and C++, with a C++ wrapper that adds +extra functionality. + +LodePNG exists out of two files: +-lodepng.h: the header file for both C and C++ +-lodepng.c(pp): give it the name lodepng.c or lodepng.cpp (or .cc) depending on your usage + +If you want to start using LodePNG right away without reading this doc, get the +examples from the LodePNG website to see how to use it in code, or check the +smaller examples in chapter 13 here. + +LodePNG is simple but only supports the basic requirements. To achieve +simplicity, the following design choices were made: There are no dependencies +on any external library. There are functions to decode and encode a PNG with +a single function call, and extended versions of these functions taking a +LodePNGState struct allowing to specify or get more information. By default +the colors of the raw image are always RGB or RGBA, no matter what color type +the PNG file uses. To read and write files, there are simple functions to +convert the files to/from buffers in memory. + +This all makes LodePNG suitable for loading textures in games, demos and small +programs, ... It's less suitable for full fledged image editors, loading PNGs +over network (it requires all the image data to be available before decoding can +begin), life-critical systems, ... + +1.1. supported features +----------------------- + +The following features are supported by the decoder: + +*) decoding of PNGs with any color type, bit depth and interlace mode, to a 24- or 32-bit color raw image, + or the same color type as the PNG +*) encoding of PNGs, from any raw image to 24- or 32-bit color, or the same color type as the raw image +*) Adam7 interlace and deinterlace for any color type +*) loading the image from harddisk or decoding it from a buffer from other sources than harddisk +*) support for alpha channels, including RGBA color model, translucent palettes and color keying +*) zlib decompression (inflate) +*) zlib compression (deflate) +*) CRC32 and ADLER32 checksums +*) handling of unknown chunks, allowing making a PNG editor that stores custom and unknown chunks. +*) the following chunks are supported (generated/interpreted) by both encoder and decoder: + IHDR: header information + PLTE: color palette + IDAT: pixel data + IEND: the final chunk + tRNS: transparency for palettized images + tEXt: textual information + zTXt: compressed textual information + iTXt: international textual information + bKGD: suggested background color + pHYs: physical dimensions + tIME: modification time + +1.2. features not supported +--------------------------- + +The following features are _not_ supported: + +*) some features needed to make a conformant PNG-Editor might be still missing. +*) partial loading/stream processing. All data must be available and is processed in one call. +*) The following public chunks are not supported but treated as unknown chunks by LodePNG + cHRM, gAMA, iCCP, sRGB, sBIT, hIST, sPLT + Some of these are not supported on purpose: LodePNG wants to provide the RGB values + stored in the pixels, not values modified by system dependent gamma or color models. + + +2. C and C++ version +-------------------- + +The C version uses buffers allocated with alloc that you need to free() +yourself. You need to use init and cleanup functions for each struct whenever +using a struct from the C version to avoid exploits and memory leaks. + +The C++ version has extra functions with std::vectors in the interface and the +lodepng::State class which is a LodePNGState with constructor and destructor. + +These files work without modification for both C and C++ compilers because all +the additional C++ code is in "#ifdef __cplusplus" blocks that make C-compilers +ignore it, and the C code is made to compile both with strict ISO C90 and C++. + +To use the C++ version, you need to rename the source file to lodepng.cpp +(instead of lodepng.c), and compile it with a C++ compiler. + +To use the C version, you need to rename the source file to lodepng.c (instead +of lodepng.cpp), and compile it with a C compiler. + + +3. Security +----------- + +Even if carefully designed, it's always possible that LodePNG contains possible +exploits. If you discover one, please let me know, and it will be fixed. + +When using LodePNG, care has to be taken with the C version of LodePNG, as well +as the C-style structs when working with C++. The following conventions are used +for all C-style structs: + +-if a struct has a corresponding init function, always call the init function when making a new one +-if a struct has a corresponding cleanup function, call it before the struct disappears to avoid memory leaks +-if a struct has a corresponding copy function, use the copy function instead of "=". + The destination must also be inited already. + + +4. Decoding +----------- + +Decoding converts a PNG compressed image to a raw pixel buffer. + +Most documentation on using the decoder is at its declarations in the header +above. For C, simple decoding can be done with functions such as +lodepng_decode32, and more advanced decoding can be done with the struct +LodePNGState and lodepng_decode. For C++, all decoding can be done with the +various lodepng::decode functions, and lodepng::State can be used for advanced +features. + +When using the LodePNGState, it uses the following fields for decoding: +*) LodePNGInfo info_png: it stores extra information about the PNG (the input) in here +*) LodePNGColorMode info_raw: here you can say what color mode of the raw image (the output) you want to get +*) LodePNGDecoderSettings decoder: you can specify a few extra settings for the decoder to use + +LodePNGInfo info_png +-------------------- + +After decoding, this contains extra information of the PNG image, except the actual +pixels, width and height because these are already gotten directly from the decoder +functions. + +It contains for example the original color type of the PNG image, text comments, +suggested background color, etc... More details about the LodePNGInfo struct are +at its declaration documentation. + +LodePNGColorMode info_raw +------------------------- + +When decoding, here you can specify which color type you want +the resulting raw image to be. If this is different from the colortype of the +PNG, then the decoder will automatically convert the result. This conversion +always works, except if you want it to convert a color PNG to greyscale or to +a palette with missing colors. + +By default, 32-bit color is used for the result. + +LodePNGDecoderSettings decoder +------------------------------ + +The settings can be used to ignore the errors created by invalid CRC and Adler32 +chunks, and to disable the decoding of tEXt chunks. + +There's also a setting color_convert, true by default. If false, no conversion +is done, the resulting data will be as it was in the PNG (after decompression) +and you'll have to puzzle the colors of the pixels together yourself using the +color type information in the LodePNGInfo. + + +5. Encoding +----------- + +Encoding converts a raw pixel buffer to a PNG compressed image. + +Most documentation on using the encoder is at its declarations in the header +above. For C, simple encoding can be done with functions such as +lodepng_encode32, and more advanced decoding can be done with the struct +LodePNGState and lodepng_encode. For C++, all encoding can be done with the +various lodepng::encode functions, and lodepng::State can be used for advanced +features. + +Like the decoder, the encoder can also give errors. However it gives less errors +since the encoder input is trusted, the decoder input (a PNG image that could +be forged by anyone) is not trusted. + +When using the LodePNGState, it uses the following fields for encoding: +*) LodePNGInfo info_png: here you specify how you want the PNG (the output) to be. +*) LodePNGColorMode info_raw: here you say what color type of the raw image (the input) has +*) LodePNGEncoderSettings encoder: you can specify a few settings for the encoder to use + +LodePNGInfo info_png +-------------------- + +When encoding, you use this the opposite way as when decoding: for encoding, +you fill in the values you want the PNG to have before encoding. By default it's +not needed to specify a color type for the PNG since it's automatically chosen, +but it's possible to choose it yourself given the right settings. + +The encoder will not always exactly match the LodePNGInfo struct you give, +it tries as close as possible. Some things are ignored by the encoder. The +encoder uses, for example, the following settings from it when applicable: +colortype and bitdepth, text chunks, time chunk, the color key, the palette, the +background color, the interlace method, unknown chunks, ... + +When encoding to a PNG with colortype 3, the encoder will generate a PLTE chunk. +If the palette contains any colors for which the alpha channel is not 255 (so +there are translucent colors in the palette), it'll add a tRNS chunk. + +LodePNGColorMode info_raw +------------------------- + +You specify the color type of the raw image that you give to the input here, +including a possible transparent color key and palette you happen to be using in +your raw image data. + +By default, 32-bit color is assumed, meaning your input has to be in RGBA +format with 4 bytes (unsigned chars) per pixel. + +LodePNGEncoderSettings encoder +------------------------------ + +The following settings are supported (some are in sub-structs): +*) auto_convert: when this option is enabled, the encoder will +automatically choose the smallest possible color mode (including color key) that +can encode the colors of all pixels without information loss. +*) btype: the block type for LZ77. 0 = uncompressed, 1 = fixed huffman tree, + 2 = dynamic huffman tree (best compression). Should be 2 for proper + compression. +*) use_lz77: whether or not to use LZ77 for compressed block types. Should be + true for proper compression. +*) windowsize: the window size used by the LZ77 encoder (1 - 32768). Has value + 2048 by default, but can be set to 32768 for better, but slow, compression. +*) force_palette: if colortype is 2 or 6, you can make the encoder write a PLTE + chunk if force_palette is true. This can used as suggested palette to convert + to by viewers that don't support more than 256 colors (if those still exist) +*) add_id: add text chunk "Encoder: LodePNG " to the image. +*) text_compression: default 1. If 1, it'll store texts as zTXt instead of tEXt chunks. + zTXt chunks use zlib compression on the text. This gives a smaller result on + large texts but a larger result on small texts (such as a single program name). + It's all tEXt or all zTXt though, there's no separate setting per text yet. + + +6. color conversions +-------------------- + +An important thing to note about LodePNG, is that the color type of the PNG, and +the color type of the raw image, are completely independent. By default, when +you decode a PNG, you get the result as a raw image in the color type you want, +no matter whether the PNG was encoded with a palette, greyscale or RGBA color. +And if you encode an image, by default LodePNG will automatically choose the PNG +color type that gives good compression based on the values of colors and amount +of colors in the image. It can be configured to let you control it instead as +well, though. + +To be able to do this, LodePNG does conversions from one color mode to another. +It can convert from almost any color type to any other color type, except the +following conversions: RGB to greyscale is not supported, and converting to a +palette when the palette doesn't have a required color is not supported. This is +not supported on purpose: this is information loss which requires a color +reduction algorithm that is beyong the scope of a PNG encoder (yes, RGB to grey +is easy, but there are multiple ways if you want to give some channels more +weight). + +By default, when decoding, you get the raw image in 32-bit RGBA or 24-bit RGB +color, no matter what color type the PNG has. And by default when encoding, +LodePNG automatically picks the best color model for the output PNG, and expects +the input image to be 32-bit RGBA or 24-bit RGB. So, unless you want to control +the color format of the images yourself, you can skip this chapter. + +6.1. PNG color types +-------------------- + +A PNG image can have many color types, ranging from 1-bit color to 64-bit color, +as well as palettized color modes. After the zlib decompression and unfiltering +in the PNG image is done, the raw pixel data will have that color type and thus +a certain amount of bits per pixel. If you want the output raw image after +decoding to have another color type, a conversion is done by LodePNG. + +The PNG specification gives the following color types: + +0: greyscale, bit depths 1, 2, 4, 8, 16 +2: RGB, bit depths 8 and 16 +3: palette, bit depths 1, 2, 4 and 8 +4: greyscale with alpha, bit depths 8 and 16 +6: RGBA, bit depths 8 and 16 + +Bit depth is the amount of bits per pixel per color channel. So the total amount +of bits per pixel is: amount of channels * bitdepth. + +6.2. color conversions +---------------------- + +As explained in the sections about the encoder and decoder, you can specify +color types and bit depths in info_png and info_raw to change the default +behaviour. + +If, when decoding, you want the raw image to be something else than the default, +you need to set the color type and bit depth you want in the LodePNGColorMode, +or the parameters colortype and bitdepth of the simple decoding function. + +If, when encoding, you use another color type than the default in the raw input +image, you need to specify its color type and bit depth in the LodePNGColorMode +of the raw image, or use the parameters colortype and bitdepth of the simple +encoding function. + +If, when encoding, you don't want LodePNG to choose the output PNG color type +but control it yourself, you need to set auto_convert in the encoder settings +to false, and specify the color type you want in the LodePNGInfo of the +encoder (including palette: it can generate a palette if auto_convert is true, +otherwise not). + +If the input and output color type differ (whether user chosen or auto chosen), +LodePNG will do a color conversion, which follows the rules below, and may +sometimes result in an error. + +To avoid some confusion: +-the decoder converts from PNG to raw image +-the encoder converts from raw image to PNG +-the colortype and bitdepth in LodePNGColorMode info_raw, are those of the raw image +-the colortype and bitdepth in the color field of LodePNGInfo info_png, are those of the PNG +-when encoding, the color type in LodePNGInfo is ignored if auto_convert + is enabled, it is automatically generated instead +-when decoding, the color type in LodePNGInfo is set by the decoder to that of the original + PNG image, but it can be ignored since the raw image has the color type you requested instead +-if the color type of the LodePNGColorMode and PNG image aren't the same, a conversion + between the color types is done if the color types are supported. If it is not + supported, an error is returned. If the types are the same, no conversion is done. +-even though some conversions aren't supported, LodePNG supports loading PNGs from any + colortype and saving PNGs to any colortype, sometimes it just requires preparing + the raw image correctly before encoding. +-both encoder and decoder use the same color converter. + +Non supported color conversions: +-color to greyscale: no error is thrown, but the result will look ugly because +only the red channel is taken +-anything to palette when that palette does not have that color in it: in this +case an error is thrown + +Supported color conversions: +-anything to 8-bit RGB, 8-bit RGBA, 16-bit RGB, 16-bit RGBA +-any grey or grey+alpha, to grey or grey+alpha +-anything to a palette, as long as the palette has the requested colors in it +-removing alpha channel +-higher to smaller bitdepth, and vice versa + +If you want no color conversion to be done (e.g. for speed or control): +-In the encoder, you can make it save a PNG with any color type by giving the +raw color mode and LodePNGInfo the same color mode, and setting auto_convert to +false. +-In the decoder, you can make it store the pixel data in the same color type +as the PNG has, by setting the color_convert setting to false. Settings in +info_raw are then ignored. + +The function lodepng_convert does the color conversion. It is available in the +interface but normally isn't needed since the encoder and decoder already call +it. + +6.3. padding bits +----------------- + +In the PNG file format, if a less than 8-bit per pixel color type is used and the scanlines +have a bit amount that isn't a multiple of 8, then padding bits are used so that each +scanline starts at a fresh byte. But that is NOT true for the LodePNG raw input and output. +The raw input image you give to the encoder, and the raw output image you get from the decoder +will NOT have these padding bits, e.g. in the case of a 1-bit image with a width +of 7 pixels, the first pixel of the second scanline will the the 8th bit of the first byte, +not the first bit of a new byte. + +6.4. A note about 16-bits per channel and endianness +---------------------------------------------------- + +LodePNG uses unsigned char arrays for 16-bit per channel colors too, just like +for any other color format. The 16-bit values are stored in big endian (most +significant byte first) in these arrays. This is the opposite order of the +little endian used by x86 CPU's. + +LodePNG always uses big endian because the PNG file format does so internally. +Conversions to other formats than PNG uses internally are not supported by +LodePNG on purpose, there are myriads of formats, including endianness of 16-bit +colors, the order in which you store R, G, B and A, and so on. Supporting and +converting to/from all that is outside the scope of LodePNG. + +This may mean that, depending on your use case, you may want to convert the big +endian output of LodePNG to little endian with a for loop. This is certainly not +always needed, many applications and libraries support big endian 16-bit colors +anyway, but it means you cannot simply cast the unsigned char* buffer to an +unsigned short* buffer on x86 CPUs. + + +7. error values +--------------- + +All functions in LodePNG that return an error code, return 0 if everything went +OK, or a non-zero code if there was an error. + +The meaning of the LodePNG error values can be retrieved with the function +lodepng_error_text: given the numerical error code, it returns a description +of the error in English as a string. + +Check the implementation of lodepng_error_text to see the meaning of each code. + + +8. chunks and PNG editing +------------------------- + +If you want to add extra chunks to a PNG you encode, or use LodePNG for a PNG +editor that should follow the rules about handling of unknown chunks, or if your +program is able to read other types of chunks than the ones handled by LodePNG, +then that's possible with the chunk functions of LodePNG. + +A PNG chunk has the following layout: + +4 bytes length +4 bytes type name +length bytes data +4 bytes CRC + +8.1. iterating through chunks +----------------------------- + +If you have a buffer containing the PNG image data, then the first chunk (the +IHDR chunk) starts at byte number 8 of that buffer. The first 8 bytes are the +signature of the PNG and are not part of a chunk. But if you start at byte 8 +then you have a chunk, and can check the following things of it. + +NOTE: none of these functions check for memory buffer boundaries. To avoid +exploits, always make sure the buffer contains all the data of the chunks. +When using lodepng_chunk_next, make sure the returned value is within the +allocated memory. + +unsigned lodepng_chunk_length(const unsigned char* chunk): + +Get the length of the chunk's data. The total chunk length is this length + 12. + +void lodepng_chunk_type(char type[5], const unsigned char* chunk): +unsigned char lodepng_chunk_type_equals(const unsigned char* chunk, const char* type): + +Get the type of the chunk or compare if it's a certain type + +unsigned char lodepng_chunk_critical(const unsigned char* chunk): +unsigned char lodepng_chunk_private(const unsigned char* chunk): +unsigned char lodepng_chunk_safetocopy(const unsigned char* chunk): + +Check if the chunk is critical in the PNG standard (only IHDR, PLTE, IDAT and IEND are). +Check if the chunk is private (public chunks are part of the standard, private ones not). +Check if the chunk is safe to copy. If it's not, then, when modifying data in a critical +chunk, unsafe to copy chunks of the old image may NOT be saved in the new one if your +program doesn't handle that type of unknown chunk. + +unsigned char* lodepng_chunk_data(unsigned char* chunk): +const unsigned char* lodepng_chunk_data_const(const unsigned char* chunk): + +Get a pointer to the start of the data of the chunk. + +unsigned lodepng_chunk_check_crc(const unsigned char* chunk): +void lodepng_chunk_generate_crc(unsigned char* chunk): + +Check if the crc is correct or generate a correct one. + +unsigned char* lodepng_chunk_next(unsigned char* chunk): +const unsigned char* lodepng_chunk_next_const(const unsigned char* chunk): + +Iterate to the next chunk. This works if you have a buffer with consecutive chunks. Note that these +functions do no boundary checking of the allocated data whatsoever, so make sure there is enough +data available in the buffer to be able to go to the next chunk. + +unsigned lodepng_chunk_append(unsigned char** out, size_t* outlength, const unsigned char* chunk): +unsigned lodepng_chunk_create(unsigned char** out, size_t* outlength, unsigned length, + const char* type, const unsigned char* data): + +These functions are used to create new chunks that are appended to the data in *out that has +length *outlength. The append function appends an existing chunk to the new data. The create +function creates a new chunk with the given parameters and appends it. Type is the 4-letter +name of the chunk. + +8.2. chunks in info_png +----------------------- + +The LodePNGInfo struct contains fields with the unknown chunk in it. It has 3 +buffers (each with size) to contain 3 types of unknown chunks: +the ones that come before the PLTE chunk, the ones that come between the PLTE +and the IDAT chunks, and the ones that come after the IDAT chunks. +It's necessary to make the distionction between these 3 cases because the PNG +standard forces to keep the ordering of unknown chunks compared to the critical +chunks, but does not force any other ordering rules. + +info_png.unknown_chunks_data[0] is the chunks before PLTE +info_png.unknown_chunks_data[1] is the chunks after PLTE, before IDAT +info_png.unknown_chunks_data[2] is the chunks after IDAT + +The chunks in these 3 buffers can be iterated through and read by using the same +way described in the previous subchapter. + +When using the decoder to decode a PNG, you can make it store all unknown chunks +if you set the option settings.remember_unknown_chunks to 1. By default, this +option is off (0). + +The encoder will always encode unknown chunks that are stored in the info_png. +If you need it to add a particular chunk that isn't known by LodePNG, you can +use lodepng_chunk_append or lodepng_chunk_create to the chunk data in +info_png.unknown_chunks_data[x]. + +Chunks that are known by LodePNG should not be added in that way. E.g. to make +LodePNG add a bKGD chunk, set background_defined to true and add the correct +parameters there instead. + + +9. compiler support +------------------- + +No libraries other than the current standard C library are needed to compile +LodePNG. For the C++ version, only the standard C++ library is needed on top. +Add the files lodepng.c(pp) and lodepng.h to your project, include +lodepng.h where needed, and your program can read/write PNG files. + +It is compatible with C90 and up, and C++03 and up. + +If performance is important, use optimization when compiling! For both the +encoder and decoder, this makes a large difference. + +Make sure that LodePNG is compiled with the same compiler of the same version +and with the same settings as the rest of the program, or the interfaces with +std::vectors and std::strings in C++ can be incompatible. + +CHAR_BITS must be 8 or higher, because LodePNG uses unsigned chars for octets. + +*) gcc and g++ + +LodePNG is developed in gcc so this compiler is natively supported. It gives no +warnings with compiler options "-Wall -Wextra -pedantic -ansi", with gcc and g++ +version 4.7.1 on Linux, 32-bit and 64-bit. + +*) Clang + +Fully supported and warning-free. + +*) Mingw + +The Mingw compiler (a port of gcc for Windows) should be fully supported by +LodePNG. + +*) Visual Studio and Visual C++ Express Edition + +LodePNG should be warning-free with warning level W4. Two warnings were disabled +with pragmas though: warning 4244 about implicit conversions, and warning 4996 +where it wants to use a non-standard function fopen_s instead of the standard C +fopen. + +Visual Studio may want "stdafx.h" files to be included in each source file and +give an error "unexpected end of file while looking for precompiled header". +This is not standard C++ and will not be added to the stock LodePNG. You can +disable it for lodepng.cpp only by right clicking it, Properties, C/C++, +Precompiled Headers, and set it to Not Using Precompiled Headers there. + +NOTE: Modern versions of VS should be fully supported, but old versions, e.g. +VS6, are not guaranteed to work. + +*) Compilers on Macintosh + +LodePNG has been reported to work both with gcc and LLVM for Macintosh, both for +C and C++. + +*) Other Compilers + +If you encounter problems on any compilers, feel free to let me know and I may +try to fix it if the compiler is modern and standards complient. + + +10. examples +------------ + +This decoder example shows the most basic usage of LodePNG. More complex +examples can be found on the LodePNG website. + +10.1. decoder C++ example +------------------------- + +#include "lodepng.h" +#include + +int main(int argc, char *argv[]) +{ + const char* filename = argc > 1 ? argv[1] : "test.png"; + + //load and decode + std::vector image; + unsigned width, height; + unsigned error = lodepng::decode(image, width, height, filename); + + //if there's an error, display it + if(error) std::cout << "decoder error " << error << ": " << lodepng_error_text(error) << std::endl; + + //the pixels are now in the vector "image", 4 bytes per pixel, ordered RGBARGBA..., use it as texture, draw it, ... +} + +10.2. decoder C example +----------------------- + +#include "lodepng.h" + +int main(int argc, char *argv[]) +{ + unsigned error; + unsigned char* image; + size_t width, height; + const char* filename = argc > 1 ? argv[1] : "test.png"; + + error = lodepng_decode32_file(&image, &width, &height, filename); + + if(error) printf("decoder error %u: %s\n", error, lodepng_error_text(error)); + + / * use image here * / + + free(image); + return 0; +} + +11. state settings reference +---------------------------- + +A quick reference of some settings to set on the LodePNGState + +For decoding: + +state.decoder.zlibsettings.ignore_adler32: ignore ADLER32 checksums +state.decoder.zlibsettings.custom_...: use custom inflate function +state.decoder.ignore_crc: ignore CRC checksums +state.decoder.color_convert: convert internal PNG color to chosen one +state.decoder.read_text_chunks: whether to read in text metadata chunks +state.decoder.remember_unknown_chunks: whether to read in unknown chunks +state.info_raw.colortype: desired color type for decoded image +state.info_raw.bitdepth: desired bit depth for decoded image +state.info_raw....: more color settings, see struct LodePNGColorMode +state.info_png....: no settings for decoder but ouput, see struct LodePNGInfo + +For encoding: + +state.encoder.zlibsettings.btype: disable compression by setting it to 0 +state.encoder.zlibsettings.use_lz77: use LZ77 in compression +state.encoder.zlibsettings.windowsize: tweak LZ77 windowsize +state.encoder.zlibsettings.minmatch: tweak min LZ77 length to match +state.encoder.zlibsettings.nicematch: tweak LZ77 match where to stop searching +state.encoder.zlibsettings.lazymatching: try one more LZ77 matching +state.encoder.zlibsettings.custom_...: use custom deflate function +state.encoder.auto_convert: choose optimal PNG color type, if 0 uses info_png +state.encoder.filter_palette_zero: PNG filter strategy for palette +state.encoder.filter_strategy: PNG filter strategy to encode with +state.encoder.force_palette: add palette even if not encoding to one +state.encoder.add_id: add LodePNG identifier and version as a text chunk +state.encoder.text_compression: use compressed text chunks for metadata +state.info_raw.colortype: color type of raw input image you provide +state.info_raw.bitdepth: bit depth of raw input image you provide +state.info_raw: more color settings, see struct LodePNGColorMode +state.info_png.color.colortype: desired color type if auto_convert is false +state.info_png.color.bitdepth: desired bit depth if auto_convert is false +state.info_png.color....: more color settings, see struct LodePNGColorMode +state.info_png....: more PNG related settings, see struct LodePNGInfo + + +12. changes +----------- + +The version number of LodePNG is the date of the change given in the format +yyyymmdd. + +Some changes aren't backwards compatible. Those are indicated with a (!) +symbol. + +*) 09 apr 2016: Fixed colorkey usage detection, and better file loading (within + the limits of pure C90). +*) 08 dec 2015: Made load_file function return error if file can't be opened. +*) 24 okt 2015: Bugfix with decoding to palette output. +*) 18 apr 2015: Boundary PM instead of just package-merge for faster encoding. +*) 23 aug 2014: Reduced needless memory usage of decoder. +*) 28 jun 2014: Removed fix_png setting, always support palette OOB for + simplicity. Made ColorProfile public. +*) 09 jun 2014: Faster encoder by fixing hash bug and more zeros optimization. +*) 22 dec 2013: Power of two windowsize required for optimization. +*) 15 apr 2013: Fixed bug with LAC_ALPHA and color key. +*) 25 mar 2013: Added an optional feature to ignore some PNG errors (fix_png). +*) 11 mar 2013 (!): Bugfix with custom free. Changed from "my" to "lodepng_" + prefix for the custom allocators and made it possible with a new #define to + use custom ones in your project without needing to change lodepng's code. +*) 28 jan 2013: Bugfix with color key. +*) 27 okt 2012: Tweaks in text chunk keyword length error handling. +*) 8 okt 2012 (!): Added new filter strategy (entropy) and new auto color mode. + (no palette). Better deflate tree encoding. New compression tweak settings. + Faster color conversions while decoding. Some internal cleanups. +*) 23 sep 2012: Reduced warnings in Visual Studio a little bit. +*) 1 sep 2012 (!): Removed #define's for giving custom (de)compression functions + and made it work with function pointers instead. +*) 23 jun 2012: Added more filter strategies. Made it easier to use custom alloc + and free functions and toggle #defines from compiler flags. Small fixes. +*) 6 may 2012 (!): Made plugging in custom zlib/deflate functions more flexible. +*) 22 apr 2012 (!): Made interface more consistent, renaming a lot. Removed + redundant C++ codec classes. Reduced amount of structs. Everything changed, + but it is cleaner now imho and functionality remains the same. Also fixed + several bugs and shrunk the implementation code. Made new samples. +*) 6 nov 2011 (!): By default, the encoder now automatically chooses the best + PNG color model and bit depth, based on the amount and type of colors of the + raw image. For this, autoLeaveOutAlphaChannel replaced by auto_choose_color. +*) 9 okt 2011: simpler hash chain implementation for the encoder. +*) 8 sep 2011: lz77 encoder lazy matching instead of greedy matching. +*) 23 aug 2011: tweaked the zlib compression parameters after benchmarking. + A bug with the PNG filtertype heuristic was fixed, so that it chooses much + better ones (it's quite significant). A setting to do an experimental, slow, + brute force search for PNG filter types is added. +*) 17 aug 2011 (!): changed some C zlib related function names. +*) 16 aug 2011: made the code less wide (max 120 characters per line). +*) 17 apr 2011: code cleanup. Bugfixes. Convert low to 16-bit per sample colors. +*) 21 feb 2011: fixed compiling for C90. Fixed compiling with sections disabled. +*) 11 dec 2010: encoding is made faster, based on suggestion by Peter Eastman + to optimize long sequences of zeros. +*) 13 nov 2010: added LodePNG_InfoColor_hasPaletteAlpha and + LodePNG_InfoColor_canHaveAlpha functions for convenience. +*) 7 nov 2010: added LodePNG_error_text function to get error code description. +*) 30 okt 2010: made decoding slightly faster +*) 26 okt 2010: (!) changed some C function and struct names (more consistent). + Reorganized the documentation and the declaration order in the header. +*) 08 aug 2010: only changed some comments and external samples. +*) 05 jul 2010: fixed bug thanks to warnings in the new gcc version. +*) 14 mar 2010: fixed bug where too much memory was allocated for char buffers. +*) 02 sep 2008: fixed bug where it could create empty tree that linux apps could + read by ignoring the problem but windows apps couldn't. +*) 06 jun 2008: added more error checks for out of memory cases. +*) 26 apr 2008: added a few more checks here and there to ensure more safety. +*) 06 mar 2008: crash with encoding of strings fixed +*) 02 feb 2008: support for international text chunks added (iTXt) +*) 23 jan 2008: small cleanups, and #defines to divide code in sections +*) 20 jan 2008: support for unknown chunks allowing using LodePNG for an editor. +*) 18 jan 2008: support for tIME and pHYs chunks added to encoder and decoder. +*) 17 jan 2008: ability to encode and decode compressed zTXt chunks added + Also various fixes, such as in the deflate and the padding bits code. +*) 13 jan 2008: Added ability to encode Adam7-interlaced images. Improved + filtering code of encoder. +*) 07 jan 2008: (!) changed LodePNG to use ISO C90 instead of C++. A + C++ wrapper around this provides an interface almost identical to before. + Having LodePNG be pure ISO C90 makes it more portable. The C and C++ code + are together in these files but it works both for C and C++ compilers. +*) 29 dec 2007: (!) changed most integer types to unsigned int + other tweaks +*) 30 aug 2007: bug fixed which makes this Borland C++ compatible +*) 09 aug 2007: some VS2005 warnings removed again +*) 21 jul 2007: deflate code placed in new namespace separate from zlib code +*) 08 jun 2007: fixed bug with 2- and 4-bit color, and small interlaced images +*) 04 jun 2007: improved support for Visual Studio 2005: crash with accessing + invalid std::vector element [0] fixed, and level 3 and 4 warnings removed +*) 02 jun 2007: made the encoder add a tag with version by default +*) 27 may 2007: zlib and png code separated (but still in the same file), + simple encoder/decoder functions added for more simple usage cases +*) 19 may 2007: minor fixes, some code cleaning, new error added (error 69), + moved some examples from here to lodepng_examples.cpp +*) 12 may 2007: palette decoding bug fixed +*) 24 apr 2007: changed the license from BSD to the zlib license +*) 11 mar 2007: very simple addition: ability to encode bKGD chunks. +*) 04 mar 2007: (!) tEXt chunk related fixes, and support for encoding + palettized PNG images. Plus little interface change with palette and texts. +*) 03 mar 2007: Made it encode dynamic Huffman shorter with repeat codes. + Fixed a bug where the end code of a block had length 0 in the Huffman tree. +*) 26 feb 2007: Huffman compression with dynamic trees (BTYPE 2) now implemented + and supported by the encoder, resulting in smaller PNGs at the output. +*) 27 jan 2007: Made the Adler-32 test faster so that a timewaste is gone. +*) 24 jan 2007: gave encoder an error interface. Added color conversion from any + greyscale type to 8-bit greyscale with or without alpha. +*) 21 jan 2007: (!) Totally changed the interface. It allows more color types + to convert to and is more uniform. See the manual for how it works now. +*) 07 jan 2007: Some cleanup & fixes, and a few changes over the last days: + encode/decode custom tEXt chunks, separate classes for zlib & deflate, and + at last made the decoder give errors for incorrect Adler32 or Crc. +*) 01 jan 2007: Fixed bug with encoding PNGs with less than 8 bits per channel. +*) 29 dec 2006: Added support for encoding images without alpha channel, and + cleaned out code as well as making certain parts faster. +*) 28 dec 2006: Added "Settings" to the encoder. +*) 26 dec 2006: The encoder now does LZ77 encoding and produces much smaller files now. + Removed some code duplication in the decoder. Fixed little bug in an example. +*) 09 dec 2006: (!) Placed output parameters of public functions as first parameter. + Fixed a bug of the decoder with 16-bit per color. +*) 15 okt 2006: Changed documentation structure +*) 09 okt 2006: Encoder class added. It encodes a valid PNG image from the + given image buffer, however for now it's not compressed. +*) 08 sep 2006: (!) Changed to interface with a Decoder class +*) 30 jul 2006: (!) LodePNG_InfoPng , width and height are now retrieved in different + way. Renamed decodePNG to decodePNGGeneric. +*) 29 jul 2006: (!) Changed the interface: image info is now returned as a + struct of type LodePNG::LodePNG_Info, instead of a vector, which was a bit clumsy. +*) 28 jul 2006: Cleaned the code and added new error checks. + Corrected terminology "deflate" into "inflate". +*) 23 jun 2006: Added SDL example in the documentation in the header, this + example allows easy debugging by displaying the PNG and its transparency. +*) 22 jun 2006: (!) Changed way to obtain error value. Added + loadFile function for convenience. Made decodePNG32 faster. +*) 21 jun 2006: (!) Changed type of info vector to unsigned. + Changed position of palette in info vector. Fixed an important bug that + happened on PNGs with an uncompressed block. +*) 16 jun 2006: Internally changed unsigned into unsigned where + needed, and performed some optimizations. +*) 07 jun 2006: (!) Renamed functions to decodePNG and placed them + in LodePNG namespace. Changed the order of the parameters. Rewrote the + documentation in the header. Renamed files to lodepng.cpp and lodepng.h +*) 22 apr 2006: Optimized and improved some code +*) 07 sep 2005: (!) Changed to std::vector interface +*) 12 aug 2005: Initial release (C++, decoder only) + + +13. contact information +----------------------- + +Feel free to contact me with suggestions, problems, comments, ... concerning +LodePNG. If you encounter a PNG image that doesn't work properly with this +decoder, feel free to send it and I'll use it to find and fix the problem. + +My email address is (puzzle the account and domain together with an @ symbol): +Domain: gmail dot com. +Account: lode dot vandevenne. + + +Copyright (c) 2005-2016 Lode Vandevenne +*/ diff --git a/xdl/third_party/tbb/examples/graph/stereo/msvs/stereo.sln b/xdl/third_party/tbb/examples/graph/stereo/msvs/stereo.sln new file mode 100644 index 00000000..ee332b88 --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/stereo/msvs/stereo.sln @@ -0,0 +1,28 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.40629.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "stereo", "stereo.vcxproj", "{9C777D75-70FF-4C24-AB74-EBCDF3328AB9}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {9C777D75-70FF-4C24-AB74-EBCDF3328AB9}.Debug|Win32.ActiveCfg = Debug|Win32 + {9C777D75-70FF-4C24-AB74-EBCDF3328AB9}.Debug|Win32.Build.0 = Debug|Win32 + {9C777D75-70FF-4C24-AB74-EBCDF3328AB9}.Debug|x64.ActiveCfg = Debug|x64 + {9C777D75-70FF-4C24-AB74-EBCDF3328AB9}.Debug|x64.Build.0 = Debug|x64 + {9C777D75-70FF-4C24-AB74-EBCDF3328AB9}.Release|Win32.ActiveCfg = Release|Win32 + {9C777D75-70FF-4C24-AB74-EBCDF3328AB9}.Release|Win32.Build.0 = Release|Win32 + {9C777D75-70FF-4C24-AB74-EBCDF3328AB9}.Release|x64.ActiveCfg = Release|x64 + {9C777D75-70FF-4C24-AB74-EBCDF3328AB9}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/xdl/third_party/tbb/examples/graph/stereo/msvs/stereo.vcxproj b/xdl/third_party/tbb/examples/graph/stereo/msvs/stereo.vcxproj new file mode 100644 index 00000000..e460eced --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/stereo/msvs/stereo.vcxproj @@ -0,0 +1,163 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {9C777D75-70FF-4C24-AB74-EBCDF3328AB9} + stereo + + + + Application + true + v120 + MultiByte + + + Application + true + v120 + MultiByte + + + Application + false + v120 + true + MultiByte + + + Application + false + v120 + true + MultiByte + + + + + + + + + + + + + + + + + + + $(SolutionDir)$(Platform)\$(Configuration)\ + $(SolutionDir)$(Platform)\$(ProjectName)\$(Configuration)\ + + + $(SolutionDir)$(Platform)\$(Configuration)\ + $(SolutionDir)$(Platform)\$(ProjectName)\$(Configuration)\ + + + $(SolutionDir)$(Platform)\$(Configuration)\ + $(SolutionDir)$(Platform)\$(ProjectName)\$(Configuration)\ + + + $(SolutionDir)$(Platform)\$(Configuration)\ + $(SolutionDir)$(Platform)\$(ProjectName)\$(Configuration)\ + + + + Level3 + Disabled + true + $(SolutionDir)..\..\..\..\include;$(INTELOCLSDKROOT)include;$(TBBROOT)\include;%(AdditionalIncludeDirectories) + _MBCS;_CRT_SECURE_NO_WARNINGS;_SCL_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + + + true + $(INTELOCLSDKROOT)lib\x86;$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc12;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc12;%(AdditionalLibraryDirectories) + OpenCL.lib;%(AdditionalDependencies) + + + + + Level3 + Disabled + true + $(SolutionDir)..\..\..\..\include;$(INTELOCLSDKROOT)include;$(TBBROOT)\include;%(AdditionalIncludeDirectories) + _MBCS;_CRT_SECURE_NO_WARNINGS;_SCL_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + + + true + $(INTELOCLSDKROOT)lib\x64;$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc12;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc12;%(AdditionalLibraryDirectories) + OpenCL.lib;%(AdditionalDependencies) + + + + + Level3 + MaxSpeed + true + true + true + $(SolutionDir)..\..\..\..\include;$(INTELOCLSDKROOT)include;$(TBBROOT)\include;%(AdditionalIncludeDirectories) + _MBCS;_CRT_SECURE_NO_WARNINGS;_SCL_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + + + true + true + true + $(INTELOCLSDKROOT)lib\x86;$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc12;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc12;%(AdditionalLibraryDirectories) + OpenCL.lib;%(AdditionalDependencies) + + + + + Level3 + MaxSpeed + true + true + true + $(SolutionDir)..\..\..\..\include;$(INTELOCLSDKROOT)include;$(TBBROOT)\include;%(AdditionalIncludeDirectories) + _MBCS;_CRT_SECURE_NO_WARNINGS;_SCL_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + + + true + true + true + $(INTELOCLSDKROOT)lib\x64;$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc12;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc12;%(AdditionalLibraryDirectories) + OpenCL.lib;%(AdditionalDependencies) + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/xdl/third_party/tbb/examples/graph/stereo/readme.html b/xdl/third_party/tbb/examples/graph/stereo/readme.html new file mode 100644 index 00000000..d7d787d1 --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/stereo/readme.html @@ -0,0 +1,445 @@ + + + + + + Intel® Threading Building Blocks. Stereo sample + + + + + +

+ The Stereo example is an implementation of the algorithm that applies stereoscopic 3D effect on two input images and achieved by means of encoding each eye's image using filters of different colors: red and blue - + Anaglyph effect. +

+ The example uses the flow graph interface and can be executed both on CPU and GPU for image processing. + The output of this application is a PNG image with the anaglyph effect applied. +

+ + This example includes software developed by Lode Vandevenne. See + here for copyright information. + +
+ It exemplifies the opencl_node usage in the flow graph interface in context of creating a stereo image from two input images. +

+ This example uses C++11 lambda expressions. Specifying a compiler option such as -std=c++11 or similar might be necessary in order to build the example. + For more information please refer to the documentation for the compiler you use. +

+ +
+
System Requirements
+ +
+

+ For the most up to date system requirements, see the release notes. +

+

+ Additionally, you have to install OpenCL™ version 1.2 or higher in order to run this example. See the OpenCL™ Drivers and Runtimes for Intel® Architecture. +

+
+
+ +
+
Files
+ +
+
+
stereo.cpp +
The implementation of stereo image creation algorithm based on the flow graph interface. +
lodepng.cpp +
Library for reading and writing png images. +
lodepng.h +
Public header file for the lodepng library. +
utils.h +
Support functions for this example. +
imageEffects.cl +
OpenCL kernel file with image effects algorithms. +
Makefile +
Makefile for building the example. +
+
+
+ +
+
Directories
+ +
+
+
msvs +
Contains Microsoft* Visual Studio* workspace for building and running the example (Windows* systems only). +
xcode +
Contains Xcode* IDE workspace for building and running the example (macOS* systems only). +
+

For information about the minimum supported version of IDE, see release notes.

+
+
+ +
+
Build instructions
+ +
+

General build directions can be found here.

+
+
+ +
+
Usage
+ +
+
+
stereo -h +
Prints the help for command line options +
stereo [-v] [-alg=value] [first_filename] [second_filename] +
-v print diagnostic output to screen
+ -alg name of the used pipeline realization - can be host, target (default) or host_target
+ first_filename first input file name
+ second_filename second input file name
+
+
+
+ +
+ Up to parent directory +
+ +
+
Legal Information
+ +
+

+ Intel and the Intel logo are trademarks of Intel Corporation in the U.S. and/or other countries. +
* Other names and brands may be claimed as the property of others. +
© 2018, Intel Corporation +

+ +

+ LodePNG version 20160409 + Copyright (c) 2005-2016 Lode Vandevenne +

+

+ This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. +
+ Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: +

    +
  1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +
  2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +
  3. This notice may not be removed or altered from any source + distribution. +
+

+
+
+ + + diff --git a/xdl/third_party/tbb/examples/graph/stereo/stereo.cpp b/xdl/third_party/tbb/examples/graph/stereo/stereo.cpp new file mode 100644 index 00000000..44dfd53c --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/stereo/stereo.cpp @@ -0,0 +1,441 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +#define TBB_PREVIEW_FLOW_GRAPH_NODES 1 +#define TBB_PREVIEW_FLOW_GRAPH_FEATURES 1 + +#include "tbb/tbb_config.h" +#include "../../common/utility/utility.h" + +#if __TBB_PREVIEW_OPENCL_NODE && __TBB_CPP11_LAMBDAS_PRESENT + +#if _MSC_VER +// suppress warning C4503: decorated name length exceeded, name was truncated +#pragma warning(disable : 4503) +#endif + +#include + +#include "tbb/flow_graph.h" +#include "tbb/flow_graph_opencl_node.h" +#include "tbb/tick_count.h" + +#include "utils.h" + +static const int redChannelOffset = 0; +static const int greenChannelOffset = 1; +static const int blueChannelOffset = 2; +static const int channelsPerPixel = 4; +static const unsigned int channelIncreaseValue = 10; + +void applyLeftImageEffect(utils::image_buffer& image) { + const int heighBase = channelsPerPixel * image.width; + std::vector& buffer = *image.buffer; + + // Increase the Red channel of left image by 10 + for (unsigned int y = 0; y < image.height; y++) { + const int heightOffset = heighBase * y; + for (unsigned int x = 0; x < image.width; x++) { + int pixelOffset = heightOffset + channelsPerPixel * x + redChannelOffset; + unsigned int pixelValue = buffer[pixelOffset] + channelIncreaseValue; + buffer[pixelOffset] = utils::convert_uchar_sat(pixelValue); + } + } +} + +void applyRightImageEffect(utils::image_buffer& image) { + const int heighBase = channelsPerPixel * image.width; + std::vector& buffer = *image.buffer; + + // Increase the Blue channel of left image by 10 + for (unsigned int y = 0; y < image.height; y++) { + const int heightOffset = heighBase * y; + for (unsigned int x = 0; x < image.width; x++) { + const int pixelOffset = heightOffset + channelsPerPixel * x + blueChannelOffset; + unsigned int pixelValue = buffer[pixelOffset] + channelIncreaseValue; + buffer[pixelOffset] = utils::convert_uchar_sat(pixelValue); + } + } +} + +// This function merges to image buffers into the first buffer (leftImageBuffer as a destination) +void mergeImageBuffers(utils::image_buffer& leftImage, const utils::image_buffer& rightImage) { + const int heighBase = channelsPerPixel * leftImage.width; + std::vector& leftImageBuffer = *leftImage.buffer; + std::vector& rightImageBuffer = *rightImage.buffer; + + // Apply stereoscopic merge using algorithm: R: left image, G: left and right images (middle value), B: right image + for (unsigned int y = 0; y < leftImage.height; y++) { + const int heightOffset = heighBase * y; + for (unsigned int x = 0; x < leftImage.width; x++) { + const int pixelOffset = heightOffset + channelsPerPixel * x; + const int greenChannelIndex = pixelOffset + greenChannelOffset; + const int blueChannelIndex = pixelOffset + blueChannelOffset; + const int middleGreenChannel = (leftImageBuffer[greenChannelIndex] + rightImageBuffer[greenChannelIndex]); + leftImageBuffer[greenChannelIndex] = middleGreenChannel / 2; + leftImageBuffer[blueChannelIndex] = rightImageBuffer[blueChannelIndex]; + } + } +} + +void fillOpenclBuffer(tbb::flow::opencl_buffer& openclBuffer, const std::vector& sourceBuffer) { + std::copy(sourceBuffer.begin(), sourceBuffer.end(), openclBuffer.begin()); +} + +class gpu_device_selector { +public: + template + tbb::flow::opencl_device operator()(tbb::flow::opencl_factory& f) { + // Set your GPU device if available to execute kernel on + const tbb::flow::opencl_device_list &devices = f.devices(); + tbb::flow::opencl_device_list::const_iterator it = std::find_if( + devices.cbegin(), devices.cend(), + [](const tbb::flow::opencl_device &d) { + cl_device_type type; + d.info(CL_DEVICE_TYPE, type); + return CL_DEVICE_TYPE_GPU == type; + }); + + if (it == devices.cend()) { + std::cout << "Info: could not find any GPU devices. Choosing the first available device (default behaviour)." << std::endl; + return *(f.devices().begin()); + } else { + // Return GPU device from factory + return *it; + } + } +}; + +// Image processing function that is executed on CPU only +void hostFunction(const std::string& firstFile, const std::string& secondFile, const std::string& outputFile) { + using namespace tbb::flow; + typedef tuple< utils::image_buffer, utils::image_buffer > MergeImagesTuple; + + graph g; + + function_node< std::string, utils::image_buffer > fileReaderOne(g, serial, [](const std::string& fileToRead) -> utils::image_buffer { + return utils::getOrGenerateImage(fileToRead); + }); + + function_node< std::string, utils::image_buffer > fileReaderTwo = fileReaderOne; + + function_node< utils::image_buffer, utils::image_buffer > leftImageEffect(g, unlimited, [](utils::image_buffer image) -> utils::image_buffer { + applyLeftImageEffect(image); + return image; + }); + + function_node< utils::image_buffer, utils::image_buffer > rightImageEffect(g, unlimited, [](utils::image_buffer image) -> utils::image_buffer { + applyRightImageEffect(image); + return image; + }); + + join_node< tuple< utils::image_buffer, utils::image_buffer > > joinNode(g); + + function_node< MergeImagesTuple, utils::image_buffer > mergeImages(g, unlimited, [](const MergeImagesTuple& bufferTuple) -> utils::image_buffer { + // Two input images from tupple are merged into the first image, + utils::image_buffer leftImageBuffer = std::get<0>(bufferTuple); + utils::image_buffer rightImageBuffer = std::get<1>(bufferTuple); + + mergeImageBuffers(leftImageBuffer, rightImageBuffer); + + return leftImageBuffer; + }); + + function_node< utils::image_buffer > outputWriter(g, unlimited, [&outputFile](const utils::image_buffer& image) { + utils::writePNGImage(image, outputFile); + }); + + // Read left image + make_edge(fileReaderOne, leftImageEffect); + + // Read right image + make_edge(fileReaderTwo, rightImageEffect); + + // Process left image + make_edge(leftImageEffect, tbb::flow::input_port<0>(joinNode)); + + // Process right image + make_edge(rightImageEffect, tbb::flow::input_port<1>(joinNode)); + + // Merge images + make_edge(joinNode, mergeImages); + make_edge(mergeImages, outputWriter); + + // Start graph image processing + fileReaderOne.try_put(firstFile); + fileReaderTwo.try_put(secondFile); + + g.wait_for_all(); +} + + +// Image processing function using OpenCL +/** Reading and writing image to file is executed on CPU, while all buffers manipulation are executed on GPU */ +void openclFunctionGPU(const std::string& firstFile, const std::string& secondFile, const std::string& outputFile) { + using namespace tbb::flow; + typedef opencl_buffer OpenclImageBuffer; + typedef std::array NDRange; + typedef tuple< OpenclImageBuffer, cl_uint, NDRange > OpenclImageTuple; + typedef tuple< OpenclImageBuffer, OpenclImageBuffer, cl_uint, NDRange > OpenclImagesMergeTuple; + typedef tuple< OpenclImageBuffer, NDRange > WriteImageBufferTuple; + + graph g; + + gpu_device_selector gpu_selector; + + function_node< std::string, OpenclImageTuple > fileReaderOne(g, serial, [&g](const std::string& fileToRead) -> OpenclImageTuple { + utils::image_buffer src = utils::getOrGenerateImage(fileToRead); + + // Create and initialize opencl_buffer in order to pass it to kernel + OpenclImageBuffer oclImage(src.buffer->size()); + fillOpenclBuffer(oclImage, *src.buffer); + + NDRange rangeList = { src.width, src.height }; + return std::make_tuple(oclImage, src.width, rangeList); + }); + + function_node< std::string, OpenclImageTuple > fileReaderTwo = fileReaderOne; + + split_node< OpenclImageTuple > splitArgumentsLeftNode(g); + + // Kernel should be in the current folder + opencl_program<> program("imageEffects.cl"); + + opencl_node< OpenclImageTuple > leftImageEffect(g, program.get_kernel("applyLeftImageEffect"), gpu_selector); + + split_node< OpenclImageTuple > splitArgumentsRightNode(g); + + opencl_node< OpenclImageTuple > rightImageEffect(g, program.get_kernel("applyRightImageEffect"), gpu_selector); + + opencl_node< OpenclImagesMergeTuple > mergeImages(g, program.get_kernel("mergeImages"), gpu_selector); + + join_node< WriteImageBufferTuple > joinTupleNode(g); + + function_node< WriteImageBufferTuple > outputWriter(g, unlimited, [&outputFile](const WriteImageBufferTuple& image) { + // The result image have to be copied in order to be changed, + // the second parameter - image size, can be taken by const reference + OpenclImageBuffer imageBuffer = std::get<0>(image); + const NDRange& imageSize = std::get<1>(image); + unsigned int width = imageSize[0]; + unsigned int height = imageSize[1]; + + utils::writePNGImage(imageBuffer.data(), width, height, outputFile); + }); + + // Process left image + make_edge(fileReaderOne, splitArgumentsLeftNode); + make_edge(output_port<0>(splitArgumentsLeftNode), input_port<0>(leftImageEffect)); + make_edge(output_port<1>(splitArgumentsLeftNode), input_port<1>(leftImageEffect)); + + // Pass OpenCL NDRange via input port because it depends on input data + make_edge(output_port<2>(splitArgumentsLeftNode), input_port<2>(leftImageEffect)); + + // Process right image + make_edge(fileReaderTwo, splitArgumentsRightNode); + make_edge(output_port<0>(splitArgumentsRightNode), input_port<0>(rightImageEffect)); + make_edge(output_port<1>(splitArgumentsRightNode), input_port<1>(rightImageEffect)); + + // Pass OpenCL NDRange via input port because it depends on input data + make_edge(output_port<2>(splitArgumentsRightNode), input_port<2>(rightImageEffect)); + + // Merge images + make_edge(output_port<0>(leftImageEffect), input_port<0>(mergeImages)); + make_edge(output_port<0>(rightImageEffect), input_port<1>(mergeImages)); + make_edge(output_port<1>(leftImageEffect), input_port<2>(mergeImages)); + + // Set OpenCL NDRange here (because the values may vary, depending on input data) + make_edge(output_port<2>(leftImageEffect), input_port<3>(mergeImages)); + + // Write image to PNG + make_edge(output_port<0>(mergeImages), input_port<0>(joinTupleNode)); + make_edge(output_port<3>(mergeImages), input_port<1>(joinTupleNode)); + make_edge(joinTupleNode, outputWriter); + + // Define where to get ndrange and kernel arguments + leftImageEffect.set_args(port_ref<0, 1>()); + leftImageEffect.set_range(port_ref<2>()); + + rightImageEffect.set_args(port_ref<0, 1>()); + rightImageEffect.set_range(port_ref<2>()); + + mergeImages.set_args(port_ref<0, 2>()); + mergeImages.set_range(port_ref<3>()); + + // Start graph image processing pipeline + fileReaderOne.try_put(firstFile); + fileReaderTwo.try_put(secondFile); + + g.wait_for_all(); +} + + +// Second image processing function using OpenCL +/** Reading and writing image to file is executed on CPU, while some buffers manipulation are executed on GPU + and others runs on CPU device. This case should have the best performance among others. */ +void openclFunctionGPUPlusCPU(const std::string& firstFile, const std::string& secondFile, const std::string& outputFile) { + using namespace tbb::flow; + typedef opencl_buffer OpenclImageBuffer; + typedef std::array NDRange; + typedef tuple< OpenclImageBuffer, cl_uint, NDRange > OpenclImageTuple; + typedef tuple< OpenclImageBuffer, OpenclImageBuffer, cl_uint, NDRange > OpenclImagesMergeTuple; + typedef tuple< OpenclImageBuffer, NDRange > WriteImageBufferTuple; + + graph g; + + gpu_device_selector gpu_selector; + + function_node< std::string, OpenclImageTuple > fileReaderOne(g, serial, [&g](const std::string& fileToRead) -> OpenclImageTuple { + utils::image_buffer src = utils::getOrGenerateImage(fileToRead); + + // Create and initialize opencl_buffer in order to pass it to mergeImages kernel + OpenclImageBuffer oclImage(src.buffer->size()); + fillOpenclBuffer(oclImage, *src.buffer); + + NDRange rangeList = { src.width, src.height }; + return std::make_tuple(oclImage, src.width, rangeList); + }); + + function_node< std::string, utils::image_buffer > fileReaderTwo(g, serial, [](const std::string& fileToRead) -> utils::image_buffer { + return utils::readPNGImage(fileToRead); + }); + + split_node< OpenclImageTuple > splitArgumentsLeftNode(g); + + // Kernel should be in the current folder + opencl_program<> program("imageEffects.cl"); + + opencl_node< OpenclImageTuple > leftImageEffect(g, program.get_kernel("applyLeftImageEffect"), gpu_selector); + + function_node< utils::image_buffer, OpenclImageBuffer > rightImageEffect(g, unlimited, [&g](utils::image_buffer image) -> OpenclImageBuffer { + applyRightImageEffect(image); + + // Create and initialize opencl_buffer in order to pass it to kernel + OpenclImageBuffer oclImage(image.buffer->size()); + fillOpenclBuffer(oclImage, *image.buffer); + + return oclImage; + }); + + opencl_node< OpenclImagesMergeTuple > mergeImages(g, program.get_kernel("mergeImages"), gpu_selector); + + join_node< WriteImageBufferTuple > joinTupleNode(g); + + function_node< WriteImageBufferTuple > outputWriter(g, unlimited, [&outputFile](const WriteImageBufferTuple& image) { + // The result image have to be copied in order to be changed, + // the second parameter - image size, can be taken by const reference + OpenclImageBuffer imageBuffer = std::get<0>(image); + const NDRange& imageSize = std::get<1>(image); + unsigned int width = imageSize[0]; + unsigned int height = imageSize[1]; + + utils::writePNGImage(imageBuffer.data(), width, height, outputFile); + }); + + // Process left image on GPU + make_edge(fileReaderOne, splitArgumentsLeftNode); + make_edge(output_port<0>(splitArgumentsLeftNode), input_port<0>(leftImageEffect)); + make_edge(output_port<1>(splitArgumentsLeftNode), input_port<1>(leftImageEffect)); + + // Pass OpenCL NDRange via input port because it depends on input data + make_edge(output_port<2>(splitArgumentsLeftNode), input_port<2>(leftImageEffect)); + + // Process right image on CPU + make_edge(fileReaderTwo, rightImageEffect); + + // Merge images on GPU + make_edge(output_port<0>(leftImageEffect), input_port<0>(mergeImages)); + make_edge(rightImageEffect, input_port<1>(mergeImages)); + make_edge(output_port<1>(leftImageEffect), input_port<2>(mergeImages)); + + // Pass OpenCL NDRange via input port because it depends on input data + make_edge(output_port<2>(leftImageEffect), input_port<3>(mergeImages)); + + // Write image to PNG + make_edge(output_port<0>(mergeImages), input_port<0>(joinTupleNode)); + make_edge(output_port<3>(mergeImages), input_port<1>(joinTupleNode)); + make_edge(joinTupleNode, outputWriter); + + // Define where to get ndrange and kernel arguments + leftImageEffect.set_args(port_ref<0, 1>()); + leftImageEffect.set_range(port_ref<2>()); + + mergeImages.set_args(port_ref<0, 2>()); + mergeImages.set_range(port_ref<3>()); + + // Start graph image processing pipeline + fileReaderOne.try_put(firstFile); + fileReaderTwo.try_put(secondFile); + + g.wait_for_all(); +} + + +int main(int argc, char* argv[]) { + try { + + tbb::tick_count mainStartTime = tbb::tick_count::now(); + + bool verbose = false; + std::string algVersion; + + std::string inputFileFirst; + std::string inputFileSecond; + std::string outputFile = "output.png"; + + utility::parse_cli_arguments(argc, argv, + utility::cli_argument_pack() + //"-h" option for displaying help + .arg(verbose, "-v", "verbose mode") + .arg(algVersion, "-alg", "name of the used pipeline realisation - can be host, target (default) or host_target") + .positional_arg(inputFileFirst, "first_filename", "first input file name") + .positional_arg(inputFileSecond, "second_filename", "second input file name") + ); + + if (!utils::isBothImagesExists(inputFileFirst, inputFileSecond)) { + std::cout << "Info: one or both images does not exists or empty. Input images will be generated instead." << std::endl; + inputFileFirst.clear(); + inputFileSecond.clear(); + } else { + std::cout << "First input file name: " << inputFileFirst << std::endl; + std::cout << "Second input file name: " << inputFileSecond << std::endl; + } + + if (algVersion.empty() || algVersion == "target") { + openclFunctionGPU(inputFileFirst, inputFileSecond, outputFile); + } else if (algVersion == "host_target") { + openclFunctionGPUPlusCPU(inputFileFirst, inputFileSecond, outputFile); + } else if (algVersion == "host") { + hostFunction(inputFileFirst, inputFileSecond, outputFile); + } + + utility::report_elapsed_time((tbb::tick_count::now() - mainStartTime).seconds()); + + return 0; + } catch (std::exception& e) { + std::cerr << "Error occurred :\"" << e.what() << "\"\n"; + return -1; + } +} +#else +int main() { + utility::report_skipped(); + return 0; +} +#endif /* __TBB_PREVIEW_OPENCL_NODE && __TBB_CPP11_LAMBDAS_PRESENT */ diff --git a/xdl/third_party/tbb/examples/graph/stereo/utils.h b/xdl/third_party/tbb/examples/graph/stereo/utils.h new file mode 100644 index 00000000..c99399fb --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/stereo/utils.h @@ -0,0 +1,108 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +#include +#include + +#include "lodepng.h" + +namespace utils { + + inline unsigned char convert_uchar_sat(unsigned int v) { + return static_cast(v < UCHAR_MAX ? v : UCHAR_MAX); + } + + struct image_buffer { + unsigned int width, height; + std::shared_ptr< std::vector > buffer; // smart pointer to the vector of raw pixels in RGBA format, 4 bytes per pixel + }; + + image_buffer readPNGImage(const std::string& imageName) { + image_buffer image; + image.buffer = std::make_shared< std::vector >(); + + unsigned int error = lodepng::decode(*image.buffer, image.width, image.height, imageName.c_str()); + + if (error) { + std::string exceptionMessage = "decoder error: " + std::string(lodepng_error_text(error)); + throw std::runtime_error(exceptionMessage); + } + return image; + } + + void readPNGImage(unsigned char* imageBuffer, unsigned int& width, unsigned int& height, const char* imageName) { + unsigned int error = lodepng_decode32_file(&imageBuffer, &width, &height, imageName); + + if (error) { + std::string exceptionMessage = "decoder error: " + std::string(lodepng_error_text(error)); + throw std::runtime_error(exceptionMessage); + } + } + + void writePNGImage(const image_buffer& image, const std::string& outputFile) { + unsigned int error = lodepng::encode(outputFile, *image.buffer, image.width, image.height); + if (error) { + std::string exceptionMessage = "encoder error: " + std::string(lodepng_error_text(error)); + throw std::runtime_error(exceptionMessage); + } + } + + void writePNGImage(unsigned char* imageBuffer, unsigned int& width, unsigned int& height, const std::string& outputFile) { + unsigned int error = lodepng::encode(outputFile, imageBuffer, width, height); + if (error) { + std::string exceptionMessage = "encoder error: " + std::string(lodepng_error_text(error)); + throw std::runtime_error(exceptionMessage); + } + } + + image_buffer generatePNGImage() { + image_buffer image; + image.width = 1024; + image.height = 1024; + + image.buffer = std::make_shared< std::vector >(image.width * image.height * 4); + std::vector& buffer = *image.buffer; + + const int widthOffset = 4 * image.width; + for (unsigned y = 0; y < image.height; y++) { + for (unsigned x = 0; x < image.width; x++) { + const int pixelOffset = widthOffset * y + 4 * x; + buffer[pixelOffset] = 200 * !(x & y); + buffer[pixelOffset + 1] = x ^ y; + buffer[pixelOffset + 2] = x | y; + buffer[pixelOffset + 3] = 255; + } + } + return image; + } + + bool isFileExist(const std::string& fileName) { + std::ifstream file(fileName); + return file.good(); + } + + bool isBothImagesExists(const std::string& firstFile, const std::string& secondFile) { + return isFileExist(firstFile) && isFileExist(secondFile); + } + + image_buffer getOrGenerateImage(const std::string& fileName) { + return fileName.empty() ? generatePNGImage() : readPNGImage(fileName); + } +} diff --git a/xdl/third_party/tbb/examples/graph/stereo/xcode/stereo.xcodeproj/project.pbxproj b/xdl/third_party/tbb/examples/graph/stereo/xcode/stereo.xcodeproj/project.pbxproj new file mode 100644 index 00000000..820122d4 --- /dev/null +++ b/xdl/third_party/tbb/examples/graph/stereo/xcode/stereo.xcodeproj/project.pbxproj @@ -0,0 +1,324 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 8415B6821CFC8B7F00A875B5 /* stereo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8415B6801CFC8B7F00A875B5 /* stereo.cpp */; }; + 8415B6881CFC8B9200A875B5 /* lodepng.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8415B6851CFC8B9200A875B5 /* lodepng.cpp */; }; + 8415B68A1CFC96D900A875B5 /* OpenCL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8415B6891CFC96D900A875B5 /* OpenCL.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXBuildRule section */ + C3C58958218B657900DAC94C /* PBXBuildRule */ = { + isa = PBXBuildRule; + compilerSpec = com.intel.compilers.icc.latest; + fileType = sourcecode.cpp; + isEditable = 1; + outputFiles = ( + ); + script = "# Type a script or drag a script file from your workspace to insert its path.\n"; + }; +/* End PBXBuildRule section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 8DD76F690486A84900D96B5E /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 12; + dstPath = ""; + dstSubfolderSpec = 16; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 8415B6801CFC8B7F00A875B5 /* stereo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = stereo.cpp; path = ../stereo.cpp; sourceTree = ""; }; + 8415B6831CFC8B9200A875B5 /* imageEffects.cl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.opencl; name = imageEffects.cl; path = ../imageEffects.cl; sourceTree = ""; }; + 8415B6851CFC8B9200A875B5 /* lodepng.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = lodepng.cpp; path = ../lodepng.cpp; sourceTree = ""; }; + 8415B6861CFC8B9200A875B5 /* lodepng.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = lodepng.h; path = ../lodepng.h; sourceTree = ""; }; + 8415B6891CFC96D900A875B5 /* OpenCL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenCL.framework; path = System/Library/Frameworks/OpenCL.framework; sourceTree = SDKROOT; }; + 8DD76F6C0486A84900D96B5E /* Stereo */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = Stereo; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 8DD76F660486A84900D96B5E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 8415B68A1CFC96D900A875B5 /* OpenCL.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 08FB7794FE84155DC02AAC07 /* Stereo */ = { + isa = PBXGroup; + children = ( + 8415B6891CFC96D900A875B5 /* OpenCL.framework */, + 08FB7795FE84155DC02AAC07 /* Source */, + 1AB674ADFE9D54B511CA2CBB /* Products */, + ); + name = Stereo; + sourceTree = ""; + }; + 08FB7795FE84155DC02AAC07 /* Source */ = { + isa = PBXGroup; + children = ( + 8415B6831CFC8B9200A875B5 /* imageEffects.cl */, + 8415B6851CFC8B9200A875B5 /* lodepng.cpp */, + 8415B6861CFC8B9200A875B5 /* lodepng.h */, + 8415B6801CFC8B7F00A875B5 /* stereo.cpp */, + ); + name = Source; + sourceTree = ""; + }; + 1AB674ADFE9D54B511CA2CBB /* Products */ = { + isa = PBXGroup; + children = ( + 8DD76F6C0486A84900D96B5E /* Stereo */, + ); + name = Products; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 8DD76F620486A84900D96B5E /* Stereo */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "Stereo" */; + buildPhases = ( + 8DD76F640486A84900D96B5E /* Sources */, + 8DD76F660486A84900D96B5E /* Frameworks */, + 8DD76F690486A84900D96B5E /* CopyFiles */, + ); + buildRules = ( + C3C58958218B657900DAC94C /* PBXBuildRule */, + ); + dependencies = ( + ); + name = Stereo; + productInstallPath = "$(HOME)/bin"; + productName = Stereo; + productReference = 8DD76F6C0486A84900D96B5E /* Stereo */; + productType = "com.apple.product-type.tool"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 08FB7793FE84155DC02AAC07 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1000; + }; + buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "stereo" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 1; + knownRegions = ( + en, + ); + mainGroup = 08FB7794FE84155DC02AAC07 /* Stereo */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 8DD76F620486A84900D96B5E /* Stereo */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + 8DD76F640486A84900D96B5E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8415B6881CFC8B9200A875B5 /* lodepng.cpp in Sources */, + 8415B6821CFC8B7F00A875B5 /* stereo.cpp in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + A1F593C60B8F0E6E00073279 /* Debug64 */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_VERSION = ""; + HEADER_SEARCH_PATHS = "$(inherited)"; + ICC_CXX_LANG_DIALECT = "c++11"; + INSTALL_PATH = "$(HOME)/bin"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited)"; + LIBRARY_SEARCH_PATHS = "$(inherited)"; + PRODUCT_NAME = Stereo; + ZERO_LINK = NO; + }; + name = Debug64; + }; + A1F593C70B8F0E6E00073279 /* Release64 */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_GENERATE_DEBUGGING_SYMBOLS = NO; + GCC_VERSION = ""; + HEADER_SEARCH_PATHS = "$(inherited)"; + ICC_CXX_LANG_DIALECT = "c++11"; + INSTALL_PATH = "$(HOME)/bin"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited)"; + LIBRARY_SEARCH_PATHS = "$(inherited)"; + PRODUCT_NAME = Stereo; + ZERO_LINK = NO; + }; + name = Release64; + }; + A1F593C80B8F0E6E00073279 /* Debug64 */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_ENABLE_CPP_RTTI = YES; + GCC_MODEL_TUNING = ""; + GCC_NO_COMMON_BLOCKS = YES; + GCC_VERSION = ""; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(TBBROOT)/include", + /opt/intel/tbb/include, + ); + ICC_CXX_LANG_DIALECT = "c++11"; + LD_RUNPATH_SEARCH_PATHS = "$(TBBROOT)/lib /opt/intel/tbb/lib"; + LIBRARY_SEARCH_PATHS = ( + "$(TBBROOT)/lib", + /opt/intel/tbb/lib, + ); + MACOSX_DEPLOYMENT_TARGET = 10.11; + ONLY_ACTIVE_ARCH = YES; + OTHER_CPLUSPLUSFLAGS = ( + "$(OTHER_CFLAGS)", + "-m64", + ); + OTHER_LDFLAGS = ( + "-m64", + "-ltbb_debug", + "-framework", + OpenCL, + ); + PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO; + SYMROOT = "/tmp/tbb-$(USER)"; + VALID_ARCHS = x86_64; + }; + name = Debug64; + }; + A1F593C90B8F0E6E00073279 /* Release64 */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_ENABLE_CPP_RTTI = YES; + GCC_MODEL_TUNING = ""; + GCC_NO_COMMON_BLOCKS = YES; + GCC_VERSION = ""; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(TBBROOT)/include", + /opt/intel/tbb/include, + ); + ICC_CXX_LANG_DIALECT = "c++11"; + LD_RUNPATH_SEARCH_PATHS = "$(TBBROOT)/lib /opt/intel/tbb/lib"; + LIBRARY_SEARCH_PATHS = ( + "$(TBBROOT)/lib", + /opt/intel/tbb/lib, + ); + MACOSX_DEPLOYMENT_TARGET = 10.11; + OTHER_CPLUSPLUSFLAGS = ( + "$(OTHER_CFLAGS)", + "-m64", + ); + OTHER_LDFLAGS = ( + "-m64", + "-ltbb", + "-framework", + OpenCL, + ); + PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO; + SYMROOT = "/tmp/tbb-$(USER)"; + VALID_ARCHS = x86_64; + }; + name = Release64; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "Stereo" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A1F593C60B8F0E6E00073279 /* Debug64 */, + A1F593C70B8F0E6E00073279 /* Release64 */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug64; + }; + 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "stereo" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A1F593C80B8F0E6E00073279 /* Debug64 */, + A1F593C90B8F0E6E00073279 /* Release64 */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug64; + }; +/* End XCConfigurationList section */ + }; + rootObject = 08FB7793FE84155DC02AAC07 /* Project object */; +} diff --git a/xdl/third_party/tbb/examples/index.html b/xdl/third_party/tbb/examples/index.html new file mode 100644 index 00000000..e9065fef --- /dev/null +++ b/xdl/third_party/tbb/examples/index.html @@ -0,0 +1,581 @@ + + + + + + Intel® Threading Building Blocks Samples + + + + + +

+ This directory includes example usages of Intel® Threading Building Blocks (Intel® TBB). +

+ +
+
System Requirements:
+ +
+

+ For the most up to date system requirements, see the release notes. +

+
+
+ +
+
Directories
+ +
+
+
GettingStarted +
Examples from the Intel TBB Getting Started Guide. +
concurrent_hash_map +
Examples using concurrent_hash_map container. +
concurrent_priority_queue +
Examples using concurrent_priority_queue container. +
graph +
Examples using Intel TBB Flow Graph feature. +
parallel_do +
Examples using parallel_do algorithm. +
parallel_for +
Examples using parallel_for algorithm. +
parallel_reduce +
Examples using parallel_reduce algorithm. +
pipeline +
Examples using pipeline algorithm. +
task +
Examples using raw task interface. +
task_group +
Examples using task_group interface. +
task_arena +
Examples using the task_arena feature. +
test_all +
Examples that test various components of Intel TBB. +
common +
Common files for building various examples. Should not be used directly. But if you copy an example to other place this folder should be copied also and should have the same relative path for copied example. +
+
+
+ +
+
Build Instructions
+ +
+
+
+ Note: Some of the following directions refer to a shell window. This refers + to the command prompt environment/window normally used on your system: +
    +
  • cmd.exe command prompt window for Windows* systems +
  • sh, bash, csh, ksh, etc. (or compatible) shell window for Windows*, Linux* or macOS* systems +
+
+

+ Set up the environment for using Intel TBB: +

+
To set up the environment for Windows* OS:
+ +
+ +

+ It is strongly recommended to set up the environment when installing Intel TBB. + Do this by selecting the appropriate check-box during the install. However, if the environment is not set up + during installation, or you wish to build for an alternate architecture or Microsoft* Visual Studio* version, + it may be set up, for a given type of shell window, by using one of the following commands: +

+
+
For cmd.exe (command prompt): +
+
+<installdir>/bin/tbbvars.bat (arch) [vs]
+					
+
where: +
+
  • (arch) argument represents target architecture. Its possible values are 'ia32' or 'intel64'. +
  • [vs] argument represents target version of Microsoft* Visual Studio*. Its possible values are: +
      +
    • 'vs<msvs_version>' - to use Intel TBB library with Microsoft* Visual Studio* <msvs_version> runtime DLLs, e.g.: tbbvars intel64 vs2015 +
      Note: for the most up to date supported versions of Microsoft* Visual Studio*, see the release notes. +
    • 'all' - to use Intel TBB binaries statically linked with Microsoft Visual C++ runtime. +
      If [vs] is not set the 'all' value will be used by default. +
    +
  • +
    +
    +
    To set up the environment for Linux* OS and macOS*:
    + +
    +

    + The environment may be set up, for a given type of shell window, by using one of the following commands: +

    +
    +
    For sh, bash, ksh, dash (or compatibles): +
    +
    +. <installdir>/bin/tbbvars.sh (arch) [platform [TBBROOT_detection_mode]]
    +				
    +
    For csh (or compatibles): +
    +
    +source <installdir>/bin/tbbvars.csh (arch) [platform [TBBROOT_detection_mode]]
    +				
    +
    where: +
    +
  • (arch) argument represents target architecture. Its possible values are 'ia32' or 'intel64'. +
  • [platform] argument represents target platform. Its possible values are 'linux' or 'android'. +
  • [TBBROOT_detection_mode] argument represents TBBROOT path detection method. Its only possible value is 'auto_tbbroot'. In this case the environment variable TBBROOT is detected automatically by using the tbbvars script directory path. +
  • + Environment setup need only be performed once per shell window to be used. +
    Always source tbbvars.sh or tbbvars.csh rather than executing them directly. +
    If the arguments to the sourced script are ignored (consult documentation for your shell) the alternative way to specify target is environment variables COMPILERVARS_ARCHITECTURE to pass (arch) to the script and COMPILERVARS_PLATFORM to pass [platform]. + +
    +

    + Build each example by using one of the following methods: +

    +
    To build by using a Microsoft* Visual Studio* project (Windows* systems):
    + +
    +
      +
    1. Identify the solution (*.sln) file for the example you wish to build and run. The *.sln file for each example is in the example's msvs sub-directory. +
    2. Open the project by using one of the following methods: +
        +
      • Navigate to the *.sln file from My Computer, by using Windows Explorer, or by using another file browser. Double-click the *.sln file to invoke Microsoft* Visual Studio* and open the project.
      • +
      • Invoke Microsoft* Visual Studio* from the Start menu and use the "Open Project" dialog to navigate to and open the project.
      • +
      +
    3. +
    4. Press <ctrl-F5> to build and run the example.
    5. +
    6. If you copied an example to another place separately from libraries you need to + set %TBBROOT% variable pointing to <installdir> folder.
    7. +
    +
    +
    +
    To build by using a Xcode* IDE project (macOS* systems):
    + +
    +
    +
    + Note: Xcode* project instructions are not applicable for the Intel TBB Sample Bundle for Intel® System Studio + because Intel System Studio does not support macOS*. For additional information, see the + Release Notes. +
    +
      +
    1. Identify the project (*.xcodeproj) file for the example you wish to build and run. The *.xcodeproj file is in the example's xcode sub-directory.
    2. +
    3. Open the project by using one of the following methods: +
        +
      • Navigate to the *.xcodeproj file by using the Finder.Double-click the *.xcodeproj file to invoke the Xcode* IDE and open the project.
      • +
      • Invoke the Xcode* IDE and use the "File -> Open" dialog to navigate to and open the project.
      • +
      +
    4. +
    5. Press <Apple-R>, or press the "Build and Go" button in the toolbox, to build and run the example. +
    6. +
    +
    +
    +
    To build by using a Makefile (Windows*, Linux* or macOS* systems):
    + +
    +
      +
    1. Open a shell window +
        +
      • For Windows* systems, make sure this shell window has the proper environment + defined for use with Microsoft* Visual Studio*. Such shell can be invoked from the Start menu, under Microsoft* Visual Studio*, Microsoft* Visual Studio Tools*, Microsoft* Visual Studio* Command Prompt.
      • +
      +
    2. Set up the environment in this shell window for use with Intel TBB. +
      See above for how to set up the environment for Windows*, Linux* or macOS* systems. +
    3. Unless you installed Intel TBB yourself, you may not have write permissions to the directory + containing the example. In this case, make a copy of the example, and use the copy for the following steps. +
    4. In the shell window, navigate to the directory for the example + (or to the directory for the copy of the example if you made one in the previous step). +
    5. Use one or more of the following commands to build and run the example. + Here, make refers to the make command normally used on your system: this could be + nmake, gmake, or make on Windows* systems, or make or gmake on Linux* or macOS* systems. +
      +
      make +
      Default build and run. Equivalent to 'make release test'. +
      make release +
      Compile and link against the release version of Intel TBB runtime library. The resulting executable is left in the directory for the example. +
      make debug +
      Compile and link against the debug version of Intel TBB runtime library. The resulting executable is left in the directory for the example. +
      make profile +
      Similar to 'make release' but also enables additional support for Intel® Parallel Studio XE analysis tools. +
      +
      + Note: Only flow graph examples are currently supported. +
      +
      make test +
      Run an executable previously produced by one of the above commands. +
      make [(above options or targets)] CXX={icl, icc} +
      Build and run as above, but use Intel® C++ Compiler instead of default, native compilers (e.g., icl instead of cl.exe on Windows* systems, or icc instead of g++ on Linux* or macOS* systems). +
      make [(above options or targets)] offload=mic +
      Build and run the offload version of an example for Intel® Many Integrated Core (Intel® MIC) Architecture. +
      +
      + Note: Only Intel® MIC Architecture with Linux* based host is currently supported. +
      +
      make clean +
      Remove any executables or intermediate files produced by the above commands. +
      +
    +
    +
    +
    +
    + +
    + Up to parent directory (available only in the Intel® Parallel Studio and Intel® System Studio Online Samples packages and the open-source version of Intel TBB) +
    +
    +
    Legal Information:
    + +
    +
    +
    + + + + + + + + + + + + +
    +

    Optimization Notice

    +
    +

    Intel's compilers may or may not optimize to the same + degree for non-Intel microprocessors for optimizations that + are not unique to Intel microprocessors. These optimizations + include SSE2, SSE3, and SSSE3 instruction sets and other + optimizations. Intel does not guarantee the availability, + functionality, or effectiveness of any optimization on + microprocessors not manufactured by Intel. + Microprocessor-dependent optimizations in this product are + intended for use with Intel microprocessors. Certain + optimizations not specific to Intel microarchitecture are + reserved for Intel microprocessors. Please refer to the + applicable product User and Reference Guides for more + information regarding the specific instruction sets covered by + this notice. +

    +

    Notice revision #20110804 +

    +
    +
    + +

    + Intel and the Intel logo are trademarks of Intel Corporation in the U.S. and/or other countries. +
    * Other names and brands may be claimed as the property of others. +
    © 2018, Intel Corporation +

    +
    +
    + + + \ No newline at end of file diff --git a/xdl/third_party/tbb/examples/parallel_do/index.html b/xdl/third_party/tbb/examples/parallel_do/index.html new file mode 100644 index 00000000..f211569b --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_do/index.html @@ -0,0 +1,344 @@ + + + + + + Intel® Threading Building Blocks. Samples on parallel_do algorithm + + + + + +

    + This directory has examples of the parallel_do algorithm. +

    + +
    +
    Directories
    + +
    +
    +
    parallel_preorder +
    Parallel preorder traversal of a graph. +
    +
    +
    +
    + Up to parent directory +
    +
    +
    Legal Information:
    + +
    +

    + Intel and the Intel logo are trademarks of Intel Corporation in the U.S. and/or other countries. +
    * Other names and brands may be claimed as the property of others. +
    © 2018, Intel Corporation +

    +
    +
    + + + diff --git a/xdl/third_party/tbb/examples/parallel_do/parallel_preorder/Graph.cpp b/xdl/third_party/tbb/examples/parallel_do/parallel_preorder/Graph.cpp new file mode 100644 index 00000000..c8429dbc --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_do/parallel_preorder/Graph.cpp @@ -0,0 +1,101 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +#include +#include "Graph.h" +#include + +using namespace std; + +void Graph::create_random_dag( size_t number_of_nodes ) { + my_vertex_set.resize(number_of_nodes); + for( size_t k=0; k>8)%5u); + if( op>int(k) ) op = int(k); + switch( op ) { + default: + c.op = OP_VALUE; + c.value = Cell::value_type((float)k); + break; + case 1: + c.op = OP_NEGATE; + break; + case 2: + c.op = OP_SUB; + break; + case 3: + c.op = OP_ADD; + break; + case 4: + c.op = OP_MUL; + break; + } + for( int j=0; j& root_set ) { + for( size_t k=0; ksuccessor.push_back(&c); + } + if( ArityOfOp[c.op]==0 ) + root_set.push_back(&my_vertex_set[k]); + } +} + +void Cell::update() { + switch( op ) { + case OP_VALUE: + break; + case OP_NEGATE: + value = -(input[0]->value); + break; + case OP_ADD: + value = input[0]->value + input[1]->value; + break; + case OP_SUB: + value = input[0]->value - input[1]->value; + break; + case OP_MUL: + value = input[0]->value * input[1]->value; + break; + } +} + diff --git a/xdl/third_party/tbb/examples/parallel_do/parallel_preorder/Graph.h b/xdl/third_party/tbb/examples/parallel_do/parallel_preorder/Graph.h new file mode 100644 index 00000000..1f4ed128 --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_do/parallel_preorder/Graph.h @@ -0,0 +1,80 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +#include "Matrix.h" +#include "tbb/atomic.h" +#include + +enum OpKind { + // Use Cell's value + OP_VALUE, + // Unary negation + OP_NEGATE, + // Addition + OP_ADD, + // Subtraction + OP_SUB, + // Multiplication + OP_MUL +}; + +static const int ArityOfOp[] = {0,1,2,2,2}; + +class Cell { +public: + //! Operation for this cell + OpKind op; + + //! Inputs to this cell + Cell* input[2]; + + //! Type of value stored in a Cell + typedef Matrix value_type; + + //! Value associated with this Cell + value_type value; + + //! Set of cells that use this Cell as an input + std::vector successor; + + //! Reference count of number of inputs that are not yet updated. + tbb::atomic ref_count; + + //! Update the Cell's value. + void update(); + + //! Default constructor + Cell() {} +}; + +//! A directed graph where the vertices are Cells. +class Graph { + std::vector my_vertex_set; +public: + //! Create a random acyclic directed graph + void create_random_dag( size_t number_of_nodes ); + + //! Print the graph + void print(); + + //! Get set of cells that have no inputs. + void get_root_set( std::vector& root_set ); +}; + diff --git a/xdl/third_party/tbb/examples/parallel_do/parallel_preorder/Makefile b/xdl/third_party/tbb/examples/parallel_do/parallel_preorder/Makefile new file mode 100644 index 00000000..3516207c --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_do/parallel_preorder/Makefile @@ -0,0 +1,63 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +# GNU Makefile that builds and runs example. +run_cmd= +PROG=parallel_preorder +ARGS= +PERF_RUN_ARGS=auto silent 500000 100 +LIGHT_ARGS=1:auto:+4 n-of-traversals=50 + +# The C++ compiler +ifneq (,$(shell which icc 2>/dev/null)) +CXX=icc +endif # icc + +ifeq ($(shell uname), Linux) +ifeq ($(target), android) +LIBS+= --sysroot=$(SYSROOT) +run_cmd=../../common/android.linux.launcher.sh +else +LIBS+= -lrt +endif +else ifeq ($(shell uname), Darwin) +override CXXFLAGS += -Wl,-rpath,$(TBBROOT)/lib +endif + +all: release test + +release: *.cpp + $(CXX) -O2 -DNDEBUG $(CXXFLAGS) -o $(PROG) $^ -ltbb $(LIBS) + +debug: *.cpp + $(CXX) -O0 -g -DTBB_USE_DEBUG $(CXXFLAGS) -o $(PROG) $^ -ltbb_debug $(LIBS) + +clean: + $(RM) $(PROG) *.o *.d + +test: + $(run_cmd) ./$(PROG) $(ARGS) + +light_test: + $(run_cmd) ./$(PROG) $(LIGHT_ARGS) + +perf_build: release + +perf_run: + $(run_cmd) ./$(PROG) $(PERF_RUN_ARGS) + diff --git a/xdl/third_party/tbb/examples/parallel_do/parallel_preorder/Makefile.windows b/xdl/third_party/tbb/examples/parallel_do/parallel_preorder/Makefile.windows new file mode 100644 index 00000000..d4190126 --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_do/parallel_preorder/Makefile.windows @@ -0,0 +1,54 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +# Common Makefile that builds and runs example. + +# Just specify your program basename +PROG=Parallel_Preorder +ARGS= +PERF_RUN_ARGS=auto silent 500000 100 +LIGHT_ARGS=1:auto:+4 n-of-traversals=50 + +# Trying to find if icl.exe is set +CXX1 = $(TBB_CXX)- +CXX2 = $(CXX1:icl.exe-=icl.exe) +CXX = $(CXX2:-=cl.exe) + +# The C++ compiler options +MYCXXFLAGS = /TP /EHsc /W3 /nologo /D _CONSOLE /D _MBCS /D WIN32 /D _CRT_SECURE_NO_DEPRECATE $(CXXFLAGS) +MYLDFLAGS =/INCREMENTAL:NO /NOLOGO /DEBUG /FIXED:NO $(LDFLAGS) + +all: release test +release: compiler_check + $(CXX) *.cpp /MD /O2 /D NDEBUG $(MYCXXFLAGS) /link tbb.lib $(LIBS) $(MYLDFLAGS) /OUT:$(PROG).exe +debug: compiler_check + $(CXX) *.cpp /MDd /Od /Zi /D TBB_USE_DEBUG /D _DEBUG $(MYCXXFLAGS) /link tbb_debug.lib $(LIBS) $(MYLDFLAGS) /OUT:$(PROG).exe +clean: + @cmd.exe /C del $(PROG).exe *.obj *.?db *.manifest +test: + $(PROG) $(ARGS) +light_test: + $(PROG) $(LIGHT_ARGS) +compiler_check: + @echo compiler_test>compiler_test && @$(CXX) /E compiler_test >nul 2>&1 || echo "$(CXX) command not found. Check if CXX=$(CXX) is set properly" + @cmd.exe /C del compiler_test + +perf_build: release + +perf_run: + $(PROG) $(PERF_RUN_ARGS) diff --git a/xdl/third_party/tbb/examples/parallel_do/parallel_preorder/Matrix.h b/xdl/third_party/tbb/examples/parallel_do/parallel_preorder/Matrix.h new file mode 100644 index 00000000..aacc41d4 --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_do/parallel_preorder/Matrix.h @@ -0,0 +1,60 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +class Matrix { + static const int n = 20; + float array[n][n]; +public: + Matrix() {} + Matrix( float z ) { + for( int i=0; i +#include "tbb/task_scheduler_init.h" +#include "tbb/tick_count.h" +#include "../../common/utility/utility.h" +#include +#include +#include "Graph.h" + +// some forward declarations +class Cell; +void ParallelPreorderTraversal( const std::vector& root_set ); + +//------------------------------------------------------------------------ +// Test driver +//------------------------------------------------------------------------ +utility::thread_number_range threads(tbb::task_scheduler_init::default_num_threads); +static unsigned nodes = 1000; +static unsigned traversals = 500; +static bool SilentFlag = false; + +//! Parse the command line. +static void ParseCommandLine( int argc, const char* argv[] ) { + utility::parse_cli_arguments( + argc,argv, + utility::cli_argument_pack() + //"-h" option for displaying help is present implicitly + .positional_arg(threads,"n-of-threads",utility::thread_number_range_desc) + .positional_arg(nodes,"n-of-nodes","number of nodes in the graph.") + .positional_arg(traversals,"n-of-traversals","number of times to evaluate the graph. Reduce it (e.g. to 100) to shorten example run time\n") + .arg(SilentFlag,"silent","no output except elapsed time ") + ); +} + +int main( int argc, const char* argv[] ) { + try { + tbb::tick_count main_start = tbb::tick_count::now(); + ParseCommandLine(argc,argv); + + // Start scheduler with given number of threads. + for( int p=threads.first; p<=threads.last; p = threads.step(p) ) { + tbb::tick_count t0 = tbb::tick_count::now(); + tbb::task_scheduler_init init(p); + srand(2); + size_t root_set_size = 0; + { + Graph g; + g.create_random_dag(nodes); + std::vector root_set; + g.get_root_set(root_set); + root_set_size = root_set.size(); + for( unsigned int trial=0; trial + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + parallel_preorder + {3AA40693-F93D-4D4B-B32E-068F511A252B} + parallel_preorder + Win32Proj + + + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.40219.1 + $(TEMP)\tbb_examples\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Configuration)\ + false + $(TEMP)\tbb_examples\$(Platform)\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Platform)\$(Configuration)\ + false + $(TEMP)\tbb_examples\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Configuration)\ + false + $(TEMP)\tbb_examples\$(Platform)\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Platform)\$(Configuration)\ + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG;%(PreprocessorDefinitions) + MultiThreadedDebugDLL + + + ProgramDatabase + + + tbb_debug.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc12;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc12;%(AdditionalLibraryDirectories) + true + Console + MachineX86 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 debug "$(OutDir)" + + + + + X64 + + + Disabled + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG;%(PreprocessorDefinitions) + MultiThreadedDebugDLL + + + ProgramDatabase + + + tbb_debug.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc12;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc12;%(AdditionalLibraryDirectories) + true + Console + MachineX64 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 debug "$(OutDir)" + + + + + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + + + ProgramDatabase + + + tbb.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc12;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc12;%(AdditionalLibraryDirectories) + true + Console + true + true + MachineX86 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 release "$(OutDir)" + + + + + X64 + + + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + + + ProgramDatabase + + + tbb.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc12;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc12;%(AdditionalLibraryDirectories) + true + Console + true + true + MachineX64 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 release "$(OutDir)" + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/xdl/third_party/tbb/examples/parallel_do/parallel_preorder/parallel_preorder.cpp b/xdl/third_party/tbb/examples/parallel_do/parallel_preorder/parallel_preorder.cpp new file mode 100644 index 00000000..0839da9e --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_do/parallel_preorder/parallel_preorder.cpp @@ -0,0 +1,56 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +#include "tbb/parallel_do.h" +#include +#include +#include "Graph.h" + + +class Body { +public: + Body() {}; + + //------------------------------------------------------------------------ + // Following signatures are required by parallel_do + //------------------------------------------------------------------------ + typedef Cell* argument_type; + + void operator()( Cell* c, tbb::parallel_do_feeder& feeder ) const { + c->update(); + // Restore ref_count in preparation for subsequent traversal. + c->ref_count = ArityOfOp[c->op]; + for( size_t k=0; ksuccessor.size(); ++k ) { + Cell* successor = c->successor[k]; + // ref_count is used for inter-task synchronization. + // Correctness checking tools might not take this into account, and report + // data races between different tasks, that are actually synchronized. + if( 0 == --(successor->ref_count) ) { + feeder.add( successor ); + } + } + } +}; + +void ParallelPreorderTraversal( const std::vector& root_set ) { + tbb::parallel_do(root_set.begin(), root_set.end(),Body()); +} + + diff --git a/xdl/third_party/tbb/examples/parallel_do/parallel_preorder/readme.html b/xdl/third_party/tbb/examples/parallel_do/parallel_preorder/readme.html new file mode 100644 index 00000000..43b17683 --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_do/parallel_preorder/readme.html @@ -0,0 +1,444 @@ + + + + + + Intel® Threading Building Blocks. Parallel_preorder sample + + + + + +

    + Example that uses parallel_do to do parallel preorder traversal of a sparse graph. +

    + Each vertex in the graph is called a "cell". + Each cell has a value. + The value is a matrix. + Some of the cells have operators + that compute the cell's value, using other cell's values as input. + A cell that uses the value of cell x is called a successor of x. +

    + The algorithm works as follows. +

      +
    1. Compute the set of cells that have no inputs. This set is called root_set. +
    2. Each cell has an associated field ref_count that is an atomic integer. + Initialize ref_count to the number of inputs for the Cell. +
    3. Update each cell in root_set, by applying a parallel_do to a root_set +
    4. After updating a cell, for each of its successors +
        +
      1. Atomically decrement the successor's ref_count +
      2. If the count became zero, add the cell to the set of cells to be updated, + by calling parallel_do_feeder_impl::add. +
      +
    + The times printed are for the traversal and update, + and do not include time for computing the root_set. +

    + The example is using custom synchronization via ref_count atomic variable. + Correctness checking tools might not take this into account, and report data races + between different tasks that are actually synchronized. +

    + Note: It is important to understand that this example is unlikely to show speedup + if the cell values are changed to type "float". The reason is twofold. +
      +
    • The smaller value type causes each Cell to be significantly smaller than a cache line, + which leads to false sharing conflicts. +
    • The time to update the cells becomes very small, and consequently the overhead of + parallel_do swamps the useful work. +
    +

    + +
    +
    System Requirements
    + +
    +

    + For the most up to date system requirements, see the release notes. +

    +
    +
    + +
    +
    Files
    + +
    +
    +
    main.cpp +
    Main program which parses command line options and runs the algorithm with different numbers of threads. +
    parallel_preorder.cpp +
    Implementation of the parallel preorder traversal algorithm. +
    Graph.h +
    Interfaces of the Graph and Cell classes. +
    Graph.cpp +
    Implementations of the Graph and Cell classes. +
    Matrix.h +
    The Matrix class definition. +
    Makefile +
    Makefile for building the example. +
    +
    +
    + +
    +
    Directories
    + +
    +
    +
    msvs +
    Contains Microsoft* Visual Studio* workspace for building and running the example (Windows* systems only). +
    xcode +
    Contains Xcode* IDE workspace for building and running the example (macOS* systems only). +
    +

    For information about the minimum supported version of IDE, see release notes.

    +
    +
    + +
    +
    Build instructions
    + +
    +

    General build directions can be found here.

    +
    +
    + +
    +
    Usage
    + +
    +
    +
    parallel_preorder -h +
    Prints the help for command line options +
    parallel_preorder [n-of-threads=value] [n-of-nodes=value] [n-of-traversals=value] [silent] +
    parallel_preorder [n-of-threads [n-of-nodes [n-of-traversals]]] [silent] +
    n-of-threads is the number of threads to use; a range of the form low[:high], where low and optional high are non-negative integers or 'auto' for a platform-specific default number.
    + n-of-nodes is a number of nodes in the graph. Default value is 1000.
    + n-of-traversals is the number of times to evaluate the graph. Default value is 500.
    + silent - no output except elapsed time.
    +
    To run a short version of this example, e.g., for use with Intel® Parallel Inspector: +
    Build a debug version of the example + (see the build instructions). +
    Run it with the desired number of threads and smaller number of traversals, e.g., parallel_preorder 4 1000 5. +
    +
    +
    + +
    + Up to parent directory +
    +
    +
    Legal Information
    + +
    +

    + Intel and the Intel logo are trademarks of Intel Corporation in the U.S. and/or other countries. +
    * Other names and brands may be claimed as the property of others. +
    © 2018, Intel Corporation +

    +
    +
    + + + diff --git a/xdl/third_party/tbb/examples/parallel_do/parallel_preorder/xcode/parallel_preorder.xcodeproj/project.pbxproj b/xdl/third_party/tbb/examples/parallel_do/parallel_preorder/xcode/parallel_preorder.xcodeproj/project.pbxproj new file mode 100644 index 00000000..d3c8cb6a --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_do/parallel_preorder/xcode/parallel_preorder.xcodeproj/project.pbxproj @@ -0,0 +1,272 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 05593AA80B8F55D500DE73AB /* Graph.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 05593AA40B8F55D500DE73AB /* Graph.cpp */; }; + 05593AAB0B8F55D500DE73AB /* parallel_preorder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 05593AA70B8F55D500DE73AB /* parallel_preorder.cpp */; }; + EAD808FA13051AB300FE8C7C /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EAD808F913051AB300FE8C7C /* main.cpp */; }; +/* End PBXBuildFile section */ + +/* Begin PBXBuildRule section */ + C3C58959218B66AC00DAC94C /* PBXBuildRule */ = { + isa = PBXBuildRule; + compilerSpec = com.intel.compilers.icc.latest; + fileType = sourcecode.cpp; + isEditable = 1; + outputFiles = ( + ); + script = "# Type a script or drag a script file from your workspace to insert its path.\n"; + }; +/* End PBXBuildRule section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 8DD76F690486A84900D96B5E /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 12; + dstPath = ""; + dstSubfolderSpec = 16; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 05593AA40B8F55D500DE73AB /* Graph.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = Graph.cpp; path = ../Graph.cpp; sourceTree = SOURCE_ROOT; }; + 05593AA50B8F55D500DE73AB /* Graph.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = Graph.h; path = ../Graph.h; sourceTree = SOURCE_ROOT; }; + 05593AA60B8F55D500DE73AB /* Matrix.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = Matrix.h; path = ../Matrix.h; sourceTree = SOURCE_ROOT; }; + 05593AA70B8F55D500DE73AB /* parallel_preorder.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = parallel_preorder.cpp; path = ../parallel_preorder.cpp; sourceTree = SOURCE_ROOT; }; + 8DD76F6C0486A84900D96B5E /* parallel_preorder */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = parallel_preorder; sourceTree = BUILT_PRODUCTS_DIR; }; + EAD808F913051AB300FE8C7C /* main.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = main.cpp; path = ../main.cpp; sourceTree = SOURCE_ROOT; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 8DD76F660486A84900D96B5E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 08FB7794FE84155DC02AAC07 /* parallel_preorder */ = { + isa = PBXGroup; + children = ( + 08FB7795FE84155DC02AAC07 /* Source */, + 1AB674ADFE9D54B511CA2CBB /* Products */, + ); + name = parallel_preorder; + sourceTree = ""; + }; + 08FB7795FE84155DC02AAC07 /* Source */ = { + isa = PBXGroup; + children = ( + EAD808F913051AB300FE8C7C /* main.cpp */, + 05593AA70B8F55D500DE73AB /* parallel_preorder.cpp */, + 05593AA40B8F55D500DE73AB /* Graph.cpp */, + 05593AA50B8F55D500DE73AB /* Graph.h */, + 05593AA60B8F55D500DE73AB /* Matrix.h */, + ); + name = Source; + sourceTree = ""; + }; + 1AB674ADFE9D54B511CA2CBB /* Products */ = { + isa = PBXGroup; + children = ( + 8DD76F6C0486A84900D96B5E /* parallel_preorder */, + ); + name = Products; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 8DD76F620486A84900D96B5E /* parallel_preorder */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "parallel_preorder" */; + buildPhases = ( + 8DD76F640486A84900D96B5E /* Sources */, + 8DD76F660486A84900D96B5E /* Frameworks */, + 8DD76F690486A84900D96B5E /* CopyFiles */, + ); + buildRules = ( + C3C58959218B66AC00DAC94C /* PBXBuildRule */, + ); + dependencies = ( + ); + name = parallel_preorder; + productInstallPath = "$(HOME)/bin"; + productName = parallel_preorder; + productReference = 8DD76F6C0486A84900D96B5E /* parallel_preorder */; + productType = "com.apple.product-type.tool"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 08FB7793FE84155DC02AAC07 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1000; + }; + buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "parallel_preorder" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 1; + knownRegions = ( + en, + ); + mainGroup = 08FB7794FE84155DC02AAC07 /* parallel_preorder */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 8DD76F620486A84900D96B5E /* parallel_preorder */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + 8DD76F640486A84900D96B5E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 05593AA80B8F55D500DE73AB /* Graph.cpp in Sources */, + 05593AAB0B8F55D500DE73AB /* parallel_preorder.cpp in Sources */, + EAD808FA13051AB300FE8C7C /* main.cpp in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + A1F593C60B8F0E6E00073279 /* Debug64 */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_VERSION = ""; + HEADER_SEARCH_PATHS = "$(inherited)"; + ICC_CXX_LANG_DIALECT = "c++11"; + INSTALL_PATH = "$(HOME)/bin"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited)"; + LIBRARY_SEARCH_PATHS = "$(inherited)"; + PRODUCT_NAME = parallel_preorder; + ZERO_LINK = NO; + }; + name = Debug64; + }; + A1F593C70B8F0E6E00073279 /* Release64 */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_GENERATE_DEBUGGING_SYMBOLS = NO; + GCC_VERSION = ""; + HEADER_SEARCH_PATHS = "$(inherited)"; + ICC_CXX_LANG_DIALECT = "c++11"; + INSTALL_PATH = "$(HOME)/bin"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited)"; + LIBRARY_SEARCH_PATHS = "$(inherited)"; + PRODUCT_NAME = parallel_preorder; + ZERO_LINK = NO; + }; + name = Release64; + }; + A1F593C80B8F0E6E00073279 /* Debug64 */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ENABLE_TESTABILITY = YES; + GCC_ENABLE_CPP_RTTI = YES; + GCC_MODEL_TUNING = ""; + GCC_VERSION = ""; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(TBBROOT)/include", + /opt/intel/tbb/include, + ); + LD_RUNPATH_SEARCH_PATHS = "$(TBBROOT)/lib /opt/intel/tbb/lib"; + LIBRARY_SEARCH_PATHS = ( + "$(TBBROOT)/lib", + /opt/intel/tbb/lib, + ); + MACOSX_DEPLOYMENT_TARGET = 10.11; + ONLY_ACTIVE_ARCH = YES; + OTHER_CPLUSPLUSFLAGS = ( + "$(OTHER_CFLAGS)", + "-m64", + ); + OTHER_LDFLAGS = ( + "-m64", + "-ltbb_debug", + ); + PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO; + SYMROOT = "/tmp/tbb-$(USER)"; + VALID_ARCHS = x86_64; + }; + name = Debug64; + }; + A1F593C90B8F0E6E00073279 /* Release64 */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + GCC_ENABLE_CPP_RTTI = YES; + GCC_MODEL_TUNING = ""; + GCC_VERSION = ""; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(TBBROOT)/include", + /opt/intel/tbb/include, + ); + LD_RUNPATH_SEARCH_PATHS = "$(TBBROOT)/lib /opt/intel/tbb/lib"; + LIBRARY_SEARCH_PATHS = ( + "$(TBBROOT)/lib", + /opt/intel/tbb/lib, + ); + MACOSX_DEPLOYMENT_TARGET = 10.11; + OTHER_CPLUSPLUSFLAGS = ( + "$(OTHER_CFLAGS)", + "-m64", + ); + OTHER_LDFLAGS = ( + "-m64", + "-ltbb", + ); + PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO; + SYMROOT = "/tmp/tbb-$(USER)"; + VALID_ARCHS = x86_64; + }; + name = Release64; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "parallel_preorder" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A1F593C60B8F0E6E00073279 /* Debug64 */, + A1F593C70B8F0E6E00073279 /* Release64 */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug64; + }; + 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "parallel_preorder" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A1F593C80B8F0E6E00073279 /* Debug64 */, + A1F593C90B8F0E6E00073279 /* Release64 */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug64; + }; +/* End XCConfigurationList section */ + }; + rootObject = 08FB7793FE84155DC02AAC07 /* Project object */; +} diff --git a/xdl/third_party/tbb/examples/parallel_for/game_of_life/Makefile b/xdl/third_party/tbb/examples/parallel_for/game_of_life/Makefile new file mode 100644 index 00000000..3ca06968 --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/game_of_life/Makefile @@ -0,0 +1,53 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +# GNU Makefile that builds and runs example. +run_cmd= +PROG=game_of_life +ARGS=2:4 -t 5 +LIGHT_ARGS=1:2 -t 5 +ifneq (,$(shell which icc 2>/dev/null)) +CXX=icc +endif # icc + +ifeq ($(shell uname), Linux) +ifeq ($(target), android) +LIBS+= --sysroot=$(SYSROOT) +run_cmd=../../common/android.linux.launcher.sh +else +LIBS+= -lrt +endif +else ifeq ($(shell uname), Darwin) +override CXXFLAGS += -Wl,-rpath,$(TBBROOT)/lib +endif + +all: release test + +release: src/Evolution.cpp src/Update_state.cpp src/Game_of_life.cpp + $(CXX) -O2 -DNDEBUG -D_CONSOLE $(CXXFLAGS) -o $(PROG) $^ -ltbb $(LIBS) + +debug: src/Evolution.cpp src/Update_state.cpp src/Game_of_life.cpp + $(CXX) -O0 -D_CONSOLE -g -DTBB_USE_DEBUG $(CXXFLAGS) -o $(PROG) $^ -ltbb_debug $(LIBS) + +clean: + rm -f $(PROG) *.o *.d + +test: + $(run_cmd) ./$(PROG) $(ARGS) +light_test: + $(run_cmd) ./$(PROG) $(LIGHT_ARGS) diff --git a/xdl/third_party/tbb/examples/parallel_for/game_of_life/Makefile.windows b/xdl/third_party/tbb/examples/parallel_for/game_of_life/Makefile.windows new file mode 100644 index 00000000..15c93430 --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/game_of_life/Makefile.windows @@ -0,0 +1,46 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +# Common Makefile that builds and runs example. + +# Just specify your program basename +PROG=game_of_life +ARGS=2:4 -t 5 +LIGHT_ARGS=1:2 -t 5 + +# Trying to find if icl.exe is set +CXX1 = $(TBB_CXX)- +CXX2 = $(CXX1:icl.exe-=icl.exe) +CXX = $(CXX2:-=cl.exe) + +# The C++ compiler options +MYCXXFLAGS = /TP /EHsc /W3 /nologo /D _CONSOLE /D _MBCS /D WIN32 /D _CRT_SECURE_NO_DEPRECATE $(CXXFLAGS) +MYLDFLAGS =/INCREMENTAL:NO /NOLOGO /DEBUG /FIXED:NO $(LDFLAGS) + +all: release test +release: + $(CXX) ./src/Evolution.cpp ./src/Game_of_life.cpp ./src/Update_state.cpp /MD /O2 /D NDEBUG $(MYCXXFLAGS) /link tbb.lib $(LIBS) $(MYLDFLAGS) /OUT:$(PROG).exe +debug: + $(CXX) ./src/Evolution.cpp ./src/Game_of_life.cpp ./src/Update_state.cpp /MDd /Od /Zi /D _DEBUG $(MYCXXFLAGS) /link tbb_debug.lib $(LIBS) $(MYLDFLAGS) /OUT:$(PROG).exe +clean: + @cmd.exe /C del $(PROG).exe *.obj *.?db *.manifest +test: + $(PROG) $(ARGS) +light_test: + $(PROG) $(LIGHT_ARGS) + diff --git a/xdl/third_party/tbb/examples/parallel_for/game_of_life/msvs/Game_of_life.sln b/xdl/third_party/tbb/examples/parallel_for/game_of_life/msvs/Game_of_life.sln new file mode 100644 index 00000000..97acd9eb --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/game_of_life/msvs/Game_of_life.sln @@ -0,0 +1,40 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.40629.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Game of Life", "Game_of_life.vcxproj", "{731C7E2E-2766-41D9-96FC-0A3548973803}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug(console)|Win32 = Debug(console)|Win32 + Debug(console)|x64 = Debug(console)|x64 + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release(console)|Win32 = Release(console)|Win32 + Release(console)|x64 = Release(console)|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {731C7E2E-2766-41D9-96FC-0A3548973803}.Debug(console)|Win32.ActiveCfg = Debug(console)|Win32 + {731C7E2E-2766-41D9-96FC-0A3548973803}.Debug(console)|Win32.Build.0 = Debug(console)|Win32 + {731C7E2E-2766-41D9-96FC-0A3548973803}.Debug(console)|x64.ActiveCfg = Debug(console)|x64 + {731C7E2E-2766-41D9-96FC-0A3548973803}.Debug(console)|x64.Build.0 = Debug(console)|x64 + {731C7E2E-2766-41D9-96FC-0A3548973803}.Debug|Win32.ActiveCfg = Debug|Win32 + {731C7E2E-2766-41D9-96FC-0A3548973803}.Debug|Win32.Build.0 = Debug|Win32 + {731C7E2E-2766-41D9-96FC-0A3548973803}.Debug|x64.ActiveCfg = Debug|x64 + {731C7E2E-2766-41D9-96FC-0A3548973803}.Debug|x64.Build.0 = Debug|x64 + {731C7E2E-2766-41D9-96FC-0A3548973803}.Release(console)|Win32.ActiveCfg = Release(console)|Win32 + {731C7E2E-2766-41D9-96FC-0A3548973803}.Release(console)|Win32.Build.0 = Release(console)|Win32 + {731C7E2E-2766-41D9-96FC-0A3548973803}.Release(console)|x64.ActiveCfg = Release(console)|x64 + {731C7E2E-2766-41D9-96FC-0A3548973803}.Release(console)|x64.Build.0 = Release(console)|x64 + {731C7E2E-2766-41D9-96FC-0A3548973803}.Release|Win32.ActiveCfg = Release|Win32 + {731C7E2E-2766-41D9-96FC-0A3548973803}.Release|Win32.Build.0 = Release|Win32 + {731C7E2E-2766-41D9-96FC-0A3548973803}.Release|x64.ActiveCfg = Release|x64 + {731C7E2E-2766-41D9-96FC-0A3548973803}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/xdl/third_party/tbb/examples/parallel_for/game_of_life/msvs/Game_of_life.vcxproj b/xdl/third_party/tbb/examples/parallel_for/game_of_life/msvs/Game_of_life.vcxproj new file mode 100644 index 00000000..1a6c3ada --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/game_of_life/msvs/Game_of_life.vcxproj @@ -0,0 +1,451 @@ + + + + + Debug(console) + Win32 + + + Debug(console) + x64 + + + Debug + Win32 + + + Debug + x64 + + + Release(console) + Win32 + + + Release(console) + x64 + + + Release + Win32 + + + Release + x64 + + + + Game of Life + {731C7E2E-2766-41D9-96FC-0A3548973803} + Game_of_life + ManagedCProj + + + + Application + MultiByte + false + v120 + + + Application + MultiByte + false + v120 + + + Application + Unicode + true + true + v120 + + + Application + Unicode + true + false + v120 + + + Application + MultiByte + false + v120 + + + Application + MultiByte + false + v120 + + + Application + Unicode + true + true + v120 + + + Application + Unicode + true + false + v120 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.40219.1 + $(TEMP)\tbb_examples\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Configuration)\ + false + true + $(TEMP)\tbb_examples\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Configuration)\ + false + true + $(TEMP)\tbb_examples\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Configuration)\ + false + false + $(TEMP)\tbb_examples\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Configuration)\ + false + false + $(TEMP)\tbb_examples\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Configuration)\ + false + $(TEMP)\tbb_examples\$(Platform)\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Platform)\$(Configuration)\ + false + $(TEMP)\tbb_examples\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Configuration)\ + false + $(TEMP)\tbb_examples\$(Platform)\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Platform)\$(Configuration)\ + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + WIN32;_WINDOWS;_DEBUG;USE_SSE;%(PreprocessorDefinitions) + MultiThreadedDebugDLL + + + false + Level2 + ProgramDatabase + + + tbb_debug.lib;user32.lib + $(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc12;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc12;%(AdditionalLibraryDirectories) + true + true + Windows + main + MachineX86 + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 debug "$(OutDir)" + + + + + X64 + + + Disabled + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + WIN64;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + MultiThreadedDebugDLL + + + false + Level2 + ProgramDatabase + + + tbb_debug.lib;user32.lib + $(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc12;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc12;%(AdditionalLibraryDirectories) + true + true + Windows + main + MachineX64 + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 debug "$(OutDir)" + + + + + -S -03 + %(AdditionalOptions) + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level3 + ProgramDatabase + + + tbb.lib;user32.lib + $(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc12;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc12;%(AdditionalLibraryDirectories) + true + Windows + true + true + main + MachineX86 + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 release "$(OutDir)" + + + + + X64 + + + -S -03 + %(AdditionalOptions) + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + WIN64;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level3 + ProgramDatabase + + + tbb.lib;user32.lib + $(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc12;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc12;%(AdditionalLibraryDirectories) + true + Windows + true + true + main + MachineX64 + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 release "$(OutDir)" + + + + + + + + + Disabled + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE;USE_SSE;%(PreprocessorDefinitions) + Sync + MultiThreadedDebugDLL + ProgramDatabase + + + tbb_debug.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc12;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc12;%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + MachineX86 + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 debug "$(OutDir)" + + + + + + + + + X64 + + + Disabled + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + WIN64;_DEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions) + Sync + MultiThreadedDebugDLL + ProgramDatabase + + + tbb_debug.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc12;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc12;%(AdditionalLibraryDirectories) + true + $(TargetDir)$(TargetName).pdb + Console + MachineX64 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 debug "$(OutDir)" + + + + + + + + + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE;USE_SSE;%(PreprocessorDefinitions) + MultiThreadedDLL + ProgramDatabase + + + tbb.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc12;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc12;%(AdditionalLibraryDirectories) + true + Console + true + true + MachineX86 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 release "$(OutDir)" + + + + + + + + + X64 + + + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + WIN64;NDEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE;USE_SSE;%(PreprocessorDefinitions) + MultiThreadedDLL + ProgramDatabase + + + tbb.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc12;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc12;%(AdditionalLibraryDirectories) + true + Console + true + true + MachineX64 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 release "$(OutDir)" + + + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + + + true + true + true + true + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/xdl/third_party/tbb/examples/parallel_for/game_of_life/msvs/app.ico b/xdl/third_party/tbb/examples/parallel_for/game_of_life/msvs/app.ico new file mode 100644 index 00000000..3a5525fd Binary files /dev/null and b/xdl/third_party/tbb/examples/parallel_for/game_of_life/msvs/app.ico differ diff --git a/xdl/third_party/tbb/examples/parallel_for/game_of_life/msvs/app.rc b/xdl/third_party/tbb/examples/parallel_for/game_of_life/msvs/app.rc new file mode 100644 index 00000000..807aa896 --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/game_of_life/msvs/app.rc @@ -0,0 +1,63 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon placed first or with lowest ID value becomes application icon + +LANGUAGE 9, 1 +#pragma code_page(1252) +1 ICON "app.ico" + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" + "\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""afxres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\0" +END + +#endif // APSTUDIO_INVOKED + +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/xdl/third_party/tbb/examples/parallel_for/game_of_life/msvs/resource.h b/xdl/third_party/tbb/examples/parallel_for/game_of_life/msvs/resource.h new file mode 100644 index 00000000..4176a013 --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/game_of_life/msvs/resource.h @@ -0,0 +1,23 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by app.rc diff --git a/xdl/third_party/tbb/examples/parallel_for/game_of_life/readme.html b/xdl/third_party/tbb/examples/parallel_for/game_of_life/readme.html new file mode 100644 index 00000000..a690a814 --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/game_of_life/readme.html @@ -0,0 +1,392 @@ + + + + + + Intel® Threading Building Blocks. Game_of_life sample + + + + + +

    + The "Game of life" example demonstrates interoperability of Intel® Threading Building Blocks (Intel® TBB) + and Microsoft* .NET*. +

    + This program runs 2 simultaneous instances of the classic Conway's "Game of Life". + One of these instances uses serial calculations to update the board. The other one calculates in parallel with Intel TBB. + The visualization is written in managed C++ and uses .NET CLR. +

    + +
    +
    System Requirements
    + +
    +

    + For the most up to date system requirements, see the release notes. +

    +
    +
    + +
    +
    Files
    + +
    +
    +
    Form1.h, Board.h +
    Header files for GUI classes. +
    Evolution.h, Evolution.cpp +
    Contain class hierarchy to implement game evolution in serial and parallel. +
    Update_state.cpp +
    Implements 2 approaches for calculating steps in the program: with the use of SSE intrinsics, and ordinary C++ code. +
    Game_of_life.cpp +
    Contains program entry point and other source not related to logical structure of the example. +
    Makefile +
    Makefile for building the example. +
    +
    +
    + +
    +
    Directories
    + +
    +
    +
    src +
    Contains source files mentioned above. +
    msvs +
    Contains Microsoft* Visual Studio* workspace for building and running the example (Windows* systems only). +
    xcode +
    Contains Xcode* IDE workspace for building and running the example (macOS* systems only). +
    +

    For information about the minimum supported version of IDE, see release notes.

    +
    +
    + +
    +
    Build instructions
    + +
    +

    General build directions can be found here.

    +
    +
    + +
    + Up to parent directory +
    +
    +
    Legal Information
    + +
    +

    + Intel and the Intel logo are trademarks of Intel Corporation in the U.S. and/or other countries. +
    * Other names and brands may be claimed as the property of others. +
    © 2018, Intel Corporation +

    +
    +
    + + + diff --git a/xdl/third_party/tbb/examples/parallel_for/game_of_life/src/AssemblyInfo.cpp b/xdl/third_party/tbb/examples/parallel_for/game_of_life/src/AssemblyInfo.cpp new file mode 100644 index 00000000..44eb0d88 --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/game_of_life/src/AssemblyInfo.cpp @@ -0,0 +1,58 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +using namespace System; +using namespace System::Reflection; +using namespace System::Runtime::CompilerServices; +using namespace System::Runtime::InteropServices; +using namespace System::Security::Permissions; + +// +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +// +[assembly:AssemblyTitleAttribute("Automata")]; +[assembly:AssemblyDescriptionAttribute("")]; +[assembly:AssemblyConfigurationAttribute("")]; +[assembly:AssemblyCompanyAttribute("")]; +[assembly:AssemblyProductAttribute("Automata")]; +[assembly:AssemblyCopyrightAttribute("Copyright (c) 2007")]; +[assembly:AssemblyTrademarkAttribute("")]; +[assembly:AssemblyCultureAttribute("")]; + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the value or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly:AssemblyVersionAttribute("1.0.*")]; + +[assembly:ComVisible(false)]; + +[assembly:CLSCompliantAttribute(true)]; + +[assembly:SecurityPermission(SecurityAction::RequestMinimum, UnmanagedCode = true)]; diff --git a/xdl/third_party/tbb/examples/parallel_for/game_of_life/src/Board.h b/xdl/third_party/tbb/examples/parallel_for/game_of_life/src/Board.h new file mode 100644 index 00000000..a0e0ad7d --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/game_of_life/src/Board.h @@ -0,0 +1,107 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +#ifndef __BOARD_H__ +#define __BOARD_H__ + +#define WIN32_LEAN_AND_MEAN + +#ifndef _CONSOLE +#include + +using namespace System; +using namespace System::ComponentModel; +using namespace System::Collections; +using namespace System::Windows::Forms; +using namespace System::Data; +using namespace System::Drawing; +#define LabelPtr Label^ +#define BoardPtr Board^ +#else +#define LabelPtr int* +#define BoardPtr Board* +#endif + +struct Matrix +{ + int width; + int height; + char* data; +}; + +#ifndef _CONSOLE +public ref class Board : public System::Windows::Forms::UserControl +#else +class Board +#endif + { + public: + Board(int width, int height, int squareSize, LabelPtr counter); + virtual ~Board(); + void seed(int s); + void seed(const BoardPtr s); +#ifndef _CONSOLE + protected: + virtual void OnPaint(PaintEventArgs^ e) override; + void Board::draw(Graphics^ g); + + private: + System::ComponentModel::Container ^components; + +#pragma region Windows Form Designer generated code + void InitializeComponent(void) + { + this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; + } +#pragma endregion + + private: delegate void drawDelegate(Int32); + public: + //! Called from the Evolution thread + void draw( Int32 nCurIteration ) + { + if (this->InvokeRequired) + { + drawDelegate^ d = gcnew drawDelegate(this, &Board::draw); + IAsyncResult^ result = BeginInvoke(d, nCurIteration); + EndInvoke(result); + return; + } + m_counter->Text = nCurIteration.ToString(); + Invalidate(); + } +#endif + public: + Matrix *m_matrix; + + private: +#ifndef _CONSOLE + SolidBrush^ m_occupiedBrush; + SolidBrush^ m_freeBrush; + Graphics^ m_graphics; + Graphics^ m_mem_dc; + Bitmap^ m_bmp; +#endif + int m_width; + int m_height; + int m_squareSize; + LabelPtr m_counter; + }; +#endif diff --git a/xdl/third_party/tbb/examples/parallel_for/game_of_life/src/Evolution.cpp b/xdl/third_party/tbb/examples/parallel_for/game_of_life/src/Evolution.cpp new file mode 100644 index 00000000..357cc706 --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/game_of_life/src/Evolution.cpp @@ -0,0 +1,243 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +/* + Evolution.cpp: implementation file for evolution classes; evolution + classes do looped evolution of patterns in a defined + 2 dimensional space +*/ + +#include "Evolution.h" +#include "Board.h" + +#ifdef USE_SSE +#define GRAIN_SIZE 14 +#else +#define GRAIN_SIZE 4000 +#endif +#define TIME_SLICE 330 + +/* + Evolution +*/ + +/** + Evolution::UpdateMatrix() - moves the calculated destination data + to the source data block. No destination zeroing is required since it will + be completely overwritten during the next calculation cycle. +**/ +void Evolution::UpdateMatrix() +{ + memcpy(m_matrix->data, m_dest, m_size); +} + +/* + SequentialEvolution +*/ + +//! SequentialEvolution::Run - begins looped evolution +#ifndef _CONSOLE +void SequentialEvolution::Run() +{ +#else +void SequentialEvolution::Run(double execution_time, int nthread) +{ + printf("Starting game (Sequential evolution)\n"); +#endif + + m_nIteration = 0; + m_serial_time = 0; + tbb::tick_count t0 = tbb::tick_count::now(); + while (!m_done) + { + if( !is_paused ) + { + tbb::tick_count t = tbb::tick_count::now(); + Step(); + tbb::tick_count t1 = tbb::tick_count::now(); + ++m_nIteration; + double work_time = (t1-t0).seconds(); +#ifndef _CONSOLE + if ( work_time * 1000 < TIME_SLICE ) + continue; + m_serial_time += work_time; + m_board->draw(m_nIteration); +#else + m_serial_time += work_time; +#endif + } + //! Let the parallel algorithm work uncontended almost the same time + //! as the serial one. See ParallelEvolution::Run() as well. +#ifndef _CONSOLE + m_evt_start_parallel->Set(); + m_evt_start_serial->WaitOne(); + t0 = tbb::tick_count::now(); +#else + t0 = tbb::tick_count::now(); + if(m_serial_time > execution_time) + { + printf("iterations count = %d time = %g\n", m_nIteration, m_serial_time); + break; + } +#endif + } +} + +//! SequentialEvolution::Step() - override of step method +void SequentialEvolution::Step() +{ + if( !is_paused ) + { +#ifdef USE_SSE + UpdateState(m_matrix, m_matrix->data, 0, m_matrix->height); +#else + UpdateState(m_matrix, m_dest, 0, (m_matrix->width * m_matrix->height)-1); + UpdateMatrix(); +#endif + } +} + +/* + ParallelEvolution +*/ + +//! SequentialEvolution::Run - begins looped evolution +#ifndef _CONSOLE +void ParallelEvolution::Run() +{ +#else +void ParallelEvolution::Run(double execution_time, int nthread) +{ + if(nthread == tbb::task_scheduler_init::automatic) + printf("Starting game (Parallel evolution for automatic number of thread(s))\n"); + else + printf("Starting game (Parallel evolution for %d thread(s))\n", nthread); +#endif + + m_nIteration = 0; + m_parallel_time = 0; + +#ifndef _CONSOLE + //! start task scheduler as necessary + if (m_pInit == NULL) + { + m_pInit = new tbb::task_scheduler_init(); + } + m_evt_start_parallel->WaitOne(); +#else + tbb::task_scheduler_init init(nthread); +#endif + + double work_time = m_serial_time; + tbb::tick_count t0 = tbb::tick_count::now(); + + while (!m_done) + { + if( !is_paused ) + { + tbb::tick_count t = tbb::tick_count::now(); + Step(); + tbb::tick_count t1 = tbb::tick_count::now(); + ++m_nIteration; + double real_work_time = (t1-t0).seconds(); +#ifndef _CONSOLE + if ( real_work_time < work_time ) + continue; + m_parallel_time += real_work_time; + m_board->draw(m_nIteration); +#else + m_parallel_time += real_work_time; +#endif + } + //! Let the serial algorithm work the same time as the parallel one. +#ifndef _CONSOLE + m_evt_start_serial->Set(); + m_evt_start_parallel->WaitOne(); + + work_time = m_serial_time - m_parallel_time; + t0 = tbb::tick_count::now(); +#else + t0 = tbb::tick_count::now(); + if(m_parallel_time > execution_time) + { + printf("iterations count = %d time = %g\n", m_nIteration, m_parallel_time); + init.terminate(); + break; + } +#endif + } +} + +/** + class tbb_parallel_task + + TBB requires a class for parallel loop implementations. The actual + loop "chunks" are performed using the () operator of the class. + The blocked_range contains the range to calculate. Please see the + TBB documentation for more information. +**/ +#ifndef _CONSOLE +public class tbb_parallel_task +#else +class tbb_parallel_task +#endif +{ +public: + static void set_values (Matrix* source, char* dest) + { + m_source = source; + m_dest = dest; + return; + } + + void operator()( const tbb::blocked_range& r ) const + { + int begin = (int)r.begin(); //! capture lower range number for this chunk + int end = (int)r.end(); //! capture upper range number for this chunk + UpdateState(m_source, m_dest, begin, end); + } + + tbb_parallel_task () {} + +private: + static Matrix* m_source; + static char* m_dest; +}; + +Matrix* tbb_parallel_task::m_source; +char* tbb_parallel_task::m_dest; + +//! ParallelEvolution::Step() - override of Step method +void ParallelEvolution::Step() +{ + size_t begin = 0; //! beginning cell position +#ifdef USE_SSE + size_t end = m_matrix->height; //! ending cell position +#else + size_t end = m_size-1; //! ending cell position +#endif + + //! set matrix pointers + tbb_parallel_task::set_values(m_matrix, m_dest); + + //! do calculation loop + parallel_for (tbb::blocked_range (begin, end, GRAIN_SIZE), tbb_parallel_task()); + UpdateMatrix(); +} diff --git a/xdl/third_party/tbb/examples/parallel_for/game_of_life/src/Evolution.h b/xdl/third_party/tbb/examples/parallel_for/game_of_life/src/Evolution.h new file mode 100644 index 00000000..d485396c --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/game_of_life/src/Evolution.h @@ -0,0 +1,195 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +/** + Evolution.h: Header file for evolution classes; evolution classes do + looped evolution of patterns in a defined 2 dimensional space +**/ + +#ifndef __EVOLUTION_H__ +#define __EVOLUTION_H__ + +#include "Board.h" +#include +#include +#include + +#define WIN32_LEAN_AND_MEAN + +#include "tbb/task_scheduler_init.h" +#include "tbb/blocked_range.h" +#include "tbb/parallel_for.h" +#include "tbb/tick_count.h" + +#ifndef _CONSOLE +#include +using namespace System::Threading; +#else +typedef unsigned int Int32; +#endif + +void UpdateState(Matrix * m_matrix, char * dest ,int begin, int end); + +/** + class Evolution - base class for SequentialEvolution and ParallelEvolution +**/ +#ifndef _CONSOLE +public ref class Evolution abstract +#else +class Evolution +#endif +{ +public: + Evolution( Matrix *m, //! beginning matrix including initial pattern + BoardPtr board //! the board to update + ) : m_matrix(m), m_board(board), + m_size(m_matrix->height * m_matrix->width), m_done(false) + { + //! allocate memory for second matrix data block + m_dest = new char[m_size]; + is_paused = false; +#ifdef _CONSOLE + m_serial_time = 0; +#endif + } + + virtual ~Evolution() + { + delete[] m_dest; + } + + //! Run() - begins looped evolution +#ifndef _CONSOLE + virtual void Run() = 0; +#else + virtual void Run(double execution_time, int nthread) = 0; +#endif + + //! Quit() - tell the thread to terminate + virtual void Quit() { m_done = true; } + + //! Step() - performs a single evolutionary generation computation on the game matrix + virtual void Step() = 0; + + //! SetPause() - change condition of variable is_paused + virtual void SetPause(bool condition) + { + if ( condition == true ) + is_paused = true; + else + is_paused = false; + } + +protected: + /** + UpdateMatrix() - moves the previous destination data to the source + data block and zeros out destination. + **/ + void UpdateMatrix(); + +protected: + Matrix* m_matrix; //! Pointer to initial matrix + char* m_dest; //! Pointer to calculation destination data + BoardPtr m_board; //! The game board to update + int m_size; //! size of the matrix data block + volatile bool m_done; //! a flag used to terminate the thread + Int32 m_nIteration; //! current calculation cycle index + volatile bool is_paused; //! is needed to perform next iteration + + //! Calculation time of the sequential version (since the start), seconds. + /** + This member is updated by the sequential version and read by parallel, + so no synchronization is necessary. + **/ +#ifndef _CONSOLE + static volatile double m_serial_time = 0; + + static System::Threading::AutoResetEvent ^m_evt_start_serial = gcnew AutoResetEvent(false), + ^m_evt_start_parallel = gcnew AutoResetEvent(false); +#else + double m_serial_time; +#endif +}; + +/** + class SequentialEvolution - derived from Evolution - calculate life generations serially +**/ +#ifndef _CONSOLE +public ref class SequentialEvolution: public Evolution +#else +class SequentialEvolution: public Evolution +#endif +{ +public: + SequentialEvolution(Matrix *m, BoardPtr board) + : Evolution(m, board) + {} +#ifndef _CONSOLE + virtual void Run() override; + virtual void Step() override; +#else + virtual void Run(double execution_time, int nthread); + virtual void Step(); +#endif + +}; + +/** + class ParallelEvolution - derived from Evolution - calculate life generations + in parallel using Intel(R) TBB +**/ +#ifndef _CONSOLE +public ref class ParallelEvolution: public Evolution +#else +class ParallelEvolution: public Evolution +#endif +{ +public: + + ParallelEvolution(Matrix *m, BoardPtr board) + : Evolution(m, board), + m_parallel_time(0) + { + // instantiate a task_scheduler_init object and save a pointer to it + m_pInit = NULL; + } + + ~ParallelEvolution() + { + //! delete task_scheduler_init object + if (m_pInit != NULL) + delete m_pInit; + } +#ifndef _CONSOLE + virtual void Run() override; + virtual void Step() override; +#else + virtual void Run(double execution_time, int nthread); + virtual void Step(); +#endif + + +private: + tbb::task_scheduler_init* m_pInit; + + double m_parallel_time; +}; + +#endif diff --git a/xdl/third_party/tbb/examples/parallel_for/game_of_life/src/Form1.h b/xdl/third_party/tbb/examples/parallel_for/game_of_life/src/Form1.h new file mode 100644 index 00000000..59d36004 --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/game_of_life/src/Form1.h @@ -0,0 +1,306 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +#ifndef _CONSOLE +#ifndef __FORM1_H__ +#define __FORM1_H__ + +#include +#include "Board.h" +#include "Evolution.h" + +#define BOARD_SQUARE_SIZE 2 + + using namespace System; + using namespace System::ComponentModel; + using namespace System::Collections; + using namespace System::Windows::Forms; + using namespace System::Data; + using namespace System::Drawing; + + public ref class Form1 : public System::Windows::Forms::Form + { + public: + Form1(void) + { + InitializeComponent(); + + FormBorderStyle = System::Windows::Forms::FormBorderStyle::FixedDialog; + ClientSize = System::Drawing::Size(1206, 600+m_ribbonHeight+menuStrip1->Height); + + int boardWidth = (ClientRectangle.Width/2-m_sepWidth/2)/BOARD_SQUARE_SIZE; + int boardHeight = (ClientRectangle.Height-menuStrip1->Height-m_ribbonHeight)/BOARD_SQUARE_SIZE; + + m_board1 = gcnew Board(boardWidth, boardHeight, BOARD_SQUARE_SIZE, seqGen); + m_board2 = gcnew Board(boardWidth, boardHeight, BOARD_SQUARE_SIZE, parGen); + + Controls->Add(m_board1); + Controls->Add(m_board2); + + m_board1->Location = System::Drawing::Point(2, m_ribbonHeight + menuStrip1->Height); + m_board2->Location = System::Drawing::Point(2 + boardWidth*BOARD_SQUARE_SIZE + m_sepWidth/2, m_ribbonHeight + menuStrip1->Height); + + m_seq = gcnew SequentialEvolution(m_board1->m_matrix, m_board1); + m_par = gcnew ParallelEvolution(m_board2->m_matrix, m_board2); + + m_seqThread = gcnew Thread(gcnew ThreadStart(m_seq, &SequentialEvolution::Run)); + m_parThread = gcnew Thread(gcnew ThreadStart(m_par, &ParallelEvolution::Run)); + + Thread::CurrentThread->Priority = ThreadPriority::AboveNormal; + + m_suspend = true; + } + protected: + ~Form1() + { + if (components) + { + delete components; + } + } + private: System::Windows::Forms::MenuStrip^ menuStrip1; + private: System::Windows::Forms::ToolStripMenuItem^ fileToolStripMenuItem; + private: System::Windows::Forms::ToolStripMenuItem^ exitToolStripMenuItem; + private: System::Windows::Forms::ToolStripMenuItem^ gameToolStripMenuItem; + private: System::Windows::Forms::ToolStripMenuItem^ seedToolStripMenuItem; + private: System::Windows::Forms::ToolStripMenuItem^ runToolStripMenuItem; + private: System::Windows::Forms::ToolStripMenuItem^ pauseToolStripMenuItem; + private: Board^ m_board1; + private: Board^ m_board2; + private: System::Windows::Forms::Label^ Sequential; + private: System::Windows::Forms::Label^ label1; + private: static const int m_sepWidth = 5; + private: static const int m_ribbonHeight = 26; + private: SequentialEvolution^ m_seq; + private: ParallelEvolution^ m_par; + private: Thread^ m_seqThread; + private: Thread^ m_parThread; + private: System::Windows::Forms::Label^ seqGen; + private: System::Windows::Forms::Label^ parGen; + private: bool m_suspend; + + private: + System::ComponentModel::Container ^components; + +#pragma region Windows Form Designer generated code + void InitializeComponent(void) + { + this->menuStrip1 = (gcnew System::Windows::Forms::MenuStrip()); + this->fileToolStripMenuItem = (gcnew System::Windows::Forms::ToolStripMenuItem()); + this->exitToolStripMenuItem = (gcnew System::Windows::Forms::ToolStripMenuItem()); + this->gameToolStripMenuItem = (gcnew System::Windows::Forms::ToolStripMenuItem()); + this->seedToolStripMenuItem = (gcnew System::Windows::Forms::ToolStripMenuItem()); + this->runToolStripMenuItem = (gcnew System::Windows::Forms::ToolStripMenuItem()); + this->pauseToolStripMenuItem = (gcnew System::Windows::Forms::ToolStripMenuItem()); + this->Sequential = (gcnew System::Windows::Forms::Label()); + this->label1 = (gcnew System::Windows::Forms::Label()); + this->seqGen = (gcnew System::Windows::Forms::Label()); + this->parGen = (gcnew System::Windows::Forms::Label()); + this->menuStrip1->SuspendLayout(); + this->SuspendLayout(); + // + // menuStrip1 + // + this->menuStrip1->Items->AddRange(gcnew cli::array< System::Windows::Forms::ToolStripItem^ >(2) + {this->fileToolStripMenuItem, this->gameToolStripMenuItem}); + this->menuStrip1->Location = System::Drawing::Point(0, 0); + this->menuStrip1->Name = L"menuStrip1"; + this->menuStrip1->Padding = System::Windows::Forms::Padding(8, 2, 0, 2); + this->menuStrip1->Size = System::Drawing::Size(1600, 26); + this->menuStrip1->TabIndex = 0; + this->menuStrip1->Text = L"menuStrip1"; + this->menuStrip1->ItemClicked += gcnew System::Windows::Forms::ToolStripItemClickedEventHandler(this, &Form1::menuStrip1_ItemClicked); + // + // fileToolStripMenuItem + // + this->fileToolStripMenuItem->DropDownItems->AddRange(gcnew cli::array< System::Windows::Forms::ToolStripItem^ >(1) {this->exitToolStripMenuItem}); + this->fileToolStripMenuItem->Name = L"fileToolStripMenuItem"; + this->fileToolStripMenuItem->Size = System::Drawing::Size(40, 22); + this->fileToolStripMenuItem->Text = L"File"; + // + // exitToolStripMenuItem + // + this->exitToolStripMenuItem->Name = L"exitToolStripMenuItem"; + this->exitToolStripMenuItem->Size = System::Drawing::Size(99, 22); + this->exitToolStripMenuItem->Text = L"Exit"; + this->exitToolStripMenuItem->Click += gcnew System::EventHandler(this, &Form1::OnExit); + // + // gameToolStripMenuItem + // + this->gameToolStripMenuItem->DropDownItems->AddRange(gcnew cli::array< System::Windows::Forms::ToolStripItem^ >(3) {this->seedToolStripMenuItem, + this->runToolStripMenuItem, this->pauseToolStripMenuItem}); + this->gameToolStripMenuItem->Name = L"gameToolStripMenuItem"; + this->gameToolStripMenuItem->Size = System::Drawing::Size(59, 22); + this->gameToolStripMenuItem->Text = L"Game"; + // + // seedToolStripMenuItem + // + this->seedToolStripMenuItem->Name = L"seedToolStripMenuItem"; + this->seedToolStripMenuItem->Size = System::Drawing::Size(115, 22); + this->seedToolStripMenuItem->Text = L"Seed"; + this->seedToolStripMenuItem->Click += gcnew System::EventHandler(this, &Form1::OnSeed); + // + // runToolStripMenuItem + // + this->runToolStripMenuItem->Enabled = false; + this->runToolStripMenuItem->Name = L"runToolStripMenuItem"; + this->runToolStripMenuItem->Size = System::Drawing::Size(115, 22); + this->runToolStripMenuItem->Text = L"Run"; + this->runToolStripMenuItem->Click += gcnew System::EventHandler(this, &Form1::OnRun); + // + // pauseToolStripMenuItem + // + this->pauseToolStripMenuItem->Enabled = false; + this->pauseToolStripMenuItem->Name = L"pauseToolStripMenuItem"; + this->pauseToolStripMenuItem->Size = System::Drawing::Size(115, 22); + this->pauseToolStripMenuItem->Text = L"Pause"; + this->pauseToolStripMenuItem->Click += gcnew System::EventHandler(this, &Form1::OnPauseResume); + // + // Sequential + // + this->Sequential->AutoSize = true; + this->Sequential->Font = (gcnew System::Drawing::Font(L"Microsoft Sans Serif", 9, System::Drawing::FontStyle::Regular, System::Drawing::GraphicsUnit::Point, + static_cast(0))); + this->Sequential->Location = System::Drawing::Point(12, 32); + this->Sequential->Margin = System::Windows::Forms::Padding(4, 0, 4, 0); + this->Sequential->Name = L"Sequential"; + this->Sequential->Size = System::Drawing::Size(239, 18); + this->Sequential->TabIndex = 1; + this->Sequential->Text = L"Sequential Algorithm generation:"; + // + // label1 + // + this->label1->AutoSize = true; + this->label1->Font = (gcnew System::Drawing::Font(L"Microsoft Sans Serif", 9, System::Drawing::FontStyle::Regular, System::Drawing::GraphicsUnit::Point, + static_cast(0))); + this->label1->Location = System::Drawing::Point(813, 32); + this->label1->Margin = System::Windows::Forms::Padding(4, 0, 4, 0); + this->label1->Name = L"label1"; + this->label1->Size = System::Drawing::Size(219, 18); + this->label1->TabIndex = 2; + this->label1->Text = L"Parallel Algorithm generation: "; + // + // seqGen + // + this->seqGen->AutoSize = true; + this->seqGen->Location = System::Drawing::Point(289, 35); + this->seqGen->Margin = System::Windows::Forms::Padding(4, 0, 4, 0); + this->seqGen->Name = L"seqGen"; + this->seqGen->Size = System::Drawing::Size(16, 17); + this->seqGen->TabIndex = 3; + this->seqGen->Text = L"0"; + // + // parGen + // + this->parGen->AutoSize = true; + this->parGen->Location = System::Drawing::Point(1068, 35); + this->parGen->Margin = System::Windows::Forms::Padding(4, 0, 4, 0); + this->parGen->Name = L"parGen"; + this->parGen->Size = System::Drawing::Size(16, 17); + this->parGen->TabIndex = 4; + this->parGen->Text = L"0"; + // + // Form1 + // + this->AutoScaleDimensions = System::Drawing::SizeF(8, 16); + this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; + this->ClientSize = System::Drawing::Size(1600, 738); + this->Controls->Add(this->parGen); + this->Controls->Add(this->seqGen); + this->Controls->Add(this->label1); + this->Controls->Add(this->Sequential); + this->Controls->Add(this->menuStrip1); + this->MainMenuStrip = this->menuStrip1; + this->Margin = System::Windows::Forms::Padding(4); + this->MaximizeBox = false; + this->Name = L"Form1"; + this->Text = L"Game of Life"; + this->menuStrip1->ResumeLayout(false); + this->menuStrip1->PerformLayout(); + this->ResumeLayout(false); + this->PerformLayout(); + + } +#pragma endregion + protected: + void CloseApp () + { + m_seq->Quit(); + m_par->Quit(); + //! Perform a very ungracious exit, should coordinate the threads + System::Environment::Exit(0); + } + + protected: + virtual void OnPaint(PaintEventArgs^ e) override + { + } + + virtual void OnFormClosing(FormClosingEventArgs^ e) override + { + CloseApp(); + } + + void OnExit(System::Object^ sender, System::EventArgs^ e) + { + CloseApp(); + } + + void OnSeed(System::Object^ sender, System::EventArgs^ e) + { + this->seedToolStripMenuItem->Enabled = false; + this->runToolStripMenuItem->Enabled = true; + time_t now = time(NULL); + this->m_board1->seed((int)now); + this->m_board2->seed(this->m_board1); + this->Invalidate(); + } + + void OnRun(System::Object^ sender, System::EventArgs^ e) + { + this->runToolStripMenuItem->Enabled = false; + this->pauseToolStripMenuItem->Enabled = true; + m_seqThread->Start(); + m_parThread->Start(); + } + + void OnPauseResume(System::Object^ sender, System::EventArgs^ e) + { + if (m_suspend) + { + m_seq->SetPause(true); + m_par->SetPause(true); + this->pauseToolStripMenuItem->Text = L"Resume"; + } + else + { + m_seq->SetPause(false); + m_par->SetPause(false); + this->pauseToolStripMenuItem->Text = L"Pause"; + } + m_suspend = !m_suspend; + } + + private: + System::Void menuStrip1_ItemClicked(System::Object^ sender, System::Windows::Forms::ToolStripItemClickedEventArgs^ e) + {} +}; +#endif +#endif diff --git a/xdl/third_party/tbb/examples/parallel_for/game_of_life/src/Game_of_life.cpp b/xdl/third_party/tbb/examples/parallel_for/game_of_life/src/Game_of_life.cpp new file mode 100644 index 00000000..f13cbe97 --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/game_of_life/src/Game_of_life.cpp @@ -0,0 +1,230 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +/* + Game_of_life.cpp : + main project file. +*/ +#include "Board.h" +#include "Form1.h" + +#define WIN32_LEAN_AND_MEAN + +#ifndef _CONSOLE +#include +#else +#include +#include +#include +#include "Evolution.h" + +#define BOARD_SQUARE_SIZE 2 + +int low; //! lower range limit of threads +int high; //! high range limit of threads +double execution_time; //! time for game of life iterations +#endif + +Board::Board(int width, int height, int squareSize, LabelPtr counter) +: m_width(width), m_height(height), m_squareSize(squareSize), m_counter(counter) +{ +#ifndef _CONSOLE + InitializeComponent(); + DoubleBuffered = true; + + this->Width = m_squareSize*width; + this->Height = m_squareSize*height; +#endif + m_matrix = new Matrix(); + m_matrix->width = width; + m_matrix->height = height; + m_matrix->data = new char[width*height]; + memset(m_matrix->data, 0, width*height); +#ifndef _CONSOLE + m_occupiedBrush = gcnew SolidBrush(Color::Black); + m_freeBrush = gcnew SolidBrush(Color::LightGray); + + m_graphics = CreateGraphics(); + m_bmp = gcnew Bitmap(Width, Height); + m_mem_dc = Graphics::FromImage(m_bmp); +#endif +} + +Board::~Board() +{ +#ifndef _CONSOLE + if (components) + { + delete components; + } +#endif + delete[] m_matrix->data; + delete m_matrix; +} + +void Board::seed(int s) +{ + srand(s); + for (int j=0; jdata[i+j*m_width] = x>75? 1: 0; // 25% occupied + } + } +#ifndef _CONSOLE + Invalidate(); +#endif +} + +void Board::seed( const BoardPtr src ) +{ + memcpy(m_matrix->data, src->m_matrix->data, m_height*m_width); +#ifndef _CONSOLE + Invalidate(); +#endif +} + +#ifndef _CONSOLE +void Board::draw(Graphics^ g) +{ + m_mem_dc->FillRectangle(m_freeBrush, Drawing::Rectangle(0, 0, m_width*m_squareSize, m_height*m_squareSize)); + for (int j=0; jdata[i+j*m_width] ) + { + m_mem_dc->FillRectangle(m_occupiedBrush, Drawing::Rectangle(i*m_squareSize, j*m_squareSize, m_squareSize, m_squareSize)); + } + } + } + g->DrawImage(m_bmp, 0, 0); +} + +void Board::OnPaint(PaintEventArgs^ e) +{ + draw(e->Graphics); +} + +[STAThreadAttribute] +int main(array ^args) +{ + // Enabling Windows XP visual effects before any controls are created + Application::EnableVisualStyles(); + Application::SetCompatibleTextRenderingDefault(false); + + // Create the main window and run it + Application::Run(gcnew Form1()); + return 0; +} +#else + +//! Print usage of this program +void PrintUsage() +{ + printf("Usage: gol [M[:N] -t execution_time]\nM and N are a range of numbers of threads to be used.\nexecution_time is a time (in sec) for execution game_of_life iterations\n"); + printf("Default values:\nM:\t\tautomatic\nN:\t\tM\nexecution_time:\t10\n"); +} + +//! Parse command line +bool ParseCommandLine(int argc, char * argv []) +{ + char* s = argv[1]; + char* end; + //! command line without parameters + if(argc == 1) + { + low = tbb::task_scheduler_init::automatic; + high = low; + execution_time = 5; + return true; + } + //! command line with parameters + if(argc != 4) + { + PrintUsage(); + return false; + } + if(std::string("-t") != argv[argc-2]) + //! process M[:N] parameter + high = strtol(s,&end,0); + low = strtol(s,&end,0); + switch( *end ) + { + case ':': + high = strtol(end+1,0,0); + break; + case '\0': + break; + default: + PrintUsage(); + return false; + } + if (high < low) + { + std::cout << "Set correct range. Current range: " << low << ":" << high << std::endl; + PrintUsage(); + return false; + + } + //! process execution_time parameter + execution_time = strtol(argv[argc-1],&end,0); + return true; +} + +int main( int argc, char* argv[] ) +{ + if(!ParseCommandLine( argc, argv )) + return 1; + SequentialEvolution* m_seq; + ParallelEvolution* m_par; + Board* m_board1; + Board* m_board2; + int* count = NULL; + + int boardWidth = 300; + int boardHeight = 300; + + m_board1 = new Board(boardWidth, boardHeight, BOARD_SQUARE_SIZE, count); + m_board2 = new Board(boardWidth, boardHeight, BOARD_SQUARE_SIZE, count); + + time_t now = time(NULL); + printf("Generate Game of life board\n"); + m_board1->seed((int)now); + m_board2->seed(m_board1); + + m_seq = new SequentialEvolution(m_board1->m_matrix, m_board1); + m_seq->Run(execution_time, 1); + delete m_seq; + + m_par = new ParallelEvolution(m_board2->m_matrix, m_board2); + for( int p = low; p <= high; ++p ) + { + m_par->Run(execution_time, p); + } + delete m_par; + + delete m_board1; + delete m_board2; + return 0; +} +#endif diff --git a/xdl/third_party/tbb/examples/parallel_for/game_of_life/src/Update_state.cpp b/xdl/third_party/tbb/examples/parallel_for/game_of_life/src/Update_state.cpp new file mode 100644 index 00000000..a7e58b05 --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/game_of_life/src/Update_state.cpp @@ -0,0 +1,402 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +#include "Evolution.h" + +#ifdef USE_SSE +/* Update states with SSE */ + +#include +#include + +inline void create_record( char * src, unsigned * dst, unsigned width) +{ + dst[0] |= src[width - 1]; + for( unsigned a=0; a<31u; ++a ) + dst[0] |= src[a]<<(a+1); + unsigned a; + for( a=31u; a>=31; + X[ind] =_mm_or_si128( _mm_slli_epi16(X[ind],1), + _mm_srli_epi16( _mm_slli_si128( X[ind], 2), 15) ); + + unsigned x1 = X[ind + 1].m128i_u32[3]; x1>>=31; + X[ind + 1] =_mm_or_si128( _mm_slli_epi16(X[ind + 1],1), + _mm_srli_epi16( _mm_slli_si128( X[ind + 1], 2), 15) ); + X[ind + 1].m128i_u32[0] |= x0; + + unsigned* dst = (unsigned*)&X[ind]; + unsigned x2 = dst[301/32u] & (1<<(301%32u)); x2>>=(301%32u); + X[ind + 2] =_mm_or_si128( _mm_slli_epi16(X[ind + 2],1), + _mm_srli_epi16( _mm_slli_si128( X[ind + 2], 2), 15) ); + X[ind + 2].m128i_u32[0] |= x1; + X[ind].m128i_u32[0] |= x2; + } +} + +void UpdateState(Matrix * m_matrix, char * dest ,int begin, int end) +{ + //300/128 + 1 =3, 3*300=900 + unsigned size_sse_row = m_matrix->width/128 + 1; //3 + unsigned size_sse_ar=size_sse_row * (end - begin); + __m128i X[906], A[900], B[900], C[900]; + char * mas = m_matrix->data; + + for( unsigned i=0; iwidth; + for( unsigned b = 0 ; b < height; ++b ) + { + char* src = &mas[(b + begin)*width]; + unsigned* dst = (unsigned*)&X[(b+1)*size_sse_row]; + create_record(src, dst, width); + } + // create high row in X[] + char * src; + if(begin == 0) + { + src = &mas[(m_matrix->height-1)*width]; + } + else + { + src = &mas[(begin-1)*width]; + } + unsigned* dst = (unsigned*)X; + create_record(src, dst, width); + + //create lower row in X[] + if(end == m_matrix->height ) + { + src = mas; + } + else + { + src = &mas[end*width]; + } + dst = (unsigned*)&X[(height+1)*size_sse_row]; + create_record(src, dst, width); + + //sum( C, B, A, X+offset_for_upwards ); high-left friend + sum_offset(X,A,B,C,size_sse_ar, 0); + + //sum( C, B, A, X+offset_for_no_vertical_shift ); + sum_offset(X,A,B,C,size_sse_ar, size_sse_row); + + //sum( C, B, A, X+offset_for_downwards ); + sum_offset(X,A,B,C,size_sse_ar, 2*size_sse_row); + + //shift_left( X ); (when view 2D) in our logic it is in right + height = end - begin + 2; + shift_left2D( X, height, size_sse_row); + + //sum( C, B, A, X+offset_for_upwards ); high-left friend + sum_offset(X,A,B,C,size_sse_ar, 0); + + //sum( C, B, A, X+offset_for_downwards ); + sum_offset(X,A,B,C,size_sse_ar, 2*size_sse_row); + + //shift_left( X ); (view in 2D) in our logic it is right shift + height = end - begin + 2; + shift_left2D( X, height, size_sse_row); + + //sum( C, B, A, X+offset_for_upwards ); high-right friend + sum_offset(X,A,B,C,size_sse_ar, 0); + + //sum( C, B, A, X+offset_for_no_vertical_shift ); right friend + sum_offset(X,A,B,C,size_sse_ar, size_sse_row); + + //sum( C, B, A, X+offset_for_downwards ); right down friend + sum_offset(X,A,B,C,size_sse_ar, 2*size_sse_row); + + //shift_right( X ); (when view in 2D) in our case it left shift. + height = end - begin + 2; + shift_right2D( X, height, size_sse_row); + + //X = (X|A)&B&~C (done bitwise over the arrays) + unsigned shift = size_sse_row; + for(unsigned i=0; iwidth; + for( unsigned b=0; b>(a%32u); + } + } +} +#else +/* end SSE block */ + +// ---------------------------------------------------------------------- +// GetAdjacentCellState() - returns the state (value) of the specified +// adjacent cell of the current cell "cellNumber" +char GetAdjacentCellState( + char* source, // pointer to source data block + int x, // logical width of field + int y, // logical height of field + int cellNumber, // number of cell position to examine + int cp // which adjacent position + ) +{ +/* +cp +*-- cp=1 ... --- cp=8 (summary: -1-2-3- +-x- -x- -4-x-5- +--- --* -6-7-8- ) +*/ + char cellState = 0; // return value + + // set up boundary flags to trigger field-wrap logic + bool onTopRow = false; + bool onBottomRow = false; + bool onLeftColumn = false; + bool onRightColumn = false; + + // check to see if cell is on top row + if (cellNumber < x) + { + onTopRow = true; + } + // check to see if cell is on bottom row + if ((x*y)-cellNumber <= x) + { + onBottomRow = true; + } + // check to see if cell is on left column + if (cellNumber%x == 0) + { + onLeftColumn = true; + } + // check to see if cell is on right column + if ((cellNumber+1)%x == 0) + { + onRightColumn = true; + } + + switch (cp) + { + case 1: + if (onTopRow && onLeftColumn) + { + return *(source+((x*y)-1)); + } + if (onTopRow && !onLeftColumn) + { + return *(source+(((x*y)-x)+(cellNumber-1))); + } + if (onLeftColumn && !onTopRow) + { + return *(source+(cellNumber-1)); + } + return *((source+cellNumber)-(x+1)); + + case 2: + if (onTopRow) + { + return *(source+(((x*y)-x)+cellNumber)); + } + return *((source+cellNumber)-x); + + case 3: + if (onTopRow && onRightColumn) + { + return *(source+((x*y)-x)); + } + if (onTopRow && !onRightColumn) + { + return *(source+(((x*y)-x)+(cellNumber+1))); + } + if (onRightColumn && !onTopRow) + { + return *(source+((cellNumber-(x*2))+1)); + } + return *(source+(cellNumber-(x-1))); + + case 4: + if (onRightColumn) + { + return *(source+(cellNumber-(x-1))); + } + return *(source+(cellNumber+1)); + + case 5: + if (onBottomRow && onRightColumn) + { + return *source; + } + if (onBottomRow && !onRightColumn) + { + return *(source+((cellNumber-((x*y)-x))+1)); + } + if (onRightColumn && !onBottomRow) + { + return *(source+(cellNumber+1)); + } + return *(source+(((cellNumber+x))+1)); + + case 6: + if (onBottomRow) + { + return *(source+(cellNumber-((x*y)-x))); + } + return *(source+(cellNumber+x)); + + case 7: + if (onBottomRow && onLeftColumn) + { + return *(source+(x-1)); + } + if (onBottomRow && !onLeftColumn) + { + return *(source+(cellNumber-((x*y)-x)-1)); + } + if (onLeftColumn && !onBottomRow) + { + return *(source+(cellNumber+((x*2)-1))); + } + return *(source+(cellNumber+(x-1))); + + case 8: + if (onLeftColumn) + { + return *(source+(cellNumber+(x-1))); + } + return *(source+(cellNumber-1)); + } + return cellState; +} + +char CheckCell(Matrix * m_matrix, int cellNumber) +{ + char total = 0; + char* source = m_matrix->data; + //look around to find cell's with status "alive" + for(int i=1; i<9; i++) + { + total += GetAdjacentCellState(source, m_matrix->width, m_matrix->height, cellNumber, i); + } + // if the number of adjacent live cells is < 2 or > 3, the result is a dead + // cell regardless of its current state. (A live cell dies of loneliness if it + // has less than 2 neighbors, and of overcrowding if it has more than 3; a new + // cell is born in an empty spot only if it has exactly 3 neighbors. + if (total < 2 || total > 3) + { + return 0; + } + + // if we get here and the cell position holds a living cell, it stays alive + if (*(source+cellNumber)) + { + return 1; + } + + // we have an empty position. If there are only 2 neighbors, the position stays + // empty. + if (total == 2) + { + return 0; + } + + // we have an empty position and exactly 3 neighbors. A cell is born. + return 1; +} + +void UpdateState(Matrix * m_matrix, char * dest ,int begin, int end) +{ + for (int i=begin; i<=end; i++) + { + *(dest+i) = CheckCell(m_matrix, i); + } +} + +#endif +/* end non-SSE block */ diff --git a/xdl/third_party/tbb/examples/parallel_for/game_of_life/xcode/game_of_life.xcodeproj/project.pbxproj b/xdl/third_party/tbb/examples/parallel_for/game_of_life/xcode/game_of_life.xcodeproj/project.pbxproj new file mode 100644 index 00000000..cd8a515c --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/game_of_life/xcode/game_of_life.xcodeproj/project.pbxproj @@ -0,0 +1,270 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 612CD8DD11F573FC00A587B2 /* Game_of_life.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 612CD8DB11F573FC00A587B2 /* Game_of_life.cpp */; }; + 612CD8DE11F573FC00A587B2 /* Update_state.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 612CD8DC11F573FC00A587B2 /* Update_state.cpp */; }; + 612CD8E111F5742000A587B2 /* Evolution.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 612CD8E011F5742000A587B2 /* Evolution.cpp */; }; +/* End PBXBuildFile section */ + +/* Begin PBXBuildRule section */ + C3C58967218C3E4A00DAC94C /* PBXBuildRule */ = { + isa = PBXBuildRule; + compilerSpec = com.intel.compilers.icc.latest; + fileType = sourcecode.cpp; + isEditable = 1; + outputFiles = ( + ); + script = "# Type a script or drag a script file from your workspace to insert its path.\n"; + }; +/* End PBXBuildRule section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 8DD76F690486A84900D96B5E /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 12; + dstPath = ""; + dstSubfolderSpec = 16; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 612CD8DB11F573FC00A587B2 /* Game_of_life.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Game_of_life.cpp; path = ../src/Game_of_life.cpp; sourceTree = SOURCE_ROOT; }; + 612CD8DC11F573FC00A587B2 /* Update_state.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Update_state.cpp; path = ../src/Update_state.cpp; sourceTree = SOURCE_ROOT; }; + 612CD8E011F5742000A587B2 /* Evolution.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Evolution.cpp; path = ../src/Evolution.cpp; sourceTree = SOURCE_ROOT; }; + 8DD76F6C0486A84900D96B5E /* game_of_life */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = game_of_life; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 8DD76F660486A84900D96B5E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 08FB7794FE84155DC02AAC07 /* game_of_life */ = { + isa = PBXGroup; + children = ( + 08FB7795FE84155DC02AAC07 /* Source */, + 1AB674ADFE9D54B511CA2CBB /* Products */, + ); + name = game_of_life; + sourceTree = ""; + }; + 08FB7795FE84155DC02AAC07 /* Source */ = { + isa = PBXGroup; + children = ( + 612CD8E011F5742000A587B2 /* Evolution.cpp */, + 612CD8DB11F573FC00A587B2 /* Game_of_life.cpp */, + 612CD8DC11F573FC00A587B2 /* Update_state.cpp */, + ); + name = Source; + sourceTree = ""; + }; + 1AB674ADFE9D54B511CA2CBB /* Products */ = { + isa = PBXGroup; + children = ( + 8DD76F6C0486A84900D96B5E /* game_of_life */, + ); + name = Products; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 8DD76F620486A84900D96B5E /* game_of_life */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "game_of_life" */; + buildPhases = ( + 8DD76F640486A84900D96B5E /* Sources */, + 8DD76F660486A84900D96B5E /* Frameworks */, + 8DD76F690486A84900D96B5E /* CopyFiles */, + ); + buildRules = ( + C3C58967218C3E4A00DAC94C /* PBXBuildRule */, + ); + dependencies = ( + ); + name = game_of_life; + productInstallPath = "$(HOME)/bin"; + productName = game_of_life; + productReference = 8DD76F6C0486A84900D96B5E /* game_of_life */; + productType = "com.apple.product-type.tool"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 08FB7793FE84155DC02AAC07 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1000; + }; + buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "game_of_life" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 1; + knownRegions = ( + en, + ); + mainGroup = 08FB7794FE84155DC02AAC07 /* game_of_life */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 8DD76F620486A84900D96B5E /* game_of_life */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + 8DD76F640486A84900D96B5E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 612CD8DD11F573FC00A587B2 /* Game_of_life.cpp in Sources */, + 612CD8DE11F573FC00A587B2 /* Update_state.cpp in Sources */, + 612CD8E111F5742000A587B2 /* Evolution.cpp in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + A1F593C60B8F0E6E00073279 /* Debug64 */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = _CONSOLE; + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + HEADER_SEARCH_PATHS = "$(inherited)"; + INSTALL_PATH = "$(HOME)/bin"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited)"; + LIBRARY_SEARCH_PATHS = "$(inherited)"; + PRODUCT_NAME = game_of_life; + ZERO_LINK = NO; + }; + name = Debug64; + }; + A1F593C70B8F0E6E00073279 /* Release64 */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_GENERATE_DEBUGGING_SYMBOLS = NO; + GCC_PREPROCESSOR_DEFINITIONS = _CONSOLE; + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + HEADER_SEARCH_PATHS = "$(inherited)"; + INSTALL_PATH = "$(HOME)/bin"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited)"; + LIBRARY_SEARCH_PATHS = "$(inherited)"; + PRODUCT_NAME = game_of_life; + ZERO_LINK = NO; + }; + name = Release64; + }; + A1F593C80B8F0E6E00073279 /* Debug64 */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ENABLE_TESTABILITY = YES; + GCC_ENABLE_CPP_RTTI = YES; + GCC_MODEL_TUNING = ""; + GCC_VERSION = ""; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(TBBROOT)/include", + /opt/intel/tbb/include, + ); + ICC_CXX_LANG_DIALECT = "c++11"; + LD_RUNPATH_SEARCH_PATHS = "$(TBBROOT)/lib /opt/intel/tbb/lib"; + LIBRARY_SEARCH_PATHS = ( + "$(TBBROOT)/lib", + /opt/intel/tbb/lib, + ); + MACOSX_DEPLOYMENT_TARGET = 10.11; + ONLY_ACTIVE_ARCH = YES; + OTHER_CPLUSPLUSFLAGS = ( + "$(OTHER_CFLAGS)", + "-m64", + ); + OTHER_LDFLAGS = ( + "-m64", + "-ltbb_debug", + ); + PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO; + SYMROOT = "/tmp/tbb-$(USER)"; + VALID_ARCHS = x86_64; + }; + name = Debug64; + }; + A1F593C90B8F0E6E00073279 /* Release64 */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + GCC_ENABLE_CPP_RTTI = YES; + GCC_MODEL_TUNING = ""; + GCC_VERSION = ""; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(TBBROOT)/include", + /opt/intel/tbb/include, + ); + ICC_CXX_LANG_DIALECT = "c++11"; + LD_RUNPATH_SEARCH_PATHS = "$(TBBROOT)/lib /opt/intel/tbb/lib"; + LIBRARY_SEARCH_PATHS = ( + "$(TBBROOT)/lib", + /opt/intel/tbb/lib, + ); + MACOSX_DEPLOYMENT_TARGET = 10.11; + OTHER_CPLUSPLUSFLAGS = ( + "$(OTHER_CFLAGS)", + "-m64", + ); + OTHER_LDFLAGS = ( + "-m64", + "-ltbb", + ); + PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO; + SYMROOT = "/tmp/tbb-$(USER)"; + VALID_ARCHS = x86_64; + }; + name = Release64; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "game_of_life" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A1F593C60B8F0E6E00073279 /* Debug64 */, + A1F593C70B8F0E6E00073279 /* Release64 */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug64; + }; + 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "game_of_life" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A1F593C80B8F0E6E00073279 /* Debug64 */, + A1F593C90B8F0E6E00073279 /* Release64 */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug64; + }; +/* End XCConfigurationList section */ + }; + rootObject = 08FB7793FE84155DC02AAC07 /* Project object */; +} diff --git a/xdl/third_party/tbb/examples/parallel_for/index.html b/xdl/third_party/tbb/examples/parallel_for/index.html new file mode 100644 index 00000000..2b8a77d7 --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/index.html @@ -0,0 +1,350 @@ + + + + + + Intel® Threading Building Blocks. Samples on parallel_for algorithm + + + + + +

    + This directory has examples of the parallel_for algorithm. +

    + +
    +
    Directories
    + +
    +
    +
    seismic +
    Parallel seismic wave simulation. +
    tachyon +
    Parallel 2-D raytracer/renderer. +
    polygon_overlay +
    Simple polygon overlay. +
    game_of_life +
    Simple Game of life overlay. +
    +
    +
    +
    + Up to parent directory +
    +
    +
    Legal Information:
    + +
    +

    + Intel and the Intel logo are trademarks of Intel Corporation in the U.S. and/or other countries. +
    * Other names and brands may be claimed as the property of others. +
    © 2018, Intel Corporation +

    +
    +
    + + + diff --git a/xdl/third_party/tbb/examples/parallel_for/polygon_overlay/Makefile b/xdl/third_party/tbb/examples/parallel_for/polygon_overlay/Makefile new file mode 100644 index 00000000..d1c94599 --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/polygon_overlay/Makefile @@ -0,0 +1,90 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +# GNU Makefile that builds and runs example. +NAME=pover +ARGS= +LIGHT_ARGS= --polys 10 --size 5x5 + +# The C++ compiler +ifneq (,$(shell which icc 2>/dev/null)) +CXX=icc +endif # icc + +include ../../common/gui/Makefile.gmake + +ifeq ($(UI),x) +UI_CXXFLAGS += -DX_FULLSYNC +endif # X + +override CXXFLAGS += $(UI_CXXFLAGS) + +SRCFILES = ../../common/gui/$(UI)video.cpp pover_video.cpp polymain.cpp polyover.cpp + +ifeq ($(shell uname), Linux) +LIBS+= -lrt +else ifeq ($(shell uname), Darwin) +override CXXFLAGS += -Wl,-rpath,$(TBBROOT)/lib +endif + +all: release test + +resources: +ifeq ($(UI),mac) + mkdir -p $(APPRES)/en.lproj $(NAME).app/Contents/MacOS + cp ../../common/gui/xcode/tbbExample/tbbExample-Info.plist $(NAME).app/Contents/Info.plist + cp ../../common/gui/xcode/tbbExample/PkgInfo $(NAME).app/Contents + cp ../../common/gui/xcode/tbbExample/en.lproj/* $(APPRES)/en.lproj +endif # macOS* + +release: $(SRCFILES) resources +ifeq ($(compiler),xl) + # Avoiding "1586-346 (U) An error occurred during code generation. The code generation return code was 40." with -O3. + $(CXX) -O2 -DNDEBUG $(CXXFLAGS) -o $(EXE) $(SRCFILES) -ltbb -ltbbmalloc $(LIBS) +else +ifeq ($(UI),mac) + $(CXX_UI) -O3 -DNDEBUG $(CXXFLAGS) -c $(MACUISOURCES) +endif # macOS + $(CXX) -O3 -DNDEBUG $(CXXFLAGS) -o $(EXE) $(SRCFILES) $(MACUIOBJS) -ltbb -ltbbmalloc $(LIBS) +endif + +debug: $(SRCFILES) resources +ifeq ($(UI),mac) + $(CXX_UI) -g -O0 -DTBB_USE_DEBUG -D_DEBUG $(CXXFLAGS) -c $(MACUISOURCES) +endif # macOS + $(CXX) -g -O0 -DTBB_USE_DEBUG -D_DEBUG $(CXXFLAGS) -o $(EXE) $(SRCFILES) $(MACUIOBJS) -ltbb_debug -ltbbmalloc_debug $(LIBS) + +clean: + $(RM) $(EXE) *.o *.d +ifeq ($(UI),mac) + rm -rf $(NAME).app +endif + +test: +ifeq ($(UI),mac) + export DYLD_LIBRARY_PATH="$(DYLD_LIBRARY_PATH):$(TBBLIBSPATH)"; $(run_cmd) ./$(EXE) $(ARGS) +else + $(run_cmd) ./$(EXE) $(ARGS) +endif + +light_test: +ifeq ($(UI),mac) + export DYLD_LIBRARY_PATH="$(DYLD_LIBRARY_PATH):$(TBBLIBSPATH)"; $(run_cmd) ./$(EXE) $(LIGHT_ARGS) +else + $(run_cmd) ./$(EXE) $(LIGHT_ARGS) +endif diff --git a/xdl/third_party/tbb/examples/parallel_for/polygon_overlay/Makefile.windows b/xdl/third_party/tbb/examples/parallel_for/polygon_overlay/Makefile.windows new file mode 100644 index 00000000..64490719 --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/polygon_overlay/Makefile.windows @@ -0,0 +1,60 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +# Common Makefile that builds and runs example. + +# Just specify your program basename +PROG=Pover +ARGS= +LIGHT_ARGS= --polys 10 --size 5x5 + +# Trying to find if icl.exe is set +CXX1 = $(TBB_CXX)- +CXX2 = $(CXX1:icl.exe-=icl.exe) +CXX = $(CXX2:-=cl.exe) + +# The C++ compiler options + +# Uncomment one of next lines to choose user interface type (console, gdiplus, direct draw) +#UI = con +UI = gdi +#UI = dd + +# Machine architecture, auto-detected from TBB_TARGET_ARCH by default +# Use XARCH variable to change it. See index.html for more information +ARCH0 = $(TBB_TARGET_ARCH)- +ARCH1 = $(ARCH0:ia32-=x86) +ARCH2 = $(ARCH1:intel64-=AMD64) +XARCH = $(ARCH2:-=x86) + +MAKEINC = ../../common/gui/Makefile.win + +all: release test +release: compiler_check + @$(MAKE) -f $(MAKEINC) UI=$(UI) CXX="$(CXX)" CXXFLAGS="$(CXXFLAGS)" LFLAGS="$(LDFLAGS) tbb.lib tbbmalloc.lib $(LIBS)" XARCH=$(XARCH) RCNAME=pover SOURCE=*.cpp EXE=$(PROG).exe build_one +debug: compiler_check + @$(MAKE) -f $(MAKEINC) UI=$(UI) DEBUG=_debug CXX="$(CXX)" CXXFLAGS="$(CXXFLAGS) /D TBB_USE_DEBUG" LFLAGS="$(LDFLAGS) tbb_debug.lib tbbmalloc_debug.lib $(LIBS)" XARCH=$(XARCH) RCNAME=pover SOURCE=*.cpp EXE=$(PROG).exe build_one +clean: + @cmd.exe /C del $(PROG).exe *.obj *.?db *.manifest msvs\pover.res +test: + $(PROG) $(ARGS) +light_test: + $(PROG) $(LIGHT_ARGS) +compiler_check: + @echo compiler_test>compiler_test && @$(CXX) /E compiler_test >nul 2>&1 || echo "$(CXX) command not found. Check if CXX=$(CXX) is set properly" + @cmd.exe /C del compiler_test diff --git a/xdl/third_party/tbb/examples/parallel_for/polygon_overlay/msvs/polygon_overlay.sln b/xdl/third_party/tbb/examples/parallel_for/polygon_overlay/msvs/polygon_overlay.sln new file mode 100644 index 00000000..77074dd9 --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/polygon_overlay/msvs/polygon_overlay.sln @@ -0,0 +1,40 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.40629.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pover", "pover.vcxproj", "{4BB7B455-1E09-41D3-BC89-6E67C9032F8C}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + _GDIRelease|Win32 = _GDIRelease|Win32 + _GDIRelease|x64 = _GDIRelease|x64 + DD Debug|Win32 = DD Debug|Win32 + DD Debug|x64 = DD Debug|x64 + DD Release|Win32 = DD Release|Win32 + DD Release|x64 = DD Release|x64 + GDIDebug|Win32 = GDIDebug|Win32 + GDIDebug|x64 = GDIDebug|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}._GDIRelease|Win32.ActiveCfg = Release|Win32 + {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}._GDIRelease|Win32.Build.0 = Release|Win32 + {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}._GDIRelease|x64.ActiveCfg = Release|x64 + {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}._GDIRelease|x64.Build.0 = Release|x64 + {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.DD Debug|Win32.ActiveCfg = DD Debug|Win32 + {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.DD Debug|Win32.Build.0 = DD Debug|Win32 + {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.DD Debug|x64.ActiveCfg = DD Debug|x64 + {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.DD Debug|x64.Build.0 = DD Debug|x64 + {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.DD Release|Win32.ActiveCfg = DD Release|Win32 + {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.DD Release|Win32.Build.0 = DD Release|Win32 + {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.DD Release|x64.ActiveCfg = DD Release|x64 + {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.DD Release|x64.Build.0 = DD Release|x64 + {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.GDIDebug|Win32.ActiveCfg = Debug|Win32 + {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.GDIDebug|Win32.Build.0 = Debug|Win32 + {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.GDIDebug|x64.ActiveCfg = Debug|x64 + {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.GDIDebug|x64.Build.0 = Debug|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/xdl/third_party/tbb/examples/parallel_for/polygon_overlay/msvs/pover.rc b/xdl/third_party/tbb/examples/parallel_for/polygon_overlay/msvs/pover.rc new file mode 100644 index 00000000..3eee795f --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/polygon_overlay/msvs/pover.rc @@ -0,0 +1,61 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "afxres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +LANGUAGE 9, 1 +#pragma code_page(1252) + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""afxres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/xdl/third_party/tbb/examples/parallel_for/polygon_overlay/msvs/pover.vcxproj b/xdl/third_party/tbb/examples/parallel_for/polygon_overlay/msvs/pover.vcxproj new file mode 100644 index 00000000..dc5e8f9a --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/polygon_overlay/msvs/pover.vcxproj @@ -0,0 +1,448 @@ + + + + + DD Debug + Win32 + + + DD Debug + x64 + + + DD Release + Win32 + + + DD Release + x64 + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + pover + {4BB7B455-1E09-41D3-BC89-6E67C9032F8C} + pover + Win32Proj + + + + + Application + MultiByte + true + v120 + + + Application + MultiByte + true + v120 + + + Application + MultiByte + true + v120 + + + Application + MultiByte + true + v120 + + + Application + MultiByte + true + v120 + + + Application + MultiByte + true + v120 + + + Application + MultiByte + true + v120 + + + Application + MultiByte + true + v120 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.40219.1 + $(TEMP)\tbb_examples\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Configuration)\ + false + $(TEMP)\tbb_examples\$(Platform)\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Platform)\$(Configuration)\ + false + $(TEMP)\tbb_examples\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Configuration)\ + false + $(TEMP)\tbb_examples\$(Platform)\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Platform)\$(Configuration)\ + false + $(TEMP)\tbb_examples\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Configuration)\ + false + $(TEMP)\tbb_examples\$(Platform)\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Platform)\$(Configuration)\ + false + $(TEMP)\tbb_examples\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Configuration)\ + false + $(TEMP)\tbb_examples\$(Platform)\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Platform)\$(Configuration)\ + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + true + true + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_WINDOWS;TBB_USE_DEBUG;%(PreprocessorDefinitions) + MultiThreadedDebugDLL + true + + + ProgramDatabase + + + tbb_debug.lib;tbbmalloc_debug.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc12;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc12;%(AdditionalLibraryDirectories) + true + Windows + MachineX86 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 debug "$(OutDir)" + + + + + X64 + + + Disabled + true + true + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + WIN64;_DEBUG;_WINDOWS;TBB_USE_DEBUG;%(PreprocessorDefinitions) + MultiThreadedDebugDLL + true + + + ProgramDatabase + + + tbb_debug.lib;tbbmalloc_debug.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc12;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc12;%(AdditionalLibraryDirectories) + true + Windows + MachineX64 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 debug "$(OutDir)" + + + + + MaxSpeed + Speed + true + true + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + ProgramDatabase + + + tbb.lib;tbbmalloc.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc12;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc12;%(AdditionalLibraryDirectories) + true + Windows + true + true + MachineX86 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 release "$(OutDir)" + + + + + X64 + + + MaxSpeed + Speed + true + true + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + WIN64;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + ProgramDatabase + + + tbb.lib;tbbmalloc.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc12;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc12;%(AdditionalLibraryDirectories) + true + Windows + true + true + MachineX64 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 release "$(OutDir)" + + + + + ..\..\..\common\gui\dxcheck.bat + + + MaxSpeed + Speed + true + true + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;$(DXSDK_DIR)\include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + ProgramDatabase + + + tbb.lib;tbbmalloc.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc12;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc12;$(DXSDK_DIR)\lib\x86;%(AdditionalLibraryDirectories) + true + Windows + true + true + MachineX86 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 release "$(OutDir)" + + + + + ..\..\..\common\gui\dxcheck.bat + + + X64 + + + MaxSpeed + Speed + true + true + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;$(DXSDK_DIR)\include;%(AdditionalIncludeDirectories) + WIN64;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + ProgramDatabase + + + tbb.lib;tbbmalloc.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc12;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc12;$(DXSDK_DIR)\lib\x64;%(AdditionalLibraryDirectories) + true + Windows + true + true + MachineX64 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 release "$(OutDir)" + + + + + ..\..\..\common\gui\dxcheck.bat + + + Disabled + true + true + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;$(DXSDK_DIR)\include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_WINDOWS;TBB_USE_DEBUG;%(PreprocessorDefinitions) + MultiThreadedDebugDLL + true + + + ProgramDatabase + + + tbb_debug.lib;tbbmalloc_debug.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc12;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc12;$(DXSDK_DIR)\lib\x86;%(AdditionalLibraryDirectories) + true + Windows + MachineX86 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 debug "$(OutDir)" + + + + + ..\..\..\common\gui\dxcheck.bat + + + X64 + + + Disabled + true + true + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;$(DXSDK_DIR)\include;%(AdditionalIncludeDirectories) + WIN64;_DEBUG;_WINDOWS;TBB_USE_DEBUG;%(PreprocessorDefinitions) + MultiThreadedDebugDLL + true + + + ProgramDatabase + + + tbb_debug.lib;tbbmalloc_debug.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc12;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc12;$(DXSDK_DIR)\lib\x64;%(AdditionalLibraryDirectories) + true + Windows + MachineX64 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 debug "$(OutDir)" + + + + + + + + true + true + true + true + + + true + true + true + true + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/xdl/third_party/tbb/examples/parallel_for/polygon_overlay/msvs/resource.h b/xdl/third_party/tbb/examples/parallel_for/polygon_overlay/msvs/resource.h new file mode 100644 index 00000000..5a438165 --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/polygon_overlay/msvs/resource.h @@ -0,0 +1,34 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by pover.rc + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 101 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/xdl/third_party/tbb/examples/parallel_for/polygon_overlay/polymain.cpp b/xdl/third_party/tbb/examples/parallel_for/polygon_overlay/polymain.cpp new file mode 100644 index 00000000..ec3ecd9d --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/polygon_overlay/polymain.cpp @@ -0,0 +1,620 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +// Polygon overlay +// +// Don't want warnings about deprecated sscanf, getenv +#ifndef _CRT_SECURE_NO_DEPRECATE +#define _CRT_SECURE_NO_DEPRECATE +#endif +#define _MAIN_C_ 1 +#include +#include +#include +#include + +#include "tbb/tick_count.h" +#include "tbb/task_scheduler_init.h" +#include "pover_global.h" +#include "polyover.h" +#include "pover_video.h" +#include "polymain.h" + +using namespace std; + +#if _DEBUG +const char *faceNames[] = { "North", "East", "South", "West" }; +#endif + +/** +**/ +int main( int argc, char **argv) { + pover_video poly; + poly.threaded = true; + gVideo = &poly; + + if(!initializeVideo(argc, argv)) { + return 1; + } + + gIsGraphicalVersion = poly.graphic_display(); + if(argc > 1) { + if(!ParseCmdLine(argc, argv)) { + if(gIsGraphicalVersion) rt_sleep(10000); + // if graphical, we haven't opened the console window so all the error messages we + // so carefully wrote out disappeared into the ether. :( + exit(1); + } + } + + if(gCsvFilename != NULL) { +#define BUFLEN 1000 + std::string fname_buf = gCsvFilename; + fname_buf += ".csv"; + gCsvFile.open(fname_buf.c_str()); + } + + // we have gMapXSize and gMapYSize determining the number of "squares" + // we have g_xwinsize and g_ywinsize the total size of the window + // we also have BORDER_SIZE the size of the border between maps + // we need to determine + // g_polyBoxSize -- the number of pixels on each size of each square + + if(gIsGraphicalVersion) { + int xpixelsPerMap = (g_xwinsize - 4*BORDER_SIZE) / 3; // three maps, with borders between and outside + gMapXSize = xpixelsPerMap; // make the boxes one per pixel + gPolyXBoxSize = xpixelsPerMap / gMapXSize; + int ypixelsPerMap = (g_ywinsize - 2*BORDER_SIZE); // one map vertically + gMapYSize = ypixelsPerMap; // one pixel per box, rather. + + gPolyYBoxSize = ypixelsPerMap / gMapYSize; + if((gPolyXBoxSize == 0) || (gPolyYBoxSize == 0)) { + cout << "The display window is not large enough to show the maps" << std::endl; + int minxSize = 4*BORDER_SIZE + 3*gMapXSize; + int minySize = 2*BORDER_SIZE + gMapYSize; + cout << " Should be at least " << minxSize << " x " << minySize << "." << std::endl; + return 1; + } + map2XLoc = 2*BORDER_SIZE + gMapXSize * gPolyXBoxSize; + maprXLoc = 3*BORDER_SIZE + 2 * gMapXSize * gPolyXBoxSize; + + } + else { // not gIsGraphicalVersion + // gMapXSize, gMapYSize, gNPolygons defined in pover_global.h + } + + // create two polygon maps + SetRandomSeed(gMyRandomSeed); // for repeatability + + gVideo->main_loop(); +} + +void Usage(int argc, char **argv) { + char *cmdTail = strrchr(*argv, '\\'); + if(cmdTail == NULL) { + cmdTail = *argv; + } + else { + cmdTail++; + } + cout << cmdTail << " [threads[:threads2]] [--polys npolys] [--size nnnxnnn] [--seed nnn]" << std::endl; + cout << "Create polygon maps and overlay them." << std::endl << std::endl; + cout << "Parameters:" << std::endl; + cout << " threads[:threads2] - number of threads to run" << std::endl; + cout << " --polys npolys - number of polygons in each map" << std::endl; + cout << " --size nnnxnnn - size of each map (X x Y)" << std::endl; + cout << " --seed nnn - initial value of random number generator" << std::endl; + cout << " --csv filename - write timing data to CSV-format file" << std::endl; + cout << " --grainsize n - set grainsize to n" << std::endl; + cout << " --use_malloc - allocate polygons with malloc instead of scalable allocator" << std::endl; + cout << std::endl; + cout << "npolys must be smaller than the size of the map" << std::endl; + cout << std::endl; + exit(1); +} + +bool ParseCmdLine(int argc, char **argv ) { + bool error_found = false; + bool nPolysSpecified = false; + bool nMapSizeSpecified = false; + bool nSeedSpecified = false; + bool csvSpecified = false; + bool grainsizeSpecified = false; + bool mallocSpecified = false; + int origArgc = argc; + char** origArgv = argv; + unsigned int newnPolygons = gNPolygons; + unsigned int newSeed = gMyRandomSeed; + unsigned int newX = gMapXSize; + unsigned int newY = gMapYSize; + unsigned int newGrainSize = gGrainSize; + argc--; argv++; + if(argc > 0 && isdigit((*argv)[0])) { + // first argument is one or two numbers, specifying how mny threads to run + char* end; gThreadsHigh = gThreadsLow = (int)strtol(argv[0],&end,0); + switch( *end) { + case ':': gThreadsHigh = (int)strtol(end+1,0,0); break; + case '\0': break; + default: cout << "Unexpected character in thread specifier: " << *end << std::endl; break; + } + if(gThreadsLow > gThreadsHigh) { + int t = gThreadsLow; + gThreadsLow = gThreadsHigh; + gThreadsHigh = t; + } + argv++; argc--; + } + while(argc > 0) { + // format 1: --size nnnxnnn, where nnn in {0 .. 9}+ -- size of map in "squares" + if(!strncmp("--size", *argv, (size_t)6)) { + if(nMapSizeSpecified) { + cout << " Error: map size multiply specified" << std::endl; + error_found = true; + } + else { + argv++; argc--; + if(argc == 0) { + error_found = true; + cout << " Error: --size must have a value" << std::endl; + } + if(strchr(*argv, 'x') != strrchr(*argv,'x')) { + // more than one 'x' + cout << "Error: map size should be nnnxnnn (" << *argv << ")" << std::endl; + error_found = true; + } + else { + int rval; + rval = sscanf(*argv, "%ux%u", &newX, &newY); + if(rval != 2) { + cout << "Error parsing map size (format should be nnnxnnn (" << *argv << ")" << std::endl; + error_found = true; + } + if(newX == 0 || newY == 0) { + cout << "Error: size of map should be greater than 0 (" << *argv << ")" << std::endl; + error_found = true; + } + } + } + argc--; argv++; + } + // format 2: --seed nnn -- initial random number seed + else if(!strncmp("--seed", *argv, (size_t)6)) { + argv++; argc--; + if(nSeedSpecified) { + cout << "Error: new seed multiply specified" << std::endl; + error_found = true; + } + else { + nSeedSpecified = true; + int rtval = sscanf(*argv, "%u", &newSeed); + if(rtval == 0) { + cout << "Error: --seed should be an unsigned number (instead of " << *argv << ")" << std::endl; + error_found = true; + } + } + argv++; argc--; + } + // format 3: --polys n[n] -- number of polygons in each map + else if(!strncmp("--polys", *argv, (size_t)7)) { + //unsigned int newnPolygons; + argv++; argc--; + if(nPolysSpecified) { + cout << "Error: number of polygons multiply-specified" << std::endl; + error_found = true; + }else { + int rtval = sscanf(*argv, "%u", &newnPolygons); + if(newnPolygons == 0) { + cout << "Error: number of polygons must be greater than 0 (" << *argv << ")" << std::endl; + } + } + argv++; argc--; + } + // format 4: --csv -- name of CSV output file ("xxx" for "xxx.csv") + else if(!strncmp("--csv", *argv, (size_t)5)) { + argv++; argc--; + if(csvSpecified) { + cout << "Error: Multiple specification of CSV file" << std::endl; + error_found = true; + } + else { + gCsvFilename = *argv; + argv++; argc--; + csvSpecified = true; + } + } + else if(!strncmp("--grainsize", *argv, (size_t)11)) { + argv++; argc--; + if(grainsizeSpecified) { + cout << "Error: Multiple specification of grainsize" << std::endl; + error_found = true; + } + else { + int grval = sscanf(*argv, "%u", &newGrainSize); + grainsizeSpecified = true; + if(newGrainSize == 0) { + cout << "Error: grainsize must be greater than 0" << std::endl; + error_found = true; + } + } + argv++; argc--; + } + else if(!strncmp("--use_malloc", *argv, (size_t)12)) { + argv++; argc--; + if(mallocSpecified) { + cout << "Error: --use_malloc multiply-specified" << std::endl; + error_found = true; + } + else { + mallocSpecified = true; + gMBehavior = UseMalloc; + } + } + else { + cout << "Error: unrecognized argument: " << *argv << std::endl; + error_found = true; + argv++; argc--; + } + } + if(!error_found) { + if(newX * newY < newnPolygons) { + error_found = true; + cout << "Error: map size should not be smaller than the number of polygons (gNPolygons = " << newnPolygons << ", map size " << newX << "x" << newY << ")" << std::endl; + } + } + if(!error_found) { + gMapXSize = newX; + gMapYSize = newY; + gNPolygons = newnPolygons; + gMyRandomSeed = newSeed; + gGrainSize = (int)newGrainSize; + } + else { + Usage(origArgc, origArgv); + } + return !error_found; +} + +// create a polygon map with at least gNPolygons polygons. +// Usually more than gNPolygons polygons will be generated, because the +// process of growing the polygons results in holes. +bool GenerateMap(Polygon_map_t **newMap, int xSize, int ySize, int gNPolygons, colorcomp_t maxR, colorcomp_t maxG, colorcomp_t maxB) { + bool error_found = false; + int *validPolys; + int *validSide; + int maxSides; + RPolygon *newPoly; + + if(xSize <= 0) { + cout << "xSize (" << xSize << ") should be > 0." << std::endl; + error_found = true; + } + if(ySize <= 0) { + cout << "ySize (" << ySize << ") should be > 0." << std::endl; + error_found = true; + } + if(gNPolygons > (xSize * ySize)) { + cout << "gNPolygons (" << gNPolygons << ") should be less than " << (xSize * ySize) << std::endl; + error_found = true; + } + if(error_found) return false; + // the whole map is [xSize x ySize] squares + // the way we create the map is to + // 1) pick nPolygon discrete squares on an [xSize x ySize] grid + // 2) while there are unused squares on the grid + // 3) pick a polygon with a side that has unused squares on a side + // 4) expand the polygon by 1 to occupy the unused squares + // + // Continue until every square on the grid is occupied by a polygon + int *tempMap; + tempMap = (int *)malloc(xSize * ySize * sizeof(int)); + for(int i=0;i < xSize; i++) { + for(int j=0;j < ySize; j++) { + tempMap[i*ySize + j] = 0; + } + } + + // *newMap = new vector; + *newMap = new Polygon_map_t; + (*newMap)->reserve(gNPolygons + 1); // how much bigger does this need to be on average? + (*newMap)->push_back(RPolygon(0,0,xSize-1, ySize-1)); + for(int i=0; i < gNPolygons; i++) { + int nX; + int nY; + do { // look for an empty square. + nX = NextRan(xSize); + nY = NextRan(ySize); + } while(tempMap[nX * ySize + nY] != 0); + int nR = (maxR * NextRan(1000)) / 999; + int nG = (maxG * NextRan(1000)) / 999; + int nB = (maxB * NextRan(1000)) / 999; + (*newMap)->push_back(RPolygon(nX,nY,nX,nY,nR,nG,nB)); + tempMap[nX * ySize + nY] = i+1; // index of this polygon + 1 + } + // now have to grow polygons to fill the space. + validPolys = (int *)malloc(4*gNPolygons * sizeof(int)); + validSide = (int *)malloc(4*gNPolygons * sizeof(int)); + for(int i=0;i 0) { + int indx = NextRan(maxSides); + int polyIndx = validPolys[indx]; + int checkSide = validSide[indx]; + int xlow, xhigh, ylow, yhigh; + int xlnew, xhnew, ylnew, yhnew; + (**newMap)[polyIndx].get(&xlow,&ylow,&xhigh,&yhigh); + xlnew = xlow; + xhnew = xhigh; + ylnew = ylow; + yhnew = yhigh; + // can this polygon be expanded along the chosen side? + switch(checkSide) { + case NORTH_SIDE: + // y-1 from xlow to xhigh + ylow = yhigh = (ylow - 1); + ylnew--; + break; + case EAST_SIDE: + // x+1 from ylow to yhigh + xlow = xhigh = (xhigh + 1); + xhnew++; + break; + case SOUTH_SIDE: + // y+1 from xlow to xhigh + ylow = yhigh = (yhigh+1); + yhnew++; + break; + case WEST_SIDE: + // x-1 from ylow to yhigh + xlow = xhigh = (xlow - 1); + xlnew--; + break; + } + bool okay_to_extend = !(((xlow < 0) || (xlow >= xSize)) || ((ylow < 0) || (ylow >= ySize))); + for(int ii = xlow; (ii <= xhigh) && okay_to_extend; ii++) { + for(int jj=ylow; (jj <= yhigh) && okay_to_extend; jj++) { + okay_to_extend = tempMap[ii*ySize + jj] == 0; + } + } + if(okay_to_extend) { + (**newMap)[polyIndx].set(xlnew,ylnew,xhnew,yhnew); + for(int ii = xlow; ii <= xhigh; ii++) { + for(int jj=ylow; jj <= yhigh && okay_to_extend; jj++) { + tempMap[ii*ySize + jj] = polyIndx; + } + } + } + else { + // once we cannot expand along a side, we will never be able to; remove from the list. + for(int i=indx + 1; i < maxSides; i++) { + validPolys[i-1] = validPolys[i]; + validSide[i-1] = validSide[i]; + } + maxSides--; + } + } + + // Once no polygons can be grown, look for unused squares, and fill them with polygons. + for(int j=0;jpush_back(RPolygon(i,j,ilen,jlen,nR,nG,nB)); + gNPolygons++; + for(int ii=i; ii<=ilen;ii++) { + for(int jj=j;jj<=jlen;jj++) { + tempMap[ii*ySize + jj] = gNPolygons; + } + } + } + } + } + +#if _DEBUG + if(!gIsGraphicalVersion) { + cout << std::endl << "Final Map:" << std::endl; + for(int j=0; j < ySize; j++ ) { + cout << "Row " << setw(2) << j << ":"; + for(int i=0;i=limit)) {cout << "checkMap error: " << str << " out of range (" << n << ")" << std::endl;anError=true;} +#define xRangeCheck(str,n) rangeCheck(str,n,gMapXSize) +#define yRangeCheck(str,n) rangeCheck(str,n,gMapYSize) + // The first polygon is the whole map. + bool anError = false; + int *cArray; + if(checkMap->size() <= 0) { + cout << "checkMap error: no polygons in map" << std::endl; + return; + } + // mapXhigh and mapYhigh are inclusive, that is, if the map is 5x5, those values would be 4. + int mapXhigh, mapYhigh, mapLowX, mapLowY; + int gMapXSize, gMapYSize; + (*checkMap)[0].get(&mapLowX, &mapLowY, &mapXhigh, &mapYhigh); + if((mapLowX !=0) || (mapLowY != 0)) { + cout << "checkMap error: map origin not (0,0) (X=" << mapLowX << ", Y=" << mapLowY << ")" << std::endl; + anError = true; + } + if((mapXhigh < 0) || (mapYhigh < 0)) { + cout << "checkMap error: no area in map (X=" << mapXhigh << ", Y=" << mapYhigh << ")" << std::endl; + anError = true; + } + if(anError) return; + // bounds for array. + gMapXSize = mapXhigh + 1; + gMapYSize = mapYhigh + 1; + cArray = (int *)malloc(sizeof(int)*(gMapXSize*gMapYSize)); + + for(int i=0; isize()) && !anError; p++) { + (*checkMap)[p].get(&xlow, &ylow, &xhigh, &yhigh); + xRangeCheck("xlow", xlow); + yRangeCheck("ylow", ylow); + xRangeCheck("xhigh", xhigh); + yRangeCheck("yhigh", yhigh); + if(xlow>xhigh) { + cout << "checkMap error: xlow > xhigh (" << xlow << "," << xhigh << ")" << std::endl; + anError = true; + } + if(ylow>yhigh) { + cout << "checkMap error: ylow > yhigh (" << ylow << "," << yhigh << ")" << std::endl; + anError = true; + } + for(int ii = xlow; ii <= xhigh; ii++) { + for(int jj = ylow; jj <= yhigh; jj++) { + if(cArray[indx(ii,jj)] != 0) { + cout << "checkMap error: polygons " << cArray[indx(ii,jj)] << " and " << p << " intersect" << std::endl; + anError = true; + } + cArray[indx(ii,jj)] = p; + } + } + } + for(int ii=0; ii < gMapXSize; ii++) { + for(int jj=0; jj < gMapYSize; jj++) { + if(cArray[indx(ii,jj)] == 0) { + cout << "checkMap error: block(" << ii << ", " << jj << ") not in any polygon" << std::endl; + anError = true; + } + } + } + free(cArray); +} + +bool CompOnePolygon(RPolygon &p1, RPolygon &p2) { + int xl1, xh1, yl1, yh1; + int xl2, xh2, yl2, yh2; + p1.get(&xl1, &yl1, &xh1, &yh1); + p2.get(&xl2, &yl2, &xh2, &yh2); + if(yl1>yl2) return true; + if(yl1 xl2); +} + +bool PolygonsEqual(RPolygon *p1, RPolygon *p2) { + int xl1, xh1, yl1, yh1; + int xl2, xh2, yl2, yh2; + p1->get(&xl1, &yl1, &xh1, &yh1); + p2->get(&xl2, &yl2, &xh2, &yh2); + return ((xl1 == xl2) && (yl1==yl2) && (xh1 == xh2) && (yh1 == yh2)); +} + +bool ComparePolygonMaps(Polygon_map_t *map1, Polygon_map_t *map2) { + // create two new polygon maps, copy the pointers from the original to these. + // we have to skip the first polygon, which is the size of the whole map + Polygon_map_t *t1, *t2; + bool is_ok = true; + t1 = new Polygon_map_t; + t1->reserve(map1->size()); + for(unsigned int i=1;isize(); i++) { + t1->push_back(map1->at(i)); + } + t2 = new Polygon_map_t; + t2->reserve(map2->size()); + for(unsigned int i=1;isize();i++) { + t2->push_back(map2->at(i)); + } + // sort the two created maps by (xlow, ylow) + sort(t1->begin(), t1->end()); + sort(t2->begin(), t2->end()); + // compare each element of both maps. + if(t1->size() != t2->size()) { + cout << "Error: maps not the same size ( " << int(t1->size()) << " vs " << int(t2->size()) << ")." << std::endl; + } + int maxSize = (int)((t1->size() < t2->size()) ? t1->size() : t2->size()); + for(int i=0; i < maxSize; i++) { + if(!PolygonsEqual(&((*t1)[i]), &((*t2)[i]))) { + cout << "Error: polygons unequal (" << (*t1)[i] << " vs " << (*t2)[i] << std::endl; + is_ok = false; + } + } + delete t1; + delete t2; + return is_ok; +} + +void SetRandomSeed(int newSeed) { + srand((unsigned)newSeed); +} + +int NextRan(int n) { + // assert(n > 1); + // if we are given 1, we will just return 0 + //assert(n < RAND_MAX); + int rrand = rand() << 15 | rand(); + if(rrand < 0) rrand = -rrand; + return rrand % n; +} + +std::ostream& operator<<(std::ostream& s, const RPolygon &p) { + int xl, yl, xh, yh; + p.get(&xl, &yl, &xh, &yh); + return s << "[(" << xl << "," << yl << ")-(" << xh << "," << yh << ")] "; +} diff --git a/xdl/third_party/tbb/examples/parallel_for/polygon_overlay/polymain.h b/xdl/third_party/tbb/examples/parallel_for/polygon_overlay/polymain.h new file mode 100644 index 00000000..56695d6a --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/polygon_overlay/polymain.h @@ -0,0 +1,45 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +#include "pover_global.h" // for declaration of DEFINE and INIT + +DEFINE Polygon_map_t *gPolymap1 INIT(0); +DEFINE Polygon_map_t *gPolymap2 INIT(0); +DEFINE Polygon_map_t *gResultMap INIT(0); + +extern void Usage(int argc, char **argv); + +extern bool ParseCmdLine(int argc, char **argv ); + +extern bool GenerateMap(Polygon_map_t **newMap, int xSize, int ySize, int gNPolygons, colorcomp_t maxR, colorcomp_t maxG, colorcomp_t maxB); + +extern bool PolygonsOverlap(RPolygon *p1, RPolygon *p2, int &xl, int &yl, int &xh, int &yh); + +extern void CheckPolygonMap(Polygon_map_t *checkMap); + +extern bool CompOnePolygon(RPolygon *p1, RPolygon *p2); + +extern bool PolygonsEqual(RPolygon *p1, RPolygon *p2); + +extern bool ComparePolygonMaps(Polygon_map_t *map1, Polygon_map_t *map2); + +extern void SetRandomSeed(int newSeed); + +extern int NextRan(int n); diff --git a/xdl/third_party/tbb/examples/parallel_for/polygon_overlay/polyover.cpp b/xdl/third_party/tbb/examples/parallel_for/polygon_overlay/polyover.cpp new file mode 100644 index 00000000..f155f628 --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/polygon_overlay/polyover.cpp @@ -0,0 +1,668 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +// Polygon overlay +// +#include +#include +#include +#include +#include +#include "tbb/tick_count.h" +#include "tbb/blocked_range.h" +#include "tbb/task_scheduler_init.h" +#include "tbb/parallel_for.h" +#include "tbb/mutex.h" +#include "tbb/spin_mutex.h" +#include "polyover.h" +#include "polymain.h" +#include "pover_video.h" + +using namespace std; + +/*! +* @brief intersects a polygon with a map, adding any results to output map +* +* @param[out] resultMap output map (must be allocated) +* @param[in] polygon to be intersected +* @param[in] map intersected against +* @param[in] lock to use when adding output polygons to result map +* +*/ +void OverlayOnePolygonWithMap(Polygon_map_t *resultMap, RPolygon *myPoly, Polygon_map_t *map2, tbb::spin_mutex *rMutex) { + int r1, g1, b1, r2, g2, b2; + int myr=0; + int myg=0; + int myb=0; + int p1Area = myPoly->area(); + for(unsigned int j=1; (j < map2->size()) && (p1Area > 0); j++) { + RPolygon *p2 = &((*map2)[j]); + RPolygon *pnew; + int newxMin, newxMax, newyMin, newyMax; + myPoly->getColor(&r1, &g1, &b1); + if(PolygonsOverlap(myPoly, p2, newxMin, newyMin, newxMax, newyMax)) { + p2->getColor(&r2, &g2, &b2); + myr = r1 + r2; + myg = g1 + g2; + myb = b1 + b2; + p1Area -= (newxMax-newxMin+1)*(newyMax - newyMin + 1); + if(rMutex) { + tbb::spin_mutex::scoped_lock lock(*rMutex); + resultMap->push_back(RPolygon(newxMin, newyMin, newxMax, newyMax, myr, myg, myb)); + } + else { + resultMap->push_back(RPolygon(newxMin, newyMin, newxMax, newyMax, myr, myg, myb)); + } + } + } +} + +/*! +* @brief Serial version of polygon overlay +* @param[out] output map +* @param[in] first map (map that individual polygons are taken from) +* @param[in] second map (map passed to OverlayOnePolygonWithMap) +*/ +void SerialOverlayMaps(Polygon_map_t **resultMap, Polygon_map_t *map1, Polygon_map_t *map2) { + cout << "SerialOverlayMaps called" << std::endl; + *resultMap = new Polygon_map_t; + + RPolygon *p0 = &((*map1)[0]); + int mapxSize, mapySize, ignore1, ignore2; + p0->get(&ignore1, &ignore2, &mapxSize, &mapySize); + (*resultMap)->reserve(mapxSize*mapySize); // can't be any bigger than this + // push the map size as the first polygon, + (*resultMap)->push_back(RPolygon(0,0,mapxSize, mapySize)); + for(unsigned int i=1; i < map1->size(); i++) { + RPolygon *p1 = &((*map1)[i]); + OverlayOnePolygonWithMap(*resultMap, p1, map2, NULL); + } +} + +/*! +* @class ApplyOverlay +* @brief Simple version of parallel overlay (make parallel on polygons in map1) +*/ +class ApplyOverlay { + Polygon_map_t *m_map1, *m_map2, *m_resultMap; + tbb::spin_mutex *m_rMutex; +public: + /*! + * @brief functor to apply + * @param[in] r range of polygons to intersect from map1 + */ + void operator()( const tbb::blocked_range & r) const { + PRINT_DEBUG("From " << r.begin() << " to " << r.end()); + for(int i=r.begin(); i != r.end(); i++) { + RPolygon *myPoly = &((*m_map1)[i]); + OverlayOnePolygonWithMap(m_resultMap, myPoly, m_map2, m_rMutex); + } + } + ApplyOverlay(Polygon_map_t *resultMap, Polygon_map_t *map1, Polygon_map_t *map2, tbb::spin_mutex *rmutex) : + m_resultMap(resultMap), m_map1(map1), m_map2(map2), m_rMutex(rmutex) {} +}; + +/*! +* @brief apply the parallel algorithm +* @param[out] result_map generated map +* @param[in] polymap1 first map to be applied (algorithm is parallel on this map) +* @param[in] polymap2 second map. +*/ +void NaiveParallelOverlay(Polygon_map_t *&result_map, Polygon_map_t &polymap1, Polygon_map_t &polymap2) { +// ----------------------------------- + bool automatic_threadcount = false; + + if(gThreadsLow == THREADS_UNSET || gThreadsLow == tbb::task_scheduler_init::automatic) { + gThreadsLow = gThreadsHigh = tbb::task_scheduler_init::automatic; + automatic_threadcount = true; + } + result_map = new Polygon_map_t; + + RPolygon *p0 = &(polymap1[0]); + int mapxSize, mapySize, ignore1, ignore2; + p0->get(&ignore1, &ignore2, &mapxSize, &mapySize); + result_map->reserve(mapxSize*mapySize); // can't be any bigger than this + // push the map size as the first polygon, + tbb::spin_mutex *resultMutex = new tbb::spin_mutex(); + int grain_size = gGrainSize; + + for(int nthreads = gThreadsLow; nthreads <= gThreadsHigh; nthreads++) { + tbb::task_scheduler_init init(nthreads); + if(gIsGraphicalVersion) { + RPolygon *xp = new RPolygon(0, 0, gMapXSize-1, gMapYSize-1, 0, 0, 0); // Clear the output space + delete xp; + } + // put size polygon in result map + result_map->push_back(RPolygon(0,0,mapxSize, mapySize)); + + tbb::tick_count t0 = tbb::tick_count::now(); + tbb::parallel_for (tbb::blocked_range(1,(int)(polymap1.size()),grain_size), ApplyOverlay(result_map, &polymap1, &polymap2, resultMutex)); + tbb::tick_count t1 = tbb::tick_count::now(); + + double naiveParallelTime = (t1-t0).seconds() * 1000; + cout << "Naive parallel with spin lock and "; + if(automatic_threadcount) cout << "automatic"; + else cout << nthreads; + cout << ((nthreads == 1) ? " thread" : " threads"); + cout << " took " << naiveParallelTime << " msec : speedup over serial " << (gSerialTime / naiveParallelTime) << std::endl; + if(gCsvFile.is_open()) { + gCsvFile << "," << naiveParallelTime; + } +#if _DEBUG + CheckPolygonMap(result_map); + ComparePolygonMaps(result_map, gResultMap); +#endif + result_map->clear(); + } + delete resultMutex; + if(gCsvFile.is_open()) { + gCsvFile << std::endl; + } +// ----------------------------------- +} + +template +void split_at( Flagged_map_t& in_map, Flagged_map_t &left_out, Flagged_map_t &right_out, const T median) { + left_out.reserve(in_map.size()); + right_out.reserve(in_map.size()); + for(Flagged_map_t::iterator i = in_map.begin(); i != in_map.end(); ++i ) { + RPolygon *p = i->p(); + if(p->xmax() < median) { + // in left map + left_out.push_back(*i); + } + else if(p->xmin() >= median) { + right_out.push_back(*i); + // in right map + } + else { + // in both maps. + left_out.push_back(*i); + right_out.push_back(RPolygon_flagged(p, true)); + } + } +} + +// range that splits the maps as well as the range. the flagged_map_t are +// vectors of pointers, and each range owns its maps (has to free them on destruction.) +template +class blocked_range_with_maps { + + typedef blocked_range my_range_type; + +private: + + my_range_type my_range; + Flagged_map_t my_map1; + Flagged_map_t my_map2; + +public: + + blocked_range_with_maps( + T begin, T end, typename my_range_type::size_type my_grainsize, + Polygon_map_t *p1, Polygon_map_t *p2 + ) + : my_range(begin, end, my_grainsize) + { + my_map1.reserve(p1->size()); + my_map2.reserve(p2->size()); + for(int i=1; i < p1->size(); ++i) { + my_map1.push_back(RPolygon_flagged(&((*p1)[i]), false)); + } + for(int i=1; i < p2->size(); ++i) { + my_map2.push_back(RPolygon_flagged(&(p2->at(i)), false)); + } + } + + // copy-constructor required for deep copy of flagged maps. One copy is done at the start of the + // parallel for. + blocked_range_with_maps(const blocked_range_with_maps& other): my_range(other.my_range), my_map1(other.my_map1), my_map2(other.my_map2) { } + bool empty() const { return my_range.empty(); } + bool is_divisible() const { return my_range.is_divisible(); } + +#if _DEBUG + void check_my_map() { + assert(my_range.begin() <= my_range.end()); + for(Flagged_map_t::iterator ci = my_map1.begin(); ci != my_map1.end(); ++ci) { + RPolygon *rp = ci->p(); + assert(rp->xmax() >= my_range.begin()); + assert(rp->xmin() < my_range.end()); + } + for(Flagged_map_t::iterator ci = my_map2.begin(); ci != my_map2.end(); ++ci) { + RPolygon *rp = ci->p(); + assert(rp->xmax() >= my_range.begin()); + assert(rp->xmin() < my_range.end()); + } + } + + void dump_map( Flagged_map_t& mapx) { + cout << " ** MAP **\n"; + for( Flagged_map_t::iterator ci = mapx.begin(); ci != mapx.end(); ++ci) { + cout << *(ci->p()); + if(ci->isDuplicate()) { + cout << " -- is_duplicate"; + } + cout << "\n"; + } + cout << "\n"; + } +#endif + + blocked_range_with_maps(blocked_range_with_maps& lhs_r, split ) : my_range(my_range_type(lhs_r.my_range, split())) { + // lhs_r.my_range makes my_range from [median, high) and rhs_r.my_range from [low, median) + Flagged_map_t original_map1 = lhs_r.my_map1; + Flagged_map_t original_map2 = lhs_r.my_map2; + lhs_r.my_map1.clear(); + lhs_r.my_map2.clear(); + split_at(original_map1, lhs_r.my_map1, my_map1, my_range.begin()); + split_at(original_map2, lhs_r.my_map2, my_map2, my_range.begin()); +#if _DEBUG + this->check_my_map(); + lhs_r.check_my_map(); +#endif + } + + const my_range_type& range() const { return my_range; } + Flagged_map_t& map1() { return my_map1; } + Flagged_map_t& map2() { return my_map2; } +}; + +/*! +* @class ApplySplitOverlay +* @brief parallel by columnar strip +*/ +class ApplySplitOverlay { + Polygon_map_t *m_map1, *m_map2, *m_resultMap; + tbb::spin_mutex *m_rMutex; +public: + /*! + * @brief functor for columnar parallel version + * @param[in] r range of map to be operated on + */ + void operator()(/*const*/ blocked_range_with_maps & r) const { +#ifdef _DEBUG + // if we are debugging, serialize the method. That way we can + // see what is happening in each strip without the interleaving + // confusing things. + tbb::spin_mutex::scoped_lock lock(*m_rMutex); + cout << unitbuf << "From " << r.range().begin() << " to " << r.range().end()-1 << std::endl; +#endif + // get yMapSize + int r1, g1, b1, r2, g2, b2; + int myr=-1; + int myg=-1; + int myb=-1; + int i1, i2, i3, yMapSize; + (*m_map1)[0].get(&i1, &i2, &i3, &yMapSize); + + Flagged_map_t &fmap1 = r.map1(); + Flagged_map_t &fmap2 = r.map2(); + + // When intersecting polygons from fmap1 and fmap2, if BOTH are flagged + // as duplicate, don't add the result to the output map. We can still + // intersect them, because we are keeping track of how much of the polygon + // is left over from intersecting, and quitting when the polygon is + // used up. + + for(unsigned int ii=0; ii < fmap1.size(); ii++) { + RPolygon *p1 = fmap1[ii].p(); + bool is_dup = fmap1[ii].isDuplicate(); + int parea = p1->area(); + p1->getColor(&r1, &g1, &b1); + for(unsigned int jj=0;(jj < fmap2.size()) && (parea > 0); jj++) { + int xl, yl, xh, yh; + RPolygon *p2 = fmap2[jj].p(); + if(PolygonsOverlap(p1, p2, xl, yl, xh, yh)) { + if(!(is_dup && fmap2[jj].isDuplicate())) { + p2->getColor(&r2, &g2, &b2); + myr = r1 + r2; + myg = g1 + g2; + myb = b1 + b2; +#ifdef _DEBUG +#else + tbb::spin_mutex::scoped_lock lock(*m_rMutex); +#endif + (*m_resultMap).push_back(RPolygon(xl, yl, xh, yh, myr, myg, myb)); + } + parea -= (xh-xl+1)*(yh-yl+1); + } + } + } + } + + ApplySplitOverlay(Polygon_map_t *resultMap, Polygon_map_t *map1, Polygon_map_t *map2, tbb::spin_mutex *rmutex) : + m_resultMap(resultMap), m_map1(map1), m_map2(map2), m_rMutex(rmutex) {} +}; + + +/*! +* @brief intersects two maps strip-wise +* +* @param[out] resultMap output map (must be allocated) +* @param[in] polymap1 map to be intersected +* @param[in] polymap2 map to be intersected +*/ +void SplitParallelOverlay(Polygon_map_t **result_map, Polygon_map_t *polymap1, Polygon_map_t *polymap2) { + int nthreads; + bool automatic_threadcount = false; + double domainSplitParallelTime; + tbb::tick_count t0, t1; + tbb::spin_mutex *resultMutex; + if(gThreadsLow == THREADS_UNSET || gThreadsLow == tbb::task_scheduler_init::automatic ) { + gThreadsLow = gThreadsHigh = tbb::task_scheduler_init::automatic; + automatic_threadcount = true; + } + *result_map = new Polygon_map_t; + + RPolygon *p0 = &((*polymap1)[0]); + int mapxSize, mapySize, ignore1, ignore2; + p0->get(&ignore1, &ignore2, &mapxSize, &mapySize); + (*result_map)->reserve(mapxSize*mapySize); // can't be any bigger than this + resultMutex = new tbb::spin_mutex(); + + int grain_size; +#ifdef _DEBUG + grain_size = gMapXSize / 4; +#else + grain_size = gGrainSize; +#endif + for(nthreads = gThreadsLow; nthreads <= gThreadsHigh; nthreads++) { + tbb::task_scheduler_init init(nthreads); + if(gIsGraphicalVersion) { + RPolygon *xp = new RPolygon(0, 0, gMapXSize-1, gMapYSize-1, 0, 0, 0); // Clear the output space + delete xp; + } + // push the map size as the first polygon, + (*result_map)->push_back(RPolygon(0,0,mapxSize, mapySize)); + t0 = tbb::tick_count::now(); + tbb::parallel_for (blocked_range_with_maps(0,(int)(mapxSize+1),grain_size, polymap1, polymap2), ApplySplitOverlay((*result_map), polymap1, polymap2, resultMutex)); + t1 = tbb::tick_count::now(); + domainSplitParallelTime = (t1-t0).seconds()*1000; + cout << "Splitting parallel with spin lock and "; + if(automatic_threadcount) cout << "automatic"; + else cout << nthreads; + cout << ((nthreads == 1) ? " thread" : " threads"); + cout << " took " << domainSplitParallelTime << " msec : speedup over serial " << (gSerialTime / domainSplitParallelTime) << std::endl; + if(gCsvFile.is_open()) { + gCsvFile << "," << domainSplitParallelTime; + } +#if _DEBUG + CheckPolygonMap(*result_map); + ComparePolygonMaps(*result_map, gResultMap); +#endif + (*result_map)->clear(); + + } + delete resultMutex; + if(gCsvFile.is_open()) { + gCsvFile << std::endl; + } +} + +class ApplySplitOverlayCV { + Polygon_map_t *m_map1, *m_map2; + concurrent_Polygon_map_t *m_resultMap; +public: + /*! + * @brief functor for columnar parallel version + * @param[in] r range of map to be operated on + */ + void operator()(blocked_range_with_maps & r) const { + // get yMapSize + int r1, g1, b1, r2, g2, b2; + int myr=-1; + int myg=-1; + int myb=-1; + int i1, i2, i3, yMapSize; + (*m_map1)[0].get(&i1, &i2, &i3, &yMapSize); + + Flagged_map_t &fmap1 = r.map1(); + Flagged_map_t &fmap2 = r.map2(); + + // When intersecting polygons from fmap1 and fmap2, if BOTH are flagged + // as duplicate, don't add the result to the output map. We can still + // intersect them, because we are keeping track of how much of the polygon + // is left over from intersecting, and quitting when the polygon is + // used up. + + for(unsigned int ii=0; ii < fmap1.size(); ii++) { + RPolygon *p1 = fmap1[ii].p(); + bool is_dup = fmap1[ii].isDuplicate(); + int parea = p1->area(); + p1->getColor(&r1, &g1, &b1); + for(unsigned int jj=0;(jj < fmap2.size()) && (parea > 0); jj++) { + int xl, yl, xh, yh; + RPolygon *p2 = fmap2[jj].p(); + if(PolygonsOverlap(p1, p2, xl, yl, xh, yh)) { + if(!(is_dup && fmap2[jj].isDuplicate())) { + p2->getColor(&r2, &g2, &b2); + myr = r1 + r2; + myg = g1 + g2; + myb = b1 + b2; + (*m_resultMap).push_back(RPolygon(xl, yl, xh, yh, myr, myg, myb)); + } + parea -= (xh-xl+1)*(yh-yl+1); + } + } + } + } + + ApplySplitOverlayCV(concurrent_Polygon_map_t *resultMap, Polygon_map_t *map1, Polygon_map_t *map2 ) : + m_resultMap(resultMap), m_map1(map1), m_map2(map2) {} +}; + + +/*! +* @brief intersects two maps strip-wise, accumulating into a concurrent_vector +* +* @param[out] resultMap output map (must be allocated) +* @param[in] polymap1 map to be intersected +* @param[in] polymap2 map to be intersected +*/ +void SplitParallelOverlayCV(concurrent_Polygon_map_t **result_map, Polygon_map_t *polymap1, Polygon_map_t *polymap2) { + int nthreads; + bool automatic_threadcount = false; + double domainSplitParallelTime; + tbb::tick_count t0, t1; + if(gThreadsLow == THREADS_UNSET || gThreadsLow == tbb::task_scheduler_init::automatic ) { + gThreadsLow = gThreadsHigh = tbb::task_scheduler_init::automatic; + automatic_threadcount = true; + } + *result_map = new concurrent_Polygon_map_t; + + RPolygon *p0 = &((*polymap1)[0]); + int mapxSize, mapySize, ignore1, ignore2; + p0->get(&ignore1, &ignore2, &mapxSize, &mapySize); + // (*result_map)->reserve(mapxSize*mapySize); // can't be any bigger than this + + int grain_size; +#ifdef _DEBUG + grain_size = gMapXSize / 4; +#else + grain_size = gGrainSize; +#endif + for(nthreads = gThreadsLow; nthreads <= gThreadsHigh; nthreads++) { + tbb::task_scheduler_init init(nthreads); + if(gIsGraphicalVersion) { + RPolygon *xp = new RPolygon(0, 0, gMapXSize-1, gMapYSize-1, 0, 0, 0); // Clear the output space + delete xp; + } + // push the map size as the first polygon, + (*result_map)->push_back(RPolygon(0,0,mapxSize, mapySize)); + t0 = tbb::tick_count::now(); + tbb::parallel_for (blocked_range_with_maps(0,(int)(mapxSize+1),grain_size, polymap1, polymap2), ApplySplitOverlayCV((*result_map), polymap1, polymap2)); + t1 = tbb::tick_count::now(); + domainSplitParallelTime = (t1-t0).seconds()*1000; + cout << "Splitting parallel with concurrent_vector and "; + if(automatic_threadcount) cout << "automatic"; + else cout << nthreads; + cout << ((nthreads == 1) ? " thread" : " threads"); + cout << " took " << domainSplitParallelTime << " msec : speedup over serial " << (gSerialTime / domainSplitParallelTime) << std::endl; + if(gCsvFile.is_open()) { + gCsvFile << "," << domainSplitParallelTime; + } +#if _DEBUG + { + + Polygon_map_t s_result_map; + for(concurrent_Polygon_map_t::const_iterator ci = (*result_map)->begin(); ci != (*result_map)->end(); ++ci) { + s_result_map.push_back(*ci); + } + CheckPolygonMap(&s_result_map); + ComparePolygonMaps(&s_result_map, gResultMap); + } +#endif + (*result_map)->clear(); + + } + + if(gCsvFile.is_open()) { + gCsvFile << std::endl; + } + +} + +// ------------------------------------------------------ + +class ApplySplitOverlayETS { + Polygon_map_t *m_map1, *m_map2; + ETS_Polygon_map_t *m_resultMap; +public: + /*! + * @brief functor for columnar parallel version + * @param[in] r range of map to be operated on + */ + void operator()(blocked_range_with_maps & r) const { + // get yMapSize + int r1, g1, b1, r2, g2, b2; + int myr=-1; + int myg=-1; + int myb=-1; + int i1, i2, i3, yMapSize; + (*m_map1)[0].get(&i1, &i2, &i3, &yMapSize); + + Flagged_map_t &fmap1 = r.map1(); + Flagged_map_t &fmap2 = r.map2(); + + // When intersecting polygons from fmap1 and fmap2, if BOTH are flagged + // as duplicate, don't add the result to the output map. We can still + // intersect them, because we are keeping track of how much of the polygon + // is left over from intersecting, and quitting when the polygon is + // used up. + + for(unsigned int ii=0; ii < fmap1.size(); ii++) { + RPolygon *p1 = fmap1[ii].p(); + bool is_dup = fmap1[ii].isDuplicate(); + int parea = p1->area(); + p1->getColor(&r1, &g1, &b1); + for(unsigned int jj=0;(jj < fmap2.size()) && (parea > 0); jj++) { + int xl, yl, xh, yh; + RPolygon *p2 = fmap2[jj].p(); + if(PolygonsOverlap(p1, p2, xl, yl, xh, yh)) { + if(!(is_dup && fmap2[jj].isDuplicate())) { + p2->getColor(&r2, &g2, &b2); + myr = r1 + r2; + myg = g1 + g2; + myb = b1 + b2; + (*m_resultMap).local().push_back(RPolygon(xl, yl, xh, yh, myr, myg, myb)); + } + parea -= (xh-xl+1)*(yh-yl+1); + } + } + } + } + + ApplySplitOverlayETS(ETS_Polygon_map_t *resultMap, Polygon_map_t *map1, Polygon_map_t *map2 ) : + m_resultMap(resultMap), m_map1(map1), m_map2(map2) {} +}; + + +/*! +* @brief intersects two maps strip-wise, accumulating into an ets variable +* +* @param[out] resultMap output map (must be allocated) +* @param[in] polymap1 map to be intersected +* @param[in] polymap2 map to be intersected +*/ +void SplitParallelOverlayETS(ETS_Polygon_map_t **result_map, Polygon_map_t *polymap1, Polygon_map_t *polymap2) { + int nthreads; + bool automatic_threadcount = false; + double domainSplitParallelTime; + tbb::tick_count t0, t1; + if(gThreadsLow == THREADS_UNSET || gThreadsLow == tbb::task_scheduler_init::automatic ) { + gThreadsLow = gThreadsHigh = tbb::task_scheduler_init::automatic; + automatic_threadcount = true; + } + *result_map = new ETS_Polygon_map_t; + + RPolygon *p0 = &((*polymap1)[0]); + int mapxSize, mapySize, ignore1, ignore2; + p0->get(&ignore1, &ignore2, &mapxSize, &mapySize); + // (*result_map)->reserve(mapxSize*mapySize); // can't be any bigger than this + + int grain_size; +#ifdef _DEBUG + grain_size = gMapXSize / 4; +#else + grain_size = gGrainSize; +#endif + for(nthreads = gThreadsLow; nthreads <= gThreadsHigh; nthreads++) { + tbb::task_scheduler_init init(nthreads); + if(gIsGraphicalVersion) { + RPolygon *xp = new RPolygon(0, 0, gMapXSize-1, gMapYSize-1, 0, 0, 0); // Clear the output space + delete xp; + } + // push the map size as the first polygon, + // This polygon needs to be first, so we can push it at the start of a combine. + // (*result_map)->local.push_back(RPolygon(0,0,mapxSize, mapySize)); + t0 = tbb::tick_count::now(); + tbb::parallel_for (blocked_range_with_maps(0,(int)(mapxSize+1),grain_size, polymap1, polymap2), ApplySplitOverlayETS((*result_map), polymap1, polymap2)); + t1 = tbb::tick_count::now(); + domainSplitParallelTime = (t1-t0).seconds()*1000; + cout << "Splitting parallel with ETS and "; + if(automatic_threadcount) cout << "automatic"; + else cout << nthreads; + cout << ((nthreads == 1) ? " thread" : " threads"); + cout << " took " << domainSplitParallelTime << " msec : speedup over serial " << (gSerialTime / domainSplitParallelTime) << std::endl; + if(gCsvFile.is_open()) { + gCsvFile << "," << domainSplitParallelTime; + } +#if _DEBUG + { + + Polygon_map_t s_result_map; + flattened2d psv = flatten2d(**result_map); + s_result_map.push_back(RPolygon(0,0,mapxSize, mapySize)); + for(flattened2d::const_iterator ci = psv.begin(); ci != psv.end(); ++ci) { + s_result_map.push_back(*ci); + } + CheckPolygonMap(&s_result_map); + ComparePolygonMaps(&s_result_map, gResultMap); + } +#endif + (*result_map)->clear(); + + } + + if(gCsvFile.is_open()) { + gCsvFile << std::endl; + } + +} diff --git a/xdl/third_party/tbb/examples/parallel_for/polygon_overlay/polyover.h b/xdl/third_party/tbb/examples/parallel_for/polygon_overlay/polyover.h new file mode 100644 index 00000000..440f2e83 --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/polygon_overlay/polyover.h @@ -0,0 +1,41 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +/*! + * polyover.h : extern declarations for polyover.cpp +*/ +#include "rpolygon.h" +#include "tbb/mutex.h" +#include "tbb/spin_mutex.h" + +extern void OverlayOnePolygonWithMap(Polygon_map_t *resultMap, RPolygon *myPoly, Polygon_map_t *map2, tbb::spin_mutex *rMutex); + +extern void SerialOverlayMaps(Polygon_map_t **resultMap, Polygon_map_t *map1, Polygon_map_t *map2); + +// extern void NaiveParallelOverlay(Polygon_map_t **result_map, Polygon_map_t *polymap1, Polygon_map_t *polymap2); +extern void NaiveParallelOverlay(Polygon_map_t *&result_map, Polygon_map_t &polymap1, Polygon_map_t &polymap2); + +extern void SplitParallelOverlay(Polygon_map_t **result_map, Polygon_map_t *polymap1, Polygon_map_t *polymap2); +extern void SplitParallelOverlayCV(concurrent_Polygon_map_t **result_map, Polygon_map_t *polymap1, Polygon_map_t *polymap2); +extern void SplitParallelOverlayETS(ETS_Polygon_map_t **result_map, Polygon_map_t *polymap1, Polygon_map_t *polymap2); + +extern void CheckPolygonMap(Polygon_map_t *checkMap); +extern bool ComparePolygonMaps(Polygon_map_t *map1, Polygon_map_t *map2); + diff --git a/xdl/third_party/tbb/examples/parallel_for/polygon_overlay/pover_global.h b/xdl/third_party/tbb/examples/parallel_for/polygon_overlay/pover_global.h new file mode 100644 index 00000000..570fc6a8 --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/polygon_overlay/pover_global.h @@ -0,0 +1,93 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +// +// pover_global.h +// +#ifndef _POVER_GLOBAL_H_ +#define _POVER_GLOBAL_H_ + +#ifdef _MAIN_C_ +#define DEFINE // nothing +#define STATIC static +#define INIT(n) = n +#else // not in main file +#define DEFINE extern +#define STATIC // nothing +#define INIT(n) // nothing +#endif // _MAIN_C_ + +#include +#include + +#ifdef _WINDOWS +#include +#endif + +// this Polygon class only supports rectangles +DEFINE int gDrawXOffset INIT(0); // used for drawing polygons +DEFINE int gDrawYOffset INIT(0); +DEFINE int gPolyXBoxSize INIT(0); // number of pixels orresponding to one "square" (x) +DEFINE int gPolyYBoxSize INIT(0); // number of pixels orresponding to one "square" (y) +DEFINE bool gDoDraw INIT(false); // render the boxes + +#define THREADS_UNSET 0 +DEFINE int gThreadsLow INIT(THREADS_UNSET); +DEFINE int gThreadsHigh INIT(THREADS_UNSET); + +DEFINE std::ofstream gCsvFile; +DEFINE double gSerialTime; +DEFINE char *gCsvFilename INIT(NULL); + +#define BORDER_SIZE 10 // number of pixels between maps + +// The map size and the number of polygons depends on the version we are compiling. +// If DEBUG then it is small; else it is large. + +#ifdef _DEBUG +DEFINE int gNPolygons INIT(30); // default number of polygons in map +DEFINE int gMapXSize INIT(30); +DEFINE int gMapYSize INIT(30); +DEFINE int gGrainSize INIT(5); +#else +DEFINE int gNPolygons INIT(50000); // default number of polygons in map +DEFINE int gMapXSize INIT(1000); +DEFINE int gMapYSize INIT(1000); +DEFINE int gGrainSize INIT(20); +#endif +DEFINE int gMyRandomSeed INIT(2453185); + +DEFINE bool gIsGraphicalVersion INIT(false); + +typedef enum { + NORTH_SIDE, + EAST_SIDE, + SOUTH_SIDE, + WEST_SIDE +} allSides; + +#if _DEBUG +#define PRINT_DEBUG(x) (cout << x << std::endl) +#else +#define PRINT_DEBUG(x) +#endif + + +#endif // _POVER_GLOBAL_H_ diff --git a/xdl/third_party/tbb/examples/parallel_for/polygon_overlay/pover_video.cpp b/xdl/third_party/tbb/examples/parallel_for/polygon_overlay/pover_video.cpp new file mode 100644 index 00000000..0b2cf7be --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/polygon_overlay/pover_video.cpp @@ -0,0 +1,175 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +// Support for GUI display for Polygon overlay demo + +#define VIDEO_WINMAIN_ARGS +#include +#include "polyover.h" +#include "polymain.h" +#include "pover_video.h" +#include "tbb/tick_count.h" +#include "tbb/task_scheduler_init.h" +#ifndef _WIN32 +#include +#include + +void rt_sleep(int msec) { + usleep(msec*1000); +} + +#else //_WIN32 + +#undef OLDUNIXTIME +#undef STDTIME + +#include + +void rt_sleep(int msec) { + Sleep(msec); +} + +#endif /* _WIN32 */ + +using namespace std; + +bool g_next_frame() { + if(++n_next_frame_calls >= frame_skips) { // the data race here is benign + n_next_frame_calls = 0; + return gVideo->next_frame(); + } + return gVideo->running; +} + +bool g_last_frame() { + if(n_next_frame_calls) return gVideo->next_frame(); + return gVideo->running; +} + +bool initializeVideo(int argc, char **argv) { + //pover_video *l_video = new pover_video(); + //gVideo = l_video; + gVideo->init_console(); // don't check return code. + gVideo->title = g_windowTitle; + g_useGraphics = gVideo->init_window(g_xwinsize, g_ywinsize); + return true; +} + +void pover_video::on_process() { + tbb::tick_count t0, t1; + double naiveParallelTime, domainSplitParallelTime; + // create map1 These could be done in parallel, if the pseudorandom number generator were re-seeded. + GenerateMap(&gPolymap1, gMapXSize, gMapYSize, gNPolygons, /*red*/255, /*green*/0, /*blue*/127); + // create map2 + GenerateMap(&gPolymap2, gMapXSize, gMapYSize, gNPolygons, /*red*/0, /*green*/255, /*blue*/127); + // + // Draw source maps + gDrawXOffset = map1XLoc; + gDrawYOffset = map1YLoc; + for(int i=0; i < int(gPolymap1->size()); i++) { + (*gPolymap1)[i].drawPoly(); + } + gDrawXOffset = map2XLoc; + gDrawYOffset = map2YLoc; + for(int i=0; i < int(gPolymap2->size()) ;i++) { + (*gPolymap2)[i].drawPoly(); + } + gDoDraw = true; + + // run serial map generation + gDrawXOffset = maprXLoc; + gDrawYOffset = maprYLoc; + { + RPolygon *xp = new RPolygon(0, 0, gMapXSize-1, gMapYSize-1, 0, 0, 0); // Clear the output space + delete xp; + t0 = tbb::tick_count::now(); + SerialOverlayMaps(&gResultMap, gPolymap1, gPolymap2); + t1 = tbb::tick_count::now(); + cout << "Serial overlay took " << (t1-t0).seconds()*1000 << " msec" << std::endl; + gSerialTime = (t1-t0).seconds()*1000; +#if _DEBUG + CheckPolygonMap(gResultMap); + // keep the map for comparison purposes. +#else + delete gResultMap; +#endif + if(gCsvFile.is_open()) { + gCsvFile << "Serial Time," << gSerialTime << std::endl; + gCsvFile << "Threads,"; + if(gThreadsLow == THREADS_UNSET || gThreadsLow == tbb::task_scheduler_init::automatic) { + gCsvFile << "Threads,Automatic"; + } + else { + for(int i=gThreadsLow; i <= gThreadsHigh; i++) { + gCsvFile << i; + if(i < gThreadsHigh) gCsvFile << ","; + } + } + gCsvFile << std::endl; + } + if(gIsGraphicalVersion) rt_sleep(2000); + } + // run naive parallel map generation + { + Polygon_map_t *resultMap; + if(gCsvFile.is_open()) { + gCsvFile << "Naive Time"; + } + NaiveParallelOverlay(resultMap, *gPolymap1, *gPolymap2); + delete resultMap; + if(gIsGraphicalVersion) rt_sleep(2000); + } + // run split map generation + { + Polygon_map_t *resultMap; + if(gCsvFile.is_open()) { + gCsvFile << "Split Time"; + } + SplitParallelOverlay(&resultMap, gPolymap1, gPolymap2); + delete resultMap; + if(gIsGraphicalVersion) rt_sleep(2000); + } + // split, accumulating into concurrent vector + { + concurrent_Polygon_map_t *cresultMap; + if(gCsvFile.is_open()) { + gCsvFile << "Split CV time"; + } + SplitParallelOverlayCV(&cresultMap, gPolymap1, gPolymap2); + delete cresultMap; + if(gIsGraphicalVersion) rt_sleep(2000); + } + // split, accumulating into ETS + { + ETS_Polygon_map_t *cresultMap; + if(gCsvFile.is_open()) { + gCsvFile << "Split ETS time"; + } + SplitParallelOverlayETS(&cresultMap, gPolymap1, gPolymap2); + delete cresultMap; + if(gIsGraphicalVersion) rt_sleep(2000); + } + if(gIsGraphicalVersion) rt_sleep(8000); + delete gPolymap1; + delete gPolymap2; +#if _DEBUG + delete gResultMap; +#endif +} diff --git a/xdl/third_party/tbb/examples/parallel_for/polygon_overlay/pover_video.h b/xdl/third_party/tbb/examples/parallel_for/polygon_overlay/pover_video.h new file mode 100644 index 00000000..385716d5 --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/polygon_overlay/pover_video.h @@ -0,0 +1,64 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +// support for GUI for polygon overlay demo +// +#ifndef _POVER_VIDEO_H_ +#define _POVER_VIDEO_H_ +#include "../../common/gui/video.h" + +#include "pover_global.h" // for declaration of DEFINE and INIT + +DEFINE class video *gVideo INIT(0); + +DEFINE int n_next_frame_calls INIT(0); +DEFINE int frame_skips INIT(10); +extern bool g_next_frame(); +extern bool g_last_frame(); + +class pover_video: public video { + void on_process(); +public: +#ifdef _WINDOWS + bool graphic_display(){return video::win_hInstance != (HINSTANCE)NULL;} +#else + bool graphic_display() { return true;} // fix this for Linux +#endif + //void on_key(int key); +}; + +DEFINE int g_xwinsize INIT(1024); +DEFINE int g_ywinsize INIT(768); + +DEFINE int map1XLoc INIT(10); +DEFINE int map1YLoc INIT(10); +DEFINE int map2XLoc INIT(270); +DEFINE int map2YLoc INIT(10); +DEFINE int maprXLoc INIT(530); +DEFINE int maprYLoc INIT(10); + +DEFINE const char *g_windowTitle INIT("Polygon Overlay"); +DEFINE bool g_useGraphics INIT(true); + +extern bool initializeVideo(int argc, char **argv); + +extern void rt_sleep(int msec); + +#endif // _POVER_VIDEO_H_ diff --git a/xdl/third_party/tbb/examples/parallel_for/polygon_overlay/readme.html b/xdl/third_party/tbb/examples/parallel_for/polygon_overlay/readme.html new file mode 100644 index 00000000..1008b524 --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/polygon_overlay/readme.html @@ -0,0 +1,476 @@ + + + + + + Intel® Threading Building Blocks. Polygon_overlay sample + + + + + +

    + Polygon Overlay example that demonstrates the use of parallel_for. +

    + This example is a simple implementation of polygon overlay, as described in + + Parallelizing the Polygon Overlay Problem Using Orca, by H.F. Langendoen. +

    + The solution was implemented in three forms: +

      +
    • The naive serial solution. +
    • The naive parallel solution, by splitting list of polygons from one map and intersecting + each sub-list against the entire list of polygons from the second map. +
    • A parallel solution where each map is split into submaps, with each resulting submap being + intersected against the corresponding submap from the other map. This solution requires some + redundancy (some polygons are members of more than one submap). To prevent multiple copies + of a polygon from being placed in the solution map, if both polygons are duplicated (that is, + if they both appear in more than one map), they are intersected but the result is not placed + in the solution map. +
    + The only optimization in each solution is that the area of the generated sub-polygons are subtracted from + the original area of one of the source polygons. When the remaining area is zero, the intersection process + is halted. +

    + A word about the speedup of the submap case. One may get superlinear speedup in this case (for instance a + laptop with Intel® Core(TM) Duo processor got a speedup of about 20 percent over serial.) This results from two effects: +
      +
    • the number of threads used, and +
    • the fact that for each submap, the number of polygons is smaller than that for the other two cases. +
    + If there are, say, 400 polygons in each map, then on average the number of intersections calculated is + approximately 80,000 (400 * 200, where 200 is the average number of polygons examined before stopping.) + If the maps are split into 2 submaps, the time for each submap is about 200*100, or 20,000. So even + comparing the two sets of submaps serially should result in a speedup somewhere around 2. This number + is affected by the number of redundant polygons being compared; this effect would eventually swamp the gain + from comparing smaller numbers of polygons per submap. And remember the submaps are created by intersecting each + map with a rectangular polygon covering the submap being generated, which is additional work taking about N * O(400) + in the case above, where N is the number of submaps generated, that can be done in parallel. +

    + Running the default release pover while varying the number of submaps from 1 to 1000, the speedup on the submap + case for a 2-processor system looks like +

    + Table of speedup for the algorithm +

    + One further optimization would be to sort one map, say map1, by maxY, and sort the other map (map2) + by minY. For p1 in map1, start testing for intersection at the first p2 in map2 + that intersected the last polygon tested in map1. This would speed up the intersection process greatly, + but the optimization would apply to all the methods, and the sort would have to be accounted for in the timing. +

    + The source maps are generated pseudo-randomly in the manner described in the paper above. That is, if + we need N polygons, then N "boxes" are chosen at random, then one-at-a-time the areas are expanded in + one of fours directions until the area hits an adjacent polygon. When this process is finished, the + resulting map is inspected and any remaining unoccupied "boxes" are made into additional polygons, as + large as possible in each case. So the actual number of polygons in each map will in general be larger + than the number of polygons requested (sometimes by 10% or more.) +

    + One limitation of the program is that if the number of polygons in the source map is greater than the number of + "boxes" (pixels in the GUI case), the maps cannot be generated. +

    + +
    +
    System Requirements
    + +
    +

    + For the most up to date system requirements, see the release notes. +

    +
    +
    + +
    +
    Files
    + +
    +
    +
    polyover.cpp +
    Source code for main program. +
    polyover.h +
    Global variables, classes and enums. +
    pover_video.cpp +
    Source code for the GUI interface. +
    pover_video.h +
    Defines for the GUI version. +
    Makefile +
    Makefile for building the example. +
    +
    +
    + +
    +
    Directories
    + +
    +
    +
    msvs +
    Contains Microsoft* Visual Studio* workspace for building and running the example (Windows* systems only). +
    xcode +
    Contains Xcode* IDE workspace for building and running the example (macOS* systems only). +
    +

    For information about the minimum supported version of IDE, see release notes.

    +
    +
    + +
    +
    Build instructions
    + +
    +

    + General build directions can be found here. +

    + For the various UI options, see the common GUI code build instructions. +

    +
    +
    + +
    +
    Usage
    + +
    +

    + Building via the above make commands, or via Microsoft* Visual Studio* projects on Windows* systems, produces executable files + named pover.exe. To run these executables directly, use one or more of the following commands: +

    +
    +
    pover.exe +
    Run this version (release or debug). +
    pover.exe n:m +
    Run this version (release or debug) (m-n+1) times, with n threads to m threads inclusive. +
    To run a short version of this example, e.g., for use with Intel® Threading Tools: +
    Build a debug version with the GUI turned off + (e.g., make UI=con debug; see also the build directions above). +
    Run it with a small dataset, e.g., pover.exe --polys 10 --size 5x5. +
    +
    +
    + +
    +
    Notes
    + +
    +
      +
    • While running with the GUI display should yield reasonable performance in most cases, running with no GUI + display is strongly recommended in order to demonstrate the full performance and scalability of the example. +
    +
    +
    + +
    + Up to parent directory +
    +
    +
    Legal Information
    + +
    +

    + Intel, Intel Core and the Intel logo are trademarks of Intel Corporation in the U.S. and/or other countries. +
    * Other names and brands may be claimed as the property of others. +
    © 2018, Intel Corporation +

    +
    +
    + + + diff --git a/xdl/third_party/tbb/examples/parallel_for/polygon_overlay/rpolygon.h b/xdl/third_party/tbb/examples/parallel_for/polygon_overlay/rpolygon.h new file mode 100644 index 00000000..9cc8f743 --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/polygon_overlay/rpolygon.h @@ -0,0 +1,155 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +// rpolygon.h +// +#ifndef _RPOLYGON_H_ +#define _RPOLYGON_H_ +#include +#include +#include "pover_video.h" + +#include "tbb/scalable_allocator.h" +#include "tbb/concurrent_vector.h" +#include "tbb/enumerable_thread_specific.h" + +using namespace std; + +using namespace tbb; + +class RPolygon; +typedef scalable_allocator RPolygon_allocator; +DEFINE RPolygon_allocator rAlloc; + +enum MallocBehavior { + UseMalloc, + UseScalableAllocator +}; + +DEFINE MallocBehavior gMBehavior INIT(UseScalableAllocator); + +class RPolygon { +public: + RPolygon() {m_XMin = m_YMin = m_XMax = m_YMax = 0; + m_r = m_g = m_b = 0; + } + RPolygon(int xMin, int yMin, int xMax, int yMax, int r=-1, int g=-1, int b=-1) : m_XMin(xMin), m_YMin(yMin), m_XMax(xMax), m_YMax(yMax) { + if( r >= 0) { + m_r=(colorcomp_t)r; m_g=(colorcomp_t)g; m_b=(colorcomp_t)b; + if(gDoDraw) drawPoly(); + } + } + + void set_nodraw(int xMin, int yMin, int xMax, int yMax) {m_XMin=xMin; m_YMin=yMin; m_XMax=xMax; m_YMax=yMax;} + + RPolygon &intersect(RPolygon &otherPoly); + void set(int xMin, int yMin, int xMax, int yMax) { + set_nodraw(xMin,yMin,xMax,yMax); + if(gDoDraw) { + drawPoly(); + } + } + void get(int *xMin, int *yMin, int *xMax, int *yMax) const {*xMin=m_XMin;*yMin=m_YMin;*xMax=m_XMax;*yMax=m_YMax;} + int xmax() const { return m_XMax; } + int xmin() const { return m_XMin; } + int ymax() const { return m_YMax; } + int ymin() const { return m_YMin; } + void setColor(colorcomp_t newr, colorcomp_t newg, colorcomp_t newb) {m_r = newr; m_g=newg; m_b=newb;} + void getColor(int *myr, int *myg, int *myb) {*myr=m_r; *myg=m_g; *myb=m_b;} + color_t myColor() {return gVideo->get_color(m_r, m_g, m_b);} + void drawPoly() { + if(gVideo->running) { + if(g_next_frame()) { // Shouldn't call next_frame each time + drawing_area ldrawing( + gDrawXOffset+m_XMin*gPolyXBoxSize, //x + gDrawYOffset+m_YMin*gPolyYBoxSize, //y + (m_XMax-m_XMin+1)*gPolyXBoxSize, //sizex + (m_YMax-m_YMin+1)*gPolyYBoxSize); //sizey + for(int y=0; y b.ymin()) return false; + if(a.ymin() < b.ymin()) return true; + return a.xmin() < b.xmin(); +} +#else +extern bool operator<(const RPolygon& a, const RPolygon& b); +#endif + +extern ostream& operator<<(ostream& s, const RPolygon &p); + +class RPolygon_flagged { + RPolygon *myPoly; + bool is_duplicate; +public: + RPolygon_flagged() {myPoly = NULL; is_duplicate = false;} + RPolygon_flagged(RPolygon* _p, bool _is_duplicate) : myPoly(_p), is_duplicate(_is_duplicate) { } + bool isDuplicate() {return is_duplicate;} + void setDuplicate(bool newValue) {is_duplicate = newValue;} + RPolygon *p() {return myPoly;} + void setp(RPolygon *newp) {myPoly = newp;} +}; + +typedef class vector Polygon_map_t; +typedef class concurrent_vector concurrent_Polygon_map_t; +typedef class enumerable_thread_specific ETS_Polygon_map_t; +typedef class vector > Flagged_map_t; // we'll make shallow copies + +inline bool PolygonsOverlap(RPolygon *p1, RPolygon *p2, int &xl, int &yl, int &xh, int &yh) { + int xl1, yl1, xh1, yh1, xl2, yl2, xh2, yh2; +#if _DEBUG + rt_sleep(1); // slow down the process so we can see it. +#endif + p1->get(&xl1, &yl1, &xh1, &yh1); + p2->get(&xl2, &yl2, &xh2, &yh2); + if(xl1 > xh2) return false; + if(xh1 < xl2) return false; + if(yl1 > yh2) return false; + if(yh1 < yl2) return false; + xl = (xl1 < xl2) ? xl2 : xl1; + xh = (xh1 < xh2) ? xh1 : xh2; + yl = (yl1 < yl2) ? yl2 : yl1; + yh = (yh1 < yh2) ? yh1 : yh2; + return true; +} + +#endif // _RPOLYGON_H_ diff --git a/xdl/third_party/tbb/examples/parallel_for/polygon_overlay/speedup.gif b/xdl/third_party/tbb/examples/parallel_for/polygon_overlay/speedup.gif new file mode 100644 index 00000000..04d6d876 Binary files /dev/null and b/xdl/third_party/tbb/examples/parallel_for/polygon_overlay/speedup.gif differ diff --git a/xdl/third_party/tbb/examples/parallel_for/polygon_overlay/xcode/polygon_overlay.xcodeproj/project.pbxproj b/xdl/third_party/tbb/examples/parallel_for/polygon_overlay/xcode/polygon_overlay.xcodeproj/project.pbxproj new file mode 100644 index 00000000..b2b4b93e --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/polygon_overlay/xcode/polygon_overlay.xcodeproj/project.pbxproj @@ -0,0 +1,573 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 84B8DA77152CA90100D59B95 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 84B8DA6F152CA90100D59B95 /* main.m */; }; + 84B8DA78152CA90100D59B95 /* OpenGLView.m in Sources */ = {isa = PBXBuildFile; fileRef = 84B8DA71152CA90100D59B95 /* OpenGLView.m */; }; + 84B8DA79152CA90100D59B95 /* tbbAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 84B8DA73152CA90100D59B95 /* tbbAppDelegate.m */; }; + 84B8DA7A152CA90100D59B95 /* (null) in Resources */ = {isa = PBXBuildFile; }; + 84B8DA80152CA97B00D59B95 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 84B8DA7C152CA97B00D59B95 /* InfoPlist.strings */; }; + 84B8DA81152CA97B00D59B95 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 84B8DA7E152CA97B00D59B95 /* MainMenu.xib */; }; + 84B8DA9A152CADF400D59B95 /* macvideo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84B8DA99152CADF400D59B95 /* macvideo.cpp */; }; + 84B8DAAC152CB05200D59B95 /* polymain.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84B8DAA4152CB05200D59B95 /* polymain.cpp */; }; + 84B8DAAD152CB05200D59B95 /* polyover.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84B8DAA6152CB05200D59B95 /* polyover.cpp */; }; + 84B8DAAE152CB05200D59B95 /* pover_video.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84B8DAA9152CB05200D59B95 /* pover_video.cpp */; }; + 84D017561527431F0008A4E0 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84D017551527431F0008A4E0 /* Cocoa.framework */; }; + 84D01776152744BD0008A4E0 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84D01775152744BD0008A4E0 /* OpenGL.framework */; }; + D31F32621C11DEE000A77D54 /* polymain.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84B8DAA4152CB05200D59B95 /* polymain.cpp */; }; + D31F32631C11DEE300A77D54 /* polyover.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84B8DAA6152CB05200D59B95 /* polyover.cpp */; }; + D31F32641C11DEE700A77D54 /* pover_video.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84B8DAA9152CB05200D59B95 /* pover_video.cpp */; }; + D31F32651C11DEEC00A77D54 /* macvideo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84B8DA99152CADF400D59B95 /* macvideo.cpp */; }; + D31F32661C11DEF000A77D54 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 84B8DA6F152CA90100D59B95 /* main.m */; }; + D31F32671C11DEF300A77D54 /* OpenGLView.m in Sources */ = {isa = PBXBuildFile; fileRef = 84B8DA71152CA90100D59B95 /* OpenGLView.m */; }; + D31F32681C11DEF600A77D54 /* tbbAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 84B8DA73152CA90100D59B95 /* tbbAppDelegate.m */; }; + D31F326B1C11DF6000A77D54 /* iOS.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D31F32691C11DF1600A77D54 /* iOS.storyboard */; }; +/* End PBXBuildFile section */ + +/* Begin PBXBuildRule section */ + C3C5897B2191EB8300DAC94C /* PBXBuildRule */ = { + isa = PBXBuildRule; + compilerSpec = com.intel.compilers.icc.latest; + fileType = sourcecode.cpp; + isEditable = 1; + outputFiles = ( + ); + script = "# Type a script or drag a script file from your workspace to insert its path.\n"; + }; +/* End PBXBuildRule section */ + +/* Begin PBXFileReference section */ + 84B8DA6F152CA90100D59B95 /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = ../../../common/gui/xcode/tbbExample/main.m; sourceTree = ""; }; + 84B8DA70152CA90100D59B95 /* OpenGLView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OpenGLView.h; path = ../../../common/gui/xcode/tbbExample/OpenGLView.h; sourceTree = ""; }; + 84B8DA71152CA90100D59B95 /* OpenGLView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = OpenGLView.m; path = ../../../common/gui/xcode/tbbExample/OpenGLView.m; sourceTree = ""; }; + 84B8DA72152CA90100D59B95 /* tbbAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = tbbAppDelegate.h; path = ../../../common/gui/xcode/tbbExample/tbbAppDelegate.h; sourceTree = ""; }; + 84B8DA73152CA90100D59B95 /* tbbAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = tbbAppDelegate.m; path = ../../../common/gui/xcode/tbbExample/tbbAppDelegate.m; sourceTree = ""; }; + 84B8DA75152CA90100D59B95 /* tbbExample-Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "tbbExample-Prefix.pch"; path = "../../../common/gui/xcode/tbbExample/tbbExample-Prefix.pch"; sourceTree = ""; }; + 84B8DA7D152CA97B00D59B95 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = InfoPlist.strings; sourceTree = ""; }; + 84B8DA7F152CA97B00D59B95 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = MainMenu.xib; sourceTree = ""; }; + 84B8DA99152CADF400D59B95 /* macvideo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = macvideo.cpp; path = ../../../common/gui/macvideo.cpp; sourceTree = ""; }; + 84B8DAA4152CB05200D59B95 /* polymain.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = polymain.cpp; path = ../polymain.cpp; sourceTree = ""; }; + 84B8DAA5152CB05200D59B95 /* polymain.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = polymain.h; path = ../polymain.h; sourceTree = ""; }; + 84B8DAA6152CB05200D59B95 /* polyover.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = polyover.cpp; path = ../polyover.cpp; sourceTree = ""; }; + 84B8DAA7152CB05200D59B95 /* polyover.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = polyover.h; path = ../polyover.h; sourceTree = ""; }; + 84B8DAA8152CB05200D59B95 /* pover_global.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = pover_global.h; path = ../pover_global.h; sourceTree = ""; }; + 84B8DAA9152CB05200D59B95 /* pover_video.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = pover_video.cpp; path = ../pover_video.cpp; sourceTree = ""; }; + 84B8DAAA152CB05200D59B95 /* pover_video.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = pover_video.h; path = ../pover_video.h; sourceTree = ""; }; + 84B8DAAB152CB05200D59B95 /* rpolygon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = rpolygon.h; path = ../rpolygon.h; sourceTree = ""; }; + 84D017511527431F0008A4E0 /* tbbExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = tbbExample.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 84D017551527431F0008A4E0 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; + 84D017581527431F0008A4E0 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; + 84D017591527431F0008A4E0 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; }; + 84D0175A1527431F0008A4E0 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + 84D01775152744BD0008A4E0 /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; }; + D31F324B1C11DEC100A77D54 /* tbbExample.ios.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = tbbExample.ios.app; sourceTree = BUILT_PRODUCTS_DIR; }; + D31F32691C11DF1600A77D54 /* iOS.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = iOS.storyboard; path = ../iOS.storyboard; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 84D0174E1527431F0008A4E0 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 84D01776152744BD0008A4E0 /* OpenGL.framework in Frameworks */, + 84D017561527431F0008A4E0 /* Cocoa.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + D31F32481C11DEC100A77D54 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 84B8DA6C152CA8D900D59B95 /* tbbExample */ = { + isa = PBXGroup; + children = ( + 84B8DAA4152CB05200D59B95 /* polymain.cpp */, + 84B8DAA5152CB05200D59B95 /* polymain.h */, + 84B8DAA6152CB05200D59B95 /* polyover.cpp */, + 84B8DAA7152CB05200D59B95 /* polyover.h */, + 84B8DAA8152CB05200D59B95 /* pover_global.h */, + 84B8DAA9152CB05200D59B95 /* pover_video.cpp */, + 84B8DAAA152CB05200D59B95 /* pover_video.h */, + 84B8DAAB152CB05200D59B95 /* rpolygon.h */, + 84B8DA98152CAD8600D59B95 /* Gui layer */, + 84B8DA7B152CA97B00D59B95 /* Resources */, + ); + name = tbbExample; + sourceTree = ""; + }; + 84B8DA7B152CA97B00D59B95 /* Resources */ = { + isa = PBXGroup; + children = ( + D31F32691C11DF1600A77D54 /* iOS.storyboard */, + 84B8DA7C152CA97B00D59B95 /* InfoPlist.strings */, + 84B8DA7E152CA97B00D59B95 /* MainMenu.xib */, + ); + name = Resources; + path = ../../../common/gui/xcode/tbbExample/en.lproj; + sourceTree = ""; + }; + 84B8DA98152CAD8600D59B95 /* Gui layer */ = { + isa = PBXGroup; + children = ( + 84B8DA99152CADF400D59B95 /* macvideo.cpp */, + 84B8DA6F152CA90100D59B95 /* main.m */, + 84B8DA70152CA90100D59B95 /* OpenGLView.h */, + 84B8DA71152CA90100D59B95 /* OpenGLView.m */, + 84B8DA72152CA90100D59B95 /* tbbAppDelegate.h */, + 84B8DA73152CA90100D59B95 /* tbbAppDelegate.m */, + 84B8DA75152CA90100D59B95 /* tbbExample-Prefix.pch */, + ); + name = "Gui layer"; + sourceTree = ""; + }; + 84D017461527431F0008A4E0 = { + isa = PBXGroup; + children = ( + 84B8DA6C152CA8D900D59B95 /* tbbExample */, + 84D017541527431F0008A4E0 /* Frameworks */, + 84D017521527431F0008A4E0 /* Products */, + ); + sourceTree = ""; + }; + 84D017521527431F0008A4E0 /* Products */ = { + isa = PBXGroup; + children = ( + 84D017511527431F0008A4E0 /* tbbExample.app */, + D31F324B1C11DEC100A77D54 /* tbbExample.ios.app */, + ); + name = Products; + sourceTree = ""; + }; + 84D017541527431F0008A4E0 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 84D01775152744BD0008A4E0 /* OpenGL.framework */, + 84D017551527431F0008A4E0 /* Cocoa.framework */, + 84D017571527431F0008A4E0 /* Other Frameworks */, + ); + name = Frameworks; + sourceTree = ""; + }; + 84D017571527431F0008A4E0 /* Other Frameworks */ = { + isa = PBXGroup; + children = ( + 84D017581527431F0008A4E0 /* AppKit.framework */, + 84D017591527431F0008A4E0 /* CoreData.framework */, + 84D0175A1527431F0008A4E0 /* Foundation.framework */, + ); + name = "Other Frameworks"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 84D017501527431F0008A4E0 /* tbbExample */ = { + isa = PBXNativeTarget; + buildConfigurationList = 84D01772152743200008A4E0 /* Build configuration list for PBXNativeTarget "tbbExample" */; + buildPhases = ( + 84D0174D1527431F0008A4E0 /* Sources */, + 84D0174E1527431F0008A4E0 /* Frameworks */, + 84D0174F1527431F0008A4E0 /* Resources */, + ); + buildRules = ( + C3C5897B2191EB8300DAC94C /* PBXBuildRule */, + ); + dependencies = ( + ); + name = tbbExample; + productName = tbbExample; + productReference = 84D017511527431F0008A4E0 /* tbbExample.app */; + productType = "com.apple.product-type.application"; + }; + D31F324A1C11DEC100A77D54 /* tbbExample.ios */ = { + isa = PBXNativeTarget; + buildConfigurationList = D31F325F1C11DEC100A77D54 /* Build configuration list for PBXNativeTarget "tbbExample.ios" */; + buildPhases = ( + D31F32471C11DEC100A77D54 /* Sources */, + D31F32481C11DEC100A77D54 /* Frameworks */, + D31F32491C11DEC100A77D54 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = tbbExample.ios; + productName = tbbExample.ios; + productReference = D31F324B1C11DEC100A77D54 /* tbbExample.ios.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 84D017481527431F0008A4E0 /* Project object */ = { + isa = PBXProject; + attributes = { + CLASSPREFIX = tbb; + LastUpgradeCheck = 1000; + TargetAttributes = { + D31F324A1C11DEC100A77D54 = { + CreatedOnToolsVersion = 7.1.1; + DevelopmentTeam = 7J8M3RM94C; + }; + }; + }; + buildConfigurationList = 84D0174B1527431F0008A4E0 /* Build configuration list for PBXProject "polygon_overlay" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 84D017461527431F0008A4E0; + productRefGroup = 84D017521527431F0008A4E0 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 84D017501527431F0008A4E0 /* tbbExample */, + D31F324A1C11DEC100A77D54 /* tbbExample.ios */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 84D0174F1527431F0008A4E0 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 84B8DA7A152CA90100D59B95 /* (null) in Resources */, + 84B8DA80152CA97B00D59B95 /* InfoPlist.strings in Resources */, + 84B8DA81152CA97B00D59B95 /* MainMenu.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + D31F32491C11DEC100A77D54 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + D31F326B1C11DF6000A77D54 /* iOS.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 84D0174D1527431F0008A4E0 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 84B8DA77152CA90100D59B95 /* main.m in Sources */, + 84B8DA78152CA90100D59B95 /* OpenGLView.m in Sources */, + 84B8DA79152CA90100D59B95 /* tbbAppDelegate.m in Sources */, + 84B8DA9A152CADF400D59B95 /* macvideo.cpp in Sources */, + 84B8DAAC152CB05200D59B95 /* polymain.cpp in Sources */, + 84B8DAAD152CB05200D59B95 /* polyover.cpp in Sources */, + 84B8DAAE152CB05200D59B95 /* pover_video.cpp in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + D31F32471C11DEC100A77D54 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + D31F32641C11DEE700A77D54 /* pover_video.cpp in Sources */, + D31F32631C11DEE300A77D54 /* polyover.cpp in Sources */, + D31F32651C11DEEC00A77D54 /* macvideo.cpp in Sources */, + D31F32681C11DEF600A77D54 /* tbbAppDelegate.m in Sources */, + D31F32621C11DEE000A77D54 /* polymain.cpp in Sources */, + D31F32661C11DEF000A77D54 /* main.m in Sources */, + D31F32671C11DEF300A77D54 /* OpenGLView.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 84B8DA7C152CA97B00D59B95 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 84B8DA7D152CA97B00D59B95 /* en */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; + 84B8DA7E152CA97B00D59B95 /* MainMenu.xib */ = { + isa = PBXVariantGroup; + children = ( + 84B8DA7F152CA97B00D59B95 /* en */, + ); + name = MainMenu.xib; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 84D01770152743200008A4E0 /* Debug64 */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = YES; + CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = c11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_VERSION = ""; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(TBBROOT)/include", + /opt/intel/tbb/include, + ); + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(TBBROOT)/lib /opt/intel/tbb/lib"; + LIBRARY_SEARCH_PATHS = ( + "$(TBBROOT)/lib", + /opt/intel/tbb/lib, + ); + MACOSX_DEPLOYMENT_TARGET = 10.11; + ONLY_ACTIVE_ARCH = YES; + OTHER_LDFLAGS = ( + "-m64", + "-ltbb_debug", + "-ltbbmalloc_debug", + ); + SDKROOT = macosx; + VALID_ARCHS = x86_64; + }; + name = Debug64; + }; + 84D01771152743200008A4E0 /* Release64 */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = YES; + CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = c11; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_VERSION = ""; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(TBBROOT)/include", + /opt/intel/tbb/include, + ); + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(TBBROOT)/lib /opt/intel/tbb/lib"; + LIBRARY_SEARCH_PATHS = ( + "$(TBBROOT)/lib", + /opt/intel/tbb/lib, + ); + MACOSX_DEPLOYMENT_TARGET = 10.11; + OTHER_LDFLAGS = ( + "-m64", + "-ltbb", + "-ltbbmalloc", + ); + SDKROOT = macosx; + VALID_ARCHS = x86_64; + }; + name = Release64; + }; + 84D01773152743200008A4E0 /* Debug64 */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_OBJC_ARC = NO; + COMBINE_HIDPI_IMAGES = YES; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "../../../common/gui/xcode/tbbExample/tbbExample-Prefix.pch"; + HEADER_SEARCH_PATHS = "$(inherited)"; + ICC_CXX_LANG_DIALECT = "c++11"; + ICC_TBB = YES; + INFOPLIST_FILE = "../../../common/gui/xcode/tbbExample/tbbExample-Info.plist"; + LIBRARY_SEARCH_PATHS = "$(inherited)"; + MACOSX_DEPLOYMENT_TARGET = 10.11; + PRODUCT_NAME = "$(TARGET_NAME)"; + RUN_CLANG_STATIC_ANALYZER = YES; + VERSION_INFO_BUILDER = "$(TARGET_NAME)"; + WRAPPER_EXTENSION = app; + }; + name = Debug64; + }; + 84D01774152743200008A4E0 /* Release64 */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_OBJC_ARC = NO; + COMBINE_HIDPI_IMAGES = YES; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "../../../common/gui/xcode/tbbExample/tbbExample-Prefix.pch"; + HEADER_SEARCH_PATHS = "$(inherited)"; + ICC_CXX_LANG_DIALECT = "c++11"; + ICC_TBB = YES; + INFOPLIST_FILE = "../../../common/gui/xcode/tbbExample/tbbExample-Info.plist"; + LIBRARY_SEARCH_PATHS = "$(inherited)"; + MACOSX_DEPLOYMENT_TARGET = 10.11; + PRODUCT_NAME = "$(TARGET_NAME)"; + RUN_CLANG_STATIC_ANALYZER = YES; + VERSION_INFO_BUILDER = "$(TARGET_NAME)"; + WRAPPER_EXTENSION = app; + }; + name = Release64; + }; + D31F32601C11DEC100A77D54 /* Debug64 */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + DEBUG_INFORMATION_FORMAT = dwarf; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + "__TBB_IOS=1", + ); + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + HEADER_SEARCH_PATHS = "\"$(SRCROOT)/../../../../include\""; + INFOPLIST_FILE = "../../../common/gui/xcode/tbbExample/tbbExample-Info.ios.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 9.1; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path"; + LIBRARY_SEARCH_PATHS = "\"$(SRCROOT)/../../../../lib/ios\""; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.tbb.example; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = 1; + }; + name = Debug64; + }; + D31F32611C11DEC100A77D54 /* Release64 */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + ENABLE_NS_ASSERTIONS = NO; + GCC_PREPROCESSOR_DEFINITIONS = "__TBB_IOS=1"; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + HEADER_SEARCH_PATHS = "\"$(SRCROOT)/../../../../include\""; + INFOPLIST_FILE = "../../../common/gui/xcode/tbbExample/tbbExample-Info.ios.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 9.1; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path"; + LIBRARY_SEARCH_PATHS = "\"$(SRCROOT)/../../../../lib/ios\""; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = com.tbb.example; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = 1; + VALIDATE_PRODUCT = YES; + }; + name = Release64; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 84D0174B1527431F0008A4E0 /* Build configuration list for PBXProject "polygon_overlay" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 84D01770152743200008A4E0 /* Debug64 */, + 84D01771152743200008A4E0 /* Release64 */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release64; + }; + 84D01772152743200008A4E0 /* Build configuration list for PBXNativeTarget "tbbExample" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 84D01773152743200008A4E0 /* Debug64 */, + 84D01774152743200008A4E0 /* Release64 */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release64; + }; + D31F325F1C11DEC100A77D54 /* Build configuration list for PBXNativeTarget "tbbExample.ios" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + D31F32601C11DEC100A77D54 /* Debug64 */, + D31F32611C11DEC100A77D54 /* Release64 */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release64; + }; +/* End XCConfigurationList section */ + }; + rootObject = 84D017481527431F0008A4E0 /* Project object */; +} diff --git a/xdl/third_party/tbb/examples/parallel_for/polygon_overlay/xcode/polygon_overlay.xcodeproj/xcshareddata/xcschemes/tbbExample.ios.xcscheme b/xdl/third_party/tbb/examples/parallel_for/polygon_overlay/xcode/polygon_overlay.xcodeproj/xcshareddata/xcschemes/tbbExample.ios.xcscheme new file mode 100644 index 00000000..5516b613 --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/polygon_overlay/xcode/polygon_overlay.xcodeproj/xcshareddata/xcschemes/tbbExample.ios.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/xdl/third_party/tbb/examples/parallel_for/polygon_overlay/xcode/polygon_overlay.xcodeproj/xcshareddata/xcschemes/tbbExample.xcscheme b/xdl/third_party/tbb/examples/parallel_for/polygon_overlay/xcode/polygon_overlay.xcodeproj/xcshareddata/xcschemes/tbbExample.xcscheme new file mode 100644 index 00000000..5c1312f4 --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/polygon_overlay/xcode/polygon_overlay.xcodeproj/xcshareddata/xcschemes/tbbExample.xcscheme @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/xdl/third_party/tbb/examples/parallel_for/seismic/Makefile b/xdl/third_party/tbb/examples/parallel_for/seismic/Makefile new file mode 100644 index 00000000..9c839df6 --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/seismic/Makefile @@ -0,0 +1,97 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +# GNU Makefile that builds and runs example. +NAME=seismic +ARGS=auto 0 +PERF_RUN_ARGS=auto 10000 silent +LIGHT_ARGS=1:2 100 + +# The C++ compiler +ifneq (,$(shell which icc 2>/dev/null)) +CXX=icc +endif # icc + +TBBLIB = -ltbb +TBBLIB_DEBUG = -ltbb_debug + +ifeq ($(offload), mic) +override CXXFLAGS += -D__TBB_MIC_OFFLOAD=1 -offload-attribute-target=mic +# Replace -ltbb with -tbb in the offload mode +TBBLIB = -tbb +TBBLIB_DEBUG += -offload-option,mic,ld,"-ltbb_debug" +# Currently only console mode is supported in offload version +override UI=con +else +PERFFLAGS=-msse2 +endif + +SOURCES = ../../common/gui/$(UI)video.cpp universe.cpp seismic_video.cpp main.cpp + +include ../../common/gui/Makefile.gmake +override CXXFLAGS += $(UI_CXXFLAGS) + +ifeq ($(shell uname), Linux) +LIBS+= -lrt +else ifeq ($(shell uname), Darwin) +override CXXFLAGS += -Wl,-rpath,$(TBBROOT)/lib +endif + +all: release test + +resources: +ifeq ($(UI),mac) + mkdir -p $(APPRES)/en.lproj $(NAME).app/Contents/MacOS + cp ../../common/gui/xcode/tbbExample/tbbExample-Info.plist $(NAME).app/Contents/Info.plist + cp ../../common/gui/xcode/tbbExample/PkgInfo $(NAME).app/Contents + cp ../../common/gui/xcode/tbbExample/en.lproj/* $(APPRES)/en.lproj +endif # macOS* + +release: resources +ifeq ($(UI),mac) + $(CXX_UI) -O2 -DNDEBUG $(CXXFLAGS) -c $(MACUISOURCES) +endif # macOS + $(CXX) -O2 -DNDEBUG $(CXXFLAGS) -o $(EXE) $(SOURCES) $(MACUIOBJS) $(TBBLIB) $(LIBS) + +debug: resources +ifeq ($(UI),mac) + $(CXX_UI) -g -O0 -DTBB_USE_DEBUG $(CXXFLAGS) -c $(MACUISOURCES) +endif # macOS + $(CXX) -g -O0 -DTBB_USE_DEBUG $(CXXFLAGS) -o $(EXE) $(SOURCES) $(MACUIOBJS) $(TBBLIB_DEBUG) $(LIBS) + +clean: + $(RM) $(EXE) *.o *.d +ifeq ($(UI),mac) + rm -rf $(NAME).app +endif + +test: +ifeq ($(UI),mac) + export DYLD_LIBRARY_PATH="$(DYLD_LIBRARY_PATH):$(TBBLIBSPATH)"; $(run_cmd) ./$(EXE) $(ARGS) +else + $(run_cmd) ./$(EXE) $(ARGS) +endif + +perf_build: override CXXFLAGS+=$(PERFFLAGS) +perf_build: release + +perf_run: + $(run_cmd) ./$(EXE) $(PERF_RUN_ARGS) + +light_test: + $(run_cmd) ./$(EXE) $(LIGHT_ARGS) diff --git a/xdl/third_party/tbb/examples/parallel_for/seismic/Makefile.windows b/xdl/third_party/tbb/examples/parallel_for/seismic/Makefile.windows new file mode 100644 index 00000000..5ebaac47 --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/seismic/Makefile.windows @@ -0,0 +1,67 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +# Common Makefile that builds and runs example. + +# Just specify your program basename +PROG=Seismic +ARGS=auto 0 +PERF_RUN_ARGS=auto 10000 silent +LIGHT_ARGS=1:2 100 + +# Trying to find if icl.exe is set +CXX1 = $(TBB_CXX)- +CXX2 = $(CXX1:icl.exe-=icl.exe) +CXX = $(CXX2:-=cl.exe) + +# Uncomment one of next lines to choose user interface type (console, gdiplus, direct draw) +#UI = con +UI = gdi +#UI = dd + +# Machine architecture, auto-detected from TBB_TARGET_ARCH by default +# Use XARCH variable to change it. See index.html for more information +ARCH0 = $(TBB_TARGET_ARCH)- +ARCH1 = $(ARCH0:ia32-=x86) +ARCH2 = $(ARCH1:intel64-=AMD64) +XARCH = $(ARCH2:-=x86) + +MAKEINC = ../../common/gui/Makefile.win +SOURCES = seismic_video.cpp universe.cpp main.cpp + +all: release test +release: compiler_check + @$(MAKE) -f $(MAKEINC) UI=$(UI) CXX="$(CXX)" CXXFLAGS="$(CXXFLAGS)" LFLAGS="$(LDFLAGS) tbb.lib $(LIBS)" XARCH=$(XARCH) RCNAME=SeismicSimulation SOURCE="$(SOURCES)" EXE=$(PROG).exe build_one +debug: compiler_check + @$(MAKE) -f $(MAKEINC) UI=$(UI) DEBUG=_debug CXX="$(CXX)" CXXFLAGS="$(CXXFLAGS) /D TBB_USE_DEBUG" LFLAGS="$(LDFLAGS) tbb_debug.lib $(LIBS)" XARCH=$(XARCH) RCNAME=SeismicSimulation SOURCE="$(SOURCES)" EXE=$(PROG).exe build_one +clean: + @cmd.exe /C del $(PROG).exe *.obj *.?db *.manifest msvs\SeismicSimulation.res >nul 2>&1 +test: + $(PROG) $(ARGS) + +perf_build: compiler_check + @$(MAKE) -f $(MAKEINC) UI=con CXX="$(CXX)" CXXFLAGS="$(CXXFLAGS)" LFLAGS="$(LDFLAGS) tbb.lib $(LIBS)" XARCH=$(XARCH) RCNAME=SeismicSimulation SOURCE="$(SOURCES) " EXE=$(PROG).exe build_one +perf_run: + $(PROG) $(PERF_RUN_ARGS) + +light_test: + $(PROG) $(LIGHT_ARGS) + +compiler_check: + @echo compiler_test>compiler_test && @$(CXX) /E compiler_test >nul 2>&1 || echo "$(CXX) command not found. Check if CXX=$(CXX) is set properly" + @cmd.exe /C del compiler_test diff --git a/xdl/third_party/tbb/examples/parallel_for/seismic/main.cpp b/xdl/third_party/tbb/examples/parallel_for/seismic/main.cpp new file mode 100644 index 00000000..3905c278 --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/seismic/main.cpp @@ -0,0 +1,151 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +#define VIDEO_WINMAIN_ARGS + +#include +#include "tbb/tick_count.h" +#include "../../common/utility/utility.h" + +#include "seismic_video.h" +#include "universe.h" +#include "tbb/task_scheduler_init.h" + +Universe u; + +struct RunOptions { + //! It is used for console mode for test with different number of threads and also has + //! meaning for GUI: threads.first - use separate event/updating loop thread (>0) or not (0). + //! threads.second - initialization value for scheduler + utility::thread_number_range threads; + int numberOfFrames; + bool silent; + bool parallel; + RunOptions(utility::thread_number_range threads_ , int number_of_frames_ , bool silent_ , bool parallel_ ) + : threads(threads_),numberOfFrames(number_of_frames_), silent(silent_), parallel(parallel_) + { + } +}; + +int do_get_default_num_threads() { + int threads; +#if __TBB_MIC_OFFLOAD + #pragma offload target(mic) out(threads) +#endif // __TBB_MIC_OFFLOAD + threads = tbb::task_scheduler_init::default_num_threads(); + return threads; +} + +int get_default_num_threads() { + static int threads = do_get_default_num_threads(); + return threads; +} + +RunOptions ParseCommandLine(int argc, char *argv[]){ + // zero number of threads means to run serial version + utility::thread_number_range threads(get_default_num_threads,0,get_default_num_threads()); + + int numberOfFrames = 0; + bool silent = false; + bool serial = false; + + utility::parse_cli_arguments(argc,argv, + utility::cli_argument_pack() + //"-h" option for displaying help is present implicitly + .positional_arg(threads,"n-of-threads",utility::thread_number_range_desc) + .positional_arg(numberOfFrames,"n-of-frames","number of frames the example processes internally (0 means unlimited)") + .arg(silent,"silent","no output except elapsed time") + .arg(serial,"serial","in GUI mode start with serial version of algorithm") + ); + return RunOptions(threads,numberOfFrames,silent,!serial); +} + +int main(int argc, char *argv[]) +{ + try{ + tbb::tick_count mainStartTime = tbb::tick_count::now(); + RunOptions options = ParseCommandLine(argc,argv); + SeismicVideo video(u,options.numberOfFrames,options.threads.last,options.parallel); + + // video layer init + if(video.init_window(u.UniverseWidth, u.UniverseHeight)) { + video.calc_fps = true; + video.threaded = options.threads.first > 0; + // video is ok, init Universe + u.InitializeUniverse(video); + // main loop + video.main_loop(); + } + else if(video.init_console()) { + // do console mode + if (options.numberOfFrames == 0) { + options.numberOfFrames = 1000; + std::cout << "Substituting 1000 for unlimited frames because not running interactively\n"; + } + for(int p = options.threads.first; p <= options.threads.last; p = options.threads.step(p)) { + tbb::tick_count xwayParallelismStartTime = tbb::tick_count::now(); + u.InitializeUniverse(video); + int numberOfFrames = options.numberOfFrames; +#if __TBB_MIC_OFFLOAD + drawing_memory dmem = video.get_drawing_memory(); + char *pMem = dmem.get_address(); + size_t memSize = dmem.get_size(); + + #pragma offload target(mic) in(u, numberOfFrames, p, dmem), out(pMem:length(memSize)) + { + // It is necessary to update the pointer on mic + // since the address spaces on host and on target are different + dmem.set_address(pMem); + u.SetDrawingMemory(dmem); +#endif // __TBB_MIC_OFFLOAD + if (p==0) { + //run a serial version + for( int i=0; i + + + + DDDebug + Win32 + + + DDDebug + x64 + + + DDRelease + Win32 + + + DDRelease + x64 + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + SeismicSimulation + {3AA40693-F93D-4D4B-B32E-068F511A2527} + SeismicSimulation + Win32Proj + + + + + Application + MultiByte + true + v120 + + + Application + MultiByte + true + v120 + + + Application + MultiByte + true + v120 + + + Application + MultiByte + true + v120 + + + Application + MultiByte + true + v120 + + + Application + MultiByte + true + v120 + + + Application + MultiByte + true + v120 + + + Application + MultiByte + true + v120 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.40219.1 + $(TEMP)\tbb_examples\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Configuration)\ + false + $(TEMP)\tbb_examples\$(Platform)\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Platform)\$(Configuration)\ + false + $(TEMP)\tbb_examples\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Configuration)\ + false + $(TEMP)\tbb_examples\$(Platform)\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Platform)\$(Configuration)\ + false + $(TEMP)\tbb_examples\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Configuration)\ + false + $(TEMP)\tbb_examples\$(Platform)\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Platform)\$(Configuration)\ + false + $(TEMP)\tbb_examples\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Configuration)\ + false + $(TEMP)\tbb_examples\$(Platform)\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Platform)\$(Configuration)\ + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + true + true + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_WINDOWS;TBB_USE_DEBUG;%(PreprocessorDefinitions) + MultiThreadedDebugDLL + true + + + ProgramDatabase + + + tbb_debug.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc12;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc12;%(AdditionalLibraryDirectories) + true + Windows + MachineX86 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 debug "$(OutDir)" + + + + + X64 + + + Disabled + true + true + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + WIN64;_DEBUG;_WINDOWS;TBB_USE_DEBUG;%(PreprocessorDefinitions) + MultiThreadedDebugDLL + true + + + ProgramDatabase + + + tbb_debug.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc12;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc12;%(AdditionalLibraryDirectories) + true + Windows + MachineX64 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 debug "$(OutDir)" + + + + + MaxSpeed + Speed + true + true + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + ProgramDatabase + + + tbb.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc12;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc12;%(AdditionalLibraryDirectories) + true + Windows + true + true + MachineX86 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 release "$(OutDir)" + + + + + X64 + + + MaxSpeed + Speed + true + true + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + WIN64;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + ProgramDatabase + + + tbb.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc12;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc12;%(AdditionalLibraryDirectories) + true + Windows + true + true + MachineX64 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 release "$(OutDir)" + + + + + ..\..\..\common\gui\dxcheck.bat + + + MaxSpeed + Speed + true + true + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;$(DXSDK_DIR)\include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + ProgramDatabase + + + tbb.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc12;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc12;$(DXSDK_DIR)\lib\x86;%(AdditionalLibraryDirectories) + true + Windows + true + true + MachineX86 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 release "$(OutDir)" + + + + + ..\..\..\common\gui\dxcheck.bat + + + X64 + + + MaxSpeed + Speed + true + true + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;$(DXSDK_DIR)\include;%(AdditionalIncludeDirectories) + WIN64;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + ProgramDatabase + + + tbb.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc12;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc12;$(DXSDK_DIR)\lib\x64;%(AdditionalLibraryDirectories) + true + Windows + true + true + MachineX64 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 release "$(OutDir)" + + + + + ..\..\..\common\gui\dxcheck.bat + + + Disabled + true + true + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;$(DXSDK_DIR)\include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_WINDOWS;TBB_USE_DEBUG;%(PreprocessorDefinitions) + MultiThreadedDebugDLL + true + + + ProgramDatabase + + + tbb_debug.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc12;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc12;$(DXSDK_DIR)\lib\x86;%(AdditionalLibraryDirectories) + true + Windows + MachineX86 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 debug "$(OutDir)" + + + + + ..\..\..\common\gui\dxcheck.bat + + + X64 + + + Disabled + true + true + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;$(DXSDK_DIR)\include;%(AdditionalIncludeDirectories) + WIN64;_DEBUG;_WINDOWS;TBB_USE_DEBUG;%(PreprocessorDefinitions) + MultiThreadedDebugDLL + true + + + ProgramDatabase + + + tbb_debug.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc12;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc12;$(DXSDK_DIR)\lib\x64;%(AdditionalLibraryDirectories) + true + Windows + MachineX64 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 debug "$(OutDir)" + + + + + + + + true + true + true + true + + + true + true + true + true + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/xdl/third_party/tbb/examples/parallel_for/seismic/msvs/resource.h b/xdl/third_party/tbb/examples/parallel_for/seismic/msvs/resource.h new file mode 100644 index 00000000..c984e28e --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/seismic/msvs/resource.h @@ -0,0 +1,52 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by SeismicSimulation.rc +// +#define IDC_MYICON 2 +#define IDD_SEISMICSIMULATION_DIALOG 102 +#define IDS_APP_TITLE 103 +#define IDD_ABOUTBOX 103 +#define IDM_ABOUT 104 +#define IDM_EXIT 105 +#define IDI_SEISMICSIMULATION 107 +#define IDI_SMALL 108 +#define IDC_SEISMICSIMULATION 109 +#define IDR_MAINFRAME 128 +#define ID_FILE_PARALLEL 32771 +#define ID_FILE_SERIAL 32772 +#define IDM_PARALLEL 32773 +#define ID_FILE_ENABLEGUI 32774 +#define ID_FILE_DISABLEGUI 32775 +#define IDC_STATIC -1 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NO_MFC 1 +#define _APS_NEXT_RESOURCE_VALUE 129 +#define _APS_NEXT_COMMAND_VALUE 32782 +#define _APS_NEXT_CONTROL_VALUE 1000 +#define _APS_NEXT_SYMED_VALUE 110 +#endif +#endif diff --git a/xdl/third_party/tbb/examples/parallel_for/seismic/msvs/seismic.sln b/xdl/third_party/tbb/examples/parallel_for/seismic/msvs/seismic.sln new file mode 100644 index 00000000..d131e35b --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/seismic/msvs/seismic.sln @@ -0,0 +1,40 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.40629.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SeismicSimulation", "SeismicSimulation.vcxproj", "{3AA40693-F93D-4D4B-B32E-068F511A2527}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + _GDIRelease|Win32 = _GDIRelease|Win32 + _GDIRelease|x64 = _GDIRelease|x64 + DDDebug|Win32 = DDDebug|Win32 + DDDebug|x64 = DDDebug|x64 + DDRelease|Win32 = DDRelease|Win32 + DDRelease|x64 = DDRelease|x64 + GDIDebug|Win32 = GDIDebug|Win32 + GDIDebug|x64 = GDIDebug|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {3AA40693-F93D-4D4B-B32E-068F511A2527}._GDIRelease|Win32.ActiveCfg = Release|Win32 + {3AA40693-F93D-4D4B-B32E-068F511A2527}._GDIRelease|Win32.Build.0 = Release|Win32 + {3AA40693-F93D-4D4B-B32E-068F511A2527}._GDIRelease|x64.ActiveCfg = Release|x64 + {3AA40693-F93D-4D4B-B32E-068F511A2527}._GDIRelease|x64.Build.0 = Release|x64 + {3AA40693-F93D-4D4B-B32E-068F511A2527}.DDDebug|Win32.ActiveCfg = DDDebug|Win32 + {3AA40693-F93D-4D4B-B32E-068F511A2527}.DDDebug|Win32.Build.0 = DDDebug|Win32 + {3AA40693-F93D-4D4B-B32E-068F511A2527}.DDDebug|x64.ActiveCfg = DDDebug|x64 + {3AA40693-F93D-4D4B-B32E-068F511A2527}.DDDebug|x64.Build.0 = DDDebug|x64 + {3AA40693-F93D-4D4B-B32E-068F511A2527}.DDRelease|Win32.ActiveCfg = DDRelease|Win32 + {3AA40693-F93D-4D4B-B32E-068F511A2527}.DDRelease|Win32.Build.0 = DDRelease|Win32 + {3AA40693-F93D-4D4B-B32E-068F511A2527}.DDRelease|x64.ActiveCfg = DDRelease|x64 + {3AA40693-F93D-4D4B-B32E-068F511A2527}.DDRelease|x64.Build.0 = DDRelease|x64 + {3AA40693-F93D-4D4B-B32E-068F511A2527}.GDIDebug|Win32.ActiveCfg = Debug|Win32 + {3AA40693-F93D-4D4B-B32E-068F511A2527}.GDIDebug|Win32.Build.0 = Debug|Win32 + {3AA40693-F93D-4D4B-B32E-068F511A2527}.GDIDebug|x64.ActiveCfg = Debug|x64 + {3AA40693-F93D-4D4B-B32E-068F511A2527}.GDIDebug|x64.Build.0 = Debug|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/xdl/third_party/tbb/examples/parallel_for/seismic/msvs/small.ico b/xdl/third_party/tbb/examples/parallel_for/seismic/msvs/small.ico new file mode 100644 index 00000000..d551aa3a Binary files /dev/null and b/xdl/third_party/tbb/examples/parallel_for/seismic/msvs/small.ico differ diff --git a/xdl/third_party/tbb/examples/parallel_for/seismic/readme.html b/xdl/third_party/tbb/examples/parallel_for/seismic/readme.html new file mode 100644 index 00000000..b7a660fe --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/seismic/readme.html @@ -0,0 +1,471 @@ + + + + + + Intel® Threading Building Blocks. Seismic sample + + + + + +

    + Parallel seismic wave simulation that demonstrates use of parallel_for and affinity_partitioner. +

    + The example can be built in the offload version to run on Intel® Many Integrated Core (Intel® MIC) Architecture based coprocessor (see build instructions). +

    + Note: Currently, the offload version does not support GUI and can only be used with console mode. +

    + +
    +
    System Requirements
    + +
    +

    + For the most up to date system requirements, see the release notes. +

    +
    +
    + +
    +
    Files
    + +
    +
    +
    main.cpp +
    Main program which parses command line options and runs the algorithm with different numbers of threads. +
    universe.h +
    Wave propagation methods interface. +
    universe.cpp +
    Wave propagation methods implementation. +
    seismic_video.h +
    GUI mode support interface. +
    seismic_video.cpp +
    GUI mode support implementation. +
    Makefile +
    Makefile for building the example. +
    +
    +
    + +
    +
    Directories
    + +
    +
    +
    msvs +
    Contains Microsoft* Visual Studio* workspace for building and running the example (Windows* systems only). +
    xcode +
    Contains Xcode* IDE workspace for building and running the example (macOS* systems only). +
    +

    For information about the minimum supported version of IDE, see release notes.

    +
    +
    + +
    +
    Build instructions
    + +
    +

    General build directions can be found here.

    +

    The following additional options are supported:

    +
    +
    make [(general targets: {release, debug} [test])] UI={con, gdi, d2d, x, mac} +
    Build and run as usual, but build with the specified GUI driver: console, GDI+*, + Direct2D*, X11, or OpenGL* + (see the description of the common GUI code + for more information on available graphics support).
    + For Linux* and macOS* systems, the best available driver is detected automatically by the Makefile.
    + For Windows* systems, UI=gdi is the default GUI driver; compiling with UI=d2d may offer superior + performance, but can only be used if the Microsoft* DirectX* SDK is installed on your system + and if overlay is supported by your graphics card.
    + Use UI=con to build without the GUI for use in making performance measurements + (strongly recommended when measuring performance or scalability; see note below). +
    make [(above options or targets)] XARCH=x64 +
    Build and run as above, but also specify XARCH=x64 + (or XARCH=AMD64 for older compilers) when building the example on Windows* as a 64-bit binary. +
    make [(above options or targets)] DDLIB_DIR=<specify path to Direct Draw* SDK here> +
    If you experience ddraw.lib linking problems, specify the correct library directory via this option. +
    make [(above options or targets)] CXXFLAGS=-DX_FULLSYNC +
    Build and run as above, but enable full X11 synchronization if you experience "tearing" of motion on slower video systems. +
    +
    +
    + +
    +
    Usage
    + +
    +
    +
    seismic -h +
    Prints the help for command line options +
    seismic [n-of-threads=value] [n-of-frames=value] [silent] [serial] +
    seismic [n-of-threads [n-of-frames]] [silent] [serial] +
    n-of-threads is the number of threads to use; a range of the form low[:high], where low and optional high are non-negative integers or 'auto' for a platform-specific default number.
    + n-of-frames is a number of frames the example processes internally.
    + silent - no output except elapsed time.
    + serial - in GUI mode start with serial version of algorithm.
    +
    To run a short version of this example, e.g., for use with Intel® Parallel Inspector:: +
    Build a debug version of the example + (see the build instructions). +
    Run it with the desired number of threads and smaller number of frames, e.g., seismic 4 5. +
    +
    +
    + +
    +
    Hot keys
    + +
    +

    + The following hot keys can be used in interactive execution mode when the example is compiled with the graphical + user interface: +

    +
    +
    <left mouse button> +
    Starts new seismic wave in place specified by mouse cursor. +
    <space> +
    Toggles between parallel and serial execution modes. +
    <p> +
    Enables parallel execution mode. +
    <s> +
    Enables serial execution mode. +
    <e> +
    Enables screen updates. +
    <d> +
    Disables screen updates (strongly recommended when measuring performance or scalability; see note below). +
    <esc> +
    Stops execution. +
    +
    +
    + +
    +
    Notes
    + +
    +
      +
    • While running with the GUI display turned on should yield reasonable performance in most cases, running with the GUI + display turned off is strongly recommended in order to demonstrate the full performance and scalability of the example. +
    +
    +
    + +
    + Up to parent directory +
    +
    +
    Legal Information
    + +
    +

    + Intel and the Intel logo are trademarks of Intel Corporation in the U.S. and/or other countries. +
    * Other names and brands may be claimed as the property of others. +
    © 2018, Intel Corporation +

    +
    +
    + + + diff --git a/xdl/third_party/tbb/examples/parallel_for/seismic/seismic_video.cpp b/xdl/third_party/tbb/examples/parallel_for/seismic/seismic_video.cpp new file mode 100644 index 00000000..3c3abb0d --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/seismic/seismic_video.cpp @@ -0,0 +1,148 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +#include "seismic_video.h" +#include "universe.h" +#include "tbb/task_scheduler_init.h" + +const char * const SeismicVideo::titles[2] = {"Seismic Simulation: Serial", "Seismic Simulation: Parallel"}; +void SeismicVideo::on_mouse(int x, int y, int key) { + if(key == 1){ + u_.TryPutNewPulseSource(x,y); + } +} + +void SeismicVideo::on_key(int key) { + key &= 0xff; + if(char(key) == ' ') initIsParallel = !initIsParallel; + else if(char(key) == 'p') initIsParallel = true; + else if(char(key) == 's') initIsParallel = false; + else if(char(key) == 'e') updating = true; + else if(char(key) == 'd') updating = false; + else if(key == 27) running = false; + title = titles[initIsParallel?1:0]; +} + +void SeismicVideo::on_process() { + tbb::task_scheduler_init Init(threadsHigh); + for( int frames = 0; numberOfFrames_==0 || frameson_key('p'); + break; + case ID_FILE_SERIAL: + gVideo->on_key('s'); + break; + case ID_FILE_ENABLEGUI: + gVideo->on_key('e'); + break; + case ID_FILE_DISABLEGUI: + gVideo->on_key('d'); + break; + default: + return DefWindowProc(hWnd, message, wParam, lParam); + } + break; + default: + return DefWindowProc(hWnd, message, wParam, lParam); + } + return 0; +} + +#endif diff --git a/xdl/third_party/tbb/examples/parallel_for/seismic/seismic_video.h b/xdl/third_party/tbb/examples/parallel_for/seismic/seismic_video.h new file mode 100644 index 00000000..d9acaa84 --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/seismic/seismic_video.h @@ -0,0 +1,54 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +#ifndef SEISMIC_VIDEO_H_ +#define SEISMIC_VIDEO_H_ + +#include "../../common/gui/video.h" + +class Universe; + +class SeismicVideo : public video +{ +#ifdef _WINDOWS + #define MAX_LOADSTRING 100 + TCHAR szWindowClass[MAX_LOADSTRING]; // the main window class name + WNDCLASSEX wcex; +#endif + static const char * const titles[2]; + + bool initIsParallel ; + + Universe &u_; + int numberOfFrames_; // 0 means forever, positive means number of frames, negative is undefined + int threadsHigh; +private: + void on_mouse(int x, int y, int key); + void on_process(); + +#ifdef _WINDOWS +public: +#endif + void on_key(int key); + +public: + SeismicVideo( Universe &u,int numberOfFrames, int threadsHigh, bool initIsParallel=true); +}; +#endif /* SEISMIC_VIDEO_H_ */ diff --git a/xdl/third_party/tbb/examples/parallel_for/seismic/universe.cpp b/xdl/third_party/tbb/examples/parallel_for/seismic/universe.cpp new file mode 100644 index 00000000..eb9e6821 --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/seismic/universe.cpp @@ -0,0 +1,221 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +#include "../../common/gui/video.h" +#include +#include "tbb/blocked_range.h" +#include "tbb/parallel_for.h" + + +using namespace std; + +#ifdef _MSC_VER +// warning C4068: unknown pragma +#pragma warning(disable: 4068) +// warning C4351: new behavior: elements of array 'array' will be default initialized +#pragma warning(disable: 4351) +#endif + +#include "universe.h" + +const colorcomp_t MaterialColor[4][3] = { // BGR + {96,0,0}, // WATER + {0,48,48}, // SANDSTONE + {32,32,23} // SHALE +}; + +void Universe::InitializeUniverse(video const& colorizer) { + + pulseCounter = pulseTime = 100; + pulseX = UniverseWidth/3; + pulseY = UniverseHeight/4; + // Initialize V, S, and T to slightly non-zero values, in order to avoid denormal waves. + for( int i=0; i0 ? t : 0; + ValueType b = t<0 ? -t : 0; + ValueType g = 0.5f*fabs(t); + memcpy(c, MaterialColor[k], sizeof(c)); + c[2] = colorcomp_t(r*(255-c[2])+c[2]); + c[1] = colorcomp_t(g*(255-c[1])+c[1]); + c[0] = colorcomp_t(b*(255-c[0])+c[0]); + ColorMap[k][i] = colorizer.get_color(c[2], c[1], c[0]); + } + } + // Set damping coefficients around border to reduce reflections from boundaries. + ValueType d = 1.0; + for( int k=DamperSize-1; k>0; --k ) { + d *= 1-1.0f/(DamperSize*DamperSize); + for( int j=1; j0 ) { + ValueType t = (pulseCounter-pulseTime/2)*0.05f; + V[pulseY][pulseX] += 64*sqrt(M[pulseY][pulseX])*exp(-t*t); + --pulseCounter; + } +} + +struct Universe::Rectangle { + struct std::pair xRange; + struct std::pair yRange; + Rectangle (int startX, int startY, int width, int height):xRange(startX,width),yRange(startY,height){} + int StartX() const {return xRange.first;} + int StartY() const {return yRange.first;} + int Width() const {return xRange.second;} + int Height() const {return yRange.second;} + int EndX() const {return xRange.first + xRange.second;} + int EndY() const {return yRange.first + yRange.second;} + +}; + +void Universe::UpdateStress(Rectangle const& r ) { + drawing_area drawing(r.StartX(),r.StartY(),r.Width(),r.Height(),drawingMemory); + for( int i=r.StartY(); i=ColorMapSize ) index = ColorMapSize-1; + color_t* c = ColorMap[material[i][j]]; + drawing.put_pixel(c[index]); + } + } +} + +void Universe::SerialUpdateStress() { + Rectangle area(0, 0, UniverseWidth-1, UniverseHeight-1); + UpdateStress(area); +} + +struct UpdateStressBody { + Universe & u_; + UpdateStressBody(Universe & u):u_(u){} + void operator()( const tbb::blocked_range& range ) const { + Universe::Rectangle area(0, range.begin(), u_.UniverseWidth-1, range.size()); + u_.UpdateStress(area); + } +}; + +void Universe::ParallelUpdateStress(tbb::affinity_partitioner &affinity) { + tbb::parallel_for( tbb::blocked_range( 0, UniverseHeight-1 ), // Index space for loop + UpdateStressBody(*this), // Body of loop + affinity ); // Affinity hint +} + +void Universe::UpdateVelocity(Rectangle const& r) { + for( int i=r.StartY(); i& y_range ) const { + u_.UpdateVelocity(Universe::Rectangle(1,y_range.begin(),u_.UniverseWidth-1,y_range.size())); + } +}; + +void Universe::ParallelUpdateVelocity(tbb::affinity_partitioner &affinity) { + tbb::parallel_for( tbb::blocked_range( 1, UniverseHeight ), // Index space for loop + UpdateVelocityBody(*this), // Body of loop + affinity ); // Affinity hint +} + +void Universe::SerialUpdateUniverse() { + UpdatePulse(); + SerialUpdateStress(); + SerialUpdateVelocity(); +} + +void Universe::ParallelUpdateUniverse() { + /** Affinity is an argument to parallel_for to hint that an iteration of a loop + is best replayed on the same processor for each execution of the loop. + It is a static object because it must remember where the iterations happened + in previous executions. */ + static tbb::affinity_partitioner affinity; + UpdatePulse(); + ParallelUpdateStress(affinity); + ParallelUpdateVelocity(affinity); +} + +bool Universe::TryPutNewPulseSource(int x, int y){ + if(pulseCounter == 0) { + pulseCounter = pulseTime; + pulseX = x; pulseY = y; + return true; + } + return false; +} + +void Universe::SetDrawingMemory(const drawing_memory &dmem) { + drawingMemory = dmem; +} diff --git a/xdl/third_party/tbb/examples/parallel_for/seismic/universe.h b/xdl/third_party/tbb/examples/parallel_for/seismic/universe.h new file mode 100644 index 00000000..5ba6df0e --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/seismic/universe.h @@ -0,0 +1,118 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +#ifndef UNIVERSE_H_ +#define UNIVERSE_H_ + +#ifndef UNIVERSE_WIDTH +#define UNIVERSE_WIDTH 1024 +#endif +#ifndef UNIVERSE_HEIGHT +#define UNIVERSE_HEIGHT 512 +#endif + +#include "../../common/gui/video.h" +#include "tbb/partitioner.h" + +class Universe { +public: + enum { + UniverseWidth = UNIVERSE_WIDTH, + UniverseHeight = UNIVERSE_HEIGHT + }; +private: + //in order to avoid performance degradation due to cache aliasing issue + //some padding is needed after each row in array, and between array themselves. + //the padding is achieved by adjusting number of rows and columns. + //as the compiler is forced to place class members of the same clause in order of the + //declaration this seems to be the right way of padding. + + //magic constants added below are chosen experimentally for 1024x512. + enum { + MaxWidth = UniverseWidth+1, + MaxHeight = UniverseHeight+3 + }; + + typedef float ValueType; + + //! Horizontal stress + ValueType S[MaxHeight][MaxWidth]; + + //! Velocity at each grid point + ValueType V[MaxHeight][MaxWidth]; + + //! Vertical stress + ValueType T[MaxHeight][MaxWidth]; + + //! Coefficient related to modulus + ValueType M[MaxHeight][MaxWidth]; + + //! Damping coefficients + ValueType D[MaxHeight][MaxWidth]; + + //! Coefficient related to lightness + ValueType L[MaxHeight][MaxWidth]; + + enum { ColorMapSize = 1024}; + color_t ColorMap[4][ColorMapSize]; + + enum MaterialType { + WATER=0, + SANDSTONE=1, + SHALE=2 + }; + + //! Values are MaterialType, cast to an unsigned char to save space. + unsigned char material[MaxHeight][MaxWidth]; + +private: + enum { DamperSize = 32}; + + int pulseTime; + int pulseCounter; + int pulseX; + int pulseY; + + drawing_memory drawingMemory; + +public: + void InitializeUniverse(video const& colorizer); + + void SerialUpdateUniverse(); + void ParallelUpdateUniverse(); + bool TryPutNewPulseSource(int x, int y); + void SetDrawingMemory(const drawing_memory &dmem); +private: + struct Rectangle; + void UpdatePulse(); + void UpdateStress(Rectangle const& r ); + + void SerialUpdateStress() ; + friend struct UpdateStressBody; + friend struct UpdateVelocityBody; + void ParallelUpdateStress(tbb::affinity_partitioner &affinity); + + void UpdateVelocity(Rectangle const& r); + + void SerialUpdateVelocity() ; + void ParallelUpdateVelocity(tbb::affinity_partitioner &affinity); +}; + +#endif /* UNIVERSE_H_ */ diff --git a/xdl/third_party/tbb/examples/parallel_for/seismic/xcode/seismic.xcodeproj/project.pbxproj b/xdl/third_party/tbb/examples/parallel_for/seismic/xcode/seismic.xcodeproj/project.pbxproj new file mode 100644 index 00000000..da6ed451 --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/seismic/xcode/seismic.xcodeproj/project.pbxproj @@ -0,0 +1,586 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 84B8DA78152CA90100D59B95 /* OpenGLView.m in Sources */ = {isa = PBXBuildFile; fileRef = 84B8DA71152CA90100D59B95 /* OpenGLView.m */; }; + 84B8DA79152CA90100D59B95 /* tbbAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 84B8DA73152CA90100D59B95 /* tbbAppDelegate.m */; }; + 84B8DA7A152CA90100D59B95 /* (null) in Resources */ = {isa = PBXBuildFile; }; + 84B8DA80152CA97B00D59B95 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 84B8DA7C152CA97B00D59B95 /* InfoPlist.strings */; }; + 84B8DA81152CA97B00D59B95 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 84B8DA7E152CA97B00D59B95 /* MainMenu.xib */; }; + 84B8DA87152CA99C00D59B95 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84B8DA82152CA99C00D59B95 /* main.cpp */; }; + 84B8DA88152CA99C00D59B95 /* seismic_video.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84B8DA83152CA99C00D59B95 /* seismic_video.cpp */; }; + 84B8DA89152CA99C00D59B95 /* universe.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84B8DA85152CA99C00D59B95 /* universe.cpp */; }; + 84D017561527431F0008A4E0 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84D017551527431F0008A4E0 /* Cocoa.framework */; }; + 84D01776152744BD0008A4E0 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84D01775152744BD0008A4E0 /* OpenGL.framework */; }; + D3BD96921C0DD55E00163D8B /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84B8DA82152CA99C00D59B95 /* main.cpp */; }; + D3BD96931C0DD56900163D8B /* seismic_video.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84B8DA83152CA99C00D59B95 /* seismic_video.cpp */; }; + D3BD96941C0DD57600163D8B /* universe.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84B8DA85152CA99C00D59B95 /* universe.cpp */; }; + D3BD96951C0DD59200163D8B /* macvideo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84B8DA99152CADF400D59B95 /* macvideo.cpp */; }; + D3BD96961C0DD5A000163D8B /* OpenGLView.m in Sources */ = {isa = PBXBuildFile; fileRef = 84B8DA71152CA90100D59B95 /* OpenGLView.m */; }; + D3BD96971C0DD5A900163D8B /* tbbAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 84B8DA73152CA90100D59B95 /* tbbAppDelegate.m */; }; + D3BD96A31C0DE2BB00163D8B /* macvideo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84B8DA99152CADF400D59B95 /* macvideo.cpp */; }; + D3BD96A61C0DE3DE00163D8B /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = D3BD96A51C0DE3DE00163D8B /* main.m */; }; + D3BD96AB1C0E08E500163D8B /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = D3BD96A51C0DE3DE00163D8B /* main.m */; }; + D3BD96B31C0E0AFE00163D8B /* tbbExample-Info.ios.plist in Resources */ = {isa = PBXBuildFile; fileRef = D3BD966D1C0DD00400163D8B /* tbbExample-Info.ios.plist */; }; + D3BD96B51C0E0B2200163D8B /* tbbExample-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = D3BD96B41C0E0B2200163D8B /* tbbExample-Info.plist */; }; + D3BD96B81C0E11CE00163D8B /* iOS.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D3BD96B61C0E11C600163D8B /* iOS.storyboard */; }; +/* End PBXBuildFile section */ + +/* Begin PBXBuildRule section */ + C3C5896E2191923E00DAC94C /* PBXBuildRule */ = { + isa = PBXBuildRule; + compilerSpec = com.intel.compilers.icc.latest; + fileType = sourcecode.cpp; + isEditable = 1; + outputFiles = ( + ); + script = "# Type a script or drag a script file from your workspace to insert its path.\n"; + }; + C3C5896F2191925E00DAC94C /* PBXBuildRule */ = { + isa = PBXBuildRule; + compilerSpec = com.intel.compilers.icc.latest; + fileType = sourcecode.cpp; + isEditable = 1; + outputFiles = ( + ); + script = "# Type a script or drag a script file from your workspace to insert its path.\n"; + }; +/* End PBXBuildRule section */ + +/* Begin PBXFileReference section */ + 84B8DA70152CA90100D59B95 /* OpenGLView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OpenGLView.h; path = ../../../common/gui/xcode/tbbExample/OpenGLView.h; sourceTree = ""; }; + 84B8DA71152CA90100D59B95 /* OpenGLView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = OpenGLView.m; path = ../../../common/gui/xcode/tbbExample/OpenGLView.m; sourceTree = ""; }; + 84B8DA72152CA90100D59B95 /* tbbAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = tbbAppDelegate.h; path = ../../../common/gui/xcode/tbbExample/tbbAppDelegate.h; sourceTree = ""; }; + 84B8DA73152CA90100D59B95 /* tbbAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = tbbAppDelegate.m; path = ../../../common/gui/xcode/tbbExample/tbbAppDelegate.m; sourceTree = ""; }; + 84B8DA75152CA90100D59B95 /* tbbExample-Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "tbbExample-Prefix.pch"; path = "../../../common/gui/xcode/tbbExample/tbbExample-Prefix.pch"; sourceTree = ""; }; + 84B8DA7D152CA97B00D59B95 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = InfoPlist.strings; sourceTree = ""; }; + 84B8DA7F152CA97B00D59B95 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = MainMenu.xib; sourceTree = ""; }; + 84B8DA82152CA99C00D59B95 /* main.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = main.cpp; path = ../main.cpp; sourceTree = ""; }; + 84B8DA83152CA99C00D59B95 /* seismic_video.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = seismic_video.cpp; path = ../seismic_video.cpp; sourceTree = ""; }; + 84B8DA84152CA99C00D59B95 /* seismic_video.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = seismic_video.h; path = ../seismic_video.h; sourceTree = ""; }; + 84B8DA85152CA99C00D59B95 /* universe.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = universe.cpp; path = ../universe.cpp; sourceTree = ""; }; + 84B8DA86152CA99C00D59B95 /* universe.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = universe.h; path = ../universe.h; sourceTree = ""; }; + 84B8DA99152CADF400D59B95 /* macvideo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = macvideo.cpp; path = ../../../common/gui/macvideo.cpp; sourceTree = ""; }; + 84D017511527431F0008A4E0 /* tbbExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = tbbExample.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 84D017551527431F0008A4E0 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; + 84D017581527431F0008A4E0 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; + 84D017591527431F0008A4E0 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; }; + 84D0175A1527431F0008A4E0 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + 84D01775152744BD0008A4E0 /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; }; + D3BD966D1C0DD00400163D8B /* tbbExample-Info.ios.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "tbbExample-Info.ios.plist"; path = "../../../common/gui/xcode/tbbExample/tbbExample-Info.ios.plist"; sourceTree = ""; }; + D3BD96A51C0DE3DE00163D8B /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = ../../../common/gui/xcode/tbbExample/main.m; sourceTree = ""; }; + D3BD96B41C0E0B2200163D8B /* tbbExample-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = "tbbExample-Info.plist"; path = "../../../common/gui/xcode/tbbExample/tbbExample-Info.plist"; sourceTree = ""; }; + D3BD96B61C0E11C600163D8B /* iOS.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = iOS.storyboard; path = ../iOS.storyboard; sourceTree = ""; }; + D3BD96BB1C0E19E700163D8B /* tbbExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = tbbExample.app; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 84D0174E1527431F0008A4E0 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 84D01776152744BD0008A4E0 /* OpenGL.framework in Frameworks */, + 84D017561527431F0008A4E0 /* Cocoa.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + D3BD96571C0DD00400163D8B /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 84B8DA6C152CA8D900D59B95 /* tbbExample Sources */ = { + isa = PBXGroup; + children = ( + 84B8DA7B152CA97B00D59B95 /* Resources */, + 84B8DA82152CA99C00D59B95 /* main.cpp */, + D3BD96A51C0DE3DE00163D8B /* main.m */, + 84B8DA83152CA99C00D59B95 /* seismic_video.cpp */, + 84B8DA84152CA99C00D59B95 /* seismic_video.h */, + 84B8DA85152CA99C00D59B95 /* universe.cpp */, + 84B8DA86152CA99C00D59B95 /* universe.h */, + ); + name = "tbbExample Sources"; + sourceTree = ""; + }; + 84B8DA7B152CA97B00D59B95 /* Resources */ = { + isa = PBXGroup; + children = ( + D3BD96B61C0E11C600163D8B /* iOS.storyboard */, + 84B8DA7C152CA97B00D59B95 /* InfoPlist.strings */, + 84B8DA7E152CA97B00D59B95 /* MainMenu.xib */, + ); + name = Resources; + path = ../../../common/gui/xcode/tbbExample/en.lproj; + sourceTree = ""; + }; + 84B8DA98152CAD8600D59B95 /* Gui layer */ = { + isa = PBXGroup; + children = ( + 84B8DA99152CADF400D59B95 /* macvideo.cpp */, + 84B8DA70152CA90100D59B95 /* OpenGLView.h */, + 84B8DA71152CA90100D59B95 /* OpenGLView.m */, + 84B8DA72152CA90100D59B95 /* tbbAppDelegate.h */, + 84B8DA73152CA90100D59B95 /* tbbAppDelegate.m */, + 84B8DA75152CA90100D59B95 /* tbbExample-Prefix.pch */, + ); + name = "Gui layer"; + sourceTree = ""; + }; + 84D017461527431F0008A4E0 = { + isa = PBXGroup; + children = ( + D3BD96B41C0E0B2200163D8B /* tbbExample-Info.plist */, + D3BD966D1C0DD00400163D8B /* tbbExample-Info.ios.plist */, + 84B8DA98152CAD8600D59B95 /* Gui layer */, + 84B8DA6C152CA8D900D59B95 /* tbbExample Sources */, + 84D017541527431F0008A4E0 /* Frameworks */, + 84D017521527431F0008A4E0 /* Products */, + ); + sourceTree = ""; + }; + 84D017521527431F0008A4E0 /* Products */ = { + isa = PBXGroup; + children = ( + 84D017511527431F0008A4E0 /* tbbExample.app */, + D3BD96BB1C0E19E700163D8B /* tbbExample.app */, + ); + name = Products; + sourceTree = ""; + }; + 84D017541527431F0008A4E0 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 84D017591527431F0008A4E0 /* CoreData.framework */, + 84D0175A1527431F0008A4E0 /* Foundation.framework */, + 84D017581527431F0008A4E0 /* AppKit.framework */, + 84D01775152744BD0008A4E0 /* OpenGL.framework */, + 84D017551527431F0008A4E0 /* Cocoa.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 84D017501527431F0008A4E0 /* tbbExample */ = { + isa = PBXNativeTarget; + buildConfigurationList = 84D01772152743200008A4E0 /* Build configuration list for PBXNativeTarget "tbbExample" */; + buildPhases = ( + 84D0174D1527431F0008A4E0 /* Sources */, + 84D0174E1527431F0008A4E0 /* Frameworks */, + 84D0174F1527431F0008A4E0 /* Resources */, + ); + buildRules = ( + C3C5896E2191923E00DAC94C /* PBXBuildRule */, + ); + dependencies = ( + ); + name = tbbExample; + productName = tbbExample; + productReference = 84D017511527431F0008A4E0 /* tbbExample.app */; + productType = "com.apple.product-type.application"; + }; + D3BD96591C0DD00400163D8B /* tbbExample_ios */ = { + isa = PBXNativeTarget; + buildConfigurationList = D3BD96841C0DD00500163D8B /* Build configuration list for PBXNativeTarget "tbbExample_ios" */; + buildPhases = ( + D3BD96561C0DD00400163D8B /* Sources */, + D3BD96571C0DD00400163D8B /* Frameworks */, + D3BD96581C0DD00400163D8B /* Resources */, + ); + buildRules = ( + C3C5896F2191925E00DAC94C /* PBXBuildRule */, + ); + dependencies = ( + ); + name = tbbExample_ios; + productName = tbbExample_ios; + productReference = D3BD96BB1C0E19E700163D8B /* tbbExample.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 84D017481527431F0008A4E0 /* Project object */ = { + isa = PBXProject; + attributes = { + CLASSPREFIX = tbb; + LastUpgradeCheck = 0710; + TargetAttributes = { + D3BD96591C0DD00400163D8B = { + CreatedOnToolsVersion = 7.1.1; + DevelopmentTeam = 7J8M3RM94C; + }; + }; + }; + buildConfigurationList = 84D0174B1527431F0008A4E0 /* Build configuration list for PBXProject "seismic" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 84D017461527431F0008A4E0; + productRefGroup = 84D017521527431F0008A4E0 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 84D017501527431F0008A4E0 /* tbbExample */, + D3BD96591C0DD00400163D8B /* tbbExample_ios */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 84D0174F1527431F0008A4E0 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + D3BD96B51C0E0B2200163D8B /* tbbExample-Info.plist in Resources */, + 84B8DA7A152CA90100D59B95 /* (null) in Resources */, + 84B8DA80152CA97B00D59B95 /* InfoPlist.strings in Resources */, + 84B8DA81152CA97B00D59B95 /* MainMenu.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + D3BD96581C0DD00400163D8B /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + D3BD96B81C0E11CE00163D8B /* iOS.storyboard in Resources */, + D3BD96B31C0E0AFE00163D8B /* tbbExample-Info.ios.plist in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 84D0174D1527431F0008A4E0 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 84B8DA78152CA90100D59B95 /* OpenGLView.m in Sources */, + 84B8DA79152CA90100D59B95 /* tbbAppDelegate.m in Sources */, + 84B8DA87152CA99C00D59B95 /* main.cpp in Sources */, + D3BD96A31C0DE2BB00163D8B /* macvideo.cpp in Sources */, + 84B8DA88152CA99C00D59B95 /* seismic_video.cpp in Sources */, + D3BD96A61C0DE3DE00163D8B /* main.m in Sources */, + 84B8DA89152CA99C00D59B95 /* universe.cpp in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + D3BD96561C0DD00400163D8B /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + D3BD96941C0DD57600163D8B /* universe.cpp in Sources */, + D3BD96921C0DD55E00163D8B /* main.cpp in Sources */, + D3BD96951C0DD59200163D8B /* macvideo.cpp in Sources */, + D3BD96931C0DD56900163D8B /* seismic_video.cpp in Sources */, + D3BD96971C0DD5A900163D8B /* tbbAppDelegate.m in Sources */, + D3BD96AB1C0E08E500163D8B /* main.m in Sources */, + D3BD96961C0DD5A000163D8B /* OpenGLView.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 84B8DA7C152CA97B00D59B95 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 84B8DA7D152CA97B00D59B95 /* en */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; + 84B8DA7E152CA97B00D59B95 /* MainMenu.xib */ = { + isa = PBXVariantGroup; + children = ( + 84B8DA7F152CA97B00D59B95 /* en */, + ); + name = MainMenu.xib; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 84D01770152743200008A4E0 /* Debug64 */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = c11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_INCREASE_PRECOMPILED_HEADER_SHARING = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_VERSION = ""; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(TBBROOT)/include", + /opt/intel/tbb/include, + ); + ICC_CXX_LANG_DIALECT = "c++11"; + ICC_TBB = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(TBBROOT)/lib /opt/intel/tbb/lib"; + LIBRARY_SEARCH_PATHS = ( + "$(TBBROOT)/lib", + /opt/intel/tbb/lib, + ); + MACOSX_DEPLOYMENT_TARGET = 10.11; + ONLY_ACTIVE_ARCH = YES; + OTHER_LDFLAGS = ( + "-m64", + "-ltbb_debug", + ); + SDKROOT = macosx; + VALID_ARCHS = x86_64; + }; + name = Debug64; + }; + 84D01771152743200008A4E0 /* Release64 */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = c11; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_INCREASE_PRECOMPILED_HEADER_SHARING = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_VERSION = ""; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(TBBROOT)/include", + /opt/intel/tbb/include, + ); + ICC_CXX_LANG_DIALECT = "c++11"; + ICC_TBB = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(TBBROOT)/lib /opt/intel/tbb/lib"; + LIBRARY_SEARCH_PATHS = ( + "$(TBBROOT)/lib", + /opt/intel/tbb/lib, + ); + MACOSX_DEPLOYMENT_TARGET = 10.11; + OTHER_LDFLAGS = ( + "-m64", + "-ltbb", + ); + SDKROOT = macosx; + VALID_ARCHS = x86_64; + }; + name = Release64; + }; + 84D01773152743200008A4E0 /* Debug64 */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = "$(ARCHS_STANDARD)"; + CLANG_ENABLE_OBJC_ARC = NO; + COMBINE_HIDPI_IMAGES = YES; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "../../../common/gui/xcode/tbbExample/tbbExample-Prefix.pch"; + HEADER_SEARCH_PATHS = "$(inherited)"; + INFOPLIST_FILE = "../../../common/gui/xcode/tbbExample/tbbExample-Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited)"; + LIBRARY_SEARCH_PATHS = "$(inherited)"; + MACOSX_DEPLOYMENT_TARGET = 10.11; + PRODUCT_BUNDLE_IDENTIFIER = "Intel.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + RUN_CLANG_STATIC_ANALYZER = YES; + USER_HEADER_SEARCH_PATHS = ""; + VERSION_INFO_BUILDER = "$(TARGET_NAME)"; + WRAPPER_EXTENSION = app; + }; + name = Debug64; + }; + 84D01774152743200008A4E0 /* Release64 */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = "$(ARCHS_STANDARD)"; + CLANG_ENABLE_OBJC_ARC = NO; + COMBINE_HIDPI_IMAGES = YES; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "../../../common/gui/xcode/tbbExample/tbbExample-Prefix.pch"; + HEADER_SEARCH_PATHS = "$(inherited)"; + INFOPLIST_FILE = "../../../common/gui/xcode/tbbExample/tbbExample-Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited)"; + LIBRARY_SEARCH_PATHS = "$(inherited)"; + MACOSX_DEPLOYMENT_TARGET = 10.11; + PRODUCT_BUNDLE_IDENTIFIER = "Intel.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + RUN_CLANG_STATIC_ANALYZER = YES; + USER_HEADER_SEARCH_PATHS = ""; + VERSION_INFO_BUILDER = "$(TARGET_NAME)"; + WRAPPER_EXTENSION = app; + }; + name = Release64; + }; + D3BD96851C0DD00500163D8B /* Debug64 */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + "__TBB_IOS=1", + ); + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + INFOPLIST_FILE = "../../../common/gui/xcode/tbbExample/tbbExample-Info.ios.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 9.1; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path"; + LIBRARY_SEARCH_PATHS = "\"$(SRCROOT)/../../../../lib/ios\""; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.tbb.example; + PRODUCT_NAME = tbbExample; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = 1; + }; + name = Debug64; + }; + D3BD96861C0DD00500163D8B /* Release64 */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREPROCESSOR_DEFINITIONS = "__TBB_IOS=1"; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + INFOPLIST_FILE = "../../../common/gui/xcode/tbbExample/tbbExample-Info.ios.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 9.1; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path"; + LIBRARY_SEARCH_PATHS = "\"$(SRCROOT)/../../../../lib/ios\""; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = com.tbb.example; + PRODUCT_NAME = tbbExample; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = 1; + VALIDATE_PRODUCT = YES; + }; + name = Release64; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 84D0174B1527431F0008A4E0 /* Build configuration list for PBXProject "seismic" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 84D01770152743200008A4E0 /* Debug64 */, + 84D01771152743200008A4E0 /* Release64 */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug64; + }; + 84D01772152743200008A4E0 /* Build configuration list for PBXNativeTarget "tbbExample" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 84D01773152743200008A4E0 /* Debug64 */, + 84D01774152743200008A4E0 /* Release64 */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug64; + }; + D3BD96841C0DD00500163D8B /* Build configuration list for PBXNativeTarget "tbbExample_ios" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + D3BD96851C0DD00500163D8B /* Debug64 */, + D3BD96861C0DD00500163D8B /* Release64 */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug64; + }; +/* End XCConfigurationList section */ + }; + rootObject = 84D017481527431F0008A4E0 /* Project object */; +} diff --git a/xdl/third_party/tbb/examples/parallel_for/seismic/xcode/seismic.xcodeproj/xcshareddata/xcschemes/tbbExample.ios.xcscheme b/xdl/third_party/tbb/examples/parallel_for/seismic/xcode/seismic.xcodeproj/xcshareddata/xcschemes/tbbExample.ios.xcscheme new file mode 100644 index 00000000..9975c8e3 --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/seismic/xcode/seismic.xcodeproj/xcshareddata/xcschemes/tbbExample.ios.xcscheme @@ -0,0 +1,119 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/xdl/third_party/tbb/examples/parallel_for/seismic/xcode/seismic.xcodeproj/xcshareddata/xcschemes/tbbExample.xcscheme b/xdl/third_party/tbb/examples/parallel_for/seismic/xcode/seismic.xcodeproj/xcshareddata/xcschemes/tbbExample.xcscheme new file mode 100644 index 00000000..21b8d648 --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/seismic/xcode/seismic.xcodeproj/xcshareddata/xcschemes/tbbExample.xcscheme @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/xdl/third_party/tbb/examples/parallel_for/tachyon/Makefile b/xdl/third_party/tbb/examples/parallel_for/tachyon/Makefile new file mode 100644 index 00000000..4e9d3a5e --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/tachyon/Makefile @@ -0,0 +1,184 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +# The original source for this example is +# Copyright (c) 1994-2008 John E. Stone +# 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. The name of the author may not be used to endorse or promote products +# derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. + +# GNU Makefile that builds and runs example. +NAME:=tachyon + +# The C++ compiler +ifneq (,$(shell which icc 2>/dev/null)) +CXX=icc +endif # icc + +# The default runtime arguments +export ARGS = dat/balls.dat +export PERF_RUN_ARGS = silent dat/balls3.dat +export LIGHT_ARGS= dat/model2.dat + +# define name suffix +SUFFIX = .$(VERSION) + +LIBS ?= -lm + +include ../../common/gui/Makefile.gmake + +ifeq ($(UI),x) +UI_CXXFLAGS += -DX_FULLSYNC +ifneq (,$(findstring -lXext,$(LIBS))) +UI_CXXFLAGS += -DX_NOSHMPIX +endif +endif # X + +MYCXXFLAGS = $(CXXFLAGS) $(UI_CXXFLAGS) + +all: build run +release: build +debug: build_debug +test: run + +build: build_serial build_tbb1d build_tbb +build_debug: build_serial_debug build_tbb1d_debug build_tbb_debug +run: run_serial run_tbb1d run_tbb + +serial: build_serial run_serial +serial_debug: build_serial_debug run_serial +tbb: build_tbb run_tbb +tbb_debug: build_tbb_debug run_tbb +tbb1d: build_tbb1d run_tbb1d +tbb1d_debug: build_tbb1d_debug run_tbb1d + +build_serial: + $(MAKE) VERSION=serial build_one +build_serial_debug: + $(MAKE) VERSION=serial ADD_DEBUG=1 build_one +run_serial: + $(MAKE) VERSION=serial run_one + +build_tbb: + $(MAKE) VERSION=tbb ADD_TBB=1 build_one +build_tbb_debug: + $(MAKE) VERSION=tbb ADD_TBB=1 ADD_DEBUG=1 build_one +run_tbb: + $(MAKE) VERSION=tbb run_one + +build_tbb1d: + $(MAKE) VERSION=tbb1d ADD_TBB=1 build_one +build_tbb1d_debug: + $(MAKE) VERSION=tbb1d ADD_TBB=1 ADD_DEBUG=1 build_one +run_tbb1d: + $(MAKE) VERSION=tbb1d run_one + + +perf_build: + $(MAKE) UI=con VERSION=tbb ADD_TBB=1 build_one +perf_run: + $(MAKE) UI=con VERSION=tbb run_perf_one + +light_test: + $(MAKE) UI=con VERSION=tbb light_test_one + + +# +# Per-build Makefile rules (for recursive $(MAKE) calls from above) +# + +SVERSION = $(VERSION) + +ifeq ($(ADD_DEBUG),1) +MYCXXFLAGS += -O0 -g -D_DEBUG +else +MYCXXFLAGS += -O2 -DNDEBUG +endif + + +ifeq ($(ADD_TBB),1) +MYCXXFLAGS += +ifeq ($(ADD_DEBUG),1) +MYCXXFLAGS += -DTBB_USE_DEBUG +LIBS += -ltbb_debug +else +LIBS += -ltbb +endif +endif + +ifeq ($(shell uname), Linux) +LIBS += -lrt +else ifeq ($(shell uname), Darwin) +override CXXFLAGS += -Wl,-rpath,$(TBBROOT)/lib +endif + +SOURCE = ../../common/gui/$(UI)video.cpp src/trace.$(SVERSION).cpp src/main.cpp src/pthread.cpp src/tachyon_video.cpp src/api.cpp src/apigeom.cpp src/apitrigeom.cpp src/bndbox.cpp src/box.cpp src/camera.cpp src/coordsys.cpp src/cylinder.cpp src/extvol.cpp src/global.cpp src/grid.cpp src/imageio.cpp src/imap.cpp src/intersect.cpp src/jpeg.cpp src/light.cpp src/objbound.cpp src/parse.cpp src/plane.cpp src/ppm.cpp src/quadric.cpp src/render.cpp src/ring.cpp src/shade.cpp src/sphere.cpp src/texture.cpp src/tgafile.cpp src/trace_rest.cpp src/triangle.cpp src/ui.cpp src/util.cpp src/vector.cpp src/vol.cpp + +build_one: $(EXE) + +run_one: +ifeq ($(UI),mac) + export DYLD_LIBRARY_PATH="$(DYLD_LIBRARY_PATH):$(TBBLIBSPATH)"; $(run_cmd) ./$(EXE) $(ARGS) +else + $(run_cmd) ./$(EXE) $(ARGS) +endif + +run_perf_one: + $(run_cmd) ./$(EXE) $(PERF_RUN_ARGS) + +light_test_one: + $(run_cmd) ./$(EXE) $(LIGHT_ARGS) + +$(EXE): $(SOURCE) +ifeq ($(UI),mac) + mkdir -p $(APPRES)/en.lproj $(NAME)$(SUFFIX).app/Contents/MacOS + cp ../../common/gui/xcode/tbbExample/tbbExample-Info.plist $(NAME)$(SUFFIX).app/Contents/Info.plist + cp ../../common/gui/xcode/tbbExample/PkgInfo $(NAME)$(SUFFIX).app/Contents + cp ../../common/gui/xcode/tbbExample/en.lproj/* $(APPRES)/en.lproj + $(CXX_UI) $(MYCXXFLAGS) $(CXXFLAGS) -c $(MACUISOURCES) +endif # macOS* + $(CXX) $(MYCXXFLAGS) -o $@ $(SOURCE) $(MACUIOBJS) $(LIBS) + $(RM) *.o + +clean: VERSION = * +clean: +ifeq ($(UI),mac) + rm -rf $(NAME).* +endif + $(RM) $(EXE) *.o *.d diff --git a/xdl/third_party/tbb/examples/parallel_for/tachyon/Makefile.windows b/xdl/third_party/tbb/examples/parallel_for/tachyon/Makefile.windows new file mode 100644 index 00000000..d9ce96de --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/tachyon/Makefile.windows @@ -0,0 +1,150 @@ +# Copyright (c) 2005-2018 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# + +# The original source for this example is +# Copyright (c) 1994-2008 John E. Stone +# 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. The name of the author may not be used to endorse or promote products +# derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. + +# Common Makefile that builds and runs example. + +# Trying to find if icl.exe is set +CXX1 = $(TBB_CXX)- +CXX2 = $(CXX1:icl.exe-=icl.exe) +CXX = $(CXX2:-=cl.exe) + +# Uncomment one of next lines to choose user interface type (console, gdiplus, direct draw) +#UI = con +UI = gdi +#UI = dd + +# Machine architecture, auto-detected from TBB_TARGET_ARCH by default +# Use XARCH variable to change it. See index.html for more information +ARCH0 = $(TBB_TARGET_ARCH)- +ARCH1 = $(ARCH0:ia32-=x86) +ARCH2 = $(ARCH1:intel64-=AMD64) +XARCH = $(ARCH2:-=x86) + +# The default runtime arguments +ARGS = dat\balls.dat +PERF_RUN_ARGS = silent dat\balls3.dat +LIGHT_ARGS=dat\model2.dat + +# Add these for tbb/tbb1d release builds +# /GL is a workaround to prevent run-time crash when built by VS2010 +CXXFLAGS_TBB_NDEBUG = $(CXXFLAGS) /GL +LIBS_TBB_NDEBUG = tbb.lib $(LIBS) + +# Add these for tbb/tbb1d debug builds +CXXFLAGS_TBB_DEBUG = $(CXXFLAGS) /D TBB_USE_DEBUG +LIBS_TBB_DEBUG = tbb_debug.lib $(LIBS) + + +MAKEINC = ../../common/gui/Makefile.win +# scr/main.cpp src/tachyon_video.cpp cannot be included to the SOURCE_COMMON list since it depends on UI and /subsystem which is not specified for common SOURCE build +SOURCE = src/main.cpp src/tachyon_video.cpp +SOURCE_COMMON = src/pthread.cpp src/api.cpp src/apigeom.cpp src/apitrigeom.cpp src/bndbox.cpp src/box.cpp src/camera.cpp src/coordsys.cpp src/cylinder.cpp src/extvol.cpp src/global.cpp src/grid.cpp src/imageio.cpp src/imap.cpp src/intersect.cpp src/jpeg.cpp src/light.cpp src/objbound.cpp src/parse.cpp src/plane.cpp src/ppm.cpp src/quadric.cpp src/render.cpp src/ring.cpp src/shade.cpp src/sphere.cpp src/texture.cpp src/tgafile.cpp src/trace_rest.cpp src/triangle.cpp src/ui.cpp src/util.cpp src/vector.cpp src/vol.cpp + +# Targets +all: build run +release: build +debug: build_debug +test: run + +build: build_serial build_tbb1d build_tbb +build_debug: build_serial_debug build_tbb1d_debug build_tbb_debug +run: run_serial run_tbb1d run_tbb + +serial: build_serial run_serial +serial_debug: build_serial_debug run_serial +tbb: build_tbb run_tbb +tbb_debug: build_tbb_debug run_tbb +tbb1d: build_tbb1d run_tbb1d +tbb1d_debug: build_tbb1d_debug run_tbb1d + +CXXFLAGS_COMMON = /c /nologo /EHsc /Zc:forScope /D WIN32 /D _MBCS /D _CRT_SECURE_NO_DEPRECATE /Foobj/ /MP $(CXXFLAGS) +CXXFLAGS_NDEBUG = /MD /O2 /Ot /Gy /D NDEBUG +CXXFLAGS_DEBUG = /MDd /Od /Zi /D _DEBUG +LIB_LINK_FLAGS = /nologo /machine:$(XARCH) + +tachyon_common.lib: + @cmd.exe /C if not exist obj mkdir obj + $(CXX) $(CXXFLAGS_NDEBUG) $(CXXFLAGS_COMMON) $(SOURCE_COMMON) + LIB $(LIB_LINK_FLAGS) obj/*.obj /OUT:$@ + @cmd.exe /C if exist obj rmdir /S /Q obj + +tachyon_common_debug.lib: + @cmd.exe /C if not exist obj mkdir obj + $(CXX) $(CXXFLAGS_DEBUG) $(CXXFLAGS_COMMON) $(SOURCE_COMMON) + LIB $(LIB_LINK_FLAGS) obj/*.obj /OUT:$@ + @cmd.exe /C if exist obj rmdir /S /Q obj + +build_serial: tachyon_common.lib + @$(MAKE) -f $(MAKEINC) SOURCE="src/trace.serial.cpp $(SOURCE) tachyon_common.lib" EXE=tachyon.serial.exe RCNAME=gui UI=$(UI) CXX="$(CXX)" CXXFLAGS="/GL $(CXXFLAGS)" XARCH=$(XARCH) build_one +build_serial_debug: tachyon_common_debug.lib + @$(MAKE) -f $(MAKEINC) SOURCE="src/trace.serial.cpp $(SOURCE) tachyon_common_debug.lib" EXE=tachyon.serial.exe RCNAME=gui UI=$(UI) DEBUG=_debug CXX="$(CXX)" CXXFLAGS=$(CXXFLAGS) XARCH=$(XARCH) build_one +run_serial: + -.\tachyon.serial.exe $(ARGS) + +build_tbb: tachyon_common.lib + @$(MAKE) -f $(MAKEINC) SOURCE="src/trace.tbb.cpp $(SOURCE) tachyon_common.lib" EXE=tachyon.tbb.exe RCNAME=gui UI=$(UI) CXX="$(CXX)" CXXFLAGS="$(CXXFLAGS_TBB_NDEBUG)" LFLAGS="$(LIBS_TBB_NDEBUG)" XARCH=$(XARCH) build_one +build_tbb_debug: tachyon_common_debug.lib + @$(MAKE) -f $(MAKEINC) SOURCE="src/trace.tbb.cpp $(SOURCE) tachyon_common_debug.lib" EXE=tachyon.tbb.exe RCNAME=gui UI=$(UI) DEBUG=_debug CXX="$(CXX)" CXXFLAGS="$(CXXFLAGS_TBB_DEBUG)" LFLAGS="$(LIBS_TBB_DEBUG)" XARCH=$(XARCH) build_one +run_tbb: + -.\tachyon.tbb.exe $(ARGS) + +build_tbb1d: tachyon_common.lib + @$(MAKE) -f $(MAKEINC) SOURCE="src/trace.tbb1d.cpp $(SOURCE) tachyon_common.lib" EXE=tachyon.tbb1d.exe RCNAME=gui UI=$(UI) CXX="$(CXX)" CXXFLAGS="$(CXXFLAGS_TBB_NDEBUG)" LFLAGS="$(LIBS_TBB_NDEBUG)" XARCH=$(XARCH) build_one +build_tbb1d_debug: tachyon_common_debug.lib + @$(MAKE) -f $(MAKEINC) SOURCE="src/trace.tbb1d.cpp $(SOURCE) tachyon_common_debug.lib" EXE=tachyon.tbb1d.exe RCNAME=gui UI=$(UI) DEBUG=_debug CXX="$(CXX)" CXXFLAGS="$(CXXFLAGS_TBB_DEBUG)" LFLAGS="$(LIBS_TBB_DEBUG)" XARCH=$(XARCH) build_one +run_tbb1d: + -.\tachyon.tbb1d.exe $(ARGS) + + +clean: + @cmd.exe /C del tachyon.* *.manifest *.obj *.lib msvs\gui.res *.?db + +perf_build: tachyon_common.lib + @$(MAKE) -f $(MAKEINC) SOURCE="src/trace.tbb.cpp $(SOURCE) tachyon_common.lib" EXE=tachyon.tbb.exe RCNAME=gui UI=con CXX="$(CXX)" CXXFLAGS="$(CXXFLAGS_TBB_NDEBUG)" LFLAGS="$(LIBS_TBB_NDEBUG)" XARCH=$(XARCH) build_one +perf_run: + -.\tachyon.tbb.exe $(PERF_RUN_ARGS) + +light_test: + -.\tachyon.tbb.exe $(LIGHT_ARGS) diff --git a/xdl/third_party/tbb/examples/parallel_for/tachyon/dat/820spheres.dat b/xdl/third_party/tbb/examples/parallel_for/tachyon/dat/820spheres.dat new file mode 100644 index 00000000..5d5a4300 --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/tachyon/dat/820spheres.dat @@ -0,0 +1,1671 @@ +BEGIN_SCENE + OUTFILE /dev/null + RESOLUTION 512 512 + VERBOSE 0 + +CAMERA + ZOOM 1.0 + ASPECTRATIO 1.0 + ANTIALIASING 0 + RAYDEPTH 12 + CENTER 0.0 0.0 2.0 + VIEWDIR 0 0 -1 + UPDIR 0 1 0 + +END_CAMERA + +LIGHT CENTER 4 3 2 RAD 0.2 COLOR 0.5 0.5 0.5 + +LIGHT CENTER 1 -4 4 RAD 0.2 COLOR 0.5 0.5 0.5 + +LIGHT CENTER -3 1 5 RAD 0.2 COLOR 0.5 0.5 0.5 + +TEXDEF txt001 AMBIENT 0.2 DIFFUSE 0.8 SPECULAR 0 OPACITY 1 + COLOR 1 0.75 0.33 + TEXFUNC 0 + +TEXDEF txt002 AMBIENT 0.1 DIFFUSE 0.9 SPECULAR 0.0 OPACITY 1.0 + COLOR 1.0 1.0 1.0 TEXFUNC 0 + + SPHERE CENTER 0 0 0 RAD 0.5 + txt002 + SPHERE CENTER 0.272166 0.272166 0.544331 RAD 0.166667 + txt002 + SPHERE CENTER 0.420314 0.420314 0.618405 RAD 0.0555556 + txt002 + SPHERE CENTER 0.470715 0.470715 0.598245 RAD 0.0185185 + txt002 + SPHERE CENTER 0.461623 0.409245 0.557924 RAD 0.0185185 + txt002 + SPHERE CENTER 0.409245 0.461623 0.557924 RAD 0.0185185 + txt002 + SPHERE CENTER 0.429405 0.481784 0.658726 RAD 0.0185185 + txt002 + SPHERE CENTER 0.367935 0.472692 0.618405 RAD 0.0185185 + txt002 + SPHERE CENTER 0.379004 0.431383 0.678886 RAD 0.0185185 + txt002 + SPHERE CENTER 0.481784 0.429405 0.658726 RAD 0.0185185 + txt002 + SPHERE CENTER 0.431383 0.379004 0.678886 RAD 0.0185185 + txt002 + SPHERE CENTER 0.472692 0.367935 0.618405 RAD 0.0185185 + txt002 + SPHERE CENTER 0.461844 0.304709 0.43322 RAD 0.0555556 + txt002 + SPHERE CENTER 0.492085 0.33495 0.372739 RAD 0.0185185 + txt002 + SPHERE CENTER 0.424345 0.305171 0.369341 RAD 0.0185185 + txt002 + SPHERE CENTER 0.435193 0.368397 0.406378 RAD 0.0185185 + txt002 + SPHERE CENTER 0.529584 0.334488 0.436618 RAD 0.0185185 + txt002 + SPHERE CENTER 0.472692 0.367935 0.470257 RAD 0.0185185 + txt002 + SPHERE CENTER 0.499343 0.304247 0.497099 RAD 0.0185185 + txt002 + SPHERE CENTER 0.518736 0.271262 0.399581 RAD 0.0185185 + txt002 + SPHERE CENTER 0.488495 0.241021 0.460062 RAD 0.0185185 + txt002 + SPHERE CENTER 0.450996 0.241483 0.396183 RAD 0.0185185 + txt002 + SPHERE CENTER 0.304709 0.461844 0.43322 RAD 0.0555556 + txt002 + SPHERE CENTER 0.33495 0.492085 0.372739 RAD 0.0185185 + txt002 + SPHERE CENTER 0.368397 0.435193 0.406378 RAD 0.0185185 + txt002 + SPHERE CENTER 0.305171 0.424345 0.369341 RAD 0.0185185 + txt002 + SPHERE CENTER 0.271262 0.518736 0.399581 RAD 0.0185185 + txt002 + SPHERE CENTER 0.241483 0.450996 0.396183 RAD 0.0185185 + txt002 + SPHERE CENTER 0.241021 0.488495 0.460062 RAD 0.0185185 + txt002 + SPHERE CENTER 0.334488 0.529584 0.436618 RAD 0.0185185 + txt002 + SPHERE CENTER 0.304247 0.499343 0.497099 RAD 0.0185185 + txt002 + SPHERE CENTER 0.367935 0.472692 0.470257 RAD 0.0185185 + txt002 + SPHERE CENTER 0.230635 0.38777 0.729516 RAD 0.0555556 + txt002 + SPHERE CENTER 0.2506 0.446614 0.769837 RAD 0.0185185 + txt002 + SPHERE CENTER 0.301839 0.407906 0.732914 RAD 0.0185185 + txt002 + SPHERE CENTER 0.253236 0.449775 0.695877 RAD 0.0185185 + txt002 + SPHERE CENTER 0.179397 0.426478 0.766439 RAD 0.0185185 + txt002 + SPHERE CENTER 0.182032 0.429639 0.692479 RAD 0.0185185 + txt002 + SPHERE CENTER 0.159431 0.367634 0.726118 RAD 0.0185185 + txt002 + SPHERE CENTER 0.227999 0.384609 0.803476 RAD 0.0185185 + txt002 + SPHERE CENTER 0.208034 0.325765 0.763155 RAD 0.0185185 + txt002 + SPHERE CENTER 0.279238 0.345901 0.766553 RAD 0.0185185 + txt002 + SPHERE CENTER 0.115031 0.4293 0.544331 RAD 0.0555556 + txt002 + SPHERE CENTER 0.102505 0.502308 0.544331 RAD 0.0185185 + txt002 + SPHERE CENTER 0.160392 0.474661 0.581368 RAD 0.0185185 + txt002 + SPHERE CENTER 0.160392 0.474661 0.507294 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0571437 0.456947 0.507294 RAD 0.0185185 + txt002 + SPHERE CENTER 0.115031 0.4293 0.470257 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0696698 0.383939 0.507294 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0571437 0.456947 0.581368 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0696698 0.383939 0.581368 RAD 0.0185185 + txt002 + SPHERE CENTER 0.115031 0.4293 0.618405 RAD 0.0185185 + txt002 + SPHERE CENTER 0.082487 0.239622 0.655442 RAD 0.0555556 + txt002 + SPHERE CENTER 0.0438957 0.258053 0.715923 RAD 0.0185185 + txt002 + SPHERE CENTER 0.117687 0.252557 0.719322 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0863845 0.308551 0.682285 RAD 0.0185185 + txt002 + SPHERE CENTER 0.00869528 0.245118 0.652044 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0511841 0.295616 0.618405 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0472866 0.226687 0.591563 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0399982 0.189123 0.689081 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0785895 0.170692 0.6286 RAD 0.0185185 + txt002 + SPHERE CENTER 0.11379 0.183628 0.692479 RAD 0.0185185 + txt002 + SPHERE CENTER 0.38777 0.230635 0.729516 RAD 0.0555556 + txt002 + SPHERE CENTER 0.446614 0.2506 0.769837 RAD 0.0185185 + txt002 + SPHERE CENTER 0.449775 0.253236 0.695877 RAD 0.0185185 + txt002 + SPHERE CENTER 0.407906 0.301839 0.732914 RAD 0.0185185 + txt002 + SPHERE CENTER 0.384609 0.227999 0.803476 RAD 0.0185185 + txt002 + SPHERE CENTER 0.345901 0.279238 0.766553 RAD 0.0185185 + txt002 + SPHERE CENTER 0.325765 0.208034 0.763155 RAD 0.0185185 + txt002 + SPHERE CENTER 0.426478 0.179397 0.766439 RAD 0.0185185 + txt002 + SPHERE CENTER 0.367634 0.159431 0.726118 RAD 0.0185185 + txt002 + SPHERE CENTER 0.429639 0.182032 0.692479 RAD 0.0185185 + txt002 + SPHERE CENTER 0.239622 0.082487 0.655442 RAD 0.0555556 + txt002 + SPHERE CENTER 0.258053 0.0438957 0.715923 RAD 0.0185185 + txt002 + SPHERE CENTER 0.308551 0.0863845 0.682285 RAD 0.0185185 + txt002 + SPHERE CENTER 0.252557 0.117687 0.719322 RAD 0.0185185 + txt002 + SPHERE CENTER 0.189123 0.0399982 0.689081 RAD 0.0185185 + txt002 + SPHERE CENTER 0.183628 0.11379 0.692479 RAD 0.0185185 + txt002 + SPHERE CENTER 0.170692 0.0785895 0.6286 RAD 0.0185185 + txt002 + SPHERE CENTER 0.245118 0.00869528 0.652044 RAD 0.0185185 + txt002 + SPHERE CENTER 0.226687 0.0472866 0.591563 RAD 0.0185185 + txt002 + SPHERE CENTER 0.295616 0.0511841 0.618405 RAD 0.0185185 + txt002 + SPHERE CENTER 0.4293 0.115031 0.544331 RAD 0.0555556 + txt002 + SPHERE CENTER 0.502308 0.102505 0.544331 RAD 0.0185185 + txt002 + SPHERE CENTER 0.474661 0.160392 0.507294 RAD 0.0185185 + txt002 + SPHERE CENTER 0.474661 0.160392 0.581368 RAD 0.0185185 + txt002 + SPHERE CENTER 0.456947 0.0571437 0.581368 RAD 0.0185185 + txt002 + SPHERE CENTER 0.4293 0.115031 0.618405 RAD 0.0185185 + txt002 + SPHERE CENTER 0.383939 0.0696698 0.581368 RAD 0.0185185 + txt002 + SPHERE CENTER 0.456947 0.0571437 0.507294 RAD 0.0185185 + txt002 + SPHERE CENTER 0.383939 0.0696698 0.507294 RAD 0.0185185 + txt002 + SPHERE CENTER 0.4293 0.115031 0.470257 RAD 0.0185185 + txt002 + SPHERE CENTER 0.643951 0.172546 1.11022e-16 RAD 0.166667 + txt002 + SPHERE CENTER 0.802608 0.281471 -0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER 0.824035 0.30566 -0.177765 RAD 0.0185185 + txt002 + SPHERE CENTER 0.787796 0.241352 -0.171592 RAD 0.0185185 + txt002 + SPHERE CENTER 0.752156 0.305221 -0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER 0.838847 0.34578 -0.117284 RAD 0.0185185 + txt002 + SPHERE CENTER 0.766968 0.345341 -0.099389 RAD 0.0185185 + txt002 + SPHERE CENTER 0.817421 0.321591 -0.0506299 RAD 0.0185185 + txt002 + SPHERE CENTER 0.874487 0.28191 -0.129006 RAD 0.0185185 + txt002 + SPHERE CENTER 0.853061 0.257721 -0.062352 RAD 0.0185185 + txt002 + SPHERE CENTER 0.838248 0.217602 -0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER 0.643951 0.172546 -0.222222 RAD 0.0555556 + txt002 + SPHERE CENTER 0.61371 0.202787 -0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER 0.5724 0.191718 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.624779 0.244096 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.68526 0.183615 -0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER 0.696329 0.224924 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.715501 0.153374 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.632882 0.131237 -0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER 0.663122 0.100996 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.591572 0.120168 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.594141 0.358439 -0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER 0.619127 0.408291 -0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER 0.665691 0.37761 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.638217 0.337042 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.547576 0.389119 -0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER 0.566667 0.317871 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.522591 0.339267 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.57505 0.429687 -0.104315 RAD 0.0185185 + txt002 + SPHERE CENTER 0.550064 0.379835 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.621614 0.399007 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.802608 0.281471 0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER 0.858698 0.329459 0.104938 RAD 0.0185185 + txt002 + SPHERE CENTER 0.845371 0.280879 0.0506299 RAD 0.0185185 + txt002 + SPHERE CENTER 0.798572 0.337088 0.062352 RAD 0.0185185 + txt002 + SPHERE CENTER 0.815936 0.330051 0.165419 RAD 0.0185185 + txt002 + SPHERE CENTER 0.75581 0.33768 0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER 0.759846 0.282063 0.171592 RAD 0.0185185 + txt002 + SPHERE CENTER 0.862735 0.273842 0.153697 RAD 0.0185185 + txt002 + SPHERE CENTER 0.806645 0.225855 0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER 0.849407 0.225263 0.099389 RAD 0.0185185 + txt002 + SPHERE CENTER 0.594141 0.358439 0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER 0.613592 0.428945 0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER 0.665691 0.37761 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.621614 0.399007 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.542042 0.409774 0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER 0.550064 0.379835 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.522591 0.339267 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.586119 0.388377 0.178389 RAD 0.0185185 + txt002 + SPHERE CENTER 0.566667 0.317871 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.638217 0.337042 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.643951 0.172546 0.222222 RAD 0.0555556 + txt002 + SPHERE CENTER 0.674191 0.202787 0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER 0.715501 0.191718 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.663122 0.244096 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.602641 0.183615 0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER 0.591572 0.224924 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.5724 0.153374 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.655019 0.131237 0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER 0.624779 0.100996 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.696329 0.120168 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.852418 0.0955788 2.30268e-16 RAD 0.0555556 + txt002 + SPHERE CENTER 0.922609 0.11107 -0.0178949 RAD 0.0185185 + txt002 + SPHERE CENTER 0.867231 0.135698 -0.0604812 RAD 0.0185185 + txt002 + SPHERE CENTER 0.877966 0.164775 0.00679642 RAD 0.0185185 + txt002 + SPHERE CENTER 0.907797 0.0709499 0.0425863 RAD 0.0185185 + txt002 + SPHERE CENTER 0.863153 0.124655 0.0672777 RAD 0.0185185 + txt002 + SPHERE CENTER 0.837606 0.0554592 0.0604812 RAD 0.0185185 + txt002 + SPHERE CENTER 0.897062 0.0418734 -0.0246914 RAD 0.0185185 + txt002 + SPHERE CENTER 0.826871 0.0263827 -0.00679642 RAD 0.0185185 + txt002 + SPHERE CENTER 0.841683 0.0665023 -0.0672777 RAD 0.0185185 + txt002 + SPHERE CENTER 0.69376 -0.0133465 0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER 0.740325 -0.0440268 0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER 0.76531 0.0058253 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.721234 0.0272215 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.668775 -0.0631985 0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER 0.649684 0.00804971 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.62221 -0.0325183 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.712851 -0.0845947 0.104315 RAD 0.0185185 + txt002 + SPHERE CENTER 0.666287 -0.0539145 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.737837 -0.0347427 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.69376 -0.0133465 -0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER 0.745859 -0.0646815 -0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER 0.76531 0.0058253 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.737837 -0.0347427 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.674309 -0.0838533 -0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER 0.666287 -0.0539145 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.62221 -0.0325183 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.701782 -0.0432853 -0.178389 RAD 0.0185185 + txt002 + SPHERE CENTER 0.649684 0.00804971 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.721234 0.0272215 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.172546 0.643951 1.11022e-16 RAD 0.166667 + txt002 + SPHERE CENTER 0.281471 0.802608 -0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER 0.30566 0.824035 -0.177765 RAD 0.0185185 + txt002 + SPHERE CENTER 0.305221 0.752156 -0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER 0.241352 0.787796 -0.171592 RAD 0.0185185 + txt002 + SPHERE CENTER 0.28191 0.874487 -0.129006 RAD 0.0185185 + txt002 + SPHERE CENTER 0.217602 0.838248 -0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER 0.257721 0.853061 -0.062352 RAD 0.0185185 + txt002 + SPHERE CENTER 0.34578 0.838847 -0.117284 RAD 0.0185185 + txt002 + SPHERE CENTER 0.321591 0.817421 -0.0506299 RAD 0.0185185 + txt002 + SPHERE CENTER 0.345341 0.766968 -0.099389 RAD 0.0185185 + txt002 + SPHERE CENTER 0.358439 0.594141 -0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER 0.408291 0.619127 -0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER 0.337042 0.638217 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.37761 0.665691 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.429687 0.57505 -0.104315 RAD 0.0185185 + txt002 + SPHERE CENTER 0.399007 0.621614 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.379835 0.550064 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.389119 0.547576 -0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER 0.339267 0.522591 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.317871 0.566667 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.172546 0.643951 -0.222222 RAD 0.0555556 + txt002 + SPHERE CENTER 0.142305 0.674191 -0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER 0.100996 0.663122 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.153374 0.715501 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.213855 0.655019 -0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER 0.224924 0.696329 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.244096 0.624779 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.161477 0.602641 -0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER 0.191718 0.5724 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.120168 0.591572 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0955788 0.852418 1.31582e-16 RAD 0.0555556 + txt002 + SPHERE CENTER 0.11107 0.922609 -0.0178949 RAD 0.0185185 + txt002 + SPHERE CENTER 0.164775 0.877966 0.00679642 RAD 0.0185185 + txt002 + SPHERE CENTER 0.135698 0.867231 -0.0604812 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0418734 0.897062 -0.0246914 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0665023 0.841683 -0.0672777 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0263827 0.826871 -0.00679642 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0709499 0.907797 0.0425863 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0554592 0.837606 0.0604812 RAD 0.0185185 + txt002 + SPHERE CENTER 0.124655 0.863153 0.0672777 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0133465 0.69376 -0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER -0.0646815 0.745859 -0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0347427 0.737837 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0058253 0.76531 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0432853 0.701782 -0.178389 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0272215 0.721234 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.00804971 0.649684 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0838533 0.674309 -0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0325183 0.62221 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0539145 0.666287 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0133465 0.69376 0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER -0.0440268 0.740325 0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0272215 0.721234 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0058253 0.76531 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0845947 0.712851 0.104315 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0347427 0.737837 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0539145 0.666287 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0631985 0.668775 0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0325183 0.62221 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.00804971 0.649684 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.281471 0.802608 0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER 0.329459 0.858698 0.104938 RAD 0.0185185 + txt002 + SPHERE CENTER 0.337088 0.798572 0.062352 RAD 0.0185185 + txt002 + SPHERE CENTER 0.280879 0.845371 0.0506299 RAD 0.0185185 + txt002 + SPHERE CENTER 0.273842 0.862735 0.153697 RAD 0.0185185 + txt002 + SPHERE CENTER 0.225263 0.849407 0.099389 RAD 0.0185185 + txt002 + SPHERE CENTER 0.225855 0.806645 0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER 0.330051 0.815936 0.165419 RAD 0.0185185 + txt002 + SPHERE CENTER 0.282063 0.759846 0.171592 RAD 0.0185185 + txt002 + SPHERE CENTER 0.33768 0.75581 0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER 0.172546 0.643951 0.222222 RAD 0.0555556 + txt002 + SPHERE CENTER 0.202787 0.674191 0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER 0.244096 0.663122 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.191718 0.715501 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.131237 0.655019 0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER 0.120168 0.696329 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.100996 0.624779 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.183615 0.602641 0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER 0.153374 0.5724 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.224924 0.591572 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.358439 0.594141 0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER 0.428945 0.613592 0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER 0.399007 0.621614 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.37761 0.665691 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.388377 0.586119 0.178389 RAD 0.0185185 + txt002 + SPHERE CENTER 0.337042 0.638217 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.317871 0.566667 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.409774 0.542042 0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER 0.339267 0.522591 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.379835 0.550064 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.371785 0.0996195 0.544331 RAD 0.166667 + txt002 + SPHERE CENTER -0.393621 0.220501 0.729516 RAD 0.0555556 + txt002 + SPHERE CENTER -0.368601 0.279642 0.766439 RAD 0.0185185 + txt002 + SPHERE CENTER -0.321889 0.238665 0.726118 RAD 0.0185185 + txt002 + SPHERE CENTER -0.372464 0.281062 0.692479 RAD 0.0185185 + txt002 + SPHERE CENTER -0.440333 0.261479 0.769837 RAD 0.0185185 + txt002 + SPHERE CENTER -0.444196 0.262898 0.695877 RAD 0.0185185 + txt002 + SPHERE CENTER -0.465353 0.202338 0.732914 RAD 0.0185185 + txt002 + SPHERE CENTER -0.389758 0.219082 0.803476 RAD 0.0185185 + txt002 + SPHERE CENTER -0.414778 0.15994 0.766553 RAD 0.0185185 + txt002 + SPHERE CENTER -0.343046 0.178104 0.763155 RAD 0.0185185 + txt002 + SPHERE CENTER -0.191247 0.166275 0.655442 RAD 0.0555556 + txt002 + SPHERE CENTER -0.130089 0.20793 0.652044 RAD 0.0185185 + txt002 + SPHERE CENTER -0.154295 0.172673 0.591563 RAD 0.0185185 + txt002 + SPHERE CENTER -0.192135 0.230419 0.618405 RAD 0.0185185 + txt002 + SPHERE CENTER -0.167041 0.201532 0.715923 RAD 0.0185185 + txt002 + SPHERE CENTER -0.229087 0.224021 0.682285 RAD 0.0185185 + txt002 + SPHERE CENTER -0.228199 0.159877 0.719322 RAD 0.0185185 + txt002 + SPHERE CENTER -0.129201 0.143787 0.689081 RAD 0.0185185 + txt002 + SPHERE CENTER -0.190359 0.102131 0.692479 RAD 0.0185185 + txt002 + SPHERE CENTER -0.153407 0.108529 0.6286 RAD 0.0185185 + txt002 + SPHERE CENTER -0.31427 0.31427 0.544331 RAD 0.0555556 + txt002 + SPHERE CENTER -0.277961 0.367156 0.507294 RAD 0.0185185 + txt002 + SPHERE CENTER -0.252306 0.297666 0.507294 RAD 0.0185185 + txt002 + SPHERE CENTER -0.31427 0.31427 0.470257 RAD 0.0185185 + txt002 + SPHERE CENTER -0.339925 0.383759 0.544331 RAD 0.0185185 + txt002 + SPHERE CENTER -0.376234 0.330873 0.507294 RAD 0.0185185 + txt002 + SPHERE CENTER -0.376234 0.330873 0.581368 RAD 0.0185185 + txt002 + SPHERE CENTER -0.277961 0.367156 0.581368 RAD 0.0185185 + txt002 + SPHERE CENTER -0.31427 0.31427 0.618405 RAD 0.0185185 + txt002 + SPHERE CENTER -0.252306 0.297666 0.581368 RAD 0.0185185 + txt002 + SPHERE CENTER -0.574159 0.153845 0.618405 RAD 0.0555556 + txt002 + SPHERE CENTER -0.612768 0.202534 0.658726 RAD 0.0185185 + txt002 + SPHERE CENTER -0.543919 0.184086 0.678886 RAD 0.0185185 + txt002 + SPHERE CENTER -0.554987 0.225396 0.618405 RAD 0.0185185 + txt002 + SPHERE CENTER -0.643008 0.172294 0.598245 RAD 0.0185185 + txt002 + SPHERE CENTER -0.585228 0.195155 0.557924 RAD 0.0185185 + txt002 + SPHERE CENTER -0.6044 0.123605 0.557924 RAD 0.0185185 + txt002 + SPHERE CENTER -0.631939 0.130984 0.658726 RAD 0.0185185 + txt002 + SPHERE CENTER -0.593331 0.0822954 0.618405 RAD 0.0185185 + txt002 + SPHERE CENTER -0.56309 0.112536 0.678886 RAD 0.0185185 + txt002 + SPHERE CENTER -0.494808 0.247614 0.43322 RAD 0.0555556 + txt002 + SPHERE CENTER -0.494287 0.313607 0.399581 RAD 0.0185185 + txt002 + SPHERE CENTER -0.452978 0.302539 0.460062 RAD 0.0185185 + txt002 + SPHERE CENTER -0.434629 0.269833 0.396183 RAD 0.0185185 + txt002 + SPHERE CENTER -0.536117 0.258683 0.372739 RAD 0.0185185 + txt002 + SPHERE CENTER -0.476459 0.214908 0.369341 RAD 0.0185185 + txt002 + SPHERE CENTER -0.536638 0.19269 0.406378 RAD 0.0185185 + txt002 + SPHERE CENTER -0.554467 0.291389 0.436618 RAD 0.0185185 + txt002 + SPHERE CENTER -0.554987 0.225396 0.470257 RAD 0.0185185 + txt002 + SPHERE CENTER -0.513157 0.28032 0.497099 RAD 0.0185185 + txt002 + SPHERE CENTER -0.552323 0.0329639 0.43322 RAD 0.0555556 + txt002 + SPHERE CENTER -0.625877 0.0248832 0.436618 RAD 0.0185185 + txt002 + SPHERE CENTER -0.584567 0.0138144 0.497099 RAD 0.0185185 + txt002 + SPHERE CENTER -0.593331 0.0822954 0.470257 RAD 0.0185185 + txt002 + SPHERE CENTER -0.593633 0.0440327 0.372739 RAD 0.0185185 + txt002 + SPHERE CENTER -0.561087 0.101445 0.406378 RAD 0.0185185 + txt002 + SPHERE CENTER -0.520079 0.0521134 0.369341 RAD 0.0185185 + txt002 + SPHERE CENTER -0.584869 -0.0244483 0.399581 RAD 0.0185185 + txt002 + SPHERE CENTER -0.511316 -0.0163676 0.396183 RAD 0.0185185 + txt002 + SPHERE CENTER -0.54356 -0.0355172 0.460062 RAD 0.0185185 + txt002 + SPHERE CENTER -0.451136 0.0058509 0.729516 RAD 0.0555556 + txt002 + SPHERE CENTER -0.447081 0.0051487 0.803476 RAD 0.0185185 + txt002 + SPHERE CENTER -0.386138 0.0172804 0.763155 RAD 0.0185185 + txt002 + SPHERE CENTER -0.439178 0.0688765 0.766553 RAD 0.0185185 + txt002 + SPHERE CENTER -0.512079 -0.00628079 0.769837 RAD 0.0185185 + txt002 + SPHERE CENTER -0.504176 0.0574471 0.732914 RAD 0.0185185 + txt002 + SPHERE CENTER -0.516134 -0.00557859 0.695877 RAD 0.0185185 + txt002 + SPHERE CENTER -0.459039 -0.0578769 0.766439 RAD 0.0185185 + txt002 + SPHERE CENTER -0.463094 -0.0571747 0.692479 RAD 0.0185185 + txt002 + SPHERE CENTER -0.398096 -0.0457452 0.726118 RAD 0.0185185 + txt002 + SPHERE CENTER -0.4293 -0.115031 0.544331 RAD 0.0555556 + txt002 + SPHERE CENTER -0.424299 -0.178985 0.581368 RAD 0.0185185 + txt002 + SPHERE CENTER -0.367336 -0.131634 0.581368 RAD 0.0185185 + txt002 + SPHERE CENTER -0.4293 -0.115031 0.618405 RAD 0.0185185 + txt002 + SPHERE CENTER -0.486264 -0.162382 0.544331 RAD 0.0185185 + txt002 + SPHERE CENTER -0.491265 -0.0984274 0.581368 RAD 0.0185185 + txt002 + SPHERE CENTER -0.491265 -0.0984274 0.507294 RAD 0.0185185 + txt002 + SPHERE CENTER -0.424299 -0.178985 0.507294 RAD 0.0185185 + txt002 + SPHERE CENTER -0.4293 -0.115031 0.470257 RAD 0.0185185 + txt002 + SPHERE CENTER -0.367336 -0.131634 0.507294 RAD 0.0185185 + txt002 + SPHERE CENTER -0.248762 -0.0483751 0.655442 RAD 0.0555556 + txt002 + SPHERE CENTER -0.183785 -0.0599222 0.689081 RAD 0.0185185 + txt002 + SPHERE CENTER -0.187119 -0.0172857 0.6286 RAD 0.0185185 + txt002 + SPHERE CENTER -0.215921 0.00673113 0.692479 RAD 0.0185185 + txt002 + SPHERE CENTER -0.245428 -0.0910116 0.715923 RAD 0.0185185 + txt002 + SPHERE CENTER -0.277564 -0.0243582 0.719322 RAD 0.0185185 + txt002 + SPHERE CENTER -0.310405 -0.0794645 0.682285 RAD 0.0185185 + txt002 + SPHERE CENTER -0.216626 -0.115028 0.652044 RAD 0.0185185 + txt002 + SPHERE CENTER -0.281603 -0.103481 0.618405 RAD 0.0185185 + txt002 + SPHERE CENTER -0.21996 -0.0723919 0.591563 RAD 0.0185185 + txt002 + SPHERE CENTER -0.471405 0.471405 1.11022e-16 RAD 0.166667 + txt002 + SPHERE CENTER -0.508983 0.690426 1.25414e-16 RAD 0.0555556 + txt002 + SPHERE CENTER -0.484794 0.755941 -0.0246914 RAD 0.0185185 + txt002 + SPHERE CENTER -0.436283 0.7029 -0.00679642 RAD 0.0185185 + txt002 + SPHERE CENTER -0.478434 0.695668 -0.0672777 RAD 0.0185185 + txt002 + SPHERE CENTER -0.557494 0.743468 -0.0178949 RAD 0.0185185 + txt002 + SPHERE CENTER -0.551134 0.683194 -0.0604812 RAD 0.0185185 + txt002 + SPHERE CENTER -0.581682 0.677953 0.00679642 RAD 0.0185185 + txt002 + SPHERE CENTER -0.515343 0.7507 0.0425863 RAD 0.0185185 + txt002 + SPHERE CENTER -0.539531 0.685185 0.0672777 RAD 0.0185185 + txt002 + SPHERE CENTER -0.466832 0.697658 0.0604812 RAD 0.0185185 + txt002 + SPHERE CENTER -0.335322 0.607487 0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER -0.283164 0.659645 0.104315 RAD 0.0185185 + txt002 + SPHERE CENTER -0.286452 0.603979 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.33883 0.656357 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.332034 0.663153 0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER -0.3877 0.659866 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.384191 0.610996 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.279656 0.610775 0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER -0.331813 0.558618 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.282943 0.555109 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.335322 0.607487 -0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER -0.313405 0.629404 -0.178389 RAD 0.0185185 + txt002 + SPHERE CENTER -0.331813 0.558618 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.384191 0.610996 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.316914 0.678274 -0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER -0.3877 0.659866 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.33883 0.656357 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.264535 0.625895 -0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER -0.286452 0.603979 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.282943 0.555109 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.645066 0.554344 -0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER -0.681385 0.616373 -0.129006 RAD 0.0185185 + txt002 + SPHERE CENTER -0.649723 0.609912 -0.062352 RAD 0.0185185 + txt002 + SPHERE CENTER -0.607573 0.617144 -0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER -0.676727 0.560805 -0.177765 RAD 0.0185185 + txt002 + SPHERE CENTER -0.602915 0.561576 -0.171592 RAD 0.0185185 + txt002 + SPHERE CENTER -0.640408 0.498776 -0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER -0.718878 0.553573 -0.117284 RAD 0.0185185 + txt002 + SPHERE CENTER -0.682558 0.491544 -0.099389 RAD 0.0185185 + txt002 + SPHERE CENTER -0.687216 0.547112 -0.0506299 RAD 0.0185185 + txt002 + SPHERE CENTER -0.471405 0.471405 -0.222222 RAD 0.0555556 + txt002 + SPHERE CENTER -0.501645 0.501645 -0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER -0.542955 0.490576 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.490576 0.542955 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.430095 0.482473 -0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER -0.419026 0.523783 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.399854 0.452233 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.482473 0.430095 -0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER -0.452233 0.399854 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.523783 0.419026 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.607487 0.335322 -0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER -0.659645 0.283164 -0.104315 RAD 0.0185185 + txt002 + SPHERE CENTER -0.603979 0.286452 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.656357 0.33883 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.663153 0.332034 -0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER -0.659866 0.3877 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.610996 0.384191 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.610775 0.279656 -0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER -0.558618 0.331813 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.555109 0.282943 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.645066 0.554344 0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER -0.668521 0.610229 0.153697 RAD 0.0185185 + txt002 + SPHERE CENTER -0.598918 0.585648 0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER -0.619787 0.622977 0.099389 RAD 0.0185185 + txt002 + SPHERE CENTER -0.714669 0.578925 0.104938 RAD 0.0185185 + txt002 + SPHERE CENTER -0.665934 0.591673 0.0506299 RAD 0.0185185 + txt002 + SPHERE CENTER -0.691213 0.52304 0.062352 RAD 0.0185185 + txt002 + SPHERE CENTER -0.6938 0.541596 0.165419 RAD 0.0185185 + txt002 + SPHERE CENTER -0.670344 0.48571 0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER -0.624197 0.517014 0.171592 RAD 0.0185185 + txt002 + SPHERE CENTER -0.607487 0.335322 0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER -0.629404 0.313405 0.178389 RAD 0.0185185 + txt002 + SPHERE CENTER -0.558618 0.331813 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.610996 0.384191 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.678274 0.316914 0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER -0.659866 0.3877 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.656357 0.33883 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.625895 0.264535 0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER -0.603979 0.286452 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.555109 0.282943 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.471405 0.471405 0.222222 RAD 0.0555556 + txt002 + SPHERE CENTER -0.441164 0.501645 0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER -0.399854 0.490576 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.452233 0.542955 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.512714 0.482473 0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER -0.523783 0.523783 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.542955 0.452233 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.460336 0.430095 0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER -0.490576 0.399854 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.419026 0.419026 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.643951 -0.172546 1.11022e-16 RAD 0.166667 + txt002 + SPHERE CENTER -0.835815 -0.157543 0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER -0.871646 -0.122136 0.165419 RAD 0.0185185 + txt002 + SPHERE CENTER -0.799077 -0.135649 0.171592 RAD 0.0185185 + txt002 + SPHERE CENTER -0.82339 -0.0854653 0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER -0.908384 -0.14403 0.104938 RAD 0.0185185 + txt002 + SPHERE CENTER -0.860128 -0.107359 0.062352 RAD 0.0185185 + txt002 + SPHERE CENTER -0.872552 -0.179437 0.0506299 RAD 0.0185185 + txt002 + SPHERE CENTER -0.884071 -0.194213 0.153697 RAD 0.0185185 + txt002 + SPHERE CENTER -0.84824 -0.229621 0.099389 RAD 0.0185185 + txt002 + SPHERE CENTER -0.811502 -0.207727 0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER -0.643951 -0.172546 0.222222 RAD 0.0555556 + txt002 + SPHERE CENTER -0.61371 -0.142305 0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER -0.5724 -0.153374 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.624779 -0.100996 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.68526 -0.161477 0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER -0.696329 -0.120168 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.715501 -0.191718 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.632882 -0.213855 0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER -0.663122 -0.244096 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.591572 -0.224924 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.69376 0.0133465 0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER -0.674309 0.0838533 0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER -0.62221 0.0325183 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.666287 0.0539145 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.745859 0.0646815 0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER -0.737837 0.0347427 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.76531 -0.0058253 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.701782 0.0432853 0.178389 RAD 0.0185185 + txt002 + SPHERE CENTER -0.721234 -0.0272215 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.649684 -0.00804971 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.835815 -0.157543 -0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER -0.899353 -0.119969 -0.117284 RAD 0.0185185 + txt002 + SPHERE CENTER -0.868703 -0.130205 -0.0506299 RAD 0.0185185 + txt002 + SPHERE CENTER -0.836885 -0.0844101 -0.099389 RAD 0.0185185 + txt002 + SPHERE CENTER -0.866465 -0.147308 -0.177765 RAD 0.0185185 + txt002 + SPHERE CENTER -0.803997 -0.111748 -0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER -0.802927 -0.184881 -0.171592 RAD 0.0185185 + txt002 + SPHERE CENTER -0.898283 -0.193102 -0.129006 RAD 0.0185185 + txt002 + SPHERE CENTER -0.834745 -0.230676 -0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER -0.867633 -0.203337 -0.062352 RAD 0.0185185 + txt002 + SPHERE CENTER -0.69376 0.0133465 -0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER -0.668775 0.0631985 -0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER -0.62221 0.0325183 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.649684 -0.00804971 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.740325 0.0440268 -0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER -0.721234 -0.0272215 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.76531 -0.0058253 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.712851 0.0845947 -0.104315 RAD 0.0185185 + txt002 + SPHERE CENTER -0.737837 0.0347427 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.666287 0.0539145 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.643951 -0.172546 -0.222222 RAD 0.0555556 + txt002 + SPHERE CENTER -0.674191 -0.142305 -0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER -0.715501 -0.153374 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.663122 -0.100996 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.602641 -0.161477 -0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER -0.591572 -0.120168 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.5724 -0.191718 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.655019 -0.213855 -0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER -0.624779 -0.244096 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.696329 -0.224924 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.786005 -0.343435 1.25414e-16 RAD 0.0555556 + txt002 + SPHERE CENTER -0.82165 -0.392454 0.0425863 RAD 0.0185185 + txt002 + SPHERE CENTER -0.753118 -0.370774 0.0604812 RAD 0.0185185 + txt002 + SPHERE CENTER -0.80984 -0.323622 0.0672777 RAD 0.0185185 + txt002 + SPHERE CENTER -0.854538 -0.365116 -0.0178949 RAD 0.0185185 + txt002 + SPHERE CENTER -0.842728 -0.296284 0.00679642 RAD 0.0185185 + txt002 + SPHERE CENTER -0.818893 -0.316097 -0.0604812 RAD 0.0185185 + txt002 + SPHERE CENTER -0.797815 -0.412267 -0.0246914 RAD 0.0185185 + txt002 + SPHERE CENTER -0.76217 -0.363249 -0.0672777 RAD 0.0185185 + txt002 + SPHERE CENTER -0.729282 -0.390587 -0.00679642 RAD 0.0185185 + txt002 + SPHERE CENTER -0.594141 -0.358439 -0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER -0.542042 -0.409774 -0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER -0.522591 -0.339267 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.550064 -0.379835 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.613592 -0.428945 -0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER -0.621614 -0.399007 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.665691 -0.37761 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.586119 -0.388377 -0.178389 RAD 0.0185185 + txt002 + SPHERE CENTER -0.638217 -0.337042 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.566667 -0.317871 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.594141 -0.358439 0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER -0.547576 -0.389119 0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER -0.522591 -0.339267 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.566667 -0.317871 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.619127 -0.408291 0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER -0.638217 -0.337042 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.665691 -0.37761 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.57505 -0.429687 0.104315 RAD 0.0185185 + txt002 + SPHERE CENTER -0.621614 -0.399007 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.550064 -0.379835 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0996195 -0.371785 0.544331 RAD 0.166667 + txt002 + SPHERE CENTER 0.220501 -0.393621 0.729516 RAD 0.0555556 + txt002 + SPHERE CENTER 0.279642 -0.368601 0.766439 RAD 0.0185185 + txt002 + SPHERE CENTER 0.281062 -0.372464 0.692479 RAD 0.0185185 + txt002 + SPHERE CENTER 0.238665 -0.321889 0.726118 RAD 0.0185185 + txt002 + SPHERE CENTER 0.219082 -0.389758 0.803476 RAD 0.0185185 + txt002 + SPHERE CENTER 0.178104 -0.343046 0.763155 RAD 0.0185185 + txt002 + SPHERE CENTER 0.15994 -0.414778 0.766553 RAD 0.0185185 + txt002 + SPHERE CENTER 0.261479 -0.440333 0.769837 RAD 0.0185185 + txt002 + SPHERE CENTER 0.202338 -0.465353 0.732914 RAD 0.0185185 + txt002 + SPHERE CENTER 0.262898 -0.444196 0.695877 RAD 0.0185185 + txt002 + SPHERE CENTER 0.31427 -0.31427 0.544331 RAD 0.0555556 + txt002 + SPHERE CENTER 0.367156 -0.277961 0.507294 RAD 0.0185185 + txt002 + SPHERE CENTER 0.31427 -0.31427 0.470257 RAD 0.0185185 + txt002 + SPHERE CENTER 0.297666 -0.252306 0.507294 RAD 0.0185185 + txt002 + SPHERE CENTER 0.367156 -0.277961 0.581368 RAD 0.0185185 + txt002 + SPHERE CENTER 0.297666 -0.252306 0.581368 RAD 0.0185185 + txt002 + SPHERE CENTER 0.31427 -0.31427 0.618405 RAD 0.0185185 + txt002 + SPHERE CENTER 0.383759 -0.339925 0.544331 RAD 0.0185185 + txt002 + SPHERE CENTER 0.330873 -0.376234 0.581368 RAD 0.0185185 + txt002 + SPHERE CENTER 0.330873 -0.376234 0.507294 RAD 0.0185185 + txt002 + SPHERE CENTER 0.166275 -0.191247 0.655442 RAD 0.0555556 + txt002 + SPHERE CENTER 0.20793 -0.130089 0.652044 RAD 0.0185185 + txt002 + SPHERE CENTER 0.230419 -0.192135 0.618405 RAD 0.0185185 + txt002 + SPHERE CENTER 0.172673 -0.154295 0.591563 RAD 0.0185185 + txt002 + SPHERE CENTER 0.143787 -0.129201 0.689081 RAD 0.0185185 + txt002 + SPHERE CENTER 0.108529 -0.153407 0.6286 RAD 0.0185185 + txt002 + SPHERE CENTER 0.102131 -0.190359 0.692479 RAD 0.0185185 + txt002 + SPHERE CENTER 0.201532 -0.167041 0.715923 RAD 0.0185185 + txt002 + SPHERE CENTER 0.159877 -0.228199 0.719322 RAD 0.0185185 + txt002 + SPHERE CENTER 0.224021 -0.229087 0.682285 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0058509 -0.451136 0.729516 RAD 0.0555556 + txt002 + SPHERE CENTER 0.0051487 -0.447081 0.803476 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0688765 -0.439178 0.766553 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0172804 -0.386138 0.763155 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0578769 -0.459039 0.766439 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0457452 -0.398096 0.726118 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0571747 -0.463094 0.692479 RAD 0.0185185 + txt002 + SPHERE CENTER -0.00628079 -0.512079 0.769837 RAD 0.0185185 + txt002 + SPHERE CENTER -0.00557859 -0.516134 0.695877 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0574471 -0.504176 0.732914 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0483751 -0.248762 0.655442 RAD 0.0555556 + txt002 + SPHERE CENTER -0.0599222 -0.183785 0.689081 RAD 0.0185185 + txt002 + SPHERE CENTER 0.00673113 -0.215921 0.692479 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0172857 -0.187119 0.6286 RAD 0.0185185 + txt002 + SPHERE CENTER -0.115028 -0.216626 0.652044 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0723919 -0.21996 0.591563 RAD 0.0185185 + txt002 + SPHERE CENTER -0.103481 -0.281603 0.618405 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0910116 -0.245428 0.715923 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0794645 -0.310405 0.682285 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0243582 -0.277564 0.719322 RAD 0.0185185 + txt002 + SPHERE CENTER -0.115031 -0.4293 0.544331 RAD 0.0555556 + txt002 + SPHERE CENTER -0.178985 -0.424299 0.581368 RAD 0.0185185 + txt002 + SPHERE CENTER -0.115031 -0.4293 0.618405 RAD 0.0185185 + txt002 + SPHERE CENTER -0.131634 -0.367336 0.581368 RAD 0.0185185 + txt002 + SPHERE CENTER -0.178985 -0.424299 0.507294 RAD 0.0185185 + txt002 + SPHERE CENTER -0.131634 -0.367336 0.507294 RAD 0.0185185 + txt002 + SPHERE CENTER -0.115031 -0.4293 0.470257 RAD 0.0185185 + txt002 + SPHERE CENTER -0.162382 -0.486264 0.544331 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0984274 -0.491265 0.507294 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0984274 -0.491265 0.581368 RAD 0.0185185 + txt002 + SPHERE CENTER 0.153845 -0.574159 0.618405 RAD 0.0555556 + txt002 + SPHERE CENTER 0.202534 -0.612768 0.658726 RAD 0.0185185 + txt002 + SPHERE CENTER 0.225396 -0.554987 0.618405 RAD 0.0185185 + txt002 + SPHERE CENTER 0.184086 -0.543919 0.678886 RAD 0.0185185 + txt002 + SPHERE CENTER 0.130984 -0.631939 0.658726 RAD 0.0185185 + txt002 + SPHERE CENTER 0.112536 -0.56309 0.678886 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0822954 -0.593331 0.618405 RAD 0.0185185 + txt002 + SPHERE CENTER 0.172294 -0.643008 0.598245 RAD 0.0185185 + txt002 + SPHERE CENTER 0.123605 -0.6044 0.557924 RAD 0.0185185 + txt002 + SPHERE CENTER 0.195155 -0.585228 0.557924 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0329639 -0.552323 0.43322 RAD 0.0555556 + txt002 + SPHERE CENTER 0.0248832 -0.625877 0.436618 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0822954 -0.593331 0.470257 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0138144 -0.584567 0.497099 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0244483 -0.584869 0.399581 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0355172 -0.54356 0.460062 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0163676 -0.511316 0.396183 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0440327 -0.593633 0.372739 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0521134 -0.520079 0.369341 RAD 0.0185185 + txt002 + SPHERE CENTER 0.101445 -0.561087 0.406378 RAD 0.0185185 + txt002 + SPHERE CENTER 0.247614 -0.494808 0.43322 RAD 0.0555556 + txt002 + SPHERE CENTER 0.313607 -0.494287 0.399581 RAD 0.0185185 + txt002 + SPHERE CENTER 0.269833 -0.434629 0.396183 RAD 0.0185185 + txt002 + SPHERE CENTER 0.302539 -0.452978 0.460062 RAD 0.0185185 + txt002 + SPHERE CENTER 0.291389 -0.554467 0.436618 RAD 0.0185185 + txt002 + SPHERE CENTER 0.28032 -0.513157 0.497099 RAD 0.0185185 + txt002 + SPHERE CENTER 0.225396 -0.554987 0.470257 RAD 0.0185185 + txt002 + SPHERE CENTER 0.258683 -0.536117 0.372739 RAD 0.0185185 + txt002 + SPHERE CENTER 0.19269 -0.536638 0.406378 RAD 0.0185185 + txt002 + SPHERE CENTER 0.214908 -0.476459 0.369341 RAD 0.0185185 + txt002 + SPHERE CENTER -0.172546 -0.643951 1.11022e-16 RAD 0.166667 + txt002 + SPHERE CENTER -0.157543 -0.835815 0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER -0.122136 -0.871646 0.165419 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0854653 -0.82339 0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER -0.135649 -0.799077 0.171592 RAD 0.0185185 + txt002 + SPHERE CENTER -0.194213 -0.884071 0.153697 RAD 0.0185185 + txt002 + SPHERE CENTER -0.207727 -0.811502 0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER -0.229621 -0.84824 0.099389 RAD 0.0185185 + txt002 + SPHERE CENTER -0.14403 -0.908384 0.104938 RAD 0.0185185 + txt002 + SPHERE CENTER -0.179437 -0.872552 0.0506299 RAD 0.0185185 + txt002 + SPHERE CENTER -0.107359 -0.860128 0.062352 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0133465 -0.69376 0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER 0.0838533 -0.674309 0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0539145 -0.666287 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0325183 -0.62221 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0432853 -0.701782 0.178389 RAD 0.0185185 + txt002 + SPHERE CENTER -0.00804971 -0.649684 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0272215 -0.721234 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0646815 -0.745859 0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0058253 -0.76531 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0347427 -0.737837 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.172546 -0.643951 0.222222 RAD 0.0555556 + txt002 + SPHERE CENTER -0.142305 -0.61371 0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER -0.100996 -0.624779 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.153374 -0.5724 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.213855 -0.632882 0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER -0.224924 -0.591572 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.244096 -0.663122 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.161477 -0.68526 0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER -0.191718 -0.715501 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.120168 -0.696329 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.343435 -0.786005 1.25414e-16 RAD 0.0555556 + txt002 + SPHERE CENTER -0.392454 -0.82165 0.0425863 RAD 0.0185185 + txt002 + SPHERE CENTER -0.323622 -0.80984 0.0672777 RAD 0.0185185 + txt002 + SPHERE CENTER -0.370774 -0.753118 0.0604812 RAD 0.0185185 + txt002 + SPHERE CENTER -0.412267 -0.797815 -0.0246914 RAD 0.0185185 + txt002 + SPHERE CENTER -0.390587 -0.729282 -0.00679642 RAD 0.0185185 + txt002 + SPHERE CENTER -0.363249 -0.76217 -0.0672777 RAD 0.0185185 + txt002 + SPHERE CENTER -0.365116 -0.854538 -0.0178949 RAD 0.0185185 + txt002 + SPHERE CENTER -0.316097 -0.818893 -0.0604812 RAD 0.0185185 + txt002 + SPHERE CENTER -0.296284 -0.842728 0.00679642 RAD 0.0185185 + txt002 + SPHERE CENTER -0.358439 -0.594141 0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER -0.389119 -0.547576 0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER -0.317871 -0.566667 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.339267 -0.522591 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.429687 -0.57505 0.104315 RAD 0.0185185 + txt002 + SPHERE CENTER -0.379835 -0.550064 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.399007 -0.621614 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.408291 -0.619127 0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER -0.37761 -0.665691 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.337042 -0.638217 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.358439 -0.594141 -0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER -0.409774 -0.542042 -0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER -0.379835 -0.550064 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.339267 -0.522591 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.388377 -0.586119 -0.178389 RAD 0.0185185 + txt002 + SPHERE CENTER -0.317871 -0.566667 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.337042 -0.638217 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.428945 -0.613592 -0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER -0.37761 -0.665691 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.399007 -0.621614 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.157543 -0.835815 -0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER -0.119969 -0.899353 -0.117284 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0844101 -0.836885 -0.099389 RAD 0.0185185 + txt002 + SPHERE CENTER -0.130205 -0.868703 -0.0506299 RAD 0.0185185 + txt002 + SPHERE CENTER -0.193102 -0.898283 -0.129006 RAD 0.0185185 + txt002 + SPHERE CENTER -0.203337 -0.867633 -0.062352 RAD 0.0185185 + txt002 + SPHERE CENTER -0.230676 -0.834745 -0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER -0.147308 -0.866465 -0.177765 RAD 0.0185185 + txt002 + SPHERE CENTER -0.184881 -0.802927 -0.171592 RAD 0.0185185 + txt002 + SPHERE CENTER -0.111748 -0.803997 -0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER -0.172546 -0.643951 -0.222222 RAD 0.0555556 + txt002 + SPHERE CENTER -0.202787 -0.61371 -0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER -0.244096 -0.624779 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.191718 -0.5724 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.131237 -0.632882 -0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER -0.120168 -0.591572 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.100996 -0.663122 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.183615 -0.68526 -0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER -0.153374 -0.715501 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.224924 -0.696329 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0133465 -0.69376 -0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER 0.0631985 -0.668775 -0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER -0.00804971 -0.649684 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0325183 -0.62221 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0845947 -0.712851 -0.104315 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0539145 -0.666287 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0347427 -0.737837 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0440268 -0.740325 -0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0058253 -0.76531 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0272215 -0.721234 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.471405 -0.471405 1.11022e-16 RAD 0.166667 + txt002 + SPHERE CENTER 0.690426 -0.508983 2.241e-16 RAD 0.0555556 + txt002 + SPHERE CENTER 0.755941 -0.484794 -0.0246914 RAD 0.0185185 + txt002 + SPHERE CENTER 0.695668 -0.478434 -0.0672777 RAD 0.0185185 + txt002 + SPHERE CENTER 0.7029 -0.436283 -0.00679642 RAD 0.0185185 + txt002 + SPHERE CENTER 0.7507 -0.515343 0.0425863 RAD 0.0185185 + txt002 + SPHERE CENTER 0.697658 -0.466832 0.0604812 RAD 0.0185185 + txt002 + SPHERE CENTER 0.685185 -0.539531 0.0672777 RAD 0.0185185 + txt002 + SPHERE CENTER 0.743468 -0.557494 -0.0178949 RAD 0.0185185 + txt002 + SPHERE CENTER 0.677953 -0.581682 0.00679642 RAD 0.0185185 + txt002 + SPHERE CENTER 0.683194 -0.551134 -0.0604812 RAD 0.0185185 + txt002 + SPHERE CENTER 0.607487 -0.335322 -0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER 0.629404 -0.313405 -0.178389 RAD 0.0185185 + txt002 + SPHERE CENTER 0.610996 -0.384191 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.558618 -0.331813 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.625895 -0.264535 -0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER 0.555109 -0.282943 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.603979 -0.286452 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.678274 -0.316914 -0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER 0.656357 -0.33883 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.659866 -0.3877 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.607487 -0.335322 0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER 0.659645 -0.283164 0.104315 RAD 0.0185185 + txt002 + SPHERE CENTER 0.656357 -0.33883 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.603979 -0.286452 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.610775 -0.279656 0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER 0.555109 -0.282943 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.558618 -0.331813 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.663153 -0.332034 0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER 0.610996 -0.384191 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.659866 -0.3877 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.554344 -0.645066 0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER 0.610229 -0.668521 0.153697 RAD 0.0185185 + txt002 + SPHERE CENTER 0.622977 -0.619787 0.099389 RAD 0.0185185 + txt002 + SPHERE CENTER 0.585648 -0.598918 0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER 0.541596 -0.6938 0.165419 RAD 0.0185185 + txt002 + SPHERE CENTER 0.517014 -0.624197 0.171592 RAD 0.0185185 + txt002 + SPHERE CENTER 0.48571 -0.670344 0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER 0.578925 -0.714669 0.104938 RAD 0.0185185 + txt002 + SPHERE CENTER 0.52304 -0.691213 0.062352 RAD 0.0185185 + txt002 + SPHERE CENTER 0.591673 -0.665934 0.0506299 RAD 0.0185185 + txt002 + SPHERE CENTER 0.471405 -0.471405 0.222222 RAD 0.0555556 + txt002 + SPHERE CENTER 0.501645 -0.441164 0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER 0.542955 -0.452233 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.490576 -0.399854 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.430095 -0.460336 0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER 0.419026 -0.419026 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.399854 -0.490576 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.482473 -0.512714 0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER 0.452233 -0.542955 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.523783 -0.523783 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.335322 -0.607487 0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER 0.313405 -0.629404 0.178389 RAD 0.0185185 + txt002 + SPHERE CENTER 0.384191 -0.610996 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.331813 -0.558618 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.264535 -0.625895 0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER 0.282943 -0.555109 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.286452 -0.603979 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.316914 -0.678274 0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER 0.33883 -0.656357 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.3877 -0.659866 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.554344 -0.645066 -0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER 0.616373 -0.681385 -0.129006 RAD 0.0185185 + txt002 + SPHERE CENTER 0.617144 -0.607573 -0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER 0.609912 -0.649723 -0.062352 RAD 0.0185185 + txt002 + SPHERE CENTER 0.553573 -0.718878 -0.117284 RAD 0.0185185 + txt002 + SPHERE CENTER 0.547112 -0.687216 -0.0506299 RAD 0.0185185 + txt002 + SPHERE CENTER 0.491544 -0.682558 -0.099389 RAD 0.0185185 + txt002 + SPHERE CENTER 0.560805 -0.676727 -0.177765 RAD 0.0185185 + txt002 + SPHERE CENTER 0.498776 -0.640408 -0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER 0.561576 -0.602915 -0.171592 RAD 0.0185185 + txt002 + SPHERE CENTER 0.335322 -0.607487 -0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER 0.283164 -0.659645 -0.104315 RAD 0.0185185 + txt002 + SPHERE CENTER 0.33883 -0.656357 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.286452 -0.603979 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.279656 -0.610775 -0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER 0.282943 -0.555109 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.331813 -0.558618 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.332034 -0.663153 -0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER 0.384191 -0.610996 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.3877 -0.659866 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.471405 -0.471405 -0.222222 RAD 0.0555556 + txt002 + SPHERE CENTER 0.441164 -0.441164 -0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER 0.399854 -0.452233 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.452233 -0.399854 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.512714 -0.460336 -0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER 0.523783 -0.419026 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.542955 -0.490576 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.460336 -0.512714 -0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER 0.490576 -0.542955 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.419026 -0.523783 -0.222222 RAD 0.0185185 + txt002 + +END_SCENE diff --git a/xdl/third_party/tbb/examples/parallel_for/tachyon/dat/balls.dat b/xdl/third_party/tbb/examples/parallel_for/tachyon/dat/balls.dat new file mode 100644 index 00000000..0d4bbb15 --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/tachyon/dat/balls.dat @@ -0,0 +1,14804 @@ +BEGIN_SCENE + OUTFILE /dev/null + RESOLUTION 512 512 + VERBOSE 0 + +CAMERA + ZOOM 1.20711 +ASPECTRATIO 1.0 + ANTIALIASING 0 + RAYDEPTH 5 + CENTER 2.1 1.3 1.7 + VIEWDIR -0.700389 -0.433574 -0.566982 + UPDIR -0.482085 -0.298433 0.82373 + +END_CAMERA + +BACKGROUND 0.078 0.361 0.753 + +LIGHT CENTER 4 3 2 RAD 0.002 COLOR 0.5 0.5 0.5 + +LIGHT CENTER 1 -4 4 RAD 0.002 COLOR 0.5 0.5 0.5 + +LIGHT CENTER -3 1 5 RAD 0.002 COLOR 0.5 0.5 0.5 + +TEXDEF txt001 AMBIENT 0.2 DIFFUSE 0.8 SPECULAR 0 OPACITY 1 +PHONG PLASTIC 0 PHONG_SIZE 100000 + COLOR 1 0.75 0.33 + TEXFUNC 0 + +TRI + V0 12 12 -0.5 V1 -12 -12 -0.5 V2 12 -12 -0.5 + txt001 +TRI + V0 12 12 -0.5 V1 -12 12 -0.5 V2 -12 -12 -0.5 + txt001 +TEXDEF txt002 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 +PHONG PLASTIC 0.5 PHONG_SIZE 45.2776 + COLOR 1 0.9 0.7 + TEXFUNC 0 + + SPHERE CENTER 0 0 0 RAD 0.5 + txt002 + SPHERE CENTER 0.272166 0.272166 0.544331 RAD 0.166667 + txt002 + SPHERE CENTER 0.420314 0.420314 0.618405 RAD 0.0555556 + txt002 + SPHERE CENTER 0.470715 0.470715 0.598245 RAD 0.0185185 + txt002 + SPHERE CENTER 0.481689 0.481689 0.57904 RAD 0.00617284 + txt002 + SPHERE CENTER 0.475329 0.45787 0.577669 RAD 0.00617284 + txt002 + SPHERE CENTER 0.45787 0.475329 0.577669 RAD 0.00617284 + txt002 + SPHERE CENTER 0.477074 0.494534 0.599616 RAD 0.00617284 + txt002 + SPHERE CENTER 0.453255 0.488174 0.598245 RAD 0.00617284 + txt002 + SPHERE CENTER 0.4661 0.48356 0.618821 RAD 0.00617284 + txt002 + SPHERE CENTER 0.494534 0.477074 0.599616 RAD 0.00617284 + txt002 + SPHERE CENTER 0.48356 0.4661 0.618821 RAD 0.00617284 + txt002 + SPHERE CENTER 0.488174 0.453255 0.598245 RAD 0.00617284 + txt002 + SPHERE CENTER 0.461623 0.409245 0.557924 RAD 0.0185185 + txt002 + SPHERE CENTER 0.47044 0.419664 0.537348 RAD 0.00617284 + txt002 + SPHERE CENTER 0.447954 0.425689 0.545578 RAD 0.00617284 + txt002 + SPHERE CENTER 0.468014 0.433095 0.557924 RAD 0.00617284 + txt002 + SPHERE CENTER 0.484109 0.40322 0.549693 RAD 0.00617284 + txt002 + SPHERE CENTER 0.481683 0.416651 0.57027 RAD 0.00617284 + txt002 + SPHERE CENTER 0.475292 0.392801 0.57027 RAD 0.00617284 + txt002 + SPHERE CENTER 0.464049 0.395814 0.537348 RAD 0.00617284 + txt002 + SPHERE CENTER 0.455233 0.385395 0.557924 RAD 0.00617284 + txt002 + SPHERE CENTER 0.441563 0.401839 0.545578 RAD 0.00617284 + txt002 + SPHERE CENTER 0.409245 0.461623 0.557924 RAD 0.0185185 + txt002 + SPHERE CENTER 0.419664 0.47044 0.537348 RAD 0.00617284 + txt002 + SPHERE CENTER 0.433095 0.468014 0.557924 RAD 0.00617284 + txt002 + SPHERE CENTER 0.425689 0.447954 0.545578 RAD 0.00617284 + txt002 + SPHERE CENTER 0.395814 0.464049 0.537348 RAD 0.00617284 + txt002 + SPHERE CENTER 0.401839 0.441563 0.545578 RAD 0.00617284 + txt002 + SPHERE CENTER 0.385395 0.455233 0.557924 RAD 0.00617284 + txt002 + SPHERE CENTER 0.40322 0.484109 0.549693 RAD 0.00617284 + txt002 + SPHERE CENTER 0.392801 0.475292 0.57027 RAD 0.00617284 + txt002 + SPHERE CENTER 0.416651 0.481683 0.57027 RAD 0.00617284 + txt002 + SPHERE CENTER 0.429405 0.481784 0.658726 RAD 0.0185185 + txt002 + SPHERE CENTER 0.441197 0.503434 0.660098 RAD 0.00617284 + txt002 + SPHERE CENTER 0.452601 0.483752 0.650495 RAD 0.00617284 + txt002 + SPHERE CENTER 0.434161 0.494577 0.63815 RAD 0.00617284 + txt002 + SPHERE CENTER 0.418001 0.501466 0.668328 RAD 0.00617284 + txt002 + SPHERE CENTER 0.410965 0.492609 0.64638 RAD 0.00617284 + txt002 + SPHERE CENTER 0.406209 0.479816 0.666956 RAD 0.00617284 + txt002 + SPHERE CENTER 0.436441 0.490641 0.680674 RAD 0.00617284 + txt002 + SPHERE CENTER 0.42465 0.46899 0.679302 RAD 0.00617284 + txt002 + SPHERE CENTER 0.447846 0.470958 0.671072 RAD 0.00617284 + txt002 + SPHERE CENTER 0.367935 0.472692 0.618405 RAD 0.0185185 + txt002 + SPHERE CENTER 0.36376 0.497028 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER 0.383056 0.487812 0.630751 RAD 0.00617284 + txt002 + SPHERE CENTER 0.383056 0.487812 0.606059 RAD 0.00617284 + txt002 + SPHERE CENTER 0.34864 0.481907 0.606059 RAD 0.00617284 + txt002 + SPHERE CENTER 0.367935 0.472692 0.593714 RAD 0.00617284 + txt002 + SPHERE CENTER 0.352815 0.457572 0.606059 RAD 0.00617284 + txt002 + SPHERE CENTER 0.34864 0.481907 0.630751 RAD 0.00617284 + txt002 + SPHERE CENTER 0.352815 0.457572 0.630751 RAD 0.00617284 + txt002 + SPHERE CENTER 0.367935 0.472692 0.643096 RAD 0.00617284 + txt002 + SPHERE CENTER 0.379004 0.431383 0.678886 RAD 0.0185185 + txt002 + SPHERE CENTER 0.376578 0.444814 0.699462 RAD 0.00617284 + txt002 + SPHERE CENTER 0.399064 0.438789 0.691232 RAD 0.00617284 + txt002 + SPHERE CENTER 0.385395 0.455233 0.678886 RAD 0.00617284 + txt002 + SPHERE CENTER 0.356518 0.437408 0.687117 RAD 0.00617284 + txt002 + SPHERE CENTER 0.365335 0.447826 0.666541 RAD 0.00617284 + txt002 + SPHERE CENTER 0.358944 0.423976 0.666541 RAD 0.00617284 + txt002 + SPHERE CENTER 0.370187 0.420964 0.699462 RAD 0.00617284 + txt002 + SPHERE CENTER 0.372614 0.407532 0.678886 RAD 0.00617284 + txt002 + SPHERE CENTER 0.392673 0.414939 0.691232 RAD 0.00617284 + txt002 + SPHERE CENTER 0.481784 0.429405 0.658726 RAD 0.0185185 + txt002 + SPHERE CENTER 0.503434 0.441197 0.660098 RAD 0.00617284 + txt002 + SPHERE CENTER 0.494577 0.434161 0.63815 RAD 0.00617284 + txt002 + SPHERE CENTER 0.483752 0.452601 0.650495 RAD 0.00617284 + txt002 + SPHERE CENTER 0.490641 0.436441 0.680674 RAD 0.00617284 + txt002 + SPHERE CENTER 0.470958 0.447846 0.671072 RAD 0.00617284 + txt002 + SPHERE CENTER 0.46899 0.42465 0.679302 RAD 0.00617284 + txt002 + SPHERE CENTER 0.501466 0.418001 0.668328 RAD 0.00617284 + txt002 + SPHERE CENTER 0.479816 0.406209 0.666956 RAD 0.00617284 + txt002 + SPHERE CENTER 0.492609 0.410965 0.64638 RAD 0.00617284 + txt002 + SPHERE CENTER 0.431383 0.379004 0.678886 RAD 0.0185185 + txt002 + SPHERE CENTER 0.444814 0.376578 0.699462 RAD 0.00617284 + txt002 + SPHERE CENTER 0.455233 0.385395 0.678886 RAD 0.00617284 + txt002 + SPHERE CENTER 0.438789 0.399064 0.691232 RAD 0.00617284 + txt002 + SPHERE CENTER 0.420964 0.370187 0.699462 RAD 0.00617284 + txt002 + SPHERE CENTER 0.414939 0.392673 0.691232 RAD 0.00617284 + txt002 + SPHERE CENTER 0.407532 0.372614 0.678886 RAD 0.00617284 + txt002 + SPHERE CENTER 0.437408 0.356518 0.687117 RAD 0.00617284 + txt002 + SPHERE CENTER 0.423976 0.358944 0.666541 RAD 0.00617284 + txt002 + SPHERE CENTER 0.447826 0.365335 0.666541 RAD 0.00617284 + txt002 + SPHERE CENTER 0.472692 0.367935 0.618405 RAD 0.0185185 + txt002 + SPHERE CENTER 0.497028 0.36376 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER 0.487812 0.383056 0.606059 RAD 0.00617284 + txt002 + SPHERE CENTER 0.487812 0.383056 0.630751 RAD 0.00617284 + txt002 + SPHERE CENTER 0.481907 0.34864 0.630751 RAD 0.00617284 + txt002 + SPHERE CENTER 0.472692 0.367935 0.643096 RAD 0.00617284 + txt002 + SPHERE CENTER 0.457572 0.352815 0.630751 RAD 0.00617284 + txt002 + SPHERE CENTER 0.481907 0.34864 0.606059 RAD 0.00617284 + txt002 + SPHERE CENTER 0.457572 0.352815 0.606059 RAD 0.00617284 + txt002 + SPHERE CENTER 0.472692 0.367935 0.593714 RAD 0.00617284 + txt002 + SPHERE CENTER 0.461844 0.304709 0.43322 RAD 0.0555556 + txt002 + SPHERE CENTER 0.492085 0.33495 0.372739 RAD 0.0185185 + txt002 + SPHERE CENTER 0.492085 0.33495 0.348047 RAD 0.00617284 + txt002 + SPHERE CENTER 0.488469 0.313874 0.360393 RAD 0.00617284 + txt002 + SPHERE CENTER 0.471009 0.331334 0.360393 RAD 0.00617284 + txt002 + SPHERE CENTER 0.495701 0.356025 0.360393 RAD 0.00617284 + txt002 + SPHERE CENTER 0.474625 0.352409 0.372739 RAD 0.00617284 + txt002 + SPHERE CENTER 0.495701 0.356025 0.385084 RAD 0.00617284 + txt002 + SPHERE CENTER 0.51316 0.338566 0.360393 RAD 0.00617284 + txt002 + SPHERE CENTER 0.51316 0.338566 0.385084 RAD 0.00617284 + txt002 + SPHERE CENTER 0.509544 0.31749 0.372739 RAD 0.00617284 + txt002 + SPHERE CENTER 0.424345 0.305171 0.369341 RAD 0.0185185 + txt002 + SPHERE CENTER 0.40568 0.315605 0.356995 RAD 0.00617284 + txt002 + SPHERE CENTER 0.403931 0.312107 0.381374 RAD 0.00617284 + txt002 + SPHERE CENTER 0.419383 0.329161 0.372427 RAD 0.00617284 + txt002 + SPHERE CENTER 0.426095 0.30867 0.344961 RAD 0.00617284 + txt002 + SPHERE CENTER 0.439797 0.322225 0.360393 RAD 0.00617284 + txt002 + SPHERE CENTER 0.444759 0.298235 0.357307 RAD 0.00617284 + txt002 + SPHERE CENTER 0.410643 0.291616 0.353908 RAD 0.00617284 + txt002 + SPHERE CENTER 0.429307 0.281181 0.366254 RAD 0.00617284 + txt002 + SPHERE CENTER 0.408893 0.288117 0.378288 RAD 0.00617284 + txt002 + SPHERE CENTER 0.435193 0.368397 0.406378 RAD 0.0185185 + txt002 + SPHERE CENTER 0.440864 0.389015 0.394032 RAD 0.00617284 + txt002 + SPHERE CENTER 0.457301 0.37895 0.409464 RAD 0.00617284 + txt002 + SPHERE CENTER 0.451857 0.367697 0.388171 RAD 0.00617284 + txt002 + SPHERE CENTER 0.418755 0.378463 0.390945 RAD 0.00617284 + txt002 + SPHERE CENTER 0.429748 0.357145 0.385084 RAD 0.00617284 + txt002 + SPHERE CENTER 0.413085 0.357845 0.403291 RAD 0.00617284 + txt002 + SPHERE CENTER 0.4242 0.389715 0.412239 RAD 0.00617284 + txt002 + SPHERE CENTER 0.418529 0.369098 0.424584 RAD 0.00617284 + txt002 + SPHERE CENTER 0.440637 0.37965 0.427671 RAD 0.00617284 + txt002 + SPHERE CENTER 0.529584 0.334488 0.436618 RAD 0.0185185 + txt002 + SPHERE CENTER 0.546497 0.347572 0.424272 RAD 0.00617284 + txt002 + SPHERE CENTER 0.532117 0.331508 0.412239 RAD 0.00617284 + txt002 + SPHERE CENTER 0.522481 0.352406 0.421186 RAD 0.00617284 + txt002 + SPHERE CENTER 0.543964 0.350552 0.448652 RAD 0.00617284 + txt002 + SPHERE CENTER 0.519948 0.355387 0.445566 RAD 0.00617284 + txt002 + SPHERE CENTER 0.52705 0.337468 0.460998 RAD 0.00617284 + txt002 + SPHERE CENTER 0.5536 0.329654 0.439705 RAD 0.00617284 + txt002 + SPHERE CENTER 0.536686 0.31657 0.45205 RAD 0.00617284 + txt002 + SPHERE CENTER 0.53922 0.313589 0.427671 RAD 0.00617284 + txt002 + SPHERE CENTER 0.472692 0.367935 0.470257 RAD 0.0185185 + txt002 + SPHERE CENTER 0.48474 0.389488 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER 0.495668 0.369235 0.46131 RAD 0.00617284 + txt002 + SPHERE CENTER 0.477004 0.379669 0.448964 RAD 0.00617284 + txt002 + SPHERE CENTER 0.461764 0.388188 0.479204 RAD 0.00617284 + txt002 + SPHERE CENTER 0.454027 0.37837 0.457911 RAD 0.00617284 + txt002 + SPHERE CENTER 0.449715 0.366636 0.479204 RAD 0.00617284 + txt002 + SPHERE CENTER 0.480429 0.377754 0.49155 RAD 0.00617284 + txt002 + SPHERE CENTER 0.46838 0.356202 0.49155 RAD 0.00617284 + txt002 + SPHERE CENTER 0.491357 0.357501 0.482603 RAD 0.00617284 + txt002 + SPHERE CENTER 0.499343 0.304247 0.497099 RAD 0.0185185 + txt002 + SPHERE CENTER 0.518259 0.314219 0.509445 RAD 0.00617284 + txt002 + SPHERE CENTER 0.519922 0.310678 0.485065 RAD 0.00617284 + txt002 + SPHERE CENTER 0.504895 0.328108 0.494013 RAD 0.00617284 + txt002 + SPHERE CENTER 0.49768 0.307788 0.521479 RAD 0.00617284 + txt002 + SPHERE CENTER 0.484316 0.321677 0.506047 RAD 0.00617284 + txt002 + SPHERE CENTER 0.478764 0.297816 0.509133 RAD 0.00617284 + txt002 + SPHERE CENTER 0.512708 0.290358 0.512531 RAD 0.00617284 + txt002 + SPHERE CENTER 0.493791 0.280387 0.500186 RAD 0.00617284 + txt002 + SPHERE CENTER 0.51437 0.286818 0.488152 RAD 0.00617284 + txt002 + SPHERE CENTER 0.518736 0.271262 0.399581 RAD 0.0185185 + txt002 + SPHERE CENTER 0.539811 0.274878 0.387235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.520873 0.290418 0.384149 RAD 0.00617284 + txt002 + SPHERE CENTER 0.533373 0.290264 0.405442 RAD 0.00617284 + txt002 + SPHERE CENTER 0.537674 0.255722 0.402668 RAD 0.00617284 + txt002 + SPHERE CENTER 0.531235 0.271108 0.420874 RAD 0.00617284 + txt002 + SPHERE CENTER 0.516598 0.252106 0.415013 RAD 0.00617284 + txt002 + SPHERE CENTER 0.525174 0.255876 0.381374 RAD 0.00617284 + txt002 + SPHERE CENTER 0.504099 0.25226 0.39372 RAD 0.00617284 + txt002 + SPHERE CENTER 0.506236 0.271416 0.378288 RAD 0.00617284 + txt002 + SPHERE CENTER 0.488495 0.241021 0.460062 RAD 0.0185185 + txt002 + SPHERE CENTER 0.50716 0.230587 0.472408 RAD 0.00617284 + txt002 + SPHERE CENTER 0.51153 0.24936 0.456976 RAD 0.00617284 + txt002 + SPHERE CENTER 0.499694 0.253381 0.478269 RAD 0.00617284 + txt002 + SPHERE CENTER 0.484125 0.222248 0.475494 RAD 0.00617284 + txt002 + SPHERE CENTER 0.476659 0.245042 0.481355 RAD 0.00617284 + txt002 + SPHERE CENTER 0.46546 0.232683 0.463149 RAD 0.00617284 + txt002 + SPHERE CENTER 0.495961 0.218227 0.454201 RAD 0.00617284 + txt002 + SPHERE CENTER 0.477296 0.228661 0.441856 RAD 0.00617284 + txt002 + SPHERE CENTER 0.500331 0.237 0.438769 RAD 0.00617284 + txt002 + SPHERE CENTER 0.450996 0.241483 0.396183 RAD 0.0185185 + txt002 + SPHERE CENTER 0.455172 0.217147 0.396183 RAD 0.00617284 + txt002 + SPHERE CENTER 0.472226 0.232599 0.40513 RAD 0.00617284 + txt002 + SPHERE CENTER 0.45115 0.228983 0.417476 RAD 0.00617284 + txt002 + SPHERE CENTER 0.433942 0.226031 0.387235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.429921 0.237867 0.408529 RAD 0.00617284 + txt002 + SPHERE CENTER 0.429767 0.250367 0.387235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.455018 0.229647 0.37489 RAD 0.00617284 + txt002 + SPHERE CENTER 0.450842 0.253983 0.37489 RAD 0.00617284 + txt002 + SPHERE CENTER 0.472072 0.245099 0.383837 RAD 0.00617284 + txt002 + SPHERE CENTER 0.304709 0.461844 0.43322 RAD 0.0555556 + txt002 + SPHERE CENTER 0.33495 0.492085 0.372739 RAD 0.0185185 + txt002 + SPHERE CENTER 0.33495 0.492085 0.348047 RAD 0.00617284 + txt002 + SPHERE CENTER 0.331334 0.471009 0.360393 RAD 0.00617284 + txt002 + SPHERE CENTER 0.313874 0.488469 0.360393 RAD 0.00617284 + txt002 + SPHERE CENTER 0.338566 0.51316 0.360393 RAD 0.00617284 + txt002 + SPHERE CENTER 0.31749 0.509544 0.372739 RAD 0.00617284 + txt002 + SPHERE CENTER 0.338566 0.51316 0.385084 RAD 0.00617284 + txt002 + SPHERE CENTER 0.356025 0.495701 0.360393 RAD 0.00617284 + txt002 + SPHERE CENTER 0.356025 0.495701 0.385084 RAD 0.00617284 + txt002 + SPHERE CENTER 0.352409 0.474625 0.372739 RAD 0.00617284 + txt002 + SPHERE CENTER 0.368397 0.435193 0.406378 RAD 0.0185185 + txt002 + SPHERE CENTER 0.389015 0.440864 0.394032 RAD 0.00617284 + txt002 + SPHERE CENTER 0.367697 0.451857 0.388171 RAD 0.00617284 + txt002 + SPHERE CENTER 0.37895 0.457301 0.409464 RAD 0.00617284 + txt002 + SPHERE CENTER 0.389715 0.4242 0.412239 RAD 0.00617284 + txt002 + SPHERE CENTER 0.37965 0.440637 0.427671 RAD 0.00617284 + txt002 + SPHERE CENTER 0.369098 0.418529 0.424584 RAD 0.00617284 + txt002 + SPHERE CENTER 0.378463 0.418755 0.390945 RAD 0.00617284 + txt002 + SPHERE CENTER 0.357845 0.413085 0.403291 RAD 0.00617284 + txt002 + SPHERE CENTER 0.357145 0.429748 0.385084 RAD 0.00617284 + txt002 + SPHERE CENTER 0.305171 0.424345 0.369341 RAD 0.0185185 + txt002 + SPHERE CENTER 0.315605 0.40568 0.356995 RAD 0.00617284 + txt002 + SPHERE CENTER 0.329161 0.419383 0.372427 RAD 0.00617284 + txt002 + SPHERE CENTER 0.312107 0.403931 0.381374 RAD 0.00617284 + txt002 + SPHERE CENTER 0.291616 0.410643 0.353908 RAD 0.00617284 + txt002 + SPHERE CENTER 0.288117 0.408893 0.378288 RAD 0.00617284 + txt002 + SPHERE CENTER 0.281181 0.429307 0.366254 RAD 0.00617284 + txt002 + SPHERE CENTER 0.30867 0.426095 0.344961 RAD 0.00617284 + txt002 + SPHERE CENTER 0.298235 0.444759 0.357307 RAD 0.00617284 + txt002 + SPHERE CENTER 0.322225 0.439797 0.360393 RAD 0.00617284 + txt002 + SPHERE CENTER 0.271262 0.518736 0.399581 RAD 0.0185185 + txt002 + SPHERE CENTER 0.274878 0.539811 0.387235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.290264 0.533373 0.405442 RAD 0.00617284 + txt002 + SPHERE CENTER 0.290418 0.520873 0.384149 RAD 0.00617284 + txt002 + SPHERE CENTER 0.255876 0.525174 0.381374 RAD 0.00617284 + txt002 + SPHERE CENTER 0.271416 0.506236 0.378288 RAD 0.00617284 + txt002 + SPHERE CENTER 0.25226 0.504099 0.39372 RAD 0.00617284 + txt002 + SPHERE CENTER 0.255722 0.537674 0.402668 RAD 0.00617284 + txt002 + SPHERE CENTER 0.252106 0.516598 0.415013 RAD 0.00617284 + txt002 + SPHERE CENTER 0.271108 0.531235 0.420874 RAD 0.00617284 + txt002 + SPHERE CENTER 0.241483 0.450996 0.396183 RAD 0.0185185 + txt002 + SPHERE CENTER 0.217147 0.455172 0.396183 RAD 0.00617284 + txt002 + SPHERE CENTER 0.228983 0.45115 0.417476 RAD 0.00617284 + txt002 + SPHERE CENTER 0.232599 0.472226 0.40513 RAD 0.00617284 + txt002 + SPHERE CENTER 0.229647 0.455018 0.37489 RAD 0.00617284 + txt002 + SPHERE CENTER 0.245099 0.472072 0.383837 RAD 0.00617284 + txt002 + SPHERE CENTER 0.253983 0.450842 0.37489 RAD 0.00617284 + txt002 + SPHERE CENTER 0.226031 0.433942 0.387235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.250367 0.429767 0.387235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.237867 0.429921 0.408529 RAD 0.00617284 + txt002 + SPHERE CENTER 0.241021 0.488495 0.460062 RAD 0.0185185 + txt002 + SPHERE CENTER 0.230587 0.50716 0.472408 RAD 0.00617284 + txt002 + SPHERE CENTER 0.253381 0.499694 0.478269 RAD 0.00617284 + txt002 + SPHERE CENTER 0.24936 0.51153 0.456976 RAD 0.00617284 + txt002 + SPHERE CENTER 0.218227 0.495961 0.454201 RAD 0.00617284 + txt002 + SPHERE CENTER 0.237 0.500331 0.438769 RAD 0.00617284 + txt002 + SPHERE CENTER 0.228661 0.477296 0.441856 RAD 0.00617284 + txt002 + SPHERE CENTER 0.222248 0.484125 0.475494 RAD 0.00617284 + txt002 + SPHERE CENTER 0.232683 0.46546 0.463149 RAD 0.00617284 + txt002 + SPHERE CENTER 0.245042 0.476659 0.481355 RAD 0.00617284 + txt002 + SPHERE CENTER 0.334488 0.529584 0.436618 RAD 0.0185185 + txt002 + SPHERE CENTER 0.347572 0.546497 0.424272 RAD 0.00617284 + txt002 + SPHERE CENTER 0.352406 0.522481 0.421186 RAD 0.00617284 + txt002 + SPHERE CENTER 0.331508 0.532117 0.412239 RAD 0.00617284 + txt002 + SPHERE CENTER 0.329654 0.5536 0.439705 RAD 0.00617284 + txt002 + SPHERE CENTER 0.313589 0.53922 0.427671 RAD 0.00617284 + txt002 + SPHERE CENTER 0.31657 0.536686 0.45205 RAD 0.00617284 + txt002 + SPHERE CENTER 0.350552 0.543964 0.448652 RAD 0.00617284 + txt002 + SPHERE CENTER 0.337468 0.52705 0.460998 RAD 0.00617284 + txt002 + SPHERE CENTER 0.355387 0.519948 0.445566 RAD 0.00617284 + txt002 + SPHERE CENTER 0.304247 0.499343 0.497099 RAD 0.0185185 + txt002 + SPHERE CENTER 0.314219 0.518259 0.509445 RAD 0.00617284 + txt002 + SPHERE CENTER 0.328108 0.504895 0.494013 RAD 0.00617284 + txt002 + SPHERE CENTER 0.310678 0.519922 0.485065 RAD 0.00617284 + txt002 + SPHERE CENTER 0.290358 0.512708 0.512531 RAD 0.00617284 + txt002 + SPHERE CENTER 0.286818 0.51437 0.488152 RAD 0.00617284 + txt002 + SPHERE CENTER 0.280387 0.493791 0.500186 RAD 0.00617284 + txt002 + SPHERE CENTER 0.307788 0.49768 0.521479 RAD 0.00617284 + txt002 + SPHERE CENTER 0.297816 0.478764 0.509133 RAD 0.00617284 + txt002 + SPHERE CENTER 0.321677 0.484316 0.506047 RAD 0.00617284 + txt002 + SPHERE CENTER 0.367935 0.472692 0.470257 RAD 0.0185185 + txt002 + SPHERE CENTER 0.389488 0.48474 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER 0.379669 0.477004 0.448964 RAD 0.00617284 + txt002 + SPHERE CENTER 0.369235 0.495668 0.46131 RAD 0.00617284 + txt002 + SPHERE CENTER 0.377754 0.480429 0.49155 RAD 0.00617284 + txt002 + SPHERE CENTER 0.357501 0.491357 0.482603 RAD 0.00617284 + txt002 + SPHERE CENTER 0.356202 0.46838 0.49155 RAD 0.00617284 + txt002 + SPHERE CENTER 0.388188 0.461764 0.479204 RAD 0.00617284 + txt002 + SPHERE CENTER 0.366636 0.449715 0.479204 RAD 0.00617284 + txt002 + SPHERE CENTER 0.37837 0.454027 0.457911 RAD 0.00617284 + txt002 + SPHERE CENTER 0.230635 0.38777 0.729516 RAD 0.0555556 + txt002 + SPHERE CENTER 0.2506 0.446614 0.769837 RAD 0.0185185 + txt002 + SPHERE CENTER 0.264242 0.467193 0.770086 RAD 0.00617284 + txt002 + SPHERE CENTER 0.272442 0.447086 0.758332 RAD 0.00617284 + txt002 + SPHERE CENTER 0.253384 0.459832 0.749168 RAD 0.00617284 + txt002 + SPHERE CENTER 0.2424 0.46672 0.781591 RAD 0.00617284 + txt002 + SPHERE CENTER 0.231541 0.459359 0.760673 RAD 0.00617284 + txt002 + SPHERE CENTER 0.228758 0.446141 0.781342 RAD 0.00617284 + txt002 + SPHERE CENTER 0.261459 0.453974 0.790755 RAD 0.00617284 + txt002 + SPHERE CENTER 0.247817 0.433396 0.790506 RAD 0.00617284 + txt002 + SPHERE CENTER 0.269659 0.433868 0.779001 RAD 0.00617284 + txt002 + SPHERE CENTER 0.301839 0.407906 0.732914 RAD 0.0185185 + txt002 + SPHERE CENTER 0.319874 0.420236 0.72141 RAD 0.00617284 + txt002 + SPHERE CENTER 0.303021 0.407886 0.708251 RAD 0.00617284 + txt002 + SPHERE CENTER 0.296625 0.428474 0.720288 RAD 0.00617284 + txt002 + SPHERE CENTER 0.318692 0.420256 0.746073 RAD 0.00617284 + txt002 + SPHERE CENTER 0.295442 0.428494 0.744951 RAD 0.00617284 + txt002 + SPHERE CENTER 0.300656 0.407926 0.757577 RAD 0.00617284 + txt002 + SPHERE CENTER 0.325088 0.399668 0.734036 RAD 0.00617284 + txt002 + SPHERE CENTER 0.307053 0.387338 0.745541 RAD 0.00617284 + txt002 + SPHERE CENTER 0.308235 0.387318 0.720878 RAD 0.00617284 + txt002 + SPHERE CENTER 0.253236 0.449775 0.695877 RAD 0.0185185 + txt002 + SPHERE CENTER 0.263032 0.459076 0.675209 RAD 0.00617284 + txt002 + SPHERE CENTER 0.270029 0.436804 0.683251 RAD 0.00617284 + txt002 + SPHERE CENTER 0.247378 0.440021 0.673964 RAD 0.00617284 + txt002 + SPHERE CENTER 0.246239 0.472047 0.687835 RAD 0.00617284 + txt002 + SPHERE CENTER 0.230585 0.452992 0.68659 RAD 0.00617284 + txt002 + SPHERE CENTER 0.236443 0.462746 0.708504 RAD 0.00617284 + txt002 + SPHERE CENTER 0.26889 0.468829 0.697123 RAD 0.00617284 + txt002 + SPHERE CENTER 0.259094 0.459528 0.717791 RAD 0.00617284 + txt002 + SPHERE CENTER 0.275887 0.446557 0.705165 RAD 0.00617284 + txt002 + SPHERE CENTER 0.179397 0.426478 0.766439 RAD 0.0185185 + txt002 + SPHERE CENTER 0.174744 0.447688 0.778193 RAD 0.00617284 + txt002 + SPHERE CENTER 0.197172 0.437457 0.779597 RAD 0.00617284 + txt002 + SPHERE CENTER 0.1895 0.447523 0.758396 RAD 0.00617284 + txt002 + SPHERE CENTER 0.156968 0.436708 0.765035 RAD 0.00617284 + txt002 + SPHERE CENTER 0.171724 0.436544 0.745238 RAD 0.00617284 + txt002 + SPHERE CENTER 0.161621 0.415499 0.753281 RAD 0.00617284 + txt002 + SPHERE CENTER 0.164641 0.426642 0.786236 RAD 0.00617284 + txt002 + SPHERE CENTER 0.169293 0.405432 0.774481 RAD 0.00617284 + txt002 + SPHERE CENTER 0.187069 0.416412 0.787639 RAD 0.00617284 + txt002 + SPHERE CENTER 0.182032 0.429639 0.692479 RAD 0.0185185 + txt002 + SPHERE CENTER 0.177682 0.45215 0.683315 RAD 0.00617284 + txt002 + SPHERE CENTER 0.190087 0.449636 0.704516 RAD 0.00617284 + txt002 + SPHERE CENTER 0.200611 0.44299 0.683192 RAD 0.00617284 + txt002 + SPHERE CENTER 0.169628 0.432153 0.671279 RAD 0.00617284 + txt002 + SPHERE CENTER 0.192556 0.422992 0.671155 RAD 0.00617284 + txt002 + SPHERE CENTER 0.173978 0.409641 0.680442 RAD 0.00617284 + txt002 + SPHERE CENTER 0.159104 0.438799 0.692603 RAD 0.00617284 + txt002 + SPHERE CENTER 0.163454 0.416288 0.701767 RAD 0.00617284 + txt002 + SPHERE CENTER 0.171508 0.436286 0.713804 RAD 0.00617284 + txt002 + SPHERE CENTER 0.159431 0.367634 0.726118 RAD 0.0185185 + txt002 + SPHERE CENTER 0.13761 0.368692 0.737623 RAD 0.00617284 + txt002 + SPHERE CENTER 0.158434 0.366998 0.750781 RAD 0.00617284 + txt002 + SPHERE CENTER 0.153102 0.387887 0.738744 RAD 0.00617284 + txt002 + SPHERE CENTER 0.138607 0.369329 0.71296 RAD 0.00617284 + txt002 + SPHERE CENTER 0.154099 0.388523 0.714081 RAD 0.00617284 + txt002 + SPHERE CENTER 0.160429 0.36827 0.701455 RAD 0.00617284 + txt002 + SPHERE CENTER 0.14394 0.34844 0.724997 RAD 0.00617284 + txt002 + SPHERE CENTER 0.165761 0.347381 0.713492 RAD 0.00617284 + txt002 + SPHERE CENTER 0.164764 0.346745 0.738155 RAD 0.00617284 + txt002 + SPHERE CENTER 0.227999 0.384609 0.803476 RAD 0.0185185 + txt002 + SPHERE CENTER 0.237348 0.393812 0.824394 RAD 0.00617284 + txt002 + SPHERE CENTER 0.251829 0.390976 0.804597 RAD 0.00617284 + txt002 + SPHERE CENTER 0.234368 0.408432 0.804721 RAD 0.00617284 + txt002 + SPHERE CENTER 0.213518 0.387445 0.823273 RAD 0.00617284 + txt002 + SPHERE CENTER 0.210538 0.402066 0.8036 RAD 0.00617284 + txt002 + SPHERE CENTER 0.204169 0.378242 0.802355 RAD 0.00617284 + txt002 + SPHERE CENTER 0.23098 0.369989 0.823149 RAD 0.00617284 + txt002 + SPHERE CENTER 0.221631 0.360786 0.802231 RAD 0.00617284 + txt002 + SPHERE CENTER 0.245461 0.367152 0.803352 RAD 0.00617284 + txt002 + SPHERE CENTER 0.208034 0.325765 0.763155 RAD 0.0185185 + txt002 + SPHERE CENTER 0.209548 0.312342 0.783824 RAD 0.00617284 + txt002 + SPHERE CENTER 0.229235 0.324887 0.775781 RAD 0.00617284 + txt002 + SPHERE CENTER 0.209827 0.337 0.785069 RAD 0.00617284 + txt002 + SPHERE CENTER 0.188347 0.31322 0.771198 RAD 0.00617284 + txt002 + SPHERE CENTER 0.188626 0.337878 0.772443 RAD 0.00617284 + txt002 + SPHERE CENTER 0.186834 0.326643 0.750529 RAD 0.00617284 + txt002 + SPHERE CENTER 0.207755 0.301107 0.76191 RAD 0.00617284 + txt002 + SPHERE CENTER 0.206242 0.31453 0.741241 RAD 0.00617284 + txt002 + SPHERE CENTER 0.227442 0.313652 0.753867 RAD 0.00617284 + txt002 + SPHERE CENTER 0.279238 0.345901 0.766553 RAD 0.0185185 + txt002 + SPHERE CENTER 0.302145 0.344931 0.775717 RAD 0.00617284 + txt002 + SPHERE CENTER 0.297823 0.356827 0.754517 RAD 0.00617284 + txt002 + SPHERE CENTER 0.289691 0.366251 0.775841 RAD 0.00617284 + txt002 + SPHERE CENTER 0.28356 0.334005 0.787754 RAD 0.00617284 + txt002 + SPHERE CENTER 0.271106 0.355325 0.787878 RAD 0.00617284 + txt002 + SPHERE CENTER 0.260653 0.334975 0.77859 RAD 0.00617284 + txt002 + SPHERE CENTER 0.291692 0.324581 0.766429 RAD 0.00617284 + txt002 + SPHERE CENTER 0.268785 0.325551 0.757266 RAD 0.00617284 + txt002 + SPHERE CENTER 0.28737 0.336477 0.745229 RAD 0.00617284 + txt002 + SPHERE CENTER 0.115031 0.4293 0.544331 RAD 0.0555556 + txt002 + SPHERE CENTER 0.102505 0.502308 0.544331 RAD 0.0185185 + txt002 + SPHERE CENTER 0.110567 0.524146 0.536101 RAD 0.00617284 + txt002 + SPHERE CENTER 0.126738 0.506465 0.542066 RAD 0.00617284 + txt002 + SPHERE CENTER 0.112687 0.504055 0.521905 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0863343 0.519988 0.538366 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0884544 0.499897 0.524171 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0782715 0.49815 0.546597 RAD 0.00617284 + txt002 + SPHERE CENTER 0.100385 0.522399 0.558526 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0923218 0.500561 0.566757 RAD 0.00617284 + txt002 + SPHERE CENTER 0.116555 0.504718 0.564491 RAD 0.00617284 + txt002 + SPHERE CENTER 0.160392 0.474661 0.581368 RAD 0.0185185 + txt002 + SPHERE CENTER 0.177777 0.492047 0.579103 RAD 0.00617284 + txt002 + SPHERE CENTER 0.176681 0.473492 0.56285 RAD 0.00617284 + txt002 + SPHERE CENTER 0.159222 0.490951 0.56285 RAD 0.00617284 + txt002 + SPHERE CENTER 0.161488 0.493217 0.597621 RAD 0.00617284 + txt002 + SPHERE CENTER 0.142932 0.492121 0.581368 RAD 0.00617284 + txt002 + SPHERE CENTER 0.144102 0.475831 0.599887 RAD 0.00617284 + txt002 + SPHERE CENTER 0.178947 0.475757 0.597621 RAD 0.00617284 + txt002 + SPHERE CENTER 0.161561 0.458371 0.599887 RAD 0.00617284 + txt002 + SPHERE CENTER 0.177851 0.457202 0.581368 RAD 0.00617284 + txt002 + SPHERE CENTER 0.160392 0.474661 0.507294 RAD 0.0185185 + txt002 + SPHERE CENTER 0.167697 0.481967 0.484868 RAD 0.00617284 + txt002 + SPHERE CENTER 0.161561 0.458371 0.488775 RAD 0.00617284 + txt002 + SPHERE CENTER 0.144102 0.475831 0.488775 RAD 0.00617284 + txt002 + SPHERE CENTER 0.166528 0.498257 0.503387 RAD 0.00617284 + txt002 + SPHERE CENTER 0.142932 0.492121 0.507294 RAD 0.00617284 + txt002 + SPHERE CENTER 0.159222 0.490951 0.525813 RAD 0.00617284 + txt002 + SPHERE CENTER 0.183987 0.480797 0.503387 RAD 0.00617284 + txt002 + SPHERE CENTER 0.176681 0.473492 0.525813 RAD 0.00617284 + txt002 + SPHERE CENTER 0.177851 0.457202 0.507294 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0571437 0.456947 0.507294 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0450372 0.477623 0.501329 RAD 0.00617284 + txt002 + SPHERE CENTER 0.055591 0.475469 0.523547 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0696413 0.47788 0.503387 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0465898 0.4591 0.485076 RAD 0.00617284 + txt002 + SPHERE CENTER 0.071194 0.459357 0.487134 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0586963 0.438424 0.491041 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0325396 0.45669 0.505236 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0446461 0.436013 0.511201 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0430934 0.454536 0.527454 RAD 0.00617284 + txt002 + SPHERE CENTER 0.115031 0.4293 0.470257 RAD 0.0185185 + txt002 + SPHERE CENTER 0.10495 0.439381 0.450097 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0911807 0.435691 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER 0.10864 0.45315 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER 0.128801 0.43299 0.450097 RAD 0.00617284 + txt002 + SPHERE CENTER 0.13249 0.44676 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER 0.138881 0.42291 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER 0.111341 0.415531 0.450097 RAD 0.00617284 + txt002 + SPHERE CENTER 0.121421 0.40545 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0975713 0.411841 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0696698 0.383939 0.507294 RAD 0.0185185 + txt002 + SPHERE CENTER 0.052284 0.366554 0.509559 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0708393 0.36765 0.525813 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0533799 0.385109 0.525813 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0511144 0.382844 0.491041 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0522103 0.401399 0.507294 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0685002 0.400229 0.488775 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0685739 0.365384 0.491041 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0859596 0.38277 0.488775 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0871292 0.36648 0.507294 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0571437 0.456947 0.581368 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0493251 0.475575 0.595564 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0725262 0.467381 0.597621 RAD 0.00617284 + txt002 + SPHERE CENTER 0.06557 0.479825 0.577461 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0339426 0.465141 0.57931 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0501875 0.46939 0.561208 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0417612 0.446512 0.565115 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0408988 0.452697 0.599471 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0487174 0.434069 0.585275 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0640999 0.444504 0.601529 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0696698 0.383939 0.581368 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0623642 0.376634 0.603794 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0859596 0.38277 0.599887 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0685002 0.400229 0.599887 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0460743 0.377803 0.585275 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0522103 0.401399 0.581368 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0533799 0.385109 0.56285 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0635337 0.360344 0.585275 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0708393 0.36765 0.56285 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0871292 0.36648 0.581368 RAD 0.00617284 + txt002 + SPHERE CENTER 0.115031 0.4293 0.618405 RAD 0.0185185 + txt002 + SPHERE CENTER 0.125111 0.439381 0.638566 RAD 0.00617284 + txt002 + SPHERE CENTER 0.138881 0.435691 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER 0.121421 0.45315 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER 0.101261 0.43299 0.638566 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0975713 0.44676 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0911807 0.42291 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER 0.11872 0.415531 0.638566 RAD 0.00617284 + txt002 + SPHERE CENTER 0.10864 0.40545 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER 0.13249 0.411841 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER 0.082487 0.239622 0.655442 RAD 0.0555556 + txt002 + SPHERE CENTER 0.0438957 0.258053 0.715923 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0426858 0.273525 0.735128 RAD 0.00617284 + txt002 + SPHERE CENTER 0.064638 0.265928 0.726759 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0510334 0.281546 0.713318 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0219434 0.26565 0.724292 RAD 0.00617284 + txt002 + SPHERE CENTER 0.030291 0.273671 0.702483 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0231533 0.250178 0.705088 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0355481 0.250032 0.737733 RAD 0.00617284 + txt002 + SPHERE CENTER 0.036758 0.23456 0.718528 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0575003 0.242434 0.729364 RAD 0.00617284 + txt002 + SPHERE CENTER 0.117687 0.252557 0.719322 RAD 0.0185185 + txt002 + SPHERE CENTER 0.135677 0.265544 0.730157 RAD 0.00617284 + txt002 + SPHERE CENTER 0.138361 0.25778 0.706872 RAD 0.00617284 + txt002 + SPHERE CENTER 0.12224 0.275732 0.71212 RAD 0.00617284 + txt002 + SPHERE CENTER 0.115003 0.26032 0.742607 RAD 0.00617284 + txt002 + SPHERE CENTER 0.101567 0.270508 0.72457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.097014 0.247334 0.731771 RAD 0.00617284 + txt002 + SPHERE CENTER 0.131123 0.242369 0.737359 RAD 0.00617284 + txt002 + SPHERE CENTER 0.113134 0.229382 0.726523 RAD 0.00617284 + txt002 + SPHERE CENTER 0.133808 0.234605 0.714074 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0863845 0.308551 0.682285 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0971427 0.330622 0.67968 RAD 0.00617284 + txt002 + SPHERE CENTER 0.109956 0.310023 0.675083 RAD 0.00617284 + txt002 + SPHERE CENTER 0.091905 0.317013 0.659755 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0735708 0.329151 0.686881 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0683331 0.315541 0.666956 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0628126 0.30708 0.689486 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0916222 0.322161 0.702209 RAD 0.00617284 + txt002 + SPHERE CENTER 0.080864 0.30009 0.704814 RAD 0.00617284 + txt002 + SPHERE CENTER 0.104436 0.301561 0.697613 RAD 0.00617284 + txt002 + SPHERE CENTER 0.00869528 0.245118 0.652044 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0110117 0.257416 0.660413 RAD 0.00617284 + txt002 + SPHERE CENTER 0.00823377 0.253319 0.675329 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0102865 0.269325 0.656641 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0105502 0.249215 0.637128 RAD 0.00617284 + txt002 + SPHERE CENTER 0.010748 0.261124 0.633356 RAD 0.00617284 + txt002 + SPHERE CENTER 0.00915679 0.236916 0.628759 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0126029 0.233209 0.655816 RAD 0.00617284 + txt002 + SPHERE CENTER 0.00710408 0.22091 0.647447 RAD 0.00617284 + txt002 + SPHERE CENTER 0.00664257 0.229111 0.670732 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0511841 0.295616 0.618405 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0555846 0.315856 0.604965 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0705987 0.309941 0.623653 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0705297 0.296292 0.603077 RAD 0.00617284 + txt002 + SPHERE CENTER 0.03617 0.301531 0.599717 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0511152 0.281968 0.597829 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0317696 0.281291 0.613157 RAD 0.00617284 + txt002 + SPHERE CENTER 0.036239 0.31518 0.620293 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0318385 0.29494 0.633733 RAD 0.00617284 + txt002 + SPHERE CENTER 0.051253 0.309265 0.638981 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0472866 0.226687 0.591563 RAD 0.0185185 + txt002 + SPHERE CENTER 0.025169 0.224935 0.580727 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0281502 0.217281 0.604012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0288111 0.241399 0.598764 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0443054 0.234341 0.568278 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0479475 0.250805 0.586315 RAD 0.00617284 + txt002 + SPHERE CENTER 0.066423 0.236092 0.579113 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0436445 0.210223 0.573526 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0657621 0.211974 0.584361 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0466257 0.202569 0.596811 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0399982 0.189123 0.689081 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0335228 0.179527 0.71089 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0567332 0.187058 0.707118 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0385291 0.203632 0.709006 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0167878 0.181593 0.692853 RAD 0.00617284 + txt002 + SPHERE CENTER 0.021794 0.205698 0.690969 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0232631 0.191189 0.671044 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0349919 0.165018 0.690965 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0414672 0.174615 0.669156 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0582023 0.172549 0.687193 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0785895 0.170692 0.6286 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0867911 0.147549 0.631205 RAD 0.00617284 + txt002 + SPHERE CENTER 0.101845 0.166573 0.635801 RAD 0.00617284 + txt002 + SPHERE CENTER 0.083121 0.161663 0.65113 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0635354 0.151669 0.624003 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0598652 0.165782 0.643928 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0553337 0.174812 0.621398 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0822597 0.156579 0.608675 RAD 0.00617284 + txt002 + SPHERE CENTER 0.074058 0.179722 0.60607 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0973138 0.175603 0.613272 RAD 0.00617284 + txt002 + SPHERE CENTER 0.11379 0.183628 0.692479 RAD 0.0185185 + txt002 + SPHERE CENTER 0.133336 0.176775 0.705919 RAD 0.00617284 + txt002 + SPHERE CENTER 0.136161 0.192663 0.687231 RAD 0.00617284 + txt002 + SPHERE CENTER 0.124499 0.199753 0.707807 RAD 0.00617284 + txt002 + SPHERE CENTER 0.110965 0.167739 0.711167 RAD 0.00617284 + txt002 + SPHERE CENTER 0.102127 0.190718 0.713055 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0914184 0.174592 0.697727 RAD 0.00617284 + txt002 + SPHERE CENTER 0.122627 0.160649 0.690591 RAD 0.00617284 + txt002 + SPHERE CENTER 0.103081 0.167502 0.677151 RAD 0.00617284 + txt002 + SPHERE CENTER 0.125452 0.176537 0.671903 RAD 0.00617284 + txt002 + SPHERE CENTER 0.38777 0.230635 0.729516 RAD 0.0555556 + txt002 + SPHERE CENTER 0.446614 0.2506 0.769837 RAD 0.0185185 + txt002 + SPHERE CENTER 0.467193 0.264242 0.770086 RAD 0.00617284 + txt002 + SPHERE CENTER 0.459832 0.253384 0.749168 RAD 0.00617284 + txt002 + SPHERE CENTER 0.447086 0.272442 0.758332 RAD 0.00617284 + txt002 + SPHERE CENTER 0.453974 0.261459 0.790755 RAD 0.00617284 + txt002 + SPHERE CENTER 0.433868 0.269659 0.779001 RAD 0.00617284 + txt002 + SPHERE CENTER 0.433396 0.247817 0.790506 RAD 0.00617284 + txt002 + SPHERE CENTER 0.46672 0.2424 0.781591 RAD 0.00617284 + txt002 + SPHERE CENTER 0.446141 0.228758 0.781342 RAD 0.00617284 + txt002 + SPHERE CENTER 0.459359 0.231541 0.760673 RAD 0.00617284 + txt002 + SPHERE CENTER 0.449775 0.253236 0.695877 RAD 0.0185185 + txt002 + SPHERE CENTER 0.459076 0.263032 0.675209 RAD 0.00617284 + txt002 + SPHERE CENTER 0.440021 0.247378 0.673964 RAD 0.00617284 + txt002 + SPHERE CENTER 0.436804 0.270029 0.683251 RAD 0.00617284 + txt002 + SPHERE CENTER 0.468829 0.26889 0.697123 RAD 0.00617284 + txt002 + SPHERE CENTER 0.446557 0.275887 0.705165 RAD 0.00617284 + txt002 + SPHERE CENTER 0.459528 0.259094 0.717791 RAD 0.00617284 + txt002 + SPHERE CENTER 0.472047 0.246239 0.687835 RAD 0.00617284 + txt002 + SPHERE CENTER 0.462746 0.236443 0.708504 RAD 0.00617284 + txt002 + SPHERE CENTER 0.452992 0.230585 0.68659 RAD 0.00617284 + txt002 + SPHERE CENTER 0.407906 0.301839 0.732914 RAD 0.0185185 + txt002 + SPHERE CENTER 0.420236 0.319874 0.72141 RAD 0.00617284 + txt002 + SPHERE CENTER 0.428474 0.296625 0.720288 RAD 0.00617284 + txt002 + SPHERE CENTER 0.407886 0.303021 0.708251 RAD 0.00617284 + txt002 + SPHERE CENTER 0.399668 0.325088 0.734036 RAD 0.00617284 + txt002 + SPHERE CENTER 0.387318 0.308235 0.720878 RAD 0.00617284 + txt002 + SPHERE CENTER 0.387338 0.307053 0.745541 RAD 0.00617284 + txt002 + SPHERE CENTER 0.420256 0.318692 0.746073 RAD 0.00617284 + txt002 + SPHERE CENTER 0.407926 0.300656 0.757577 RAD 0.00617284 + txt002 + SPHERE CENTER 0.428494 0.295442 0.744951 RAD 0.00617284 + txt002 + SPHERE CENTER 0.384609 0.227999 0.803476 RAD 0.0185185 + txt002 + SPHERE CENTER 0.393812 0.237348 0.824394 RAD 0.00617284 + txt002 + SPHERE CENTER 0.408432 0.234368 0.804721 RAD 0.00617284 + txt002 + SPHERE CENTER 0.390976 0.251829 0.804597 RAD 0.00617284 + txt002 + SPHERE CENTER 0.369989 0.23098 0.823149 RAD 0.00617284 + txt002 + SPHERE CENTER 0.367152 0.245461 0.803352 RAD 0.00617284 + txt002 + SPHERE CENTER 0.360786 0.221631 0.802231 RAD 0.00617284 + txt002 + SPHERE CENTER 0.387445 0.213518 0.823273 RAD 0.00617284 + txt002 + SPHERE CENTER 0.378242 0.204169 0.802355 RAD 0.00617284 + txt002 + SPHERE CENTER 0.402066 0.210538 0.8036 RAD 0.00617284 + txt002 + SPHERE CENTER 0.345901 0.279238 0.766553 RAD 0.0185185 + txt002 + SPHERE CENTER 0.344931 0.302145 0.775717 RAD 0.00617284 + txt002 + SPHERE CENTER 0.366251 0.289691 0.775841 RAD 0.00617284 + txt002 + SPHERE CENTER 0.356827 0.297823 0.754517 RAD 0.00617284 + txt002 + SPHERE CENTER 0.324581 0.291692 0.766429 RAD 0.00617284 + txt002 + SPHERE CENTER 0.336477 0.28737 0.745229 RAD 0.00617284 + txt002 + SPHERE CENTER 0.325551 0.268785 0.757266 RAD 0.00617284 + txt002 + SPHERE CENTER 0.334005 0.28356 0.787754 RAD 0.00617284 + txt002 + SPHERE CENTER 0.334975 0.260653 0.77859 RAD 0.00617284 + txt002 + SPHERE CENTER 0.355325 0.271106 0.787878 RAD 0.00617284 + txt002 + SPHERE CENTER 0.325765 0.208034 0.763155 RAD 0.0185185 + txt002 + SPHERE CENTER 0.312342 0.209548 0.783824 RAD 0.00617284 + txt002 + SPHERE CENTER 0.337 0.209827 0.785069 RAD 0.00617284 + txt002 + SPHERE CENTER 0.324887 0.229235 0.775781 RAD 0.00617284 + txt002 + SPHERE CENTER 0.301107 0.207755 0.76191 RAD 0.00617284 + txt002 + SPHERE CENTER 0.313652 0.227442 0.753867 RAD 0.00617284 + txt002 + SPHERE CENTER 0.31453 0.206242 0.741241 RAD 0.00617284 + txt002 + SPHERE CENTER 0.31322 0.188347 0.771198 RAD 0.00617284 + txt002 + SPHERE CENTER 0.326643 0.186834 0.750529 RAD 0.00617284 + txt002 + SPHERE CENTER 0.337878 0.188626 0.772443 RAD 0.00617284 + txt002 + SPHERE CENTER 0.426478 0.179397 0.766439 RAD 0.0185185 + txt002 + SPHERE CENTER 0.447688 0.174744 0.778193 RAD 0.00617284 + txt002 + SPHERE CENTER 0.447523 0.1895 0.758396 RAD 0.00617284 + txt002 + SPHERE CENTER 0.437457 0.197172 0.779597 RAD 0.00617284 + txt002 + SPHERE CENTER 0.426642 0.164641 0.786236 RAD 0.00617284 + txt002 + SPHERE CENTER 0.416412 0.187069 0.787639 RAD 0.00617284 + txt002 + SPHERE CENTER 0.405432 0.169293 0.774481 RAD 0.00617284 + txt002 + SPHERE CENTER 0.436708 0.156968 0.765035 RAD 0.00617284 + txt002 + SPHERE CENTER 0.415499 0.161621 0.753281 RAD 0.00617284 + txt002 + SPHERE CENTER 0.436544 0.171724 0.745238 RAD 0.00617284 + txt002 + SPHERE CENTER 0.367634 0.159431 0.726118 RAD 0.0185185 + txt002 + SPHERE CENTER 0.368692 0.13761 0.737623 RAD 0.00617284 + txt002 + SPHERE CENTER 0.387887 0.153102 0.738744 RAD 0.00617284 + txt002 + SPHERE CENTER 0.366998 0.158434 0.750781 RAD 0.00617284 + txt002 + SPHERE CENTER 0.34844 0.14394 0.724997 RAD 0.00617284 + txt002 + SPHERE CENTER 0.346745 0.164764 0.738155 RAD 0.00617284 + txt002 + SPHERE CENTER 0.347381 0.165761 0.713492 RAD 0.00617284 + txt002 + SPHERE CENTER 0.369329 0.138607 0.71296 RAD 0.00617284 + txt002 + SPHERE CENTER 0.36827 0.160429 0.701455 RAD 0.00617284 + txt002 + SPHERE CENTER 0.388523 0.154099 0.714081 RAD 0.00617284 + txt002 + SPHERE CENTER 0.429639 0.182032 0.692479 RAD 0.0185185 + txt002 + SPHERE CENTER 0.45215 0.177682 0.683315 RAD 0.00617284 + txt002 + SPHERE CENTER 0.44299 0.200611 0.683192 RAD 0.00617284 + txt002 + SPHERE CENTER 0.449636 0.190087 0.704516 RAD 0.00617284 + txt002 + SPHERE CENTER 0.438799 0.159104 0.692603 RAD 0.00617284 + txt002 + SPHERE CENTER 0.436286 0.171508 0.713804 RAD 0.00617284 + txt002 + SPHERE CENTER 0.416288 0.163454 0.701767 RAD 0.00617284 + txt002 + SPHERE CENTER 0.432153 0.169628 0.671279 RAD 0.00617284 + txt002 + SPHERE CENTER 0.409641 0.173978 0.680442 RAD 0.00617284 + txt002 + SPHERE CENTER 0.422992 0.192556 0.671155 RAD 0.00617284 + txt002 + SPHERE CENTER 0.239622 0.082487 0.655442 RAD 0.0555556 + txt002 + SPHERE CENTER 0.258053 0.0438957 0.715923 RAD 0.0185185 + txt002 + SPHERE CENTER 0.273525 0.0426858 0.735128 RAD 0.00617284 + txt002 + SPHERE CENTER 0.281546 0.0510334 0.713318 RAD 0.00617284 + txt002 + SPHERE CENTER 0.265928 0.064638 0.726759 RAD 0.00617284 + txt002 + SPHERE CENTER 0.250032 0.0355481 0.737733 RAD 0.00617284 + txt002 + SPHERE CENTER 0.242434 0.0575003 0.729364 RAD 0.00617284 + txt002 + SPHERE CENTER 0.23456 0.036758 0.718528 RAD 0.00617284 + txt002 + SPHERE CENTER 0.26565 0.0219434 0.724292 RAD 0.00617284 + txt002 + SPHERE CENTER 0.250178 0.0231533 0.705088 RAD 0.00617284 + txt002 + SPHERE CENTER 0.273671 0.030291 0.702483 RAD 0.00617284 + txt002 + SPHERE CENTER 0.308551 0.0863845 0.682285 RAD 0.0185185 + txt002 + SPHERE CENTER 0.330622 0.0971427 0.67968 RAD 0.00617284 + txt002 + SPHERE CENTER 0.317013 0.091905 0.659755 RAD 0.00617284 + txt002 + SPHERE CENTER 0.310023 0.109956 0.675083 RAD 0.00617284 + txt002 + SPHERE CENTER 0.322161 0.0916222 0.702209 RAD 0.00617284 + txt002 + SPHERE CENTER 0.301561 0.104436 0.697613 RAD 0.00617284 + txt002 + SPHERE CENTER 0.30009 0.080864 0.704814 RAD 0.00617284 + txt002 + SPHERE CENTER 0.329151 0.0735708 0.686881 RAD 0.00617284 + txt002 + SPHERE CENTER 0.30708 0.0628126 0.689486 RAD 0.00617284 + txt002 + SPHERE CENTER 0.315541 0.0683331 0.666956 RAD 0.00617284 + txt002 + SPHERE CENTER 0.252557 0.117687 0.719322 RAD 0.0185185 + txt002 + SPHERE CENTER 0.265544 0.135677 0.730157 RAD 0.00617284 + txt002 + SPHERE CENTER 0.275732 0.12224 0.71212 RAD 0.00617284 + txt002 + SPHERE CENTER 0.25778 0.138361 0.706872 RAD 0.00617284 + txt002 + SPHERE CENTER 0.242369 0.131123 0.737359 RAD 0.00617284 + txt002 + SPHERE CENTER 0.234605 0.133808 0.714074 RAD 0.00617284 + txt002 + SPHERE CENTER 0.229382 0.113134 0.726523 RAD 0.00617284 + txt002 + SPHERE CENTER 0.26032 0.115003 0.742607 RAD 0.00617284 + txt002 + SPHERE CENTER 0.247334 0.097014 0.731771 RAD 0.00617284 + txt002 + SPHERE CENTER 0.270508 0.101567 0.72457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.189123 0.0399982 0.689081 RAD 0.0185185 + txt002 + SPHERE CENTER 0.179527 0.0335228 0.71089 RAD 0.00617284 + txt002 + SPHERE CENTER 0.203632 0.0385291 0.709006 RAD 0.00617284 + txt002 + SPHERE CENTER 0.187058 0.0567332 0.707118 RAD 0.00617284 + txt002 + SPHERE CENTER 0.165018 0.0349919 0.690965 RAD 0.00617284 + txt002 + SPHERE CENTER 0.172549 0.0582023 0.687193 RAD 0.00617284 + txt002 + SPHERE CENTER 0.174615 0.0414672 0.669156 RAD 0.00617284 + txt002 + SPHERE CENTER 0.181593 0.0167878 0.692853 RAD 0.00617284 + txt002 + SPHERE CENTER 0.191189 0.0232631 0.671044 RAD 0.00617284 + txt002 + SPHERE CENTER 0.205698 0.021794 0.690969 RAD 0.00617284 + txt002 + SPHERE CENTER 0.183628 0.11379 0.692479 RAD 0.0185185 + txt002 + SPHERE CENTER 0.176775 0.133336 0.705919 RAD 0.00617284 + txt002 + SPHERE CENTER 0.199753 0.124499 0.707807 RAD 0.00617284 + txt002 + SPHERE CENTER 0.192663 0.136161 0.687231 RAD 0.00617284 + txt002 + SPHERE CENTER 0.160649 0.122627 0.690591 RAD 0.00617284 + txt002 + SPHERE CENTER 0.176537 0.125452 0.671903 RAD 0.00617284 + txt002 + SPHERE CENTER 0.167502 0.103081 0.677151 RAD 0.00617284 + txt002 + SPHERE CENTER 0.167739 0.110965 0.711167 RAD 0.00617284 + txt002 + SPHERE CENTER 0.174592 0.0914184 0.697727 RAD 0.00617284 + txt002 + SPHERE CENTER 0.190718 0.102127 0.713055 RAD 0.00617284 + txt002 + SPHERE CENTER 0.170692 0.0785895 0.6286 RAD 0.0185185 + txt002 + SPHERE CENTER 0.147549 0.0867911 0.631205 RAD 0.00617284 + txt002 + SPHERE CENTER 0.161663 0.083121 0.65113 RAD 0.00617284 + txt002 + SPHERE CENTER 0.166573 0.101845 0.635801 RAD 0.00617284 + txt002 + SPHERE CENTER 0.156579 0.0822597 0.608675 RAD 0.00617284 + txt002 + SPHERE CENTER 0.175603 0.0973138 0.613272 RAD 0.00617284 + txt002 + SPHERE CENTER 0.179722 0.074058 0.60607 RAD 0.00617284 + txt002 + SPHERE CENTER 0.151669 0.0635354 0.624003 RAD 0.00617284 + txt002 + SPHERE CENTER 0.174812 0.0553337 0.621398 RAD 0.00617284 + txt002 + SPHERE CENTER 0.165782 0.0598652 0.643928 RAD 0.00617284 + txt002 + SPHERE CENTER 0.245118 0.00869528 0.652044 RAD 0.0185185 + txt002 + SPHERE CENTER 0.257416 -0.0110117 0.660413 RAD 0.00617284 + txt002 + SPHERE CENTER 0.269325 0.0102865 0.656641 RAD 0.00617284 + txt002 + SPHERE CENTER 0.253319 0.00823377 0.675329 RAD 0.00617284 + txt002 + SPHERE CENTER 0.233209 -0.0126029 0.655816 RAD 0.00617284 + txt002 + SPHERE CENTER 0.229111 0.00664257 0.670732 RAD 0.00617284 + txt002 + SPHERE CENTER 0.22091 0.00710408 0.647447 RAD 0.00617284 + txt002 + SPHERE CENTER 0.249215 -0.0105502 0.637128 RAD 0.00617284 + txt002 + SPHERE CENTER 0.236916 0.00915679 0.628759 RAD 0.00617284 + txt002 + SPHERE CENTER 0.261124 0.010748 0.633356 RAD 0.00617284 + txt002 + SPHERE CENTER 0.226687 0.0472866 0.591563 RAD 0.0185185 + txt002 + SPHERE CENTER 0.224935 0.025169 0.580727 RAD 0.00617284 + txt002 + SPHERE CENTER 0.241399 0.0288111 0.598764 RAD 0.00617284 + txt002 + SPHERE CENTER 0.217281 0.0281502 0.604012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.210223 0.0436445 0.573526 RAD 0.00617284 + txt002 + SPHERE CENTER 0.202569 0.0466257 0.596811 RAD 0.00617284 + txt002 + SPHERE CENTER 0.211974 0.0657621 0.584361 RAD 0.00617284 + txt002 + SPHERE CENTER 0.234341 0.0443054 0.568278 RAD 0.00617284 + txt002 + SPHERE CENTER 0.236092 0.066423 0.579113 RAD 0.00617284 + txt002 + SPHERE CENTER 0.250805 0.0479475 0.586315 RAD 0.00617284 + txt002 + SPHERE CENTER 0.295616 0.0511841 0.618405 RAD 0.0185185 + txt002 + SPHERE CENTER 0.315856 0.0555846 0.604965 RAD 0.00617284 + txt002 + SPHERE CENTER 0.296292 0.0705297 0.603077 RAD 0.00617284 + txt002 + SPHERE CENTER 0.309941 0.0705987 0.623653 RAD 0.00617284 + txt002 + SPHERE CENTER 0.31518 0.036239 0.620293 RAD 0.00617284 + txt002 + SPHERE CENTER 0.309265 0.051253 0.638981 RAD 0.00617284 + txt002 + SPHERE CENTER 0.29494 0.0318385 0.633733 RAD 0.00617284 + txt002 + SPHERE CENTER 0.301531 0.03617 0.599717 RAD 0.00617284 + txt002 + SPHERE CENTER 0.281291 0.0317696 0.613157 RAD 0.00617284 + txt002 + SPHERE CENTER 0.281968 0.0511152 0.597829 RAD 0.00617284 + txt002 + SPHERE CENTER 0.4293 0.115031 0.544331 RAD 0.0555556 + txt002 + SPHERE CENTER 0.502308 0.102505 0.544331 RAD 0.0185185 + txt002 + SPHERE CENTER 0.524146 0.110567 0.536101 RAD 0.00617284 + txt002 + SPHERE CENTER 0.504055 0.112687 0.521905 RAD 0.00617284 + txt002 + SPHERE CENTER 0.506465 0.126738 0.542066 RAD 0.00617284 + txt002 + SPHERE CENTER 0.522399 0.100385 0.558526 RAD 0.00617284 + txt002 + SPHERE CENTER 0.504718 0.116555 0.564491 RAD 0.00617284 + txt002 + SPHERE CENTER 0.500561 0.0923218 0.566757 RAD 0.00617284 + txt002 + SPHERE CENTER 0.519988 0.0863343 0.538366 RAD 0.00617284 + txt002 + SPHERE CENTER 0.49815 0.0782715 0.546597 RAD 0.00617284 + txt002 + SPHERE CENTER 0.499897 0.0884544 0.524171 RAD 0.00617284 + txt002 + SPHERE CENTER 0.474661 0.160392 0.507294 RAD 0.0185185 + txt002 + SPHERE CENTER 0.481967 0.167697 0.484868 RAD 0.00617284 + txt002 + SPHERE CENTER 0.475831 0.144102 0.488775 RAD 0.00617284 + txt002 + SPHERE CENTER 0.458371 0.161561 0.488775 RAD 0.00617284 + txt002 + SPHERE CENTER 0.480797 0.183987 0.503387 RAD 0.00617284 + txt002 + SPHERE CENTER 0.457202 0.177851 0.507294 RAD 0.00617284 + txt002 + SPHERE CENTER 0.473492 0.176681 0.525813 RAD 0.00617284 + txt002 + SPHERE CENTER 0.498257 0.166528 0.503387 RAD 0.00617284 + txt002 + SPHERE CENTER 0.490951 0.159222 0.525813 RAD 0.00617284 + txt002 + SPHERE CENTER 0.492121 0.142932 0.507294 RAD 0.00617284 + txt002 + SPHERE CENTER 0.474661 0.160392 0.581368 RAD 0.0185185 + txt002 + SPHERE CENTER 0.492047 0.177777 0.579103 RAD 0.00617284 + txt002 + SPHERE CENTER 0.490951 0.159222 0.56285 RAD 0.00617284 + txt002 + SPHERE CENTER 0.473492 0.176681 0.56285 RAD 0.00617284 + txt002 + SPHERE CENTER 0.475757 0.178947 0.597621 RAD 0.00617284 + txt002 + SPHERE CENTER 0.457202 0.177851 0.581368 RAD 0.00617284 + txt002 + SPHERE CENTER 0.458371 0.161561 0.599887 RAD 0.00617284 + txt002 + SPHERE CENTER 0.493217 0.161488 0.597621 RAD 0.00617284 + txt002 + SPHERE CENTER 0.475831 0.144102 0.599887 RAD 0.00617284 + txt002 + SPHERE CENTER 0.492121 0.142932 0.581368 RAD 0.00617284 + txt002 + SPHERE CENTER 0.456947 0.0571437 0.581368 RAD 0.0185185 + txt002 + SPHERE CENTER 0.475575 0.0493251 0.595564 RAD 0.00617284 + txt002 + SPHERE CENTER 0.479825 0.06557 0.577461 RAD 0.00617284 + txt002 + SPHERE CENTER 0.467381 0.0725262 0.597621 RAD 0.00617284 + txt002 + SPHERE CENTER 0.452697 0.0408988 0.599471 RAD 0.00617284 + txt002 + SPHERE CENTER 0.444504 0.0640999 0.601529 RAD 0.00617284 + txt002 + SPHERE CENTER 0.434069 0.0487174 0.585275 RAD 0.00617284 + txt002 + SPHERE CENTER 0.465141 0.0339426 0.57931 RAD 0.00617284 + txt002 + SPHERE CENTER 0.446512 0.0417612 0.565115 RAD 0.00617284 + txt002 + SPHERE CENTER 0.46939 0.0501875 0.561208 RAD 0.00617284 + txt002 + SPHERE CENTER 0.4293 0.115031 0.618405 RAD 0.0185185 + txt002 + SPHERE CENTER 0.439381 0.125111 0.638566 RAD 0.00617284 + txt002 + SPHERE CENTER 0.45315 0.121421 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER 0.435691 0.138881 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER 0.415531 0.11872 0.638566 RAD 0.00617284 + txt002 + SPHERE CENTER 0.411841 0.13249 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER 0.40545 0.10864 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER 0.43299 0.101261 0.638566 RAD 0.00617284 + txt002 + SPHERE CENTER 0.42291 0.0911807 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER 0.44676 0.0975713 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER 0.383939 0.0696698 0.581368 RAD 0.0185185 + txt002 + SPHERE CENTER 0.376634 0.0623642 0.603794 RAD 0.00617284 + txt002 + SPHERE CENTER 0.400229 0.0685002 0.599887 RAD 0.00617284 + txt002 + SPHERE CENTER 0.38277 0.0859596 0.599887 RAD 0.00617284 + txt002 + SPHERE CENTER 0.360344 0.0635337 0.585275 RAD 0.00617284 + txt002 + SPHERE CENTER 0.36648 0.0871292 0.581368 RAD 0.00617284 + txt002 + SPHERE CENTER 0.36765 0.0708393 0.56285 RAD 0.00617284 + txt002 + SPHERE CENTER 0.377803 0.0460743 0.585275 RAD 0.00617284 + txt002 + SPHERE CENTER 0.385109 0.0533799 0.56285 RAD 0.00617284 + txt002 + SPHERE CENTER 0.401399 0.0522103 0.581368 RAD 0.00617284 + txt002 + SPHERE CENTER 0.456947 0.0571437 0.507294 RAD 0.0185185 + txt002 + SPHERE CENTER 0.477623 0.0450372 0.501329 RAD 0.00617284 + txt002 + SPHERE CENTER 0.47788 0.0696413 0.503387 RAD 0.00617284 + txt002 + SPHERE CENTER 0.475469 0.055591 0.523547 RAD 0.00617284 + txt002 + SPHERE CENTER 0.45669 0.0325396 0.505236 RAD 0.00617284 + txt002 + SPHERE CENTER 0.454536 0.0430934 0.527454 RAD 0.00617284 + txt002 + SPHERE CENTER 0.436013 0.0446461 0.511201 RAD 0.00617284 + txt002 + SPHERE CENTER 0.4591 0.0465898 0.485076 RAD 0.00617284 + txt002 + SPHERE CENTER 0.438424 0.0586963 0.491041 RAD 0.00617284 + txt002 + SPHERE CENTER 0.459357 0.071194 0.487134 RAD 0.00617284 + txt002 + SPHERE CENTER 0.383939 0.0696698 0.507294 RAD 0.0185185 + txt002 + SPHERE CENTER 0.366554 0.052284 0.509559 RAD 0.00617284 + txt002 + SPHERE CENTER 0.385109 0.0533799 0.525813 RAD 0.00617284 + txt002 + SPHERE CENTER 0.36765 0.0708393 0.525813 RAD 0.00617284 + txt002 + SPHERE CENTER 0.365384 0.0685739 0.491041 RAD 0.00617284 + txt002 + SPHERE CENTER 0.36648 0.0871292 0.507294 RAD 0.00617284 + txt002 + SPHERE CENTER 0.38277 0.0859596 0.488775 RAD 0.00617284 + txt002 + SPHERE CENTER 0.382844 0.0511144 0.491041 RAD 0.00617284 + txt002 + SPHERE CENTER 0.400229 0.0685002 0.488775 RAD 0.00617284 + txt002 + SPHERE CENTER 0.401399 0.0522103 0.507294 RAD 0.00617284 + txt002 + SPHERE CENTER 0.4293 0.115031 0.470257 RAD 0.0185185 + txt002 + SPHERE CENTER 0.41922 0.125111 0.450097 RAD 0.00617284 + txt002 + SPHERE CENTER 0.40545 0.121421 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER 0.42291 0.138881 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER 0.44307 0.11872 0.450097 RAD 0.00617284 + txt002 + SPHERE CENTER 0.44676 0.13249 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER 0.45315 0.10864 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER 0.425611 0.101261 0.450097 RAD 0.00617284 + txt002 + SPHERE CENTER 0.435691 0.0911807 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER 0.411841 0.0975713 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER 0.643951 0.172546 1.11022e-16 RAD 0.166667 + txt002 + SPHERE CENTER 0.802608 0.281471 -0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER 0.824035 0.30566 -0.177765 RAD 0.0185185 + txt002 + SPHERE CENTER 0.822021 0.302088 -0.202114 RAD 0.00617284 + txt002 + SPHERE CENTER 0.821938 0.282758 -0.186751 RAD 0.00617284 + txt002 + SPHERE CENTER 0.802598 0.298094 -0.187402 RAD 0.00617284 + txt002 + SPHERE CENTER 0.824119 0.32499 -0.193128 RAD 0.00617284 + txt002 + SPHERE CENTER 0.804695 0.320997 -0.178416 RAD 0.00617284 + txt002 + SPHERE CENTER 0.826132 0.328563 -0.16878 RAD 0.00617284 + txt002 + SPHERE CENTER 0.843459 0.309654 -0.192477 RAD 0.00617284 + txt002 + SPHERE CENTER 0.845472 0.313227 -0.168128 RAD 0.00617284 + txt002 + SPHERE CENTER 0.843375 0.290324 -0.177114 RAD 0.00617284 + txt002 + SPHERE CENTER 0.787796 0.241352 -0.171592 RAD 0.0185185 + txt002 + SPHERE CENTER 0.785699 0.218449 -0.180578 RAD 0.00617284 + txt002 + SPHERE CENTER 0.802677 0.22345 -0.163362 RAD 0.00617284 + txt002 + SPHERE CENTER 0.778718 0.223304 -0.157397 RAD 0.00617284 + txt002 + SPHERE CENTER 0.770818 0.236351 -0.188808 RAD 0.00617284 + txt002 + SPHERE CENTER 0.763837 0.241205 -0.165627 RAD 0.00617284 + txt002 + SPHERE CENTER 0.772915 0.259253 -0.179823 RAD 0.00617284 + txt002 + SPHERE CENTER 0.794777 0.236497 -0.194773 RAD 0.00617284 + txt002 + SPHERE CENTER 0.796874 0.2594 -0.185788 RAD 0.00617284 + txt002 + SPHERE CENTER 0.811756 0.241498 -0.177557 RAD 0.00617284 + txt002 + SPHERE CENTER 0.752156 0.305221 -0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER 0.741263 0.325175 -0.169507 RAD 0.00617284 + txt002 + SPHERE CENTER 0.747715 0.32493 -0.145675 RAD 0.00617284 + txt002 + SPHERE CENTER 0.765112 0.325981 -0.163165 RAD 0.00617284 + txt002 + SPHERE CENTER 0.745704 0.305466 -0.183703 RAD 0.00617284 + txt002 + SPHERE CENTER 0.769553 0.306272 -0.17736 RAD 0.00617284 + txt002 + SPHERE CENTER 0.756597 0.285513 -0.174066 RAD 0.00617284 + txt002 + SPHERE CENTER 0.728307 0.304415 -0.166213 RAD 0.00617284 + txt002 + SPHERE CENTER 0.7392 0.284462 -0.156576 RAD 0.00617284 + txt002 + SPHERE CENTER 0.734759 0.304171 -0.142381 RAD 0.00617284 + txt002 + SPHERE CENTER 0.838847 0.34578 -0.117284 RAD 0.0185185 + txt002 + SPHERE CENTER 0.851488 0.360404 -0.132647 RAD 0.00617284 + txt002 + SPHERE CENTER 0.853509 0.335865 -0.1345 RAD 0.00617284 + txt002 + SPHERE CENTER 0.832518 0.347059 -0.141116 RAD 0.00617284 + txt002 + SPHERE CENTER 0.836826 0.370319 -0.115431 RAD 0.00617284 + txt002 + SPHERE CENTER 0.817857 0.356973 -0.1239 RAD 0.00617284 + txt002 + SPHERE CENTER 0.824185 0.355695 -0.100068 RAD 0.00617284 + txt002 + SPHERE CENTER 0.857816 0.359125 -0.108814 RAD 0.00617284 + txt002 + SPHERE CENTER 0.845176 0.344501 -0.0934517 RAD 0.00617284 + txt002 + SPHERE CENTER 0.859838 0.334587 -0.110668 RAD 0.00617284 + txt002 + SPHERE CENTER 0.766968 0.345341 -0.099389 RAD 0.0185185 + txt002 + SPHERE CENTER 0.768944 0.369945 -0.10004 RAD 0.00617284 + txt002 + SPHERE CENTER 0.788341 0.356172 -0.093424 RAD 0.00617284 + txt002 + SPHERE CENTER 0.780624 0.356171 -0.116879 RAD 0.00617284 + txt002 + SPHERE CENTER 0.747572 0.359113 -0.106005 RAD 0.00617284 + txt002 + SPHERE CENTER 0.759252 0.34534 -0.122844 RAD 0.00617284 + txt002 + SPHERE CENTER 0.745596 0.33451 -0.105354 RAD 0.00617284 + txt002 + SPHERE CENTER 0.755289 0.359115 -0.0825505 RAD 0.00617284 + txt002 + SPHERE CENTER 0.753313 0.334511 -0.0818993 RAD 0.00617284 + txt002 + SPHERE CENTER 0.774685 0.345342 -0.0759343 RAD 0.00617284 + txt002 + SPHERE CENTER 0.817421 0.321591 -0.0506299 RAD 0.0185185 + txt002 + SPHERE CENTER 0.83071 0.340361 -0.0416443 RAD 0.00617284 + txt002 + SPHERE CENTER 0.840365 0.325527 -0.0588603 RAD 0.00617284 + txt002 + SPHERE CENTER 0.822249 0.341208 -0.0648253 RAD 0.00617284 + txt002 + SPHERE CENTER 0.807766 0.336425 -0.0334138 RAD 0.00617284 + txt002 + SPHERE CENTER 0.799305 0.337272 -0.0565949 RAD 0.00617284 + txt002 + SPHERE CENTER 0.794477 0.317654 -0.0423994 RAD 0.00617284 + txt002 + SPHERE CENTER 0.825882 0.320744 -0.0274488 RAD 0.00617284 + txt002 + SPHERE CENTER 0.812593 0.301973 -0.0364345 RAD 0.00617284 + txt002 + SPHERE CENTER 0.835537 0.30591 -0.0446649 RAD 0.00617284 + txt002 + SPHERE CENTER 0.874487 0.28191 -0.129006 RAD 0.0185185 + txt002 + SPHERE CENTER 0.891539 0.292033 -0.143718 RAD 0.00617284 + txt002 + SPHERE CENTER 0.868678 0.28812 -0.152187 RAD 0.00617284 + txt002 + SPHERE CENTER 0.872763 0.305711 -0.135349 RAD 0.00617284 + txt002 + SPHERE CENTER 0.897348 0.285824 -0.120537 RAD 0.00617284 + txt002 + SPHERE CENTER 0.878572 0.299501 -0.112168 RAD 0.00617284 + txt002 + SPHERE CENTER 0.880296 0.275701 -0.105825 RAD 0.00617284 + txt002 + SPHERE CENTER 0.893263 0.268233 -0.137375 RAD 0.00617284 + txt002 + SPHERE CENTER 0.876212 0.25811 -0.122663 RAD 0.00617284 + txt002 + SPHERE CENTER 0.870402 0.264319 -0.145845 RAD 0.00617284 + txt002 + SPHERE CENTER 0.853061 0.257721 -0.062352 RAD 0.0185185 + txt002 + SPHERE CENTER 0.87538 0.26204 -0.0527151 RAD 0.00617284 + txt002 + SPHERE CENTER 0.87108 0.266856 -0.0765474 RAD 0.00617284 + txt002 + SPHERE CENTER 0.860805 0.280934 -0.0590577 RAD 0.00617284 + txt002 + SPHERE CENTER 0.857361 0.252905 -0.0385197 RAD 0.00617284 + txt002 + SPHERE CENTER 0.842785 0.271799 -0.0448623 RAD 0.00617284 + txt002 + SPHERE CENTER 0.835041 0.248586 -0.0481565 RAD 0.00617284 + txt002 + SPHERE CENTER 0.867636 0.238827 -0.0560094 RAD 0.00617284 + txt002 + SPHERE CENTER 0.845317 0.234508 -0.0656463 RAD 0.00617284 + txt002 + SPHERE CENTER 0.863337 0.243643 -0.0798417 RAD 0.00617284 + txt002 + SPHERE CENTER 0.838248 0.217602 -0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER 0.860225 0.206363 -0.122182 RAD 0.00617284 + txt002 + SPHERE CENTER 0.858689 0.230102 -0.128798 RAD 0.00617284 + txt002 + SPHERE CENTER 0.854636 0.223536 -0.105343 RAD 0.00617284 + txt002 + SPHERE CENTER 0.839784 0.193863 -0.116217 RAD 0.00617284 + txt002 + SPHERE CENTER 0.834196 0.211035 -0.0993785 RAD 0.00617284 + txt002 + SPHERE CENTER 0.817808 0.205101 -0.116868 RAD 0.00617284 + txt002 + SPHERE CENTER 0.843837 0.200429 -0.139672 RAD 0.00617284 + txt002 + SPHERE CENTER 0.821861 0.211667 -0.140323 RAD 0.00617284 + txt002 + SPHERE CENTER 0.842301 0.224168 -0.146288 RAD 0.00617284 + txt002 + SPHERE CENTER 0.643951 0.172546 -0.222222 RAD 0.0555556 + txt002 + SPHERE CENTER 0.61371 0.202787 -0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER 0.61556 0.221097 -0.299164 RAD 0.00617284 + txt002 + SPHERE CENTER 0.621702 0.225035 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER 0.635958 0.210779 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER 0.607567 0.198849 -0.306292 RAD 0.00617284 + txt002 + SPHERE CENTER 0.627965 0.188531 -0.296959 RAD 0.00617284 + txt002 + SPHERE CENTER 0.605717 0.180539 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER 0.593312 0.213105 -0.292037 RAD 0.00617284 + txt002 + SPHERE CENTER 0.591462 0.194794 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER 0.599454 0.217042 -0.268448 RAD 0.00617284 + txt002 + SPHERE CENTER 0.5724 0.191718 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.556122 0.208861 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER 0.575596 0.203643 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.578791 0.215568 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.552927 0.196936 -0.236478 RAD 0.00617284 + txt002 + SPHERE CENTER 0.575596 0.203643 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.569205 0.179793 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.549732 0.185011 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER 0.56601 0.167868 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.569205 0.179793 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.624779 0.244096 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.631486 0.266765 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER 0.648629 0.250487 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.636704 0.247291 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.607636 0.260374 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER 0.612854 0.240901 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.600929 0.237705 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.619561 0.26357 -0.207967 RAD 0.00617284 + txt002 + SPHERE CENTER 0.612854 0.240901 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.636704 0.247291 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.68526 0.183615 -0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER 0.684921 0.190903 -0.306292 RAD 0.00617284 + txt002 + SPHERE CENTER 0.665787 0.178397 -0.296959 RAD 0.00617284 + txt002 + SPHERE CENTER 0.669989 0.201661 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER 0.704395 0.196121 -0.292037 RAD 0.00617284 + txt002 + SPHERE CENTER 0.689462 0.206879 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER 0.704733 0.188833 -0.268448 RAD 0.00617284 + txt002 + SPHERE CENTER 0.700193 0.172858 -0.299164 RAD 0.00617284 + txt002 + SPHERE CENTER 0.700531 0.165569 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER 0.681058 0.160351 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER 0.696329 0.224924 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.710584 0.23918 -0.236478 RAD 0.00617284 + txt002 + SPHERE CENTER 0.705059 0.216195 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.687599 0.233654 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.701855 0.24791 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER 0.678869 0.242384 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.687599 0.233654 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.719314 0.23045 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER 0.705059 0.216195 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.713788 0.207465 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.715501 0.153374 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.738169 0.160081 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER 0.718696 0.165299 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.721891 0.177224 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.734974 0.148156 -0.207967 RAD 0.00617284 + txt002 + SPHERE CENTER 0.718696 0.165299 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.712305 0.141449 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.731779 0.136231 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER 0.70911 0.129524 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.712305 0.141449 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.632882 0.131237 -0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER 0.634145 0.108412 -0.292037 RAD 0.00617284 + txt002 + SPHERE CENTER 0.650927 0.115965 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER 0.627664 0.111763 -0.268448 RAD 0.00617284 + txt002 + SPHERE CENTER 0.616099 0.123683 -0.299164 RAD 0.00617284 + txt002 + SPHERE CENTER 0.609618 0.127034 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER 0.614836 0.146508 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER 0.639363 0.127886 -0.306292 RAD 0.00617284 + txt002 + SPHERE CENTER 0.6381 0.15071 -0.296959 RAD 0.00617284 + txt002 + SPHERE CENTER 0.656145 0.135439 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER 0.663122 0.100996 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.680265 0.0847178 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER 0.686972 0.107387 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.675047 0.104191 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.656415 0.0783272 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER 0.651197 0.0978007 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.639272 0.0946054 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.66834 0.0815225 -0.236478 RAD 0.00617284 + txt002 + SPHERE CENTER 0.651197 0.0978007 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.675047 0.104191 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.591572 0.120168 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.577317 0.105912 -0.207967 RAD 0.00617284 + txt002 + SPHERE CENTER 0.600302 0.111438 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.582843 0.128897 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.568587 0.114642 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER 0.574113 0.137627 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.582843 0.128897 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.586046 0.0971825 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER 0.600302 0.111438 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.609032 0.102708 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.594141 0.358439 -0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER 0.619127 0.408291 -0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER 0.625955 0.411883 -0.183325 RAD 0.00617284 + txt002 + SPHERE CENTER 0.630791 0.390369 -0.172216 RAD 0.00617284 + txt002 + SPHERE CENTER 0.607547 0.396287 -0.178077 RAD 0.00617284 + txt002 + SPHERE CENTER 0.61429 0.429805 -0.170979 RAD 0.00617284 + txt002 + SPHERE CENTER 0.595882 0.414208 -0.165731 RAD 0.00617284 + txt002 + SPHERE CENTER 0.607462 0.426212 -0.147525 RAD 0.00617284 + txt002 + SPHERE CENTER 0.637535 0.423887 -0.165118 RAD 0.00617284 + txt002 + SPHERE CENTER 0.630706 0.420295 -0.141664 RAD 0.00617284 + txt002 + SPHERE CENTER 0.642371 0.402373 -0.154009 RAD 0.00617284 + txt002 + SPHERE CENTER 0.665691 0.37761 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.68332 0.389713 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.665691 0.37761 -0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER 0.660156 0.398265 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.68332 0.389713 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.660156 0.398265 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.665691 0.37761 -0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER 0.688854 0.369058 -0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER 0.671225 0.356956 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.671225 0.356956 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.638217 0.337042 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.652948 0.344865 -0.184873 RAD 0.00617284 + txt002 + SPHERE CENTER 0.632683 0.357697 -0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.651954 0.357326 -0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.658482 0.324211 -0.172528 RAD 0.00617284 + txt002 + SPHERE CENTER 0.657489 0.336672 -0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.643752 0.316388 -0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER 0.639211 0.324581 -0.18796 RAD 0.00617284 + txt002 + SPHERE CENTER 0.624481 0.316758 -0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER 0.618946 0.337413 -0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.547576 0.389119 -0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER 0.541008 0.410169 -0.170979 RAD 0.00617284 + txt002 + SPHERE CENTER 0.548718 0.410472 -0.147525 RAD 0.00617284 + txt002 + SPHERE CENTER 0.564748 0.405866 -0.165731 RAD 0.00617284 + txt002 + SPHERE CENTER 0.539866 0.388816 -0.183325 RAD 0.00617284 + txt002 + SPHERE CENTER 0.563607 0.384513 -0.178077 RAD 0.00617284 + txt002 + SPHERE CENTER 0.546435 0.367766 -0.172216 RAD 0.00617284 + txt002 + SPHERE CENTER 0.523836 0.393422 -0.165118 RAD 0.00617284 + txt002 + SPHERE CENTER 0.530405 0.372372 -0.154009 RAD 0.00617284 + txt002 + SPHERE CENTER 0.531546 0.393725 -0.141664 RAD 0.00617284 + txt002 + SPHERE CENTER 0.566667 0.317871 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.555534 0.296626 -0.172528 RAD 0.00617284 + txt002 + SPHERE CENTER 0.572202 0.297216 -0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER 0.550163 0.307914 -0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.549999 0.31728 -0.184873 RAD 0.00617284 + txt002 + SPHERE CENTER 0.544629 0.328569 -0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.561133 0.338525 -0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.572037 0.306582 -0.18796 RAD 0.00617284 + txt002 + SPHERE CENTER 0.583171 0.327827 -0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.588706 0.307172 -0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER 0.522591 0.339267 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.501272 0.340934 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.522591 0.339267 -0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER 0.517056 0.359921 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.501272 0.340934 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.517056 0.359921 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.522591 0.339267 -0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER 0.506807 0.320279 -0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER 0.528125 0.318612 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.528125 0.318612 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.57505 0.429687 -0.104315 RAD 0.0185185 + txt002 + SPHERE CENTER 0.58161 0.452905 -0.109563 RAD 0.00617284 + txt002 + SPHERE CENTER 0.5989 0.436077 -0.104315 RAD 0.00617284 + txt002 + SPHERE CENTER 0.586467 0.434777 -0.125608 RAD 0.00617284 + txt002 + SPHERE CENTER 0.55776 0.446515 -0.109563 RAD 0.00617284 + txt002 + SPHERE CENTER 0.562617 0.428387 -0.125608 RAD 0.00617284 + txt002 + SPHERE CENTER 0.5512 0.423296 -0.104315 RAD 0.00617284 + txt002 + SPHERE CENTER 0.570193 0.447815 -0.0882695 RAD 0.00617284 + txt002 + SPHERE CENTER 0.563633 0.424596 -0.0830215 RAD 0.00617284 + txt002 + SPHERE CENTER 0.587483 0.430987 -0.0830215 RAD 0.00617284 + txt002 + SPHERE CENTER 0.550064 0.379835 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.547099 0.396248 -0.0373488 RAD 0.00617284 + txt002 + SPHERE CENTER 0.569716 0.388263 -0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.557504 0.403175 -0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER 0.527447 0.387819 -0.0496945 RAD 0.00617284 + txt002 + SPHERE CENTER 0.537852 0.394747 -0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.530412 0.371406 -0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.539659 0.372907 -0.0342624 RAD 0.00617284 + txt002 + SPHERE CENTER 0.542624 0.356494 -0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER 0.562276 0.364922 -0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.621614 0.399007 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.637209 0.41723 -0.0496945 RAD 0.00617284 + txt002 + SPHERE CENTER 0.642848 0.401533 -0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.624734 0.418027 -0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.615976 0.414703 -0.0373488 RAD 0.00617284 + txt002 + SPHERE CENTER 0.603501 0.4155 -0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER 0.600381 0.39648 -0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.634089 0.39821 -0.0342624 RAD 0.00617284 + txt002 + SPHERE CENTER 0.618494 0.379986 -0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.639728 0.382513 -0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER 0.802608 0.281471 0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER 0.858698 0.329459 0.104938 RAD 0.0185185 + txt002 + SPHERE CENTER 0.872345 0.34259 0.0890951 RAD 0.00617284 + txt002 + SPHERE CENTER 0.86421 0.32016 0.0827387 RAD 0.00617284 + txt002 + SPHERE CENTER 0.848329 0.338969 0.0846485 RAD 0.00617284 + txt002 + SPHERE CENTER 0.866833 0.351888 0.111295 RAD 0.00617284 + txt002 + SPHERE CENTER 0.842817 0.348268 0.106848 RAD 0.00617284 + txt002 + SPHERE CENTER 0.853186 0.338757 0.127138 RAD 0.00617284 + txt002 + SPHERE CENTER 0.882715 0.333079 0.109385 RAD 0.00617284 + txt002 + SPHERE CENTER 0.869068 0.319948 0.125228 RAD 0.00617284 + txt002 + SPHERE CENTER 0.87458 0.310649 0.103028 RAD 0.00617284 + txt002 + SPHERE CENTER 0.845371 0.280879 0.0506299 RAD 0.0185185 + txt002 + SPHERE CENTER 0.849036 0.291048 0.0284303 RAD 0.00617284 + txt002 + SPHERE CENTER 0.826067 0.287867 0.0369125 RAD 0.00617284 + txt002 + SPHERE CENTER 0.840755 0.304882 0.0471312 RAD 0.00617284 + txt002 + SPHERE CENTER 0.868341 0.28406 0.0421477 RAD 0.00617284 + txt002 + SPHERE CENTER 0.86006 0.297894 0.0608487 RAD 0.00617284 + txt002 + SPHERE CENTER 0.864676 0.273891 0.0643473 RAD 0.00617284 + txt002 + SPHERE CENTER 0.853652 0.267046 0.0319289 RAD 0.00617284 + txt002 + SPHERE CENTER 0.849987 0.256877 0.0541285 RAD 0.00617284 + txt002 + SPHERE CENTER 0.830683 0.263865 0.0404111 RAD 0.00617284 + txt002 + SPHERE CENTER 0.798572 0.337088 0.062352 RAD 0.0185185 + txt002 + SPHERE CENTER 0.808673 0.346884 0.0420622 RAD 0.00617284 + txt002 + SPHERE CENTER 0.82298 0.335792 0.0588533 RAD 0.00617284 + txt002 + SPHERE CENTER 0.807762 0.322361 0.044793 RAD 0.00617284 + txt002 + SPHERE CENTER 0.784265 0.34818 0.0455609 RAD 0.00617284 + txt002 + SPHERE CENTER 0.783355 0.323657 0.0482916 RAD 0.00617284 + txt002 + SPHERE CENTER 0.774164 0.338384 0.0658506 RAD 0.00617284 + txt002 + SPHERE CENTER 0.799483 0.361611 0.0596212 RAD 0.00617284 + txt002 + SPHERE CENTER 0.789382 0.351815 0.079911 RAD 0.00617284 + txt002 + SPHERE CENTER 0.81379 0.350519 0.0764123 RAD 0.00617284 + txt002 + SPHERE CENTER 0.815936 0.330051 0.165419 RAD 0.0185185 + txt002 + SPHERE CENTER 0.828769 0.350165 0.171776 RAD 0.00617284 + txt002 + SPHERE CENTER 0.838905 0.333232 0.156937 RAD 0.00617284 + txt002 + SPHERE CENTER 0.820583 0.347547 0.148628 RAD 0.00617284 + txt002 + SPHERE CENTER 0.805799 0.346984 0.180258 RAD 0.00617284 + txt002 + SPHERE CENTER 0.797614 0.344366 0.157111 RAD 0.00617284 + txt002 + SPHERE CENTER 0.792966 0.32687 0.173902 RAD 0.00617284 + txt002 + SPHERE CENTER 0.824121 0.332668 0.188567 RAD 0.00617284 + txt002 + SPHERE CENTER 0.811288 0.312554 0.182211 RAD 0.00617284 + txt002 + SPHERE CENTER 0.834258 0.315735 0.173728 RAD 0.00617284 + txt002 + SPHERE CENTER 0.75581 0.33768 0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER 0.753851 0.362219 0.124743 RAD 0.00617284 + txt002 + SPHERE CENTER 0.774086 0.350765 0.133052 RAD 0.00617284 + txt002 + SPHERE CENTER 0.76987 0.352319 0.108773 RAD 0.00617284 + txt002 + SPHERE CENTER 0.735575 0.349134 0.114524 RAD 0.00617284 + txt002 + SPHERE CENTER 0.751594 0.339233 0.0985541 RAD 0.00617284 + txt002 + SPHERE CENTER 0.737534 0.324595 0.112614 RAD 0.00617284 + txt002 + SPHERE CENTER 0.739791 0.347581 0.138803 RAD 0.00617284 + txt002 + SPHERE CENTER 0.74175 0.323042 0.136894 RAD 0.00617284 + txt002 + SPHERE CENTER 0.760026 0.336127 0.147112 RAD 0.00617284 + txt002 + SPHERE CENTER 0.759846 0.282063 0.171592 RAD 0.0185185 + txt002 + SPHERE CENTER 0.756464 0.29233 0.193792 RAD 0.00617284 + txt002 + SPHERE CENTER 0.779336 0.288514 0.18531 RAD 0.00617284 + txt002 + SPHERE CENTER 0.765125 0.305929 0.175091 RAD 0.00617284 + txt002 + SPHERE CENTER 0.736973 0.285879 0.180075 RAD 0.00617284 + txt002 + SPHERE CENTER 0.745634 0.299478 0.161374 RAD 0.00617284 + txt002 + SPHERE CENTER 0.740355 0.275612 0.157875 RAD 0.00617284 + txt002 + SPHERE CENTER 0.751185 0.268464 0.190293 RAD 0.00617284 + txt002 + SPHERE CENTER 0.754567 0.258198 0.168094 RAD 0.00617284 + txt002 + SPHERE CENTER 0.774058 0.264649 0.181811 RAD 0.00617284 + txt002 + SPHERE CENTER 0.862735 0.273842 0.153697 RAD 0.0185185 + txt002 + SPHERE CENTER 0.885497 0.282313 0.158144 RAD 0.00617284 + txt002 + SPHERE CENTER 0.876946 0.281455 0.134996 RAD 0.00617284 + txt002 + SPHERE CENTER 0.867718 0.29787 0.150967 RAD 0.00617284 + txt002 + SPHERE CENTER 0.871286 0.274699 0.176845 RAD 0.00617284 + txt002 + SPHERE CENTER 0.853506 0.290257 0.169668 RAD 0.00617284 + txt002 + SPHERE CENTER 0.848523 0.266228 0.172398 RAD 0.00617284 + txt002 + SPHERE CENTER 0.880514 0.258284 0.160875 RAD 0.00617284 + txt002 + SPHERE CENTER 0.857752 0.249813 0.156428 RAD 0.00617284 + txt002 + SPHERE CENTER 0.871963 0.257427 0.137727 RAD 0.00617284 + txt002 + SPHERE CENTER 0.806645 0.225855 0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER 0.818054 0.21762 0.18016 RAD 0.00617284 + txt002 + SPHERE CENTER 0.83061 0.230661 0.163369 RAD 0.00617284 + txt002 + SPHERE CENTER 0.813612 0.241754 0.177429 RAD 0.00617284 + txt002 + SPHERE CENTER 0.794089 0.212813 0.176661 RAD 0.00617284 + txt002 + SPHERE CENTER 0.789647 0.236948 0.173931 RAD 0.00617284 + txt002 + SPHERE CENTER 0.78268 0.221048 0.156372 RAD 0.00617284 + txt002 + SPHERE CENTER 0.811087 0.20172 0.162601 RAD 0.00617284 + txt002 + SPHERE CENTER 0.799677 0.209955 0.142311 RAD 0.00617284 + txt002 + SPHERE CENTER 0.823642 0.214761 0.14581 RAD 0.00617284 + txt002 + SPHERE CENTER 0.849407 0.225263 0.099389 RAD 0.0185185 + txt002 + SPHERE CENTER 0.873186 0.21889 0.0974792 RAD 0.00617284 + txt002 + SPHERE CENTER 0.865588 0.240865 0.0891702 RAD 0.00617284 + txt002 + SPHERE CENTER 0.866351 0.236437 0.113449 RAD 0.00617284 + txt002 + SPHERE CENTER 0.857005 0.203288 0.107698 RAD 0.00617284 + txt002 + SPHERE CENTER 0.850171 0.220835 0.123668 RAD 0.00617284 + txt002 + SPHERE CENTER 0.833227 0.20966 0.109608 RAD 0.00617284 + txt002 + SPHERE CENTER 0.856242 0.207715 0.0834188 RAD 0.00617284 + txt002 + SPHERE CENTER 0.832464 0.214088 0.0853287 RAD 0.00617284 + txt002 + SPHERE CENTER 0.848644 0.22969 0.0751099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.594141 0.358439 0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER 0.613592 0.428945 0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER 0.626191 0.448155 0.113782 RAD 0.00617284 + txt002 + SPHERE CENTER 0.634643 0.42519 0.110488 RAD 0.00617284 + txt002 + SPHERE CENTER 0.614455 0.43276 0.0984536 RAD 0.00617284 + txt002 + SPHERE CENTER 0.60514 0.45191 0.126127 RAD 0.00617284 + txt002 + SPHERE CENTER 0.593404 0.436515 0.110799 RAD 0.00617284 + txt002 + SPHERE CENTER 0.592541 0.4327 0.135179 RAD 0.00617284 + txt002 + SPHERE CENTER 0.625328 0.44434 0.138161 RAD 0.00617284 + txt002 + SPHERE CENTER 0.612729 0.42513 0.147213 RAD 0.00617284 + txt002 + SPHERE CENTER 0.63378 0.421375 0.134867 RAD 0.00617284 + txt002 + SPHERE CENTER 0.665691 0.37761 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.68332 0.389713 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.665691 0.37761 0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER 0.660156 0.398265 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.68332 0.389713 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.660156 0.398265 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.665691 0.37761 0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER 0.688854 0.369058 0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER 0.671225 0.356956 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.671225 0.356956 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.621614 0.399007 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.625435 0.399844 0.031176 RAD 0.00617284 + txt002 + SPHERE CENTER 0.627149 0.378352 0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.60511 0.38905 0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.619901 0.420499 0.0435217 RAD 0.00617284 + txt002 + SPHERE CENTER 0.599576 0.409705 0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER 0.61608 0.419661 0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.641939 0.409801 0.0466081 RAD 0.00617284 + txt002 + SPHERE CENTER 0.638118 0.408963 0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.643653 0.388308 0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER 0.542042 0.409774 0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER 0.53788 0.433888 0.126127 RAD 0.00617284 + txt002 + SPHERE CENTER 0.558395 0.423551 0.135179 RAD 0.00617284 + txt002 + SPHERE CENTER 0.55574 0.426423 0.110799 RAD 0.00617284 + txt002 + SPHERE CENTER 0.521526 0.42011 0.113782 RAD 0.00617284 + txt002 + SPHERE CENTER 0.539387 0.412646 0.0984536 RAD 0.00617284 + txt002 + SPHERE CENTER 0.525689 0.395996 0.110488 RAD 0.00617284 + txt002 + SPHERE CENTER 0.524182 0.417238 0.138161 RAD 0.00617284 + txt002 + SPHERE CENTER 0.528344 0.393124 0.134867 RAD 0.00617284 + txt002 + SPHERE CENTER 0.544697 0.406901 0.147213 RAD 0.00617284 + txt002 + SPHERE CENTER 0.550064 0.379835 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.540802 0.399304 0.0435217 RAD 0.00617284 + txt002 + SPHERE CENTER 0.54453 0.400489 0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.563801 0.400119 0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER 0.546337 0.37865 0.031176 RAD 0.00617284 + txt002 + SPHERE CENTER 0.569335 0.379464 0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.555599 0.35918 0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.527065 0.37902 0.0466081 RAD 0.00617284 + txt002 + SPHERE CENTER 0.536327 0.359551 0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER 0.530793 0.380205 0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.522591 0.339267 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.501272 0.340934 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.522591 0.339267 0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER 0.517056 0.359921 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.501272 0.340934 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.517056 0.359921 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.522591 0.339267 0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER 0.506807 0.320279 0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER 0.528125 0.318612 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.528125 0.318612 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.586119 0.388377 0.178389 RAD 0.0185185 + txt002 + SPHERE CENTER 0.594185 0.405974 0.193717 RAD 0.00617284 + txt002 + SPHERE CENTER 0.609969 0.394768 0.178389 RAD 0.00617284 + txt002 + SPHERE CENTER 0.593017 0.410332 0.169441 RAD 0.00617284 + txt002 + SPHERE CENTER 0.570335 0.399584 0.193717 RAD 0.00617284 + txt002 + SPHERE CENTER 0.569167 0.403942 0.169441 RAD 0.00617284 + txt002 + SPHERE CENTER 0.562269 0.381987 0.178389 RAD 0.00617284 + txt002 + SPHERE CENTER 0.587286 0.384019 0.202664 RAD 0.00617284 + txt002 + SPHERE CENTER 0.57922 0.366422 0.187336 RAD 0.00617284 + txt002 + SPHERE CENTER 0.60307 0.372813 0.187336 RAD 0.00617284 + txt002 + SPHERE CENTER 0.566667 0.317871 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.567308 0.314012 0.191046 RAD 0.00617284 + txt002 + SPHERE CENTER 0.587901 0.320398 0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.569787 0.336891 0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.546074 0.311485 0.178701 RAD 0.00617284 + txt002 + SPHERE CENTER 0.548554 0.334364 0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER 0.545434 0.315344 0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER 0.564188 0.294991 0.175614 RAD 0.00617284 + txt002 + SPHERE CENTER 0.563547 0.29885 0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.584781 0.301377 0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.638217 0.337042 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.659244 0.341809 0.178701 RAD 0.00617284 + txt002 + SPHERE CENTER 0.65787 0.345471 0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER 0.645657 0.360383 0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER 0.639592 0.33338 0.191046 RAD 0.00617284 + txt002 + SPHERE CENTER 0.626005 0.351955 0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.618565 0.328614 0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.651804 0.318468 0.175614 RAD 0.00617284 + txt002 + SPHERE CENTER 0.630777 0.313702 0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.65043 0.32213 0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.643951 0.172546 0.222222 RAD 0.0555556 + txt002 + SPHERE CENTER 0.674191 0.202787 0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER 0.690652 0.219248 0.290934 RAD 0.00617284 + txt002 + SPHERE CENTER 0.695267 0.206403 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.677807 0.223862 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.669577 0.215632 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER 0.656732 0.220246 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER 0.653116 0.199171 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER 0.687036 0.198172 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER 0.670575 0.181711 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER 0.691651 0.185327 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER 0.715501 0.191718 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.733129 0.203821 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.715501 0.191718 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER 0.709966 0.212373 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.733129 0.203821 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.709966 0.212373 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.715501 0.191718 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER 0.738664 0.183166 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.721035 0.171063 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.721035 0.171063 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.663122 0.244096 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.675225 0.261725 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.683777 0.238562 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.663122 0.244096 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER 0.65457 0.267259 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.642468 0.249631 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.642468 0.249631 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.675225 0.261725 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.663122 0.244096 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER 0.683777 0.238562 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.602641 0.183615 0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER 0.600215 0.197046 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER 0.622701 0.191021 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER 0.609032 0.207465 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER 0.580155 0.18964 0.290934 RAD 0.00617284 + txt002 + SPHERE CENTER 0.588972 0.200059 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.582581 0.176209 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.593824 0.173196 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER 0.596251 0.159765 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER 0.61631 0.167171 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER 0.591572 0.224924 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.587397 0.24926 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.606693 0.240045 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.606693 0.240045 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.572277 0.23414 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.591572 0.224924 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER 0.576452 0.209804 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.572277 0.23414 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.576452 0.209804 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.591572 0.224924 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER 0.5724 0.153374 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.551082 0.155041 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.5724 0.153374 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER 0.566866 0.174029 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.551082 0.155041 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.566866 0.174029 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.5724 0.153374 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER 0.556617 0.134387 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.577935 0.13272 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.577935 0.13272 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.655019 0.131237 0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER 0.668451 0.12881 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER 0.678869 0.137627 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER 0.662426 0.151296 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER 0.644601 0.12242 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER 0.638576 0.144906 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER 0.631169 0.124846 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER 0.661044 0.108751 0.290934 RAD 0.00617284 + txt002 + SPHERE CENTER 0.647613 0.111177 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.671463 0.117567 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.624779 0.100996 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.626446 0.0796777 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.645433 0.0954616 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.624779 0.100996 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER 0.605791 0.0852121 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.604124 0.10653 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.604124 0.10653 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.626446 0.0796777 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.624779 0.100996 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER 0.645433 0.0954616 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.696329 0.120168 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.720665 0.115992 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.711449 0.135288 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.711449 0.135288 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.705544 0.100872 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.696329 0.120168 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER 0.681209 0.105047 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.705544 0.100872 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.681209 0.105047 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.696329 0.120168 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER 0.852418 0.0955788 1.89979e-16 RAD 0.0555556 + txt002 + SPHERE CENTER 0.922609 0.11107 -0.0178949 RAD 0.0185185 + txt002 + SPHERE CENTER 0.937225 0.122151 -0.0344251 RAD 0.00617284 + txt002 + SPHERE CENTER 0.916553 0.11086 -0.0418311 RAD 0.00617284 + txt002 + SPHERE CENTER 0.915202 0.131874 -0.0289382 RAD 0.00617284 + txt002 + SPHERE CENTER 0.943281 0.12236 -0.0104889 RAD 0.00617284 + txt002 + SPHERE CENTER 0.921258 0.132084 -0.00500196 RAD 0.00617284 + txt002 + SPHERE CENTER 0.928665 0.111279 0.00604126 RAD 0.00617284 + txt002 + SPHERE CENTER 0.944632 0.101346 -0.0233819 RAD 0.00617284 + txt002 + SPHERE CENTER 0.930016 0.0902645 -0.00685171 RAD 0.00617284 + txt002 + SPHERE CENTER 0.92396 0.090055 -0.0307879 RAD 0.00617284 + txt002 + SPHERE CENTER 0.867231 0.135698 -0.0604812 RAD 0.0185185 + txt002 + SPHERE CENTER 0.873196 0.134634 -0.0844174 RAD 0.00617284 + txt002 + SPHERE CENTER 0.882112 0.117797 -0.0687117 RAD 0.00617284 + txt002 + SPHERE CENTER 0.858152 0.11765 -0.0746767 RAD 0.00617284 + txt002 + SPHERE CENTER 0.858315 0.152536 -0.076187 RAD 0.00617284 + txt002 + SPHERE CENTER 0.843271 0.135552 -0.0664462 RAD 0.00617284 + txt002 + SPHERE CENTER 0.852349 0.1536 -0.0522508 RAD 0.00617284 + txt002 + SPHERE CENTER 0.882275 0.152682 -0.070222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.876309 0.153747 -0.0462858 RAD 0.00617284 + txt002 + SPHERE CENTER 0.89119 0.135845 -0.0545162 RAD 0.00617284 + txt002 + SPHERE CENTER 0.877966 0.164775 0.00679642 RAD 0.0185185 + txt002 + SPHERE CENTER 0.890926 0.182656 -0.0042468 RAD 0.00617284 + txt002 + SPHERE CENTER 0.897331 0.159019 -0.00739901 RAD 0.00617284 + txt002 + SPHERE CENTER 0.876622 0.167676 -0.0176871 RAD 0.00617284 + txt002 + SPHERE CENTER 0.871561 0.188412 0.00994863 RAD 0.00617284 + txt002 + SPHERE CENTER 0.857256 0.173431 -0.00349164 RAD 0.00617284 + txt002 + SPHERE CENTER 0.8586 0.17053 0.0209919 RAD 0.00617284 + txt002 + SPHERE CENTER 0.89227 0.179755 0.0202367 RAD 0.00617284 + txt002 + SPHERE CENTER 0.87931 0.161874 0.0312799 RAD 0.00617284 + txt002 + SPHERE CENTER 0.898675 0.156118 0.0170845 RAD 0.00617284 + txt002 + SPHERE CENTER 0.907797 0.0709499 0.0425863 RAD 0.0185185 + txt002 + SPHERE CENTER 0.930963 0.0752104 0.0499923 RAD 0.00617284 + txt002 + SPHERE CENTER 0.924191 0.0806562 0.0268805 RAD 0.00617284 + txt002 + SPHERE CENTER 0.915684 0.0941344 0.0457385 RAD 0.00617284 + txt002 + SPHERE CENTER 0.914568 0.0655041 0.065698 RAD 0.00617284 + txt002 + SPHERE CENTER 0.899289 0.0844281 0.0614442 RAD 0.00617284 + txt002 + SPHERE CENTER 0.891402 0.0612436 0.058292 RAD 0.00617284 + txt002 + SPHERE CENTER 0.923076 0.0520258 0.0468401 RAD 0.00617284 + txt002 + SPHERE CENTER 0.89991 0.0477654 0.0394341 RAD 0.00617284 + txt002 + SPHERE CENTER 0.916304 0.0574717 0.0237283 RAD 0.00617284 + txt002 + SPHERE CENTER 0.863153 0.124655 0.0672777 RAD 0.0185185 + txt002 + SPHERE CENTER 0.875744 0.141535 0.0801706 RAD 0.00617284 + txt002 + SPHERE CENTER 0.88655 0.129819 0.0613127 RAD 0.00617284 + txt002 + SPHERE CENTER 0.868763 0.146389 0.0569896 RAD 0.00617284 + txt002 + SPHERE CENTER 0.852347 0.136371 0.0861356 RAD 0.00617284 + txt002 + SPHERE CENTER 0.845366 0.141225 0.0629546 RAD 0.00617284 + txt002 + SPHERE CENTER 0.839756 0.119492 0.0732426 RAD 0.00617284 + txt002 + SPHERE CENTER 0.870135 0.119801 0.0904587 RAD 0.00617284 + txt002 + SPHERE CENTER 0.857544 0.102922 0.0775657 RAD 0.00617284 + txt002 + SPHERE CENTER 0.880941 0.108085 0.0716007 RAD 0.00617284 + txt002 + SPHERE CENTER 0.837606 0.0554592 0.0604812 RAD 0.0185185 + txt002 + SPHERE CENTER 0.842832 0.0523913 0.0844174 RAD 0.00617284 + txt002 + SPHERE CENTER 0.86055 0.0593957 0.0687117 RAD 0.00617284 + txt002 + SPHERE CENTER 0.842434 0.0750766 0.0746767 RAD 0.00617284 + txt002 + SPHERE CENTER 0.819888 0.0484547 0.076187 RAD 0.00617284 + txt002 + SPHERE CENTER 0.81949 0.07114 0.0664462 RAD 0.00617284 + txt002 + SPHERE CENTER 0.814662 0.0515226 0.0522508 RAD 0.00617284 + txt002 + SPHERE CENTER 0.838004 0.0327739 0.070222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.832778 0.0358417 0.0462858 RAD 0.00617284 + txt002 + SPHERE CENTER 0.855722 0.0397783 0.0545162 RAD 0.00617284 + txt002 + SPHERE CENTER 0.897062 0.0418734 -0.0246914 RAD 0.0185185 + txt002 + SPHERE CENTER 0.920407 0.0359958 -0.0301783 RAD 0.00617284 + txt002 + SPHERE CENTER 0.912106 0.0588574 -0.0344321 RAD 0.00617284 + txt002 + SPHERE CENTER 0.915603 0.0511067 -0.0112511 RAD 0.00617284 + txt002 + SPHERE CENTER 0.905363 0.0190117 -0.0204376 RAD 0.00617284 + txt002 + SPHERE CENTER 0.900559 0.0341227 -0.00151032 RAD 0.00617284 + txt002 + SPHERE CENTER 0.882018 0.0248894 -0.0149506 RAD 0.00617284 + txt002 + SPHERE CENTER 0.901866 0.0267625 -0.0436186 RAD 0.00617284 + txt002 + SPHERE CENTER 0.878521 0.0326401 -0.0381316 RAD 0.00617284 + txt002 + SPHERE CENTER 0.893565 0.0496241 -0.0478724 RAD 0.00617284 + txt002 + SPHERE CENTER 0.826871 0.0263827 -0.00679642 RAD 0.0185185 + txt002 + SPHERE CENTER 0.825102 0.00436945 0.0042468 RAD 0.00617284 + txt002 + SPHERE CENTER 0.84533 0.018173 0.00739901 RAD 0.00617284 + txt002 + SPHERE CENTER 0.823964 0.025051 0.0176871 RAD 0.00617284 + txt002 + SPHERE CENTER 0.806642 0.0125791 -0.00994863 RAD 0.00617284 + txt002 + SPHERE CENTER 0.805505 0.0332607 0.00349164 RAD 0.00617284 + txt002 + SPHERE CENTER 0.808411 0.0345923 -0.0209919 RAD 0.00617284 + txt002 + SPHERE CENTER 0.828008 0.00570109 -0.0202367 RAD 0.00617284 + txt002 + SPHERE CENTER 0.829777 0.0277143 -0.0312799 RAD 0.00617284 + txt002 + SPHERE CENTER 0.848237 0.0195047 -0.0170845 RAD 0.00617284 + txt002 + SPHERE CENTER 0.841683 0.0665023 -0.0672777 RAD 0.0185185 + txt002 + SPHERE CENTER 0.840284 0.0454909 -0.0801706 RAD 0.00617284 + txt002 + SPHERE CENTER 0.856111 0.0473735 -0.0613127 RAD 0.00617284 + txt002 + SPHERE CENTER 0.831823 0.0463379 -0.0569896 RAD 0.00617284 + txt002 + SPHERE CENTER 0.825856 0.0646197 -0.0861356 RAD 0.00617284 + txt002 + SPHERE CENTER 0.817395 0.0654667 -0.0629546 RAD 0.00617284 + txt002 + SPHERE CENTER 0.827255 0.0856311 -0.0732426 RAD 0.00617284 + txt002 + SPHERE CENTER 0.850144 0.0656554 -0.0904587 RAD 0.00617284 + txt002 + SPHERE CENTER 0.851543 0.0866667 -0.0775657 RAD 0.00617284 + txt002 + SPHERE CENTER 0.865971 0.0675379 -0.0716007 RAD 0.00617284 + txt002 + SPHERE CENTER 0.69376 -0.0133465 0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER 0.740325 -0.0440268 0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER 0.762259 -0.0417568 0.170979 RAD 0.00617284 + txt002 + SPHERE CENTER 0.759495 -0.0345526 0.147525 RAD 0.00617284 + txt002 + SPHERE CENTER 0.748937 -0.0216407 0.165731 RAD 0.00617284 + txt002 + SPHERE CENTER 0.743089 -0.051231 0.183325 RAD 0.00617284 + txt002 + SPHERE CENTER 0.729767 -0.0311149 0.178077 RAD 0.00617284 + txt002 + SPHERE CENTER 0.721155 -0.053501 0.172216 RAD 0.00617284 + txt002 + SPHERE CENTER 0.753646 -0.0641429 0.165118 RAD 0.00617284 + txt002 + SPHERE CENTER 0.731712 -0.0664129 0.154009 RAD 0.00617284 + txt002 + SPHERE CENTER 0.750882 -0.0569387 0.141664 RAD 0.00617284 + txt002 + SPHERE CENTER 0.76531 0.0058253 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.782939 0.0179281 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.76531 0.0058253 0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER 0.759776 0.02648 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.782939 0.0179281 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.759776 0.02648 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.76531 0.0058253 0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER 0.788473 -0.00272662 0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER 0.770845 -0.0148294 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.770845 -0.0148294 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.721234 0.0272215 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.736829 0.0454452 0.172528 RAD 0.00617284 + txt002 + SPHERE CENTER 0.742467 0.0297485 0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER 0.724354 0.046242 0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.715595 0.0429182 0.184873 RAD 0.00617284 + txt002 + SPHERE CENTER 0.70312 0.043715 0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.7 0.0246945 0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.733709 0.0264247 0.18796 RAD 0.00617284 + txt002 + SPHERE CENTER 0.718114 0.00820099 0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.739347 0.010728 0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER 0.668775 -0.0631985 0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER 0.669983 -0.0708196 0.183325 RAD 0.00617284 + txt002 + SPHERE CENTER 0.690113 -0.0618185 0.172216 RAD 0.00617284 + txt002 + SPHERE CENTER 0.671462 -0.0467378 0.178077 RAD 0.00617284 + txt002 + SPHERE CENTER 0.648644 -0.0721997 0.170979 RAD 0.00617284 + txt002 + SPHERE CENTER 0.650123 -0.0481178 0.165731 RAD 0.00617284 + txt002 + SPHERE CENTER 0.647436 -0.0645786 0.147525 RAD 0.00617284 + txt002 + SPHERE CENTER 0.667296 -0.0872804 0.165118 RAD 0.00617284 + txt002 + SPHERE CENTER 0.666087 -0.0796593 0.141664 RAD 0.00617284 + txt002 + SPHERE CENTER 0.687426 -0.0782793 0.154009 RAD 0.00617284 + txt002 + SPHERE CENTER 0.649684 0.00804971 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.646718 0.0244627 0.184873 RAD 0.00617284 + txt002 + SPHERE CENTER 0.669336 0.016478 0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.657124 0.0313903 0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.627066 0.0160343 0.172528 RAD 0.00617284 + txt002 + SPHERE CENTER 0.637471 0.022962 0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.630031 -0.000378614 0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER 0.639278 0.00112207 0.18796 RAD 0.00617284 + txt002 + SPHERE CENTER 0.642244 -0.0152909 0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER 0.661896 -0.00686255 0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.62221 -0.0325183 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.600892 -0.0308513 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.62221 -0.0325183 0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER 0.616676 -0.0118635 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.600892 -0.0308513 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.616676 -0.0118635 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.62221 -0.0325183 0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER 0.606426 -0.051506 0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER 0.627745 -0.053173 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.627745 -0.053173 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.712851 -0.0845947 0.104315 RAD 0.0185185 + txt002 + SPHERE CENTER 0.730141 -0.101422 0.109563 RAD 0.00617284 + txt002 + SPHERE CENTER 0.736701 -0.0782041 0.104315 RAD 0.00617284 + txt002 + SPHERE CENTER 0.725284 -0.0832945 0.125608 RAD 0.00617284 + txt002 + SPHERE CENTER 0.706291 -0.107813 0.109563 RAD 0.00617284 + txt002 + SPHERE CENTER 0.701434 -0.0896851 0.125608 RAD 0.00617284 + txt002 + SPHERE CENTER 0.689001 -0.0909853 0.104315 RAD 0.00617284 + txt002 + SPHERE CENTER 0.717709 -0.102723 0.0882695 RAD 0.00617284 + txt002 + SPHERE CENTER 0.700418 -0.0858949 0.0830215 RAD 0.00617284 + txt002 + SPHERE CENTER 0.724268 -0.0795043 0.0830215 RAD 0.00617284 + txt002 + SPHERE CENTER 0.666287 -0.0539145 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.655153 -0.0751594 0.0496945 RAD 0.00617284 + txt002 + SPHERE CENTER 0.671821 -0.0745692 0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.649783 -0.0638711 0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.649619 -0.0545047 0.0373488 RAD 0.00617284 + txt002 + SPHERE CENTER 0.644249 -0.0432164 0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER 0.660752 -0.0332597 0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.671657 -0.0652028 0.0342624 RAD 0.00617284 + txt002 + SPHERE CENTER 0.682791 -0.0439578 0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.688325 -0.0646126 0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER 0.737837 -0.0347427 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.752567 -0.0269197 0.0373488 RAD 0.00617284 + txt002 + SPHERE CENTER 0.732303 -0.014088 0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.751574 -0.0144587 0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER 0.758102 -0.0475745 0.0496945 RAD 0.00617284 + txt002 + SPHERE CENTER 0.757108 -0.0351134 0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.743371 -0.0553974 0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.73883 -0.0472037 0.0342624 RAD 0.00617284 + txt002 + SPHERE CENTER 0.7241 -0.0550267 0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER 0.718566 -0.0343719 0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.69376 -0.0133465 -0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER 0.745859 -0.0646815 -0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER 0.770032 -0.0684873 -0.126127 RAD 0.00617284 + txt002 + SPHERE CENTER 0.759394 -0.0481266 -0.135179 RAD 0.00617284 + txt002 + SPHERE CENTER 0.762305 -0.0507391 -0.110799 RAD 0.00617284 + txt002 + SPHERE CENTER 0.756497 -0.0850422 -0.113782 RAD 0.00617284 + txt002 + SPHERE CENTER 0.74877 -0.067294 -0.0984536 RAD 0.00617284 + txt002 + SPHERE CENTER 0.732325 -0.0812364 -0.110488 RAD 0.00617284 + txt002 + SPHERE CENTER 0.753586 -0.0824297 -0.138161 RAD 0.00617284 + txt002 + SPHERE CENTER 0.729413 -0.0786239 -0.134867 RAD 0.00617284 + txt002 + SPHERE CENTER 0.742948 -0.062069 -0.147213 RAD 0.00617284 + txt002 + SPHERE CENTER 0.76531 0.0058253 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.782939 0.0179281 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.76531 0.0058253 -0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER 0.759776 0.02648 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.782939 0.0179281 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.759776 0.02648 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.76531 0.0058253 -0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER 0.788473 -0.00272662 -0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER 0.770845 -0.0148294 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.770845 -0.0148294 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.737837 -0.0347427 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.758864 -0.0299763 -0.0435217 RAD 0.00617284 + txt002 + SPHERE CENTER 0.757489 -0.0263144 -0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.745277 -0.0114021 -0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER 0.739212 -0.0384047 -0.031176 RAD 0.00617284 + txt002 + SPHERE CENTER 0.725625 -0.0198304 -0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.718185 -0.043171 -0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.751424 -0.0533169 -0.0466081 RAD 0.00617284 + txt002 + SPHERE CENTER 0.730397 -0.0580833 -0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER 0.750049 -0.0496549 -0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.674309 -0.0838533 -0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER 0.675276 -0.106805 -0.113782 RAD 0.00617284 + txt002 + SPHERE CENTER 0.694308 -0.091423 -0.110488 RAD 0.00617284 + txt002 + SPHERE CENTER 0.673094 -0.0875713 -0.0984536 RAD 0.00617284 + txt002 + SPHERE CENTER 0.655278 -0.0992356 -0.126127 RAD 0.00617284 + txt002 + SPHERE CENTER 0.653095 -0.0800016 -0.110799 RAD 0.00617284 + txt002 + SPHERE CENTER 0.65431 -0.0762835 -0.135179 RAD 0.00617284 + txt002 + SPHERE CENTER 0.676491 -0.103087 -0.138161 RAD 0.00617284 + txt002 + SPHERE CENTER 0.675524 -0.0801352 -0.147213 RAD 0.00617284 + txt002 + SPHERE CENTER 0.695522 -0.0877049 -0.134867 RAD 0.00617284 + txt002 + SPHERE CENTER 0.666287 -0.0539145 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.666927 -0.0577732 -0.031176 RAD 0.00617284 + txt002 + SPHERE CENTER 0.68752 -0.0513875 -0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.669407 -0.034894 -0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.645694 -0.0603001 -0.0435217 RAD 0.00617284 + txt002 + SPHERE CENTER 0.648173 -0.0374209 -0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER 0.645053 -0.0564414 -0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.663807 -0.0767937 -0.0466081 RAD 0.00617284 + txt002 + SPHERE CENTER 0.663167 -0.072935 -0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.6844 -0.070408 -0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER 0.62221 -0.0325183 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.600892 -0.0308513 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.62221 -0.0325183 -0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER 0.616676 -0.0118635 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.600892 -0.0308513 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.616676 -0.0118635 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.62221 -0.0325183 -0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER 0.606426 -0.051506 -0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER 0.627745 -0.053173 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.627745 -0.053173 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.701782 -0.0432853 -0.178389 RAD 0.0185185 + txt002 + SPHERE CENTER 0.717566 -0.0544915 -0.193717 RAD 0.00617284 + txt002 + SPHERE CENTER 0.725632 -0.0368947 -0.178389 RAD 0.00617284 + txt002 + SPHERE CENTER 0.718734 -0.0588496 -0.169441 RAD 0.00617284 + txt002 + SPHERE CENTER 0.693716 -0.0608821 -0.193717 RAD 0.00617284 + txt002 + SPHERE CENTER 0.694884 -0.0652402 -0.169441 RAD 0.00617284 + txt002 + SPHERE CENTER 0.677932 -0.0496759 -0.178389 RAD 0.00617284 + txt002 + SPHERE CENTER 0.700615 -0.0389272 -0.202664 RAD 0.00617284 + txt002 + SPHERE CENTER 0.684831 -0.027721 -0.187336 RAD 0.00617284 + txt002 + SPHERE CENTER 0.708681 -0.0213304 -0.187336 RAD 0.00617284 + txt002 + SPHERE CENTER 0.649684 0.00804971 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.640422 0.0275193 -0.178701 RAD 0.00617284 + txt002 + SPHERE CENTER 0.644149 0.0287044 -0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER 0.66342 0.0283337 -0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER 0.645956 0.00686453 -0.191046 RAD 0.00617284 + txt002 + SPHERE CENTER 0.668955 0.00767898 -0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.655218 -0.012605 -0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.626685 0.00723527 -0.175614 RAD 0.00617284 + txt002 + SPHERE CENTER 0.635947 -0.0122343 -0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.630413 0.00842045 -0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.721234 0.0272215 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.725055 0.0280589 -0.191046 RAD 0.00617284 + txt002 + SPHERE CENTER 0.726768 0.00656677 -0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.70473 0.0172649 -0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.71952 0.0487136 -0.178701 RAD 0.00617284 + txt002 + SPHERE CENTER 0.699195 0.0379196 -0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER 0.715699 0.0478762 -0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER 0.741558 0.0380155 -0.175614 RAD 0.00617284 + txt002 + SPHERE CENTER 0.737738 0.0371781 -0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.743272 0.0165234 -0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.172546 0.643951 1.11022e-16 RAD 0.166667 + txt002 + SPHERE CENTER 0.281471 0.802608 -0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER 0.30566 0.824035 -0.177765 RAD 0.0185185 + txt002 + SPHERE CENTER 0.302088 0.822021 -0.202114 RAD 0.00617284 + txt002 + SPHERE CENTER 0.298094 0.802598 -0.187402 RAD 0.00617284 + txt002 + SPHERE CENTER 0.282758 0.821938 -0.186751 RAD 0.00617284 + txt002 + SPHERE CENTER 0.309654 0.843459 -0.192477 RAD 0.00617284 + txt002 + SPHERE CENTER 0.290324 0.843375 -0.177114 RAD 0.00617284 + txt002 + SPHERE CENTER 0.313227 0.845472 -0.168128 RAD 0.00617284 + txt002 + SPHERE CENTER 0.32499 0.824119 -0.193128 RAD 0.00617284 + txt002 + SPHERE CENTER 0.328563 0.826132 -0.16878 RAD 0.00617284 + txt002 + SPHERE CENTER 0.320997 0.804695 -0.178416 RAD 0.00617284 + txt002 + SPHERE CENTER 0.305221 0.752156 -0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER 0.325175 0.741263 -0.169507 RAD 0.00617284 + txt002 + SPHERE CENTER 0.325981 0.765112 -0.163165 RAD 0.00617284 + txt002 + SPHERE CENTER 0.32493 0.747715 -0.145675 RAD 0.00617284 + txt002 + SPHERE CENTER 0.304415 0.728307 -0.166213 RAD 0.00617284 + txt002 + SPHERE CENTER 0.304171 0.734759 -0.142381 RAD 0.00617284 + txt002 + SPHERE CENTER 0.284462 0.7392 -0.156576 RAD 0.00617284 + txt002 + SPHERE CENTER 0.305466 0.745704 -0.183703 RAD 0.00617284 + txt002 + SPHERE CENTER 0.285513 0.756597 -0.174066 RAD 0.00617284 + txt002 + SPHERE CENTER 0.306272 0.769553 -0.17736 RAD 0.00617284 + txt002 + SPHERE CENTER 0.241352 0.787796 -0.171592 RAD 0.0185185 + txt002 + SPHERE CENTER 0.218449 0.785699 -0.180578 RAD 0.00617284 + txt002 + SPHERE CENTER 0.223304 0.778718 -0.157397 RAD 0.00617284 + txt002 + SPHERE CENTER 0.22345 0.802677 -0.163362 RAD 0.00617284 + txt002 + SPHERE CENTER 0.236497 0.794777 -0.194773 RAD 0.00617284 + txt002 + SPHERE CENTER 0.241498 0.811756 -0.177557 RAD 0.00617284 + txt002 + SPHERE CENTER 0.2594 0.796874 -0.185788 RAD 0.00617284 + txt002 + SPHERE CENTER 0.236351 0.770818 -0.188808 RAD 0.00617284 + txt002 + SPHERE CENTER 0.259253 0.772915 -0.179823 RAD 0.00617284 + txt002 + SPHERE CENTER 0.241205 0.763837 -0.165627 RAD 0.00617284 + txt002 + SPHERE CENTER 0.28191 0.874487 -0.129006 RAD 0.0185185 + txt002 + SPHERE CENTER 0.292033 0.891539 -0.143718 RAD 0.00617284 + txt002 + SPHERE CENTER 0.305711 0.872763 -0.135349 RAD 0.00617284 + txt002 + SPHERE CENTER 0.28812 0.868678 -0.152187 RAD 0.00617284 + txt002 + SPHERE CENTER 0.268233 0.893263 -0.137375 RAD 0.00617284 + txt002 + SPHERE CENTER 0.264319 0.870402 -0.145845 RAD 0.00617284 + txt002 + SPHERE CENTER 0.25811 0.876212 -0.122663 RAD 0.00617284 + txt002 + SPHERE CENTER 0.285824 0.897348 -0.120537 RAD 0.00617284 + txt002 + SPHERE CENTER 0.275701 0.880296 -0.105825 RAD 0.00617284 + txt002 + SPHERE CENTER 0.299501 0.878572 -0.112168 RAD 0.00617284 + txt002 + SPHERE CENTER 0.217602 0.838248 -0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER 0.206363 0.860225 -0.122182 RAD 0.00617284 + txt002 + SPHERE CENTER 0.223536 0.854636 -0.105343 RAD 0.00617284 + txt002 + SPHERE CENTER 0.230102 0.858689 -0.128798 RAD 0.00617284 + txt002 + SPHERE CENTER 0.200429 0.843837 -0.139672 RAD 0.00617284 + txt002 + SPHERE CENTER 0.224168 0.842301 -0.146288 RAD 0.00617284 + txt002 + SPHERE CENTER 0.211667 0.821861 -0.140323 RAD 0.00617284 + txt002 + SPHERE CENTER 0.193863 0.839784 -0.116217 RAD 0.00617284 + txt002 + SPHERE CENTER 0.205101 0.817808 -0.116868 RAD 0.00617284 + txt002 + SPHERE CENTER 0.211035 0.834196 -0.0993785 RAD 0.00617284 + txt002 + SPHERE CENTER 0.257721 0.853061 -0.062352 RAD 0.0185185 + txt002 + SPHERE CENTER 0.26204 0.87538 -0.0527151 RAD 0.00617284 + txt002 + SPHERE CENTER 0.280934 0.860805 -0.0590577 RAD 0.00617284 + txt002 + SPHERE CENTER 0.266856 0.87108 -0.0765474 RAD 0.00617284 + txt002 + SPHERE CENTER 0.238827 0.867636 -0.0560094 RAD 0.00617284 + txt002 + SPHERE CENTER 0.243643 0.863337 -0.0798417 RAD 0.00617284 + txt002 + SPHERE CENTER 0.234508 0.845317 -0.0656463 RAD 0.00617284 + txt002 + SPHERE CENTER 0.252905 0.857361 -0.0385197 RAD 0.00617284 + txt002 + SPHERE CENTER 0.248586 0.835041 -0.0481565 RAD 0.00617284 + txt002 + SPHERE CENTER 0.271799 0.842785 -0.0448623 RAD 0.00617284 + txt002 + SPHERE CENTER 0.34578 0.838847 -0.117284 RAD 0.0185185 + txt002 + SPHERE CENTER 0.360404 0.851488 -0.132647 RAD 0.00617284 + txt002 + SPHERE CENTER 0.347059 0.832518 -0.141116 RAD 0.00617284 + txt002 + SPHERE CENTER 0.335865 0.853509 -0.1345 RAD 0.00617284 + txt002 + SPHERE CENTER 0.359125 0.857816 -0.108814 RAD 0.00617284 + txt002 + SPHERE CENTER 0.334587 0.859838 -0.110668 RAD 0.00617284 + txt002 + SPHERE CENTER 0.344501 0.845176 -0.0934517 RAD 0.00617284 + txt002 + SPHERE CENTER 0.370319 0.836826 -0.115431 RAD 0.00617284 + txt002 + SPHERE CENTER 0.355695 0.824185 -0.100068 RAD 0.00617284 + txt002 + SPHERE CENTER 0.356973 0.817857 -0.1239 RAD 0.00617284 + txt002 + SPHERE CENTER 0.321591 0.817421 -0.0506299 RAD 0.0185185 + txt002 + SPHERE CENTER 0.340361 0.83071 -0.0416443 RAD 0.00617284 + txt002 + SPHERE CENTER 0.341208 0.822249 -0.0648253 RAD 0.00617284 + txt002 + SPHERE CENTER 0.325527 0.840365 -0.0588603 RAD 0.00617284 + txt002 + SPHERE CENTER 0.320744 0.825882 -0.0274488 RAD 0.00617284 + txt002 + SPHERE CENTER 0.30591 0.835537 -0.0446649 RAD 0.00617284 + txt002 + SPHERE CENTER 0.301973 0.812593 -0.0364345 RAD 0.00617284 + txt002 + SPHERE CENTER 0.336425 0.807766 -0.0334138 RAD 0.00617284 + txt002 + SPHERE CENTER 0.317654 0.794477 -0.0423994 RAD 0.00617284 + txt002 + SPHERE CENTER 0.337272 0.799305 -0.0565949 RAD 0.00617284 + txt002 + SPHERE CENTER 0.345341 0.766968 -0.099389 RAD 0.0185185 + txt002 + SPHERE CENTER 0.369945 0.768944 -0.10004 RAD 0.00617284 + txt002 + SPHERE CENTER 0.356171 0.780624 -0.116879 RAD 0.00617284 + txt002 + SPHERE CENTER 0.356172 0.788341 -0.093424 RAD 0.00617284 + txt002 + SPHERE CENTER 0.359115 0.755289 -0.0825505 RAD 0.00617284 + txt002 + SPHERE CENTER 0.345342 0.774685 -0.0759343 RAD 0.00617284 + txt002 + SPHERE CENTER 0.334511 0.753313 -0.0818993 RAD 0.00617284 + txt002 + SPHERE CENTER 0.359113 0.747572 -0.106005 RAD 0.00617284 + txt002 + SPHERE CENTER 0.33451 0.745596 -0.105354 RAD 0.00617284 + txt002 + SPHERE CENTER 0.34534 0.759252 -0.122844 RAD 0.00617284 + txt002 + SPHERE CENTER 0.358439 0.594141 -0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER 0.408291 0.619127 -0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER 0.411883 0.625955 -0.183325 RAD 0.00617284 + txt002 + SPHERE CENTER 0.396287 0.607547 -0.178077 RAD 0.00617284 + txt002 + SPHERE CENTER 0.390369 0.630791 -0.172216 RAD 0.00617284 + txt002 + SPHERE CENTER 0.423887 0.637535 -0.165118 RAD 0.00617284 + txt002 + SPHERE CENTER 0.402373 0.642371 -0.154009 RAD 0.00617284 + txt002 + SPHERE CENTER 0.420295 0.630706 -0.141664 RAD 0.00617284 + txt002 + SPHERE CENTER 0.429805 0.61429 -0.170979 RAD 0.00617284 + txt002 + SPHERE CENTER 0.426212 0.607462 -0.147525 RAD 0.00617284 + txt002 + SPHERE CENTER 0.414208 0.595882 -0.165731 RAD 0.00617284 + txt002 + SPHERE CENTER 0.337042 0.638217 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.344865 0.652948 -0.184873 RAD 0.00617284 + txt002 + SPHERE CENTER 0.357326 0.651954 -0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.357697 0.632683 -0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.324581 0.639211 -0.18796 RAD 0.00617284 + txt002 + SPHERE CENTER 0.337413 0.618946 -0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.316758 0.624481 -0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER 0.324211 0.658482 -0.172528 RAD 0.00617284 + txt002 + SPHERE CENTER 0.316388 0.643752 -0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER 0.336672 0.657489 -0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.37761 0.665691 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.389713 0.68332 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.398265 0.660156 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.37761 0.665691 -0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER 0.369058 0.688854 -0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER 0.356956 0.671225 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.356956 0.671225 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.389713 0.68332 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.37761 0.665691 -0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER 0.398265 0.660156 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.429687 0.57505 -0.104315 RAD 0.0185185 + txt002 + SPHERE CENTER 0.452905 0.58161 -0.109563 RAD 0.00617284 + txt002 + SPHERE CENTER 0.434777 0.586467 -0.125608 RAD 0.00617284 + txt002 + SPHERE CENTER 0.436077 0.5989 -0.104315 RAD 0.00617284 + txt002 + SPHERE CENTER 0.447815 0.570193 -0.0882695 RAD 0.00617284 + txt002 + SPHERE CENTER 0.430987 0.587483 -0.0830215 RAD 0.00617284 + txt002 + SPHERE CENTER 0.424596 0.563633 -0.0830215 RAD 0.00617284 + txt002 + SPHERE CENTER 0.446515 0.55776 -0.109563 RAD 0.00617284 + txt002 + SPHERE CENTER 0.423296 0.5512 -0.104315 RAD 0.00617284 + txt002 + SPHERE CENTER 0.428387 0.562617 -0.125608 RAD 0.00617284 + txt002 + SPHERE CENTER 0.399007 0.621614 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.41723 0.637209 -0.0496945 RAD 0.00617284 + txt002 + SPHERE CENTER 0.418027 0.624734 -0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.401533 0.642848 -0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.39821 0.634089 -0.0342624 RAD 0.00617284 + txt002 + SPHERE CENTER 0.382513 0.639728 -0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER 0.379986 0.618494 -0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.414703 0.615976 -0.0373488 RAD 0.00617284 + txt002 + SPHERE CENTER 0.39648 0.600381 -0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.4155 0.603501 -0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER 0.379835 0.550064 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.396248 0.547099 -0.0373488 RAD 0.00617284 + txt002 + SPHERE CENTER 0.403175 0.557504 -0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER 0.388263 0.569716 -0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.372907 0.539659 -0.0342624 RAD 0.00617284 + txt002 + SPHERE CENTER 0.364922 0.562276 -0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.356494 0.542624 -0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER 0.387819 0.527447 -0.0496945 RAD 0.00617284 + txt002 + SPHERE CENTER 0.371406 0.530412 -0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.394747 0.537852 -0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.389119 0.547576 -0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER 0.410169 0.541008 -0.170979 RAD 0.00617284 + txt002 + SPHERE CENTER 0.405866 0.564748 -0.165731 RAD 0.00617284 + txt002 + SPHERE CENTER 0.410472 0.548718 -0.147525 RAD 0.00617284 + txt002 + SPHERE CENTER 0.393422 0.523836 -0.165118 RAD 0.00617284 + txt002 + SPHERE CENTER 0.393725 0.531546 -0.141664 RAD 0.00617284 + txt002 + SPHERE CENTER 0.372372 0.530405 -0.154009 RAD 0.00617284 + txt002 + SPHERE CENTER 0.388816 0.539866 -0.183325 RAD 0.00617284 + txt002 + SPHERE CENTER 0.367766 0.546435 -0.172216 RAD 0.00617284 + txt002 + SPHERE CENTER 0.384513 0.563607 -0.178077 RAD 0.00617284 + txt002 + SPHERE CENTER 0.339267 0.522591 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.340934 0.501272 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.359921 0.517056 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.339267 0.522591 -0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER 0.320279 0.506807 -0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER 0.318612 0.528125 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.318612 0.528125 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.340934 0.501272 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.339267 0.522591 -0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER 0.359921 0.517056 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.317871 0.566667 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.296626 0.555534 -0.172528 RAD 0.00617284 + txt002 + SPHERE CENTER 0.307914 0.550163 -0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.297216 0.572202 -0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER 0.306582 0.572037 -0.18796 RAD 0.00617284 + txt002 + SPHERE CENTER 0.307172 0.588706 -0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER 0.327827 0.583171 -0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.31728 0.549999 -0.184873 RAD 0.00617284 + txt002 + SPHERE CENTER 0.338525 0.561133 -0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.328569 0.544629 -0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.172546 0.643951 -0.222222 RAD 0.0555556 + txt002 + SPHERE CENTER 0.142305 0.674191 -0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER 0.144155 0.692502 -0.299164 RAD 0.00617284 + txt002 + SPHERE CENTER 0.150298 0.696439 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER 0.164554 0.682184 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER 0.136163 0.670254 -0.306292 RAD 0.00617284 + txt002 + SPHERE CENTER 0.156561 0.659936 -0.296959 RAD 0.00617284 + txt002 + SPHERE CENTER 0.134313 0.651943 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER 0.121907 0.684509 -0.292037 RAD 0.00617284 + txt002 + SPHERE CENTER 0.120057 0.666199 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER 0.12805 0.688447 -0.268448 RAD 0.00617284 + txt002 + SPHERE CENTER 0.100996 0.663122 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0847178 0.680265 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER 0.104191 0.675047 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.107387 0.686972 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0815225 0.66834 -0.236478 RAD 0.00617284 + txt002 + SPHERE CENTER 0.104191 0.675047 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0978007 0.651197 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0783272 0.656415 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0946054 0.639272 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0978007 0.651197 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.153374 0.715501 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.160081 0.738169 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER 0.177224 0.721891 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.165299 0.718696 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.136231 0.731779 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER 0.141449 0.712305 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.129524 0.70911 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.148156 0.734974 -0.207967 RAD 0.00617284 + txt002 + SPHERE CENTER 0.141449 0.712305 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.165299 0.718696 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.213855 0.655019 -0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER 0.213517 0.662308 -0.306292 RAD 0.00617284 + txt002 + SPHERE CENTER 0.194382 0.649801 -0.296959 RAD 0.00617284 + txt002 + SPHERE CENTER 0.198584 0.673065 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER 0.23299 0.667526 -0.292037 RAD 0.00617284 + txt002 + SPHERE CENTER 0.218058 0.678283 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER 0.233329 0.660237 -0.268448 RAD 0.00617284 + txt002 + SPHERE CENTER 0.228788 0.644262 -0.299164 RAD 0.00617284 + txt002 + SPHERE CENTER 0.229127 0.636974 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER 0.209653 0.631756 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER 0.224924 0.696329 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.23918 0.710584 -0.236478 RAD 0.00617284 + txt002 + SPHERE CENTER 0.233654 0.687599 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.216195 0.705059 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.23045 0.719314 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER 0.207465 0.713788 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.216195 0.705059 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.24791 0.701855 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER 0.233654 0.687599 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.242384 0.678869 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.244096 0.624779 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.266765 0.631486 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER 0.247291 0.636704 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.250487 0.648629 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.26357 0.619561 -0.207967 RAD 0.00617284 + txt002 + SPHERE CENTER 0.247291 0.636704 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.240901 0.612854 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.260374 0.607636 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER 0.237705 0.600929 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.240901 0.612854 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.161477 0.602641 -0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER 0.162741 0.579817 -0.292037 RAD 0.00617284 + txt002 + SPHERE CENTER 0.179523 0.58737 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER 0.156259 0.583168 -0.268448 RAD 0.00617284 + txt002 + SPHERE CENTER 0.144695 0.595088 -0.299164 RAD 0.00617284 + txt002 + SPHERE CENTER 0.138214 0.598439 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER 0.143431 0.617912 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER 0.167958 0.59929 -0.306292 RAD 0.00617284 + txt002 + SPHERE CENTER 0.166695 0.622115 -0.296959 RAD 0.00617284 + txt002 + SPHERE CENTER 0.184741 0.606843 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER 0.191718 0.5724 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.208861 0.556122 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER 0.215568 0.578791 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.203643 0.575596 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.185011 0.549732 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER 0.179793 0.569205 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.167868 0.56601 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.196936 0.552927 -0.236478 RAD 0.00617284 + txt002 + SPHERE CENTER 0.179793 0.569205 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.203643 0.575596 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.120168 0.591572 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.105912 0.577317 -0.207967 RAD 0.00617284 + txt002 + SPHERE CENTER 0.128897 0.582843 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.111438 0.600302 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0971825 0.586046 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER 0.102708 0.609032 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.111438 0.600302 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.114642 0.568587 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER 0.128897 0.582843 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.137627 0.574113 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0955788 0.852418 9.1293e-17 RAD 0.0555556 + txt002 + SPHERE CENTER 0.11107 0.922609 -0.0178949 RAD 0.0185185 + txt002 + SPHERE CENTER 0.122151 0.937225 -0.0344251 RAD 0.00617284 + txt002 + SPHERE CENTER 0.131874 0.915202 -0.0289382 RAD 0.00617284 + txt002 + SPHERE CENTER 0.11086 0.916553 -0.0418311 RAD 0.00617284 + txt002 + SPHERE CENTER 0.101346 0.944632 -0.0233819 RAD 0.00617284 + txt002 + SPHERE CENTER 0.090055 0.92396 -0.0307879 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0902645 0.930016 -0.00685171 RAD 0.00617284 + txt002 + SPHERE CENTER 0.12236 0.943281 -0.0104889 RAD 0.00617284 + txt002 + SPHERE CENTER 0.111279 0.928665 0.00604126 RAD 0.00617284 + txt002 + SPHERE CENTER 0.132084 0.921258 -0.00500196 RAD 0.00617284 + txt002 + SPHERE CENTER 0.164775 0.877966 0.00679642 RAD 0.0185185 + txt002 + SPHERE CENTER 0.182656 0.890926 -0.0042468 RAD 0.00617284 + txt002 + SPHERE CENTER 0.167676 0.876622 -0.0176871 RAD 0.00617284 + txt002 + SPHERE CENTER 0.159019 0.897331 -0.00739901 RAD 0.00617284 + txt002 + SPHERE CENTER 0.179755 0.89227 0.0202367 RAD 0.00617284 + txt002 + SPHERE CENTER 0.156118 0.898675 0.0170845 RAD 0.00617284 + txt002 + SPHERE CENTER 0.161874 0.87931 0.0312799 RAD 0.00617284 + txt002 + SPHERE CENTER 0.188412 0.871561 0.00994863 RAD 0.00617284 + txt002 + SPHERE CENTER 0.17053 0.8586 0.0209919 RAD 0.00617284 + txt002 + SPHERE CENTER 0.173431 0.857256 -0.00349164 RAD 0.00617284 + txt002 + SPHERE CENTER 0.135698 0.867231 -0.0604812 RAD 0.0185185 + txt002 + SPHERE CENTER 0.134634 0.873196 -0.0844174 RAD 0.00617284 + txt002 + SPHERE CENTER 0.11765 0.858152 -0.0746767 RAD 0.00617284 + txt002 + SPHERE CENTER 0.117797 0.882112 -0.0687117 RAD 0.00617284 + txt002 + SPHERE CENTER 0.152682 0.882275 -0.070222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.135845 0.89119 -0.0545162 RAD 0.00617284 + txt002 + SPHERE CENTER 0.153747 0.876309 -0.0462858 RAD 0.00617284 + txt002 + SPHERE CENTER 0.152536 0.858315 -0.076187 RAD 0.00617284 + txt002 + SPHERE CENTER 0.1536 0.852349 -0.0522508 RAD 0.00617284 + txt002 + SPHERE CENTER 0.135552 0.843271 -0.0664462 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0418734 0.897062 -0.0246914 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0359958 0.920407 -0.0301783 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0511067 0.915603 -0.0112511 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0588574 0.912106 -0.0344321 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0267625 0.901866 -0.0436186 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0496241 0.893565 -0.0478724 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0326401 0.878521 -0.0381316 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0190117 0.905363 -0.0204376 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0248894 0.882018 -0.0149506 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0341227 0.900559 -0.00151032 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0665023 0.841683 -0.0672777 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0454909 0.840284 -0.0801706 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0463379 0.831823 -0.0569896 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0473735 0.856111 -0.0613127 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0656554 0.850144 -0.0904587 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0675379 0.865971 -0.0716007 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0866667 0.851543 -0.0775657 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0646197 0.825856 -0.0861356 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0856311 0.827255 -0.0732426 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0654667 0.817395 -0.0629546 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0263827 0.826871 -0.00679642 RAD 0.0185185 + txt002 + SPHERE CENTER 0.00436945 0.825102 0.0042468 RAD 0.00617284 + txt002 + SPHERE CENTER 0.025051 0.823964 0.0176871 RAD 0.00617284 + txt002 + SPHERE CENTER 0.018173 0.84533 0.00739901 RAD 0.00617284 + txt002 + SPHERE CENTER 0.00570109 0.828008 -0.0202367 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0195047 0.848237 -0.0170845 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0277143 0.829777 -0.0312799 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0125791 0.806642 -0.00994863 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0345923 0.808411 -0.0209919 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0332607 0.805505 0.00349164 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0709499 0.907797 0.0425863 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0752104 0.930963 0.0499923 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0941344 0.915684 0.0457385 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0806562 0.924191 0.0268805 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0520258 0.923076 0.0468401 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0574717 0.916304 0.0237283 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0477654 0.89991 0.0394341 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0655041 0.914568 0.065698 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0612436 0.891402 0.058292 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0844281 0.899289 0.0614442 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0554592 0.837606 0.0604812 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0523913 0.842832 0.0844174 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0750766 0.842434 0.0746767 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0593957 0.86055 0.0687117 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0327739 0.838004 0.070222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0397783 0.855722 0.0545162 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0358417 0.832778 0.0462858 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0484547 0.819888 0.076187 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0515226 0.814662 0.0522508 RAD 0.00617284 + txt002 + SPHERE CENTER 0.07114 0.81949 0.0664462 RAD 0.00617284 + txt002 + SPHERE CENTER 0.124655 0.863153 0.0672777 RAD 0.0185185 + txt002 + SPHERE CENTER 0.141535 0.875744 0.0801706 RAD 0.00617284 + txt002 + SPHERE CENTER 0.146389 0.868763 0.0569896 RAD 0.00617284 + txt002 + SPHERE CENTER 0.129819 0.88655 0.0613127 RAD 0.00617284 + txt002 + SPHERE CENTER 0.119801 0.870135 0.0904587 RAD 0.00617284 + txt002 + SPHERE CENTER 0.108085 0.880941 0.0716007 RAD 0.00617284 + txt002 + SPHERE CENTER 0.102922 0.857544 0.0775657 RAD 0.00617284 + txt002 + SPHERE CENTER 0.136371 0.852347 0.0861356 RAD 0.00617284 + txt002 + SPHERE CENTER 0.119492 0.839756 0.0732426 RAD 0.00617284 + txt002 + SPHERE CENTER 0.141225 0.845366 0.0629546 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0133465 0.69376 -0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER -0.0646815 0.745859 -0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0684873 0.770032 -0.126127 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0507391 0.762305 -0.110799 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0481266 0.759394 -0.135179 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0824297 0.753586 -0.138161 RAD 0.00617284 + txt002 + SPHERE CENTER -0.062069 0.742948 -0.147213 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0786239 0.729413 -0.134867 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0850422 0.756497 -0.113782 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0812364 0.732325 -0.110488 RAD 0.00617284 + txt002 + SPHERE CENTER -0.067294 0.74877 -0.0984536 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0347427 0.737837 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0299763 0.758864 -0.0435217 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0114021 0.745277 -0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0263144 0.757489 -0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0533169 0.751424 -0.0466081 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0496549 0.750049 -0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0580833 0.730397 -0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0384047 0.739212 -0.031176 RAD 0.00617284 + txt002 + SPHERE CENTER -0.043171 0.718185 -0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0198304 0.725625 -0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0058253 0.76531 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0179281 0.782939 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.02648 0.759776 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0058253 0.76531 -0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER -0.00272662 0.788473 -0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0148294 0.770845 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0148294 0.770845 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0179281 0.782939 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0058253 0.76531 -0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER 0.02648 0.759776 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0432853 0.701782 -0.178389 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0544915 0.717566 -0.193717 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0588496 0.718734 -0.169441 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0368947 0.725632 -0.178389 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0389272 0.700615 -0.202664 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0213304 0.708681 -0.187336 RAD 0.00617284 + txt002 + SPHERE CENTER -0.027721 0.684831 -0.187336 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0608821 0.693716 -0.193717 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0496759 0.677932 -0.178389 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0652402 0.694884 -0.169441 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0272215 0.721234 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0280589 0.725055 -0.191046 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0172649 0.70473 -0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.00656677 0.726768 -0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0380155 0.741558 -0.175614 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0165234 0.743272 -0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0371781 0.737738 -0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0487136 0.71952 -0.178701 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0478762 0.715699 -0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0379196 0.699195 -0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER 0.00804971 0.649684 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0275193 0.640422 -0.178701 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0283337 0.66342 -0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0287044 0.644149 -0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER 0.00723527 0.626685 -0.175614 RAD 0.00617284 + txt002 + SPHERE CENTER 0.00842045 0.630413 -0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0122343 0.635947 -0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.00686453 0.645956 -0.191046 RAD 0.00617284 + txt002 + SPHERE CENTER -0.012605 0.655218 -0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.00767898 0.668955 -0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0838533 0.674309 -0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER -0.106805 0.675276 -0.113782 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0875713 0.673094 -0.0984536 RAD 0.00617284 + txt002 + SPHERE CENTER -0.091423 0.694308 -0.110488 RAD 0.00617284 + txt002 + SPHERE CENTER -0.103087 0.676491 -0.138161 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0877049 0.695522 -0.134867 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0801352 0.675524 -0.147213 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0992356 0.655278 -0.126127 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0762835 0.65431 -0.135179 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0800016 0.653095 -0.110799 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0325183 0.62221 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0308513 0.600892 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0118635 0.616676 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0325183 0.62221 -0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER -0.051506 0.606426 -0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER -0.053173 0.627745 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.053173 0.627745 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0308513 0.600892 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0325183 0.62221 -0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0118635 0.616676 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0539145 0.666287 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0577732 0.666927 -0.031176 RAD 0.00617284 + txt002 + SPHERE CENTER -0.034894 0.669407 -0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0513875 0.68752 -0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0767937 0.663807 -0.0466081 RAD 0.00617284 + txt002 + SPHERE CENTER -0.070408 0.6844 -0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER -0.072935 0.663167 -0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0603001 0.645694 -0.0435217 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0564414 0.645053 -0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0374209 0.648173 -0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0133465 0.69376 0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER -0.0440268 0.740325 0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0417568 0.762259 0.170979 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0216407 0.748937 0.165731 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0345526 0.759495 0.147525 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0641429 0.753646 0.165118 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0569387 0.750882 0.141664 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0664129 0.731712 0.154009 RAD 0.00617284 + txt002 + SPHERE CENTER -0.051231 0.743089 0.183325 RAD 0.00617284 + txt002 + SPHERE CENTER -0.053501 0.721155 0.172216 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0311149 0.729767 0.178077 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0272215 0.721234 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0454452 0.736829 0.172528 RAD 0.00617284 + txt002 + SPHERE CENTER 0.046242 0.724354 0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0297485 0.742467 0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0264247 0.733709 0.18796 RAD 0.00617284 + txt002 + SPHERE CENTER 0.010728 0.739347 0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER 0.00820099 0.718114 0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0429182 0.715595 0.184873 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0246945 0.7 0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.043715 0.70312 0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0058253 0.76531 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0179281 0.782939 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.02648 0.759776 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0058253 0.76531 0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER -0.00272662 0.788473 0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0148294 0.770845 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0148294 0.770845 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0179281 0.782939 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0058253 0.76531 0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER 0.02648 0.759776 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0845947 0.712851 0.104315 RAD 0.0185185 + txt002 + SPHERE CENTER -0.101422 0.730141 0.109563 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0832945 0.725284 0.125608 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0782041 0.736701 0.104315 RAD 0.00617284 + txt002 + SPHERE CENTER -0.102723 0.717709 0.0882695 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0795043 0.724268 0.0830215 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0858949 0.700418 0.0830215 RAD 0.00617284 + txt002 + SPHERE CENTER -0.107813 0.706291 0.109563 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0909853 0.689001 0.104315 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0896851 0.701434 0.125608 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0347427 0.737837 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0269197 0.752567 0.0373488 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0144587 0.751574 0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER -0.014088 0.732303 0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0472037 0.73883 0.0342624 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0343719 0.718566 0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0550267 0.7241 0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0475745 0.758102 0.0496945 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0553974 0.743371 0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0351134 0.757108 0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0539145 0.666287 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0751594 0.655153 0.0496945 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0638711 0.649783 0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0745692 0.671821 0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0652028 0.671657 0.0342624 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0646126 0.688325 0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0439578 0.682791 0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0545047 0.649619 0.0373488 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0332597 0.660752 0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0432164 0.644249 0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0631985 0.668775 0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0708196 0.669983 0.183325 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0467378 0.671462 0.178077 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0618185 0.690113 0.172216 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0872804 0.667296 0.165118 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0782793 0.687426 0.154009 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0796593 0.666087 0.141664 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0721997 0.648644 0.170979 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0645786 0.647436 0.147525 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0481178 0.650123 0.165731 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0325183 0.62221 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0308513 0.600892 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0118635 0.616676 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0325183 0.62221 0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER -0.051506 0.606426 0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER -0.053173 0.627745 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.053173 0.627745 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0308513 0.600892 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0325183 0.62221 0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0118635 0.616676 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.00804971 0.649684 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0244627 0.646718 0.184873 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0313903 0.657124 0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.016478 0.669336 0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.00112207 0.639278 0.18796 RAD 0.00617284 + txt002 + SPHERE CENTER -0.00686255 0.661896 0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0152909 0.642244 0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0160343 0.627066 0.172528 RAD 0.00617284 + txt002 + SPHERE CENTER -0.000378614 0.630031 0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER 0.022962 0.637471 0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.281471 0.802608 0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER 0.329459 0.858698 0.104938 RAD 0.0185185 + txt002 + SPHERE CENTER 0.34259 0.872345 0.0890951 RAD 0.00617284 + txt002 + SPHERE CENTER 0.338969 0.848329 0.0846485 RAD 0.00617284 + txt002 + SPHERE CENTER 0.32016 0.86421 0.0827387 RAD 0.00617284 + txt002 + SPHERE CENTER 0.333079 0.882715 0.109385 RAD 0.00617284 + txt002 + SPHERE CENTER 0.310649 0.87458 0.103028 RAD 0.00617284 + txt002 + SPHERE CENTER 0.319948 0.869068 0.125228 RAD 0.00617284 + txt002 + SPHERE CENTER 0.351888 0.866833 0.111295 RAD 0.00617284 + txt002 + SPHERE CENTER 0.338757 0.853186 0.127138 RAD 0.00617284 + txt002 + SPHERE CENTER 0.348268 0.842817 0.106848 RAD 0.00617284 + txt002 + SPHERE CENTER 0.337088 0.798572 0.062352 RAD 0.0185185 + txt002 + SPHERE CENTER 0.346884 0.808673 0.0420622 RAD 0.00617284 + txt002 + SPHERE CENTER 0.322361 0.807762 0.044793 RAD 0.00617284 + txt002 + SPHERE CENTER 0.335792 0.82298 0.0588533 RAD 0.00617284 + txt002 + SPHERE CENTER 0.361611 0.799483 0.0596212 RAD 0.00617284 + txt002 + SPHERE CENTER 0.350519 0.81379 0.0764123 RAD 0.00617284 + txt002 + SPHERE CENTER 0.351815 0.789382 0.079911 RAD 0.00617284 + txt002 + SPHERE CENTER 0.34818 0.784265 0.0455609 RAD 0.00617284 + txt002 + SPHERE CENTER 0.338384 0.774164 0.0658506 RAD 0.00617284 + txt002 + SPHERE CENTER 0.323657 0.783355 0.0482916 RAD 0.00617284 + txt002 + SPHERE CENTER 0.280879 0.845371 0.0506299 RAD 0.0185185 + txt002 + SPHERE CENTER 0.291048 0.849036 0.0284303 RAD 0.00617284 + txt002 + SPHERE CENTER 0.304882 0.840755 0.0471312 RAD 0.00617284 + txt002 + SPHERE CENTER 0.287867 0.826067 0.0369125 RAD 0.00617284 + txt002 + SPHERE CENTER 0.267046 0.853652 0.0319289 RAD 0.00617284 + txt002 + SPHERE CENTER 0.263865 0.830683 0.0404111 RAD 0.00617284 + txt002 + SPHERE CENTER 0.256877 0.849987 0.0541285 RAD 0.00617284 + txt002 + SPHERE CENTER 0.28406 0.868341 0.0421477 RAD 0.00617284 + txt002 + SPHERE CENTER 0.273891 0.864676 0.0643473 RAD 0.00617284 + txt002 + SPHERE CENTER 0.297894 0.86006 0.0608487 RAD 0.00617284 + txt002 + SPHERE CENTER 0.273842 0.862735 0.153697 RAD 0.0185185 + txt002 + SPHERE CENTER 0.282313 0.885497 0.158144 RAD 0.00617284 + txt002 + SPHERE CENTER 0.29787 0.867718 0.150967 RAD 0.00617284 + txt002 + SPHERE CENTER 0.281455 0.876946 0.134996 RAD 0.00617284 + txt002 + SPHERE CENTER 0.258284 0.880514 0.160875 RAD 0.00617284 + txt002 + SPHERE CENTER 0.257427 0.871963 0.137727 RAD 0.00617284 + txt002 + SPHERE CENTER 0.249813 0.857752 0.156428 RAD 0.00617284 + txt002 + SPHERE CENTER 0.274699 0.871286 0.176845 RAD 0.00617284 + txt002 + SPHERE CENTER 0.266228 0.848523 0.172398 RAD 0.00617284 + txt002 + SPHERE CENTER 0.290257 0.853506 0.169668 RAD 0.00617284 + txt002 + SPHERE CENTER 0.225263 0.849407 0.099389 RAD 0.0185185 + txt002 + SPHERE CENTER 0.21889 0.873186 0.0974792 RAD 0.00617284 + txt002 + SPHERE CENTER 0.236437 0.866351 0.113449 RAD 0.00617284 + txt002 + SPHERE CENTER 0.240865 0.865588 0.0891702 RAD 0.00617284 + txt002 + SPHERE CENTER 0.207715 0.856242 0.0834188 RAD 0.00617284 + txt002 + SPHERE CENTER 0.22969 0.848644 0.0751099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.214088 0.832464 0.0853287 RAD 0.00617284 + txt002 + SPHERE CENTER 0.203288 0.857005 0.107698 RAD 0.00617284 + txt002 + SPHERE CENTER 0.20966 0.833227 0.109608 RAD 0.00617284 + txt002 + SPHERE CENTER 0.220835 0.850171 0.123668 RAD 0.00617284 + txt002 + SPHERE CENTER 0.225855 0.806645 0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER 0.21762 0.818054 0.18016 RAD 0.00617284 + txt002 + SPHERE CENTER 0.241754 0.813612 0.177429 RAD 0.00617284 + txt002 + SPHERE CENTER 0.230661 0.83061 0.163369 RAD 0.00617284 + txt002 + SPHERE CENTER 0.20172 0.811087 0.162601 RAD 0.00617284 + txt002 + SPHERE CENTER 0.214761 0.823642 0.14581 RAD 0.00617284 + txt002 + SPHERE CENTER 0.209955 0.799677 0.142311 RAD 0.00617284 + txt002 + SPHERE CENTER 0.212813 0.794089 0.176661 RAD 0.00617284 + txt002 + SPHERE CENTER 0.221048 0.78268 0.156372 RAD 0.00617284 + txt002 + SPHERE CENTER 0.236948 0.789647 0.173931 RAD 0.00617284 + txt002 + SPHERE CENTER 0.330051 0.815936 0.165419 RAD 0.0185185 + txt002 + SPHERE CENTER 0.350165 0.828769 0.171776 RAD 0.00617284 + txt002 + SPHERE CENTER 0.347547 0.820583 0.148628 RAD 0.00617284 + txt002 + SPHERE CENTER 0.333232 0.838905 0.156937 RAD 0.00617284 + txt002 + SPHERE CENTER 0.332668 0.824121 0.188567 RAD 0.00617284 + txt002 + SPHERE CENTER 0.315735 0.834258 0.173728 RAD 0.00617284 + txt002 + SPHERE CENTER 0.312554 0.811288 0.182211 RAD 0.00617284 + txt002 + SPHERE CENTER 0.346984 0.805799 0.180258 RAD 0.00617284 + txt002 + SPHERE CENTER 0.32687 0.792966 0.173902 RAD 0.00617284 + txt002 + SPHERE CENTER 0.344366 0.797614 0.157111 RAD 0.00617284 + txt002 + SPHERE CENTER 0.282063 0.759846 0.171592 RAD 0.0185185 + txt002 + SPHERE CENTER 0.29233 0.756464 0.193792 RAD 0.00617284 + txt002 + SPHERE CENTER 0.305929 0.765125 0.175091 RAD 0.00617284 + txt002 + SPHERE CENTER 0.288514 0.779336 0.18531 RAD 0.00617284 + txt002 + SPHERE CENTER 0.268464 0.751185 0.190293 RAD 0.00617284 + txt002 + SPHERE CENTER 0.264649 0.774058 0.181811 RAD 0.00617284 + txt002 + SPHERE CENTER 0.258198 0.754567 0.168094 RAD 0.00617284 + txt002 + SPHERE CENTER 0.285879 0.736973 0.180075 RAD 0.00617284 + txt002 + SPHERE CENTER 0.275612 0.740355 0.157875 RAD 0.00617284 + txt002 + SPHERE CENTER 0.299478 0.745634 0.161374 RAD 0.00617284 + txt002 + SPHERE CENTER 0.33768 0.75581 0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER 0.362219 0.753851 0.124743 RAD 0.00617284 + txt002 + SPHERE CENTER 0.352319 0.76987 0.108773 RAD 0.00617284 + txt002 + SPHERE CENTER 0.350765 0.774086 0.133052 RAD 0.00617284 + txt002 + SPHERE CENTER 0.347581 0.739791 0.138803 RAD 0.00617284 + txt002 + SPHERE CENTER 0.336127 0.760026 0.147112 RAD 0.00617284 + txt002 + SPHERE CENTER 0.323042 0.74175 0.136894 RAD 0.00617284 + txt002 + SPHERE CENTER 0.349134 0.735575 0.114524 RAD 0.00617284 + txt002 + SPHERE CENTER 0.324595 0.737534 0.112614 RAD 0.00617284 + txt002 + SPHERE CENTER 0.339233 0.751594 0.0985541 RAD 0.00617284 + txt002 + SPHERE CENTER 0.172546 0.643951 0.222222 RAD 0.0555556 + txt002 + SPHERE CENTER 0.202787 0.674191 0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER 0.219248 0.690652 0.290934 RAD 0.00617284 + txt002 + SPHERE CENTER 0.223862 0.677807 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.206403 0.695267 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.198172 0.687036 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER 0.185327 0.691651 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER 0.181711 0.670575 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER 0.215632 0.669577 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER 0.199171 0.653116 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER 0.220246 0.656732 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER 0.244096 0.663122 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.261725 0.675225 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.244096 0.663122 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER 0.238562 0.683777 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.261725 0.675225 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.238562 0.683777 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.244096 0.663122 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER 0.267259 0.65457 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.249631 0.642468 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.249631 0.642468 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.191718 0.715501 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.203821 0.733129 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.212373 0.709966 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.191718 0.715501 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER 0.183166 0.738664 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.171063 0.721035 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.171063 0.721035 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.203821 0.733129 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.191718 0.715501 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER 0.212373 0.709966 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.131237 0.655019 0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER 0.12881 0.668451 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER 0.151296 0.662426 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER 0.137627 0.678869 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER 0.108751 0.661044 0.290934 RAD 0.00617284 + txt002 + SPHERE CENTER 0.117567 0.671463 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.111177 0.647613 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.12242 0.644601 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER 0.124846 0.631169 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER 0.144906 0.638576 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER 0.120168 0.696329 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.115992 0.720665 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.135288 0.711449 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.135288 0.711449 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.100872 0.705544 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.120168 0.696329 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER 0.105047 0.681209 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.100872 0.705544 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.105047 0.681209 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.120168 0.696329 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER 0.100996 0.624779 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0796777 0.626446 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.100996 0.624779 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0954616 0.645433 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0796777 0.626446 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0954616 0.645433 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.100996 0.624779 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0852121 0.605791 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.10653 0.604124 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.10653 0.604124 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.183615 0.602641 0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER 0.197046 0.600215 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER 0.207465 0.609032 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER 0.191021 0.622701 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER 0.173196 0.593824 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER 0.167171 0.61631 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER 0.159765 0.596251 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER 0.18964 0.580155 0.290934 RAD 0.00617284 + txt002 + SPHERE CENTER 0.176209 0.582581 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.200059 0.588972 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.153374 0.5724 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.155041 0.551082 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.174029 0.566866 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.153374 0.5724 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER 0.134387 0.556617 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.13272 0.577935 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.13272 0.577935 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.155041 0.551082 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.153374 0.5724 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER 0.174029 0.566866 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.224924 0.591572 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.24926 0.587397 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.240045 0.606693 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.240045 0.606693 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.23414 0.572277 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.224924 0.591572 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER 0.209804 0.576452 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.23414 0.572277 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.209804 0.576452 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.224924 0.591572 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER 0.358439 0.594141 0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER 0.428945 0.613592 0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER 0.448155 0.626191 0.113782 RAD 0.00617284 + txt002 + SPHERE CENTER 0.43276 0.614455 0.0984536 RAD 0.00617284 + txt002 + SPHERE CENTER 0.42519 0.634643 0.110488 RAD 0.00617284 + txt002 + SPHERE CENTER 0.44434 0.625328 0.138161 RAD 0.00617284 + txt002 + SPHERE CENTER 0.421375 0.63378 0.134867 RAD 0.00617284 + txt002 + SPHERE CENTER 0.42513 0.612729 0.147213 RAD 0.00617284 + txt002 + SPHERE CENTER 0.45191 0.60514 0.126127 RAD 0.00617284 + txt002 + SPHERE CENTER 0.4327 0.592541 0.135179 RAD 0.00617284 + txt002 + SPHERE CENTER 0.436515 0.593404 0.110799 RAD 0.00617284 + txt002 + SPHERE CENTER 0.399007 0.621614 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.399844 0.625435 0.031176 RAD 0.00617284 + txt002 + SPHERE CENTER 0.38905 0.60511 0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.378352 0.627149 0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.409801 0.641939 0.0466081 RAD 0.00617284 + txt002 + SPHERE CENTER 0.388308 0.643653 0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER 0.408963 0.638118 0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.420499 0.619901 0.0435217 RAD 0.00617284 + txt002 + SPHERE CENTER 0.419661 0.61608 0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.409705 0.599576 0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER 0.37761 0.665691 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.389713 0.68332 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.398265 0.660156 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.37761 0.665691 0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER 0.369058 0.688854 0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER 0.356956 0.671225 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.356956 0.671225 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.389713 0.68332 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.37761 0.665691 0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER 0.398265 0.660156 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.388377 0.586119 0.178389 RAD 0.0185185 + txt002 + SPHERE CENTER 0.405974 0.594185 0.193717 RAD 0.00617284 + txt002 + SPHERE CENTER 0.410332 0.593017 0.169441 RAD 0.00617284 + txt002 + SPHERE CENTER 0.394768 0.609969 0.178389 RAD 0.00617284 + txt002 + SPHERE CENTER 0.384019 0.587286 0.202664 RAD 0.00617284 + txt002 + SPHERE CENTER 0.372813 0.60307 0.187336 RAD 0.00617284 + txt002 + SPHERE CENTER 0.366422 0.57922 0.187336 RAD 0.00617284 + txt002 + SPHERE CENTER 0.399584 0.570335 0.193717 RAD 0.00617284 + txt002 + SPHERE CENTER 0.381987 0.562269 0.178389 RAD 0.00617284 + txt002 + SPHERE CENTER 0.403942 0.569167 0.169441 RAD 0.00617284 + txt002 + SPHERE CENTER 0.337042 0.638217 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.341809 0.659244 0.178701 RAD 0.00617284 + txt002 + SPHERE CENTER 0.360383 0.645657 0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER 0.345471 0.65787 0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER 0.318468 0.651804 0.175614 RAD 0.00617284 + txt002 + SPHERE CENTER 0.32213 0.65043 0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.313702 0.630777 0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.33338 0.639592 0.191046 RAD 0.00617284 + txt002 + SPHERE CENTER 0.328614 0.618565 0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.351955 0.626005 0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.317871 0.566667 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.314012 0.567308 0.191046 RAD 0.00617284 + txt002 + SPHERE CENTER 0.336891 0.569787 0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.320398 0.587901 0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.294991 0.564188 0.175614 RAD 0.00617284 + txt002 + SPHERE CENTER 0.301377 0.584781 0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.29885 0.563547 0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.311485 0.546074 0.178701 RAD 0.00617284 + txt002 + SPHERE CENTER 0.315344 0.545434 0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER 0.334364 0.548554 0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER 0.409774 0.542042 0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER 0.433888 0.53788 0.126127 RAD 0.00617284 + txt002 + SPHERE CENTER 0.426423 0.55574 0.110799 RAD 0.00617284 + txt002 + SPHERE CENTER 0.423551 0.558395 0.135179 RAD 0.00617284 + txt002 + SPHERE CENTER 0.417238 0.524182 0.138161 RAD 0.00617284 + txt002 + SPHERE CENTER 0.406901 0.544697 0.147213 RAD 0.00617284 + txt002 + SPHERE CENTER 0.393124 0.528344 0.134867 RAD 0.00617284 + txt002 + SPHERE CENTER 0.42011 0.521526 0.113782 RAD 0.00617284 + txt002 + SPHERE CENTER 0.395996 0.525689 0.110488 RAD 0.00617284 + txt002 + SPHERE CENTER 0.412646 0.539387 0.0984536 RAD 0.00617284 + txt002 + SPHERE CENTER 0.339267 0.522591 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.340934 0.501272 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.359921 0.517056 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.339267 0.522591 0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER 0.320279 0.506807 0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER 0.318612 0.528125 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.318612 0.528125 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.340934 0.501272 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.339267 0.522591 0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER 0.359921 0.517056 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.379835 0.550064 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.399304 0.540802 0.0435217 RAD 0.00617284 + txt002 + SPHERE CENTER 0.400119 0.563801 0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER 0.400489 0.54453 0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.37902 0.527065 0.0466081 RAD 0.00617284 + txt002 + SPHERE CENTER 0.380205 0.530793 0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.359551 0.536327 0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER 0.37865 0.546337 0.031176 RAD 0.00617284 + txt002 + SPHERE CENTER 0.35918 0.555599 0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.379464 0.569335 0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.371785 0.0996195 0.544331 RAD 0.166667 + txt002 + SPHERE CENTER -0.393621 0.220501 0.729516 RAD 0.0555556 + txt002 + SPHERE CENTER -0.368601 0.279642 0.766439 RAD 0.0185185 + txt002 + SPHERE CENTER -0.354293 0.299716 0.765035 RAD 0.00617284 + txt002 + SPHERE CENTER -0.347717 0.279022 0.753281 RAD 0.00617284 + txt002 + SPHERE CENTER -0.366989 0.292196 0.745238 RAD 0.00617284 + txt002 + SPHERE CENTER -0.375177 0.300337 0.778193 RAD 0.00617284 + txt002 + SPHERE CENTER -0.387873 0.292817 0.758396 RAD 0.00617284 + txt002 + SPHERE CENTER -0.389485 0.280263 0.779597 RAD 0.00617284 + txt002 + SPHERE CENTER -0.355904 0.287162 0.786236 RAD 0.00617284 + txt002 + SPHERE CENTER -0.370213 0.267088 0.787639 RAD 0.00617284 + txt002 + SPHERE CENTER -0.349329 0.266468 0.774481 RAD 0.00617284 + txt002 + SPHERE CENTER -0.321889 0.238665 0.726118 RAD 0.0185185 + txt002 + SPHERE CENTER -0.304702 0.250544 0.71296 RAD 0.00617284 + txt002 + SPHERE CENTER -0.32307 0.238717 0.701455 RAD 0.00617284 + txt002 + SPHERE CENTER -0.327715 0.259421 0.714081 RAD 0.00617284 + txt002 + SPHERE CENTER -0.30352 0.250492 0.737623 RAD 0.00617284 + txt002 + SPHERE CENTER -0.326533 0.259369 0.738744 RAD 0.00617284 + txt002 + SPHERE CENTER -0.320707 0.238612 0.750781 RAD 0.00617284 + txt002 + SPHERE CENTER -0.298875 0.229788 0.724997 RAD 0.00617284 + txt002 + SPHERE CENTER -0.316063 0.217908 0.738155 RAD 0.00617284 + txt002 + SPHERE CENTER -0.317244 0.21796 0.713492 RAD 0.00617284 + txt002 + SPHERE CENTER -0.372464 0.281062 0.692479 RAD 0.0185185 + txt002 + SPHERE CENTER -0.362978 0.289441 0.671279 RAD 0.00617284 + txt002 + SPHERE CENTER -0.35549 0.267771 0.680442 RAD 0.00617284 + txt002 + SPHERE CENTER -0.378255 0.270044 0.671155 RAD 0.00617284 + txt002 + SPHERE CENTER -0.379952 0.302733 0.683315 RAD 0.00617284 + txt002 + SPHERE CENTER -0.395229 0.283335 0.683192 RAD 0.00617284 + txt002 + SPHERE CENTER -0.389438 0.294353 0.704516 RAD 0.00617284 + txt002 + SPHERE CENTER -0.357187 0.30046 0.692603 RAD 0.00617284 + txt002 + SPHERE CENTER -0.366673 0.29208 0.713804 RAD 0.00617284 + txt002 + SPHERE CENTER -0.349699 0.278789 0.701767 RAD 0.00617284 + txt002 + SPHERE CENTER -0.440333 0.261479 0.769837 RAD 0.0185185 + txt002 + SPHERE CENTER -0.443285 0.282991 0.781591 RAD 0.00617284 + txt002 + SPHERE CENTER -0.421181 0.271991 0.781342 RAD 0.00617284 + txt002 + SPHERE CENTER -0.4302 0.282046 0.760673 RAD 0.00617284 + txt002 + SPHERE CENTER -0.462437 0.27248 0.770086 RAD 0.00617284 + txt002 + SPHERE CENTER -0.449353 0.271534 0.749168 RAD 0.00617284 + txt002 + SPHERE CENTER -0.459485 0.250967 0.758332 RAD 0.00617284 + txt002 + SPHERE CENTER -0.453417 0.262424 0.790755 RAD 0.00617284 + txt002 + SPHERE CENTER -0.450466 0.240911 0.779001 RAD 0.00617284 + txt002 + SPHERE CENTER -0.431313 0.251423 0.790506 RAD 0.00617284 + txt002 + SPHERE CENTER -0.444196 0.262898 0.695877 RAD 0.0185185 + txt002 + SPHERE CENTER -0.449273 0.285685 0.687835 RAD 0.00617284 + txt002 + SPHERE CENTER -0.436139 0.282528 0.708504 RAD 0.00617284 + txt002 + SPHERE CENTER -0.426189 0.27701 0.68659 RAD 0.00617284 + txt002 + SPHERE CENTER -0.45733 0.266055 0.675209 RAD 0.00617284 + txt002 + SPHERE CENTER -0.434246 0.257381 0.673964 RAD 0.00617284 + txt002 + SPHERE CENTER -0.452254 0.243269 0.683251 RAD 0.00617284 + txt002 + SPHERE CENTER -0.46728 0.271573 0.697123 RAD 0.00617284 + txt002 + SPHERE CENTER -0.462204 0.248787 0.705165 RAD 0.00617284 + txt002 + SPHERE CENTER -0.454146 0.268416 0.717791 RAD 0.00617284 + txt002 + SPHERE CENTER -0.465353 0.202338 0.732914 RAD 0.0185185 + txt002 + SPHERE CENTER -0.486123 0.204606 0.746073 RAD 0.00617284 + txt002 + SPHERE CENTER -0.464339 0.202946 0.757577 RAD 0.00617284 + txt002 + SPHERE CENTER -0.470107 0.223366 0.744951 RAD 0.00617284 + txt002 + SPHERE CENTER -0.487137 0.203998 0.72141 RAD 0.00617284 + txt002 + SPHERE CENTER -0.471122 0.222757 0.720288 RAD 0.00617284 + txt002 + SPHERE CENTER -0.466367 0.201729 0.708251 RAD 0.00617284 + txt002 + SPHERE CENTER -0.481368 0.183578 0.734036 RAD 0.00617284 + txt002 + SPHERE CENTER -0.460599 0.18131 0.720878 RAD 0.00617284 + txt002 + SPHERE CENTER -0.459584 0.181918 0.745541 RAD 0.00617284 + txt002 + SPHERE CENTER -0.389758 0.219082 0.803476 RAD 0.0185185 + txt002 + SPHERE CENTER -0.378635 0.228779 0.823273 RAD 0.00617284 + txt002 + SPHERE CENTER -0.365937 0.225483 0.802355 RAD 0.00617284 + txt002 + SPHERE CENTER -0.383364 0.24293 0.8036 RAD 0.00617284 + txt002 + SPHERE CENTER -0.402455 0.222377 0.824394 RAD 0.00617284 + txt002 + SPHERE CENTER -0.407185 0.236529 0.804721 RAD 0.00617284 + txt002 + SPHERE CENTER -0.413578 0.21268 0.804597 RAD 0.00617284 + txt002 + SPHERE CENTER -0.385029 0.20493 0.823149 RAD 0.00617284 + txt002 + SPHERE CENTER -0.396152 0.195233 0.803352 RAD 0.00617284 + txt002 + SPHERE CENTER -0.372331 0.201634 0.802231 RAD 0.00617284 + txt002 + SPHERE CENTER -0.414778 0.15994 0.766553 RAD 0.0185185 + txt002 + SPHERE CENTER -0.412573 0.147477 0.787754 RAD 0.00617284 + txt002 + SPHERE CENTER -0.39322 0.15977 0.77859 RAD 0.00617284 + txt002 + SPHERE CENTER -0.412448 0.172167 0.787878 RAD 0.00617284 + txt002 + SPHERE CENTER -0.434131 0.147647 0.775717 RAD 0.00617284 + txt002 + SPHERE CENTER -0.434006 0.172338 0.775841 RAD 0.00617284 + txt002 + SPHERE CENTER -0.436336 0.16011 0.754517 RAD 0.00617284 + txt002 + SPHERE CENTER -0.414903 0.13525 0.766429 RAD 0.00617284 + txt002 + SPHERE CENTER -0.417108 0.147713 0.745229 RAD 0.00617284 + txt002 + SPHERE CENTER -0.39555 0.147543 0.757266 RAD 0.00617284 + txt002 + SPHERE CENTER -0.343046 0.178104 0.763155 RAD 0.0185185 + txt002 + SPHERE CENTER -0.319723 0.177083 0.771198 RAD 0.00617284 + txt002 + SPHERE CENTER -0.325124 0.189464 0.750529 RAD 0.00617284 + txt002 + SPHERE CENTER -0.332294 0.198298 0.772443 RAD 0.00617284 + txt002 + SPHERE CENTER -0.337645 0.165722 0.783824 RAD 0.00617284 + txt002 + SPHERE CENTER -0.350216 0.186938 0.785069 RAD 0.00617284 + txt002 + SPHERE CENTER -0.360967 0.166743 0.775781 RAD 0.00617284 + txt002 + SPHERE CENTER -0.330475 0.156889 0.76191 RAD 0.00617284 + txt002 + SPHERE CENTER -0.353797 0.157909 0.753867 RAD 0.00617284 + txt002 + SPHERE CENTER -0.335876 0.16927 0.741241 RAD 0.00617284 + txt002 + SPHERE CENTER -0.191247 0.166275 0.655442 RAD 0.0555556 + txt002 + SPHERE CENTER -0.130089 0.20793 0.652044 RAD 0.0185185 + txt002 + SPHERE CENTER -0.115471 0.221102 0.637128 RAD 0.00617284 + txt002 + SPHERE CENTER -0.126388 0.200597 0.628759 RAD 0.00617284 + txt002 + SPHERE CENTER -0.13987 0.220766 0.633356 RAD 0.00617284 + txt002 + SPHERE CENTER -0.119172 0.228435 0.660413 RAD 0.00617284 + txt002 + SPHERE CENTER -0.143571 0.228099 0.656641 RAD 0.00617284 + txt002 + SPHERE CENTER -0.13379 0.215264 0.675329 RAD 0.00617284 + txt002 + SPHERE CENTER -0.10569 0.208266 0.655816 RAD 0.00617284 + txt002 + SPHERE CENTER -0.120308 0.195095 0.670732 RAD 0.00617284 + txt002 + SPHERE CENTER -0.116607 0.187762 0.647447 RAD 0.00617284 + txt002 + SPHERE CENTER -0.154295 0.172673 0.591563 RAD 0.0185185 + txt002 + SPHERE CENTER -0.15554 0.180792 0.568278 RAD 0.00617284 + txt002 + SPHERE CENTER -0.17557 0.171251 0.579113 RAD 0.00617284 + txt002 + SPHERE CENTER -0.166926 0.19323 0.586315 RAD 0.00617284 + txt002 + SPHERE CENTER -0.134265 0.182215 0.580727 RAD 0.00617284 + txt002 + SPHERE CENTER -0.145651 0.194652 0.598764 RAD 0.00617284 + txt002 + SPHERE CENTER -0.133019 0.174096 0.604012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.142909 0.160236 0.573526 RAD 0.00617284 + txt002 + SPHERE CENTER -0.141663 0.152117 0.596811 RAD 0.00617284 + txt002 + SPHERE CENTER -0.162939 0.150694 0.584361 RAD 0.00617284 + txt002 + SPHERE CENTER -0.192135 0.230419 0.618405 RAD 0.0185185 + txt002 + SPHERE CENTER -0.18209 0.243049 0.599717 RAD 0.00617284 + txt002 + SPHERE CENTER -0.168159 0.227721 0.613157 RAD 0.00617284 + txt002 + SPHERE CENTER -0.185251 0.218634 0.597829 RAD 0.00617284 + txt002 + SPHERE CENTER -0.206066 0.245747 0.604965 RAD 0.00617284 + txt002 + SPHERE CENTER -0.209227 0.221332 0.603077 RAD 0.00617284 + txt002 + SPHERE CENTER -0.216111 0.233117 0.623653 RAD 0.00617284 + txt002 + SPHERE CENTER -0.188974 0.254834 0.620293 RAD 0.00617284 + txt002 + SPHERE CENTER -0.199019 0.242204 0.638981 RAD 0.00617284 + txt002 + SPHERE CENTER -0.175043 0.239506 0.633733 RAD 0.00617284 + txt002 + SPHERE CENTER -0.167041 0.201532 0.715923 RAD 0.0185185 + txt002 + SPHERE CENTER -0.151829 0.219088 0.724292 RAD 0.00617284 + txt002 + SPHERE CENTER -0.14514 0.205084 0.705088 RAD 0.00617284 + txt002 + SPHERE CENTER -0.163068 0.221861 0.702483 RAD 0.00617284 + txt002 + SPHERE CENTER -0.173729 0.215537 0.735128 RAD 0.00617284 + txt002 + SPHERE CENTER -0.184969 0.218309 0.713318 RAD 0.00617284 + txt002 + SPHERE CENTER -0.188942 0.197981 0.726759 RAD 0.00617284 + txt002 + SPHERE CENTER -0.155801 0.19876 0.737733 RAD 0.00617284 + txt002 + SPHERE CENTER -0.171014 0.181204 0.729364 RAD 0.00617284 + txt002 + SPHERE CENTER -0.149113 0.184756 0.718528 RAD 0.00617284 + txt002 + SPHERE CENTER -0.229087 0.224021 0.682285 RAD 0.0185185 + txt002 + SPHERE CENTER -0.22829 0.248268 0.686881 RAD 0.00617284 + txt002 + SPHERE CENTER -0.207937 0.234532 0.689486 RAD 0.00617284 + txt002 + SPHERE CENTER -0.216949 0.2391 0.666956 RAD 0.00617284 + txt002 + SPHERE CENTER -0.249439 0.237756 0.67968 RAD 0.00617284 + txt002 + SPHERE CENTER -0.238098 0.228589 0.659755 RAD 0.00617284 + txt002 + SPHERE CENTER -0.250236 0.213509 0.675083 RAD 0.00617284 + txt002 + SPHERE CENTER -0.240428 0.233189 0.702209 RAD 0.00617284 + txt002 + SPHERE CENTER -0.241225 0.208942 0.697613 RAD 0.00617284 + txt002 + SPHERE CENTER -0.220075 0.219453 0.704814 RAD 0.00617284 + txt002 + SPHERE CENTER -0.228199 0.159877 0.719322 RAD 0.0185185 + txt002 + SPHERE CENTER -0.229756 0.167942 0.742607 RAD 0.00617284 + txt002 + SPHERE CENTER -0.207683 0.16569 0.731771 RAD 0.00617284 + txt002 + SPHERE CENTER -0.223214 0.183484 0.72457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.250271 0.162129 0.730157 RAD 0.00617284 + txt002 + SPHERE CENTER -0.243729 0.177671 0.71212 RAD 0.00617284 + txt002 + SPHERE CENTER -0.248714 0.154064 0.706872 RAD 0.00617284 + txt002 + SPHERE CENTER -0.234741 0.144336 0.737359 RAD 0.00617284 + txt002 + SPHERE CENTER -0.233184 0.13627 0.714074 RAD 0.00617284 + txt002 + SPHERE CENTER -0.212668 0.142084 0.726523 RAD 0.00617284 + txt002 + SPHERE CENTER -0.129201 0.143787 0.689081 RAD 0.0185185 + txt002 + SPHERE CENTER -0.105335 0.14887 0.692853 RAD 0.00617284 + txt002 + SPHERE CENTER -0.115741 0.153943 0.671044 RAD 0.00617284 + txt002 + SPHERE CENTER -0.121723 0.167242 0.690969 RAD 0.00617284 + txt002 + SPHERE CENTER -0.118795 0.138714 0.71089 RAD 0.00617284 + txt002 + SPHERE CENTER -0.135183 0.157086 0.709006 RAD 0.00617284 + txt002 + SPHERE CENTER -0.142661 0.13363 0.707118 RAD 0.00617284 + txt002 + SPHERE CENTER -0.112813 0.125414 0.690965 RAD 0.00617284 + txt002 + SPHERE CENTER -0.136679 0.120331 0.687193 RAD 0.00617284 + txt002 + SPHERE CENTER -0.123219 0.130487 0.669156 RAD 0.00617284 + txt002 + SPHERE CENTER -0.190359 0.102131 0.692479 RAD 0.0185185 + txt002 + SPHERE CENTER -0.179968 0.0897843 0.711167 RAD 0.00617284 + txt002 + SPHERE CENTER -0.166467 0.105492 0.697727 RAD 0.00617284 + txt002 + SPHERE CENTER -0.183804 0.114103 0.713055 RAD 0.00617284 + txt002 + SPHERE CENTER -0.20386 0.0864233 0.705919 RAD 0.00617284 + txt002 + SPHERE CENTER -0.207696 0.110742 0.707807 RAD 0.00617284 + txt002 + SPHERE CENTER -0.214251 0.0987702 0.687231 RAD 0.00617284 + txt002 + SPHERE CENTER -0.186523 0.0778128 0.690591 RAD 0.00617284 + txt002 + SPHERE CENTER -0.196914 0.0901597 0.671903 RAD 0.00617284 + txt002 + SPHERE CENTER -0.173022 0.0935207 0.677151 RAD 0.00617284 + txt002 + SPHERE CENTER -0.153407 0.108529 0.6286 RAD 0.0185185 + txt002 + SPHERE CENTER -0.130858 0.0995811 0.624003 RAD 0.00617284 + txt002 + SPHERE CENTER -0.135326 0.123725 0.621398 RAD 0.00617284 + txt002 + SPHERE CENTER -0.134736 0.113639 0.643928 RAD 0.00617284 + txt002 + SPHERE CENTER -0.148938 0.0843858 0.631205 RAD 0.00617284 + txt002 + SPHERE CENTER -0.152816 0.0984435 0.65113 RAD 0.00617284 + txt002 + SPHERE CENTER -0.171487 0.0933338 0.635801 RAD 0.00617284 + txt002 + SPHERE CENTER -0.149528 0.0944715 0.608675 RAD 0.00617284 + txt002 + SPHERE CENTER -0.172078 0.10342 0.613272 RAD 0.00617284 + txt002 + SPHERE CENTER -0.153997 0.118615 0.60607 RAD 0.00617284 + txt002 + SPHERE CENTER -0.31427 0.31427 0.544331 RAD 0.0555556 + txt002 + SPHERE CENTER -0.277961 0.367156 0.507294 RAD 0.0185185 + txt002 + SPHERE CENTER -0.269898 0.374298 0.485076 RAD 0.00617284 + txt002 + SPHERE CENTER -0.270045 0.350338 0.491041 RAD 0.00617284 + txt002 + SPHERE CENTER -0.291334 0.362218 0.487134 RAD 0.00617284 + txt002 + SPHERE CENTER -0.277815 0.391115 0.501329 RAD 0.00617284 + txt002 + SPHERE CENTER -0.299251 0.379036 0.503387 RAD 0.00617284 + txt002 + SPHERE CENTER -0.285878 0.383973 0.523547 RAD 0.00617284 + txt002 + SPHERE CENTER -0.256525 0.379235 0.505236 RAD 0.00617284 + txt002 + SPHERE CENTER -0.264588 0.372093 0.527454 RAD 0.00617284 + txt002 + SPHERE CENTER -0.256671 0.355276 0.511201 RAD 0.00617284 + txt002 + SPHERE CENTER -0.252306 0.297666 0.507294 RAD 0.0185185 + txt002 + SPHERE CENTER -0.235688 0.305995 0.491041 RAD 0.00617284 + txt002 + SPHERE CENTER -0.259438 0.312359 0.488775 RAD 0.00617284 + txt002 + SPHERE CENTER -0.245915 0.321516 0.507294 RAD 0.00617284 + txt002 + SPHERE CENTER -0.228556 0.291303 0.509559 RAD 0.00617284 + txt002 + SPHERE CENTER -0.238783 0.306824 0.525813 RAD 0.00617284 + txt002 + SPHERE CENTER -0.245173 0.282974 0.525813 RAD 0.00617284 + txt002 + SPHERE CENTER -0.242079 0.282145 0.491041 RAD 0.00617284 + txt002 + SPHERE CENTER -0.258696 0.273816 0.507294 RAD 0.00617284 + txt002 + SPHERE CENTER -0.265828 0.288509 0.488775 RAD 0.00617284 + txt002 + SPHERE CENTER -0.31427 0.31427 0.470257 RAD 0.0185185 + txt002 + SPHERE CENTER -0.32435 0.32435 0.450097 RAD 0.00617284 + txt002 + SPHERE CENTER -0.33812 0.32066 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER -0.32066 0.33812 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER -0.3005 0.317959 0.450097 RAD 0.00617284 + txt002 + SPHERE CENTER -0.29681 0.331729 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER -0.29042 0.307879 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER -0.317959 0.3005 0.450097 RAD 0.00617284 + txt002 + SPHERE CENTER -0.307879 0.29042 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER -0.331729 0.29681 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER -0.339925 0.383759 0.544331 RAD 0.0185185 + txt002 + SPHERE CENTER -0.334762 0.407156 0.538366 RAD 0.00617284 + txt002 + SPHERE CENTER -0.31686 0.392275 0.546597 RAD 0.00617284 + txt002 + SPHERE CENTER -0.326552 0.388696 0.524171 RAD 0.00617284 + txt002 + SPHERE CENTER -0.357827 0.39864 0.536101 RAD 0.00617284 + txt002 + SPHERE CENTER -0.349618 0.380181 0.521905 RAD 0.00617284 + txt002 + SPHERE CENTER -0.362991 0.375243 0.542066 RAD 0.00617284 + txt002 + SPHERE CENTER -0.348135 0.402218 0.558526 RAD 0.00617284 + txt002 + SPHERE CENTER -0.353299 0.378821 0.564491 RAD 0.00617284 + txt002 + SPHERE CENTER -0.330233 0.387337 0.566757 RAD 0.00617284 + txt002 + SPHERE CENTER -0.376234 0.330873 0.507294 RAD 0.0185185 + txt002 + SPHERE CENTER -0.393346 0.348239 0.503387 RAD 0.00617284 + txt002 + SPHERE CENTER -0.383366 0.345565 0.525813 RAD 0.00617284 + txt002 + SPHERE CENTER -0.369843 0.354723 0.507294 RAD 0.00617284 + txt002 + SPHERE CENTER -0.386213 0.333547 0.484868 RAD 0.00617284 + txt002 + SPHERE CENTER -0.362711 0.340031 0.488775 RAD 0.00617284 + txt002 + SPHERE CENTER -0.369102 0.316181 0.488775 RAD 0.00617284 + txt002 + SPHERE CENTER -0.399736 0.324389 0.503387 RAD 0.00617284 + txt002 + SPHERE CENTER -0.382624 0.307023 0.507294 RAD 0.00617284 + txt002 + SPHERE CENTER -0.389757 0.321715 0.525813 RAD 0.00617284 + txt002 + SPHERE CENTER -0.376234 0.330873 0.581368 RAD 0.0185185 + txt002 + SPHERE CENTER -0.386461 0.346394 0.597621 RAD 0.00617284 + txt002 + SPHERE CENTER -0.362711 0.340031 0.599887 RAD 0.00617284 + txt002 + SPHERE CENTER -0.369843 0.354723 0.581368 RAD 0.00617284 + txt002 + SPHERE CENTER -0.399983 0.337237 0.579103 RAD 0.00617284 + txt002 + SPHERE CENTER -0.383366 0.345565 0.56285 RAD 0.00617284 + txt002 + SPHERE CENTER -0.389757 0.321715 0.56285 RAD 0.00617284 + txt002 + SPHERE CENTER -0.392851 0.322544 0.597621 RAD 0.00617284 + txt002 + SPHERE CENTER -0.382624 0.307023 0.581368 RAD 0.00617284 + txt002 + SPHERE CENTER -0.369102 0.316181 0.599887 RAD 0.00617284 + txt002 + SPHERE CENTER -0.277961 0.367156 0.581368 RAD 0.0185185 + txt002 + SPHERE CENTER -0.261966 0.385852 0.57931 RAD 0.00617284 + txt002 + SPHERE CENTER -0.259422 0.36581 0.565115 RAD 0.00617284 + txt002 + SPHERE CENTER -0.278159 0.38141 0.561208 RAD 0.00617284 + txt002 + SPHERE CENTER -0.280504 0.387198 0.595564 RAD 0.00617284 + txt002 + SPHERE CENTER -0.296698 0.382755 0.577461 RAD 0.00617284 + txt002 + SPHERE CENTER -0.2965 0.368501 0.597621 RAD 0.00617284 + txt002 + SPHERE CENTER -0.261768 0.371598 0.599471 RAD 0.00617284 + txt002 + SPHERE CENTER -0.277764 0.352901 0.601529 RAD 0.00617284 + txt002 + SPHERE CENTER -0.259225 0.351556 0.585275 RAD 0.00617284 + txt002 + SPHERE CENTER -0.31427 0.31427 0.618405 RAD 0.0185185 + txt002 + SPHERE CENTER -0.304189 0.32435 0.638566 RAD 0.00617284 + txt002 + SPHERE CENTER -0.29042 0.32066 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER -0.307879 0.33812 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER -0.328039 0.317959 0.638566 RAD 0.00617284 + txt002 + SPHERE CENTER -0.331729 0.331729 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER -0.33812 0.307879 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER -0.31058 0.3005 0.638566 RAD 0.00617284 + txt002 + SPHERE CENTER -0.32066 0.29042 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER -0.29681 0.29681 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER -0.252306 0.297666 0.581368 RAD 0.0185185 + txt002 + SPHERE CENTER -0.228803 0.30415 0.585275 RAD 0.00617284 + txt002 + SPHERE CENTER -0.238783 0.306824 0.56285 RAD 0.00617284 + txt002 + SPHERE CENTER -0.245915 0.321516 0.581368 RAD 0.00617284 + txt002 + SPHERE CENTER -0.242326 0.294992 0.603794 RAD 0.00617284 + txt002 + SPHERE CENTER -0.259438 0.312359 0.599887 RAD 0.00617284 + txt002 + SPHERE CENTER -0.265828 0.288509 0.599887 RAD 0.00617284 + txt002 + SPHERE CENTER -0.235194 0.2803 0.585275 RAD 0.00617284 + txt002 + SPHERE CENTER -0.258696 0.273816 0.581368 RAD 0.00617284 + txt002 + SPHERE CENTER -0.245173 0.282974 0.56285 RAD 0.00617284 + txt002 + SPHERE CENTER -0.574159 0.153845 0.618405 RAD 0.0555556 + txt002 + SPHERE CENTER -0.612768 0.202534 0.658726 RAD 0.0185185 + txt002 + SPHERE CENTER -0.612732 0.225282 0.668328 RAD 0.00617284 + txt002 + SPHERE CENTER -0.591695 0.212428 0.666956 RAD 0.00617284 + txt002 + SPHERE CENTER -0.60221 0.22113 0.64638 RAD 0.00617284 + txt002 + SPHERE CENTER -0.633805 0.215388 0.660098 RAD 0.00617284 + txt002 + SPHERE CENTER -0.623283 0.211236 0.63815 RAD 0.00617284 + txt002 + SPHERE CENTER -0.63384 0.192641 0.650495 RAD 0.00617284 + txt002 + SPHERE CENTER -0.62329 0.206686 0.680674 RAD 0.00617284 + txt002 + SPHERE CENTER -0.623325 0.183939 0.671072 RAD 0.00617284 + txt002 + SPHERE CENTER -0.602253 0.193832 0.679302 RAD 0.00617284 + txt002 + SPHERE CENTER -0.543919 0.184086 0.678886 RAD 0.0185185 + txt002 + SPHERE CENTER -0.527458 0.200547 0.687117 RAD 0.00617284 + txt002 + SPHERE CENTER -0.522843 0.187702 0.666541 RAD 0.00617284 + txt002 + SPHERE CENTER -0.540303 0.205161 0.666541 RAD 0.00617284 + txt002 + SPHERE CENTER -0.548533 0.196931 0.699462 RAD 0.00617284 + txt002 + SPHERE CENTER -0.561378 0.201546 0.678886 RAD 0.00617284 + txt002 + SPHERE CENTER -0.564994 0.18047 0.691232 RAD 0.00617284 + txt002 + SPHERE CENTER -0.531074 0.179472 0.699462 RAD 0.00617284 + txt002 + SPHERE CENTER -0.547535 0.163011 0.691232 RAD 0.00617284 + txt002 + SPHERE CENTER -0.526459 0.166627 0.678886 RAD 0.00617284 + txt002 + SPHERE CENTER -0.554987 0.225396 0.618405 RAD 0.0185185 + txt002 + SPHERE CENTER -0.542885 0.243024 0.606059 RAD 0.00617284 + txt002 + SPHERE CENTER -0.534333 0.219861 0.606059 RAD 0.00617284 + txt002 + SPHERE CENTER -0.554987 0.225396 0.593714 RAD 0.00617284 + txt002 + SPHERE CENTER -0.563539 0.248559 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER -0.575642 0.23093 0.606059 RAD 0.00617284 + txt002 + SPHERE CENTER -0.575642 0.23093 0.630751 RAD 0.00617284 + txt002 + SPHERE CENTER -0.542885 0.243024 0.630751 RAD 0.00617284 + txt002 + SPHERE CENTER -0.554987 0.225396 0.643096 RAD 0.00617284 + txt002 + SPHERE CENTER -0.534333 0.219861 0.630751 RAD 0.00617284 + txt002 + SPHERE CENTER -0.643008 0.172294 0.598245 RAD 0.0185185 + txt002 + SPHERE CENTER -0.660425 0.189742 0.599616 RAD 0.00617284 + txt002 + SPHERE CENTER -0.645434 0.185725 0.618821 RAD 0.00617284 + txt002 + SPHERE CENTER -0.636618 0.196144 0.598245 RAD 0.00617284 + txt002 + SPHERE CENTER -0.657999 0.17631 0.57904 RAD 0.00617284 + txt002 + SPHERE CENTER -0.634191 0.182712 0.577669 RAD 0.00617284 + txt002 + SPHERE CENTER -0.640582 0.158862 0.577669 RAD 0.00617284 + txt002 + SPHERE CENTER -0.666816 0.165892 0.599616 RAD 0.00617284 + txt002 + SPHERE CENTER -0.649399 0.148444 0.598245 RAD 0.00617284 + txt002 + SPHERE CENTER -0.651825 0.161875 0.618821 RAD 0.00617284 + txt002 + SPHERE CENTER -0.585228 0.195155 0.557924 RAD 0.0185185 + txt002 + SPHERE CENTER -0.574809 0.203972 0.537348 RAD 0.00617284 + txt002 + SPHERE CENTER -0.561378 0.201546 0.557924 RAD 0.00617284 + txt002 + SPHERE CENTER -0.568784 0.181486 0.545578 RAD 0.00617284 + txt002 + SPHERE CENTER -0.598659 0.197581 0.537348 RAD 0.00617284 + txt002 + SPHERE CENTER -0.592634 0.175095 0.545578 RAD 0.00617284 + txt002 + SPHERE CENTER -0.609078 0.188764 0.557924 RAD 0.00617284 + txt002 + SPHERE CENTER -0.591253 0.217641 0.549693 RAD 0.00617284 + txt002 + SPHERE CENTER -0.601672 0.208824 0.57027 RAD 0.00617284 + txt002 + SPHERE CENTER -0.577822 0.215215 0.57027 RAD 0.00617284 + txt002 + SPHERE CENTER -0.6044 0.123605 0.557924 RAD 0.0185185 + txt002 + SPHERE CENTER -0.620861 0.107144 0.549693 RAD 0.00617284 + txt002 + SPHERE CENTER -0.608016 0.102529 0.57027 RAD 0.00617284 + txt002 + SPHERE CENTER -0.625475 0.119989 0.57027 RAD 0.00617284 + txt002 + SPHERE CENTER -0.617245 0.128219 0.537348 RAD 0.00617284 + txt002 + SPHERE CENTER -0.621859 0.141064 0.557924 RAD 0.00617284 + txt002 + SPHERE CENTER -0.600784 0.14468 0.545578 RAD 0.00617284 + txt002 + SPHERE CENTER -0.599785 0.11076 0.537348 RAD 0.00617284 + txt002 + SPHERE CENTER -0.583324 0.127221 0.545578 RAD 0.00617284 + txt002 + SPHERE CENTER -0.58694 0.106145 0.557924 RAD 0.00617284 + txt002 + SPHERE CENTER -0.631939 0.130984 0.658726 RAD 0.0185185 + txt002 + SPHERE CENTER -0.643128 0.132649 0.680674 RAD 0.00617284 + txt002 + SPHERE CENTER -0.618482 0.133263 0.679302 RAD 0.00617284 + txt002 + SPHERE CENTER -0.631785 0.152367 0.671072 RAD 0.00617284 + txt002 + SPHERE CENTER -0.656585 0.130371 0.660098 RAD 0.00617284 + txt002 + SPHERE CENTER -0.645242 0.150088 0.650495 RAD 0.00617284 + txt002 + SPHERE CENTER -0.645397 0.128706 0.63815 RAD 0.00617284 + txt002 + SPHERE CENTER -0.643283 0.111266 0.668328 RAD 0.00617284 + txt002 + SPHERE CENTER -0.632094 0.109601 0.64638 RAD 0.00617284 + txt002 + SPHERE CENTER -0.618637 0.11188 0.666956 RAD 0.00617284 + txt002 + SPHERE CENTER -0.593331 0.0822954 0.618405 RAD 0.0185185 + txt002 + SPHERE CENTER -0.591664 0.0609772 0.630751 RAD 0.00617284 + txt002 + SPHERE CENTER -0.572676 0.076761 0.630751 RAD 0.00617284 + txt002 + SPHERE CENTER -0.593331 0.0822954 0.643096 RAD 0.00617284 + txt002 + SPHERE CENTER -0.612319 0.0665116 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER -0.613986 0.0878298 0.630751 RAD 0.00617284 + txt002 + SPHERE CENTER -0.613986 0.0878298 0.606059 RAD 0.00617284 + txt002 + SPHERE CENTER -0.591664 0.0609772 0.606059 RAD 0.00617284 + txt002 + SPHERE CENTER -0.593331 0.0822954 0.593714 RAD 0.00617284 + txt002 + SPHERE CENTER -0.572676 0.076761 0.606059 RAD 0.00617284 + txt002 + SPHERE CENTER -0.56309 0.112536 0.678886 RAD 0.0185185 + txt002 + SPHERE CENTER -0.549659 0.11011 0.699462 RAD 0.00617284 + txt002 + SPHERE CENTER -0.53924 0.118927 0.678886 RAD 0.00617284 + txt002 + SPHERE CENTER -0.555684 0.132596 0.691232 RAD 0.00617284 + txt002 + SPHERE CENTER -0.573509 0.103719 0.699462 RAD 0.00617284 + txt002 + SPHERE CENTER -0.579534 0.126205 0.691232 RAD 0.00617284 + txt002 + SPHERE CENTER -0.58694 0.106145 0.678886 RAD 0.00617284 + txt002 + SPHERE CENTER -0.557065 0.09005 0.687117 RAD 0.00617284 + txt002 + SPHERE CENTER -0.570497 0.0924762 0.666541 RAD 0.00617284 + txt002 + SPHERE CENTER -0.546646 0.0988668 0.666541 RAD 0.00617284 + txt002 + SPHERE CENTER -0.494808 0.247614 0.43322 RAD 0.0555556 + txt002 + SPHERE CENTER -0.494287 0.313607 0.399581 RAD 0.0185185 + txt002 + SPHERE CENTER -0.484182 0.326876 0.381374 RAD 0.00617284 + txt002 + SPHERE CENTER -0.470513 0.310432 0.39372 RAD 0.00617284 + txt002 + SPHERE CENTER -0.488171 0.302705 0.378288 RAD 0.00617284 + txt002 + SPHERE CENTER -0.507957 0.330051 0.387235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.511946 0.305881 0.384149 RAD 0.00617284 + txt002 + SPHERE CENTER -0.518062 0.316783 0.405442 RAD 0.00617284 + txt002 + SPHERE CENTER -0.490299 0.337778 0.402668 RAD 0.00617284 + txt002 + SPHERE CENTER -0.500404 0.324509 0.420874 RAD 0.00617284 + txt002 + SPHERE CENTER -0.476629 0.321334 0.415013 RAD 0.00617284 + txt002 + SPHERE CENTER -0.452978 0.302539 0.460062 RAD 0.0185185 + txt002 + SPHERE CENTER -0.436971 0.320401 0.454201 RAD 0.00617284 + txt002 + SPHERE CENTER -0.436675 0.29902 0.441856 RAD 0.00617284 + txt002 + SPHERE CENTER -0.455413 0.3148 0.438769 RAD 0.00617284 + txt002 + SPHERE CENTER -0.453274 0.32392 0.472408 RAD 0.00617284 + txt002 + SPHERE CENTER -0.471717 0.318318 0.456976 RAD 0.00617284 + txt002 + SPHERE CENTER -0.469281 0.306057 0.478269 RAD 0.00617284 + txt002 + SPHERE CENTER -0.434535 0.30814 0.475494 RAD 0.00617284 + txt002 + SPHERE CENTER -0.450543 0.290278 0.481355 RAD 0.00617284 + txt002 + SPHERE CENTER -0.434239 0.286759 0.463149 RAD 0.00617284 + txt002 + SPHERE CENTER -0.434629 0.269833 0.396183 RAD 0.0185185 + txt002 + SPHERE CENTER -0.426389 0.279233 0.37489 RAD 0.00617284 + txt002 + SPHERE CENTER -0.445377 0.263449 0.37489 RAD 0.00617284 + txt002 + SPHERE CENTER -0.448298 0.286276 0.383837 RAD 0.00617284 + txt002 + SPHERE CENTER -0.415641 0.285616 0.396183 RAD 0.00617284 + txt002 + SPHERE CENTER -0.43755 0.29266 0.40513 RAD 0.00617284 + txt002 + SPHERE CENTER -0.42388 0.276216 0.417476 RAD 0.00617284 + txt002 + SPHERE CENTER -0.41272 0.262789 0.387235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.420959 0.253389 0.408529 RAD 0.00617284 + txt002 + SPHERE CENTER -0.431707 0.247006 0.387235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.536117 0.258683 0.372739 RAD 0.0185185 + txt002 + SPHERE CENTER -0.549787 0.275127 0.360393 RAD 0.00617284 + txt002 + SPHERE CENTER -0.549787 0.275127 0.385084 RAD 0.00617284 + txt002 + SPHERE CENTER -0.529727 0.282533 0.372739 RAD 0.00617284 + txt002 + SPHERE CENTER -0.536117 0.258683 0.348047 RAD 0.00617284 + txt002 + SPHERE CENTER -0.516058 0.266089 0.360393 RAD 0.00617284 + txt002 + SPHERE CENTER -0.522448 0.242239 0.360393 RAD 0.00617284 + txt002 + SPHERE CENTER -0.556177 0.251277 0.360393 RAD 0.00617284 + txt002 + SPHERE CENTER -0.542508 0.234833 0.372739 RAD 0.00617284 + txt002 + SPHERE CENTER -0.556177 0.251277 0.385084 RAD 0.00617284 + txt002 + SPHERE CENTER -0.476459 0.214908 0.369341 RAD 0.0185185 + txt002 + SPHERE CENTER -0.457868 0.209819 0.353908 RAD 0.00617284 + txt002 + SPHERE CENTER -0.458164 0.2312 0.366254 RAD 0.00617284 + txt002 + SPHERE CENTER -0.453963 0.210053 0.378288 RAD 0.00617284 + txt002 + SPHERE CENTER -0.476163 0.193527 0.356995 RAD 0.00617284 + txt002 + SPHERE CENTER -0.472258 0.193761 0.381374 RAD 0.00617284 + txt002 + SPHERE CENTER -0.494753 0.198616 0.372427 RAD 0.00617284 + txt002 + SPHERE CENTER -0.480363 0.214674 0.344961 RAD 0.00617284 + txt002 + SPHERE CENTER -0.498954 0.219763 0.360393 RAD 0.00617284 + txt002 + SPHERE CENTER -0.480659 0.236055 0.357307 RAD 0.00617284 + txt002 + SPHERE CENTER -0.536638 0.19269 0.406378 RAD 0.0185185 + txt002 + SPHERE CENTER -0.549603 0.17251 0.412239 RAD 0.00617284 + txt002 + SPHERE CENTER -0.528912 0.177908 0.424584 RAD 0.00617284 + txt002 + SPHERE CENTER -0.549105 0.191778 0.427671 RAD 0.00617284 + txt002 + SPHERE CENTER -0.557329 0.187292 0.394032 RAD 0.00617284 + txt002 + SPHERE CENTER -0.556831 0.20656 0.409464 RAD 0.00617284 + txt002 + SPHERE CENTER -0.544363 0.207471 0.388171 RAD 0.00617284 + txt002 + SPHERE CENTER -0.537136 0.173421 0.390945 RAD 0.00617284 + txt002 + SPHERE CENTER -0.524171 0.193601 0.385084 RAD 0.00617284 + txt002 + SPHERE CENTER -0.516445 0.178819 0.403291 RAD 0.00617284 + txt002 + SPHERE CENTER -0.554467 0.291389 0.436618 RAD 0.0185185 + txt002 + SPHERE CENTER -0.562288 0.314604 0.439705 RAD 0.00617284 + txt002 + SPHERE CENTER -0.542501 0.306499 0.45205 RAD 0.00617284 + txt002 + SPHERE CENTER -0.541186 0.310183 0.427671 RAD 0.00617284 + txt002 + SPHERE CENTER -0.574255 0.299494 0.424272 RAD 0.00617284 + txt002 + SPHERE CENTER -0.553152 0.295073 0.412239 RAD 0.00617284 + txt002 + SPHERE CENTER -0.566433 0.276279 0.421186 RAD 0.00617284 + txt002 + SPHERE CENTER -0.575569 0.29581 0.448652 RAD 0.00617284 + txt002 + SPHERE CENTER -0.567748 0.272595 0.445566 RAD 0.00617284 + txt002 + SPHERE CENTER -0.555781 0.287705 0.460998 RAD 0.00617284 + txt002 + SPHERE CENTER -0.554987 0.225396 0.470257 RAD 0.0185185 + txt002 + SPHERE CENTER -0.567359 0.227186 0.49155 RAD 0.00617284 + txt002 + SPHERE CENTER -0.54267 0.227528 0.49155 RAD 0.00617284 + txt002 + SPHERE CENTER -0.555283 0.246777 0.482603 RAD 0.00617284 + txt002 + SPHERE CENTER -0.579676 0.225054 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER -0.567601 0.244644 0.46131 RAD 0.00617284 + txt002 + SPHERE CENTER -0.567305 0.223263 0.448964 RAD 0.00617284 + txt002 + SPHERE CENTER -0.567063 0.205805 0.479204 RAD 0.00617284 + txt002 + SPHERE CENTER -0.554691 0.204014 0.457911 RAD 0.00617284 + txt002 + SPHERE CENTER -0.542374 0.206147 0.479204 RAD 0.00617284 + txt002 + SPHERE CENTER -0.513157 0.28032 0.497099 RAD 0.0185185 + txt002 + SPHERE CENTER -0.507811 0.298839 0.512531 RAD 0.00617284 + txt002 + SPHERE CENTER -0.489718 0.287442 0.500186 RAD 0.00617284 + txt002 + SPHERE CENTER -0.505577 0.302049 0.488152 RAD 0.00617284 + txt002 + SPHERE CENTER -0.531251 0.291716 0.509445 RAD 0.00617284 + txt002 + SPHERE CENTER -0.529016 0.294927 0.485065 RAD 0.00617284 + txt002 + SPHERE CENTER -0.536597 0.273198 0.494013 RAD 0.00617284 + txt002 + SPHERE CENTER -0.515392 0.27711 0.521479 RAD 0.00617284 + txt002 + SPHERE CENTER -0.520738 0.258591 0.506047 RAD 0.00617284 + txt002 + SPHERE CENTER -0.497299 0.265714 0.509133 RAD 0.00617284 + txt002 + SPHERE CENTER -0.552323 0.0329639 0.43322 RAD 0.0555556 + txt002 + SPHERE CENTER -0.625877 0.0248832 0.436618 RAD 0.0185185 + txt002 + SPHERE CENTER -0.646362 0.0316054 0.448652 RAD 0.00617284 + txt002 + SPHERE CENTER -0.625173 0.0287309 0.460998 RAD 0.00617284 + txt002 + SPHERE CENTER -0.627981 0.0478 0.445566 RAD 0.00617284 + txt002 + SPHERE CENTER -0.647066 0.0277577 0.424272 RAD 0.00617284 + txt002 + SPHERE CENTER -0.628685 0.0439523 0.421186 RAD 0.00617284 + txt002 + SPHERE CENTER -0.62658 0.0210355 0.412239 RAD 0.00617284 + txt002 + SPHERE CENTER -0.644258 0.00868865 0.439705 RAD 0.00617284 + txt002 + SPHERE CENTER -0.623773 0.00196644 0.427671 RAD 0.00617284 + txt002 + SPHERE CENTER -0.623069 0.00581415 0.45205 RAD 0.00617284 + txt002 + SPHERE CENTER -0.584567 0.0138144 0.497099 RAD 0.0185185 + txt002 + SPHERE CENTER -0.584898 0.0177119 0.521479 RAD 0.00617284 + txt002 + SPHERE CENTER -0.56353 0.0185345 0.509133 RAD 0.00617284 + txt002 + SPHERE CENTER -0.580268 0.0364224 0.506047 RAD 0.00617284 + txt002 + SPHERE CENTER -0.605935 0.0129918 0.509445 RAD 0.00617284 + txt002 + SPHERE CENTER -0.601305 0.0317022 0.494013 RAD 0.00617284 + txt002 + SPHERE CENTER -0.605605 0.00909422 0.485065 RAD 0.00617284 + txt002 + SPHERE CENTER -0.589197 -0.00489609 0.512531 RAD 0.00617284 + txt002 + SPHERE CENTER -0.588867 -0.00879364 0.488152 RAD 0.00617284 + txt002 + SPHERE CENTER -0.567829 -0.00407348 0.500186 RAD 0.00617284 + txt002 + SPHERE CENTER -0.593331 0.0822954 0.470257 RAD 0.0185185 + txt002 + SPHERE CENTER -0.593994 0.105299 0.479204 RAD 0.00617284 + txt002 + SPHERE CENTER -0.572783 0.0926585 0.479204 RAD 0.00617284 + txt002 + SPHERE CENTER -0.582384 0.100664 0.457911 RAD 0.00617284 + txt002 + SPHERE CENTER -0.614541 0.0949359 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER -0.602932 0.090301 0.448964 RAD 0.00617284 + txt002 + SPHERE CENTER -0.613879 0.0719323 0.46131 RAD 0.00617284 + txt002 + SPHERE CENTER -0.604941 0.0869303 0.49155 RAD 0.00617284 + txt002 + SPHERE CENTER -0.604278 0.0639267 0.482603 RAD 0.00617284 + txt002 + SPHERE CENTER -0.58373 0.0742898 0.49155 RAD 0.00617284 + txt002 + SPHERE CENTER -0.593633 0.0440327 0.372739 RAD 0.0185185 + txt002 + SPHERE CENTER -0.607302 0.0604766 0.360393 RAD 0.00617284 + txt002 + SPHERE CENTER -0.607302 0.0604766 0.385084 RAD 0.00617284 + txt002 + SPHERE CENTER -0.587242 0.0678827 0.372739 RAD 0.00617284 + txt002 + SPHERE CENTER -0.593633 0.0440327 0.348047 RAD 0.00617284 + txt002 + SPHERE CENTER -0.573573 0.0514389 0.360393 RAD 0.00617284 + txt002 + SPHERE CENTER -0.579964 0.0275889 0.360393 RAD 0.00617284 + txt002 + SPHERE CENTER -0.613693 0.0366265 0.360393 RAD 0.00617284 + txt002 + SPHERE CENTER -0.600023 0.0201827 0.372739 RAD 0.00617284 + txt002 + SPHERE CENTER -0.613693 0.0366265 0.385084 RAD 0.00617284 + txt002 + SPHERE CENTER -0.561087 0.101445 0.406378 RAD 0.0185185 + txt002 + SPHERE CENTER -0.551884 0.118381 0.390945 RAD 0.00617284 + txt002 + SPHERE CENTER -0.536664 0.103361 0.403291 RAD 0.00617284 + txt002 + SPHERE CENTER -0.550745 0.0944221 0.385084 RAD 0.00617284 + txt002 + SPHERE CENTER -0.576307 0.116465 0.394032 RAD 0.00617284 + txt002 + SPHERE CENTER -0.575168 0.0925065 0.388171 RAD 0.00617284 + txt002 + SPHERE CENTER -0.58551 0.0995293 0.409464 RAD 0.00617284 + txt002 + SPHERE CENTER -0.562225 0.125404 0.412239 RAD 0.00617284 + txt002 + SPHERE CENTER -0.571428 0.108468 0.427671 RAD 0.00617284 + txt002 + SPHERE CENTER -0.547006 0.110383 0.424584 RAD 0.00617284 + txt002 + SPHERE CENTER -0.520079 0.0521134 0.369341 RAD 0.0185185 + txt002 + SPHERE CENTER -0.523344 0.0542684 0.344961 RAD 0.00617284 + txt002 + SPHERE CENTER -0.534291 0.0358996 0.357307 RAD 0.00617284 + txt002 + SPHERE CENTER -0.541988 0.0591566 0.360393 RAD 0.00617284 + txt002 + SPHERE CENTER -0.509132 0.0704822 0.356995 RAD 0.00617284 + txt002 + SPHERE CENTER -0.527777 0.0753703 0.372427 RAD 0.00617284 + txt002 + SPHERE CENTER -0.505868 0.0683272 0.381374 RAD 0.00617284 + txt002 + SPHERE CENTER -0.501435 0.0472252 0.353908 RAD 0.00617284 + txt002 + SPHERE CENTER -0.49817 0.0450702 0.378288 RAD 0.00617284 + txt002 + SPHERE CENTER -0.512382 0.0288565 0.366254 RAD 0.00617284 + txt002 + SPHERE CENTER -0.584869 -0.0244483 0.399581 RAD 0.0185185 + txt002 + SPHERE CENTER -0.5935 -0.0473753 0.402668 RAD 0.00617284 + txt002 + SPHERE CENTER -0.57344 -0.0399691 0.415013 RAD 0.00617284 + txt002 + SPHERE CENTER -0.595617 -0.0308315 0.420874 RAD 0.00617284 + txt002 + SPHERE CENTER -0.604929 -0.0318545 0.387235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.607046 -0.0153107 0.405442 RAD 0.00617284 + txt002 + SPHERE CENTER -0.596298 -0.00892756 0.384149 RAD 0.00617284 + txt002 + SPHERE CENTER -0.582752 -0.0409921 0.381374 RAD 0.00617284 + txt002 + SPHERE CENTER -0.574121 -0.0180651 0.378288 RAD 0.00617284 + txt002 + SPHERE CENTER -0.562692 -0.0335859 0.39372 RAD 0.00617284 + txt002 + SPHERE CENTER -0.511316 -0.0163676 0.396183 RAD 0.0185185 + txt002 + SPHERE CENTER -0.48882 -0.0212225 0.387235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.497372 0.00194055 0.387235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.491256 -0.00896145 0.408529 RAD 0.00617284 + txt002 + SPHERE CENTER -0.502764 -0.0395307 0.396183 RAD 0.00617284 + txt002 + SPHERE CENTER -0.505199 -0.0272696 0.417476 RAD 0.00617284 + txt002 + SPHERE CENTER -0.525259 -0.0346758 0.40513 RAD 0.00617284 + txt002 + SPHERE CENTER -0.50888 -0.0286287 0.37489 RAD 0.00617284 + txt002 + SPHERE CENTER -0.531375 -0.0237738 0.383837 RAD 0.00617284 + txt002 + SPHERE CENTER -0.517432 -0.00546563 0.37489 RAD 0.00617284 + txt002 + SPHERE CENTER -0.54356 -0.0355172 0.460062 RAD 0.0185185 + txt002 + SPHERE CENTER -0.530389 -0.0495897 0.475494 RAD 0.00617284 + txt002 + SPHERE CENTER -0.519442 -0.031221 0.463149 RAD 0.00617284 + txt002 + SPHERE CENTER -0.53532 -0.0261165 0.481355 RAD 0.00617284 + txt002 + SPHERE CENTER -0.554507 -0.0538859 0.472408 RAD 0.00617284 + txt002 + SPHERE CENTER -0.559438 -0.0304127 0.478269 RAD 0.00617284 + txt002 + SPHERE CENTER -0.567678 -0.0398133 0.456976 RAD 0.00617284 + txt002 + SPHERE CENTER -0.538628 -0.0589904 0.454201 RAD 0.00617284 + txt002 + SPHERE CENTER -0.551799 -0.0449178 0.438769 RAD 0.00617284 + txt002 + SPHERE CENTER -0.527681 -0.0406217 0.441856 RAD 0.00617284 + txt002 + SPHERE CENTER -0.451136 0.0058509 0.729516 RAD 0.0555556 + txt002 + SPHERE CENTER -0.447081 0.0051487 0.803476 RAD 0.0185185 + txt002 + SPHERE CENTER -0.435909 0.01504 0.823149 RAD 0.00617284 + txt002 + SPHERE CENTER -0.423265 0.0115452 0.802231 RAD 0.00617284 + txt002 + SPHERE CENTER -0.440694 0.0289993 0.803352 RAD 0.00617284 + txt002 + SPHERE CENTER -0.459725 0.00864346 0.824394 RAD 0.00617284 + txt002 + SPHERE CENTER -0.46451 0.0226028 0.804597 RAD 0.00617284 + txt002 + SPHERE CENTER -0.470897 -0.0012478 0.804721 RAD 0.00617284 + txt002 + SPHERE CENTER -0.442297 -0.00881065 0.823273 RAD 0.00617284 + txt002 + SPHERE CENTER -0.453468 -0.0187019 0.8036 RAD 0.00617284 + txt002 + SPHERE CENTER -0.429652 -0.0123054 0.802355 RAD 0.00617284 + txt002 + SPHERE CENTER -0.386138 0.0172804 0.763155 RAD 0.0185185 + txt002 + SPHERE CENTER -0.364644 0.0293677 0.76191 RAD 0.00617284 + txt002 + SPHERE CENTER -0.375512 0.0213457 0.741241 RAD 0.00617284 + txt002 + SPHERE CENTER -0.385352 0.0401449 0.753867 RAD 0.00617284 + txt002 + SPHERE CENTER -0.37527 0.0253024 0.783824 RAD 0.00617284 + txt002 + SPHERE CENTER -0.395978 0.0360796 0.775781 RAD 0.00617284 + txt002 + SPHERE CENTER -0.396764 0.0132151 0.785069 RAD 0.00617284 + txt002 + SPHERE CENTER -0.36543 0.0065032 0.771198 RAD 0.00617284 + txt002 + SPHERE CENTER -0.386924 -0.00558411 0.772443 RAD 0.00617284 + txt002 + SPHERE CENTER -0.376298 -0.00151881 0.750529 RAD 0.00617284 + txt002 + SPHERE CENTER -0.439178 0.0688765 0.766553 RAD 0.0185185 + txt002 + SPHERE CENTER -0.426942 0.0903221 0.766429 RAD 0.00617284 + txt002 + SPHERE CENTER -0.416328 0.0699989 0.757266 RAD 0.00617284 + txt002 + SPHERE CENTER -0.435083 0.0806307 0.745229 RAD 0.00617284 + txt002 + SPHERE CENTER -0.449792 0.0891998 0.775717 RAD 0.00617284 + txt002 + SPHERE CENTER -0.457933 0.0795084 0.754517 RAD 0.00617284 + txt002 + SPHERE CENTER -0.462029 0.0677542 0.775841 RAD 0.00617284 + txt002 + SPHERE CENTER -0.431037 0.078568 0.787754 RAD 0.00617284 + txt002 + SPHERE CENTER -0.443274 0.0571224 0.787878 RAD 0.00617284 + txt002 + SPHERE CENTER -0.420423 0.0582447 0.77859 RAD 0.00617284 + txt002 + SPHERE CENTER -0.512079 -0.00628079 0.769837 RAD 0.0185185 + txt002 + SPHERE CENTER -0.523883 -0.000557006 0.790755 RAD 0.00617284 + txt002 + SPHERE CENTER -0.49924 -0.00208214 0.790506 RAD 0.00617284 + txt002 + SPHERE CENTER -0.51057 0.0165974 0.779001 RAD 0.00617284 + txt002 + SPHERE CENTER -0.536722 -0.00475566 0.770086 RAD 0.00617284 + txt002 + SPHERE CENTER -0.523409 0.0123987 0.758332 RAD 0.00617284 + txt002 + SPHERE CENTER -0.524918 -0.0104794 0.749168 RAD 0.00617284 + txt002 + SPHERE CENTER -0.525392 -0.0234352 0.781591 RAD 0.00617284 + txt002 + SPHERE CENTER -0.513588 -0.029159 0.760673 RAD 0.00617284 + txt002 + SPHERE CENTER -0.500749 -0.0249603 0.781342 RAD 0.00617284 + txt002 + SPHERE CENTER -0.504176 0.0574471 0.732914 RAD 0.0185185 + txt002 + SPHERE CENTER -0.508666 0.0817008 0.734036 RAD 0.00617284 + txt002 + SPHERE CENTER -0.488971 0.0722467 0.745541 RAD 0.00617284 + txt002 + SPHERE CENTER -0.489545 0.0732807 0.720878 RAD 0.00617284 + txt002 + SPHERE CENTER -0.523872 0.0669012 0.72141 RAD 0.00617284 + txt002 + SPHERE CENTER -0.504751 0.058481 0.708251 RAD 0.00617284 + txt002 + SPHERE CENTER -0.519382 0.0426474 0.720288 RAD 0.00617284 + txt002 + SPHERE CENTER -0.523298 0.0658672 0.746073 RAD 0.00617284 + txt002 + SPHERE CENTER -0.518808 0.0416134 0.744951 RAD 0.00617284 + txt002 + SPHERE CENTER -0.503602 0.0564131 0.757577 RAD 0.00617284 + txt002 + SPHERE CENTER -0.516134 -0.00557859 0.695877 RAD 0.0185185 + txt002 + SPHERE CENTER -0.540463 -0.00154892 0.697123 RAD 0.00617284 + txt002 + SPHERE CENTER -0.52751 -0.00538221 0.717791 RAD 0.00617284 + txt002 + SPHERE CENTER -0.524673 0.0156462 0.705165 RAD 0.00617284 + txt002 + SPHERE CENTER -0.529087 -0.00174531 0.675209 RAD 0.00617284 + txt002 + SPHERE CENTER -0.513298 0.0154498 0.683251 RAD 0.00617284 + txt002 + SPHERE CENTER -0.504759 -0.00577498 0.673964 RAD 0.00617284 + txt002 + SPHERE CENTER -0.531924 -0.0227737 0.687835 RAD 0.00617284 + txt002 + SPHERE CENTER -0.507596 -0.0268034 0.68659 RAD 0.00617284 + txt002 + SPHERE CENTER -0.518971 -0.026607 0.708504 RAD 0.00617284 + txt002 + SPHERE CENTER -0.459039 -0.0578769 0.766439 RAD 0.0185185 + txt002 + SPHERE CENTER -0.451803 -0.0707378 0.786236 RAD 0.00617284 + txt002 + SPHERE CENTER -0.435761 -0.0561039 0.774481 RAD 0.00617284 + txt002 + SPHERE CENTER -0.454158 -0.0461991 0.787639 RAD 0.00617284 + txt002 + SPHERE CENTER -0.475081 -0.0725109 0.778193 RAD 0.00617284 + txt002 + SPHERE CENTER -0.477435 -0.0479721 0.779597 RAD 0.00617284 + txt002 + SPHERE CENTER -0.482316 -0.05965 0.758396 RAD 0.00617284 + txt002 + SPHERE CENTER -0.456685 -0.0824157 0.765035 RAD 0.00617284 + txt002 + SPHERE CENTER -0.46392 -0.0695548 0.745238 RAD 0.00617284 + txt002 + SPHERE CENTER -0.440643 -0.0677817 0.753281 RAD 0.00617284 + txt002 + SPHERE CENTER -0.463094 -0.0571747 0.692479 RAD 0.0185185 + txt002 + SPHERE CENTER -0.459563 -0.081612 0.692603 RAD 0.00617284 + txt002 + SPHERE CENTER -0.442243 -0.0665888 0.701767 RAD 0.00617284 + txt002 + SPHERE CENTER -0.463589 -0.0696122 0.713804 RAD 0.00617284 + txt002 + SPHERE CENTER -0.480415 -0.0721979 0.683315 RAD 0.00617284 + txt002 + SPHERE CENTER -0.48444 -0.0601982 0.704516 RAD 0.00617284 + txt002 + SPHERE CENTER -0.483946 -0.0477607 0.683192 RAD 0.00617284 + txt002 + SPHERE CENTER -0.459069 -0.0691745 0.671279 RAD 0.00617284 + txt002 + SPHERE CENTER -0.4626 -0.0447373 0.671155 RAD 0.00617284 + txt002 + SPHERE CENTER -0.441749 -0.0541513 0.680442 RAD 0.00617284 + txt002 + SPHERE CENTER -0.398096 -0.0457452 0.726118 RAD 0.0185185 + txt002 + SPHERE CENTER -0.373728 -0.0495643 0.724997 RAD 0.00617284 + txt002 + SPHERE CENTER -0.383722 -0.030137 0.713492 RAD 0.00617284 + txt002 + SPHERE CENTER -0.382672 -0.0306825 0.738155 RAD 0.00617284 + txt002 + SPHERE CENTER -0.388102 -0.0651725 0.737623 RAD 0.00617284 + txt002 + SPHERE CENTER -0.397047 -0.0462908 0.750781 RAD 0.00617284 + txt002 + SPHERE CENTER -0.41247 -0.0613535 0.738744 RAD 0.00617284 + txt002 + SPHERE CENTER -0.389151 -0.064627 0.71296 RAD 0.00617284 + txt002 + SPHERE CENTER -0.41352 -0.060808 0.714081 RAD 0.00617284 + txt002 + SPHERE CENTER -0.399146 -0.0451997 0.701455 RAD 0.00617284 + txt002 + SPHERE CENTER -0.4293 -0.115031 0.544331 RAD 0.0555556 + txt002 + SPHERE CENTER -0.424299 -0.178985 0.581368 RAD 0.0185185 + txt002 + SPHERE CENTER -0.412497 -0.190929 0.599471 RAD 0.00617284 + txt002 + SPHERE CENTER -0.400273 -0.174844 0.585275 RAD 0.00617284 + txt002 + SPHERE CENTER -0.417001 -0.16674 0.601529 RAD 0.00617284 + txt002 + SPHERE CENTER -0.436523 -0.195071 0.595564 RAD 0.00617284 + txt002 + SPHERE CENTER -0.441027 -0.170881 0.597621 RAD 0.00617284 + txt002 + SPHERE CENTER -0.448325 -0.183127 0.577461 RAD 0.00617284 + txt002 + SPHERE CENTER -0.419795 -0.203175 0.57931 RAD 0.00617284 + txt002 + SPHERE CENTER -0.431597 -0.191231 0.561208 RAD 0.00617284 + txt002 + SPHERE CENTER -0.407571 -0.18709 0.565115 RAD 0.00617284 + txt002 + SPHERE CENTER -0.367336 -0.131634 0.581368 RAD 0.0185185 + txt002 + SPHERE CENTER -0.343834 -0.12515 0.585275 RAD 0.00617284 + txt002 + SPHERE CENTER -0.353814 -0.122476 0.56285 RAD 0.00617284 + txt002 + SPHERE CENTER -0.360946 -0.107784 0.581368 RAD 0.00617284 + txt002 + SPHERE CENTER -0.357357 -0.134308 0.603794 RAD 0.00617284 + txt002 + SPHERE CENTER -0.374468 -0.116942 0.599887 RAD 0.00617284 + txt002 + SPHERE CENTER -0.380859 -0.140792 0.599887 RAD 0.00617284 + txt002 + SPHERE CENTER -0.350225 -0.149 0.585275 RAD 0.00617284 + txt002 + SPHERE CENTER -0.373727 -0.155484 0.581368 RAD 0.00617284 + txt002 + SPHERE CENTER -0.360204 -0.146326 0.56285 RAD 0.00617284 + txt002 + SPHERE CENTER -0.4293 -0.115031 0.618405 RAD 0.0185185 + txt002 + SPHERE CENTER -0.41922 -0.10495 0.638566 RAD 0.00617284 + txt002 + SPHERE CENTER -0.40545 -0.10864 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER -0.42291 -0.0911807 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER -0.44307 -0.111341 0.638566 RAD 0.00617284 + txt002 + SPHERE CENTER -0.44676 -0.0975713 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER -0.45315 -0.121421 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER -0.425611 -0.128801 0.638566 RAD 0.00617284 + txt002 + SPHERE CENTER -0.435691 -0.138881 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER -0.411841 -0.13249 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER -0.486264 -0.162382 0.544331 RAD 0.0185185 + txt002 + SPHERE CENTER -0.502603 -0.174264 0.558526 RAD 0.00617284 + txt002 + SPHERE CENTER -0.479659 -0.170327 0.566757 RAD 0.00617284 + txt002 + SPHERE CENTER -0.495376 -0.15142 0.564491 RAD 0.00617284 + txt002 + SPHERE CENTER -0.509207 -0.166319 0.536101 RAD 0.00617284 + txt002 + SPHERE CENTER -0.501981 -0.143475 0.542066 RAD 0.00617284 + txt002 + SPHERE CENTER -0.492868 -0.154437 0.521905 RAD 0.00617284 + txt002 + SPHERE CENTER -0.49349 -0.185226 0.538366 RAD 0.00617284 + txt002 + SPHERE CENTER -0.477151 -0.173345 0.524171 RAD 0.00617284 + txt002 + SPHERE CENTER -0.470546 -0.18129 0.546597 RAD 0.00617284 + txt002 + SPHERE CENTER -0.491265 -0.0984274 0.581368 RAD 0.0185185 + txt002 + SPHERE CENTER -0.501491 -0.082906 0.597621 RAD 0.00617284 + txt002 + SPHERE CENTER -0.477742 -0.0892696 0.599887 RAD 0.00617284 + txt002 + SPHERE CENTER -0.484874 -0.0745774 0.581368 RAD 0.00617284 + txt002 + SPHERE CENTER -0.515014 -0.0920638 0.579103 RAD 0.00617284 + txt002 + SPHERE CENTER -0.498397 -0.0837352 0.56285 RAD 0.00617284 + txt002 + SPHERE CENTER -0.504787 -0.107585 0.56285 RAD 0.00617284 + txt002 + SPHERE CENTER -0.507882 -0.106756 0.597621 RAD 0.00617284 + txt002 + SPHERE CENTER -0.497655 -0.122277 0.581368 RAD 0.00617284 + txt002 + SPHERE CENTER -0.484132 -0.11312 0.599887 RAD 0.00617284 + txt002 + SPHERE CENTER -0.491265 -0.0984274 0.507294 RAD 0.0185185 + txt002 + SPHERE CENTER -0.508376 -0.0810612 0.503387 RAD 0.00617284 + txt002 + SPHERE CENTER -0.498397 -0.0837352 0.525813 RAD 0.00617284 + txt002 + SPHERE CENTER -0.484874 -0.0745774 0.507294 RAD 0.00617284 + txt002 + SPHERE CENTER -0.501244 -0.0957534 0.484868 RAD 0.00617284 + txt002 + SPHERE CENTER -0.477742 -0.0892696 0.488775 RAD 0.00617284 + txt002 + SPHERE CENTER -0.484132 -0.11312 0.488775 RAD 0.00617284 + txt002 + SPHERE CENTER -0.514767 -0.104911 0.503387 RAD 0.00617284 + txt002 + SPHERE CENTER -0.497655 -0.122277 0.507294 RAD 0.00617284 + txt002 + SPHERE CENTER -0.504787 -0.107585 0.525813 RAD 0.00617284 + txt002 + SPHERE CENTER -0.424299 -0.178985 0.507294 RAD 0.0185185 + txt002 + SPHERE CENTER -0.411775 -0.200165 0.505236 RAD 0.00617284 + txt002 + SPHERE CENTER -0.399922 -0.179342 0.511201 RAD 0.00617284 + txt002 + SPHERE CENTER -0.415187 -0.189948 0.527454 RAD 0.00617284 + txt002 + SPHERE CENTER -0.436152 -0.199808 0.501329 RAD 0.00617284 + txt002 + SPHERE CENTER -0.439564 -0.189591 0.523547 RAD 0.00617284 + txt002 + SPHERE CENTER -0.448677 -0.178629 0.503387 RAD 0.00617284 + txt002 + SPHERE CENTER -0.420888 -0.189202 0.485076 RAD 0.00617284 + txt002 + SPHERE CENTER -0.433412 -0.168023 0.487134 RAD 0.00617284 + txt002 + SPHERE CENTER -0.409035 -0.168379 0.491041 RAD 0.00617284 + txt002 + SPHERE CENTER -0.4293 -0.115031 0.470257 RAD 0.0185185 + txt002 + SPHERE CENTER -0.439381 -0.10495 0.450097 RAD 0.00617284 + txt002 + SPHERE CENTER -0.45315 -0.10864 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER -0.435691 -0.0911807 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER -0.415531 -0.111341 0.450097 RAD 0.00617284 + txt002 + SPHERE CENTER -0.411841 -0.0975713 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER -0.40545 -0.121421 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER -0.43299 -0.128801 0.450097 RAD 0.00617284 + txt002 + SPHERE CENTER -0.42291 -0.138881 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER -0.44676 -0.13249 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER -0.367336 -0.131634 0.507294 RAD 0.0185185 + txt002 + SPHERE CENTER -0.350719 -0.123305 0.491041 RAD 0.00617284 + txt002 + SPHERE CENTER -0.374468 -0.116942 0.488775 RAD 0.00617284 + txt002 + SPHERE CENTER -0.360946 -0.107784 0.507294 RAD 0.00617284 + txt002 + SPHERE CENTER -0.343587 -0.137998 0.509559 RAD 0.00617284 + txt002 + SPHERE CENTER -0.353814 -0.122476 0.525813 RAD 0.00617284 + txt002 + SPHERE CENTER -0.360204 -0.146326 0.525813 RAD 0.00617284 + txt002 + SPHERE CENTER -0.357109 -0.147155 0.491041 RAD 0.00617284 + txt002 + SPHERE CENTER -0.373727 -0.155484 0.507294 RAD 0.00617284 + txt002 + SPHERE CENTER -0.380859 -0.140792 0.488775 RAD 0.00617284 + txt002 + SPHERE CENTER -0.248762 -0.0483751 0.655442 RAD 0.0555556 + txt002 + SPHERE CENTER -0.183785 -0.0599222 0.689081 RAD 0.0185185 + txt002 + SPHERE CENTER -0.160406 -0.0522053 0.690965 RAD 0.00617284 + txt002 + SPHERE CENTER -0.171954 -0.0513956 0.669156 RAD 0.00617284 + txt002 + SPHERE CENTER -0.178533 -0.0358698 0.687193 RAD 0.00617284 + txt002 + SPHERE CENTER -0.172236 -0.0607319 0.71089 RAD 0.00617284 + txt002 + SPHERE CENTER -0.190363 -0.0443964 0.707118 RAD 0.00617284 + txt002 + SPHERE CENTER -0.195615 -0.0684488 0.709006 RAD 0.00617284 + txt002 + SPHERE CENTER -0.165658 -0.0762577 0.692853 RAD 0.00617284 + txt002 + SPHERE CENTER -0.189036 -0.0839747 0.690969 RAD 0.00617284 + txt002 + SPHERE CENTER -0.177206 -0.075448 0.671044 RAD 0.00617284 + txt002 + SPHERE CENTER -0.187119 -0.0172857 0.6286 RAD 0.0185185 + txt002 + SPHERE CENTER -0.176731 -0.00705049 0.608675 RAD 0.00617284 + txt002 + SPHERE CENTER -0.192673 -0.025725 0.60607 RAD 0.00617284 + txt002 + SPHERE CENTER -0.200733 -0.00352517 0.613272 RAD 0.00617284 + txt002 + SPHERE CENTER -0.171177 0.00138875 0.631205 RAD 0.00617284 + txt002 + SPHERE CENTER -0.195179 0.00491406 0.635801 RAD 0.00617284 + txt002 + SPHERE CENTER -0.181564 -0.00884647 0.65113 RAD 0.00617284 + txt002 + SPHERE CENTER -0.163117 -0.020811 0.624003 RAD 0.00617284 + txt002 + SPHERE CENTER -0.173504 -0.0310463 0.643928 RAD 0.00617284 + txt002 + SPHERE CENTER -0.179058 -0.0394855 0.621398 RAD 0.00617284 + txt002 + SPHERE CENTER -0.215921 0.00673113 0.692479 RAD 0.0185185 + txt002 + SPHERE CENTER -0.20044 0.0258737 0.690591 RAD 0.00617284 + txt002 + SPHERE CENTER -0.196602 0.00551963 0.677151 RAD 0.00617284 + txt002 + SPHERE CENTER -0.215612 0.0203763 0.671903 RAD 0.00617284 + txt002 + SPHERE CENTER -0.21976 0.0270852 0.705919 RAD 0.00617284 + txt002 + SPHERE CENTER -0.234932 0.0215878 0.687231 RAD 0.00617284 + txt002 + SPHERE CENTER -0.235241 0.00794264 0.707807 RAD 0.00617284 + txt002 + SPHERE CENTER -0.200749 0.0122285 0.711167 RAD 0.00617284 + txt002 + SPHERE CENTER -0.21623 -0.00691403 0.713055 RAD 0.00617284 + txt002 + SPHERE CENTER -0.196911 -0.00812553 0.697727 RAD 0.00617284 + txt002 + SPHERE CENTER -0.245428 -0.0910116 0.715923 RAD 0.0185185 + txt002 + SPHERE CENTER -0.234308 -0.0942304 0.737733 RAD 0.00617284 + txt002 + SPHERE CENTER -0.221514 -0.0854464 0.718528 RAD 0.00617284 + txt002 + SPHERE CENTER -0.238704 -0.0714204 0.729364 RAD 0.00617284 + txt002 + SPHERE CENTER -0.258223 -0.0997955 0.735128 RAD 0.00617284 + txt002 + SPHERE CENTER -0.262619 -0.0769856 0.726759 RAD 0.00617284 + txt002 + SPHERE CENTER -0.269343 -0.0965768 0.713318 RAD 0.00617284 + txt002 + SPHERE CENTER -0.241032 -0.113822 0.724292 RAD 0.00617284 + txt002 + SPHERE CENTER -0.252152 -0.110603 0.702483 RAD 0.00617284 + txt002 + SPHERE CENTER -0.228237 -0.105038 0.705088 RAD 0.00617284 + txt002 + SPHERE CENTER -0.277564 -0.0243582 0.719322 RAD 0.0185185 + txt002 + SPHERE CENTER -0.275459 -0.0076281 0.737359 RAD 0.00617284 + txt002 + SPHERE CENTER -0.255218 -0.0167139 0.726523 RAD 0.00617284 + txt002 + SPHERE CENTER -0.270078 -0.00142185 0.714074 RAD 0.00617284 + txt002 + SPHERE CENTER -0.297806 -0.0152725 0.730157 RAD 0.00617284 + txt002 + SPHERE CENTER -0.292425 -0.00906621 0.706872 RAD 0.00617284 + txt002 + SPHERE CENTER -0.299911 -0.0320026 0.71212 RAD 0.00617284 + txt002 + SPHERE CENTER -0.282946 -0.0305645 0.742607 RAD 0.00617284 + txt002 + SPHERE CENTER -0.285051 -0.0472946 0.72457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.262704 -0.0396503 0.731771 RAD 0.00617284 + txt002 + SPHERE CENTER -0.310405 -0.0794645 0.682285 RAD 0.0185185 + txt002 + SPHERE CENTER -0.324811 -0.0817333 0.702209 RAD 0.00617284 + txt002 + SPHERE CENTER -0.300317 -0.0800146 0.704814 RAD 0.00617284 + txt002 + SPHERE CENTER -0.313378 -0.0603366 0.697613 RAD 0.00617284 + txt002 + SPHERE CENTER -0.334899 -0.0811832 0.67968 RAD 0.00617284 + txt002 + SPHERE CENTER -0.323466 -0.0597864 0.675083 RAD 0.00617284 + txt002 + SPHERE CENTER -0.320493 -0.0789143 0.659755 RAD 0.00617284 + txt002 + SPHERE CENTER -0.321838 -0.100861 0.686881 RAD 0.00617284 + txt002 + SPHERE CENTER -0.307433 -0.0985923 0.666956 RAD 0.00617284 + txt002 + SPHERE CENTER -0.297345 -0.0991425 0.689486 RAD 0.00617284 + txt002 + SPHERE CENTER -0.216626 -0.115028 0.652044 RAD 0.0185185 + txt002 + SPHERE CENTER -0.195663 -0.127519 0.655816 RAD 0.00617284 + txt002 + SPHERE CENTER -0.194866 -0.104303 0.647447 RAD 0.00617284 + txt002 + SPHERE CENTER -0.201738 -0.108803 0.670732 RAD 0.00617284 + txt002 + SPHERE CENTER -0.217423 -0.138245 0.660413 RAD 0.00617284 + txt002 + SPHERE CENTER -0.223497 -0.119529 0.675329 RAD 0.00617284 + txt002 + SPHERE CENTER -0.238386 -0.125754 0.656641 RAD 0.00617284 + txt002 + SPHERE CENTER -0.210551 -0.133744 0.637128 RAD 0.00617284 + txt002 + SPHERE CENTER -0.231514 -0.121254 0.633356 RAD 0.00617284 + txt002 + SPHERE CENTER -0.209754 -0.110528 0.628759 RAD 0.00617284 + txt002 + SPHERE CENTER -0.281603 -0.103481 0.618405 RAD 0.0185185 + txt002 + SPHERE CENTER -0.291073 -0.126206 0.620293 RAD 0.00617284 + txt002 + SPHERE CENTER -0.271345 -0.119897 0.633733 RAD 0.00617284 + txt002 + SPHERE CENTER -0.293457 -0.110246 0.638981 RAD 0.00617284 + txt002 + SPHERE CENTER -0.301332 -0.10979 0.604965 RAD 0.00617284 + txt002 + SPHERE CENTER -0.303716 -0.0938302 0.623653 RAD 0.00617284 + txt002 + SPHERE CENTER -0.291862 -0.0870656 0.603077 RAD 0.00617284 + txt002 + SPHERE CENTER -0.279219 -0.119442 0.599717 RAD 0.00617284 + txt002 + SPHERE CENTER -0.269749 -0.0967168 0.597829 RAD 0.00617284 + txt002 + SPHERE CENTER -0.25949 -0.113132 0.613157 RAD 0.00617284 + txt002 + SPHERE CENTER -0.21996 -0.0723919 0.591563 RAD 0.0185185 + txt002 + SPHERE CENTER -0.20388 -0.0673141 0.573526 RAD 0.00617284 + txt002 + SPHERE CENTER -0.216456 -0.0490355 0.584361 RAD 0.00617284 + txt002 + SPHERE CENTER -0.198742 -0.0609052 0.596811 RAD 0.00617284 + txt002 + SPHERE CENTER -0.207384 -0.0906706 0.580727 RAD 0.00617284 + txt002 + SPHERE CENTER -0.202246 -0.0842617 0.604012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.223463 -0.0957484 0.598764 RAD 0.00617284 + txt002 + SPHERE CENTER -0.225098 -0.0788008 0.568278 RAD 0.00617284 + txt002 + SPHERE CENTER -0.241177 -0.0838786 0.586315 RAD 0.00617284 + txt002 + SPHERE CENTER -0.237674 -0.0605222 0.579113 RAD 0.00617284 + txt002 + SPHERE CENTER -0.471405 0.471405 1.11022e-16 RAD 0.166667 + txt002 + SPHERE CENTER -0.508983 0.690426 8.51251e-17 RAD 0.0555556 + txt002 + SPHERE CENTER -0.484794 0.755941 -0.0246914 RAD 0.0185185 + txt002 + SPHERE CENTER -0.47411 0.767658 -0.0436186 RAD 0.00617284 + txt002 + SPHERE CENTER -0.467528 0.744501 -0.0381316 RAD 0.00617284 + txt002 + SPHERE CENTER -0.489758 0.749038 -0.0478724 RAD 0.00617284 + txt002 + SPHERE CENTER -0.491377 0.779098 -0.0301783 RAD 0.00617284 + txt002 + SPHERE CENTER -0.507025 0.760478 -0.0344321 RAD 0.00617284 + txt002 + SPHERE CENTER -0.502061 0.767382 -0.0112511 RAD 0.00617284 + txt002 + SPHERE CENTER -0.469146 0.774562 -0.0204376 RAD 0.00617284 + txt002 + SPHERE CENTER -0.47983 0.762845 -0.00151032 RAD 0.00617284 + txt002 + SPHERE CENTER -0.462564 0.751405 -0.0149506 RAD 0.00617284 + txt002 + SPHERE CENTER -0.436283 0.7029 -0.00679642 RAD 0.0185185 + txt002 + SPHERE CENTER -0.418941 0.714226 -0.0202367 RAD 0.00617284 + txt002 + SPHERE CENTER -0.43889 0.704751 -0.0312799 RAD 0.00617284 + txt002 + SPHERE CENTER -0.44101 0.724842 -0.0170845 RAD 0.00617284 + txt002 + SPHERE CENTER -0.416335 0.712374 0.0042468 RAD 0.00617284 + txt002 + SPHERE CENTER -0.438403 0.722991 0.00739901 RAD 0.00617284 + txt002 + SPHERE CENTER -0.433677 0.701048 0.0176871 RAD 0.00617284 + txt002 + SPHERE CENTER -0.414215 0.692283 -0.00994863 RAD 0.00617284 + txt002 + SPHERE CENTER -0.431557 0.680957 0.00349164 RAD 0.00617284 + txt002 + SPHERE CENTER -0.434163 0.682808 -0.0209919 RAD 0.00617284 + txt002 + SPHERE CENTER -0.478434 0.695668 -0.0672777 RAD 0.0185185 + txt002 + SPHERE CENTER -0.481931 0.703418 -0.0904587 RAD 0.00617284 + txt002 + SPHERE CENTER -0.500827 0.694124 -0.0775657 RAD 0.00617284 + txt002 + SPHERE CENTER -0.491475 0.716184 -0.0716007 RAD 0.00617284 + txt002 + SPHERE CENTER -0.459538 0.704962 -0.0801706 RAD 0.00617284 + txt002 + SPHERE CENTER -0.469082 0.717727 -0.0613127 RAD 0.00617284 + txt002 + SPHERE CENTER -0.456041 0.697211 -0.0569896 RAD 0.00617284 + txt002 + SPHERE CENTER -0.46889 0.682902 -0.0861356 RAD 0.00617284 + txt002 + SPHERE CENTER -0.465393 0.675152 -0.0629546 RAD 0.00617284 + txt002 + SPHERE CENTER -0.487786 0.673608 -0.0732426 RAD 0.00617284 + txt002 + SPHERE CENTER -0.557494 0.743468 -0.0178949 RAD 0.0185185 + txt002 + SPHERE CENTER -0.560084 0.767402 -0.0233819 RAD 0.00617284 + txt002 + SPHERE CENTER -0.543179 0.760285 -0.00685171 RAD 0.00617284 + txt002 + SPHERE CENTER -0.53997 0.755145 -0.0307879 RAD 0.00617284 + txt002 + SPHERE CENTER -0.574398 0.750585 -0.0344251 RAD 0.00617284 + txt002 + SPHERE CENTER -0.554284 0.738328 -0.0418311 RAD 0.00617284 + txt002 + SPHERE CENTER -0.571808 0.726651 -0.0289382 RAD 0.00617284 + txt002 + SPHERE CENTER -0.577608 0.755725 -0.0104889 RAD 0.00617284 + txt002 + SPHERE CENTER -0.575017 0.731791 -0.00500196 RAD 0.00617284 + txt002 + SPHERE CENTER -0.560703 0.748608 0.00604126 RAD 0.00617284 + txt002 + SPHERE CENTER -0.551134 0.683194 -0.0604812 RAD 0.0185185 + txt002 + SPHERE CENTER -0.573364 0.687731 -0.070222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.571303 0.682033 -0.0462858 RAD 0.00617284 + txt002 + SPHERE CENTER -0.56324 0.703871 -0.0545162 RAD 0.00617284 + txt002 + SPHERE CENTER -0.553195 0.688893 -0.0844174 RAD 0.00617284 + txt002 + SPHERE CENTER -0.543071 0.705033 -0.0687117 RAD 0.00617284 + txt002 + SPHERE CENTER -0.530964 0.684356 -0.0746767 RAD 0.00617284 + txt002 + SPHERE CENTER -0.561258 0.667055 -0.076187 RAD 0.00617284 + txt002 + SPHERE CENTER -0.539027 0.662518 -0.0664462 RAD 0.00617284 + txt002 + SPHERE CENTER -0.559196 0.661356 -0.0522508 RAD 0.00617284 + txt002 + SPHERE CENTER -0.581682 0.677953 0.00679642 RAD 0.0185185 + txt002 + SPHERE CENTER -0.601808 0.682851 0.0202367 RAD 0.00617284 + txt002 + SPHERE CENTER -0.579842 0.680568 0.0312799 RAD 0.00617284 + txt002 + SPHERE CENTER -0.58454 0.700216 0.0170845 RAD 0.00617284 + txt002 + SPHERE CENTER -0.603648 0.680237 -0.0042468 RAD 0.00617284 + txt002 + SPHERE CENTER -0.58638 0.697602 -0.00739901 RAD 0.00617284 + txt002 + SPHERE CENTER -0.583522 0.675339 -0.0176871 RAD 0.00617284 + txt002 + SPHERE CENTER -0.59895 0.660588 0.00994863 RAD 0.00617284 + txt002 + SPHERE CENTER -0.578824 0.65569 -0.00349164 RAD 0.00617284 + txt002 + SPHERE CENTER -0.576984 0.658304 0.0209919 RAD 0.00617284 + txt002 + SPHERE CENTER -0.515343 0.7507 0.0425863 RAD 0.0185185 + txt002 + SPHERE CENTER -0.506594 0.773394 0.0468401 RAD 0.00617284 + txt002 + SPHERE CENTER -0.491321 0.755462 0.0394341 RAD 0.00617284 + txt002 + SPHERE CENTER -0.507924 0.764807 0.0237283 RAD 0.00617284 + txt002 + SPHERE CENTER -0.530616 0.768632 0.0499923 RAD 0.00617284 + txt002 + SPHERE CENTER -0.531946 0.760045 0.0268805 RAD 0.00617284 + txt002 + SPHERE CENTER -0.539365 0.745938 0.0457385 RAD 0.00617284 + txt002 + SPHERE CENTER -0.514012 0.759287 0.065698 RAD 0.00617284 + txt002 + SPHERE CENTER -0.522762 0.736593 0.0614442 RAD 0.00617284 + txt002 + SPHERE CENTER -0.49874 0.741355 0.058292 RAD 0.00617284 + txt002 + SPHERE CENTER -0.539531 0.685185 0.0672777 RAD 0.0185185 + txt002 + SPHERE CENTER -0.538818 0.693658 0.0904587 RAD 0.00617284 + txt002 + SPHERE CENTER -0.517905 0.691194 0.0775657 RAD 0.00617284 + txt002 + SPHERE CENTER -0.534075 0.708875 0.0716007 RAD 0.00617284 + txt002 + SPHERE CENTER -0.560445 0.687649 0.0801706 RAD 0.00617284 + txt002 + SPHERE CENTER -0.555702 0.702866 0.0613127 RAD 0.00617284 + txt002 + SPHERE CENTER -0.561158 0.679176 0.0569896 RAD 0.00617284 + txt002 + SPHERE CENTER -0.544274 0.669969 0.0861356 RAD 0.00617284 + txt002 + SPHERE CENTER -0.544988 0.661495 0.0629546 RAD 0.00617284 + txt002 + SPHERE CENTER -0.523361 0.667505 0.0732426 RAD 0.00617284 + txt002 + SPHERE CENTER -0.466832 0.697658 0.0604812 RAD 0.0185185 + txt002 + SPHERE CENTER -0.447385 0.709346 0.070222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.447429 0.703286 0.0462858 RAD 0.00617284 + txt002 + SPHERE CENTER -0.46231 0.721188 0.0545162 RAD 0.00617284 + txt002 + SPHERE CENTER -0.466788 0.703718 0.0844174 RAD 0.00617284 + txt002 + SPHERE CENTER -0.481713 0.71556 0.0687117 RAD 0.00617284 + txt002 + SPHERE CENTER -0.486235 0.692031 0.0746767 RAD 0.00617284 + txt002 + SPHERE CENTER -0.451907 0.685816 0.076187 RAD 0.00617284 + txt002 + SPHERE CENTER -0.471354 0.674129 0.0664462 RAD 0.00617284 + txt002 + SPHERE CENTER -0.451951 0.679757 0.0522508 RAD 0.00617284 + txt002 + SPHERE CENTER -0.335322 0.607487 0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER -0.283164 0.659645 0.104315 RAD 0.0185185 + txt002 + SPHERE CENTER -0.269894 0.672915 0.0882695 RAD 0.00617284 + txt002 + SPHERE CENTER -0.275822 0.649528 0.0830215 RAD 0.00617284 + txt002 + SPHERE CENTER -0.293281 0.666987 0.0830215 RAD 0.00617284 + txt002 + SPHERE CENTER -0.277236 0.683032 0.109563 RAD 0.00617284 + txt002 + SPHERE CENTER -0.300624 0.677104 0.104315 RAD 0.00617284 + txt002 + SPHERE CENTER -0.290507 0.669762 0.125608 RAD 0.00617284 + txt002 + SPHERE CENTER -0.259777 0.665573 0.109563 RAD 0.00617284 + txt002 + SPHERE CENTER -0.273047 0.652302 0.125608 RAD 0.00617284 + txt002 + SPHERE CENTER -0.265705 0.642185 0.104315 RAD 0.00617284 + txt002 + SPHERE CENTER -0.286452 0.603979 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.279361 0.614273 0.0342624 RAD 0.00617284 + txt002 + SPHERE CENTER -0.303327 0.613293 0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.288206 0.628413 0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER -0.262487 0.604959 0.0496945 RAD 0.00617284 + txt002 + SPHERE CENTER -0.271332 0.619099 0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.269578 0.594664 0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.277607 0.589839 0.0373488 RAD 0.00617284 + txt002 + SPHERE CENTER -0.284698 0.579544 0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER -0.301572 0.588858 0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.33883 0.656357 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.328536 0.663448 0.0342624 RAD 0.00617284 + txt002 + SPHERE CENTER -0.314396 0.654603 0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER -0.329516 0.639482 0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.35297 0.665202 0.0373488 RAD 0.00617284 + txt002 + SPHERE CENTER -0.353951 0.641237 0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.363265 0.658111 0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER -0.33785 0.680322 0.0496945 RAD 0.00617284 + txt002 + SPHERE CENTER -0.348145 0.673232 0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.32371 0.671477 0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.332034 0.663153 0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER -0.321274 0.684748 0.165118 RAD 0.00617284 + txt002 + SPHERE CENTER -0.308341 0.666888 0.154009 RAD 0.00617284 + txt002 + SPHERE CENTER -0.326131 0.678752 0.141664 RAD 0.00617284 + txt002 + SPHERE CENTER -0.344967 0.681014 0.170979 RAD 0.00617284 + txt002 + SPHERE CENTER -0.349824 0.675018 0.147525 RAD 0.00617284 + txt002 + SPHERE CENTER -0.355727 0.659419 0.165731 RAD 0.00617284 + txt002 + SPHERE CENTER -0.327177 0.669149 0.183325 RAD 0.00617284 + txt002 + SPHERE CENTER -0.337937 0.647554 0.178077 RAD 0.00617284 + txt002 + SPHERE CENTER -0.314244 0.651289 0.172216 RAD 0.00617284 + txt002 + SPHERE CENTER -0.3877 0.659866 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.391875 0.684201 0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER -0.37258 0.674986 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.37258 0.674986 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.406996 0.669081 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.3877 0.659866 0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER -0.40282 0.644745 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.406996 0.669081 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.40282 0.644745 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.3877 0.659866 0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER -0.384191 0.610996 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.389739 0.622198 0.18796 RAD 0.00617284 + txt002 + SPHERE CENTER -0.366159 0.617804 0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.378964 0.63493 0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER -0.407771 0.61539 0.172528 RAD 0.00617284 + txt002 + SPHERE CENTER -0.396997 0.628121 0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER -0.402224 0.604188 0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.394966 0.598265 0.184873 RAD 0.00617284 + txt002 + SPHERE CENTER -0.389418 0.587062 0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.371386 0.593871 0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.279656 0.610775 0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER -0.258061 0.621535 0.165118 RAD 0.00617284 + txt002 + SPHERE CENTER -0.264057 0.616678 0.141664 RAD 0.00617284 + txt002 + SPHERE CENTER -0.275921 0.634468 0.154009 RAD 0.00617284 + txt002 + SPHERE CENTER -0.27366 0.615632 0.183325 RAD 0.00617284 + txt002 + SPHERE CENTER -0.29152 0.628565 0.172216 RAD 0.00617284 + txt002 + SPHERE CENTER -0.295255 0.604872 0.178077 RAD 0.00617284 + txt002 + SPHERE CENTER -0.261795 0.597842 0.170979 RAD 0.00617284 + txt002 + SPHERE CENTER -0.28339 0.587082 0.165731 RAD 0.00617284 + txt002 + SPHERE CENTER -0.267791 0.592985 0.147525 RAD 0.00617284 + txt002 + SPHERE CENTER -0.331813 0.558618 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.320611 0.55307 0.18796 RAD 0.00617284 + txt002 + SPHERE CENTER -0.30788 0.563845 0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER -0.325005 0.57665 0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.344544 0.547843 0.184873 RAD 0.00617284 + txt002 + SPHERE CENTER -0.348938 0.571423 0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.355747 0.553391 0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.327419 0.535038 0.172528 RAD 0.00617284 + txt002 + SPHERE CENTER -0.338621 0.540585 0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.314688 0.545813 0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER -0.282943 0.555109 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.258608 0.550934 0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER -0.267823 0.570229 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.267823 0.570229 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.273728 0.535813 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.282943 0.555109 0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER -0.298064 0.539989 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.273728 0.535813 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.298064 0.539989 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.282943 0.555109 0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER -0.335322 0.607487 -0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER -0.313405 0.629404 -0.178389 RAD 0.0185185 + txt002 + SPHERE CENTER -0.316595 0.626214 -0.202664 RAD 0.00617284 + txt002 + SPHERE CENTER -0.318408 0.606941 -0.187336 RAD 0.00617284 + txt002 + SPHERE CENTER -0.335868 0.624401 -0.187336 RAD 0.00617284 + txt002 + SPHERE CENTER -0.311592 0.648676 -0.193717 RAD 0.00617284 + txt002 + SPHERE CENTER -0.330864 0.646863 -0.178389 RAD 0.00617284 + txt002 + SPHERE CENTER -0.308402 0.651867 -0.169441 RAD 0.00617284 + txt002 + SPHERE CENTER -0.294133 0.631217 -0.193717 RAD 0.00617284 + txt002 + SPHERE CENTER -0.290942 0.634407 -0.169441 RAD 0.00617284 + txt002 + SPHERE CENTER -0.295946 0.611945 -0.178389 RAD 0.00617284 + txt002 + SPHERE CENTER -0.331813 0.558618 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.319608 0.539107 -0.175614 RAD 0.00617284 + txt002 + SPHERE CENTER -0.307378 0.556863 -0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.322499 0.541743 -0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.344043 0.540862 -0.178701 RAD 0.00617284 + txt002 + SPHERE CENTER -0.346933 0.543497 -0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER -0.356248 0.560372 -0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER -0.328923 0.555982 -0.191046 RAD 0.00617284 + txt002 + SPHERE CENTER -0.341128 0.575492 -0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.316693 0.573738 -0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.384191 0.610996 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.403702 0.623201 -0.175614 RAD 0.00617284 + txt002 + SPHERE CENTER -0.401066 0.62031 -0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.385946 0.635431 -0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.386827 0.613886 -0.191046 RAD 0.00617284 + txt002 + SPHERE CENTER -0.369071 0.626116 -0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.367317 0.601681 -0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.401947 0.598766 -0.178701 RAD 0.00617284 + txt002 + SPHERE CENTER -0.382437 0.586561 -0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER -0.399312 0.595876 -0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER -0.316914 0.678274 -0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER -0.305407 0.69384 -0.138161 RAD 0.00617284 + txt002 + SPHERE CENTER -0.296616 0.671002 -0.134867 RAD 0.00617284 + txt002 + SPHERE CENTER -0.317721 0.674446 -0.147213 RAD 0.00617284 + txt002 + SPHERE CENTER -0.325704 0.701111 -0.126127 RAD 0.00617284 + txt002 + SPHERE CENTER -0.338018 0.681717 -0.135179 RAD 0.00617284 + txt002 + SPHERE CENTER -0.337211 0.685545 -0.110799 RAD 0.00617284 + txt002 + SPHERE CENTER -0.3046 0.697667 -0.113782 RAD 0.00617284 + txt002 + SPHERE CENTER -0.316107 0.682101 -0.0984536 RAD 0.00617284 + txt002 + SPHERE CENTER -0.295809 0.67483 -0.110488 RAD 0.00617284 + txt002 + SPHERE CENTER -0.3877 0.659866 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.391875 0.684201 -0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER -0.37258 0.674986 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.37258 0.674986 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.406996 0.669081 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.3877 0.659866 -0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER -0.40282 0.644745 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.406996 0.669081 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.40282 0.644745 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.3877 0.659866 -0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER -0.33883 0.656357 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.329538 0.677411 -0.0466081 RAD 0.00617284 + txt002 + SPHERE CENTER -0.314897 0.661584 -0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER -0.332022 0.674389 -0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.353472 0.672184 -0.0435217 RAD 0.00617284 + txt002 + SPHERE CENTER -0.355956 0.669162 -0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.362764 0.65113 -0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER -0.336346 0.659378 -0.031176 RAD 0.00617284 + txt002 + SPHERE CENTER -0.345639 0.638325 -0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.321705 0.643552 -0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.264535 0.625895 -0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER -0.248969 0.637402 -0.138161 RAD 0.00617284 + txt002 + SPHERE CENTER -0.268363 0.625088 -0.147213 RAD 0.00617284 + txt002 + SPHERE CENTER -0.271807 0.646193 -0.134867 RAD 0.00617284 + txt002 + SPHERE CENTER -0.245142 0.638209 -0.113782 RAD 0.00617284 + txt002 + SPHERE CENTER -0.267979 0.647 -0.110488 RAD 0.00617284 + txt002 + SPHERE CENTER -0.260708 0.626702 -0.0984536 RAD 0.00617284 + txt002 + SPHERE CENTER -0.241698 0.617105 -0.126127 RAD 0.00617284 + txt002 + SPHERE CENTER -0.257264 0.605598 -0.110799 RAD 0.00617284 + txt002 + SPHERE CENTER -0.261092 0.604791 -0.135179 RAD 0.00617284 + txt002 + SPHERE CENTER -0.286452 0.603979 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.265398 0.613271 -0.0466081 RAD 0.00617284 + txt002 + SPHERE CENTER -0.26842 0.610787 -0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.281225 0.627912 -0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER -0.283431 0.606463 -0.031176 RAD 0.00617284 + txt002 + SPHERE CENTER -0.299257 0.621104 -0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.304484 0.59717 -0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.270625 0.589337 -0.0435217 RAD 0.00617284 + txt002 + SPHERE CENTER -0.291679 0.580045 -0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER -0.273647 0.586853 -0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.282943 0.555109 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.258608 0.550934 -0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER -0.267823 0.570229 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.267823 0.570229 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.273728 0.535813 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.282943 0.555109 -0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER -0.298064 0.539989 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.273728 0.535813 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.298064 0.539989 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.282943 0.555109 -0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER -0.645066 0.554344 -0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER -0.681385 0.616373 -0.129006 RAD 0.0185185 + txt002 + SPHERE CENTER -0.678928 0.639472 -0.137375 RAD 0.00617284 + txt002 + SPHERE CENTER -0.661636 0.629767 -0.122663 RAD 0.00617284 + txt002 + SPHERE CENTER -0.664108 0.621631 -0.145845 RAD 0.00617284 + txt002 + SPHERE CENTER -0.698678 0.626079 -0.143718 RAD 0.00617284 + txt002 + SPHERE CENTER -0.683858 0.608237 -0.152187 RAD 0.00617284 + txt002 + SPHERE CENTER -0.701135 0.602979 -0.135349 RAD 0.00617284 + txt002 + SPHERE CENTER -0.696205 0.634214 -0.120537 RAD 0.00617284 + txt002 + SPHERE CENTER -0.698662 0.611115 -0.112168 RAD 0.00617284 + txt002 + SPHERE CENTER -0.678912 0.624508 -0.105825 RAD 0.00617284 + txt002 + SPHERE CENTER -0.649723 0.609912 -0.062352 RAD 0.0185185 + txt002 + SPHERE CENTER -0.640648 0.631982 -0.0560094 RAD 0.00617284 + txt002 + SPHERE CENTER -0.625749 0.614812 -0.0656463 RAD 0.00617284 + txt002 + SPHERE CENTER -0.64267 0.62585 -0.0798417 RAD 0.00617284 + txt002 + SPHERE CENTER -0.664623 0.627081 -0.0527151 RAD 0.00617284 + txt002 + SPHERE CENTER -0.666645 0.620949 -0.0765474 RAD 0.00617284 + txt002 + SPHERE CENTER -0.673698 0.605012 -0.0590577 RAD 0.00617284 + txt002 + SPHERE CENTER -0.647702 0.616044 -0.0385197 RAD 0.00617284 + txt002 + SPHERE CENTER -0.656777 0.593974 -0.0448623 RAD 0.00617284 + txt002 + SPHERE CENTER -0.632802 0.598874 -0.0481565 RAD 0.00617284 + txt002 + SPHERE CENTER -0.607573 0.617144 -0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER -0.595495 0.63057 -0.139672 RAD 0.00617284 + txt002 + SPHERE CENTER -0.594239 0.605919 -0.140323 RAD 0.00617284 + txt002 + SPHERE CENTER -0.615286 0.617371 -0.146288 RAD 0.00617284 + txt002 + SPHERE CENTER -0.608828 0.641795 -0.122182 RAD 0.00617284 + txt002 + SPHERE CENTER -0.628619 0.628595 -0.128798 RAD 0.00617284 + txt002 + SPHERE CENTER -0.620906 0.628369 -0.105343 RAD 0.00617284 + txt002 + SPHERE CENTER -0.587782 0.630343 -0.116217 RAD 0.00617284 + txt002 + SPHERE CENTER -0.59986 0.616917 -0.0993785 RAD 0.00617284 + txt002 + SPHERE CENTER -0.586526 0.605692 -0.116868 RAD 0.00617284 + txt002 + SPHERE CENTER -0.676727 0.560805 -0.177765 RAD 0.0185185 + txt002 + SPHERE CENTER -0.689897 0.57563 -0.192477 RAD 0.00617284 + txt002 + SPHERE CENTER -0.693998 0.575587 -0.168128 RAD 0.00617284 + txt002 + SPHERE CENTER -0.673115 0.585222 -0.177114 RAD 0.00617284 + txt002 + SPHERE CENTER -0.672626 0.560848 -0.202114 RAD 0.00617284 + txt002 + SPHERE CENTER -0.655844 0.57044 -0.186751 RAD 0.00617284 + txt002 + SPHERE CENTER -0.659456 0.546023 -0.187402 RAD 0.00617284 + txt002 + SPHERE CENTER -0.693509 0.551213 -0.193128 RAD 0.00617284 + txt002 + SPHERE CENTER -0.680339 0.536388 -0.178416 RAD 0.00617284 + txt002 + SPHERE CENTER -0.69761 0.55117 -0.16878 RAD 0.00617284 + txt002 + SPHERE CENTER -0.602915 0.561576 -0.171592 RAD 0.0185185 + txt002 + SPHERE CENTER -0.602201 0.570049 -0.194773 RAD 0.00617284 + txt002 + SPHERE CENTER -0.623084 0.560414 -0.185788 RAD 0.00617284 + txt002 + SPHERE CENTER -0.615021 0.582252 -0.177557 RAD 0.00617284 + txt002 + SPHERE CENTER -0.582032 0.571211 -0.180578 RAD 0.00617284 + txt002 + SPHERE CENTER -0.594852 0.583414 -0.163362 RAD 0.00617284 + txt002 + SPHERE CENTER -0.582745 0.562738 -0.157397 RAD 0.00617284 + txt002 + SPHERE CENTER -0.590095 0.549372 -0.188808 RAD 0.00617284 + txt002 + SPHERE CENTER -0.590808 0.540899 -0.165627 RAD 0.00617284 + txt002 + SPHERE CENTER -0.610978 0.539737 -0.179823 RAD 0.00617284 + txt002 + SPHERE CENTER -0.640408 0.498776 -0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER -0.627785 0.478525 -0.166213 RAD 0.00617284 + txt002 + SPHERE CENTER -0.615951 0.497935 -0.156576 RAD 0.00617284 + txt002 + SPHERE CENTER -0.630799 0.484234 -0.142381 RAD 0.00617284 + txt002 + SPHERE CENTER -0.652241 0.479365 -0.169507 RAD 0.00617284 + txt002 + SPHERE CENTER -0.655255 0.485075 -0.145675 RAD 0.00617284 + txt002 + SPHERE CENTER -0.664864 0.499616 -0.163165 RAD 0.00617284 + txt002 + SPHERE CENTER -0.637394 0.493066 -0.183703 RAD 0.00617284 + txt002 + SPHERE CENTER -0.650016 0.513317 -0.17736 RAD 0.00617284 + txt002 + SPHERE CENTER -0.62556 0.512476 -0.174066 RAD 0.00617284 + txt002 + SPHERE CENTER -0.718878 0.553573 -0.117284 RAD 0.0185185 + txt002 + SPHERE CENTER -0.73992 0.563328 -0.108814 RAD 0.00617284 + txt002 + SPHERE CENTER -0.720935 0.559693 -0.0934517 RAD 0.00617284 + txt002 + SPHERE CENTER -0.719679 0.577348 -0.110668 RAD 0.00617284 + txt002 + SPHERE CENTER -0.737863 0.557208 -0.132647 RAD 0.00617284 + txt002 + SPHERE CENTER -0.717623 0.571228 -0.1345 RAD 0.00617284 + txt002 + SPHERE CENTER -0.716821 0.547453 -0.141116 RAD 0.00617284 + txt002 + SPHERE CENTER -0.739118 0.539553 -0.115431 RAD 0.00617284 + txt002 + SPHERE CENTER -0.718076 0.529798 -0.1239 RAD 0.00617284 + txt002 + SPHERE CENTER -0.720133 0.535918 -0.100068 RAD 0.00617284 + txt002 + SPHERE CENTER -0.682558 0.491544 -0.099389 RAD 0.0185185 + txt002 + SPHERE CENTER -0.688647 0.474542 -0.0825505 RAD 0.00617284 + txt002 + SPHERE CENTER -0.666351 0.485132 -0.0818993 RAD 0.00617284 + txt002 + SPHERE CENTER -0.686417 0.498226 -0.0759343 RAD 0.00617284 + txt002 + SPHERE CENTER -0.704854 0.480953 -0.10004 RAD 0.00617284 + txt002 + SPHERE CENTER -0.702624 0.504637 -0.093424 RAD 0.00617284 + txt002 + SPHERE CENTER -0.698765 0.497955 -0.116879 RAD 0.00617284 + txt002 + SPHERE CENTER -0.684788 0.46786 -0.106005 RAD 0.00617284 + txt002 + SPHERE CENTER -0.678699 0.484862 -0.122844 RAD 0.00617284 + txt002 + SPHERE CENTER -0.662492 0.47845 -0.105354 RAD 0.00617284 + txt002 + SPHERE CENTER -0.687216 0.547112 -0.0506299 RAD 0.0185185 + txt002 + SPHERE CENTER -0.690713 0.554862 -0.0274488 RAD 0.00617284 + txt002 + SPHERE CENTER -0.667813 0.552739 -0.0364345 RAD 0.00617284 + txt002 + SPHERE CENTER -0.682694 0.570641 -0.0446649 RAD 0.00617284 + txt002 + SPHERE CENTER -0.710116 0.549235 -0.0416443 RAD 0.00617284 + txt002 + SPHERE CENTER -0.702097 0.565014 -0.0588603 RAD 0.00617284 + txt002 + SPHERE CENTER -0.706619 0.541484 -0.0648253 RAD 0.00617284 + txt002 + SPHERE CENTER -0.695235 0.531333 -0.0334138 RAD 0.00617284 + txt002 + SPHERE CENTER -0.691738 0.523582 -0.0565949 RAD 0.00617284 + txt002 + SPHERE CENTER -0.672335 0.52921 -0.0423994 RAD 0.00617284 + txt002 + SPHERE CENTER -0.471405 0.471405 -0.222222 RAD 0.0555556 + txt002 + SPHERE CENTER -0.501645 0.501645 -0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER -0.499795 0.519956 -0.299164 RAD 0.00617284 + txt002 + SPHERE CENTER -0.493653 0.523893 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER -0.479397 0.509638 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER -0.507788 0.497708 -0.306292 RAD 0.00617284 + txt002 + SPHERE CENTER -0.48739 0.48739 -0.296959 RAD 0.00617284 + txt002 + SPHERE CENTER -0.509638 0.479397 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER -0.522043 0.511963 -0.292037 RAD 0.00617284 + txt002 + SPHERE CENTER -0.523893 0.493653 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER -0.515901 0.515901 -0.268448 RAD 0.00617284 + txt002 + SPHERE CENTER -0.542955 0.490576 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.559233 0.507719 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER -0.539759 0.502501 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.536564 0.514426 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.562428 0.495794 -0.236478 RAD 0.00617284 + txt002 + SPHERE CENTER -0.539759 0.502501 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.54615 0.478651 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.565623 0.483869 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER -0.549345 0.466726 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.54615 0.478651 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.490576 0.542955 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.483869 0.565623 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER -0.466726 0.549345 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.478651 0.54615 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.507719 0.559233 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER -0.502501 0.539759 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.514426 0.536564 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.495794 0.562428 -0.207967 RAD 0.00617284 + txt002 + SPHERE CENTER -0.502501 0.539759 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.478651 0.54615 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.430095 0.482473 -0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER -0.430434 0.489762 -0.306292 RAD 0.00617284 + txt002 + SPHERE CENTER -0.449569 0.477255 -0.296959 RAD 0.00617284 + txt002 + SPHERE CENTER -0.445366 0.500519 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER -0.41096 0.49498 -0.292037 RAD 0.00617284 + txt002 + SPHERE CENTER -0.425893 0.505737 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER -0.410622 0.487691 -0.268448 RAD 0.00617284 + txt002 + SPHERE CENTER -0.415162 0.471716 -0.299164 RAD 0.00617284 + txt002 + SPHERE CENTER -0.414824 0.464428 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER -0.434297 0.45921 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER -0.419026 0.523783 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.404771 0.538038 -0.236478 RAD 0.00617284 + txt002 + SPHERE CENTER -0.410297 0.515053 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.427756 0.532513 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.4135 0.546768 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER -0.436486 0.541242 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.427756 0.532513 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.396041 0.529309 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER -0.410297 0.515053 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.401567 0.506323 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.399854 0.452233 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.377186 0.45894 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER -0.396659 0.464158 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.393464 0.476083 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.380381 0.447015 -0.207967 RAD 0.00617284 + txt002 + SPHERE CENTER -0.396659 0.464158 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.40305 0.440308 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.383576 0.43509 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER -0.406245 0.428383 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.40305 0.440308 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.482473 0.430095 -0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER -0.48121 0.407271 -0.292037 RAD 0.00617284 + txt002 + SPHERE CENTER -0.464428 0.414824 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER -0.487691 0.410622 -0.268448 RAD 0.00617284 + txt002 + SPHERE CENTER -0.499256 0.422542 -0.299164 RAD 0.00617284 + txt002 + SPHERE CENTER -0.505737 0.425893 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER -0.500519 0.445366 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER -0.475992 0.426744 -0.306292 RAD 0.00617284 + txt002 + SPHERE CENTER -0.477255 0.449569 -0.296959 RAD 0.00617284 + txt002 + SPHERE CENTER -0.45921 0.434297 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER -0.452233 0.399854 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.43509 0.383576 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER -0.428383 0.406245 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.440308 0.40305 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.45894 0.377186 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER -0.464158 0.396659 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.476083 0.393464 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.447015 0.380381 -0.236478 RAD 0.00617284 + txt002 + SPHERE CENTER -0.464158 0.396659 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.440308 0.40305 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.523783 0.419026 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.538038 0.404771 -0.207967 RAD 0.00617284 + txt002 + SPHERE CENTER -0.515053 0.410297 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.532513 0.427756 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.546768 0.4135 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER -0.541242 0.436486 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.532513 0.427756 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.529309 0.396041 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER -0.515053 0.410297 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.506323 0.401567 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.607487 0.335322 -0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER -0.659645 0.283164 -0.104315 RAD 0.0185185 + txt002 + SPHERE CENTER -0.672915 0.269894 -0.0882695 RAD 0.00617284 + txt002 + SPHERE CENTER -0.649528 0.275822 -0.0830215 RAD 0.00617284 + txt002 + SPHERE CENTER -0.666987 0.293281 -0.0830215 RAD 0.00617284 + txt002 + SPHERE CENTER -0.683032 0.277236 -0.109563 RAD 0.00617284 + txt002 + SPHERE CENTER -0.677104 0.300624 -0.104315 RAD 0.00617284 + txt002 + SPHERE CENTER -0.669762 0.290507 -0.125608 RAD 0.00617284 + txt002 + SPHERE CENTER -0.665573 0.259777 -0.109563 RAD 0.00617284 + txt002 + SPHERE CENTER -0.652302 0.273047 -0.125608 RAD 0.00617284 + txt002 + SPHERE CENTER -0.642185 0.265705 -0.104315 RAD 0.00617284 + txt002 + SPHERE CENTER -0.603979 0.286452 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.592776 0.280905 -0.0342624 RAD 0.00617284 + txt002 + SPHERE CENTER -0.580045 0.291679 -0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER -0.59717 0.304484 -0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.61671 0.275678 -0.0373488 RAD 0.00617284 + txt002 + SPHERE CENTER -0.621104 0.299257 -0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.627912 0.281225 -0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER -0.599585 0.262872 -0.0496945 RAD 0.00617284 + txt002 + SPHERE CENTER -0.610787 0.26842 -0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.586853 0.273647 -0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.656357 0.33883 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.661904 0.350033 -0.0342624 RAD 0.00617284 + txt002 + SPHERE CENTER -0.638325 0.345639 -0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.65113 0.362764 -0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER -0.679937 0.343224 -0.0496945 RAD 0.00617284 + txt002 + SPHERE CENTER -0.669162 0.355956 -0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.674389 0.332022 -0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.667131 0.326099 -0.0373488 RAD 0.00617284 + txt002 + SPHERE CENTER -0.661584 0.314897 -0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER -0.643552 0.321705 -0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.663153 0.332034 -0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER -0.685865 0.340177 -0.165118 RAD 0.00617284 + txt002 + SPHERE CENTER -0.679339 0.33606 -0.141664 RAD 0.00617284 + txt002 + SPHERE CENTER -0.669651 0.355123 -0.154009 RAD 0.00617284 + txt002 + SPHERE CENTER -0.669679 0.336151 -0.183325 RAD 0.00617284 + txt002 + SPHERE CENTER -0.653465 0.351097 -0.172216 RAD 0.00617284 + txt002 + SPHERE CENTER -0.646968 0.328008 -0.178077 RAD 0.00617284 + txt002 + SPHERE CENTER -0.679367 0.317089 -0.170979 RAD 0.00617284 + txt002 + SPHERE CENTER -0.656656 0.308945 -0.165731 RAD 0.00617284 + txt002 + SPHERE CENTER -0.672841 0.312971 -0.147525 RAD 0.00617284 + txt002 + SPHERE CENTER -0.659866 0.3877 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.664041 0.412036 -0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER -0.644745 0.40282 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.644745 0.40282 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.679161 0.396915 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.659866 0.3877 -0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER -0.674986 0.37258 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.679161 0.396915 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.674986 0.37258 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.659866 0.3877 -0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER -0.610996 0.384191 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.600701 0.391282 -0.18796 RAD 0.00617284 + txt002 + SPHERE CENTER -0.586561 0.382437 -0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER -0.601681 0.367317 -0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.625136 0.393037 -0.184873 RAD 0.00617284 + txt002 + SPHERE CENTER -0.626116 0.369071 -0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.635431 0.385946 -0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.610016 0.408157 -0.172528 RAD 0.00617284 + txt002 + SPHERE CENTER -0.62031 0.401066 -0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.595876 0.399312 -0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER -0.610775 0.279656 -0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER -0.602632 0.256944 -0.165118 RAD 0.00617284 + txt002 + SPHERE CENTER -0.587686 0.273158 -0.154009 RAD 0.00617284 + txt002 + SPHERE CENTER -0.606749 0.26347 -0.141664 RAD 0.00617284 + txt002 + SPHERE CENTER -0.62572 0.263442 -0.170979 RAD 0.00617284 + txt002 + SPHERE CENTER -0.629838 0.269968 -0.147525 RAD 0.00617284 + txt002 + SPHERE CENTER -0.633864 0.286153 -0.165731 RAD 0.00617284 + txt002 + SPHERE CENTER -0.606658 0.27313 -0.183325 RAD 0.00617284 + txt002 + SPHERE CENTER -0.614801 0.295841 -0.178077 RAD 0.00617284 + txt002 + SPHERE CENTER -0.591712 0.289344 -0.172216 RAD 0.00617284 + txt002 + SPHERE CENTER -0.558618 0.331813 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.551527 0.342108 -0.18796 RAD 0.00617284 + txt002 + SPHERE CENTER -0.575492 0.341128 -0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.560372 0.356248 -0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER -0.534652 0.332793 -0.172528 RAD 0.00617284 + txt002 + SPHERE CENTER -0.543497 0.346933 -0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER -0.541743 0.322499 -0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.549772 0.317673 -0.184873 RAD 0.00617284 + txt002 + SPHERE CENTER -0.556863 0.307378 -0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.573738 0.316693 -0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.555109 0.282943 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.530773 0.278768 -0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER -0.539989 0.298064 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.539989 0.298064 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.545894 0.263648 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.555109 0.282943 -0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER -0.570229 0.267823 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.545894 0.263648 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.570229 0.267823 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.555109 0.282943 -0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER -0.645066 0.554344 0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER -0.668521 0.610229 0.153697 RAD 0.0185185 + txt002 + SPHERE CENTER -0.663938 0.633406 0.160875 RAD 0.00617284 + txt002 + SPHERE CENTER -0.64522 0.617928 0.156428 RAD 0.00617284 + txt002 + SPHERE CENTER -0.65892 0.626429 0.137727 RAD 0.00617284 + txt002 + SPHERE CENTER -0.687239 0.625707 0.158144 RAD 0.00617284 + txt002 + SPHERE CENTER -0.682221 0.61873 0.134996 RAD 0.00617284 + txt002 + SPHERE CENTER -0.691822 0.602531 0.150967 RAD 0.00617284 + txt002 + SPHERE CENTER -0.673539 0.617206 0.176845 RAD 0.00617284 + txt002 + SPHERE CENTER -0.678123 0.59403 0.169668 RAD 0.00617284 + txt002 + SPHERE CENTER -0.654822 0.601728 0.172398 RAD 0.00617284 + txt002 + SPHERE CENTER -0.598918 0.585648 0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER -0.580238 0.601562 0.162601 RAD 0.00617284 + txt002 + SPHERE CENTER -0.581665 0.587563 0.142311 RAD 0.00617284 + txt002 + SPHERE CENTER -0.59781 0.605914 0.14581 RAD 0.00617284 + txt002 + SPHERE CENTER -0.597491 0.599646 0.18016 RAD 0.00617284 + txt002 + SPHERE CENTER -0.615063 0.603999 0.163369 RAD 0.00617284 + txt002 + SPHERE CENTER -0.616171 0.583732 0.177429 RAD 0.00617284 + txt002 + SPHERE CENTER -0.581346 0.581295 0.176661 RAD 0.00617284 + txt002 + SPHERE CENTER -0.600026 0.565381 0.173931 RAD 0.00617284 + txt002 + SPHERE CENTER -0.582773 0.567297 0.156372 RAD 0.00617284 + txt002 + SPHERE CENTER -0.619787 0.622977 0.099389 RAD 0.0185185 + txt002 + SPHERE CENTER -0.608008 0.63767 0.0834188 RAD 0.00617284 + txt002 + SPHERE CENTER -0.601637 0.613891 0.0853287 RAD 0.00617284 + txt002 + SPHERE CENTER -0.623239 0.620102 0.0751099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.626157 0.646756 0.0974792 RAD 0.00617284 + txt002 + SPHERE CENTER -0.641389 0.629188 0.0891702 RAD 0.00617284 + txt002 + SPHERE CENTER -0.637936 0.632063 0.113449 RAD 0.00617284 + txt002 + SPHERE CENTER -0.604555 0.640545 0.107698 RAD 0.00617284 + txt002 + SPHERE CENTER -0.616334 0.625852 0.123668 RAD 0.00617284 + txt002 + SPHERE CENTER -0.598184 0.616766 0.109608 RAD 0.00617284 + txt002 + SPHERE CENTER -0.714669 0.578925 0.104938 RAD 0.0185185 + txt002 + SPHERE CENTER -0.729812 0.597914 0.109385 RAD 0.00617284 + txt002 + SPHERE CENTER -0.711617 0.592661 0.125228 RAD 0.00617284 + txt002 + SPHERE CENTER -0.70632 0.602084 0.103028 RAD 0.00617284 + txt002 + SPHERE CENTER -0.732864 0.584178 0.0890951 RAD 0.00617284 + txt002 + SPHERE CENTER -0.709372 0.588348 0.0827387 RAD 0.00617284 + txt002 + SPHERE CENTER -0.71772 0.565189 0.0846485 RAD 0.00617284 + txt002 + SPHERE CENTER -0.738161 0.574755 0.111295 RAD 0.00617284 + txt002 + SPHERE CENTER -0.723017 0.555767 0.106848 RAD 0.00617284 + txt002 + SPHERE CENTER -0.719965 0.569503 0.127138 RAD 0.00617284 + txt002 + SPHERE CENTER -0.665934 0.591673 0.0506299 RAD 0.0185185 + txt002 + SPHERE CENTER -0.658095 0.605761 0.0319289 RAD 0.00617284 + txt002 + SPHERE CENTER -0.647455 0.607672 0.0541285 RAD 0.00617284 + txt002 + SPHERE CENTER -0.643855 0.58746 0.0404111 RAD 0.00617284 + txt002 + SPHERE CENTER -0.676573 0.589763 0.0284303 RAD 0.00617284 + txt002 + SPHERE CENTER -0.662334 0.571461 0.0369125 RAD 0.00617284 + txt002 + SPHERE CENTER -0.684413 0.575674 0.0471312 RAD 0.00617284 + txt002 + SPHERE CENTER -0.680174 0.609975 0.0421477 RAD 0.00617284 + txt002 + SPHERE CENTER -0.688013 0.595887 0.0608487 RAD 0.00617284 + txt002 + SPHERE CENTER -0.669535 0.611885 0.0643473 RAD 0.00617284 + txt002 + SPHERE CENTER -0.691213 0.52304 0.062352 RAD 0.0185185 + txt002 + SPHERE CENTER -0.712906 0.511567 0.0596212 RAD 0.00617284 + txt002 + SPHERE CENTER -0.699372 0.507717 0.079911 RAD 0.00617284 + txt002 + SPHERE CENTER -0.710453 0.529503 0.0764123 RAD 0.00617284 + txt002 + SPHERE CENTER -0.704747 0.526889 0.0420622 RAD 0.00617284 + txt002 + SPHERE CENTER -0.702295 0.544826 0.0588533 RAD 0.00617284 + txt002 + SPHERE CENTER -0.683054 0.538362 0.044793 RAD 0.00617284 + txt002 + SPHERE CENTER -0.693665 0.505104 0.0455609 RAD 0.00617284 + txt002 + SPHERE CENTER -0.671972 0.516576 0.0482916 RAD 0.00617284 + txt002 + SPHERE CENTER -0.680131 0.501254 0.0658506 RAD 0.00617284 + txt002 + SPHERE CENTER -0.6938 0.541596 0.165419 RAD 0.0185185 + txt002 + SPHERE CENTER -0.70016 0.547376 0.188567 RAD 0.00617284 + txt002 + SPHERE CENTER -0.676324 0.546319 0.182211 RAD 0.00617284 + txt002 + SPHERE CENTER -0.690564 0.564621 0.173728 RAD 0.00617284 + txt002 + SPHERE CENTER -0.717636 0.542652 0.171776 RAD 0.00617284 + txt002 + SPHERE CENTER -0.70804 0.559898 0.156937 RAD 0.00617284 + txt002 + SPHERE CENTER -0.711276 0.536873 0.148628 RAD 0.00617284 + txt002 + SPHERE CENTER -0.703396 0.524351 0.180258 RAD 0.00617284 + txt002 + SPHERE CENTER -0.697037 0.518571 0.157111 RAD 0.00617284 + txt002 + SPHERE CENTER -0.679561 0.523294 0.173902 RAD 0.00617284 + txt002 + SPHERE CENTER -0.670344 0.48571 0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER -0.67091 0.466887 0.138803 RAD 0.00617284 + txt002 + SPHERE CENTER -0.650637 0.480853 0.136894 RAD 0.00617284 + txt002 + SPHERE CENTER -0.671107 0.490138 0.147112 RAD 0.00617284 + txt002 + SPHERE CENTER -0.690617 0.471745 0.124743 RAD 0.00617284 + txt002 + SPHERE CENTER -0.690815 0.494995 0.133052 RAD 0.00617284 + txt002 + SPHERE CENTER -0.690052 0.490567 0.108773 RAD 0.00617284 + txt002 + SPHERE CENTER -0.670147 0.46246 0.114524 RAD 0.00617284 + txt002 + SPHERE CENTER -0.669581 0.481283 0.0985541 RAD 0.00617284 + txt002 + SPHERE CENTER -0.649874 0.476425 0.112614 RAD 0.00617284 + txt002 + SPHERE CENTER -0.624197 0.517014 0.171592 RAD 0.0185185 + txt002 + SPHERE CENTER -0.60809 0.516313 0.190293 RAD 0.00617284 + txt002 + SPHERE CENTER -0.60089 0.524375 0.168094 RAD 0.00617284 + txt002 + SPHERE CENTER -0.616221 0.538029 0.181811 RAD 0.00617284 + txt002 + SPHERE CENTER -0.631397 0.508952 0.193792 RAD 0.00617284 + txt002 + SPHERE CENTER -0.639529 0.530668 0.18531 RAD 0.00617284 + txt002 + SPHERE CENTER -0.647504 0.509653 0.175091 RAD 0.00617284 + txt002 + SPHERE CENTER -0.616065 0.495298 0.180075 RAD 0.00617284 + txt002 + SPHERE CENTER -0.632172 0.495999 0.161374 RAD 0.00617284 + txt002 + SPHERE CENTER -0.608865 0.50336 0.157875 RAD 0.00617284 + txt002 + SPHERE CENTER -0.607487 0.335322 0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER -0.629404 0.313405 0.178389 RAD 0.0185185 + txt002 + SPHERE CENTER -0.626214 0.316595 0.202664 RAD 0.00617284 + txt002 + SPHERE CENTER -0.606941 0.318408 0.187336 RAD 0.00617284 + txt002 + SPHERE CENTER -0.624401 0.335868 0.187336 RAD 0.00617284 + txt002 + SPHERE CENTER -0.648676 0.311592 0.193717 RAD 0.00617284 + txt002 + SPHERE CENTER -0.646863 0.330864 0.178389 RAD 0.00617284 + txt002 + SPHERE CENTER -0.651867 0.308402 0.169441 RAD 0.00617284 + txt002 + SPHERE CENTER -0.631217 0.294133 0.193717 RAD 0.00617284 + txt002 + SPHERE CENTER -0.634407 0.290942 0.169441 RAD 0.00617284 + txt002 + SPHERE CENTER -0.611945 0.295946 0.178389 RAD 0.00617284 + txt002 + SPHERE CENTER -0.558618 0.331813 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.537564 0.341105 0.175614 RAD 0.00617284 + txt002 + SPHERE CENTER -0.540585 0.338621 0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.553391 0.355747 0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.555596 0.334297 0.191046 RAD 0.00617284 + txt002 + SPHERE CENTER -0.571423 0.348938 0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.57665 0.325005 0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.542791 0.317172 0.178701 RAD 0.00617284 + txt002 + SPHERE CENTER -0.563845 0.30788 0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER -0.545813 0.314688 0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER -0.610996 0.384191 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.601704 0.405245 0.175614 RAD 0.00617284 + txt002 + SPHERE CENTER -0.587062 0.389418 0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.604188 0.402224 0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.625637 0.400018 0.178701 RAD 0.00617284 + txt002 + SPHERE CENTER -0.628121 0.396997 0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER -0.63493 0.378964 0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER -0.608512 0.387213 0.191046 RAD 0.00617284 + txt002 + SPHERE CENTER -0.617804 0.366159 0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.593871 0.371386 0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.678274 0.316914 0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER -0.697473 0.31938 0.138161 RAD 0.00617284 + txt002 + SPHERE CENTER -0.674538 0.318074 0.147213 RAD 0.00617284 + txt002 + SPHERE CENTER -0.681812 0.338182 0.134867 RAD 0.00617284 + txt002 + SPHERE CENTER -0.701209 0.31822 0.113782 RAD 0.00617284 + txt002 + SPHERE CENTER -0.685547 0.337022 0.110488 RAD 0.00617284 + txt002 + SPHERE CENTER -0.682009 0.315754 0.0984536 RAD 0.00617284 + txt002 + SPHERE CENTER -0.693935 0.298112 0.126127 RAD 0.00617284 + txt002 + SPHERE CENTER -0.674736 0.295646 0.110799 RAD 0.00617284 + txt002 + SPHERE CENTER -0.671 0.296805 0.135179 RAD 0.00617284 + txt002 + SPHERE CENTER -0.659866 0.3877 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.664041 0.412036 0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER -0.644745 0.40282 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.644745 0.40282 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.679161 0.396915 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.659866 0.3877 0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER -0.674986 0.37258 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.679161 0.396915 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.674986 0.37258 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.659866 0.3877 0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER -0.656357 0.33883 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.675867 0.351035 0.0466081 RAD 0.00617284 + txt002 + SPHERE CENTER -0.673232 0.348145 0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.658111 0.363265 0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER -0.658993 0.341721 0.031176 RAD 0.00617284 + txt002 + SPHERE CENTER -0.641237 0.353951 0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.639482 0.329516 0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.674113 0.3266 0.0435217 RAD 0.00617284 + txt002 + SPHERE CENTER -0.654603 0.314396 0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER -0.671477 0.32371 0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.625895 0.264535 0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER -0.623429 0.245336 0.138161 RAD 0.00617284 + txt002 + SPHERE CENTER -0.604627 0.260997 0.134867 RAD 0.00617284 + txt002 + SPHERE CENTER -0.624736 0.268271 0.147213 RAD 0.00617284 + txt002 + SPHERE CENTER -0.644697 0.248874 0.126127 RAD 0.00617284 + txt002 + SPHERE CENTER -0.646004 0.271809 0.135179 RAD 0.00617284 + txt002 + SPHERE CENTER -0.647163 0.268073 0.110799 RAD 0.00617284 + txt002 + SPHERE CENTER -0.624589 0.2416 0.113782 RAD 0.00617284 + txt002 + SPHERE CENTER -0.627055 0.2608 0.0984536 RAD 0.00617284 + txt002 + SPHERE CENTER -0.605787 0.257262 0.110488 RAD 0.00617284 + txt002 + SPHERE CENTER -0.603979 0.286452 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.591774 0.266942 0.0466081 RAD 0.00617284 + txt002 + SPHERE CENTER -0.579544 0.284698 0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER -0.594664 0.269578 0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.616209 0.268696 0.0435217 RAD 0.00617284 + txt002 + SPHERE CENTER -0.619099 0.271332 0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.628413 0.288206 0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER -0.601088 0.283817 0.031176 RAD 0.00617284 + txt002 + SPHERE CENTER -0.613293 0.303327 0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.588858 0.301572 0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.555109 0.282943 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.530773 0.278768 0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER -0.539989 0.298064 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.539989 0.298064 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.545894 0.263648 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.555109 0.282943 0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER -0.570229 0.267823 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.545894 0.263648 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.570229 0.267823 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.555109 0.282943 0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER -0.471405 0.471405 0.222222 RAD 0.0555556 + txt002 + SPHERE CENTER -0.441164 0.501645 0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER -0.424703 0.518106 0.290934 RAD 0.00617284 + txt002 + SPHERE CENTER -0.420089 0.505261 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.437548 0.522721 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.445778 0.51449 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER -0.458623 0.519105 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER -0.462239 0.498029 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER -0.428319 0.497031 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER -0.44478 0.48057 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER -0.423704 0.484186 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER -0.399854 0.490576 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.382226 0.502679 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.399854 0.490576 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER -0.405389 0.511231 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.382226 0.502679 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.405389 0.511231 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.399854 0.490576 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER -0.376691 0.482024 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.39432 0.469922 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.39432 0.469922 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.452233 0.542955 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.44013 0.560583 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.431578 0.53742 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.452233 0.542955 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER -0.460785 0.566118 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.472887 0.548489 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.472887 0.548489 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.44013 0.560583 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.452233 0.542955 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER -0.431578 0.53742 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.512714 0.482473 0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER -0.51514 0.495905 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER -0.492654 0.48988 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER -0.506323 0.506323 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER -0.5352 0.488498 0.290934 RAD 0.00617284 + txt002 + SPHERE CENTER -0.526383 0.498917 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.532774 0.475067 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.521531 0.472055 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER -0.519105 0.458623 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER -0.499045 0.46603 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER -0.523783 0.523783 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.527958 0.548119 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.508662 0.538903 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.508662 0.538903 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.543078 0.532998 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.523783 0.523783 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER -0.538903 0.508662 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.543078 0.532998 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.538903 0.508662 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.523783 0.523783 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER -0.542955 0.452233 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.564273 0.4539 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.542955 0.452233 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER -0.548489 0.472887 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.564273 0.4539 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.548489 0.472887 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.542955 0.452233 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER -0.558738 0.433245 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.53742 0.431578 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.53742 0.431578 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.460336 0.430095 0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER -0.446904 0.427669 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER -0.436486 0.436486 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER -0.45293 0.450155 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER -0.470754 0.421278 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER -0.47678 0.443764 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER -0.484186 0.423704 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER -0.454311 0.407609 0.290934 RAD 0.00617284 + txt002 + SPHERE CENTER -0.467742 0.410035 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.443892 0.416426 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.490576 0.399854 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.488909 0.378536 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.469922 0.39432 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.490576 0.399854 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER -0.509564 0.384071 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.511231 0.405389 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.511231 0.405389 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.488909 0.378536 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.490576 0.399854 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER -0.469922 0.39432 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.419026 0.419026 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.39469 0.414851 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.403906 0.434147 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.403906 0.434147 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.409811 0.399731 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.419026 0.419026 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER -0.434147 0.403906 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.409811 0.399731 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.434147 0.403906 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.419026 0.419026 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER -0.643951 -0.172546 1.11022e-16 RAD 0.166667 + txt002 + SPHERE CENTER -0.835815 -0.157543 0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER -0.871646 -0.122136 0.165419 RAD 0.0185185 + txt002 + SPHERE CENTER -0.871334 -0.102403 0.180258 RAD 0.00617284 + txt002 + SPHERE CENTER -0.850164 -0.113406 0.173902 RAD 0.00617284 + txt002 + SPHERE CENTER -0.862937 -0.100577 0.157111 RAD 0.00617284 + txt002 + SPHERE CENTER -0.892817 -0.111133 0.171776 RAD 0.00617284 + txt002 + SPHERE CENTER -0.884419 -0.109307 0.148628 RAD 0.00617284 + txt002 + SPHERE CENTER -0.893129 -0.130866 0.156937 RAD 0.00617284 + txt002 + SPHERE CENTER -0.880044 -0.123961 0.188567 RAD 0.00617284 + txt002 + SPHERE CENTER -0.880356 -0.143694 0.173728 RAD 0.00617284 + txt002 + SPHERE CENTER -0.858873 -0.134964 0.182211 RAD 0.00617284 + txt002 + SPHERE CENTER -0.799077 -0.135649 0.171592 RAD 0.0185185 + txt002 + SPHERE CENTER -0.781177 -0.120908 0.180075 RAD 0.00617284 + txt002 + SPHERE CENTER -0.778973 -0.13149 0.157875 RAD 0.00617284 + txt002 + SPHERE CENTER -0.795477 -0.113462 0.161374 RAD 0.00617284 + txt002 + SPHERE CENTER -0.801282 -0.125067 0.193792 RAD 0.00617284 + txt002 + SPHERE CENTER -0.815582 -0.11762 0.175091 RAD 0.00617284 + txt002 + SPHERE CENTER -0.819182 -0.139808 0.18531 RAD 0.00617284 + txt002 + SPHERE CENTER -0.784778 -0.143095 0.190293 RAD 0.00617284 + txt002 + SPHERE CENTER -0.802678 -0.157836 0.181811 RAD 0.00617284 + txt002 + SPHERE CENTER -0.782573 -0.153678 0.168094 RAD 0.00617284 + txt002 + SPHERE CENTER -0.82339 -0.0854653 0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER -0.811594 -0.0654286 0.114524 RAD 0.00617284 + txt002 + SPHERE CENTER -0.80102 -0.0876595 0.112614 RAD 0.00617284 + txt002 + SPHERE CENTER -0.820516 -0.0820122 0.0985541 RAD 0.00617284 + txt002 + SPHERE CENTER -0.833964 -0.0632344 0.124743 RAD 0.00617284 + txt002 + SPHERE CENTER -0.842886 -0.079818 0.108773 RAD 0.00617284 + txt002 + SPHERE CENTER -0.845761 -0.083271 0.133052 RAD 0.00617284 + txt002 + SPHERE CENTER -0.814468 -0.0688817 0.138803 RAD 0.00617284 + txt002 + SPHERE CENTER -0.826265 -0.0889183 0.147112 RAD 0.00617284 + txt002 + SPHERE CENTER -0.803895 -0.0911125 0.136894 RAD 0.00617284 + txt002 + SPHERE CENTER -0.908384 -0.14403 0.104938 RAD 0.0185185 + txt002 + SPHERE CENTER -0.926643 -0.128672 0.111295 RAD 0.00617284 + txt002 + SPHERE CENTER -0.90826 -0.133221 0.127138 RAD 0.00617284 + txt002 + SPHERE CENTER -0.904034 -0.1198 0.106848 RAD 0.00617284 + txt002 + SPHERE CENTER -0.926768 -0.139481 0.0890951 RAD 0.00617284 + txt002 + SPHERE CENTER -0.904159 -0.130608 0.0846485 RAD 0.00617284 + txt002 + SPHERE CENTER -0.908508 -0.154838 0.0827387 RAD 0.00617284 + txt002 + SPHERE CENTER -0.930993 -0.152902 0.109385 RAD 0.00617284 + txt002 + SPHERE CENTER -0.912733 -0.16826 0.103028 RAD 0.00617284 + txt002 + SPHERE CENTER -0.912609 -0.157451 0.125228 RAD 0.00617284 + txt002 + SPHERE CENTER -0.860128 -0.107359 0.062352 RAD 0.0185185 + txt002 + SPHERE CENTER -0.853284 -0.0905999 0.0455609 RAD 0.00617284 + txt002 + SPHERE CENTER -0.839638 -0.0940331 0.0658506 RAD 0.00617284 + txt002 + SPHERE CENTER -0.840233 -0.111382 0.0482916 RAD 0.00617284 + txt002 + SPHERE CENTER -0.873773 -0.103926 0.0420622 RAD 0.00617284 + txt002 + SPHERE CENTER -0.860723 -0.124708 0.044793 RAD 0.00617284 + txt002 + SPHERE CENTER -0.880618 -0.120685 0.0588533 RAD 0.00617284 + txt002 + SPHERE CENTER -0.873178 -0.086577 0.0596212 RAD 0.00617284 + txt002 + SPHERE CENTER -0.880022 -0.103336 0.0764123 RAD 0.00617284 + txt002 + SPHERE CENTER -0.859532 -0.0900102 0.079911 RAD 0.00617284 + txt002 + SPHERE CENTER -0.872552 -0.179437 0.0506299 RAD 0.0185185 + txt002 + SPHERE CENTER -0.894035 -0.188167 0.0421477 RAD 0.00617284 + txt002 + SPHERE CENTER -0.885777 -0.195141 0.0643473 RAD 0.00617284 + txt002 + SPHERE CENTER -0.89378 -0.172046 0.0608487 RAD 0.00617284 + txt002 + SPHERE CENTER -0.880811 -0.172463 0.0284303 RAD 0.00617284 + txt002 + SPHERE CENTER -0.880556 -0.156342 0.0471312 RAD 0.00617284 + txt002 + SPHERE CENTER -0.859328 -0.163733 0.0369125 RAD 0.00617284 + txt002 + SPHERE CENTER -0.872807 -0.195558 0.0319289 RAD 0.00617284 + txt002 + SPHERE CENTER -0.851325 -0.186828 0.0404111 RAD 0.00617284 + txt002 + SPHERE CENTER -0.864549 -0.202532 0.0541285 RAD 0.00617284 + txt002 + SPHERE CENTER -0.884071 -0.194213 0.153697 RAD 0.0185185 + txt002 + SPHERE CENTER -0.891905 -0.197746 0.176845 RAD 0.00617284 + txt002 + SPHERE CENTER -0.867957 -0.193701 0.172398 RAD 0.00617284 + txt002 + SPHERE CENTER -0.884286 -0.175383 0.169668 RAD 0.00617284 + txt002 + SPHERE CENTER -0.908019 -0.198259 0.158144 RAD 0.00617284 + txt002 + SPHERE CENTER -0.900401 -0.175896 0.150967 RAD 0.00617284 + txt002 + SPHERE CENTER -0.900186 -0.194726 0.134996 RAD 0.00617284 + txt002 + SPHERE CENTER -0.89169 -0.216576 0.160875 RAD 0.00617284 + txt002 + SPHERE CENTER -0.883856 -0.213043 0.137727 RAD 0.00617284 + txt002 + SPHERE CENTER -0.867741 -0.212531 0.156428 RAD 0.00617284 + txt002 + SPHERE CENTER -0.84824 -0.229621 0.099389 RAD 0.0185185 + txt002 + SPHERE CENTER -0.843832 -0.25245 0.107698 RAD 0.00617284 + txt002 + SPHERE CENTER -0.826426 -0.235043 0.109608 RAD 0.00617284 + txt002 + SPHERE CENTER -0.846687 -0.233837 0.123668 RAD 0.00617284 + txt002 + SPHERE CENTER -0.865646 -0.247028 0.0974792 RAD 0.00617284 + txt002 + SPHERE CENTER -0.868501 -0.228415 0.113449 RAD 0.00617284 + txt002 + SPHERE CENTER -0.870053 -0.224198 0.0891702 RAD 0.00617284 + txt002 + SPHERE CENTER -0.845385 -0.248234 0.0834188 RAD 0.00617284 + txt002 + SPHERE CENTER -0.849792 -0.225404 0.0751099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.827978 -0.230827 0.0853287 RAD 0.00617284 + txt002 + SPHERE CENTER -0.811502 -0.207727 0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER -0.794108 -0.212743 0.176661 RAD 0.00617284 + txt002 + SPHERE CENTER -0.788345 -0.199907 0.156372 RAD 0.00617284 + txt002 + SPHERE CENTER -0.802328 -0.189621 0.173931 RAD 0.00617284 + txt002 + SPHERE CENTER -0.817265 -0.220563 0.18016 RAD 0.00617284 + txt002 + SPHERE CENTER -0.825486 -0.197441 0.177429 RAD 0.00617284 + txt002 + SPHERE CENTER -0.83466 -0.215547 0.163369 RAD 0.00617284 + txt002 + SPHERE CENTER -0.803282 -0.230849 0.162601 RAD 0.00617284 + txt002 + SPHERE CENTER -0.820676 -0.225832 0.14581 RAD 0.00617284 + txt002 + SPHERE CENTER -0.797518 -0.218012 0.142311 RAD 0.00617284 + txt002 + SPHERE CENTER -0.643951 -0.172546 0.222222 RAD 0.0555556 + txt002 + SPHERE CENTER -0.61371 -0.142305 0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER -0.597249 -0.125845 0.290934 RAD 0.00617284 + txt002 + SPHERE CENTER -0.592635 -0.138689 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.610094 -0.12123 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.618324 -0.12946 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER -0.631169 -0.124846 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER -0.634785 -0.145921 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER -0.600865 -0.14692 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER -0.617326 -0.163381 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER -0.596251 -0.159765 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER -0.5724 -0.153374 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.554772 -0.141271 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.5724 -0.153374 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER -0.577935 -0.13272 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.554772 -0.141271 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.577935 -0.13272 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.5724 -0.153374 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER -0.549237 -0.161926 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.566866 -0.174029 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.566866 -0.174029 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.624779 -0.100996 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.612676 -0.0833673 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.604124 -0.10653 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.624779 -0.100996 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER -0.633331 -0.0778329 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.645433 -0.0954616 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.645433 -0.0954616 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.612676 -0.0833673 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.624779 -0.100996 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER -0.604124 -0.10653 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.68526 -0.161477 0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER -0.687686 -0.148046 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER -0.6652 -0.154071 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER -0.678869 -0.137627 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER -0.707746 -0.155452 0.290934 RAD 0.00617284 + txt002 + SPHERE CENTER -0.698929 -0.145033 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.70532 -0.168883 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.694077 -0.171896 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER -0.691651 -0.185327 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER -0.671591 -0.177921 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER -0.696329 -0.120168 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.700504 -0.095832 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.681209 -0.105047 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.681209 -0.105047 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.715624 -0.110952 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.696329 -0.120168 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER -0.711449 -0.135288 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.715624 -0.110952 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.711449 -0.135288 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.696329 -0.120168 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER -0.715501 -0.191718 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.736819 -0.190051 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.715501 -0.191718 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER -0.721035 -0.171063 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.736819 -0.190051 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.721035 -0.171063 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.715501 -0.191718 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER -0.731284 -0.210706 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.709966 -0.212373 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.709966 -0.212373 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.632882 -0.213855 0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER -0.61945 -0.216282 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER -0.609032 -0.207465 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER -0.625476 -0.193796 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER -0.6433 -0.222672 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER -0.649326 -0.200186 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER -0.656732 -0.220246 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER -0.626857 -0.236341 0.290934 RAD 0.00617284 + txt002 + SPHERE CENTER -0.640288 -0.233915 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.616438 -0.227525 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.663122 -0.244096 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.661455 -0.265414 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.642468 -0.249631 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.663122 -0.244096 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER -0.68211 -0.25988 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.683777 -0.238562 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.683777 -0.238562 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.661455 -0.265414 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.663122 -0.244096 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER -0.642468 -0.249631 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.591572 -0.224924 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.567237 -0.2291 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.576452 -0.209804 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.576452 -0.209804 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.582357 -0.24422 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.591572 -0.224924 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER -0.606693 -0.240045 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.582357 -0.24422 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.606693 -0.240045 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.591572 -0.224924 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER -0.69376 0.0133465 0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER -0.674309 0.0838533 0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER -0.66171 0.103063 0.113782 RAD 0.00617284 + txt002 + SPHERE CENTER -0.653258 0.0800983 0.110488 RAD 0.00617284 + txt002 + SPHERE CENTER -0.673446 0.0876683 0.0984536 RAD 0.00617284 + txt002 + SPHERE CENTER -0.682761 0.106818 0.126127 RAD 0.00617284 + txt002 + SPHERE CENTER -0.694497 0.0914233 0.110799 RAD 0.00617284 + txt002 + SPHERE CENTER -0.69536 0.0876083 0.135179 RAD 0.00617284 + txt002 + SPHERE CENTER -0.662574 0.0992478 0.138161 RAD 0.00617284 + txt002 + SPHERE CENTER -0.675172 0.0800382 0.147213 RAD 0.00617284 + txt002 + SPHERE CENTER -0.654121 0.0762832 0.134867 RAD 0.00617284 + txt002 + SPHERE CENTER -0.62221 0.0325183 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.604582 0.0446211 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.62221 0.0325183 0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER -0.627745 0.053173 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.604582 0.0446211 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.627745 0.053173 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.62221 0.0325183 0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER -0.599047 0.0239663 0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER -0.616676 0.0118635 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.616676 0.0118635 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.666287 0.0539145 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.662466 0.0547519 0.031176 RAD 0.00617284 + txt002 + SPHERE CENTER -0.660752 0.0332597 0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.682791 0.0439578 0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.668 0.0754066 0.0435217 RAD 0.00617284 + txt002 + SPHERE CENTER -0.688325 0.0646126 0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER -0.671821 0.0745692 0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.645962 0.0647085 0.0466081 RAD 0.00617284 + txt002 + SPHERE CENTER -0.649783 0.0638711 0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.644249 0.0432164 0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER -0.745859 0.0646815 0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER -0.750021 0.0887955 0.126127 RAD 0.00617284 + txt002 + SPHERE CENTER -0.729506 0.078459 0.135179 RAD 0.00617284 + txt002 + SPHERE CENTER -0.732161 0.0813312 0.110799 RAD 0.00617284 + txt002 + SPHERE CENTER -0.766375 0.075018 0.113782 RAD 0.00617284 + txt002 + SPHERE CENTER -0.748514 0.0675537 0.0984536 RAD 0.00617284 + txt002 + SPHERE CENTER -0.762212 0.050904 0.110488 RAD 0.00617284 + txt002 + SPHERE CENTER -0.763719 0.0721458 0.138161 RAD 0.00617284 + txt002 + SPHERE CENTER -0.759557 0.0480318 0.134867 RAD 0.00617284 + txt002 + SPHERE CENTER -0.743204 0.0618093 0.147213 RAD 0.00617284 + txt002 + SPHERE CENTER -0.737837 0.0347427 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.747099 0.0542122 0.0435217 RAD 0.00617284 + txt002 + SPHERE CENTER -0.743371 0.0553974 0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.7241 0.0550267 0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER -0.741565 0.0335575 0.031176 RAD 0.00617284 + txt002 + SPHERE CENTER -0.718566 0.0343719 0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.732303 0.014088 0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.760836 0.0339282 0.0466081 RAD 0.00617284 + txt002 + SPHERE CENTER -0.751574 0.0144587 0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER -0.757108 0.0351134 0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.76531 -0.0058253 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.786629 -0.00415829 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.76531 -0.0058253 0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER -0.770845 0.0148294 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.786629 -0.00415829 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.770845 0.0148294 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.76531 -0.0058253 0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER -0.781094 -0.024813 0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER -0.759776 -0.02648 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.759776 -0.02648 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.701782 0.0432853 0.178389 RAD 0.0185185 + txt002 + SPHERE CENTER -0.693716 0.0608821 0.193717 RAD 0.00617284 + txt002 + SPHERE CENTER -0.677932 0.0496759 0.178389 RAD 0.00617284 + txt002 + SPHERE CENTER -0.694884 0.0652402 0.169441 RAD 0.00617284 + txt002 + SPHERE CENTER -0.717566 0.0544915 0.193717 RAD 0.00617284 + txt002 + SPHERE CENTER -0.718734 0.0588496 0.169441 RAD 0.00617284 + txt002 + SPHERE CENTER -0.725632 0.0368947 0.178389 RAD 0.00617284 + txt002 + SPHERE CENTER -0.700615 0.0389272 0.202664 RAD 0.00617284 + txt002 + SPHERE CENTER -0.708681 0.0213304 0.187336 RAD 0.00617284 + txt002 + SPHERE CENTER -0.684831 0.027721 0.187336 RAD 0.00617284 + txt002 + SPHERE CENTER -0.721234 -0.0272215 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.720593 -0.0310802 0.191046 RAD 0.00617284 + txt002 + SPHERE CENTER -0.7 -0.0246945 0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.718114 -0.00820099 0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.741827 -0.0336072 0.178701 RAD 0.00617284 + txt002 + SPHERE CENTER -0.739347 -0.010728 0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER -0.742467 -0.0297485 0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER -0.723713 -0.0501007 0.175614 RAD 0.00617284 + txt002 + SPHERE CENTER -0.724354 -0.046242 0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.70312 -0.043715 0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.649684 -0.00804971 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.628657 -0.00328338 0.178701 RAD 0.00617284 + txt002 + SPHERE CENTER -0.630031 0.000378614 0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER -0.642244 0.0152909 0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER -0.648309 -0.0117117 0.191046 RAD 0.00617284 + txt002 + SPHERE CENTER -0.661896 0.00686255 0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.669336 -0.016478 0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.636097 -0.026624 0.175614 RAD 0.00617284 + txt002 + SPHERE CENTER -0.657124 -0.0313903 0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.637471 -0.022962 0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.835815 -0.157543 -0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER -0.899353 -0.119969 -0.117284 RAD 0.0185185 + txt002 + SPHERE CENTER -0.909872 -0.0977075 -0.115431 RAD 0.00617284 + txt002 + SPHERE CENTER -0.891613 -0.104052 -0.100068 RAD 0.00617284 + txt002 + SPHERE CENTER -0.886771 -0.0997803 -0.1239 RAD 0.00617284 + txt002 + SPHERE CENTER -0.917612 -0.113625 -0.132647 RAD 0.00617284 + txt002 + SPHERE CENTER -0.894512 -0.115698 -0.141116 RAD 0.00617284 + txt002 + SPHERE CENTER -0.907093 -0.135886 -0.1345 RAD 0.00617284 + txt002 + SPHERE CENTER -0.922453 -0.117896 -0.108814 RAD 0.00617284 + txt002 + SPHERE CENTER -0.911935 -0.140158 -0.110668 RAD 0.00617284 + txt002 + SPHERE CENTER -0.904194 -0.124241 -0.0934517 RAD 0.00617284 + txt002 + SPHERE CENTER -0.868703 -0.130205 -0.0506299 RAD 0.0185185 + txt002 + SPHERE CENTER -0.867758 -0.11253 -0.0334138 RAD 0.00617284 + txt002 + SPHERE CENTER -0.846864 -0.122142 -0.0423994 RAD 0.00617284 + txt002 + SPHERE CENTER -0.860854 -0.107566 -0.0565949 RAD 0.00617284 + txt002 + SPHERE CENTER -0.889596 -0.120593 -0.0416443 RAD 0.00617284 + txt002 + SPHERE CENTER -0.882692 -0.115629 -0.0648253 RAD 0.00617284 + txt002 + SPHERE CENTER -0.890541 -0.138267 -0.0588603 RAD 0.00617284 + txt002 + SPHERE CENTER -0.875606 -0.135168 -0.0274488 RAD 0.00617284 + txt002 + SPHERE CENTER -0.876551 -0.152843 -0.0446649 RAD 0.00617284 + txt002 + SPHERE CENTER -0.854713 -0.14478 -0.0364345 RAD 0.00617284 + txt002 + SPHERE CENTER -0.836885 -0.0844101 -0.099389 RAD 0.0185185 + txt002 + SPHERE CENTER -0.826973 -0.0627848 -0.106005 RAD 0.00617284 + txt002 + SPHERE CENTER -0.81296 -0.083104 -0.105354 RAD 0.00617284 + txt002 + SPHERE CENTER -0.830202 -0.0805529 -0.122844 RAD 0.00617284 + txt002 + SPHERE CENTER -0.850898 -0.0640908 -0.10004 RAD 0.00617284 + txt002 + SPHERE CENTER -0.854126 -0.0818589 -0.116879 RAD 0.00617284 + txt002 + SPHERE CENTER -0.860809 -0.0857161 -0.093424 RAD 0.00617284 + txt002 + SPHERE CENTER -0.833656 -0.0666419 -0.0825505 RAD 0.00617284 + txt002 + SPHERE CENTER -0.843568 -0.0882673 -0.0759343 RAD 0.00617284 + txt002 + SPHERE CENTER -0.819643 -0.0869612 -0.0818993 RAD 0.00617284 + txt002 + SPHERE CENTER -0.866465 -0.147308 -0.177765 RAD 0.0185185 + txt002 + SPHERE CENTER -0.876203 -0.130609 -0.193128 RAD 0.00617284 + txt002 + SPHERE CENTER -0.879733 -0.128522 -0.16878 RAD 0.00617284 + txt002 + SPHERE CENTER -0.857385 -0.124356 -0.178416 RAD 0.00617284 + txt002 + SPHERE CENTER -0.862935 -0.149395 -0.202114 RAD 0.00617284 + txt002 + SPHERE CENTER -0.844117 -0.143141 -0.187402 RAD 0.00617284 + txt002 + SPHERE CENTER -0.853198 -0.166093 -0.186751 RAD 0.00617284 + txt002 + SPHERE CENTER -0.885283 -0.153561 -0.192477 RAD 0.00617284 + txt002 + SPHERE CENTER -0.875546 -0.170259 -0.177114 RAD 0.00617284 + txt002 + SPHERE CENTER -0.888813 -0.151474 -0.168128 RAD 0.00617284 + txt002 + SPHERE CENTER -0.803997 -0.111748 -0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER -0.798532 -0.108311 -0.183703 RAD 0.00617284 + txt002 + SPHERE CENTER -0.797989 -0.131037 -0.174066 RAD 0.00617284 + txt002 + SPHERE CENTER -0.819589 -0.119537 -0.17736 RAD 0.00617284 + txt002 + SPHERE CENTER -0.80454 -0.0890219 -0.169507 RAD 0.00617284 + txt002 + SPHERE CENTER -0.825597 -0.100248 -0.163165 RAD 0.00617284 + txt002 + SPHERE CENTER -0.810005 -0.0924597 -0.145675 RAD 0.00617284 + txt002 + SPHERE CENTER -0.78294 -0.100522 -0.166213 RAD 0.00617284 + txt002 + SPHERE CENTER -0.788405 -0.10396 -0.142381 RAD 0.00617284 + txt002 + SPHERE CENTER -0.782397 -0.123249 -0.156576 RAD 0.00617284 + txt002 + SPHERE CENTER -0.802927 -0.184881 -0.171592 RAD 0.0185185 + txt002 + SPHERE CENTER -0.785723 -0.180723 -0.188808 RAD 0.00617284 + txt002 + SPHERE CENTER -0.798991 -0.161937 -0.179823 RAD 0.00617284 + txt002 + SPHERE CENTER -0.782104 -0.173028 -0.165627 RAD 0.00617284 + txt002 + SPHERE CENTER -0.78966 -0.203667 -0.180578 RAD 0.00617284 + txt002 + SPHERE CENTER -0.786041 -0.195972 -0.157397 RAD 0.00617284 + txt002 + SPHERE CENTER -0.806864 -0.207825 -0.163362 RAD 0.00617284 + txt002 + SPHERE CENTER -0.806546 -0.192576 -0.194773 RAD 0.00617284 + txt002 + SPHERE CENTER -0.82375 -0.196734 -0.177557 RAD 0.00617284 + txt002 + SPHERE CENTER -0.819813 -0.17379 -0.185788 RAD 0.00617284 + txt002 + SPHERE CENTER -0.898283 -0.193102 -0.129006 RAD 0.0185185 + txt002 + SPHERE CENTER -0.920038 -0.201143 -0.120537 RAD 0.00617284 + txt002 + SPHERE CENTER -0.900209 -0.201384 -0.105825 RAD 0.00617284 + txt002 + SPHERE CENTER -0.910616 -0.17991 -0.112168 RAD 0.00617284 + txt002 + SPHERE CENTER -0.918112 -0.192861 -0.143718 RAD 0.00617284 + txt002 + SPHERE CENTER -0.90869 -0.171628 -0.135349 RAD 0.00617284 + txt002 + SPHERE CENTER -0.896357 -0.18482 -0.152187 RAD 0.00617284 + txt002 + SPHERE CENTER -0.907705 -0.214335 -0.137375 RAD 0.00617284 + txt002 + SPHERE CENTER -0.88595 -0.206294 -0.145845 RAD 0.00617284 + txt002 + SPHERE CENTER -0.887876 -0.214576 -0.122663 RAD 0.00617284 + txt002 + SPHERE CENTER -0.834745 -0.230676 -0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER -0.824206 -0.252002 -0.116217 RAD 0.00617284 + txt002 + SPHERE CENTER -0.810793 -0.231282 -0.116868 RAD 0.00617284 + txt002 + SPHERE CENTER -0.827952 -0.234336 -0.0993785 RAD 0.00617284 + txt002 + SPHERE CENTER -0.848158 -0.251396 -0.122182 RAD 0.00617284 + txt002 + SPHERE CENTER -0.851905 -0.23373 -0.105343 RAD 0.00617284 + txt002 + SPHERE CENTER -0.858698 -0.23007 -0.128798 RAD 0.00617284 + txt002 + SPHERE CENTER -0.830999 -0.248342 -0.139672 RAD 0.00617284 + txt002 + SPHERE CENTER -0.841538 -0.227016 -0.146288 RAD 0.00617284 + txt002 + SPHERE CENTER -0.817586 -0.227621 -0.140323 RAD 0.00617284 + txt002 + SPHERE CENTER -0.867633 -0.203337 -0.062352 RAD 0.0185185 + txt002 + SPHERE CENTER -0.868948 -0.209658 -0.0385197 RAD 0.00617284 + txt002 + SPHERE CENTER -0.84746 -0.202239 -0.0481565 RAD 0.00617284 + txt002 + SPHERE CENTER -0.865773 -0.186008 -0.0448623 RAD 0.00617284 + txt002 + SPHERE CENTER -0.889121 -0.210757 -0.0527151 RAD 0.00617284 + txt002 + SPHERE CENTER -0.885946 -0.187106 -0.0590577 RAD 0.00617284 + txt002 + SPHERE CENTER -0.887806 -0.204436 -0.0765474 RAD 0.00617284 + txt002 + SPHERE CENTER -0.870808 -0.226988 -0.0560094 RAD 0.00617284 + txt002 + SPHERE CENTER -0.869493 -0.220667 -0.0798417 RAD 0.00617284 + txt002 + SPHERE CENTER -0.84932 -0.219569 -0.0656463 RAD 0.00617284 + txt002 + SPHERE CENTER -0.69376 0.0133465 -0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER -0.668775 0.0631985 -0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER -0.661946 0.0667914 -0.183325 RAD 0.00617284 + txt002 + SPHERE CENTER -0.65711 0.0452771 -0.172216 RAD 0.00617284 + txt002 + SPHERE CENTER -0.680354 0.0511945 -0.178077 RAD 0.00617284 + txt002 + SPHERE CENTER -0.673611 0.0847128 -0.170979 RAD 0.00617284 + txt002 + SPHERE CENTER -0.692019 0.069116 -0.165731 RAD 0.00617284 + txt002 + SPHERE CENTER -0.680439 0.08112 -0.147525 RAD 0.00617284 + txt002 + SPHERE CENTER -0.650366 0.0787954 -0.165118 RAD 0.00617284 + txt002 + SPHERE CENTER -0.657195 0.0752026 -0.141664 RAD 0.00617284 + txt002 + SPHERE CENTER -0.64553 0.0572811 -0.154009 RAD 0.00617284 + txt002 + SPHERE CENTER -0.62221 0.0325183 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.604582 0.0446211 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.62221 0.0325183 -0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER -0.627745 0.053173 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.604582 0.0446211 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.627745 0.053173 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.62221 0.0325183 -0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER -0.599047 0.0239663 -0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER -0.616676 0.0118635 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.616676 0.0118635 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.649684 -0.00804971 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.634953 -0.000226782 -0.184873 RAD 0.00617284 + txt002 + SPHERE CENTER -0.655218 0.012605 -0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.635947 0.0122343 -0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.629419 -0.0208815 -0.172528 RAD 0.00617284 + txt002 + SPHERE CENTER -0.630413 -0.00842045 -0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.644149 -0.0287044 -0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER -0.64869 -0.0205108 -0.18796 RAD 0.00617284 + txt002 + SPHERE CENTER -0.66342 -0.0283337 -0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER -0.668955 -0.00767898 -0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.740325 0.0440268 -0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER -0.746894 0.0650768 -0.170979 RAD 0.00617284 + txt002 + SPHERE CENTER -0.739183 0.0653796 -0.147525 RAD 0.00617284 + txt002 + SPHERE CENTER -0.723153 0.0607735 -0.165731 RAD 0.00617284 + txt002 + SPHERE CENTER -0.748035 0.0437239 -0.183325 RAD 0.00617284 + txt002 + SPHERE CENTER -0.724295 0.0394207 -0.178077 RAD 0.00617284 + txt002 + SPHERE CENTER -0.741466 0.0226739 -0.172216 RAD 0.00617284 + txt002 + SPHERE CENTER -0.764065 0.04833 -0.165118 RAD 0.00617284 + txt002 + SPHERE CENTER -0.757496 0.02728 -0.154009 RAD 0.00617284 + txt002 + SPHERE CENTER -0.756355 0.0486329 -0.141664 RAD 0.00617284 + txt002 + SPHERE CENTER -0.721234 -0.0272215 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.732368 -0.0484665 -0.172528 RAD 0.00617284 + txt002 + SPHERE CENTER -0.715699 -0.0478762 -0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER -0.737738 -0.0371781 -0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.737902 -0.0278118 -0.184873 RAD 0.00617284 + txt002 + SPHERE CENTER -0.743272 -0.0165234 -0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.726768 -0.00656677 -0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.715864 -0.0385099 -0.18796 RAD 0.00617284 + txt002 + SPHERE CENTER -0.70473 -0.0172649 -0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.699195 -0.0379196 -0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER -0.76531 -0.0058253 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.786629 -0.00415829 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.76531 -0.0058253 -0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER -0.770845 0.0148294 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.786629 -0.00415829 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.770845 0.0148294 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.76531 -0.0058253 -0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER -0.781094 -0.024813 -0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER -0.759776 -0.02648 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.759776 -0.02648 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.712851 0.0845947 -0.104315 RAD 0.0185185 + txt002 + SPHERE CENTER -0.706291 0.107813 -0.109563 RAD 0.00617284 + txt002 + SPHERE CENTER -0.689001 0.0909853 -0.104315 RAD 0.00617284 + txt002 + SPHERE CENTER -0.701434 0.0896851 -0.125608 RAD 0.00617284 + txt002 + SPHERE CENTER -0.730141 0.101422 -0.109563 RAD 0.00617284 + txt002 + SPHERE CENTER -0.725284 0.0832945 -0.125608 RAD 0.00617284 + txt002 + SPHERE CENTER -0.736701 0.0782041 -0.104315 RAD 0.00617284 + txt002 + SPHERE CENTER -0.717709 0.102723 -0.0882695 RAD 0.00617284 + txt002 + SPHERE CENTER -0.724268 0.0795043 -0.0830215 RAD 0.00617284 + txt002 + SPHERE CENTER -0.700418 0.0858949 -0.0830215 RAD 0.00617284 + txt002 + SPHERE CENTER -0.737837 0.0347427 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.740802 0.0511556 -0.0373488 RAD 0.00617284 + txt002 + SPHERE CENTER -0.718185 0.043171 -0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.730397 0.0580833 -0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER -0.760455 0.0427273 -0.0496945 RAD 0.00617284 + txt002 + SPHERE CENTER -0.750049 0.0496549 -0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.757489 0.0263144 -0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.748242 0.027815 -0.0342624 RAD 0.00617284 + txt002 + SPHERE CENTER -0.745277 0.0114021 -0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER -0.725625 0.0198304 -0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.666287 0.0539145 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.650692 0.0721382 -0.0496945 RAD 0.00617284 + txt002 + SPHERE CENTER -0.645053 0.0564414 -0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.663167 0.072935 -0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.671925 0.0696112 -0.0373488 RAD 0.00617284 + txt002 + SPHERE CENTER -0.6844 0.070408 -0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER -0.68752 0.0513875 -0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.653812 0.0531177 -0.0342624 RAD 0.00617284 + txt002 + SPHERE CENTER -0.669407 0.034894 -0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.648173 0.0374209 -0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER -0.643951 -0.172546 -0.222222 RAD 0.0555556 + txt002 + SPHERE CENTER -0.674191 -0.142305 -0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER -0.672341 -0.123995 -0.299164 RAD 0.00617284 + txt002 + SPHERE CENTER -0.666199 -0.120057 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER -0.651943 -0.134313 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER -0.680334 -0.146243 -0.306292 RAD 0.00617284 + txt002 + SPHERE CENTER -0.659936 -0.156561 -0.296959 RAD 0.00617284 + txt002 + SPHERE CENTER -0.682184 -0.164554 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER -0.69459 -0.131987 -0.292037 RAD 0.00617284 + txt002 + SPHERE CENTER -0.696439 -0.150298 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER -0.688447 -0.12805 -0.268448 RAD 0.00617284 + txt002 + SPHERE CENTER -0.715501 -0.153374 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.731779 -0.136231 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER -0.712305 -0.141449 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.70911 -0.129524 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.734974 -0.148156 -0.236478 RAD 0.00617284 + txt002 + SPHERE CENTER -0.712305 -0.141449 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.718696 -0.165299 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.738169 -0.160081 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER -0.721891 -0.177224 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.718696 -0.165299 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.663122 -0.100996 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.656415 -0.0783272 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER -0.639272 -0.0946054 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.651197 -0.0978007 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.680265 -0.0847178 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER -0.675047 -0.104191 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.686972 -0.107387 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.66834 -0.0815225 -0.207967 RAD 0.00617284 + txt002 + SPHERE CENTER -0.675047 -0.104191 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.651197 -0.0978007 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.602641 -0.161477 -0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER -0.60298 -0.154189 -0.306292 RAD 0.00617284 + txt002 + SPHERE CENTER -0.622115 -0.166695 -0.296959 RAD 0.00617284 + txt002 + SPHERE CENTER -0.617912 -0.143431 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER -0.583506 -0.148971 -0.292037 RAD 0.00617284 + txt002 + SPHERE CENTER -0.598439 -0.138214 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER -0.583168 -0.156259 -0.268448 RAD 0.00617284 + txt002 + SPHERE CENTER -0.587708 -0.172234 -0.299164 RAD 0.00617284 + txt002 + SPHERE CENTER -0.58737 -0.179523 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER -0.606843 -0.184741 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER -0.591572 -0.120168 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.577317 -0.105912 -0.236478 RAD 0.00617284 + txt002 + SPHERE CENTER -0.582843 -0.128897 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.600302 -0.111438 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.586046 -0.0971825 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER -0.609032 -0.102708 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.600302 -0.111438 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.568587 -0.114642 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER -0.582843 -0.128897 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.574113 -0.137627 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.5724 -0.191718 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.549732 -0.185011 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER -0.569205 -0.179793 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.56601 -0.167868 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.552927 -0.196936 -0.207967 RAD 0.00617284 + txt002 + SPHERE CENTER -0.569205 -0.179793 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.575596 -0.203643 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.556122 -0.208861 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER -0.578791 -0.215568 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.575596 -0.203643 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.655019 -0.213855 -0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER -0.653756 -0.23668 -0.292037 RAD 0.00617284 + txt002 + SPHERE CENTER -0.636974 -0.229127 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER -0.660237 -0.233329 -0.268448 RAD 0.00617284 + txt002 + SPHERE CENTER -0.671802 -0.221409 -0.299164 RAD 0.00617284 + txt002 + SPHERE CENTER -0.678283 -0.218058 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER -0.673065 -0.198584 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER -0.648538 -0.217207 -0.306292 RAD 0.00617284 + txt002 + SPHERE CENTER -0.649801 -0.194382 -0.296959 RAD 0.00617284 + txt002 + SPHERE CENTER -0.631756 -0.209653 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER -0.624779 -0.244096 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.607636 -0.260374 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER -0.600929 -0.237705 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.612854 -0.240901 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.631486 -0.266765 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER -0.636704 -0.247291 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.648629 -0.250487 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.619561 -0.26357 -0.236478 RAD 0.00617284 + txt002 + SPHERE CENTER -0.636704 -0.247291 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.612854 -0.240901 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.696329 -0.224924 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.710584 -0.23918 -0.207967 RAD 0.00617284 + txt002 + SPHERE CENTER -0.687599 -0.233654 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.705059 -0.216195 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.719314 -0.23045 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER -0.713788 -0.207465 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.705059 -0.216195 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.701855 -0.24791 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER -0.687599 -0.233654 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.678869 -0.242384 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.786005 -0.343435 8.51251e-17 RAD 0.0555556 + txt002 + SPHERE CENTER -0.82165 -0.392454 0.0425863 RAD 0.0185185 + txt002 + SPHERE CENTER -0.824791 -0.400556 0.065698 RAD 0.00617284 + txt002 + SPHERE CENTER -0.802599 -0.392663 0.058292 RAD 0.00617284 + txt002 + SPHERE CENTER -0.821021 -0.376528 0.0614442 RAD 0.00617284 + txt002 + SPHERE CENTER -0.843843 -0.400347 0.0499923 RAD 0.00617284 + txt002 + SPHERE CENTER -0.840073 -0.376319 0.0457385 RAD 0.00617284 + txt002 + SPHERE CENTER -0.840701 -0.392245 0.0268805 RAD 0.00617284 + txt002 + SPHERE CENTER -0.82542 -0.416482 0.0468401 RAD 0.00617284 + txt002 + SPHERE CENTER -0.822279 -0.40838 0.0237283 RAD 0.00617284 + txt002 + SPHERE CENTER -0.803228 -0.408589 0.0394341 RAD 0.00617284 + txt002 + SPHERE CENTER -0.753118 -0.370774 0.0604812 RAD 0.0185185 + txt002 + SPHERE CENTER -0.734271 -0.367981 0.076187 RAD 0.00617284 + txt002 + SPHERE CENTER -0.731279 -0.362711 0.0522508 RAD 0.00617284 + txt002 + SPHERE CENTER -0.745269 -0.348136 0.0664462 RAD 0.00617284 + txt002 + SPHERE CENTER -0.756109 -0.376044 0.0844174 RAD 0.00617284 + txt002 + SPHERE CENTER -0.767107 -0.356199 0.0746767 RAD 0.00617284 + txt002 + SPHERE CENTER -0.774956 -0.378837 0.0687117 RAD 0.00617284 + txt002 + SPHERE CENTER -0.74212 -0.390619 0.070222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.760966 -0.393412 0.0545162 RAD 0.00617284 + txt002 + SPHERE CENTER -0.739128 -0.385349 0.0462858 RAD 0.00617284 + txt002 + SPHERE CENTER -0.80984 -0.323622 0.0672777 RAD 0.0185185 + txt002 + SPHERE CENTER -0.80634 -0.308073 0.0861356 RAD 0.00617284 + txt002 + SPHERE CENTER -0.786996 -0.316395 0.0732426 RAD 0.00617284 + txt002 + SPHERE CENTER -0.802721 -0.300378 0.0629546 RAD 0.00617284 + txt002 + SPHERE CENTER -0.829184 -0.315299 0.0801706 RAD 0.00617284 + txt002 + SPHERE CENTER -0.825565 -0.307605 0.0569896 RAD 0.00617284 + txt002 + SPHERE CENTER -0.832685 -0.330849 0.0613127 RAD 0.00617284 + txt002 + SPHERE CENTER -0.813459 -0.331317 0.0904587 RAD 0.00617284 + txt002 + SPHERE CENTER -0.81696 -0.346866 0.0716007 RAD 0.00617284 + txt002 + SPHERE CENTER -0.794116 -0.339639 0.0775657 RAD 0.00617284 + txt002 + SPHERE CENTER -0.854538 -0.365116 -0.0178949 RAD 0.0185185 + txt002 + SPHERE CENTER -0.878086 -0.365674 -0.0104889 RAD 0.00617284 + txt002 + SPHERE CENTER -0.859887 -0.367962 0.00604126 RAD 0.00617284 + txt002 + SPHERE CENTER -0.863875 -0.346241 -0.00500196 RAD 0.00617284 + txt002 + SPHERE CENTER -0.872736 -0.362827 -0.0344251 RAD 0.00617284 + txt002 + SPHERE CENTER -0.858526 -0.343394 -0.0289382 RAD 0.00617284 + txt002 + SPHERE CENTER -0.849188 -0.362269 -0.0418311 RAD 0.00617284 + txt002 + SPHERE CENTER -0.868748 -0.384548 -0.0233819 RAD 0.00617284 + txt002 + SPHERE CENTER -0.8452 -0.38399 -0.0307879 RAD 0.00617284 + txt002 + SPHERE CENTER -0.85055 -0.386837 -0.00685171 RAD 0.00617284 + txt002 + SPHERE CENTER -0.842728 -0.296284 0.00679642 RAD 0.0185185 + txt002 + SPHERE CENTER -0.848999 -0.272611 0.00994863 RAD 0.00617284 + txt002 + SPHERE CENTER -0.828835 -0.281616 0.0209919 RAD 0.00617284 + txt002 + SPHERE CENTER -0.829121 -0.278432 -0.00349164 RAD 0.00617284 + txt002 + SPHERE CENTER -0.862893 -0.287278 -0.0042468 RAD 0.00617284 + txt002 + SPHERE CENTER -0.843015 -0.293099 -0.0176871 RAD 0.00617284 + txt002 + SPHERE CENTER -0.856621 -0.310951 -0.00739901 RAD 0.00617284 + txt002 + SPHERE CENTER -0.862606 -0.290462 0.0202367 RAD 0.00617284 + txt002 + SPHERE CENTER -0.856335 -0.314135 0.0170845 RAD 0.00617284 + txt002 + SPHERE CENTER -0.842441 -0.299468 0.0312799 RAD 0.00617284 + txt002 + SPHERE CENTER -0.818893 -0.316097 -0.0604812 RAD 0.0185185 + txt002 + SPHERE CENTER -0.819591 -0.297057 -0.076187 RAD 0.00617284 + txt002 + SPHERE CENTER -0.814956 -0.293153 -0.0522508 RAD 0.00617284 + txt002 + SPHERE CENTER -0.79807 -0.304244 -0.0664462 RAD 0.00617284 + txt002 + SPHERE CENTER -0.823527 -0.320001 -0.0844174 RAD 0.00617284 + txt002 + SPHERE CENTER -0.802007 -0.327188 -0.0746767 RAD 0.00617284 + txt002 + SPHERE CENTER -0.822829 -0.339041 -0.0687117 RAD 0.00617284 + txt002 + SPHERE CENTER -0.840413 -0.30891 -0.070222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.839716 -0.32795 -0.0545162 RAD 0.00617284 + txt002 + SPHERE CENTER -0.835779 -0.305006 -0.0462858 RAD 0.00617284 + txt002 + SPHERE CENTER -0.797815 -0.412267 -0.0246914 RAD 0.0185185 + txt002 + SPHERE CENTER -0.793573 -0.436217 -0.0204376 RAD 0.00617284 + txt002 + SPHERE CENTER -0.776294 -0.419454 -0.0149506 RAD 0.00617284 + txt002 + SPHERE CENTER -0.796968 -0.420728 -0.00151032 RAD 0.00617284 + txt002 + SPHERE CENTER -0.815094 -0.42903 -0.0301783 RAD 0.00617284 + txt002 + SPHERE CENTER -0.818489 -0.413542 -0.0112511 RAD 0.00617284 + txt002 + SPHERE CENTER -0.819335 -0.405081 -0.0344321 RAD 0.00617284 + txt002 + SPHERE CENTER -0.79442 -0.427756 -0.0436186 RAD 0.00617284 + txt002 + SPHERE CENTER -0.798662 -0.403807 -0.0478724 RAD 0.00617284 + txt002 + SPHERE CENTER -0.777141 -0.410993 -0.0381316 RAD 0.00617284 + txt002 + SPHERE CENTER -0.76217 -0.363249 -0.0672777 RAD 0.0185185 + txt002 + SPHERE CENTER -0.747522 -0.356966 -0.0861356 RAD 0.00617284 + txt002 + SPHERE CENTER -0.759239 -0.339469 -0.0732426 RAD 0.00617284 + txt002 + SPHERE CENTER -0.740618 -0.352002 -0.0629546 RAD 0.00617284 + txt002 + SPHERE CENTER -0.750453 -0.380746 -0.0801706 RAD 0.00617284 + txt002 + SPHERE CENTER -0.743549 -0.375782 -0.0569896 RAD 0.00617284 + txt002 + SPHERE CENTER -0.765101 -0.387029 -0.0613127 RAD 0.00617284 + txt002 + SPHERE CENTER -0.769074 -0.368213 -0.0904587 RAD 0.00617284 + txt002 + SPHERE CENTER -0.783722 -0.374496 -0.0716007 RAD 0.00617284 + txt002 + SPHERE CENTER -0.780791 -0.350716 -0.0775657 RAD 0.00617284 + txt002 + SPHERE CENTER -0.729282 -0.390587 -0.00679642 RAD 0.0185185 + txt002 + SPHERE CENTER -0.704862 -0.392427 -0.00994863 RAD 0.00617284 + txt002 + SPHERE CENTER -0.717401 -0.374248 -0.0209919 RAD 0.00617284 + txt002 + SPHERE CENTER -0.714218 -0.373948 0.00349164 RAD 0.00617284 + txt002 + SPHERE CENTER -0.716744 -0.408767 0.0042468 RAD 0.00617284 + txt002 + SPHERE CENTER -0.726099 -0.390287 0.0176871 RAD 0.00617284 + txt002 + SPHERE CENTER -0.741164 -0.406927 0.00739901 RAD 0.00617284 + txt002 + SPHERE CENTER -0.719927 -0.409067 -0.0202367 RAD 0.00617284 + txt002 + SPHERE CENTER -0.744347 -0.407227 -0.0170845 RAD 0.00617284 + txt002 + SPHERE CENTER -0.732465 -0.390887 -0.0312799 RAD 0.00617284 + txt002 + SPHERE CENTER -0.594141 -0.358439 -0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER -0.542042 -0.409774 -0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER -0.517869 -0.413579 -0.126127 RAD 0.00617284 + txt002 + SPHERE CENTER -0.528508 -0.393219 -0.135179 RAD 0.00617284 + txt002 + SPHERE CENTER -0.525596 -0.395831 -0.110799 RAD 0.00617284 + txt002 + SPHERE CENTER -0.531404 -0.430134 -0.113782 RAD 0.00617284 + txt002 + SPHERE CENTER -0.539131 -0.412386 -0.0984536 RAD 0.00617284 + txt002 + SPHERE CENTER -0.555577 -0.426328 -0.110488 RAD 0.00617284 + txt002 + SPHERE CENTER -0.534315 -0.427522 -0.138161 RAD 0.00617284 + txt002 + SPHERE CENTER -0.558488 -0.423716 -0.134867 RAD 0.00617284 + txt002 + SPHERE CENTER -0.544953 -0.407161 -0.147213 RAD 0.00617284 + txt002 + SPHERE CENTER -0.522591 -0.339267 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.504962 -0.327164 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.522591 -0.339267 -0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER -0.528125 -0.318612 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.504962 -0.327164 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.528125 -0.318612 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.522591 -0.339267 -0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER -0.499428 -0.347819 -0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER -0.517056 -0.359921 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.517056 -0.359921 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.550064 -0.379835 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.529037 -0.375068 -0.0435217 RAD 0.00617284 + txt002 + SPHERE CENTER -0.530412 -0.371406 -0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.542624 -0.356494 -0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER -0.548689 -0.383497 -0.031176 RAD 0.00617284 + txt002 + SPHERE CENTER -0.562276 -0.364922 -0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.569716 -0.388263 -0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.536477 -0.398409 -0.0466081 RAD 0.00617284 + txt002 + SPHERE CENTER -0.557504 -0.403175 -0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER -0.537852 -0.394747 -0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.613592 -0.428945 -0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER -0.612625 -0.451897 -0.113782 RAD 0.00617284 + txt002 + SPHERE CENTER -0.593593 -0.436515 -0.110488 RAD 0.00617284 + txt002 + SPHERE CENTER -0.614807 -0.432663 -0.0984536 RAD 0.00617284 + txt002 + SPHERE CENTER -0.632624 -0.444328 -0.126127 RAD 0.00617284 + txt002 + SPHERE CENTER -0.634806 -0.425094 -0.110799 RAD 0.00617284 + txt002 + SPHERE CENTER -0.633591 -0.421376 -0.135179 RAD 0.00617284 + txt002 + SPHERE CENTER -0.61141 -0.448179 -0.138161 RAD 0.00617284 + txt002 + SPHERE CENTER -0.612377 -0.425227 -0.147213 RAD 0.00617284 + txt002 + SPHERE CENTER -0.592379 -0.432797 -0.134867 RAD 0.00617284 + txt002 + SPHERE CENTER -0.621614 -0.399007 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.620974 -0.402865 -0.031176 RAD 0.00617284 + txt002 + SPHERE CENTER -0.600381 -0.39648 -0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.618494 -0.379986 -0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.642207 -0.405392 -0.0435217 RAD 0.00617284 + txt002 + SPHERE CENTER -0.639728 -0.382513 -0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER -0.642848 -0.401533 -0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.624094 -0.421886 -0.0466081 RAD 0.00617284 + txt002 + SPHERE CENTER -0.624734 -0.418027 -0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.603501 -0.4155 -0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER -0.665691 -0.37761 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.687009 -0.375943 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.665691 -0.37761 -0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER -0.671225 -0.356956 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.687009 -0.375943 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.671225 -0.356956 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.665691 -0.37761 -0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER -0.681475 -0.396598 -0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER -0.660156 -0.398265 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.660156 -0.398265 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.586119 -0.388377 -0.178389 RAD 0.0185185 + txt002 + SPHERE CENTER -0.570335 -0.399584 -0.193717 RAD 0.00617284 + txt002 + SPHERE CENTER -0.562269 -0.381987 -0.178389 RAD 0.00617284 + txt002 + SPHERE CENTER -0.569167 -0.403942 -0.169441 RAD 0.00617284 + txt002 + SPHERE CENTER -0.594185 -0.405974 -0.193717 RAD 0.00617284 + txt002 + SPHERE CENTER -0.593017 -0.410332 -0.169441 RAD 0.00617284 + txt002 + SPHERE CENTER -0.609969 -0.394768 -0.178389 RAD 0.00617284 + txt002 + SPHERE CENTER -0.587286 -0.384019 -0.202664 RAD 0.00617284 + txt002 + SPHERE CENTER -0.60307 -0.372813 -0.187336 RAD 0.00617284 + txt002 + SPHERE CENTER -0.57922 -0.366422 -0.187336 RAD 0.00617284 + txt002 + SPHERE CENTER -0.638217 -0.337042 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.64748 -0.317573 -0.178701 RAD 0.00617284 + txt002 + SPHERE CENTER -0.643752 -0.316388 -0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER -0.624481 -0.316758 -0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER -0.641945 -0.338228 -0.191046 RAD 0.00617284 + txt002 + SPHERE CENTER -0.618946 -0.337413 -0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.632683 -0.357697 -0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.661216 -0.337857 -0.175614 RAD 0.00617284 + txt002 + SPHERE CENTER -0.651954 -0.357326 -0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.657489 -0.336672 -0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.566667 -0.317871 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.562847 -0.317033 -0.191046 RAD 0.00617284 + txt002 + SPHERE CENTER -0.561133 -0.338525 -0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.583171 -0.327827 -0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.568381 -0.296378 -0.178701 RAD 0.00617284 + txt002 + SPHERE CENTER -0.588706 -0.307172 -0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER -0.572202 -0.297216 -0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER -0.546343 -0.307077 -0.175614 RAD 0.00617284 + txt002 + SPHERE CENTER -0.550163 -0.307914 -0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.544629 -0.328569 -0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.594141 -0.358439 0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER -0.547576 -0.389119 0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER -0.525642 -0.386849 0.170979 RAD 0.00617284 + txt002 + SPHERE CENTER -0.528407 -0.379645 0.147525 RAD 0.00617284 + txt002 + SPHERE CENTER -0.538964 -0.366733 0.165731 RAD 0.00617284 + txt002 + SPHERE CENTER -0.544812 -0.396323 0.183325 RAD 0.00617284 + txt002 + SPHERE CENTER -0.558134 -0.376207 0.178077 RAD 0.00617284 + txt002 + SPHERE CENTER -0.566746 -0.398593 0.172216 RAD 0.00617284 + txt002 + SPHERE CENTER -0.534255 -0.409235 0.165118 RAD 0.00617284 + txt002 + SPHERE CENTER -0.556189 -0.411505 0.154009 RAD 0.00617284 + txt002 + SPHERE CENTER -0.537019 -0.402031 0.141664 RAD 0.00617284 + txt002 + SPHERE CENTER -0.522591 -0.339267 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.504962 -0.327164 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.522591 -0.339267 0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER -0.528125 -0.318612 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.504962 -0.327164 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.528125 -0.318612 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.522591 -0.339267 0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER -0.499428 -0.347819 0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER -0.517056 -0.359921 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.517056 -0.359921 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.566667 -0.317871 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.551072 -0.299647 0.172528 RAD 0.00617284 + txt002 + SPHERE CENTER -0.545434 -0.315344 0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER -0.563547 -0.29885 0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.572306 -0.302174 0.184873 RAD 0.00617284 + txt002 + SPHERE CENTER -0.584781 -0.301377 0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.587901 -0.320398 0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.554192 -0.318667 0.18796 RAD 0.00617284 + txt002 + SPHERE CENTER -0.569787 -0.336891 0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.548554 -0.334364 0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER -0.619127 -0.408291 0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER -0.617918 -0.415912 0.183325 RAD 0.00617284 + txt002 + SPHERE CENTER -0.597788 -0.406911 0.172216 RAD 0.00617284 + txt002 + SPHERE CENTER -0.616439 -0.39183 0.178077 RAD 0.00617284 + txt002 + SPHERE CENTER -0.639257 -0.417292 0.170979 RAD 0.00617284 + txt002 + SPHERE CENTER -0.637778 -0.39321 0.165731 RAD 0.00617284 + txt002 + SPHERE CENTER -0.640465 -0.409671 0.147525 RAD 0.00617284 + txt002 + SPHERE CENTER -0.620605 -0.432372 0.165118 RAD 0.00617284 + txt002 + SPHERE CENTER -0.621814 -0.424751 0.141664 RAD 0.00617284 + txt002 + SPHERE CENTER -0.600475 -0.423371 0.154009 RAD 0.00617284 + txt002 + SPHERE CENTER -0.638217 -0.337042 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.641183 -0.320629 0.184873 RAD 0.00617284 + txt002 + SPHERE CENTER -0.618565 -0.328614 0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.630777 -0.313702 0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.660835 -0.329058 0.172528 RAD 0.00617284 + txt002 + SPHERE CENTER -0.65043 -0.32213 0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.65787 -0.345471 0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER -0.648623 -0.34397 0.18796 RAD 0.00617284 + txt002 + SPHERE CENTER -0.645657 -0.360383 0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER -0.626005 -0.351955 0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.665691 -0.37761 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.687009 -0.375943 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.665691 -0.37761 0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER -0.671225 -0.356956 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.687009 -0.375943 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.671225 -0.356956 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.665691 -0.37761 0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER -0.681475 -0.396598 0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER -0.660156 -0.398265 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.660156 -0.398265 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.57505 -0.429687 0.104315 RAD 0.0185185 + txt002 + SPHERE CENTER -0.55776 -0.446515 0.109563 RAD 0.00617284 + txt002 + SPHERE CENTER -0.5512 -0.423296 0.104315 RAD 0.00617284 + txt002 + SPHERE CENTER -0.562617 -0.428387 0.125608 RAD 0.00617284 + txt002 + SPHERE CENTER -0.58161 -0.452905 0.109563 RAD 0.00617284 + txt002 + SPHERE CENTER -0.586467 -0.434777 0.125608 RAD 0.00617284 + txt002 + SPHERE CENTER -0.5989 -0.436077 0.104315 RAD 0.00617284 + txt002 + SPHERE CENTER -0.570193 -0.447815 0.0882695 RAD 0.00617284 + txt002 + SPHERE CENTER -0.587483 -0.430987 0.0830215 RAD 0.00617284 + txt002 + SPHERE CENTER -0.563633 -0.424596 0.0830215 RAD 0.00617284 + txt002 + SPHERE CENTER -0.621614 -0.399007 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.632748 -0.420252 0.0496945 RAD 0.00617284 + txt002 + SPHERE CENTER -0.61608 -0.419661 0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.638118 -0.408963 0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.638282 -0.399597 0.0373488 RAD 0.00617284 + txt002 + SPHERE CENTER -0.643653 -0.388308 0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER -0.627149 -0.378352 0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.616244 -0.410295 0.0342624 RAD 0.00617284 + txt002 + SPHERE CENTER -0.60511 -0.38905 0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.599576 -0.409705 0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER -0.550064 -0.379835 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.535334 -0.372012 0.0373488 RAD 0.00617284 + txt002 + SPHERE CENTER -0.555599 -0.35918 0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.536327 -0.359551 0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER -0.529799 -0.392667 0.0496945 RAD 0.00617284 + txt002 + SPHERE CENTER -0.530793 -0.380205 0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.54453 -0.400489 0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.549071 -0.392296 0.0342624 RAD 0.00617284 + txt002 + SPHERE CENTER -0.563801 -0.400119 0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER -0.569335 -0.379464 0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0996195 -0.371785 0.544331 RAD 0.166667 + txt002 + SPHERE CENTER 0.220501 -0.393621 0.729516 RAD 0.0555556 + txt002 + SPHERE CENTER 0.279642 -0.368601 0.766439 RAD 0.0185185 + txt002 + SPHERE CENTER 0.299716 -0.354293 0.765035 RAD 0.00617284 + txt002 + SPHERE CENTER 0.292196 -0.366989 0.745238 RAD 0.00617284 + txt002 + SPHERE CENTER 0.279022 -0.347717 0.753281 RAD 0.00617284 + txt002 + SPHERE CENTER 0.287162 -0.355904 0.786236 RAD 0.00617284 + txt002 + SPHERE CENTER 0.266468 -0.349329 0.774481 RAD 0.00617284 + txt002 + SPHERE CENTER 0.267088 -0.370213 0.787639 RAD 0.00617284 + txt002 + SPHERE CENTER 0.300337 -0.375177 0.778193 RAD 0.00617284 + txt002 + SPHERE CENTER 0.280263 -0.389485 0.779597 RAD 0.00617284 + txt002 + SPHERE CENTER 0.292817 -0.387873 0.758396 RAD 0.00617284 + txt002 + SPHERE CENTER 0.281062 -0.372464 0.692479 RAD 0.0185185 + txt002 + SPHERE CENTER 0.289441 -0.362978 0.671279 RAD 0.00617284 + txt002 + SPHERE CENTER 0.270044 -0.378255 0.671155 RAD 0.00617284 + txt002 + SPHERE CENTER 0.267771 -0.35549 0.680442 RAD 0.00617284 + txt002 + SPHERE CENTER 0.30046 -0.357187 0.692603 RAD 0.00617284 + txt002 + SPHERE CENTER 0.278789 -0.349699 0.701767 RAD 0.00617284 + txt002 + SPHERE CENTER 0.29208 -0.366673 0.713804 RAD 0.00617284 + txt002 + SPHERE CENTER 0.302733 -0.379952 0.683315 RAD 0.00617284 + txt002 + SPHERE CENTER 0.294353 -0.389438 0.704516 RAD 0.00617284 + txt002 + SPHERE CENTER 0.283335 -0.395229 0.683192 RAD 0.00617284 + txt002 + SPHERE CENTER 0.238665 -0.321889 0.726118 RAD 0.0185185 + txt002 + SPHERE CENTER 0.250544 -0.304702 0.71296 RAD 0.00617284 + txt002 + SPHERE CENTER 0.259421 -0.327715 0.714081 RAD 0.00617284 + txt002 + SPHERE CENTER 0.238717 -0.32307 0.701455 RAD 0.00617284 + txt002 + SPHERE CENTER 0.229788 -0.298875 0.724997 RAD 0.00617284 + txt002 + SPHERE CENTER 0.21796 -0.317244 0.713492 RAD 0.00617284 + txt002 + SPHERE CENTER 0.217908 -0.316063 0.738155 RAD 0.00617284 + txt002 + SPHERE CENTER 0.250492 -0.30352 0.737623 RAD 0.00617284 + txt002 + SPHERE CENTER 0.238612 -0.320707 0.750781 RAD 0.00617284 + txt002 + SPHERE CENTER 0.259369 -0.326533 0.738744 RAD 0.00617284 + txt002 + SPHERE CENTER 0.219082 -0.389758 0.803476 RAD 0.0185185 + txt002 + SPHERE CENTER 0.228779 -0.378635 0.823273 RAD 0.00617284 + txt002 + SPHERE CENTER 0.24293 -0.383364 0.8036 RAD 0.00617284 + txt002 + SPHERE CENTER 0.225483 -0.365937 0.802355 RAD 0.00617284 + txt002 + SPHERE CENTER 0.20493 -0.385029 0.823149 RAD 0.00617284 + txt002 + SPHERE CENTER 0.201634 -0.372331 0.802231 RAD 0.00617284 + txt002 + SPHERE CENTER 0.195233 -0.396152 0.803352 RAD 0.00617284 + txt002 + SPHERE CENTER 0.222377 -0.402455 0.824394 RAD 0.00617284 + txt002 + SPHERE CENTER 0.21268 -0.413578 0.804597 RAD 0.00617284 + txt002 + SPHERE CENTER 0.236529 -0.407185 0.804721 RAD 0.00617284 + txt002 + SPHERE CENTER 0.178104 -0.343046 0.763155 RAD 0.0185185 + txt002 + SPHERE CENTER 0.177083 -0.319723 0.771198 RAD 0.00617284 + txt002 + SPHERE CENTER 0.198298 -0.332294 0.772443 RAD 0.00617284 + txt002 + SPHERE CENTER 0.189464 -0.325124 0.750529 RAD 0.00617284 + txt002 + SPHERE CENTER 0.156889 -0.330475 0.76191 RAD 0.00617284 + txt002 + SPHERE CENTER 0.16927 -0.335876 0.741241 RAD 0.00617284 + txt002 + SPHERE CENTER 0.157909 -0.353797 0.753867 RAD 0.00617284 + txt002 + SPHERE CENTER 0.165722 -0.337645 0.783824 RAD 0.00617284 + txt002 + SPHERE CENTER 0.166743 -0.360967 0.775781 RAD 0.00617284 + txt002 + SPHERE CENTER 0.186938 -0.350216 0.785069 RAD 0.00617284 + txt002 + SPHERE CENTER 0.15994 -0.414778 0.766553 RAD 0.0185185 + txt002 + SPHERE CENTER 0.147477 -0.412573 0.787754 RAD 0.00617284 + txt002 + SPHERE CENTER 0.172167 -0.412448 0.787878 RAD 0.00617284 + txt002 + SPHERE CENTER 0.15977 -0.39322 0.77859 RAD 0.00617284 + txt002 + SPHERE CENTER 0.13525 -0.414903 0.766429 RAD 0.00617284 + txt002 + SPHERE CENTER 0.147543 -0.39555 0.757266 RAD 0.00617284 + txt002 + SPHERE CENTER 0.147713 -0.417108 0.745229 RAD 0.00617284 + txt002 + SPHERE CENTER 0.147647 -0.434131 0.775717 RAD 0.00617284 + txt002 + SPHERE CENTER 0.16011 -0.436336 0.754517 RAD 0.00617284 + txt002 + SPHERE CENTER 0.172338 -0.434006 0.775841 RAD 0.00617284 + txt002 + SPHERE CENTER 0.261479 -0.440333 0.769837 RAD 0.0185185 + txt002 + SPHERE CENTER 0.282991 -0.443285 0.781591 RAD 0.00617284 + txt002 + SPHERE CENTER 0.282046 -0.4302 0.760673 RAD 0.00617284 + txt002 + SPHERE CENTER 0.271991 -0.421181 0.781342 RAD 0.00617284 + txt002 + SPHERE CENTER 0.262424 -0.453417 0.790755 RAD 0.00617284 + txt002 + SPHERE CENTER 0.251423 -0.431313 0.790506 RAD 0.00617284 + txt002 + SPHERE CENTER 0.240911 -0.450466 0.779001 RAD 0.00617284 + txt002 + SPHERE CENTER 0.27248 -0.462437 0.770086 RAD 0.00617284 + txt002 + SPHERE CENTER 0.250967 -0.459485 0.758332 RAD 0.00617284 + txt002 + SPHERE CENTER 0.271534 -0.449353 0.749168 RAD 0.00617284 + txt002 + SPHERE CENTER 0.202338 -0.465353 0.732914 RAD 0.0185185 + txt002 + SPHERE CENTER 0.204606 -0.486123 0.746073 RAD 0.00617284 + txt002 + SPHERE CENTER 0.223366 -0.470107 0.744951 RAD 0.00617284 + txt002 + SPHERE CENTER 0.202946 -0.464339 0.757577 RAD 0.00617284 + txt002 + SPHERE CENTER 0.183578 -0.481368 0.734036 RAD 0.00617284 + txt002 + SPHERE CENTER 0.181918 -0.459584 0.745541 RAD 0.00617284 + txt002 + SPHERE CENTER 0.18131 -0.460599 0.720878 RAD 0.00617284 + txt002 + SPHERE CENTER 0.203998 -0.487137 0.72141 RAD 0.00617284 + txt002 + SPHERE CENTER 0.201729 -0.466367 0.708251 RAD 0.00617284 + txt002 + SPHERE CENTER 0.222757 -0.471122 0.720288 RAD 0.00617284 + txt002 + SPHERE CENTER 0.262898 -0.444196 0.695877 RAD 0.0185185 + txt002 + SPHERE CENTER 0.285685 -0.449273 0.687835 RAD 0.00617284 + txt002 + SPHERE CENTER 0.27701 -0.426189 0.68659 RAD 0.00617284 + txt002 + SPHERE CENTER 0.282528 -0.436139 0.708504 RAD 0.00617284 + txt002 + SPHERE CENTER 0.271573 -0.46728 0.697123 RAD 0.00617284 + txt002 + SPHERE CENTER 0.268416 -0.454146 0.717791 RAD 0.00617284 + txt002 + SPHERE CENTER 0.248787 -0.462204 0.705165 RAD 0.00617284 + txt002 + SPHERE CENTER 0.266055 -0.45733 0.675209 RAD 0.00617284 + txt002 + SPHERE CENTER 0.243269 -0.452254 0.683251 RAD 0.00617284 + txt002 + SPHERE CENTER 0.257381 -0.434246 0.673964 RAD 0.00617284 + txt002 + SPHERE CENTER 0.31427 -0.31427 0.544331 RAD 0.0555556 + txt002 + SPHERE CENTER 0.367156 -0.277961 0.507294 RAD 0.0185185 + txt002 + SPHERE CENTER 0.374298 -0.269898 0.485076 RAD 0.00617284 + txt002 + SPHERE CENTER 0.362218 -0.291334 0.487134 RAD 0.00617284 + txt002 + SPHERE CENTER 0.350338 -0.270045 0.491041 RAD 0.00617284 + txt002 + SPHERE CENTER 0.379235 -0.256525 0.505236 RAD 0.00617284 + txt002 + SPHERE CENTER 0.355276 -0.256671 0.511201 RAD 0.00617284 + txt002 + SPHERE CENTER 0.372093 -0.264588 0.527454 RAD 0.00617284 + txt002 + SPHERE CENTER 0.391115 -0.277815 0.501329 RAD 0.00617284 + txt002 + SPHERE CENTER 0.383973 -0.285878 0.523547 RAD 0.00617284 + txt002 + SPHERE CENTER 0.379036 -0.299251 0.503387 RAD 0.00617284 + txt002 + SPHERE CENTER 0.31427 -0.31427 0.470257 RAD 0.0185185 + txt002 + SPHERE CENTER 0.304189 -0.304189 0.450097 RAD 0.00617284 + txt002 + SPHERE CENTER 0.29042 -0.307879 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER 0.307879 -0.29042 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER 0.328039 -0.31058 0.450097 RAD 0.00617284 + txt002 + SPHERE CENTER 0.331729 -0.29681 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER 0.33812 -0.32066 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER 0.31058 -0.328039 0.450097 RAD 0.00617284 + txt002 + SPHERE CENTER 0.32066 -0.33812 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER 0.29681 -0.331729 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER 0.297666 -0.252306 0.507294 RAD 0.0185185 + txt002 + SPHERE CENTER 0.305995 -0.235688 0.491041 RAD 0.00617284 + txt002 + SPHERE CENTER 0.321516 -0.245915 0.507294 RAD 0.00617284 + txt002 + SPHERE CENTER 0.312359 -0.259438 0.488775 RAD 0.00617284 + txt002 + SPHERE CENTER 0.282145 -0.242079 0.491041 RAD 0.00617284 + txt002 + SPHERE CENTER 0.288509 -0.265828 0.488775 RAD 0.00617284 + txt002 + SPHERE CENTER 0.273816 -0.258696 0.507294 RAD 0.00617284 + txt002 + SPHERE CENTER 0.291303 -0.228556 0.509559 RAD 0.00617284 + txt002 + SPHERE CENTER 0.282974 -0.245173 0.525813 RAD 0.00617284 + txt002 + SPHERE CENTER 0.306824 -0.238783 0.525813 RAD 0.00617284 + txt002 + SPHERE CENTER 0.367156 -0.277961 0.581368 RAD 0.0185185 + txt002 + SPHERE CENTER 0.385852 -0.261966 0.57931 RAD 0.00617284 + txt002 + SPHERE CENTER 0.38141 -0.278159 0.561208 RAD 0.00617284 + txt002 + SPHERE CENTER 0.36581 -0.259422 0.565115 RAD 0.00617284 + txt002 + SPHERE CENTER 0.371598 -0.261768 0.599471 RAD 0.00617284 + txt002 + SPHERE CENTER 0.351556 -0.259225 0.585275 RAD 0.00617284 + txt002 + SPHERE CENTER 0.352901 -0.277764 0.601529 RAD 0.00617284 + txt002 + SPHERE CENTER 0.387198 -0.280504 0.595564 RAD 0.00617284 + txt002 + SPHERE CENTER 0.368501 -0.2965 0.597621 RAD 0.00617284 + txt002 + SPHERE CENTER 0.382755 -0.296698 0.577461 RAD 0.00617284 + txt002 + SPHERE CENTER 0.297666 -0.252306 0.581368 RAD 0.0185185 + txt002 + SPHERE CENTER 0.30415 -0.228803 0.585275 RAD 0.00617284 + txt002 + SPHERE CENTER 0.321516 -0.245915 0.581368 RAD 0.00617284 + txt002 + SPHERE CENTER 0.306824 -0.238783 0.56285 RAD 0.00617284 + txt002 + SPHERE CENTER 0.2803 -0.235194 0.585275 RAD 0.00617284 + txt002 + SPHERE CENTER 0.282974 -0.245173 0.56285 RAD 0.00617284 + txt002 + SPHERE CENTER 0.273816 -0.258696 0.581368 RAD 0.00617284 + txt002 + SPHERE CENTER 0.294992 -0.242326 0.603794 RAD 0.00617284 + txt002 + SPHERE CENTER 0.288509 -0.265828 0.599887 RAD 0.00617284 + txt002 + SPHERE CENTER 0.312359 -0.259438 0.599887 RAD 0.00617284 + txt002 + SPHERE CENTER 0.31427 -0.31427 0.618405 RAD 0.0185185 + txt002 + SPHERE CENTER 0.32435 -0.304189 0.638566 RAD 0.00617284 + txt002 + SPHERE CENTER 0.33812 -0.307879 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER 0.32066 -0.29042 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER 0.3005 -0.31058 0.638566 RAD 0.00617284 + txt002 + SPHERE CENTER 0.29681 -0.29681 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER 0.29042 -0.32066 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER 0.317959 -0.328039 0.638566 RAD 0.00617284 + txt002 + SPHERE CENTER 0.307879 -0.33812 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER 0.331729 -0.331729 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER 0.383759 -0.339925 0.544331 RAD 0.0185185 + txt002 + SPHERE CENTER 0.407156 -0.334762 0.538366 RAD 0.00617284 + txt002 + SPHERE CENTER 0.388696 -0.326552 0.524171 RAD 0.00617284 + txt002 + SPHERE CENTER 0.392275 -0.31686 0.546597 RAD 0.00617284 + txt002 + SPHERE CENTER 0.402218 -0.348135 0.558526 RAD 0.00617284 + txt002 + SPHERE CENTER 0.387337 -0.330233 0.566757 RAD 0.00617284 + txt002 + SPHERE CENTER 0.378821 -0.353299 0.564491 RAD 0.00617284 + txt002 + SPHERE CENTER 0.39864 -0.357827 0.536101 RAD 0.00617284 + txt002 + SPHERE CENTER 0.375243 -0.362991 0.542066 RAD 0.00617284 + txt002 + SPHERE CENTER 0.380181 -0.349618 0.521905 RAD 0.00617284 + txt002 + SPHERE CENTER 0.330873 -0.376234 0.581368 RAD 0.0185185 + txt002 + SPHERE CENTER 0.346394 -0.386461 0.597621 RAD 0.00617284 + txt002 + SPHERE CENTER 0.354723 -0.369843 0.581368 RAD 0.00617284 + txt002 + SPHERE CENTER 0.340031 -0.362711 0.599887 RAD 0.00617284 + txt002 + SPHERE CENTER 0.322544 -0.392851 0.597621 RAD 0.00617284 + txt002 + SPHERE CENTER 0.316181 -0.369102 0.599887 RAD 0.00617284 + txt002 + SPHERE CENTER 0.307023 -0.382624 0.581368 RAD 0.00617284 + txt002 + SPHERE CENTER 0.337237 -0.399983 0.579103 RAD 0.00617284 + txt002 + SPHERE CENTER 0.321715 -0.389757 0.56285 RAD 0.00617284 + txt002 + SPHERE CENTER 0.345565 -0.383366 0.56285 RAD 0.00617284 + txt002 + SPHERE CENTER 0.330873 -0.376234 0.507294 RAD 0.0185185 + txt002 + SPHERE CENTER 0.348239 -0.393346 0.503387 RAD 0.00617284 + txt002 + SPHERE CENTER 0.354723 -0.369843 0.507294 RAD 0.00617284 + txt002 + SPHERE CENTER 0.345565 -0.383366 0.525813 RAD 0.00617284 + txt002 + SPHERE CENTER 0.324389 -0.399736 0.503387 RAD 0.00617284 + txt002 + SPHERE CENTER 0.321715 -0.389757 0.525813 RAD 0.00617284 + txt002 + SPHERE CENTER 0.307023 -0.382624 0.507294 RAD 0.00617284 + txt002 + SPHERE CENTER 0.333547 -0.386213 0.484868 RAD 0.00617284 + txt002 + SPHERE CENTER 0.316181 -0.369102 0.488775 RAD 0.00617284 + txt002 + SPHERE CENTER 0.340031 -0.362711 0.488775 RAD 0.00617284 + txt002 + SPHERE CENTER 0.166275 -0.191247 0.655442 RAD 0.0555556 + txt002 + SPHERE CENTER 0.20793 -0.130089 0.652044 RAD 0.0185185 + txt002 + SPHERE CENTER 0.221102 -0.115471 0.637128 RAD 0.00617284 + txt002 + SPHERE CENTER 0.220766 -0.13987 0.633356 RAD 0.00617284 + txt002 + SPHERE CENTER 0.200597 -0.126388 0.628759 RAD 0.00617284 + txt002 + SPHERE CENTER 0.208266 -0.10569 0.655816 RAD 0.00617284 + txt002 + SPHERE CENTER 0.187762 -0.116607 0.647447 RAD 0.00617284 + txt002 + SPHERE CENTER 0.195095 -0.120308 0.670732 RAD 0.00617284 + txt002 + SPHERE CENTER 0.228435 -0.119172 0.660413 RAD 0.00617284 + txt002 + SPHERE CENTER 0.215264 -0.13379 0.675329 RAD 0.00617284 + txt002 + SPHERE CENTER 0.228099 -0.143571 0.656641 RAD 0.00617284 + txt002 + SPHERE CENTER 0.230419 -0.192135 0.618405 RAD 0.0185185 + txt002 + SPHERE CENTER 0.243049 -0.18209 0.599717 RAD 0.00617284 + txt002 + SPHERE CENTER 0.218634 -0.185251 0.597829 RAD 0.00617284 + txt002 + SPHERE CENTER 0.227721 -0.168159 0.613157 RAD 0.00617284 + txt002 + SPHERE CENTER 0.254834 -0.188974 0.620293 RAD 0.00617284 + txt002 + SPHERE CENTER 0.239506 -0.175043 0.633733 RAD 0.00617284 + txt002 + SPHERE CENTER 0.242204 -0.199019 0.638981 RAD 0.00617284 + txt002 + SPHERE CENTER 0.245747 -0.206066 0.604965 RAD 0.00617284 + txt002 + SPHERE CENTER 0.233117 -0.216111 0.623653 RAD 0.00617284 + txt002 + SPHERE CENTER 0.221332 -0.209227 0.603077 RAD 0.00617284 + txt002 + SPHERE CENTER 0.172673 -0.154295 0.591563 RAD 0.0185185 + txt002 + SPHERE CENTER 0.180792 -0.15554 0.568278 RAD 0.00617284 + txt002 + SPHERE CENTER 0.19323 -0.166926 0.586315 RAD 0.00617284 + txt002 + SPHERE CENTER 0.171251 -0.17557 0.579113 RAD 0.00617284 + txt002 + SPHERE CENTER 0.160236 -0.142909 0.573526 RAD 0.00617284 + txt002 + SPHERE CENTER 0.150694 -0.162939 0.584361 RAD 0.00617284 + txt002 + SPHERE CENTER 0.152117 -0.141663 0.596811 RAD 0.00617284 + txt002 + SPHERE CENTER 0.182215 -0.134265 0.580727 RAD 0.00617284 + txt002 + SPHERE CENTER 0.174096 -0.133019 0.604012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.194652 -0.145651 0.598764 RAD 0.00617284 + txt002 + SPHERE CENTER 0.143787 -0.129201 0.689081 RAD 0.0185185 + txt002 + SPHERE CENTER 0.14887 -0.105335 0.692853 RAD 0.00617284 + txt002 + SPHERE CENTER 0.167242 -0.121723 0.690969 RAD 0.00617284 + txt002 + SPHERE CENTER 0.153943 -0.115741 0.671044 RAD 0.00617284 + txt002 + SPHERE CENTER 0.125414 -0.112813 0.690965 RAD 0.00617284 + txt002 + SPHERE CENTER 0.130487 -0.123219 0.669156 RAD 0.00617284 + txt002 + SPHERE CENTER 0.120331 -0.136679 0.687193 RAD 0.00617284 + txt002 + SPHERE CENTER 0.138714 -0.118795 0.71089 RAD 0.00617284 + txt002 + SPHERE CENTER 0.13363 -0.142661 0.707118 RAD 0.00617284 + txt002 + SPHERE CENTER 0.157086 -0.135183 0.709006 RAD 0.00617284 + txt002 + SPHERE CENTER 0.108529 -0.153407 0.6286 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0995811 -0.130858 0.624003 RAD 0.00617284 + txt002 + SPHERE CENTER 0.113639 -0.134736 0.643928 RAD 0.00617284 + txt002 + SPHERE CENTER 0.123725 -0.135326 0.621398 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0944715 -0.149528 0.608675 RAD 0.00617284 + txt002 + SPHERE CENTER 0.118615 -0.153997 0.60607 RAD 0.00617284 + txt002 + SPHERE CENTER 0.10342 -0.172078 0.613272 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0843858 -0.148938 0.631205 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0933338 -0.171487 0.635801 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0984435 -0.152816 0.65113 RAD 0.00617284 + txt002 + SPHERE CENTER 0.102131 -0.190359 0.692479 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0897843 -0.179968 0.711167 RAD 0.00617284 + txt002 + SPHERE CENTER 0.114103 -0.183804 0.713055 RAD 0.00617284 + txt002 + SPHERE CENTER 0.105492 -0.166467 0.697727 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0778128 -0.186523 0.690591 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0935207 -0.173022 0.677151 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0901597 -0.196914 0.671903 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0864233 -0.20386 0.705919 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0987702 -0.214251 0.687231 RAD 0.00617284 + txt002 + SPHERE CENTER 0.110742 -0.207696 0.707807 RAD 0.00617284 + txt002 + SPHERE CENTER 0.201532 -0.167041 0.715923 RAD 0.0185185 + txt002 + SPHERE CENTER 0.219088 -0.151829 0.724292 RAD 0.00617284 + txt002 + SPHERE CENTER 0.221861 -0.163068 0.702483 RAD 0.00617284 + txt002 + SPHERE CENTER 0.205084 -0.14514 0.705088 RAD 0.00617284 + txt002 + SPHERE CENTER 0.19876 -0.155801 0.737733 RAD 0.00617284 + txt002 + SPHERE CENTER 0.184756 -0.149113 0.718528 RAD 0.00617284 + txt002 + SPHERE CENTER 0.181204 -0.171014 0.729364 RAD 0.00617284 + txt002 + SPHERE CENTER 0.215537 -0.173729 0.735128 RAD 0.00617284 + txt002 + SPHERE CENTER 0.197981 -0.188942 0.726759 RAD 0.00617284 + txt002 + SPHERE CENTER 0.218309 -0.184969 0.713318 RAD 0.00617284 + txt002 + SPHERE CENTER 0.159877 -0.228199 0.719322 RAD 0.0185185 + txt002 + SPHERE CENTER 0.167942 -0.229756 0.742607 RAD 0.00617284 + txt002 + SPHERE CENTER 0.183484 -0.223214 0.72457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.16569 -0.207683 0.731771 RAD 0.00617284 + txt002 + SPHERE CENTER 0.144336 -0.234741 0.737359 RAD 0.00617284 + txt002 + SPHERE CENTER 0.142084 -0.212668 0.726523 RAD 0.00617284 + txt002 + SPHERE CENTER 0.13627 -0.233184 0.714074 RAD 0.00617284 + txt002 + SPHERE CENTER 0.162129 -0.250271 0.730157 RAD 0.00617284 + txt002 + SPHERE CENTER 0.154064 -0.248714 0.706872 RAD 0.00617284 + txt002 + SPHERE CENTER 0.177671 -0.243729 0.71212 RAD 0.00617284 + txt002 + SPHERE CENTER 0.224021 -0.229087 0.682285 RAD 0.0185185 + txt002 + SPHERE CENTER 0.248268 -0.22829 0.686881 RAD 0.00617284 + txt002 + SPHERE CENTER 0.2391 -0.216949 0.666956 RAD 0.00617284 + txt002 + SPHERE CENTER 0.234532 -0.207937 0.689486 RAD 0.00617284 + txt002 + SPHERE CENTER 0.233189 -0.240428 0.702209 RAD 0.00617284 + txt002 + SPHERE CENTER 0.219453 -0.220075 0.704814 RAD 0.00617284 + txt002 + SPHERE CENTER 0.208942 -0.241225 0.697613 RAD 0.00617284 + txt002 + SPHERE CENTER 0.237756 -0.249439 0.67968 RAD 0.00617284 + txt002 + SPHERE CENTER 0.213509 -0.250236 0.675083 RAD 0.00617284 + txt002 + SPHERE CENTER 0.228589 -0.238098 0.659755 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0058509 -0.451136 0.729516 RAD 0.0555556 + txt002 + SPHERE CENTER 0.0051487 -0.447081 0.803476 RAD 0.0185185 + txt002 + SPHERE CENTER 0.01504 -0.435909 0.823149 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0289993 -0.440694 0.803352 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0115452 -0.423265 0.802231 RAD 0.00617284 + txt002 + SPHERE CENTER -0.00881065 -0.442297 0.823273 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0123054 -0.429652 0.802355 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0187019 -0.453468 0.8036 RAD 0.00617284 + txt002 + SPHERE CENTER 0.00864346 -0.459725 0.824394 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0012478 -0.470897 0.804721 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0226028 -0.46451 0.804597 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0688765 -0.439178 0.766553 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0903221 -0.426942 0.766429 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0806307 -0.435083 0.745229 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0699989 -0.416328 0.757266 RAD 0.00617284 + txt002 + SPHERE CENTER 0.078568 -0.431037 0.787754 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0582447 -0.420423 0.77859 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0571224 -0.443274 0.787878 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0891998 -0.449792 0.775717 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0677542 -0.462029 0.775841 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0795084 -0.457933 0.754517 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0172804 -0.386138 0.763155 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0293677 -0.364644 0.76191 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0401449 -0.385352 0.753867 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0213457 -0.375512 0.741241 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0065032 -0.36543 0.771198 RAD 0.00617284 + txt002 + SPHERE CENTER -0.00151881 -0.376298 0.750529 RAD 0.00617284 + txt002 + SPHERE CENTER -0.00558411 -0.386924 0.772443 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0253024 -0.37527 0.783824 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0132151 -0.396764 0.785069 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0360796 -0.395978 0.775781 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0578769 -0.459039 0.766439 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0707378 -0.451803 0.786236 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0461991 -0.454158 0.787639 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0561039 -0.435761 0.774481 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0824157 -0.456685 0.765035 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0677817 -0.440643 0.753281 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0695548 -0.46392 0.745238 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0725109 -0.475081 0.778193 RAD 0.00617284 + txt002 + SPHERE CENTER -0.05965 -0.482316 0.758396 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0479721 -0.477435 0.779597 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0457452 -0.398096 0.726118 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0495643 -0.373728 0.724997 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0306825 -0.382672 0.738155 RAD 0.00617284 + txt002 + SPHERE CENTER -0.030137 -0.383722 0.713492 RAD 0.00617284 + txt002 + SPHERE CENTER -0.064627 -0.389151 0.71296 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0451997 -0.399146 0.701455 RAD 0.00617284 + txt002 + SPHERE CENTER -0.060808 -0.41352 0.714081 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0651725 -0.388102 0.737623 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0613535 -0.41247 0.738744 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0462908 -0.397047 0.750781 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0571747 -0.463094 0.692479 RAD 0.0185185 + txt002 + SPHERE CENTER -0.081612 -0.459563 0.692603 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0696122 -0.463589 0.713804 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0665888 -0.442243 0.701767 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0691745 -0.459069 0.671279 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0541513 -0.441749 0.680442 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0447373 -0.4626 0.671155 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0721979 -0.480415 0.683315 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0477607 -0.483946 0.683192 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0601982 -0.48444 0.704516 RAD 0.00617284 + txt002 + SPHERE CENTER -0.00628079 -0.512079 0.769837 RAD 0.0185185 + txt002 + SPHERE CENTER -0.000557006 -0.523883 0.790755 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0165974 -0.51057 0.779001 RAD 0.00617284 + txt002 + SPHERE CENTER -0.00208214 -0.49924 0.790506 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0234352 -0.525392 0.781591 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0249603 -0.500749 0.781342 RAD 0.00617284 + txt002 + SPHERE CENTER -0.029159 -0.513588 0.760673 RAD 0.00617284 + txt002 + SPHERE CENTER -0.00475566 -0.536722 0.770086 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0104794 -0.524918 0.749168 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0123987 -0.523409 0.758332 RAD 0.00617284 + txt002 + SPHERE CENTER -0.00557859 -0.516134 0.695877 RAD 0.0185185 + txt002 + SPHERE CENTER -0.00154892 -0.540463 0.697123 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0156462 -0.524673 0.705165 RAD 0.00617284 + txt002 + SPHERE CENTER -0.00538221 -0.52751 0.717791 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0227737 -0.531924 0.687835 RAD 0.00617284 + txt002 + SPHERE CENTER -0.026607 -0.518971 0.708504 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0268034 -0.507596 0.68659 RAD 0.00617284 + txt002 + SPHERE CENTER -0.00174531 -0.529087 0.675209 RAD 0.00617284 + txt002 + SPHERE CENTER -0.00577498 -0.504759 0.673964 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0154498 -0.513298 0.683251 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0574471 -0.504176 0.732914 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0817008 -0.508666 0.734036 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0732807 -0.489545 0.720878 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0722467 -0.488971 0.745541 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0658672 -0.523298 0.746073 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0564131 -0.503602 0.757577 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0416134 -0.518808 0.744951 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0669012 -0.523872 0.72141 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0426474 -0.519382 0.720288 RAD 0.00617284 + txt002 + SPHERE CENTER 0.058481 -0.504751 0.708251 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0483751 -0.248762 0.655442 RAD 0.0555556 + txt002 + SPHERE CENTER -0.0599222 -0.183785 0.689081 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0522053 -0.160406 0.690965 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0358698 -0.178533 0.687193 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0513956 -0.171954 0.669156 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0762577 -0.165658 0.692853 RAD 0.00617284 + txt002 + SPHERE CENTER -0.075448 -0.177206 0.671044 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0839747 -0.189036 0.690969 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0607319 -0.172236 0.71089 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0684488 -0.195615 0.709006 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0443964 -0.190363 0.707118 RAD 0.00617284 + txt002 + SPHERE CENTER 0.00673113 -0.215921 0.692479 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0258737 -0.20044 0.690591 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0203763 -0.215612 0.671903 RAD 0.00617284 + txt002 + SPHERE CENTER 0.00551963 -0.196602 0.677151 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0122285 -0.200749 0.711167 RAD 0.00617284 + txt002 + SPHERE CENTER -0.00812553 -0.196911 0.697727 RAD 0.00617284 + txt002 + SPHERE CENTER -0.00691403 -0.21623 0.713055 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0270852 -0.21976 0.705919 RAD 0.00617284 + txt002 + SPHERE CENTER 0.00794264 -0.235241 0.707807 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0215878 -0.234932 0.687231 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0172857 -0.187119 0.6286 RAD 0.0185185 + txt002 + SPHERE CENTER -0.00705049 -0.176731 0.608675 RAD 0.00617284 + txt002 + SPHERE CENTER -0.00352517 -0.200733 0.613272 RAD 0.00617284 + txt002 + SPHERE CENTER -0.025725 -0.192673 0.60607 RAD 0.00617284 + txt002 + SPHERE CENTER -0.020811 -0.163117 0.624003 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0394855 -0.179058 0.621398 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0310463 -0.173504 0.643928 RAD 0.00617284 + txt002 + SPHERE CENTER 0.00138875 -0.171177 0.631205 RAD 0.00617284 + txt002 + SPHERE CENTER -0.00884647 -0.181564 0.65113 RAD 0.00617284 + txt002 + SPHERE CENTER 0.00491406 -0.195179 0.635801 RAD 0.00617284 + txt002 + SPHERE CENTER -0.115028 -0.216626 0.652044 RAD 0.0185185 + txt002 + SPHERE CENTER -0.127519 -0.195663 0.655816 RAD 0.00617284 + txt002 + SPHERE CENTER -0.108803 -0.201738 0.670732 RAD 0.00617284 + txt002 + SPHERE CENTER -0.104303 -0.194866 0.647447 RAD 0.00617284 + txt002 + SPHERE CENTER -0.133744 -0.210551 0.637128 RAD 0.00617284 + txt002 + SPHERE CENTER -0.110528 -0.209754 0.628759 RAD 0.00617284 + txt002 + SPHERE CENTER -0.121254 -0.231514 0.633356 RAD 0.00617284 + txt002 + SPHERE CENTER -0.138245 -0.217423 0.660413 RAD 0.00617284 + txt002 + SPHERE CENTER -0.125754 -0.238386 0.656641 RAD 0.00617284 + txt002 + SPHERE CENTER -0.119529 -0.223497 0.675329 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0723919 -0.21996 0.591563 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0673141 -0.20388 0.573526 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0609052 -0.198742 0.596811 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0490355 -0.216456 0.584361 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0788008 -0.225098 0.568278 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0605222 -0.237674 0.579113 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0838786 -0.241177 0.586315 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0906706 -0.207384 0.580727 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0957484 -0.223463 0.598764 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0842617 -0.202246 0.604012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.103481 -0.281603 0.618405 RAD 0.0185185 + txt002 + SPHERE CENTER -0.126206 -0.291073 0.620293 RAD 0.00617284 + txt002 + SPHERE CENTER -0.110246 -0.293457 0.638981 RAD 0.00617284 + txt002 + SPHERE CENTER -0.119897 -0.271345 0.633733 RAD 0.00617284 + txt002 + SPHERE CENTER -0.119442 -0.279219 0.599717 RAD 0.00617284 + txt002 + SPHERE CENTER -0.113132 -0.25949 0.613157 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0967168 -0.269749 0.597829 RAD 0.00617284 + txt002 + SPHERE CENTER -0.10979 -0.301332 0.604965 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0870656 -0.291862 0.603077 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0938302 -0.303716 0.623653 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0910116 -0.245428 0.715923 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0942304 -0.234308 0.737733 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0714204 -0.238704 0.729364 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0854464 -0.221514 0.718528 RAD 0.00617284 + txt002 + SPHERE CENTER -0.113822 -0.241032 0.724292 RAD 0.00617284 + txt002 + SPHERE CENTER -0.105038 -0.228237 0.705088 RAD 0.00617284 + txt002 + SPHERE CENTER -0.110603 -0.252152 0.702483 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0997955 -0.258223 0.735128 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0965768 -0.269343 0.713318 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0769856 -0.262619 0.726759 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0794645 -0.310405 0.682285 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0817333 -0.324811 0.702209 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0603366 -0.313378 0.697613 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0800146 -0.300317 0.704814 RAD 0.00617284 + txt002 + SPHERE CENTER -0.100861 -0.321838 0.686881 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0991425 -0.297345 0.689486 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0985923 -0.307433 0.666956 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0811832 -0.334899 0.67968 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0789143 -0.320493 0.659755 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0597864 -0.323466 0.675083 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0243582 -0.277564 0.719322 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0076281 -0.275459 0.737359 RAD 0.00617284 + txt002 + SPHERE CENTER -0.00142185 -0.270078 0.714074 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0167139 -0.255218 0.726523 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0305645 -0.282946 0.742607 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0396503 -0.262704 0.731771 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0472946 -0.285051 0.72457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0152725 -0.297806 0.730157 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0320026 -0.299911 0.71212 RAD 0.00617284 + txt002 + SPHERE CENTER -0.00906621 -0.292425 0.706872 RAD 0.00617284 + txt002 + SPHERE CENTER -0.115031 -0.4293 0.544331 RAD 0.0555556 + txt002 + SPHERE CENTER -0.178985 -0.424299 0.581368 RAD 0.0185185 + txt002 + SPHERE CENTER -0.190929 -0.412497 0.599471 RAD 0.00617284 + txt002 + SPHERE CENTER -0.16674 -0.417001 0.601529 RAD 0.00617284 + txt002 + SPHERE CENTER -0.174844 -0.400273 0.585275 RAD 0.00617284 + txt002 + SPHERE CENTER -0.203175 -0.419795 0.57931 RAD 0.00617284 + txt002 + SPHERE CENTER -0.18709 -0.407571 0.565115 RAD 0.00617284 + txt002 + SPHERE CENTER -0.191231 -0.431597 0.561208 RAD 0.00617284 + txt002 + SPHERE CENTER -0.195071 -0.436523 0.595564 RAD 0.00617284 + txt002 + SPHERE CENTER -0.183127 -0.448325 0.577461 RAD 0.00617284 + txt002 + SPHERE CENTER -0.170881 -0.441027 0.597621 RAD 0.00617284 + txt002 + SPHERE CENTER -0.115031 -0.4293 0.618405 RAD 0.0185185 + txt002 + SPHERE CENTER -0.10495 -0.41922 0.638566 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0911807 -0.42291 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER -0.10864 -0.40545 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER -0.128801 -0.425611 0.638566 RAD 0.00617284 + txt002 + SPHERE CENTER -0.13249 -0.411841 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER -0.138881 -0.435691 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER -0.111341 -0.44307 0.638566 RAD 0.00617284 + txt002 + SPHERE CENTER -0.121421 -0.45315 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0975713 -0.44676 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER -0.131634 -0.367336 0.581368 RAD 0.0185185 + txt002 + SPHERE CENTER -0.12515 -0.343834 0.585275 RAD 0.00617284 + txt002 + SPHERE CENTER -0.107784 -0.360946 0.581368 RAD 0.00617284 + txt002 + SPHERE CENTER -0.122476 -0.353814 0.56285 RAD 0.00617284 + txt002 + SPHERE CENTER -0.149 -0.350225 0.585275 RAD 0.00617284 + txt002 + SPHERE CENTER -0.146326 -0.360204 0.56285 RAD 0.00617284 + txt002 + SPHERE CENTER -0.155484 -0.373727 0.581368 RAD 0.00617284 + txt002 + SPHERE CENTER -0.134308 -0.357357 0.603794 RAD 0.00617284 + txt002 + SPHERE CENTER -0.140792 -0.380859 0.599887 RAD 0.00617284 + txt002 + SPHERE CENTER -0.116942 -0.374468 0.599887 RAD 0.00617284 + txt002 + SPHERE CENTER -0.178985 -0.424299 0.507294 RAD 0.0185185 + txt002 + SPHERE CENTER -0.200165 -0.411775 0.505236 RAD 0.00617284 + txt002 + SPHERE CENTER -0.189948 -0.415187 0.527454 RAD 0.00617284 + txt002 + SPHERE CENTER -0.179342 -0.399922 0.511201 RAD 0.00617284 + txt002 + SPHERE CENTER -0.189202 -0.420888 0.485076 RAD 0.00617284 + txt002 + SPHERE CENTER -0.168379 -0.409035 0.491041 RAD 0.00617284 + txt002 + SPHERE CENTER -0.168023 -0.433412 0.487134 RAD 0.00617284 + txt002 + SPHERE CENTER -0.199808 -0.436152 0.501329 RAD 0.00617284 + txt002 + SPHERE CENTER -0.178629 -0.448677 0.503387 RAD 0.00617284 + txt002 + SPHERE CENTER -0.189591 -0.439564 0.523547 RAD 0.00617284 + txt002 + SPHERE CENTER -0.131634 -0.367336 0.507294 RAD 0.0185185 + txt002 + SPHERE CENTER -0.123305 -0.350719 0.491041 RAD 0.00617284 + txt002 + SPHERE CENTER -0.107784 -0.360946 0.507294 RAD 0.00617284 + txt002 + SPHERE CENTER -0.116942 -0.374468 0.488775 RAD 0.00617284 + txt002 + SPHERE CENTER -0.147155 -0.357109 0.491041 RAD 0.00617284 + txt002 + SPHERE CENTER -0.140792 -0.380859 0.488775 RAD 0.00617284 + txt002 + SPHERE CENTER -0.155484 -0.373727 0.507294 RAD 0.00617284 + txt002 + SPHERE CENTER -0.137998 -0.343587 0.509559 RAD 0.00617284 + txt002 + SPHERE CENTER -0.146326 -0.360204 0.525813 RAD 0.00617284 + txt002 + SPHERE CENTER -0.122476 -0.353814 0.525813 RAD 0.00617284 + txt002 + SPHERE CENTER -0.115031 -0.4293 0.470257 RAD 0.0185185 + txt002 + SPHERE CENTER -0.125111 -0.41922 0.450097 RAD 0.00617284 + txt002 + SPHERE CENTER -0.138881 -0.42291 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER -0.121421 -0.40545 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER -0.101261 -0.425611 0.450097 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0975713 -0.411841 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0911807 -0.435691 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER -0.11872 -0.44307 0.450097 RAD 0.00617284 + txt002 + SPHERE CENTER -0.10864 -0.45315 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER -0.13249 -0.44676 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER -0.162382 -0.486264 0.544331 RAD 0.0185185 + txt002 + SPHERE CENTER -0.174264 -0.502603 0.558526 RAD 0.00617284 + txt002 + SPHERE CENTER -0.15142 -0.495376 0.564491 RAD 0.00617284 + txt002 + SPHERE CENTER -0.170327 -0.479659 0.566757 RAD 0.00617284 + txt002 + SPHERE CENTER -0.185226 -0.49349 0.538366 RAD 0.00617284 + txt002 + SPHERE CENTER -0.18129 -0.470546 0.546597 RAD 0.00617284 + txt002 + SPHERE CENTER -0.173345 -0.477151 0.524171 RAD 0.00617284 + txt002 + SPHERE CENTER -0.166319 -0.509207 0.536101 RAD 0.00617284 + txt002 + SPHERE CENTER -0.154437 -0.492868 0.521905 RAD 0.00617284 + txt002 + SPHERE CENTER -0.143475 -0.501981 0.542066 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0984274 -0.491265 0.507294 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0810612 -0.508376 0.503387 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0745774 -0.484874 0.507294 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0837352 -0.498397 0.525813 RAD 0.00617284 + txt002 + SPHERE CENTER -0.104911 -0.514767 0.503387 RAD 0.00617284 + txt002 + SPHERE CENTER -0.107585 -0.504787 0.525813 RAD 0.00617284 + txt002 + SPHERE CENTER -0.122277 -0.497655 0.507294 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0957534 -0.501244 0.484868 RAD 0.00617284 + txt002 + SPHERE CENTER -0.11312 -0.484132 0.488775 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0892696 -0.477742 0.488775 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0984274 -0.491265 0.581368 RAD 0.0185185 + txt002 + SPHERE CENTER -0.082906 -0.501491 0.597621 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0745774 -0.484874 0.581368 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0892696 -0.477742 0.599887 RAD 0.00617284 + txt002 + SPHERE CENTER -0.106756 -0.507882 0.597621 RAD 0.00617284 + txt002 + SPHERE CENTER -0.11312 -0.484132 0.599887 RAD 0.00617284 + txt002 + SPHERE CENTER -0.122277 -0.497655 0.581368 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0920638 -0.515014 0.579103 RAD 0.00617284 + txt002 + SPHERE CENTER -0.107585 -0.504787 0.56285 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0837352 -0.498397 0.56285 RAD 0.00617284 + txt002 + SPHERE CENTER 0.153845 -0.574159 0.618405 RAD 0.0555556 + txt002 + SPHERE CENTER 0.202534 -0.612768 0.658726 RAD 0.0185185 + txt002 + SPHERE CENTER 0.225282 -0.612732 0.668328 RAD 0.00617284 + txt002 + SPHERE CENTER 0.22113 -0.60221 0.64638 RAD 0.00617284 + txt002 + SPHERE CENTER 0.212428 -0.591695 0.666956 RAD 0.00617284 + txt002 + SPHERE CENTER 0.206686 -0.62329 0.680674 RAD 0.00617284 + txt002 + SPHERE CENTER 0.193832 -0.602253 0.679302 RAD 0.00617284 + txt002 + SPHERE CENTER 0.183939 -0.623325 0.671072 RAD 0.00617284 + txt002 + SPHERE CENTER 0.215388 -0.633805 0.660098 RAD 0.00617284 + txt002 + SPHERE CENTER 0.192641 -0.63384 0.650495 RAD 0.00617284 + txt002 + SPHERE CENTER 0.211236 -0.623283 0.63815 RAD 0.00617284 + txt002 + SPHERE CENTER 0.225396 -0.554987 0.618405 RAD 0.0185185 + txt002 + SPHERE CENTER 0.243024 -0.542885 0.606059 RAD 0.00617284 + txt002 + SPHERE CENTER 0.225396 -0.554987 0.593714 RAD 0.00617284 + txt002 + SPHERE CENTER 0.219861 -0.534333 0.606059 RAD 0.00617284 + txt002 + SPHERE CENTER 0.243024 -0.542885 0.630751 RAD 0.00617284 + txt002 + SPHERE CENTER 0.219861 -0.534333 0.630751 RAD 0.00617284 + txt002 + SPHERE CENTER 0.225396 -0.554987 0.643096 RAD 0.00617284 + txt002 + SPHERE CENTER 0.248559 -0.563539 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER 0.23093 -0.575642 0.630751 RAD 0.00617284 + txt002 + SPHERE CENTER 0.23093 -0.575642 0.606059 RAD 0.00617284 + txt002 + SPHERE CENTER 0.184086 -0.543919 0.678886 RAD 0.0185185 + txt002 + SPHERE CENTER 0.200547 -0.527458 0.687117 RAD 0.00617284 + txt002 + SPHERE CENTER 0.205161 -0.540303 0.666541 RAD 0.00617284 + txt002 + SPHERE CENTER 0.187702 -0.522843 0.666541 RAD 0.00617284 + txt002 + SPHERE CENTER 0.179472 -0.531074 0.699462 RAD 0.00617284 + txt002 + SPHERE CENTER 0.166627 -0.526459 0.678886 RAD 0.00617284 + txt002 + SPHERE CENTER 0.163011 -0.547535 0.691232 RAD 0.00617284 + txt002 + SPHERE CENTER 0.196931 -0.548533 0.699462 RAD 0.00617284 + txt002 + SPHERE CENTER 0.18047 -0.564994 0.691232 RAD 0.00617284 + txt002 + SPHERE CENTER 0.201546 -0.561378 0.678886 RAD 0.00617284 + txt002 + SPHERE CENTER 0.130984 -0.631939 0.658726 RAD 0.0185185 + txt002 + SPHERE CENTER 0.132649 -0.643128 0.680674 RAD 0.00617284 + txt002 + SPHERE CENTER 0.152367 -0.631785 0.671072 RAD 0.00617284 + txt002 + SPHERE CENTER 0.133263 -0.618482 0.679302 RAD 0.00617284 + txt002 + SPHERE CENTER 0.111266 -0.643283 0.668328 RAD 0.00617284 + txt002 + SPHERE CENTER 0.11188 -0.618637 0.666956 RAD 0.00617284 + txt002 + SPHERE CENTER 0.109601 -0.632094 0.64638 RAD 0.00617284 + txt002 + SPHERE CENTER 0.130371 -0.656585 0.660098 RAD 0.00617284 + txt002 + SPHERE CENTER 0.128706 -0.645397 0.63815 RAD 0.00617284 + txt002 + SPHERE CENTER 0.150088 -0.645242 0.650495 RAD 0.00617284 + txt002 + SPHERE CENTER 0.112536 -0.56309 0.678886 RAD 0.0185185 + txt002 + SPHERE CENTER 0.11011 -0.549659 0.699462 RAD 0.00617284 + txt002 + SPHERE CENTER 0.132596 -0.555684 0.691232 RAD 0.00617284 + txt002 + SPHERE CENTER 0.118927 -0.53924 0.678886 RAD 0.00617284 + txt002 + SPHERE CENTER 0.09005 -0.557065 0.687117 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0988668 -0.546646 0.666541 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0924762 -0.570497 0.666541 RAD 0.00617284 + txt002 + SPHERE CENTER 0.103719 -0.573509 0.699462 RAD 0.00617284 + txt002 + SPHERE CENTER 0.106145 -0.58694 0.678886 RAD 0.00617284 + txt002 + SPHERE CENTER 0.126205 -0.579534 0.691232 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0822954 -0.593331 0.618405 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0609772 -0.591664 0.630751 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0822954 -0.593331 0.643096 RAD 0.00617284 + txt002 + SPHERE CENTER 0.076761 -0.572676 0.630751 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0609772 -0.591664 0.606059 RAD 0.00617284 + txt002 + SPHERE CENTER 0.076761 -0.572676 0.606059 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0822954 -0.593331 0.593714 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0665116 -0.612319 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0878298 -0.613986 0.606059 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0878298 -0.613986 0.630751 RAD 0.00617284 + txt002 + SPHERE CENTER 0.172294 -0.643008 0.598245 RAD 0.0185185 + txt002 + SPHERE CENTER 0.189742 -0.660425 0.599616 RAD 0.00617284 + txt002 + SPHERE CENTER 0.196144 -0.636618 0.598245 RAD 0.00617284 + txt002 + SPHERE CENTER 0.185725 -0.645434 0.618821 RAD 0.00617284 + txt002 + SPHERE CENTER 0.165892 -0.666816 0.599616 RAD 0.00617284 + txt002 + SPHERE CENTER 0.161875 -0.651825 0.618821 RAD 0.00617284 + txt002 + SPHERE CENTER 0.148444 -0.649399 0.598245 RAD 0.00617284 + txt002 + SPHERE CENTER 0.17631 -0.657999 0.57904 RAD 0.00617284 + txt002 + SPHERE CENTER 0.158862 -0.640582 0.577669 RAD 0.00617284 + txt002 + SPHERE CENTER 0.182712 -0.634191 0.577669 RAD 0.00617284 + txt002 + SPHERE CENTER 0.123605 -0.6044 0.557924 RAD 0.0185185 + txt002 + SPHERE CENTER 0.107144 -0.620861 0.549693 RAD 0.00617284 + txt002 + SPHERE CENTER 0.119989 -0.625475 0.57027 RAD 0.00617284 + txt002 + SPHERE CENTER 0.102529 -0.608016 0.57027 RAD 0.00617284 + txt002 + SPHERE CENTER 0.11076 -0.599785 0.537348 RAD 0.00617284 + txt002 + SPHERE CENTER 0.106145 -0.58694 0.557924 RAD 0.00617284 + txt002 + SPHERE CENTER 0.127221 -0.583324 0.545578 RAD 0.00617284 + txt002 + SPHERE CENTER 0.128219 -0.617245 0.537348 RAD 0.00617284 + txt002 + SPHERE CENTER 0.14468 -0.600784 0.545578 RAD 0.00617284 + txt002 + SPHERE CENTER 0.141064 -0.621859 0.557924 RAD 0.00617284 + txt002 + SPHERE CENTER 0.195155 -0.585228 0.557924 RAD 0.0185185 + txt002 + SPHERE CENTER 0.203972 -0.574809 0.537348 RAD 0.00617284 + txt002 + SPHERE CENTER 0.181486 -0.568784 0.545578 RAD 0.00617284 + txt002 + SPHERE CENTER 0.201546 -0.561378 0.557924 RAD 0.00617284 + txt002 + SPHERE CENTER 0.217641 -0.591253 0.549693 RAD 0.00617284 + txt002 + SPHERE CENTER 0.215215 -0.577822 0.57027 RAD 0.00617284 + txt002 + SPHERE CENTER 0.208824 -0.601672 0.57027 RAD 0.00617284 + txt002 + SPHERE CENTER 0.197581 -0.598659 0.537348 RAD 0.00617284 + txt002 + SPHERE CENTER 0.188764 -0.609078 0.557924 RAD 0.00617284 + txt002 + SPHERE CENTER 0.175095 -0.592634 0.545578 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0329639 -0.552323 0.43322 RAD 0.0555556 + txt002 + SPHERE CENTER 0.0248832 -0.625877 0.436618 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0316054 -0.646362 0.448652 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0478 -0.627981 0.445566 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0287309 -0.625173 0.460998 RAD 0.00617284 + txt002 + SPHERE CENTER 0.00868865 -0.644258 0.439705 RAD 0.00617284 + txt002 + SPHERE CENTER 0.00581415 -0.623069 0.45205 RAD 0.00617284 + txt002 + SPHERE CENTER 0.00196644 -0.623773 0.427671 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0277577 -0.647066 0.424272 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0210355 -0.62658 0.412239 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0439523 -0.628685 0.421186 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0822954 -0.593331 0.470257 RAD 0.0185185 + txt002 + SPHERE CENTER 0.105299 -0.593994 0.479204 RAD 0.00617284 + txt002 + SPHERE CENTER 0.100664 -0.582384 0.457911 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0926585 -0.572783 0.479204 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0869303 -0.604941 0.49155 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0742898 -0.58373 0.49155 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0639267 -0.604278 0.482603 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0949359 -0.614541 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0719323 -0.613879 0.46131 RAD 0.00617284 + txt002 + SPHERE CENTER 0.090301 -0.602932 0.448964 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0138144 -0.584567 0.497099 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0177119 -0.584898 0.521479 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0364224 -0.580268 0.506047 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0185345 -0.56353 0.509133 RAD 0.00617284 + txt002 + SPHERE CENTER -0.00489609 -0.589197 0.512531 RAD 0.00617284 + txt002 + SPHERE CENTER -0.00407348 -0.567829 0.500186 RAD 0.00617284 + txt002 + SPHERE CENTER -0.00879364 -0.588867 0.488152 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0129918 -0.605935 0.509445 RAD 0.00617284 + txt002 + SPHERE CENTER 0.00909422 -0.605605 0.485065 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0317022 -0.601305 0.494013 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0244483 -0.584869 0.399581 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0473753 -0.5935 0.402668 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0308315 -0.595617 0.420874 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0399691 -0.57344 0.415013 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0409921 -0.582752 0.381374 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0335859 -0.562692 0.39372 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0180651 -0.574121 0.378288 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0318545 -0.604929 0.387235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.00892756 -0.596298 0.384149 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0153107 -0.607046 0.405442 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0355172 -0.54356 0.460062 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0495897 -0.530389 0.475494 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0261165 -0.53532 0.481355 RAD 0.00617284 + txt002 + SPHERE CENTER -0.031221 -0.519442 0.463149 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0589904 -0.538628 0.454201 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0406217 -0.527681 0.441856 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0449178 -0.551799 0.438769 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0538859 -0.554507 0.472408 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0398133 -0.567678 0.456976 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0304127 -0.559438 0.478269 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0163676 -0.511316 0.396183 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0212225 -0.48882 0.387235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.00896145 -0.491256 0.408529 RAD 0.00617284 + txt002 + SPHERE CENTER 0.00194055 -0.497372 0.387235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0286287 -0.50888 0.37489 RAD 0.00617284 + txt002 + SPHERE CENTER -0.00546563 -0.517432 0.37489 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0237738 -0.531375 0.383837 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0395307 -0.502764 0.396183 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0346758 -0.525259 0.40513 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0272696 -0.505199 0.417476 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0440327 -0.593633 0.372739 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0604766 -0.607302 0.360393 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0678827 -0.587242 0.372739 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0604766 -0.607302 0.385084 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0366265 -0.613693 0.360393 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0366265 -0.613693 0.385084 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0201827 -0.600023 0.372739 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0440327 -0.593633 0.348047 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0275889 -0.579964 0.360393 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0514389 -0.573573 0.360393 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0521134 -0.520079 0.369341 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0542684 -0.523344 0.344961 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0591566 -0.541988 0.360393 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0358996 -0.534291 0.357307 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0472252 -0.501435 0.353908 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0288565 -0.512382 0.366254 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0450702 -0.49817 0.378288 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0704822 -0.509132 0.356995 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0683272 -0.505868 0.381374 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0753703 -0.527777 0.372427 RAD 0.00617284 + txt002 + SPHERE CENTER 0.101445 -0.561087 0.406378 RAD 0.0185185 + txt002 + SPHERE CENTER 0.118381 -0.551884 0.390945 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0944221 -0.550745 0.385084 RAD 0.00617284 + txt002 + SPHERE CENTER 0.103361 -0.536664 0.403291 RAD 0.00617284 + txt002 + SPHERE CENTER 0.125404 -0.562225 0.412239 RAD 0.00617284 + txt002 + SPHERE CENTER 0.110383 -0.547006 0.424584 RAD 0.00617284 + txt002 + SPHERE CENTER 0.108468 -0.571428 0.427671 RAD 0.00617284 + txt002 + SPHERE CENTER 0.116465 -0.576307 0.394032 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0995293 -0.58551 0.409464 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0925065 -0.575168 0.388171 RAD 0.00617284 + txt002 + SPHERE CENTER 0.247614 -0.494808 0.43322 RAD 0.0555556 + txt002 + SPHERE CENTER 0.313607 -0.494287 0.399581 RAD 0.0185185 + txt002 + SPHERE CENTER 0.326876 -0.484182 0.381374 RAD 0.00617284 + txt002 + SPHERE CENTER 0.302705 -0.488171 0.378288 RAD 0.00617284 + txt002 + SPHERE CENTER 0.310432 -0.470513 0.39372 RAD 0.00617284 + txt002 + SPHERE CENTER 0.337778 -0.490299 0.402668 RAD 0.00617284 + txt002 + SPHERE CENTER 0.321334 -0.476629 0.415013 RAD 0.00617284 + txt002 + SPHERE CENTER 0.324509 -0.500404 0.420874 RAD 0.00617284 + txt002 + SPHERE CENTER 0.330051 -0.507957 0.387235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.316783 -0.518062 0.405442 RAD 0.00617284 + txt002 + SPHERE CENTER 0.305881 -0.511946 0.384149 RAD 0.00617284 + txt002 + SPHERE CENTER 0.269833 -0.434629 0.396183 RAD 0.0185185 + txt002 + SPHERE CENTER 0.279233 -0.426389 0.37489 RAD 0.00617284 + txt002 + SPHERE CENTER 0.286276 -0.448298 0.383837 RAD 0.00617284 + txt002 + SPHERE CENTER 0.263449 -0.445377 0.37489 RAD 0.00617284 + txt002 + SPHERE CENTER 0.262789 -0.41272 0.387235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.247006 -0.431707 0.387235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.253389 -0.420959 0.408529 RAD 0.00617284 + txt002 + SPHERE CENTER 0.285616 -0.415641 0.396183 RAD 0.00617284 + txt002 + SPHERE CENTER 0.276216 -0.42388 0.417476 RAD 0.00617284 + txt002 + SPHERE CENTER 0.29266 -0.43755 0.40513 RAD 0.00617284 + txt002 + SPHERE CENTER 0.302539 -0.452978 0.460062 RAD 0.0185185 + txt002 + SPHERE CENTER 0.320401 -0.436971 0.454201 RAD 0.00617284 + txt002 + SPHERE CENTER 0.3148 -0.455413 0.438769 RAD 0.00617284 + txt002 + SPHERE CENTER 0.29902 -0.436675 0.441856 RAD 0.00617284 + txt002 + SPHERE CENTER 0.30814 -0.434535 0.475494 RAD 0.00617284 + txt002 + SPHERE CENTER 0.286759 -0.434239 0.463149 RAD 0.00617284 + txt002 + SPHERE CENTER 0.290278 -0.450543 0.481355 RAD 0.00617284 + txt002 + SPHERE CENTER 0.32392 -0.453274 0.472408 RAD 0.00617284 + txt002 + SPHERE CENTER 0.306057 -0.469281 0.478269 RAD 0.00617284 + txt002 + SPHERE CENTER 0.318318 -0.471717 0.456976 RAD 0.00617284 + txt002 + SPHERE CENTER 0.291389 -0.554467 0.436618 RAD 0.0185185 + txt002 + SPHERE CENTER 0.314604 -0.562288 0.439705 RAD 0.00617284 + txt002 + SPHERE CENTER 0.310183 -0.541186 0.427671 RAD 0.00617284 + txt002 + SPHERE CENTER 0.306499 -0.542501 0.45205 RAD 0.00617284 + txt002 + SPHERE CENTER 0.29581 -0.575569 0.448652 RAD 0.00617284 + txt002 + SPHERE CENTER 0.287705 -0.555781 0.460998 RAD 0.00617284 + txt002 + SPHERE CENTER 0.272595 -0.567748 0.445566 RAD 0.00617284 + txt002 + SPHERE CENTER 0.299494 -0.574255 0.424272 RAD 0.00617284 + txt002 + SPHERE CENTER 0.276279 -0.566433 0.421186 RAD 0.00617284 + txt002 + SPHERE CENTER 0.295073 -0.553152 0.412239 RAD 0.00617284 + txt002 + SPHERE CENTER 0.28032 -0.513157 0.497099 RAD 0.0185185 + txt002 + SPHERE CENTER 0.298839 -0.507811 0.512531 RAD 0.00617284 + txt002 + SPHERE CENTER 0.302049 -0.505577 0.488152 RAD 0.00617284 + txt002 + SPHERE CENTER 0.287442 -0.489718 0.500186 RAD 0.00617284 + txt002 + SPHERE CENTER 0.27711 -0.515392 0.521479 RAD 0.00617284 + txt002 + SPHERE CENTER 0.265714 -0.497299 0.509133 RAD 0.00617284 + txt002 + SPHERE CENTER 0.258591 -0.520738 0.506047 RAD 0.00617284 + txt002 + SPHERE CENTER 0.291716 -0.531251 0.509445 RAD 0.00617284 + txt002 + SPHERE CENTER 0.273198 -0.536597 0.494013 RAD 0.00617284 + txt002 + SPHERE CENTER 0.294927 -0.529016 0.485065 RAD 0.00617284 + txt002 + SPHERE CENTER 0.225396 -0.554987 0.470257 RAD 0.0185185 + txt002 + SPHERE CENTER 0.227186 -0.567359 0.49155 RAD 0.00617284 + txt002 + SPHERE CENTER 0.246777 -0.555283 0.482603 RAD 0.00617284 + txt002 + SPHERE CENTER 0.227528 -0.54267 0.49155 RAD 0.00617284 + txt002 + SPHERE CENTER 0.205805 -0.567063 0.479204 RAD 0.00617284 + txt002 + SPHERE CENTER 0.206147 -0.542374 0.479204 RAD 0.00617284 + txt002 + SPHERE CENTER 0.204014 -0.554691 0.457911 RAD 0.00617284 + txt002 + SPHERE CENTER 0.225054 -0.579676 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER 0.223263 -0.567305 0.448964 RAD 0.00617284 + txt002 + SPHERE CENTER 0.244644 -0.567601 0.46131 RAD 0.00617284 + txt002 + SPHERE CENTER 0.258683 -0.536117 0.372739 RAD 0.0185185 + txt002 + SPHERE CENTER 0.275127 -0.549787 0.360393 RAD 0.00617284 + txt002 + SPHERE CENTER 0.282533 -0.529727 0.372739 RAD 0.00617284 + txt002 + SPHERE CENTER 0.275127 -0.549787 0.385084 RAD 0.00617284 + txt002 + SPHERE CENTER 0.251277 -0.556177 0.360393 RAD 0.00617284 + txt002 + SPHERE CENTER 0.251277 -0.556177 0.385084 RAD 0.00617284 + txt002 + SPHERE CENTER 0.234833 -0.542508 0.372739 RAD 0.00617284 + txt002 + SPHERE CENTER 0.258683 -0.536117 0.348047 RAD 0.00617284 + txt002 + SPHERE CENTER 0.242239 -0.522448 0.360393 RAD 0.00617284 + txt002 + SPHERE CENTER 0.266089 -0.516058 0.360393 RAD 0.00617284 + txt002 + SPHERE CENTER 0.19269 -0.536638 0.406378 RAD 0.0185185 + txt002 + SPHERE CENTER 0.17251 -0.549603 0.412239 RAD 0.00617284 + txt002 + SPHERE CENTER 0.191778 -0.549105 0.427671 RAD 0.00617284 + txt002 + SPHERE CENTER 0.177908 -0.528912 0.424584 RAD 0.00617284 + txt002 + SPHERE CENTER 0.173421 -0.537136 0.390945 RAD 0.00617284 + txt002 + SPHERE CENTER 0.178819 -0.516445 0.403291 RAD 0.00617284 + txt002 + SPHERE CENTER 0.193601 -0.524171 0.385084 RAD 0.00617284 + txt002 + SPHERE CENTER 0.187292 -0.557329 0.394032 RAD 0.00617284 + txt002 + SPHERE CENTER 0.207471 -0.544363 0.388171 RAD 0.00617284 + txt002 + SPHERE CENTER 0.20656 -0.556831 0.409464 RAD 0.00617284 + txt002 + SPHERE CENTER 0.214908 -0.476459 0.369341 RAD 0.0185185 + txt002 + SPHERE CENTER 0.209819 -0.457868 0.353908 RAD 0.00617284 + txt002 + SPHERE CENTER 0.210053 -0.453963 0.378288 RAD 0.00617284 + txt002 + SPHERE CENTER 0.2312 -0.458164 0.366254 RAD 0.00617284 + txt002 + SPHERE CENTER 0.214674 -0.480363 0.344961 RAD 0.00617284 + txt002 + SPHERE CENTER 0.236055 -0.480659 0.357307 RAD 0.00617284 + txt002 + SPHERE CENTER 0.219763 -0.498954 0.360393 RAD 0.00617284 + txt002 + SPHERE CENTER 0.193527 -0.476163 0.356995 RAD 0.00617284 + txt002 + SPHERE CENTER 0.198616 -0.494753 0.372427 RAD 0.00617284 + txt002 + SPHERE CENTER 0.193761 -0.472258 0.381374 RAD 0.00617284 + txt002 + SPHERE CENTER -0.172546 -0.643951 1.11022e-16 RAD 0.166667 + txt002 + SPHERE CENTER -0.157543 -0.835815 0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER -0.122136 -0.871646 0.165419 RAD 0.0185185 + txt002 + SPHERE CENTER -0.102403 -0.871334 0.180258 RAD 0.00617284 + txt002 + SPHERE CENTER -0.100577 -0.862937 0.157111 RAD 0.00617284 + txt002 + SPHERE CENTER -0.113406 -0.850164 0.173902 RAD 0.00617284 + txt002 + SPHERE CENTER -0.123961 -0.880044 0.188567 RAD 0.00617284 + txt002 + SPHERE CENTER -0.134964 -0.858873 0.182211 RAD 0.00617284 + txt002 + SPHERE CENTER -0.143694 -0.880356 0.173728 RAD 0.00617284 + txt002 + SPHERE CENTER -0.111133 -0.892817 0.171776 RAD 0.00617284 + txt002 + SPHERE CENTER -0.130866 -0.893129 0.156937 RAD 0.00617284 + txt002 + SPHERE CENTER -0.109307 -0.884419 0.148628 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0854653 -0.82339 0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0654286 -0.811594 0.114524 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0820122 -0.820516 0.0985541 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0876595 -0.80102 0.112614 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0688817 -0.814468 0.138803 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0911125 -0.803895 0.136894 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0889183 -0.826265 0.147112 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0632344 -0.833964 0.124743 RAD 0.00617284 + txt002 + SPHERE CENTER -0.083271 -0.845761 0.133052 RAD 0.00617284 + txt002 + SPHERE CENTER -0.079818 -0.842886 0.108773 RAD 0.00617284 + txt002 + SPHERE CENTER -0.135649 -0.799077 0.171592 RAD 0.0185185 + txt002 + SPHERE CENTER -0.120908 -0.781177 0.180075 RAD 0.00617284 + txt002 + SPHERE CENTER -0.113462 -0.795477 0.161374 RAD 0.00617284 + txt002 + SPHERE CENTER -0.13149 -0.778973 0.157875 RAD 0.00617284 + txt002 + SPHERE CENTER -0.143095 -0.784778 0.190293 RAD 0.00617284 + txt002 + SPHERE CENTER -0.153678 -0.782573 0.168094 RAD 0.00617284 + txt002 + SPHERE CENTER -0.157836 -0.802678 0.181811 RAD 0.00617284 + txt002 + SPHERE CENTER -0.125067 -0.801282 0.193792 RAD 0.00617284 + txt002 + SPHERE CENTER -0.139808 -0.819182 0.18531 RAD 0.00617284 + txt002 + SPHERE CENTER -0.11762 -0.815582 0.175091 RAD 0.00617284 + txt002 + SPHERE CENTER -0.194213 -0.884071 0.153697 RAD 0.0185185 + txt002 + SPHERE CENTER -0.197746 -0.891905 0.176845 RAD 0.00617284 + txt002 + SPHERE CENTER -0.175383 -0.884286 0.169668 RAD 0.00617284 + txt002 + SPHERE CENTER -0.193701 -0.867957 0.172398 RAD 0.00617284 + txt002 + SPHERE CENTER -0.216576 -0.89169 0.160875 RAD 0.00617284 + txt002 + SPHERE CENTER -0.212531 -0.867741 0.156428 RAD 0.00617284 + txt002 + SPHERE CENTER -0.213043 -0.883856 0.137727 RAD 0.00617284 + txt002 + SPHERE CENTER -0.198259 -0.908019 0.158144 RAD 0.00617284 + txt002 + SPHERE CENTER -0.194726 -0.900186 0.134996 RAD 0.00617284 + txt002 + SPHERE CENTER -0.175896 -0.900401 0.150967 RAD 0.00617284 + txt002 + SPHERE CENTER -0.207727 -0.811502 0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER -0.212743 -0.794108 0.176661 RAD 0.00617284 + txt002 + SPHERE CENTER -0.189621 -0.802328 0.173931 RAD 0.00617284 + txt002 + SPHERE CENTER -0.199907 -0.788345 0.156372 RAD 0.00617284 + txt002 + SPHERE CENTER -0.230849 -0.803282 0.162601 RAD 0.00617284 + txt002 + SPHERE CENTER -0.218012 -0.797518 0.142311 RAD 0.00617284 + txt002 + SPHERE CENTER -0.225832 -0.820676 0.14581 RAD 0.00617284 + txt002 + SPHERE CENTER -0.220563 -0.817265 0.18016 RAD 0.00617284 + txt002 + SPHERE CENTER -0.215547 -0.83466 0.163369 RAD 0.00617284 + txt002 + SPHERE CENTER -0.197441 -0.825486 0.177429 RAD 0.00617284 + txt002 + SPHERE CENTER -0.229621 -0.84824 0.099389 RAD 0.0185185 + txt002 + SPHERE CENTER -0.25245 -0.843832 0.107698 RAD 0.00617284 + txt002 + SPHERE CENTER -0.233837 -0.846687 0.123668 RAD 0.00617284 + txt002 + SPHERE CENTER -0.235043 -0.826426 0.109608 RAD 0.00617284 + txt002 + SPHERE CENTER -0.248234 -0.845385 0.0834188 RAD 0.00617284 + txt002 + SPHERE CENTER -0.230827 -0.827978 0.0853287 RAD 0.00617284 + txt002 + SPHERE CENTER -0.225404 -0.849792 0.0751099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.247028 -0.865646 0.0974792 RAD 0.00617284 + txt002 + SPHERE CENTER -0.224198 -0.870053 0.0891702 RAD 0.00617284 + txt002 + SPHERE CENTER -0.228415 -0.868501 0.113449 RAD 0.00617284 + txt002 + SPHERE CENTER -0.14403 -0.908384 0.104938 RAD 0.0185185 + txt002 + SPHERE CENTER -0.128672 -0.926643 0.111295 RAD 0.00617284 + txt002 + SPHERE CENTER -0.1198 -0.904034 0.106848 RAD 0.00617284 + txt002 + SPHERE CENTER -0.133221 -0.90826 0.127138 RAD 0.00617284 + txt002 + SPHERE CENTER -0.152902 -0.930993 0.109385 RAD 0.00617284 + txt002 + SPHERE CENTER -0.157451 -0.912609 0.125228 RAD 0.00617284 + txt002 + SPHERE CENTER -0.16826 -0.912733 0.103028 RAD 0.00617284 + txt002 + SPHERE CENTER -0.139481 -0.926768 0.0890951 RAD 0.00617284 + txt002 + SPHERE CENTER -0.154838 -0.908508 0.0827387 RAD 0.00617284 + txt002 + SPHERE CENTER -0.130608 -0.904159 0.0846485 RAD 0.00617284 + txt002 + SPHERE CENTER -0.179437 -0.872552 0.0506299 RAD 0.0185185 + txt002 + SPHERE CENTER -0.188167 -0.894035 0.0421477 RAD 0.00617284 + txt002 + SPHERE CENTER -0.172046 -0.89378 0.0608487 RAD 0.00617284 + txt002 + SPHERE CENTER -0.195141 -0.885777 0.0643473 RAD 0.00617284 + txt002 + SPHERE CENTER -0.195558 -0.872807 0.0319289 RAD 0.00617284 + txt002 + SPHERE CENTER -0.202532 -0.864549 0.0541285 RAD 0.00617284 + txt002 + SPHERE CENTER -0.186828 -0.851325 0.0404111 RAD 0.00617284 + txt002 + SPHERE CENTER -0.172463 -0.880811 0.0284303 RAD 0.00617284 + txt002 + SPHERE CENTER -0.163733 -0.859328 0.0369125 RAD 0.00617284 + txt002 + SPHERE CENTER -0.156342 -0.880556 0.0471312 RAD 0.00617284 + txt002 + SPHERE CENTER -0.107359 -0.860128 0.062352 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0905999 -0.853284 0.0455609 RAD 0.00617284 + txt002 + SPHERE CENTER -0.111382 -0.840233 0.0482916 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0940331 -0.839638 0.0658506 RAD 0.00617284 + txt002 + SPHERE CENTER -0.086577 -0.873178 0.0596212 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0900102 -0.859532 0.079911 RAD 0.00617284 + txt002 + SPHERE CENTER -0.103336 -0.880022 0.0764123 RAD 0.00617284 + txt002 + SPHERE CENTER -0.103926 -0.873773 0.0420622 RAD 0.00617284 + txt002 + SPHERE CENTER -0.120685 -0.880618 0.0588533 RAD 0.00617284 + txt002 + SPHERE CENTER -0.124708 -0.860723 0.044793 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0133465 -0.69376 0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER 0.0838533 -0.674309 0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER 0.103063 -0.66171 0.113782 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0876683 -0.673446 0.0984536 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0800983 -0.653258 0.110488 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0992478 -0.662574 0.138161 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0762832 -0.654121 0.134867 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0800382 -0.675172 0.147213 RAD 0.00617284 + txt002 + SPHERE CENTER 0.106818 -0.682761 0.126127 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0876083 -0.69536 0.135179 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0914233 -0.694497 0.110799 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0539145 -0.666287 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0547519 -0.662466 0.031176 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0439578 -0.682791 0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0332597 -0.660752 0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0647085 -0.645962 0.0466081 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0432164 -0.644249 0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0638711 -0.649783 0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0754066 -0.668 0.0435217 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0745692 -0.671821 0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0646126 -0.688325 0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0325183 -0.62221 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0446211 -0.604582 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.053173 -0.627745 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0325183 -0.62221 0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0239663 -0.599047 0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0118635 -0.616676 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0118635 -0.616676 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0446211 -0.604582 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0325183 -0.62221 0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER 0.053173 -0.627745 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0432853 -0.701782 0.178389 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0608821 -0.693716 0.193717 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0652402 -0.694884 0.169441 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0496759 -0.677932 0.178389 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0389272 -0.700615 0.202664 RAD 0.00617284 + txt002 + SPHERE CENTER 0.027721 -0.684831 0.187336 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0213304 -0.708681 0.187336 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0544915 -0.717566 0.193717 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0368947 -0.725632 0.178389 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0588496 -0.718734 0.169441 RAD 0.00617284 + txt002 + SPHERE CENTER -0.00804971 -0.649684 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.00328338 -0.628657 0.178701 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0152909 -0.642244 0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER 0.000378614 -0.630031 0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER -0.026624 -0.636097 0.175614 RAD 0.00617284 + txt002 + SPHERE CENTER -0.022962 -0.637471 0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0313903 -0.657124 0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0117117 -0.648309 0.191046 RAD 0.00617284 + txt002 + SPHERE CENTER -0.016478 -0.669336 0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.00686255 -0.661896 0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0272215 -0.721234 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0310802 -0.720593 0.191046 RAD 0.00617284 + txt002 + SPHERE CENTER -0.00820099 -0.718114 0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0246945 -0.7 0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0501007 -0.723713 0.175614 RAD 0.00617284 + txt002 + SPHERE CENTER -0.043715 -0.70312 0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.046242 -0.724354 0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0336072 -0.741827 0.178701 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0297485 -0.742467 0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER -0.010728 -0.739347 0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0646815 -0.745859 0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0887955 -0.750021 0.126127 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0813312 -0.732161 0.110799 RAD 0.00617284 + txt002 + SPHERE CENTER 0.078459 -0.729506 0.135179 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0721458 -0.763719 0.138161 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0618093 -0.743204 0.147213 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0480318 -0.759557 0.134867 RAD 0.00617284 + txt002 + SPHERE CENTER 0.075018 -0.766375 0.113782 RAD 0.00617284 + txt002 + SPHERE CENTER 0.050904 -0.762212 0.110488 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0675537 -0.748514 0.0984536 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0058253 -0.76531 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.00415829 -0.786629 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0148294 -0.770845 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0058253 -0.76531 0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER -0.024813 -0.781094 0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER -0.02648 -0.759776 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.02648 -0.759776 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.00415829 -0.786629 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0058253 -0.76531 0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0148294 -0.770845 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0347427 -0.737837 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0542122 -0.747099 0.0435217 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0550267 -0.7241 0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0553974 -0.743371 0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0339282 -0.760836 0.0466081 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0351134 -0.757108 0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0144587 -0.751574 0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0335575 -0.741565 0.031176 RAD 0.00617284 + txt002 + SPHERE CENTER 0.014088 -0.732303 0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0343719 -0.718566 0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.172546 -0.643951 0.222222 RAD 0.0555556 + txt002 + SPHERE CENTER -0.142305 -0.61371 0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER -0.125845 -0.597249 0.290934 RAD 0.00617284 + txt002 + SPHERE CENTER -0.12123 -0.610094 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.138689 -0.592635 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.14692 -0.600865 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER -0.159765 -0.596251 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER -0.163381 -0.617326 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER -0.12946 -0.618324 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER -0.145921 -0.634785 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER -0.124846 -0.631169 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER -0.100996 -0.624779 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0833673 -0.612676 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.100996 -0.624779 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER -0.10653 -0.604124 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0833673 -0.612676 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.10653 -0.604124 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.100996 -0.624779 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0778329 -0.633331 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0954616 -0.645433 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0954616 -0.645433 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.153374 -0.5724 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.141271 -0.554772 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.13272 -0.577935 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.153374 -0.5724 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER -0.161926 -0.549237 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.174029 -0.566866 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.174029 -0.566866 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.141271 -0.554772 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.153374 -0.5724 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER -0.13272 -0.577935 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.213855 -0.632882 0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER -0.216282 -0.61945 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER -0.193796 -0.625476 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER -0.207465 -0.609032 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER -0.236341 -0.626857 0.290934 RAD 0.00617284 + txt002 + SPHERE CENTER -0.227525 -0.616438 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.233915 -0.640288 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.222672 -0.6433 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER -0.220246 -0.656732 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER -0.200186 -0.649326 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER -0.224924 -0.591572 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.2291 -0.567237 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.209804 -0.576452 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.209804 -0.576452 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.24422 -0.582357 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.224924 -0.591572 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER -0.240045 -0.606693 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.24422 -0.582357 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.240045 -0.606693 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.224924 -0.591572 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER -0.244096 -0.663122 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.265414 -0.661455 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.244096 -0.663122 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER -0.249631 -0.642468 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.265414 -0.661455 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.249631 -0.642468 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.244096 -0.663122 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER -0.25988 -0.68211 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.238562 -0.683777 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.238562 -0.683777 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.161477 -0.68526 0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER -0.148046 -0.687686 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER -0.137627 -0.678869 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER -0.154071 -0.6652 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER -0.171896 -0.694077 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER -0.177921 -0.671591 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER -0.185327 -0.691651 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER -0.155452 -0.707746 0.290934 RAD 0.00617284 + txt002 + SPHERE CENTER -0.168883 -0.70532 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.145033 -0.698929 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.191718 -0.715501 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.190051 -0.736819 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.171063 -0.721035 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.191718 -0.715501 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER -0.210706 -0.731284 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.212373 -0.709966 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.212373 -0.709966 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.190051 -0.736819 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.191718 -0.715501 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER -0.171063 -0.721035 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.120168 -0.696329 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.095832 -0.700504 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.105047 -0.681209 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.105047 -0.681209 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.110952 -0.715624 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.120168 -0.696329 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER -0.135288 -0.711449 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.110952 -0.715624 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.135288 -0.711449 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.120168 -0.696329 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER -0.343435 -0.786005 8.51251e-17 RAD 0.0555556 + txt002 + SPHERE CENTER -0.392454 -0.82165 0.0425863 RAD 0.0185185 + txt002 + SPHERE CENTER -0.400556 -0.824791 0.065698 RAD 0.00617284 + txt002 + SPHERE CENTER -0.376528 -0.821021 0.0614442 RAD 0.00617284 + txt002 + SPHERE CENTER -0.392663 -0.802599 0.058292 RAD 0.00617284 + txt002 + SPHERE CENTER -0.416482 -0.82542 0.0468401 RAD 0.00617284 + txt002 + SPHERE CENTER -0.408589 -0.803228 0.0394341 RAD 0.00617284 + txt002 + SPHERE CENTER -0.40838 -0.822279 0.0237283 RAD 0.00617284 + txt002 + SPHERE CENTER -0.400347 -0.843843 0.0499923 RAD 0.00617284 + txt002 + SPHERE CENTER -0.392245 -0.840701 0.0268805 RAD 0.00617284 + txt002 + SPHERE CENTER -0.376319 -0.840073 0.0457385 RAD 0.00617284 + txt002 + SPHERE CENTER -0.323622 -0.80984 0.0672777 RAD 0.0185185 + txt002 + SPHERE CENTER -0.308073 -0.80634 0.0861356 RAD 0.00617284 + txt002 + SPHERE CENTER -0.300378 -0.802721 0.0629546 RAD 0.00617284 + txt002 + SPHERE CENTER -0.316395 -0.786996 0.0732426 RAD 0.00617284 + txt002 + SPHERE CENTER -0.331317 -0.813459 0.0904587 RAD 0.00617284 + txt002 + SPHERE CENTER -0.339639 -0.794116 0.0775657 RAD 0.00617284 + txt002 + SPHERE CENTER -0.346866 -0.81696 0.0716007 RAD 0.00617284 + txt002 + SPHERE CENTER -0.315299 -0.829184 0.0801706 RAD 0.00617284 + txt002 + SPHERE CENTER -0.330849 -0.832685 0.0613127 RAD 0.00617284 + txt002 + SPHERE CENTER -0.307605 -0.825565 0.0569896 RAD 0.00617284 + txt002 + SPHERE CENTER -0.370774 -0.753118 0.0604812 RAD 0.0185185 + txt002 + SPHERE CENTER -0.367981 -0.734271 0.076187 RAD 0.00617284 + txt002 + SPHERE CENTER -0.348136 -0.745269 0.0664462 RAD 0.00617284 + txt002 + SPHERE CENTER -0.362711 -0.731279 0.0522508 RAD 0.00617284 + txt002 + SPHERE CENTER -0.390619 -0.74212 0.070222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.385349 -0.739128 0.0462858 RAD 0.00617284 + txt002 + SPHERE CENTER -0.393412 -0.760966 0.0545162 RAD 0.00617284 + txt002 + SPHERE CENTER -0.376044 -0.756109 0.0844174 RAD 0.00617284 + txt002 + SPHERE CENTER -0.378837 -0.774956 0.0687117 RAD 0.00617284 + txt002 + SPHERE CENTER -0.356199 -0.767107 0.0746767 RAD 0.00617284 + txt002 + SPHERE CENTER -0.412267 -0.797815 -0.0246914 RAD 0.0185185 + txt002 + SPHERE CENTER -0.436217 -0.793573 -0.0204376 RAD 0.00617284 + txt002 + SPHERE CENTER -0.420728 -0.796968 -0.00151032 RAD 0.00617284 + txt002 + SPHERE CENTER -0.419454 -0.776294 -0.0149506 RAD 0.00617284 + txt002 + SPHERE CENTER -0.427756 -0.79442 -0.0436186 RAD 0.00617284 + txt002 + SPHERE CENTER -0.410993 -0.777141 -0.0381316 RAD 0.00617284 + txt002 + SPHERE CENTER -0.403807 -0.798662 -0.0478724 RAD 0.00617284 + txt002 + SPHERE CENTER -0.42903 -0.815094 -0.0301783 RAD 0.00617284 + txt002 + SPHERE CENTER -0.405081 -0.819335 -0.0344321 RAD 0.00617284 + txt002 + SPHERE CENTER -0.413542 -0.818489 -0.0112511 RAD 0.00617284 + txt002 + SPHERE CENTER -0.390587 -0.729282 -0.00679642 RAD 0.0185185 + txt002 + SPHERE CENTER -0.392427 -0.704862 -0.00994863 RAD 0.00617284 + txt002 + SPHERE CENTER -0.373948 -0.714218 0.00349164 RAD 0.00617284 + txt002 + SPHERE CENTER -0.374248 -0.717401 -0.0209919 RAD 0.00617284 + txt002 + SPHERE CENTER -0.409067 -0.719927 -0.0202367 RAD 0.00617284 + txt002 + SPHERE CENTER -0.390887 -0.732465 -0.0312799 RAD 0.00617284 + txt002 + SPHERE CENTER -0.407227 -0.744347 -0.0170845 RAD 0.00617284 + txt002 + SPHERE CENTER -0.408767 -0.716744 0.0042468 RAD 0.00617284 + txt002 + SPHERE CENTER -0.406927 -0.741164 0.00739901 RAD 0.00617284 + txt002 + SPHERE CENTER -0.390287 -0.726099 0.0176871 RAD 0.00617284 + txt002 + SPHERE CENTER -0.363249 -0.76217 -0.0672777 RAD 0.0185185 + txt002 + SPHERE CENTER -0.356966 -0.747522 -0.0861356 RAD 0.00617284 + txt002 + SPHERE CENTER -0.352002 -0.740618 -0.0629546 RAD 0.00617284 + txt002 + SPHERE CENTER -0.339469 -0.759239 -0.0732426 RAD 0.00617284 + txt002 + SPHERE CENTER -0.368213 -0.769074 -0.0904587 RAD 0.00617284 + txt002 + SPHERE CENTER -0.350716 -0.780791 -0.0775657 RAD 0.00617284 + txt002 + SPHERE CENTER -0.374496 -0.783722 -0.0716007 RAD 0.00617284 + txt002 + SPHERE CENTER -0.380746 -0.750453 -0.0801706 RAD 0.00617284 + txt002 + SPHERE CENTER -0.387029 -0.765101 -0.0613127 RAD 0.00617284 + txt002 + SPHERE CENTER -0.375782 -0.743549 -0.0569896 RAD 0.00617284 + txt002 + SPHERE CENTER -0.365116 -0.854538 -0.0178949 RAD 0.0185185 + txt002 + SPHERE CENTER -0.365674 -0.878086 -0.0104889 RAD 0.00617284 + txt002 + SPHERE CENTER -0.346241 -0.863875 -0.00500196 RAD 0.00617284 + txt002 + SPHERE CENTER -0.367962 -0.859887 0.00604126 RAD 0.00617284 + txt002 + SPHERE CENTER -0.384548 -0.868748 -0.0233819 RAD 0.00617284 + txt002 + SPHERE CENTER -0.386837 -0.85055 -0.00685171 RAD 0.00617284 + txt002 + SPHERE CENTER -0.38399 -0.8452 -0.0307879 RAD 0.00617284 + txt002 + SPHERE CENTER -0.362827 -0.872736 -0.0344251 RAD 0.00617284 + txt002 + SPHERE CENTER -0.362269 -0.849188 -0.0418311 RAD 0.00617284 + txt002 + SPHERE CENTER -0.343394 -0.858526 -0.0289382 RAD 0.00617284 + txt002 + SPHERE CENTER -0.316097 -0.818893 -0.0604812 RAD 0.0185185 + txt002 + SPHERE CENTER -0.297057 -0.819591 -0.076187 RAD 0.00617284 + txt002 + SPHERE CENTER -0.304244 -0.79807 -0.0664462 RAD 0.00617284 + txt002 + SPHERE CENTER -0.293153 -0.814956 -0.0522508 RAD 0.00617284 + txt002 + SPHERE CENTER -0.30891 -0.840413 -0.070222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.305006 -0.835779 -0.0462858 RAD 0.00617284 + txt002 + SPHERE CENTER -0.32795 -0.839716 -0.0545162 RAD 0.00617284 + txt002 + SPHERE CENTER -0.320001 -0.823527 -0.0844174 RAD 0.00617284 + txt002 + SPHERE CENTER -0.339041 -0.822829 -0.0687117 RAD 0.00617284 + txt002 + SPHERE CENTER -0.327188 -0.802007 -0.0746767 RAD 0.00617284 + txt002 + SPHERE CENTER -0.296284 -0.842728 0.00679642 RAD 0.0185185 + txt002 + SPHERE CENTER -0.272611 -0.848999 0.00994863 RAD 0.00617284 + txt002 + SPHERE CENTER -0.278432 -0.829121 -0.00349164 RAD 0.00617284 + txt002 + SPHERE CENTER -0.281616 -0.828835 0.0209919 RAD 0.00617284 + txt002 + SPHERE CENTER -0.290462 -0.862606 0.0202367 RAD 0.00617284 + txt002 + SPHERE CENTER -0.299468 -0.842441 0.0312799 RAD 0.00617284 + txt002 + SPHERE CENTER -0.314135 -0.856335 0.0170845 RAD 0.00617284 + txt002 + SPHERE CENTER -0.287278 -0.862893 -0.0042468 RAD 0.00617284 + txt002 + SPHERE CENTER -0.310951 -0.856621 -0.00739901 RAD 0.00617284 + txt002 + SPHERE CENTER -0.293099 -0.843015 -0.0176871 RAD 0.00617284 + txt002 + SPHERE CENTER -0.358439 -0.594141 0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER -0.389119 -0.547576 0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER -0.386849 -0.525642 0.170979 RAD 0.00617284 + txt002 + SPHERE CENTER -0.366733 -0.538964 0.165731 RAD 0.00617284 + txt002 + SPHERE CENTER -0.379645 -0.528407 0.147525 RAD 0.00617284 + txt002 + SPHERE CENTER -0.409235 -0.534255 0.165118 RAD 0.00617284 + txt002 + SPHERE CENTER -0.402031 -0.537019 0.141664 RAD 0.00617284 + txt002 + SPHERE CENTER -0.411505 -0.556189 0.154009 RAD 0.00617284 + txt002 + SPHERE CENTER -0.396323 -0.544812 0.183325 RAD 0.00617284 + txt002 + SPHERE CENTER -0.398593 -0.566746 0.172216 RAD 0.00617284 + txt002 + SPHERE CENTER -0.376207 -0.558134 0.178077 RAD 0.00617284 + txt002 + SPHERE CENTER -0.317871 -0.566667 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.299647 -0.551072 0.172528 RAD 0.00617284 + txt002 + SPHERE CENTER -0.29885 -0.563547 0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.315344 -0.545434 0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER -0.318667 -0.554192 0.18796 RAD 0.00617284 + txt002 + SPHERE CENTER -0.334364 -0.548554 0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER -0.336891 -0.569787 0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.302174 -0.572306 0.184873 RAD 0.00617284 + txt002 + SPHERE CENTER -0.320398 -0.587901 0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.301377 -0.584781 0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.339267 -0.522591 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.327164 -0.504962 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.318612 -0.528125 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.339267 -0.522591 0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER -0.347819 -0.499428 0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER -0.359921 -0.517056 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.359921 -0.517056 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.327164 -0.504962 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.339267 -0.522591 0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER -0.318612 -0.528125 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.429687 -0.57505 0.104315 RAD 0.0185185 + txt002 + SPHERE CENTER -0.446515 -0.55776 0.109563 RAD 0.00617284 + txt002 + SPHERE CENTER -0.428387 -0.562617 0.125608 RAD 0.00617284 + txt002 + SPHERE CENTER -0.423296 -0.5512 0.104315 RAD 0.00617284 + txt002 + SPHERE CENTER -0.447815 -0.570193 0.0882695 RAD 0.00617284 + txt002 + SPHERE CENTER -0.424596 -0.563633 0.0830215 RAD 0.00617284 + txt002 + SPHERE CENTER -0.430987 -0.587483 0.0830215 RAD 0.00617284 + txt002 + SPHERE CENTER -0.452905 -0.58161 0.109563 RAD 0.00617284 + txt002 + SPHERE CENTER -0.436077 -0.5989 0.104315 RAD 0.00617284 + txt002 + SPHERE CENTER -0.434777 -0.586467 0.125608 RAD 0.00617284 + txt002 + SPHERE CENTER -0.379835 -0.550064 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.372012 -0.535334 0.0373488 RAD 0.00617284 + txt002 + SPHERE CENTER -0.359551 -0.536327 0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER -0.35918 -0.555599 0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.392296 -0.549071 0.0342624 RAD 0.00617284 + txt002 + SPHERE CENTER -0.379464 -0.569335 0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.400119 -0.563801 0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER -0.392667 -0.529799 0.0496945 RAD 0.00617284 + txt002 + SPHERE CENTER -0.400489 -0.54453 0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.380205 -0.530793 0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.399007 -0.621614 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.420252 -0.632748 0.0496945 RAD 0.00617284 + txt002 + SPHERE CENTER -0.408963 -0.638118 0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.419661 -0.61608 0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.410295 -0.616244 0.0342624 RAD 0.00617284 + txt002 + SPHERE CENTER -0.409705 -0.599576 0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER -0.38905 -0.60511 0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.399597 -0.638282 0.0373488 RAD 0.00617284 + txt002 + SPHERE CENTER -0.378352 -0.627149 0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.388308 -0.643653 0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER -0.408291 -0.619127 0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER -0.415912 -0.617918 0.183325 RAD 0.00617284 + txt002 + SPHERE CENTER -0.39183 -0.616439 0.178077 RAD 0.00617284 + txt002 + SPHERE CENTER -0.406911 -0.597788 0.172216 RAD 0.00617284 + txt002 + SPHERE CENTER -0.432372 -0.620605 0.165118 RAD 0.00617284 + txt002 + SPHERE CENTER -0.423371 -0.600475 0.154009 RAD 0.00617284 + txt002 + SPHERE CENTER -0.424751 -0.621814 0.141664 RAD 0.00617284 + txt002 + SPHERE CENTER -0.417292 -0.639257 0.170979 RAD 0.00617284 + txt002 + SPHERE CENTER -0.409671 -0.640465 0.147525 RAD 0.00617284 + txt002 + SPHERE CENTER -0.39321 -0.637778 0.165731 RAD 0.00617284 + txt002 + SPHERE CENTER -0.37761 -0.665691 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.375943 -0.687009 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.356956 -0.671225 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.37761 -0.665691 0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER -0.396598 -0.681475 0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER -0.398265 -0.660156 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.398265 -0.660156 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.375943 -0.687009 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.37761 -0.665691 0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER -0.356956 -0.671225 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.337042 -0.638217 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.320629 -0.641183 0.184873 RAD 0.00617284 + txt002 + SPHERE CENTER -0.313702 -0.630777 0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.328614 -0.618565 0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.34397 -0.648623 0.18796 RAD 0.00617284 + txt002 + SPHERE CENTER -0.351955 -0.626005 0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.360383 -0.645657 0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER -0.329058 -0.660835 0.172528 RAD 0.00617284 + txt002 + SPHERE CENTER -0.345471 -0.65787 0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER -0.32213 -0.65043 0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.358439 -0.594141 -0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER -0.409774 -0.542042 -0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER -0.413579 -0.517869 -0.126127 RAD 0.00617284 + txt002 + SPHERE CENTER -0.395831 -0.525596 -0.110799 RAD 0.00617284 + txt002 + SPHERE CENTER -0.393219 -0.528508 -0.135179 RAD 0.00617284 + txt002 + SPHERE CENTER -0.427522 -0.534315 -0.138161 RAD 0.00617284 + txt002 + SPHERE CENTER -0.407161 -0.544953 -0.147213 RAD 0.00617284 + txt002 + SPHERE CENTER -0.423716 -0.558488 -0.134867 RAD 0.00617284 + txt002 + SPHERE CENTER -0.430134 -0.531404 -0.113782 RAD 0.00617284 + txt002 + SPHERE CENTER -0.426328 -0.555577 -0.110488 RAD 0.00617284 + txt002 + SPHERE CENTER -0.412386 -0.539131 -0.0984536 RAD 0.00617284 + txt002 + SPHERE CENTER -0.379835 -0.550064 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.375068 -0.529037 -0.0435217 RAD 0.00617284 + txt002 + SPHERE CENTER -0.356494 -0.542624 -0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER -0.371406 -0.530412 -0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.398409 -0.536477 -0.0466081 RAD 0.00617284 + txt002 + SPHERE CENTER -0.394747 -0.537852 -0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.403175 -0.557504 -0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER -0.383497 -0.548689 -0.031176 RAD 0.00617284 + txt002 + SPHERE CENTER -0.388263 -0.569716 -0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.364922 -0.562276 -0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.339267 -0.522591 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.327164 -0.504962 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.318612 -0.528125 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.339267 -0.522591 -0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER -0.347819 -0.499428 -0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER -0.359921 -0.517056 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.359921 -0.517056 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.327164 -0.504962 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.339267 -0.522591 -0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER -0.318612 -0.528125 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.388377 -0.586119 -0.178389 RAD 0.0185185 + txt002 + SPHERE CENTER -0.399584 -0.570335 -0.193717 RAD 0.00617284 + txt002 + SPHERE CENTER -0.403942 -0.569167 -0.169441 RAD 0.00617284 + txt002 + SPHERE CENTER -0.381987 -0.562269 -0.178389 RAD 0.00617284 + txt002 + SPHERE CENTER -0.384019 -0.587286 -0.202664 RAD 0.00617284 + txt002 + SPHERE CENTER -0.366422 -0.57922 -0.187336 RAD 0.00617284 + txt002 + SPHERE CENTER -0.372813 -0.60307 -0.187336 RAD 0.00617284 + txt002 + SPHERE CENTER -0.405974 -0.594185 -0.193717 RAD 0.00617284 + txt002 + SPHERE CENTER -0.394768 -0.609969 -0.178389 RAD 0.00617284 + txt002 + SPHERE CENTER -0.410332 -0.593017 -0.169441 RAD 0.00617284 + txt002 + SPHERE CENTER -0.317871 -0.566667 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.317033 -0.562847 -0.191046 RAD 0.00617284 + txt002 + SPHERE CENTER -0.327827 -0.583171 -0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.338525 -0.561133 -0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.307077 -0.546343 -0.175614 RAD 0.00617284 + txt002 + SPHERE CENTER -0.328569 -0.544629 -0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.307914 -0.550163 -0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.296378 -0.568381 -0.178701 RAD 0.00617284 + txt002 + SPHERE CENTER -0.297216 -0.572202 -0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER -0.307172 -0.588706 -0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER -0.337042 -0.638217 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.317573 -0.64748 -0.178701 RAD 0.00617284 + txt002 + SPHERE CENTER -0.316758 -0.624481 -0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER -0.316388 -0.643752 -0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER -0.337857 -0.661216 -0.175614 RAD 0.00617284 + txt002 + SPHERE CENTER -0.336672 -0.657489 -0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.357326 -0.651954 -0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.338228 -0.641945 -0.191046 RAD 0.00617284 + txt002 + SPHERE CENTER -0.357697 -0.632683 -0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.337413 -0.618946 -0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.428945 -0.613592 -0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER -0.451897 -0.612625 -0.113782 RAD 0.00617284 + txt002 + SPHERE CENTER -0.432663 -0.614807 -0.0984536 RAD 0.00617284 + txt002 + SPHERE CENTER -0.436515 -0.593593 -0.110488 RAD 0.00617284 + txt002 + SPHERE CENTER -0.448179 -0.61141 -0.138161 RAD 0.00617284 + txt002 + SPHERE CENTER -0.432797 -0.592379 -0.134867 RAD 0.00617284 + txt002 + SPHERE CENTER -0.425227 -0.612377 -0.147213 RAD 0.00617284 + txt002 + SPHERE CENTER -0.444328 -0.632624 -0.126127 RAD 0.00617284 + txt002 + SPHERE CENTER -0.421376 -0.633591 -0.135179 RAD 0.00617284 + txt002 + SPHERE CENTER -0.425094 -0.634806 -0.110799 RAD 0.00617284 + txt002 + SPHERE CENTER -0.37761 -0.665691 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.375943 -0.687009 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.356956 -0.671225 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.37761 -0.665691 -0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER -0.396598 -0.681475 -0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER -0.398265 -0.660156 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.398265 -0.660156 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.375943 -0.687009 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.37761 -0.665691 -0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER -0.356956 -0.671225 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.399007 -0.621614 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.402865 -0.620974 -0.031176 RAD 0.00617284 + txt002 + SPHERE CENTER -0.379986 -0.618494 -0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.39648 -0.600381 -0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.421886 -0.624094 -0.0466081 RAD 0.00617284 + txt002 + SPHERE CENTER -0.4155 -0.603501 -0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER -0.418027 -0.624734 -0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.405392 -0.642207 -0.0435217 RAD 0.00617284 + txt002 + SPHERE CENTER -0.401533 -0.642848 -0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.382513 -0.639728 -0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER -0.157543 -0.835815 -0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER -0.119969 -0.899353 -0.117284 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0977075 -0.909872 -0.115431 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0997803 -0.886771 -0.1239 RAD 0.00617284 + txt002 + SPHERE CENTER -0.104052 -0.891613 -0.100068 RAD 0.00617284 + txt002 + SPHERE CENTER -0.117896 -0.922453 -0.108814 RAD 0.00617284 + txt002 + SPHERE CENTER -0.124241 -0.904194 -0.0934517 RAD 0.00617284 + txt002 + SPHERE CENTER -0.140158 -0.911935 -0.110668 RAD 0.00617284 + txt002 + SPHERE CENTER -0.113625 -0.917612 -0.132647 RAD 0.00617284 + txt002 + SPHERE CENTER -0.135886 -0.907093 -0.1345 RAD 0.00617284 + txt002 + SPHERE CENTER -0.115698 -0.894512 -0.141116 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0844101 -0.836885 -0.099389 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0627848 -0.826973 -0.106005 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0805529 -0.830202 -0.122844 RAD 0.00617284 + txt002 + SPHERE CENTER -0.083104 -0.81296 -0.105354 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0666419 -0.833656 -0.0825505 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0869612 -0.819643 -0.0818993 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0882673 -0.843568 -0.0759343 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0640908 -0.850898 -0.10004 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0857161 -0.860809 -0.093424 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0818589 -0.854126 -0.116879 RAD 0.00617284 + txt002 + SPHERE CENTER -0.130205 -0.868703 -0.0506299 RAD 0.0185185 + txt002 + SPHERE CENTER -0.11253 -0.867758 -0.0334138 RAD 0.00617284 + txt002 + SPHERE CENTER -0.107566 -0.860854 -0.0565949 RAD 0.00617284 + txt002 + SPHERE CENTER -0.122142 -0.846864 -0.0423994 RAD 0.00617284 + txt002 + SPHERE CENTER -0.135168 -0.875606 -0.0274488 RAD 0.00617284 + txt002 + SPHERE CENTER -0.14478 -0.854713 -0.0364345 RAD 0.00617284 + txt002 + SPHERE CENTER -0.152843 -0.876551 -0.0446649 RAD 0.00617284 + txt002 + SPHERE CENTER -0.120593 -0.889596 -0.0416443 RAD 0.00617284 + txt002 + SPHERE CENTER -0.138267 -0.890541 -0.0588603 RAD 0.00617284 + txt002 + SPHERE CENTER -0.115629 -0.882692 -0.0648253 RAD 0.00617284 + txt002 + SPHERE CENTER -0.193102 -0.898283 -0.129006 RAD 0.0185185 + txt002 + SPHERE CENTER -0.201143 -0.920038 -0.120537 RAD 0.00617284 + txt002 + SPHERE CENTER -0.17991 -0.910616 -0.112168 RAD 0.00617284 + txt002 + SPHERE CENTER -0.201384 -0.900209 -0.105825 RAD 0.00617284 + txt002 + SPHERE CENTER -0.214335 -0.907705 -0.137375 RAD 0.00617284 + txt002 + SPHERE CENTER -0.214576 -0.887876 -0.122663 RAD 0.00617284 + txt002 + SPHERE CENTER -0.206294 -0.88595 -0.145845 RAD 0.00617284 + txt002 + SPHERE CENTER -0.192861 -0.918112 -0.143718 RAD 0.00617284 + txt002 + SPHERE CENTER -0.18482 -0.896357 -0.152187 RAD 0.00617284 + txt002 + SPHERE CENTER -0.171628 -0.90869 -0.135349 RAD 0.00617284 + txt002 + SPHERE CENTER -0.203337 -0.867633 -0.062352 RAD 0.0185185 + txt002 + SPHERE CENTER -0.209658 -0.868948 -0.0385197 RAD 0.00617284 + txt002 + SPHERE CENTER -0.186008 -0.865773 -0.0448623 RAD 0.00617284 + txt002 + SPHERE CENTER -0.202239 -0.84746 -0.0481565 RAD 0.00617284 + txt002 + SPHERE CENTER -0.226988 -0.870808 -0.0560094 RAD 0.00617284 + txt002 + SPHERE CENTER -0.219569 -0.84932 -0.0656463 RAD 0.00617284 + txt002 + SPHERE CENTER -0.220667 -0.869493 -0.0798417 RAD 0.00617284 + txt002 + SPHERE CENTER -0.210757 -0.889121 -0.0527151 RAD 0.00617284 + txt002 + SPHERE CENTER -0.204436 -0.887806 -0.0765474 RAD 0.00617284 + txt002 + SPHERE CENTER -0.187106 -0.885946 -0.0590577 RAD 0.00617284 + txt002 + SPHERE CENTER -0.230676 -0.834745 -0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER -0.252002 -0.824206 -0.116217 RAD 0.00617284 + txt002 + SPHERE CENTER -0.234336 -0.827952 -0.0993785 RAD 0.00617284 + txt002 + SPHERE CENTER -0.231282 -0.810793 -0.116868 RAD 0.00617284 + txt002 + SPHERE CENTER -0.248342 -0.830999 -0.139672 RAD 0.00617284 + txt002 + SPHERE CENTER -0.227621 -0.817586 -0.140323 RAD 0.00617284 + txt002 + SPHERE CENTER -0.227016 -0.841538 -0.146288 RAD 0.00617284 + txt002 + SPHERE CENTER -0.251396 -0.848158 -0.122182 RAD 0.00617284 + txt002 + SPHERE CENTER -0.23007 -0.858698 -0.128798 RAD 0.00617284 + txt002 + SPHERE CENTER -0.23373 -0.851905 -0.105343 RAD 0.00617284 + txt002 + SPHERE CENTER -0.147308 -0.866465 -0.177765 RAD 0.0185185 + txt002 + SPHERE CENTER -0.130609 -0.876203 -0.193128 RAD 0.00617284 + txt002 + SPHERE CENTER -0.124356 -0.857385 -0.178416 RAD 0.00617284 + txt002 + SPHERE CENTER -0.128522 -0.879733 -0.16878 RAD 0.00617284 + txt002 + SPHERE CENTER -0.153561 -0.885283 -0.192477 RAD 0.00617284 + txt002 + SPHERE CENTER -0.151474 -0.888813 -0.168128 RAD 0.00617284 + txt002 + SPHERE CENTER -0.170259 -0.875546 -0.177114 RAD 0.00617284 + txt002 + SPHERE CENTER -0.149395 -0.862935 -0.202114 RAD 0.00617284 + txt002 + SPHERE CENTER -0.166093 -0.853198 -0.186751 RAD 0.00617284 + txt002 + SPHERE CENTER -0.143141 -0.844117 -0.187402 RAD 0.00617284 + txt002 + SPHERE CENTER -0.184881 -0.802927 -0.171592 RAD 0.0185185 + txt002 + SPHERE CENTER -0.180723 -0.785723 -0.188808 RAD 0.00617284 + txt002 + SPHERE CENTER -0.173028 -0.782104 -0.165627 RAD 0.00617284 + txt002 + SPHERE CENTER -0.161937 -0.798991 -0.179823 RAD 0.00617284 + txt002 + SPHERE CENTER -0.192576 -0.806546 -0.194773 RAD 0.00617284 + txt002 + SPHERE CENTER -0.17379 -0.819813 -0.185788 RAD 0.00617284 + txt002 + SPHERE CENTER -0.196734 -0.82375 -0.177557 RAD 0.00617284 + txt002 + SPHERE CENTER -0.203667 -0.78966 -0.180578 RAD 0.00617284 + txt002 + SPHERE CENTER -0.207825 -0.806864 -0.163362 RAD 0.00617284 + txt002 + SPHERE CENTER -0.195972 -0.786041 -0.157397 RAD 0.00617284 + txt002 + SPHERE CENTER -0.111748 -0.803997 -0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER -0.108311 -0.798532 -0.183703 RAD 0.00617284 + txt002 + SPHERE CENTER -0.119537 -0.819589 -0.17736 RAD 0.00617284 + txt002 + SPHERE CENTER -0.131037 -0.797989 -0.174066 RAD 0.00617284 + txt002 + SPHERE CENTER -0.100522 -0.78294 -0.166213 RAD 0.00617284 + txt002 + SPHERE CENTER -0.123249 -0.782397 -0.156576 RAD 0.00617284 + txt002 + SPHERE CENTER -0.10396 -0.788405 -0.142381 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0890219 -0.80454 -0.169507 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0924597 -0.810005 -0.145675 RAD 0.00617284 + txt002 + SPHERE CENTER -0.100248 -0.825597 -0.163165 RAD 0.00617284 + txt002 + SPHERE CENTER -0.172546 -0.643951 -0.222222 RAD 0.0555556 + txt002 + SPHERE CENTER -0.202787 -0.61371 -0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER -0.200937 -0.595399 -0.299164 RAD 0.00617284 + txt002 + SPHERE CENTER -0.194794 -0.591462 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER -0.180539 -0.605717 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER -0.208929 -0.617647 -0.306292 RAD 0.00617284 + txt002 + SPHERE CENTER -0.188531 -0.627965 -0.296959 RAD 0.00617284 + txt002 + SPHERE CENTER -0.210779 -0.635958 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER -0.223185 -0.603392 -0.292037 RAD 0.00617284 + txt002 + SPHERE CENTER -0.225035 -0.621702 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER -0.217042 -0.599454 -0.268448 RAD 0.00617284 + txt002 + SPHERE CENTER -0.244096 -0.624779 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.260374 -0.607636 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER -0.240901 -0.612854 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.237705 -0.600929 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.26357 -0.619561 -0.236478 RAD 0.00617284 + txt002 + SPHERE CENTER -0.240901 -0.612854 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.247291 -0.636704 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.266765 -0.631486 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER -0.250487 -0.648629 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.247291 -0.636704 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.191718 -0.5724 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.185011 -0.549732 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER -0.167868 -0.56601 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.179793 -0.569205 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.208861 -0.556122 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER -0.203643 -0.575596 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.215568 -0.578791 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.196936 -0.552927 -0.207967 RAD 0.00617284 + txt002 + SPHERE CENTER -0.203643 -0.575596 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.179793 -0.569205 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.131237 -0.632882 -0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER -0.131575 -0.625593 -0.306292 RAD 0.00617284 + txt002 + SPHERE CENTER -0.15071 -0.6381 -0.296959 RAD 0.00617284 + txt002 + SPHERE CENTER -0.146508 -0.614836 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER -0.112102 -0.620375 -0.292037 RAD 0.00617284 + txt002 + SPHERE CENTER -0.127034 -0.609618 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER -0.111763 -0.627664 -0.268448 RAD 0.00617284 + txt002 + SPHERE CENTER -0.116304 -0.643639 -0.299164 RAD 0.00617284 + txt002 + SPHERE CENTER -0.115965 -0.650927 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER -0.135439 -0.656145 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER -0.120168 -0.591572 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.105912 -0.577317 -0.236478 RAD 0.00617284 + txt002 + SPHERE CENTER -0.111438 -0.600302 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.128897 -0.582843 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.114642 -0.568587 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER -0.137627 -0.574113 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.128897 -0.582843 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0971825 -0.586046 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER -0.111438 -0.600302 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.102708 -0.609032 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.100996 -0.663122 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0783272 -0.656415 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0978007 -0.651197 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0946054 -0.639272 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0815225 -0.66834 -0.207967 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0978007 -0.651197 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.104191 -0.675047 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0847178 -0.680265 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER -0.107387 -0.686972 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.104191 -0.675047 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.183615 -0.68526 -0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER -0.182351 -0.708085 -0.292037 RAD 0.00617284 + txt002 + SPHERE CENTER -0.165569 -0.700531 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER -0.188833 -0.704733 -0.268448 RAD 0.00617284 + txt002 + SPHERE CENTER -0.200397 -0.692813 -0.299164 RAD 0.00617284 + txt002 + SPHERE CENTER -0.206879 -0.689462 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER -0.201661 -0.669989 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER -0.177134 -0.688611 -0.306292 RAD 0.00617284 + txt002 + SPHERE CENTER -0.178397 -0.665787 -0.296959 RAD 0.00617284 + txt002 + SPHERE CENTER -0.160351 -0.681058 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER -0.153374 -0.715501 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.136231 -0.731779 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER -0.129524 -0.70911 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.141449 -0.712305 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.160081 -0.738169 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER -0.165299 -0.718696 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.177224 -0.721891 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.148156 -0.734974 -0.236478 RAD 0.00617284 + txt002 + SPHERE CENTER -0.165299 -0.718696 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.141449 -0.712305 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.224924 -0.696329 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.23918 -0.710584 -0.207967 RAD 0.00617284 + txt002 + SPHERE CENTER -0.216195 -0.705059 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.233654 -0.687599 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.24791 -0.701855 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER -0.242384 -0.678869 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.233654 -0.687599 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.23045 -0.719314 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER -0.216195 -0.705059 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.207465 -0.713788 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0133465 -0.69376 -0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER 0.0631985 -0.668775 -0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0667914 -0.661946 -0.183325 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0511945 -0.680354 -0.178077 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0452771 -0.65711 -0.172216 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0787954 -0.650366 -0.165118 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0572811 -0.64553 -0.154009 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0752026 -0.657195 -0.141664 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0847128 -0.673611 -0.170979 RAD 0.00617284 + txt002 + SPHERE CENTER 0.08112 -0.680439 -0.147525 RAD 0.00617284 + txt002 + SPHERE CENTER 0.069116 -0.692019 -0.165731 RAD 0.00617284 + txt002 + SPHERE CENTER -0.00804971 -0.649684 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.000226782 -0.634953 -0.184873 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0122343 -0.635947 -0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.012605 -0.655218 -0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0205108 -0.64869 -0.18796 RAD 0.00617284 + txt002 + SPHERE CENTER -0.00767898 -0.668955 -0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0283337 -0.66342 -0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0208815 -0.629419 -0.172528 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0287044 -0.644149 -0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER -0.00842045 -0.630413 -0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0325183 -0.62221 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0446211 -0.604582 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.053173 -0.627745 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0325183 -0.62221 -0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0239663 -0.599047 -0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0118635 -0.616676 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0118635 -0.616676 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0446211 -0.604582 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0325183 -0.62221 -0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER 0.053173 -0.627745 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0845947 -0.712851 -0.104315 RAD 0.0185185 + txt002 + SPHERE CENTER 0.107813 -0.706291 -0.109563 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0896851 -0.701434 -0.125608 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0909853 -0.689001 -0.104315 RAD 0.00617284 + txt002 + SPHERE CENTER 0.102723 -0.717709 -0.0882695 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0858949 -0.700418 -0.0830215 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0795043 -0.724268 -0.0830215 RAD 0.00617284 + txt002 + SPHERE CENTER 0.101422 -0.730141 -0.109563 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0782041 -0.736701 -0.104315 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0832945 -0.725284 -0.125608 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0539145 -0.666287 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0721382 -0.650692 -0.0496945 RAD 0.00617284 + txt002 + SPHERE CENTER 0.072935 -0.663167 -0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0564414 -0.645053 -0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0531177 -0.653812 -0.0342624 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0374209 -0.648173 -0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER 0.034894 -0.669407 -0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0696112 -0.671925 -0.0373488 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0513875 -0.68752 -0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.070408 -0.6844 -0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0347427 -0.737837 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0511556 -0.740802 -0.0373488 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0580833 -0.730397 -0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER 0.043171 -0.718185 -0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.027815 -0.748242 -0.0342624 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0198304 -0.725625 -0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0114021 -0.745277 -0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0427273 -0.760455 -0.0496945 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0263144 -0.757489 -0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0496549 -0.750049 -0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0440268 -0.740325 -0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0650768 -0.746894 -0.170979 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0607735 -0.723153 -0.165731 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0653796 -0.739183 -0.147525 RAD 0.00617284 + txt002 + SPHERE CENTER 0.04833 -0.764065 -0.165118 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0486329 -0.756355 -0.141664 RAD 0.00617284 + txt002 + SPHERE CENTER 0.02728 -0.757496 -0.154009 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0437239 -0.748035 -0.183325 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0226739 -0.741466 -0.172216 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0394207 -0.724295 -0.178077 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0058253 -0.76531 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.00415829 -0.786629 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0148294 -0.770845 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0058253 -0.76531 -0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER -0.024813 -0.781094 -0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER -0.02648 -0.759776 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.02648 -0.759776 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.00415829 -0.786629 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0058253 -0.76531 -0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0148294 -0.770845 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0272215 -0.721234 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0484665 -0.732368 -0.172528 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0371781 -0.737738 -0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0478762 -0.715699 -0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0385099 -0.715864 -0.18796 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0379196 -0.699195 -0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0172649 -0.70473 -0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0278118 -0.737902 -0.184873 RAD 0.00617284 + txt002 + SPHERE CENTER -0.00656677 -0.726768 -0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0165234 -0.743272 -0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.471405 -0.471405 1.11022e-16 RAD 0.166667 + txt002 + SPHERE CENTER 0.690426 -0.508983 1.83812e-16 RAD 0.0555556 + txt002 + SPHERE CENTER 0.755941 -0.484794 -0.0246914 RAD 0.0185185 + txt002 + SPHERE CENTER 0.767658 -0.47411 -0.0436186 RAD 0.00617284 + txt002 + SPHERE CENTER 0.749038 -0.489758 -0.0478724 RAD 0.00617284 + txt002 + SPHERE CENTER 0.744501 -0.467528 -0.0381316 RAD 0.00617284 + txt002 + SPHERE CENTER 0.774562 -0.469146 -0.0204376 RAD 0.00617284 + txt002 + SPHERE CENTER 0.751405 -0.462564 -0.0149506 RAD 0.00617284 + txt002 + SPHERE CENTER 0.762845 -0.47983 -0.00151032 RAD 0.00617284 + txt002 + SPHERE CENTER 0.779098 -0.491377 -0.0301783 RAD 0.00617284 + txt002 + SPHERE CENTER 0.767382 -0.502061 -0.0112511 RAD 0.00617284 + txt002 + SPHERE CENTER 0.760478 -0.507025 -0.0344321 RAD 0.00617284 + txt002 + SPHERE CENTER 0.695668 -0.478434 -0.0672777 RAD 0.0185185 + txt002 + SPHERE CENTER 0.703418 -0.481931 -0.0904587 RAD 0.00617284 + txt002 + SPHERE CENTER 0.716184 -0.491475 -0.0716007 RAD 0.00617284 + txt002 + SPHERE CENTER 0.694124 -0.500827 -0.0775657 RAD 0.00617284 + txt002 + SPHERE CENTER 0.682902 -0.46889 -0.0861356 RAD 0.00617284 + txt002 + SPHERE CENTER 0.673608 -0.487786 -0.0732426 RAD 0.00617284 + txt002 + SPHERE CENTER 0.675152 -0.465393 -0.0629546 RAD 0.00617284 + txt002 + SPHERE CENTER 0.704962 -0.459538 -0.0801706 RAD 0.00617284 + txt002 + SPHERE CENTER 0.697211 -0.456041 -0.0569896 RAD 0.00617284 + txt002 + SPHERE CENTER 0.717727 -0.469082 -0.0613127 RAD 0.00617284 + txt002 + SPHERE CENTER 0.7029 -0.436283 -0.00679642 RAD 0.0185185 + txt002 + SPHERE CENTER 0.714226 -0.418941 -0.0202367 RAD 0.00617284 + txt002 + SPHERE CENTER 0.724842 -0.44101 -0.0170845 RAD 0.00617284 + txt002 + SPHERE CENTER 0.704751 -0.43889 -0.0312799 RAD 0.00617284 + txt002 + SPHERE CENTER 0.692283 -0.414215 -0.00994863 RAD 0.00617284 + txt002 + SPHERE CENTER 0.682808 -0.434163 -0.0209919 RAD 0.00617284 + txt002 + SPHERE CENTER 0.680957 -0.431557 0.00349164 RAD 0.00617284 + txt002 + SPHERE CENTER 0.712374 -0.416335 0.0042468 RAD 0.00617284 + txt002 + SPHERE CENTER 0.701048 -0.433677 0.0176871 RAD 0.00617284 + txt002 + SPHERE CENTER 0.722991 -0.438403 0.00739901 RAD 0.00617284 + txt002 + SPHERE CENTER 0.7507 -0.515343 0.0425863 RAD 0.0185185 + txt002 + SPHERE CENTER 0.773394 -0.506594 0.0468401 RAD 0.00617284 + txt002 + SPHERE CENTER 0.764807 -0.507924 0.0237283 RAD 0.00617284 + txt002 + SPHERE CENTER 0.755462 -0.491321 0.0394341 RAD 0.00617284 + txt002 + SPHERE CENTER 0.759287 -0.514012 0.065698 RAD 0.00617284 + txt002 + SPHERE CENTER 0.741355 -0.49874 0.058292 RAD 0.00617284 + txt002 + SPHERE CENTER 0.736593 -0.522762 0.0614442 RAD 0.00617284 + txt002 + SPHERE CENTER 0.768632 -0.530616 0.0499923 RAD 0.00617284 + txt002 + SPHERE CENTER 0.745938 -0.539365 0.0457385 RAD 0.00617284 + txt002 + SPHERE CENTER 0.760045 -0.531946 0.0268805 RAD 0.00617284 + txt002 + SPHERE CENTER 0.697658 -0.466832 0.0604812 RAD 0.0185185 + txt002 + SPHERE CENTER 0.709346 -0.447385 0.070222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.721188 -0.46231 0.0545162 RAD 0.00617284 + txt002 + SPHERE CENTER 0.703286 -0.447429 0.0462858 RAD 0.00617284 + txt002 + SPHERE CENTER 0.685816 -0.451907 0.076187 RAD 0.00617284 + txt002 + SPHERE CENTER 0.679757 -0.451951 0.0522508 RAD 0.00617284 + txt002 + SPHERE CENTER 0.674129 -0.471354 0.0664462 RAD 0.00617284 + txt002 + SPHERE CENTER 0.703718 -0.466788 0.0844174 RAD 0.00617284 + txt002 + SPHERE CENTER 0.692031 -0.486235 0.0746767 RAD 0.00617284 + txt002 + SPHERE CENTER 0.71556 -0.481713 0.0687117 RAD 0.00617284 + txt002 + SPHERE CENTER 0.685185 -0.539531 0.0672777 RAD 0.0185185 + txt002 + SPHERE CENTER 0.693658 -0.538818 0.0904587 RAD 0.00617284 + txt002 + SPHERE CENTER 0.708875 -0.534075 0.0716007 RAD 0.00617284 + txt002 + SPHERE CENTER 0.691194 -0.517905 0.0775657 RAD 0.00617284 + txt002 + SPHERE CENTER 0.669969 -0.544274 0.0861356 RAD 0.00617284 + txt002 + SPHERE CENTER 0.667505 -0.523361 0.0732426 RAD 0.00617284 + txt002 + SPHERE CENTER 0.661495 -0.544988 0.0629546 RAD 0.00617284 + txt002 + SPHERE CENTER 0.687649 -0.560445 0.0801706 RAD 0.00617284 + txt002 + SPHERE CENTER 0.679176 -0.561158 0.0569896 RAD 0.00617284 + txt002 + SPHERE CENTER 0.702866 -0.555702 0.0613127 RAD 0.00617284 + txt002 + SPHERE CENTER 0.743468 -0.557494 -0.0178949 RAD 0.0185185 + txt002 + SPHERE CENTER 0.767402 -0.560084 -0.0233819 RAD 0.00617284 + txt002 + SPHERE CENTER 0.755145 -0.53997 -0.0307879 RAD 0.00617284 + txt002 + SPHERE CENTER 0.760285 -0.543179 -0.00685171 RAD 0.00617284 + txt002 + SPHERE CENTER 0.755725 -0.577608 -0.0104889 RAD 0.00617284 + txt002 + SPHERE CENTER 0.748608 -0.560703 0.00604126 RAD 0.00617284 + txt002 + SPHERE CENTER 0.731791 -0.575017 -0.00500196 RAD 0.00617284 + txt002 + SPHERE CENTER 0.750585 -0.574398 -0.0344251 RAD 0.00617284 + txt002 + SPHERE CENTER 0.726651 -0.571808 -0.0289382 RAD 0.00617284 + txt002 + SPHERE CENTER 0.738328 -0.554284 -0.0418311 RAD 0.00617284 + txt002 + SPHERE CENTER 0.677953 -0.581682 0.00679642 RAD 0.0185185 + txt002 + SPHERE CENTER 0.682851 -0.601808 0.0202367 RAD 0.00617284 + txt002 + SPHERE CENTER 0.700216 -0.58454 0.0170845 RAD 0.00617284 + txt002 + SPHERE CENTER 0.680568 -0.579842 0.0312799 RAD 0.00617284 + txt002 + SPHERE CENTER 0.660588 -0.59895 0.00994863 RAD 0.00617284 + txt002 + SPHERE CENTER 0.658304 -0.576984 0.0209919 RAD 0.00617284 + txt002 + SPHERE CENTER 0.65569 -0.578824 -0.00349164 RAD 0.00617284 + txt002 + SPHERE CENTER 0.680237 -0.603648 -0.0042468 RAD 0.00617284 + txt002 + SPHERE CENTER 0.675339 -0.583522 -0.0176871 RAD 0.00617284 + txt002 + SPHERE CENTER 0.697602 -0.58638 -0.00739901 RAD 0.00617284 + txt002 + SPHERE CENTER 0.683194 -0.551134 -0.0604812 RAD 0.0185185 + txt002 + SPHERE CENTER 0.687731 -0.573364 -0.070222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.703871 -0.56324 -0.0545162 RAD 0.00617284 + txt002 + SPHERE CENTER 0.682033 -0.571303 -0.0462858 RAD 0.00617284 + txt002 + SPHERE CENTER 0.667055 -0.561258 -0.076187 RAD 0.00617284 + txt002 + SPHERE CENTER 0.661356 -0.559196 -0.0522508 RAD 0.00617284 + txt002 + SPHERE CENTER 0.662518 -0.539027 -0.0664462 RAD 0.00617284 + txt002 + SPHERE CENTER 0.688893 -0.553195 -0.0844174 RAD 0.00617284 + txt002 + SPHERE CENTER 0.684356 -0.530964 -0.0746767 RAD 0.00617284 + txt002 + SPHERE CENTER 0.705033 -0.543071 -0.0687117 RAD 0.00617284 + txt002 + SPHERE CENTER 0.607487 -0.335322 -0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER 0.629404 -0.313405 -0.178389 RAD 0.0185185 + txt002 + SPHERE CENTER 0.626214 -0.316595 -0.202664 RAD 0.00617284 + txt002 + SPHERE CENTER 0.624401 -0.335868 -0.187336 RAD 0.00617284 + txt002 + SPHERE CENTER 0.606941 -0.318408 -0.187336 RAD 0.00617284 + txt002 + SPHERE CENTER 0.631217 -0.294133 -0.193717 RAD 0.00617284 + txt002 + SPHERE CENTER 0.611945 -0.295946 -0.178389 RAD 0.00617284 + txt002 + SPHERE CENTER 0.634407 -0.290942 -0.169441 RAD 0.00617284 + txt002 + SPHERE CENTER 0.648676 -0.311592 -0.193717 RAD 0.00617284 + txt002 + SPHERE CENTER 0.651867 -0.308402 -0.169441 RAD 0.00617284 + txt002 + SPHERE CENTER 0.646863 -0.330864 -0.178389 RAD 0.00617284 + txt002 + SPHERE CENTER 0.610996 -0.384191 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.623201 -0.403702 -0.175614 RAD 0.00617284 + txt002 + SPHERE CENTER 0.635431 -0.385946 -0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.62031 -0.401066 -0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.598766 -0.401947 -0.178701 RAD 0.00617284 + txt002 + SPHERE CENTER 0.595876 -0.399312 -0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER 0.586561 -0.382437 -0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER 0.613886 -0.386827 -0.191046 RAD 0.00617284 + txt002 + SPHERE CENTER 0.601681 -0.367317 -0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.626116 -0.369071 -0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.558618 -0.331813 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.539107 -0.319608 -0.175614 RAD 0.00617284 + txt002 + SPHERE CENTER 0.541743 -0.322499 -0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.556863 -0.307378 -0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.555982 -0.328923 -0.191046 RAD 0.00617284 + txt002 + SPHERE CENTER 0.573738 -0.316693 -0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.575492 -0.341128 -0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.540862 -0.344043 -0.178701 RAD 0.00617284 + txt002 + SPHERE CENTER 0.560372 -0.356248 -0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER 0.543497 -0.346933 -0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER 0.625895 -0.264535 -0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER 0.637402 -0.248969 -0.138161 RAD 0.00617284 + txt002 + SPHERE CENTER 0.646193 -0.271807 -0.134867 RAD 0.00617284 + txt002 + SPHERE CENTER 0.625088 -0.268363 -0.147213 RAD 0.00617284 + txt002 + SPHERE CENTER 0.617105 -0.241698 -0.126127 RAD 0.00617284 + txt002 + SPHERE CENTER 0.604791 -0.261092 -0.135179 RAD 0.00617284 + txt002 + SPHERE CENTER 0.605598 -0.257264 -0.110799 RAD 0.00617284 + txt002 + SPHERE CENTER 0.638209 -0.245142 -0.113782 RAD 0.00617284 + txt002 + SPHERE CENTER 0.626702 -0.260708 -0.0984536 RAD 0.00617284 + txt002 + SPHERE CENTER 0.647 -0.267979 -0.110488 RAD 0.00617284 + txt002 + SPHERE CENTER 0.555109 -0.282943 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.550934 -0.258608 -0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER 0.570229 -0.267823 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.570229 -0.267823 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.535813 -0.273728 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.555109 -0.282943 -0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER 0.539989 -0.298064 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.535813 -0.273728 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.539989 -0.298064 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.555109 -0.282943 -0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER 0.603979 -0.286452 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.613271 -0.265398 -0.0466081 RAD 0.00617284 + txt002 + SPHERE CENTER 0.627912 -0.281225 -0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER 0.610787 -0.26842 -0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.589337 -0.270625 -0.0435217 RAD 0.00617284 + txt002 + SPHERE CENTER 0.586853 -0.273647 -0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.580045 -0.291679 -0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER 0.606463 -0.283431 -0.031176 RAD 0.00617284 + txt002 + SPHERE CENTER 0.59717 -0.304484 -0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.621104 -0.299257 -0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.678274 -0.316914 -0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER 0.69384 -0.305407 -0.138161 RAD 0.00617284 + txt002 + SPHERE CENTER 0.674446 -0.317721 -0.147213 RAD 0.00617284 + txt002 + SPHERE CENTER 0.671002 -0.296616 -0.134867 RAD 0.00617284 + txt002 + SPHERE CENTER 0.697667 -0.3046 -0.113782 RAD 0.00617284 + txt002 + SPHERE CENTER 0.67483 -0.295809 -0.110488 RAD 0.00617284 + txt002 + SPHERE CENTER 0.682101 -0.316107 -0.0984536 RAD 0.00617284 + txt002 + SPHERE CENTER 0.701111 -0.325704 -0.126127 RAD 0.00617284 + txt002 + SPHERE CENTER 0.685545 -0.337211 -0.110799 RAD 0.00617284 + txt002 + SPHERE CENTER 0.681717 -0.338018 -0.135179 RAD 0.00617284 + txt002 + SPHERE CENTER 0.656357 -0.33883 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.677411 -0.329538 -0.0466081 RAD 0.00617284 + txt002 + SPHERE CENTER 0.674389 -0.332022 -0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.661584 -0.314897 -0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER 0.659378 -0.336346 -0.031176 RAD 0.00617284 + txt002 + SPHERE CENTER 0.643552 -0.321705 -0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.638325 -0.345639 -0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.672184 -0.353472 -0.0435217 RAD 0.00617284 + txt002 + SPHERE CENTER 0.65113 -0.362764 -0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER 0.669162 -0.355956 -0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.659866 -0.3877 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.684201 -0.391875 -0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER 0.674986 -0.37258 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.674986 -0.37258 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.669081 -0.406996 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.659866 -0.3877 -0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER 0.644745 -0.40282 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.669081 -0.406996 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.644745 -0.40282 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.659866 -0.3877 -0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER 0.607487 -0.335322 0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER 0.659645 -0.283164 0.104315 RAD 0.0185185 + txt002 + SPHERE CENTER 0.672915 -0.269894 0.0882695 RAD 0.00617284 + txt002 + SPHERE CENTER 0.666987 -0.293281 0.0830215 RAD 0.00617284 + txt002 + SPHERE CENTER 0.649528 -0.275822 0.0830215 RAD 0.00617284 + txt002 + SPHERE CENTER 0.665573 -0.259777 0.109563 RAD 0.00617284 + txt002 + SPHERE CENTER 0.642185 -0.265705 0.104315 RAD 0.00617284 + txt002 + SPHERE CENTER 0.652302 -0.273047 0.125608 RAD 0.00617284 + txt002 + SPHERE CENTER 0.683032 -0.277236 0.109563 RAD 0.00617284 + txt002 + SPHERE CENTER 0.669762 -0.290507 0.125608 RAD 0.00617284 + txt002 + SPHERE CENTER 0.677104 -0.300624 0.104315 RAD 0.00617284 + txt002 + SPHERE CENTER 0.656357 -0.33883 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.663448 -0.328536 0.0342624 RAD 0.00617284 + txt002 + SPHERE CENTER 0.639482 -0.329516 0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.654603 -0.314396 0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER 0.680322 -0.33785 0.0496945 RAD 0.00617284 + txt002 + SPHERE CENTER 0.671477 -0.32371 0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.673232 -0.348145 0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.665202 -0.35297 0.0373488 RAD 0.00617284 + txt002 + SPHERE CENTER 0.658111 -0.363265 0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER 0.641237 -0.353951 0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.603979 -0.286452 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.614273 -0.279361 0.0342624 RAD 0.00617284 + txt002 + SPHERE CENTER 0.628413 -0.288206 0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER 0.613293 -0.303327 0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.589839 -0.277607 0.0373488 RAD 0.00617284 + txt002 + SPHERE CENTER 0.588858 -0.301572 0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.579544 -0.284698 0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER 0.604959 -0.262487 0.0496945 RAD 0.00617284 + txt002 + SPHERE CENTER 0.594664 -0.269578 0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.619099 -0.271332 0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.610775 -0.279656 0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER 0.621535 -0.258061 0.165118 RAD 0.00617284 + txt002 + SPHERE CENTER 0.634468 -0.275921 0.154009 RAD 0.00617284 + txt002 + SPHERE CENTER 0.616678 -0.264057 0.141664 RAD 0.00617284 + txt002 + SPHERE CENTER 0.597842 -0.261795 0.170979 RAD 0.00617284 + txt002 + SPHERE CENTER 0.592985 -0.267791 0.147525 RAD 0.00617284 + txt002 + SPHERE CENTER 0.587082 -0.28339 0.165731 RAD 0.00617284 + txt002 + SPHERE CENTER 0.615632 -0.27366 0.183325 RAD 0.00617284 + txt002 + SPHERE CENTER 0.604872 -0.295255 0.178077 RAD 0.00617284 + txt002 + SPHERE CENTER 0.628565 -0.29152 0.172216 RAD 0.00617284 + txt002 + SPHERE CENTER 0.555109 -0.282943 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.550934 -0.258608 0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER 0.570229 -0.267823 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.570229 -0.267823 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.535813 -0.273728 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.555109 -0.282943 0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER 0.539989 -0.298064 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.535813 -0.273728 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.539989 -0.298064 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.555109 -0.282943 0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER 0.558618 -0.331813 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.55307 -0.320611 0.18796 RAD 0.00617284 + txt002 + SPHERE CENTER 0.57665 -0.325005 0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.563845 -0.30788 0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER 0.535038 -0.327419 0.172528 RAD 0.00617284 + txt002 + SPHERE CENTER 0.545813 -0.314688 0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER 0.540585 -0.338621 0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.547843 -0.344544 0.184873 RAD 0.00617284 + txt002 + SPHERE CENTER 0.553391 -0.355747 0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.571423 -0.348938 0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.663153 -0.332034 0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER 0.684748 -0.321274 0.165118 RAD 0.00617284 + txt002 + SPHERE CENTER 0.678752 -0.326131 0.141664 RAD 0.00617284 + txt002 + SPHERE CENTER 0.666888 -0.308341 0.154009 RAD 0.00617284 + txt002 + SPHERE CENTER 0.669149 -0.327177 0.183325 RAD 0.00617284 + txt002 + SPHERE CENTER 0.651289 -0.314244 0.172216 RAD 0.00617284 + txt002 + SPHERE CENTER 0.647554 -0.337937 0.178077 RAD 0.00617284 + txt002 + SPHERE CENTER 0.681014 -0.344967 0.170979 RAD 0.00617284 + txt002 + SPHERE CENTER 0.659419 -0.355727 0.165731 RAD 0.00617284 + txt002 + SPHERE CENTER 0.675018 -0.349824 0.147525 RAD 0.00617284 + txt002 + SPHERE CENTER 0.610996 -0.384191 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.622198 -0.389739 0.18796 RAD 0.00617284 + txt002 + SPHERE CENTER 0.63493 -0.378964 0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER 0.617804 -0.366159 0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.598265 -0.394966 0.184873 RAD 0.00617284 + txt002 + SPHERE CENTER 0.593871 -0.371386 0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.587062 -0.389418 0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.61539 -0.407771 0.172528 RAD 0.00617284 + txt002 + SPHERE CENTER 0.604188 -0.402224 0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.628121 -0.396997 0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER 0.659866 -0.3877 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.684201 -0.391875 0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER 0.674986 -0.37258 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.674986 -0.37258 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.669081 -0.406996 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.659866 -0.3877 0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER 0.644745 -0.40282 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.669081 -0.406996 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.644745 -0.40282 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.659866 -0.3877 0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER 0.554344 -0.645066 0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER 0.610229 -0.668521 0.153697 RAD 0.0185185 + txt002 + SPHERE CENTER 0.633406 -0.663938 0.160875 RAD 0.00617284 + txt002 + SPHERE CENTER 0.626429 -0.65892 0.137727 RAD 0.00617284 + txt002 + SPHERE CENTER 0.617928 -0.64522 0.156428 RAD 0.00617284 + txt002 + SPHERE CENTER 0.617206 -0.673539 0.176845 RAD 0.00617284 + txt002 + SPHERE CENTER 0.601728 -0.654822 0.172398 RAD 0.00617284 + txt002 + SPHERE CENTER 0.59403 -0.678123 0.169668 RAD 0.00617284 + txt002 + SPHERE CENTER 0.625707 -0.687239 0.158144 RAD 0.00617284 + txt002 + SPHERE CENTER 0.602531 -0.691822 0.150967 RAD 0.00617284 + txt002 + SPHERE CENTER 0.61873 -0.682221 0.134996 RAD 0.00617284 + txt002 + SPHERE CENTER 0.622977 -0.619787 0.099389 RAD 0.0185185 + txt002 + SPHERE CENTER 0.63767 -0.608008 0.0834188 RAD 0.00617284 + txt002 + SPHERE CENTER 0.620102 -0.623239 0.0751099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.613891 -0.601637 0.0853287 RAD 0.00617284 + txt002 + SPHERE CENTER 0.640545 -0.604555 0.107698 RAD 0.00617284 + txt002 + SPHERE CENTER 0.616766 -0.598184 0.109608 RAD 0.00617284 + txt002 + SPHERE CENTER 0.625852 -0.616334 0.123668 RAD 0.00617284 + txt002 + SPHERE CENTER 0.646756 -0.626157 0.0974792 RAD 0.00617284 + txt002 + SPHERE CENTER 0.632063 -0.637936 0.113449 RAD 0.00617284 + txt002 + SPHERE CENTER 0.629188 -0.641389 0.0891702 RAD 0.00617284 + txt002 + SPHERE CENTER 0.585648 -0.598918 0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER 0.601562 -0.580238 0.162601 RAD 0.00617284 + txt002 + SPHERE CENTER 0.605914 -0.59781 0.14581 RAD 0.00617284 + txt002 + SPHERE CENTER 0.587563 -0.581665 0.142311 RAD 0.00617284 + txt002 + SPHERE CENTER 0.581295 -0.581346 0.176661 RAD 0.00617284 + txt002 + SPHERE CENTER 0.567297 -0.582773 0.156372 RAD 0.00617284 + txt002 + SPHERE CENTER 0.565381 -0.600026 0.173931 RAD 0.00617284 + txt002 + SPHERE CENTER 0.599646 -0.597491 0.18016 RAD 0.00617284 + txt002 + SPHERE CENTER 0.583732 -0.616171 0.177429 RAD 0.00617284 + txt002 + SPHERE CENTER 0.603999 -0.615063 0.163369 RAD 0.00617284 + txt002 + SPHERE CENTER 0.541596 -0.6938 0.165419 RAD 0.0185185 + txt002 + SPHERE CENTER 0.547376 -0.70016 0.188567 RAD 0.00617284 + txt002 + SPHERE CENTER 0.564621 -0.690564 0.173728 RAD 0.00617284 + txt002 + SPHERE CENTER 0.546319 -0.676324 0.182211 RAD 0.00617284 + txt002 + SPHERE CENTER 0.524351 -0.703396 0.180258 RAD 0.00617284 + txt002 + SPHERE CENTER 0.523294 -0.679561 0.173902 RAD 0.00617284 + txt002 + SPHERE CENTER 0.518571 -0.697037 0.157111 RAD 0.00617284 + txt002 + SPHERE CENTER 0.542652 -0.717636 0.171776 RAD 0.00617284 + txt002 + SPHERE CENTER 0.536873 -0.711276 0.148628 RAD 0.00617284 + txt002 + SPHERE CENTER 0.559898 -0.70804 0.156937 RAD 0.00617284 + txt002 + SPHERE CENTER 0.517014 -0.624197 0.171592 RAD 0.0185185 + txt002 + SPHERE CENTER 0.516313 -0.60809 0.190293 RAD 0.00617284 + txt002 + SPHERE CENTER 0.538029 -0.616221 0.181811 RAD 0.00617284 + txt002 + SPHERE CENTER 0.524375 -0.60089 0.168094 RAD 0.00617284 + txt002 + SPHERE CENTER 0.495298 -0.616065 0.180075 RAD 0.00617284 + txt002 + SPHERE CENTER 0.50336 -0.608865 0.157875 RAD 0.00617284 + txt002 + SPHERE CENTER 0.495999 -0.632172 0.161374 RAD 0.00617284 + txt002 + SPHERE CENTER 0.508952 -0.631397 0.193792 RAD 0.00617284 + txt002 + SPHERE CENTER 0.509653 -0.647504 0.175091 RAD 0.00617284 + txt002 + SPHERE CENTER 0.530668 -0.639529 0.18531 RAD 0.00617284 + txt002 + SPHERE CENTER 0.48571 -0.670344 0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER 0.466887 -0.67091 0.138803 RAD 0.00617284 + txt002 + SPHERE CENTER 0.490138 -0.671107 0.147112 RAD 0.00617284 + txt002 + SPHERE CENTER 0.480853 -0.650637 0.136894 RAD 0.00617284 + txt002 + SPHERE CENTER 0.46246 -0.670147 0.114524 RAD 0.00617284 + txt002 + SPHERE CENTER 0.476425 -0.649874 0.112614 RAD 0.00617284 + txt002 + SPHERE CENTER 0.481283 -0.669581 0.0985541 RAD 0.00617284 + txt002 + SPHERE CENTER 0.471745 -0.690617 0.124743 RAD 0.00617284 + txt002 + SPHERE CENTER 0.490567 -0.690052 0.108773 RAD 0.00617284 + txt002 + SPHERE CENTER 0.494995 -0.690815 0.133052 RAD 0.00617284 + txt002 + SPHERE CENTER 0.578925 -0.714669 0.104938 RAD 0.0185185 + txt002 + SPHERE CENTER 0.597914 -0.729812 0.109385 RAD 0.00617284 + txt002 + SPHERE CENTER 0.602084 -0.70632 0.103028 RAD 0.00617284 + txt002 + SPHERE CENTER 0.592661 -0.711617 0.125228 RAD 0.00617284 + txt002 + SPHERE CENTER 0.574755 -0.738161 0.111295 RAD 0.00617284 + txt002 + SPHERE CENTER 0.569503 -0.719965 0.127138 RAD 0.00617284 + txt002 + SPHERE CENTER 0.555767 -0.723017 0.106848 RAD 0.00617284 + txt002 + SPHERE CENTER 0.584178 -0.732864 0.0890951 RAD 0.00617284 + txt002 + SPHERE CENTER 0.565189 -0.71772 0.0846485 RAD 0.00617284 + txt002 + SPHERE CENTER 0.588348 -0.709372 0.0827387 RAD 0.00617284 + txt002 + SPHERE CENTER 0.52304 -0.691213 0.062352 RAD 0.0185185 + txt002 + SPHERE CENTER 0.511567 -0.712906 0.0596212 RAD 0.00617284 + txt002 + SPHERE CENTER 0.529503 -0.710453 0.0764123 RAD 0.00617284 + txt002 + SPHERE CENTER 0.507717 -0.699372 0.079911 RAD 0.00617284 + txt002 + SPHERE CENTER 0.505104 -0.693665 0.0455609 RAD 0.00617284 + txt002 + SPHERE CENTER 0.501254 -0.680131 0.0658506 RAD 0.00617284 + txt002 + SPHERE CENTER 0.516576 -0.671972 0.0482916 RAD 0.00617284 + txt002 + SPHERE CENTER 0.526889 -0.704747 0.0420622 RAD 0.00617284 + txt002 + SPHERE CENTER 0.538362 -0.683054 0.044793 RAD 0.00617284 + txt002 + SPHERE CENTER 0.544826 -0.702295 0.0588533 RAD 0.00617284 + txt002 + SPHERE CENTER 0.591673 -0.665934 0.0506299 RAD 0.0185185 + txt002 + SPHERE CENTER 0.605761 -0.658095 0.0319289 RAD 0.00617284 + txt002 + SPHERE CENTER 0.58746 -0.643855 0.0404111 RAD 0.00617284 + txt002 + SPHERE CENTER 0.607672 -0.647455 0.0541285 RAD 0.00617284 + txt002 + SPHERE CENTER 0.609975 -0.680174 0.0421477 RAD 0.00617284 + txt002 + SPHERE CENTER 0.611885 -0.669535 0.0643473 RAD 0.00617284 + txt002 + SPHERE CENTER 0.595887 -0.688013 0.0608487 RAD 0.00617284 + txt002 + SPHERE CENTER 0.589763 -0.676573 0.0284303 RAD 0.00617284 + txt002 + SPHERE CENTER 0.575674 -0.684413 0.0471312 RAD 0.00617284 + txt002 + SPHERE CENTER 0.571461 -0.662334 0.0369125 RAD 0.00617284 + txt002 + SPHERE CENTER 0.471405 -0.471405 0.222222 RAD 0.0555556 + txt002 + SPHERE CENTER 0.501645 -0.441164 0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER 0.518106 -0.424703 0.290934 RAD 0.00617284 + txt002 + SPHERE CENTER 0.522721 -0.437548 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.505261 -0.420089 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.497031 -0.428319 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER 0.484186 -0.423704 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER 0.48057 -0.44478 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER 0.51449 -0.445778 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER 0.498029 -0.462239 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER 0.519105 -0.458623 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER 0.542955 -0.452233 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.560583 -0.44013 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.542955 -0.452233 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER 0.53742 -0.431578 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.560583 -0.44013 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.53742 -0.431578 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.542955 -0.452233 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER 0.566118 -0.460785 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.548489 -0.472887 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.548489 -0.472887 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.490576 -0.399854 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.502679 -0.382226 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.511231 -0.405389 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.490576 -0.399854 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER 0.482024 -0.376691 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.469922 -0.39432 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.469922 -0.39432 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.502679 -0.382226 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.490576 -0.399854 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER 0.511231 -0.405389 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.430095 -0.460336 0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER 0.427669 -0.446904 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER 0.450155 -0.45293 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER 0.436486 -0.436486 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER 0.407609 -0.454311 0.290934 RAD 0.00617284 + txt002 + SPHERE CENTER 0.416426 -0.443892 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.410035 -0.467742 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.421278 -0.470754 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER 0.423704 -0.484186 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER 0.443764 -0.47678 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER 0.419026 -0.419026 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.414851 -0.39469 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.434147 -0.403906 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.434147 -0.403906 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.399731 -0.409811 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.419026 -0.419026 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER 0.403906 -0.434147 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.399731 -0.409811 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.403906 -0.434147 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.419026 -0.419026 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER 0.399854 -0.490576 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.378536 -0.488909 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.399854 -0.490576 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER 0.39432 -0.469922 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.378536 -0.488909 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.39432 -0.469922 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.399854 -0.490576 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER 0.384071 -0.509564 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.405389 -0.511231 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.405389 -0.511231 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.482473 -0.512714 0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER 0.495905 -0.51514 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER 0.506323 -0.506323 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER 0.48988 -0.492654 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER 0.472055 -0.521531 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER 0.46603 -0.499045 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER 0.458623 -0.519105 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER 0.488498 -0.5352 0.290934 RAD 0.00617284 + txt002 + SPHERE CENTER 0.475067 -0.532774 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.498917 -0.526383 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.452233 -0.542955 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.4539 -0.564273 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.472887 -0.548489 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.452233 -0.542955 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER 0.433245 -0.558738 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.431578 -0.53742 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.431578 -0.53742 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.4539 -0.564273 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.452233 -0.542955 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER 0.472887 -0.548489 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.523783 -0.523783 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.548119 -0.527958 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.538903 -0.508662 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.538903 -0.508662 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.532998 -0.543078 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.523783 -0.523783 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER 0.508662 -0.538903 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.532998 -0.543078 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.508662 -0.538903 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.523783 -0.523783 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER 0.335322 -0.607487 0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER 0.313405 -0.629404 0.178389 RAD 0.0185185 + txt002 + SPHERE CENTER 0.316595 -0.626214 0.202664 RAD 0.00617284 + txt002 + SPHERE CENTER 0.335868 -0.624401 0.187336 RAD 0.00617284 + txt002 + SPHERE CENTER 0.318408 -0.606941 0.187336 RAD 0.00617284 + txt002 + SPHERE CENTER 0.294133 -0.631217 0.193717 RAD 0.00617284 + txt002 + SPHERE CENTER 0.295946 -0.611945 0.178389 RAD 0.00617284 + txt002 + SPHERE CENTER 0.290942 -0.634407 0.169441 RAD 0.00617284 + txt002 + SPHERE CENTER 0.311592 -0.648676 0.193717 RAD 0.00617284 + txt002 + SPHERE CENTER 0.308402 -0.651867 0.169441 RAD 0.00617284 + txt002 + SPHERE CENTER 0.330864 -0.646863 0.178389 RAD 0.00617284 + txt002 + SPHERE CENTER 0.384191 -0.610996 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.405245 -0.601704 0.175614 RAD 0.00617284 + txt002 + SPHERE CENTER 0.402224 -0.604188 0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.389418 -0.587062 0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.387213 -0.608512 0.191046 RAD 0.00617284 + txt002 + SPHERE CENTER 0.371386 -0.593871 0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.366159 -0.617804 0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.400018 -0.625637 0.178701 RAD 0.00617284 + txt002 + SPHERE CENTER 0.378964 -0.63493 0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER 0.396997 -0.628121 0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER 0.331813 -0.558618 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.341105 -0.537564 0.175614 RAD 0.00617284 + txt002 + SPHERE CENTER 0.355747 -0.553391 0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.338621 -0.540585 0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.317172 -0.542791 0.178701 RAD 0.00617284 + txt002 + SPHERE CENTER 0.314688 -0.545813 0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER 0.30788 -0.563845 0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER 0.334297 -0.555596 0.191046 RAD 0.00617284 + txt002 + SPHERE CENTER 0.325005 -0.57665 0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.348938 -0.571423 0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.264535 -0.625895 0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER 0.245336 -0.623429 0.138161 RAD 0.00617284 + txt002 + SPHERE CENTER 0.268271 -0.624736 0.147213 RAD 0.00617284 + txt002 + SPHERE CENTER 0.260997 -0.604627 0.134867 RAD 0.00617284 + txt002 + SPHERE CENTER 0.2416 -0.624589 0.113782 RAD 0.00617284 + txt002 + SPHERE CENTER 0.257262 -0.605787 0.110488 RAD 0.00617284 + txt002 + SPHERE CENTER 0.2608 -0.627055 0.0984536 RAD 0.00617284 + txt002 + SPHERE CENTER 0.248874 -0.644697 0.126127 RAD 0.00617284 + txt002 + SPHERE CENTER 0.268073 -0.647163 0.110799 RAD 0.00617284 + txt002 + SPHERE CENTER 0.271809 -0.646004 0.135179 RAD 0.00617284 + txt002 + SPHERE CENTER 0.282943 -0.555109 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.278768 -0.530773 0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER 0.298064 -0.539989 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.298064 -0.539989 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.263648 -0.545894 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.282943 -0.555109 0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER 0.267823 -0.570229 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.263648 -0.545894 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.267823 -0.570229 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.282943 -0.555109 0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER 0.286452 -0.603979 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.266942 -0.591774 0.0466081 RAD 0.00617284 + txt002 + SPHERE CENTER 0.269578 -0.594664 0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.284698 -0.579544 0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER 0.283817 -0.601088 0.031176 RAD 0.00617284 + txt002 + SPHERE CENTER 0.301572 -0.588858 0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.303327 -0.613293 0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.268696 -0.616209 0.0435217 RAD 0.00617284 + txt002 + SPHERE CENTER 0.288206 -0.628413 0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER 0.271332 -0.619099 0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.316914 -0.678274 0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER 0.31938 -0.697473 0.138161 RAD 0.00617284 + txt002 + SPHERE CENTER 0.338182 -0.681812 0.134867 RAD 0.00617284 + txt002 + SPHERE CENTER 0.318074 -0.674538 0.147213 RAD 0.00617284 + txt002 + SPHERE CENTER 0.298112 -0.693935 0.126127 RAD 0.00617284 + txt002 + SPHERE CENTER 0.296805 -0.671 0.135179 RAD 0.00617284 + txt002 + SPHERE CENTER 0.295646 -0.674736 0.110799 RAD 0.00617284 + txt002 + SPHERE CENTER 0.31822 -0.701209 0.113782 RAD 0.00617284 + txt002 + SPHERE CENTER 0.315754 -0.682009 0.0984536 RAD 0.00617284 + txt002 + SPHERE CENTER 0.337022 -0.685547 0.110488 RAD 0.00617284 + txt002 + SPHERE CENTER 0.33883 -0.656357 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.351035 -0.675867 0.0466081 RAD 0.00617284 + txt002 + SPHERE CENTER 0.363265 -0.658111 0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER 0.348145 -0.673232 0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.3266 -0.674113 0.0435217 RAD 0.00617284 + txt002 + SPHERE CENTER 0.32371 -0.671477 0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.314396 -0.654603 0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER 0.341721 -0.658993 0.031176 RAD 0.00617284 + txt002 + SPHERE CENTER 0.329516 -0.639482 0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.353951 -0.641237 0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.3877 -0.659866 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.412036 -0.664041 0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER 0.40282 -0.644745 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.40282 -0.644745 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.396915 -0.679161 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.3877 -0.659866 0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER 0.37258 -0.674986 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.396915 -0.679161 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.37258 -0.674986 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.3877 -0.659866 0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER 0.554344 -0.645066 -0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER 0.616373 -0.681385 -0.129006 RAD 0.0185185 + txt002 + SPHERE CENTER 0.639472 -0.678928 -0.137375 RAD 0.00617284 + txt002 + SPHERE CENTER 0.621631 -0.664108 -0.145845 RAD 0.00617284 + txt002 + SPHERE CENTER 0.629767 -0.661636 -0.122663 RAD 0.00617284 + txt002 + SPHERE CENTER 0.634214 -0.696205 -0.120537 RAD 0.00617284 + txt002 + SPHERE CENTER 0.624508 -0.678912 -0.105825 RAD 0.00617284 + txt002 + SPHERE CENTER 0.611115 -0.698662 -0.112168 RAD 0.00617284 + txt002 + SPHERE CENTER 0.626079 -0.698678 -0.143718 RAD 0.00617284 + txt002 + SPHERE CENTER 0.602979 -0.701135 -0.135349 RAD 0.00617284 + txt002 + SPHERE CENTER 0.608237 -0.683858 -0.152187 RAD 0.00617284 + txt002 + SPHERE CENTER 0.617144 -0.607573 -0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER 0.63057 -0.595495 -0.139672 RAD 0.00617284 + txt002 + SPHERE CENTER 0.617371 -0.615286 -0.146288 RAD 0.00617284 + txt002 + SPHERE CENTER 0.605919 -0.594239 -0.140323 RAD 0.00617284 + txt002 + SPHERE CENTER 0.630343 -0.587782 -0.116217 RAD 0.00617284 + txt002 + SPHERE CENTER 0.605692 -0.586526 -0.116868 RAD 0.00617284 + txt002 + SPHERE CENTER 0.616917 -0.59986 -0.0993785 RAD 0.00617284 + txt002 + SPHERE CENTER 0.641795 -0.608828 -0.122182 RAD 0.00617284 + txt002 + SPHERE CENTER 0.628369 -0.620906 -0.105343 RAD 0.00617284 + txt002 + SPHERE CENTER 0.628595 -0.628619 -0.128798 RAD 0.00617284 + txt002 + SPHERE CENTER 0.609912 -0.649723 -0.062352 RAD 0.0185185 + txt002 + SPHERE CENTER 0.631982 -0.640648 -0.0560094 RAD 0.00617284 + txt002 + SPHERE CENTER 0.62585 -0.64267 -0.0798417 RAD 0.00617284 + txt002 + SPHERE CENTER 0.614812 -0.625749 -0.0656463 RAD 0.00617284 + txt002 + SPHERE CENTER 0.616044 -0.647702 -0.0385197 RAD 0.00617284 + txt002 + SPHERE CENTER 0.598874 -0.632802 -0.0481565 RAD 0.00617284 + txt002 + SPHERE CENTER 0.593974 -0.656777 -0.0448623 RAD 0.00617284 + txt002 + SPHERE CENTER 0.627081 -0.664623 -0.0527151 RAD 0.00617284 + txt002 + SPHERE CENTER 0.605012 -0.673698 -0.0590577 RAD 0.00617284 + txt002 + SPHERE CENTER 0.620949 -0.666645 -0.0765474 RAD 0.00617284 + txt002 + SPHERE CENTER 0.553573 -0.718878 -0.117284 RAD 0.0185185 + txt002 + SPHERE CENTER 0.563328 -0.73992 -0.108814 RAD 0.00617284 + txt002 + SPHERE CENTER 0.577348 -0.719679 -0.110668 RAD 0.00617284 + txt002 + SPHERE CENTER 0.559693 -0.720935 -0.0934517 RAD 0.00617284 + txt002 + SPHERE CENTER 0.539553 -0.739118 -0.115431 RAD 0.00617284 + txt002 + SPHERE CENTER 0.535918 -0.720133 -0.100068 RAD 0.00617284 + txt002 + SPHERE CENTER 0.529798 -0.718076 -0.1239 RAD 0.00617284 + txt002 + SPHERE CENTER 0.557208 -0.737863 -0.132647 RAD 0.00617284 + txt002 + SPHERE CENTER 0.547453 -0.716821 -0.141116 RAD 0.00617284 + txt002 + SPHERE CENTER 0.571228 -0.717623 -0.1345 RAD 0.00617284 + txt002 + SPHERE CENTER 0.547112 -0.687216 -0.0506299 RAD 0.0185185 + txt002 + SPHERE CENTER 0.554862 -0.690713 -0.0274488 RAD 0.00617284 + txt002 + SPHERE CENTER 0.570641 -0.682694 -0.0446649 RAD 0.00617284 + txt002 + SPHERE CENTER 0.552739 -0.667813 -0.0364345 RAD 0.00617284 + txt002 + SPHERE CENTER 0.531333 -0.695235 -0.0334138 RAD 0.00617284 + txt002 + SPHERE CENTER 0.52921 -0.672335 -0.0423994 RAD 0.00617284 + txt002 + SPHERE CENTER 0.523582 -0.691738 -0.0565949 RAD 0.00617284 + txt002 + SPHERE CENTER 0.549235 -0.710116 -0.0416443 RAD 0.00617284 + txt002 + SPHERE CENTER 0.541484 -0.706619 -0.0648253 RAD 0.00617284 + txt002 + SPHERE CENTER 0.565014 -0.702097 -0.0588603 RAD 0.00617284 + txt002 + SPHERE CENTER 0.491544 -0.682558 -0.099389 RAD 0.0185185 + txt002 + SPHERE CENTER 0.474542 -0.688647 -0.0825505 RAD 0.00617284 + txt002 + SPHERE CENTER 0.498226 -0.686417 -0.0759343 RAD 0.00617284 + txt002 + SPHERE CENTER 0.485132 -0.666351 -0.0818993 RAD 0.00617284 + txt002 + SPHERE CENTER 0.46786 -0.684788 -0.106005 RAD 0.00617284 + txt002 + SPHERE CENTER 0.47845 -0.662492 -0.105354 RAD 0.00617284 + txt002 + SPHERE CENTER 0.484862 -0.678699 -0.122844 RAD 0.00617284 + txt002 + SPHERE CENTER 0.480953 -0.704854 -0.10004 RAD 0.00617284 + txt002 + SPHERE CENTER 0.497955 -0.698765 -0.116879 RAD 0.00617284 + txt002 + SPHERE CENTER 0.504637 -0.702624 -0.093424 RAD 0.00617284 + txt002 + SPHERE CENTER 0.560805 -0.676727 -0.177765 RAD 0.0185185 + txt002 + SPHERE CENTER 0.57563 -0.689897 -0.192477 RAD 0.00617284 + txt002 + SPHERE CENTER 0.585222 -0.673115 -0.177114 RAD 0.00617284 + txt002 + SPHERE CENTER 0.575587 -0.693998 -0.168128 RAD 0.00617284 + txt002 + SPHERE CENTER 0.551213 -0.693509 -0.193128 RAD 0.00617284 + txt002 + SPHERE CENTER 0.55117 -0.69761 -0.16878 RAD 0.00617284 + txt002 + SPHERE CENTER 0.536388 -0.680339 -0.178416 RAD 0.00617284 + txt002 + SPHERE CENTER 0.560848 -0.672626 -0.202114 RAD 0.00617284 + txt002 + SPHERE CENTER 0.546023 -0.659456 -0.187402 RAD 0.00617284 + txt002 + SPHERE CENTER 0.57044 -0.655844 -0.186751 RAD 0.00617284 + txt002 + SPHERE CENTER 0.498776 -0.640408 -0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER 0.478525 -0.627785 -0.166213 RAD 0.00617284 + txt002 + SPHERE CENTER 0.484234 -0.630799 -0.142381 RAD 0.00617284 + txt002 + SPHERE CENTER 0.497935 -0.615951 -0.156576 RAD 0.00617284 + txt002 + SPHERE CENTER 0.493066 -0.637394 -0.183703 RAD 0.00617284 + txt002 + SPHERE CENTER 0.512476 -0.62556 -0.174066 RAD 0.00617284 + txt002 + SPHERE CENTER 0.513317 -0.650016 -0.17736 RAD 0.00617284 + txt002 + SPHERE CENTER 0.479365 -0.652241 -0.169507 RAD 0.00617284 + txt002 + SPHERE CENTER 0.499616 -0.664864 -0.163165 RAD 0.00617284 + txt002 + SPHERE CENTER 0.485075 -0.655255 -0.145675 RAD 0.00617284 + txt002 + SPHERE CENTER 0.561576 -0.602915 -0.171592 RAD 0.0185185 + txt002 + SPHERE CENTER 0.570049 -0.602201 -0.194773 RAD 0.00617284 + txt002 + SPHERE CENTER 0.582252 -0.615021 -0.177557 RAD 0.00617284 + txt002 + SPHERE CENTER 0.560414 -0.623084 -0.185788 RAD 0.00617284 + txt002 + SPHERE CENTER 0.549372 -0.590095 -0.188808 RAD 0.00617284 + txt002 + SPHERE CENTER 0.539737 -0.610978 -0.179823 RAD 0.00617284 + txt002 + SPHERE CENTER 0.540899 -0.590808 -0.165627 RAD 0.00617284 + txt002 + SPHERE CENTER 0.571211 -0.582032 -0.180578 RAD 0.00617284 + txt002 + SPHERE CENTER 0.562738 -0.582745 -0.157397 RAD 0.00617284 + txt002 + SPHERE CENTER 0.583414 -0.594852 -0.163362 RAD 0.00617284 + txt002 + SPHERE CENTER 0.335322 -0.607487 -0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER 0.283164 -0.659645 -0.104315 RAD 0.0185185 + txt002 + SPHERE CENTER 0.269894 -0.672915 -0.0882695 RAD 0.00617284 + txt002 + SPHERE CENTER 0.293281 -0.666987 -0.0830215 RAD 0.00617284 + txt002 + SPHERE CENTER 0.275822 -0.649528 -0.0830215 RAD 0.00617284 + txt002 + SPHERE CENTER 0.259777 -0.665573 -0.109563 RAD 0.00617284 + txt002 + SPHERE CENTER 0.265705 -0.642185 -0.104315 RAD 0.00617284 + txt002 + SPHERE CENTER 0.273047 -0.652302 -0.125608 RAD 0.00617284 + txt002 + SPHERE CENTER 0.277236 -0.683032 -0.109563 RAD 0.00617284 + txt002 + SPHERE CENTER 0.290507 -0.669762 -0.125608 RAD 0.00617284 + txt002 + SPHERE CENTER 0.300624 -0.677104 -0.104315 RAD 0.00617284 + txt002 + SPHERE CENTER 0.33883 -0.656357 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.350033 -0.661904 -0.0342624 RAD 0.00617284 + txt002 + SPHERE CENTER 0.362764 -0.65113 -0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER 0.345639 -0.638325 -0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.326099 -0.667131 -0.0373488 RAD 0.00617284 + txt002 + SPHERE CENTER 0.321705 -0.643552 -0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.314897 -0.661584 -0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER 0.343224 -0.679937 -0.0496945 RAD 0.00617284 + txt002 + SPHERE CENTER 0.332022 -0.674389 -0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.355956 -0.669162 -0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.286452 -0.603979 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.280905 -0.592776 -0.0342624 RAD 0.00617284 + txt002 + SPHERE CENTER 0.304484 -0.59717 -0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.291679 -0.580045 -0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER 0.262872 -0.599585 -0.0496945 RAD 0.00617284 + txt002 + SPHERE CENTER 0.273647 -0.586853 -0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.26842 -0.610787 -0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.275678 -0.61671 -0.0373488 RAD 0.00617284 + txt002 + SPHERE CENTER 0.281225 -0.627912 -0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER 0.299257 -0.621104 -0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.279656 -0.610775 -0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER 0.256944 -0.602632 -0.165118 RAD 0.00617284 + txt002 + SPHERE CENTER 0.26347 -0.606749 -0.141664 RAD 0.00617284 + txt002 + SPHERE CENTER 0.273158 -0.587686 -0.154009 RAD 0.00617284 + txt002 + SPHERE CENTER 0.27313 -0.606658 -0.183325 RAD 0.00617284 + txt002 + SPHERE CENTER 0.289344 -0.591712 -0.172216 RAD 0.00617284 + txt002 + SPHERE CENTER 0.295841 -0.614801 -0.178077 RAD 0.00617284 + txt002 + SPHERE CENTER 0.263442 -0.62572 -0.170979 RAD 0.00617284 + txt002 + SPHERE CENTER 0.286153 -0.633864 -0.165731 RAD 0.00617284 + txt002 + SPHERE CENTER 0.269968 -0.629838 -0.147525 RAD 0.00617284 + txt002 + SPHERE CENTER 0.282943 -0.555109 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.278768 -0.530773 -0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER 0.298064 -0.539989 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.298064 -0.539989 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.263648 -0.545894 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.282943 -0.555109 -0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER 0.267823 -0.570229 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.263648 -0.545894 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.267823 -0.570229 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.282943 -0.555109 -0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER 0.331813 -0.558618 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.342108 -0.551527 -0.18796 RAD 0.00617284 + txt002 + SPHERE CENTER 0.356248 -0.560372 -0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER 0.341128 -0.575492 -0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.317673 -0.549772 -0.184873 RAD 0.00617284 + txt002 + SPHERE CENTER 0.316693 -0.573738 -0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.307378 -0.556863 -0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.332793 -0.534652 -0.172528 RAD 0.00617284 + txt002 + SPHERE CENTER 0.322499 -0.541743 -0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.346933 -0.543497 -0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER 0.332034 -0.663153 -0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER 0.340177 -0.685865 -0.165118 RAD 0.00617284 + txt002 + SPHERE CENTER 0.355123 -0.669651 -0.154009 RAD 0.00617284 + txt002 + SPHERE CENTER 0.33606 -0.679339 -0.141664 RAD 0.00617284 + txt002 + SPHERE CENTER 0.317089 -0.679367 -0.170979 RAD 0.00617284 + txt002 + SPHERE CENTER 0.312971 -0.672841 -0.147525 RAD 0.00617284 + txt002 + SPHERE CENTER 0.308945 -0.656656 -0.165731 RAD 0.00617284 + txt002 + SPHERE CENTER 0.336151 -0.669679 -0.183325 RAD 0.00617284 + txt002 + SPHERE CENTER 0.328008 -0.646968 -0.178077 RAD 0.00617284 + txt002 + SPHERE CENTER 0.351097 -0.653465 -0.172216 RAD 0.00617284 + txt002 + SPHERE CENTER 0.384191 -0.610996 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.391282 -0.600701 -0.18796 RAD 0.00617284 + txt002 + SPHERE CENTER 0.367317 -0.601681 -0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.382437 -0.586561 -0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER 0.408157 -0.610016 -0.172528 RAD 0.00617284 + txt002 + SPHERE CENTER 0.399312 -0.595876 -0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER 0.401066 -0.62031 -0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.393037 -0.625136 -0.184873 RAD 0.00617284 + txt002 + SPHERE CENTER 0.385946 -0.635431 -0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.369071 -0.626116 -0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.3877 -0.659866 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.412036 -0.664041 -0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER 0.40282 -0.644745 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.40282 -0.644745 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.396915 -0.679161 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.3877 -0.659866 -0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER 0.37258 -0.674986 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.396915 -0.679161 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.37258 -0.674986 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.3877 -0.659866 -0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER 0.471405 -0.471405 -0.222222 RAD 0.0555556 + txt002 + SPHERE CENTER 0.441164 -0.441164 -0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER 0.443014 -0.422853 -0.299164 RAD 0.00617284 + txt002 + SPHERE CENTER 0.449156 -0.418916 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER 0.463412 -0.433171 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER 0.435021 -0.445101 -0.306292 RAD 0.00617284 + txt002 + SPHERE CENTER 0.455419 -0.455419 -0.296959 RAD 0.00617284 + txt002 + SPHERE CENTER 0.433171 -0.463412 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER 0.420766 -0.430846 -0.292037 RAD 0.00617284 + txt002 + SPHERE CENTER 0.418916 -0.449156 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER 0.426908 -0.426908 -0.268448 RAD 0.00617284 + txt002 + SPHERE CENTER 0.399854 -0.452233 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.383576 -0.43509 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER 0.40305 -0.440308 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.406245 -0.428383 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.380381 -0.447015 -0.236478 RAD 0.00617284 + txt002 + SPHERE CENTER 0.40305 -0.440308 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.396659 -0.464158 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.377186 -0.45894 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER 0.393464 -0.476083 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.396659 -0.464158 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.452233 -0.399854 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.45894 -0.377186 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER 0.476083 -0.393464 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.464158 -0.396659 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.43509 -0.383576 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER 0.440308 -0.40305 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.428383 -0.406245 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.447015 -0.380381 -0.207967 RAD 0.00617284 + txt002 + SPHERE CENTER 0.440308 -0.40305 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.464158 -0.396659 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.512714 -0.460336 -0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER 0.512375 -0.453047 -0.306292 RAD 0.00617284 + txt002 + SPHERE CENTER 0.493241 -0.465554 -0.296959 RAD 0.00617284 + txt002 + SPHERE CENTER 0.497443 -0.44229 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER 0.531849 -0.447829 -0.292037 RAD 0.00617284 + txt002 + SPHERE CENTER 0.516916 -0.437072 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER 0.532187 -0.455118 -0.268448 RAD 0.00617284 + txt002 + SPHERE CENTER 0.527647 -0.471093 -0.299164 RAD 0.00617284 + txt002 + SPHERE CENTER 0.527985 -0.478381 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER 0.508512 -0.483599 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER 0.523783 -0.419026 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.538038 -0.404771 -0.236478 RAD 0.00617284 + txt002 + SPHERE CENTER 0.532513 -0.427756 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.515053 -0.410297 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.529309 -0.396041 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER 0.506323 -0.401567 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.515053 -0.410297 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.546768 -0.4135 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER 0.532513 -0.427756 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.541242 -0.436486 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.542955 -0.490576 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.565623 -0.483869 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER 0.54615 -0.478651 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.549345 -0.466726 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.562428 -0.495794 -0.207967 RAD 0.00617284 + txt002 + SPHERE CENTER 0.54615 -0.478651 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.539759 -0.502501 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.559233 -0.507719 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER 0.536564 -0.514426 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.539759 -0.502501 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.460336 -0.512714 -0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER 0.461599 -0.535539 -0.292037 RAD 0.00617284 + txt002 + SPHERE CENTER 0.478381 -0.527985 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER 0.455118 -0.532187 -0.268448 RAD 0.00617284 + txt002 + SPHERE CENTER 0.443553 -0.520267 -0.299164 RAD 0.00617284 + txt002 + SPHERE CENTER 0.437072 -0.516916 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER 0.44229 -0.497443 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER 0.466817 -0.516065 -0.306292 RAD 0.00617284 + txt002 + SPHERE CENTER 0.465554 -0.493241 -0.296959 RAD 0.00617284 + txt002 + SPHERE CENTER 0.483599 -0.508512 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER 0.490576 -0.542955 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.507719 -0.559233 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER 0.514426 -0.536564 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.502501 -0.539759 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.483869 -0.565623 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER 0.478651 -0.54615 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.466726 -0.549345 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.495794 -0.562428 -0.236478 RAD 0.00617284 + txt002 + SPHERE CENTER 0.478651 -0.54615 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.502501 -0.539759 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.419026 -0.523783 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.404771 -0.538038 -0.207967 RAD 0.00617284 + txt002 + SPHERE CENTER 0.427756 -0.532513 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.410297 -0.515053 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.396041 -0.529309 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER 0.401567 -0.506323 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.410297 -0.515053 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.4135 -0.546768 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER 0.427756 -0.532513 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.436486 -0.541242 -0.222222 RAD 0.00617284 + txt002 + +END_SCENE diff --git a/xdl/third_party/tbb/examples/parallel_for/tachyon/dat/balls3.dat b/xdl/third_party/tbb/examples/parallel_for/tachyon/dat/balls3.dat new file mode 100644 index 00000000..2837425d --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/tachyon/dat/balls3.dat @@ -0,0 +1,14804 @@ +BEGIN_SCENE + OUTFILE /dev/null + RESOLUTION 1024 768 + VERBOSE 0 + +CAMERA + ZOOM 1.20711 +ASPECTRATIO 1.0 + ANTIALIASING 0 + RAYDEPTH 5 + CENTER 2.1 1.3 1.7 + VIEWDIR -0.700389 -0.433574 -0.566982 + UPDIR -0.482085 -0.298433 0.82373 + +END_CAMERA + +BACKGROUND 0.078 0.361 0.753 + +LIGHT CENTER 4 3 2 RAD 0.002 COLOR 0.5 0.5 0.5 + +LIGHT CENTER 1 -4 4 RAD 0.002 COLOR 0.5 0.5 0.5 + +LIGHT CENTER -3 1 5 RAD 0.002 COLOR 0.5 0.5 0.5 + +TEXDEF txt001 AMBIENT 0.2 DIFFUSE 0.8 SPECULAR 0 OPACITY 1 +PHONG PLASTIC 0 PHONG_SIZE 100000 + COLOR 1 0.75 0.33 + TEXFUNC 0 + +TRI + V0 12 12 -0.5 V1 -12 -12 -0.5 V2 12 -12 -0.5 + txt001 +TRI + V0 12 12 -0.5 V1 -12 12 -0.5 V2 -12 -12 -0.5 + txt001 +TEXDEF txt002 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 +PHONG PLASTIC 0.5 PHONG_SIZE 45.2776 + COLOR 1 0.9 0.7 + TEXFUNC 0 + + SPHERE CENTER 0 0 0 RAD 0.5 + txt002 + SPHERE CENTER 0.272166 0.272166 0.544331 RAD 0.166667 + txt002 + SPHERE CENTER 0.420314 0.420314 0.618405 RAD 0.0555556 + txt002 + SPHERE CENTER 0.470715 0.470715 0.598245 RAD 0.0185185 + txt002 + SPHERE CENTER 0.481689 0.481689 0.57904 RAD 0.00617284 + txt002 + SPHERE CENTER 0.475329 0.45787 0.577669 RAD 0.00617284 + txt002 + SPHERE CENTER 0.45787 0.475329 0.577669 RAD 0.00617284 + txt002 + SPHERE CENTER 0.477074 0.494534 0.599616 RAD 0.00617284 + txt002 + SPHERE CENTER 0.453255 0.488174 0.598245 RAD 0.00617284 + txt002 + SPHERE CENTER 0.4661 0.48356 0.618821 RAD 0.00617284 + txt002 + SPHERE CENTER 0.494534 0.477074 0.599616 RAD 0.00617284 + txt002 + SPHERE CENTER 0.48356 0.4661 0.618821 RAD 0.00617284 + txt002 + SPHERE CENTER 0.488174 0.453255 0.598245 RAD 0.00617284 + txt002 + SPHERE CENTER 0.461623 0.409245 0.557924 RAD 0.0185185 + txt002 + SPHERE CENTER 0.47044 0.419664 0.537348 RAD 0.00617284 + txt002 + SPHERE CENTER 0.447954 0.425689 0.545578 RAD 0.00617284 + txt002 + SPHERE CENTER 0.468014 0.433095 0.557924 RAD 0.00617284 + txt002 + SPHERE CENTER 0.484109 0.40322 0.549693 RAD 0.00617284 + txt002 + SPHERE CENTER 0.481683 0.416651 0.57027 RAD 0.00617284 + txt002 + SPHERE CENTER 0.475292 0.392801 0.57027 RAD 0.00617284 + txt002 + SPHERE CENTER 0.464049 0.395814 0.537348 RAD 0.00617284 + txt002 + SPHERE CENTER 0.455233 0.385395 0.557924 RAD 0.00617284 + txt002 + SPHERE CENTER 0.441563 0.401839 0.545578 RAD 0.00617284 + txt002 + SPHERE CENTER 0.409245 0.461623 0.557924 RAD 0.0185185 + txt002 + SPHERE CENTER 0.419664 0.47044 0.537348 RAD 0.00617284 + txt002 + SPHERE CENTER 0.433095 0.468014 0.557924 RAD 0.00617284 + txt002 + SPHERE CENTER 0.425689 0.447954 0.545578 RAD 0.00617284 + txt002 + SPHERE CENTER 0.395814 0.464049 0.537348 RAD 0.00617284 + txt002 + SPHERE CENTER 0.401839 0.441563 0.545578 RAD 0.00617284 + txt002 + SPHERE CENTER 0.385395 0.455233 0.557924 RAD 0.00617284 + txt002 + SPHERE CENTER 0.40322 0.484109 0.549693 RAD 0.00617284 + txt002 + SPHERE CENTER 0.392801 0.475292 0.57027 RAD 0.00617284 + txt002 + SPHERE CENTER 0.416651 0.481683 0.57027 RAD 0.00617284 + txt002 + SPHERE CENTER 0.429405 0.481784 0.658726 RAD 0.0185185 + txt002 + SPHERE CENTER 0.441197 0.503434 0.660098 RAD 0.00617284 + txt002 + SPHERE CENTER 0.452601 0.483752 0.650495 RAD 0.00617284 + txt002 + SPHERE CENTER 0.434161 0.494577 0.63815 RAD 0.00617284 + txt002 + SPHERE CENTER 0.418001 0.501466 0.668328 RAD 0.00617284 + txt002 + SPHERE CENTER 0.410965 0.492609 0.64638 RAD 0.00617284 + txt002 + SPHERE CENTER 0.406209 0.479816 0.666956 RAD 0.00617284 + txt002 + SPHERE CENTER 0.436441 0.490641 0.680674 RAD 0.00617284 + txt002 + SPHERE CENTER 0.42465 0.46899 0.679302 RAD 0.00617284 + txt002 + SPHERE CENTER 0.447846 0.470958 0.671072 RAD 0.00617284 + txt002 + SPHERE CENTER 0.367935 0.472692 0.618405 RAD 0.0185185 + txt002 + SPHERE CENTER 0.36376 0.497028 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER 0.383056 0.487812 0.630751 RAD 0.00617284 + txt002 + SPHERE CENTER 0.383056 0.487812 0.606059 RAD 0.00617284 + txt002 + SPHERE CENTER 0.34864 0.481907 0.606059 RAD 0.00617284 + txt002 + SPHERE CENTER 0.367935 0.472692 0.593714 RAD 0.00617284 + txt002 + SPHERE CENTER 0.352815 0.457572 0.606059 RAD 0.00617284 + txt002 + SPHERE CENTER 0.34864 0.481907 0.630751 RAD 0.00617284 + txt002 + SPHERE CENTER 0.352815 0.457572 0.630751 RAD 0.00617284 + txt002 + SPHERE CENTER 0.367935 0.472692 0.643096 RAD 0.00617284 + txt002 + SPHERE CENTER 0.379004 0.431383 0.678886 RAD 0.0185185 + txt002 + SPHERE CENTER 0.376578 0.444814 0.699462 RAD 0.00617284 + txt002 + SPHERE CENTER 0.399064 0.438789 0.691232 RAD 0.00617284 + txt002 + SPHERE CENTER 0.385395 0.455233 0.678886 RAD 0.00617284 + txt002 + SPHERE CENTER 0.356518 0.437408 0.687117 RAD 0.00617284 + txt002 + SPHERE CENTER 0.365335 0.447826 0.666541 RAD 0.00617284 + txt002 + SPHERE CENTER 0.358944 0.423976 0.666541 RAD 0.00617284 + txt002 + SPHERE CENTER 0.370187 0.420964 0.699462 RAD 0.00617284 + txt002 + SPHERE CENTER 0.372614 0.407532 0.678886 RAD 0.00617284 + txt002 + SPHERE CENTER 0.392673 0.414939 0.691232 RAD 0.00617284 + txt002 + SPHERE CENTER 0.481784 0.429405 0.658726 RAD 0.0185185 + txt002 + SPHERE CENTER 0.503434 0.441197 0.660098 RAD 0.00617284 + txt002 + SPHERE CENTER 0.494577 0.434161 0.63815 RAD 0.00617284 + txt002 + SPHERE CENTER 0.483752 0.452601 0.650495 RAD 0.00617284 + txt002 + SPHERE CENTER 0.490641 0.436441 0.680674 RAD 0.00617284 + txt002 + SPHERE CENTER 0.470958 0.447846 0.671072 RAD 0.00617284 + txt002 + SPHERE CENTER 0.46899 0.42465 0.679302 RAD 0.00617284 + txt002 + SPHERE CENTER 0.501466 0.418001 0.668328 RAD 0.00617284 + txt002 + SPHERE CENTER 0.479816 0.406209 0.666956 RAD 0.00617284 + txt002 + SPHERE CENTER 0.492609 0.410965 0.64638 RAD 0.00617284 + txt002 + SPHERE CENTER 0.431383 0.379004 0.678886 RAD 0.0185185 + txt002 + SPHERE CENTER 0.444814 0.376578 0.699462 RAD 0.00617284 + txt002 + SPHERE CENTER 0.455233 0.385395 0.678886 RAD 0.00617284 + txt002 + SPHERE CENTER 0.438789 0.399064 0.691232 RAD 0.00617284 + txt002 + SPHERE CENTER 0.420964 0.370187 0.699462 RAD 0.00617284 + txt002 + SPHERE CENTER 0.414939 0.392673 0.691232 RAD 0.00617284 + txt002 + SPHERE CENTER 0.407532 0.372614 0.678886 RAD 0.00617284 + txt002 + SPHERE CENTER 0.437408 0.356518 0.687117 RAD 0.00617284 + txt002 + SPHERE CENTER 0.423976 0.358944 0.666541 RAD 0.00617284 + txt002 + SPHERE CENTER 0.447826 0.365335 0.666541 RAD 0.00617284 + txt002 + SPHERE CENTER 0.472692 0.367935 0.618405 RAD 0.0185185 + txt002 + SPHERE CENTER 0.497028 0.36376 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER 0.487812 0.383056 0.606059 RAD 0.00617284 + txt002 + SPHERE CENTER 0.487812 0.383056 0.630751 RAD 0.00617284 + txt002 + SPHERE CENTER 0.481907 0.34864 0.630751 RAD 0.00617284 + txt002 + SPHERE CENTER 0.472692 0.367935 0.643096 RAD 0.00617284 + txt002 + SPHERE CENTER 0.457572 0.352815 0.630751 RAD 0.00617284 + txt002 + SPHERE CENTER 0.481907 0.34864 0.606059 RAD 0.00617284 + txt002 + SPHERE CENTER 0.457572 0.352815 0.606059 RAD 0.00617284 + txt002 + SPHERE CENTER 0.472692 0.367935 0.593714 RAD 0.00617284 + txt002 + SPHERE CENTER 0.461844 0.304709 0.43322 RAD 0.0555556 + txt002 + SPHERE CENTER 0.492085 0.33495 0.372739 RAD 0.0185185 + txt002 + SPHERE CENTER 0.492085 0.33495 0.348047 RAD 0.00617284 + txt002 + SPHERE CENTER 0.488469 0.313874 0.360393 RAD 0.00617284 + txt002 + SPHERE CENTER 0.471009 0.331334 0.360393 RAD 0.00617284 + txt002 + SPHERE CENTER 0.495701 0.356025 0.360393 RAD 0.00617284 + txt002 + SPHERE CENTER 0.474625 0.352409 0.372739 RAD 0.00617284 + txt002 + SPHERE CENTER 0.495701 0.356025 0.385084 RAD 0.00617284 + txt002 + SPHERE CENTER 0.51316 0.338566 0.360393 RAD 0.00617284 + txt002 + SPHERE CENTER 0.51316 0.338566 0.385084 RAD 0.00617284 + txt002 + SPHERE CENTER 0.509544 0.31749 0.372739 RAD 0.00617284 + txt002 + SPHERE CENTER 0.424345 0.305171 0.369341 RAD 0.0185185 + txt002 + SPHERE CENTER 0.40568 0.315605 0.356995 RAD 0.00617284 + txt002 + SPHERE CENTER 0.403931 0.312107 0.381374 RAD 0.00617284 + txt002 + SPHERE CENTER 0.419383 0.329161 0.372427 RAD 0.00617284 + txt002 + SPHERE CENTER 0.426095 0.30867 0.344961 RAD 0.00617284 + txt002 + SPHERE CENTER 0.439797 0.322225 0.360393 RAD 0.00617284 + txt002 + SPHERE CENTER 0.444759 0.298235 0.357307 RAD 0.00617284 + txt002 + SPHERE CENTER 0.410643 0.291616 0.353908 RAD 0.00617284 + txt002 + SPHERE CENTER 0.429307 0.281181 0.366254 RAD 0.00617284 + txt002 + SPHERE CENTER 0.408893 0.288117 0.378288 RAD 0.00617284 + txt002 + SPHERE CENTER 0.435193 0.368397 0.406378 RAD 0.0185185 + txt002 + SPHERE CENTER 0.440864 0.389015 0.394032 RAD 0.00617284 + txt002 + SPHERE CENTER 0.457301 0.37895 0.409464 RAD 0.00617284 + txt002 + SPHERE CENTER 0.451857 0.367697 0.388171 RAD 0.00617284 + txt002 + SPHERE CENTER 0.418755 0.378463 0.390945 RAD 0.00617284 + txt002 + SPHERE CENTER 0.429748 0.357145 0.385084 RAD 0.00617284 + txt002 + SPHERE CENTER 0.413085 0.357845 0.403291 RAD 0.00617284 + txt002 + SPHERE CENTER 0.4242 0.389715 0.412239 RAD 0.00617284 + txt002 + SPHERE CENTER 0.418529 0.369098 0.424584 RAD 0.00617284 + txt002 + SPHERE CENTER 0.440637 0.37965 0.427671 RAD 0.00617284 + txt002 + SPHERE CENTER 0.529584 0.334488 0.436618 RAD 0.0185185 + txt002 + SPHERE CENTER 0.546497 0.347572 0.424272 RAD 0.00617284 + txt002 + SPHERE CENTER 0.532117 0.331508 0.412239 RAD 0.00617284 + txt002 + SPHERE CENTER 0.522481 0.352406 0.421186 RAD 0.00617284 + txt002 + SPHERE CENTER 0.543964 0.350552 0.448652 RAD 0.00617284 + txt002 + SPHERE CENTER 0.519948 0.355387 0.445566 RAD 0.00617284 + txt002 + SPHERE CENTER 0.52705 0.337468 0.460998 RAD 0.00617284 + txt002 + SPHERE CENTER 0.5536 0.329654 0.439705 RAD 0.00617284 + txt002 + SPHERE CENTER 0.536686 0.31657 0.45205 RAD 0.00617284 + txt002 + SPHERE CENTER 0.53922 0.313589 0.427671 RAD 0.00617284 + txt002 + SPHERE CENTER 0.472692 0.367935 0.470257 RAD 0.0185185 + txt002 + SPHERE CENTER 0.48474 0.389488 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER 0.495668 0.369235 0.46131 RAD 0.00617284 + txt002 + SPHERE CENTER 0.477004 0.379669 0.448964 RAD 0.00617284 + txt002 + SPHERE CENTER 0.461764 0.388188 0.479204 RAD 0.00617284 + txt002 + SPHERE CENTER 0.454027 0.37837 0.457911 RAD 0.00617284 + txt002 + SPHERE CENTER 0.449715 0.366636 0.479204 RAD 0.00617284 + txt002 + SPHERE CENTER 0.480429 0.377754 0.49155 RAD 0.00617284 + txt002 + SPHERE CENTER 0.46838 0.356202 0.49155 RAD 0.00617284 + txt002 + SPHERE CENTER 0.491357 0.357501 0.482603 RAD 0.00617284 + txt002 + SPHERE CENTER 0.499343 0.304247 0.497099 RAD 0.0185185 + txt002 + SPHERE CENTER 0.518259 0.314219 0.509445 RAD 0.00617284 + txt002 + SPHERE CENTER 0.519922 0.310678 0.485065 RAD 0.00617284 + txt002 + SPHERE CENTER 0.504895 0.328108 0.494013 RAD 0.00617284 + txt002 + SPHERE CENTER 0.49768 0.307788 0.521479 RAD 0.00617284 + txt002 + SPHERE CENTER 0.484316 0.321677 0.506047 RAD 0.00617284 + txt002 + SPHERE CENTER 0.478764 0.297816 0.509133 RAD 0.00617284 + txt002 + SPHERE CENTER 0.512708 0.290358 0.512531 RAD 0.00617284 + txt002 + SPHERE CENTER 0.493791 0.280387 0.500186 RAD 0.00617284 + txt002 + SPHERE CENTER 0.51437 0.286818 0.488152 RAD 0.00617284 + txt002 + SPHERE CENTER 0.518736 0.271262 0.399581 RAD 0.0185185 + txt002 + SPHERE CENTER 0.539811 0.274878 0.387235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.520873 0.290418 0.384149 RAD 0.00617284 + txt002 + SPHERE CENTER 0.533373 0.290264 0.405442 RAD 0.00617284 + txt002 + SPHERE CENTER 0.537674 0.255722 0.402668 RAD 0.00617284 + txt002 + SPHERE CENTER 0.531235 0.271108 0.420874 RAD 0.00617284 + txt002 + SPHERE CENTER 0.516598 0.252106 0.415013 RAD 0.00617284 + txt002 + SPHERE CENTER 0.525174 0.255876 0.381374 RAD 0.00617284 + txt002 + SPHERE CENTER 0.504099 0.25226 0.39372 RAD 0.00617284 + txt002 + SPHERE CENTER 0.506236 0.271416 0.378288 RAD 0.00617284 + txt002 + SPHERE CENTER 0.488495 0.241021 0.460062 RAD 0.0185185 + txt002 + SPHERE CENTER 0.50716 0.230587 0.472408 RAD 0.00617284 + txt002 + SPHERE CENTER 0.51153 0.24936 0.456976 RAD 0.00617284 + txt002 + SPHERE CENTER 0.499694 0.253381 0.478269 RAD 0.00617284 + txt002 + SPHERE CENTER 0.484125 0.222248 0.475494 RAD 0.00617284 + txt002 + SPHERE CENTER 0.476659 0.245042 0.481355 RAD 0.00617284 + txt002 + SPHERE CENTER 0.46546 0.232683 0.463149 RAD 0.00617284 + txt002 + SPHERE CENTER 0.495961 0.218227 0.454201 RAD 0.00617284 + txt002 + SPHERE CENTER 0.477296 0.228661 0.441856 RAD 0.00617284 + txt002 + SPHERE CENTER 0.500331 0.237 0.438769 RAD 0.00617284 + txt002 + SPHERE CENTER 0.450996 0.241483 0.396183 RAD 0.0185185 + txt002 + SPHERE CENTER 0.455172 0.217147 0.396183 RAD 0.00617284 + txt002 + SPHERE CENTER 0.472226 0.232599 0.40513 RAD 0.00617284 + txt002 + SPHERE CENTER 0.45115 0.228983 0.417476 RAD 0.00617284 + txt002 + SPHERE CENTER 0.433942 0.226031 0.387235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.429921 0.237867 0.408529 RAD 0.00617284 + txt002 + SPHERE CENTER 0.429767 0.250367 0.387235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.455018 0.229647 0.37489 RAD 0.00617284 + txt002 + SPHERE CENTER 0.450842 0.253983 0.37489 RAD 0.00617284 + txt002 + SPHERE CENTER 0.472072 0.245099 0.383837 RAD 0.00617284 + txt002 + SPHERE CENTER 0.304709 0.461844 0.43322 RAD 0.0555556 + txt002 + SPHERE CENTER 0.33495 0.492085 0.372739 RAD 0.0185185 + txt002 + SPHERE CENTER 0.33495 0.492085 0.348047 RAD 0.00617284 + txt002 + SPHERE CENTER 0.331334 0.471009 0.360393 RAD 0.00617284 + txt002 + SPHERE CENTER 0.313874 0.488469 0.360393 RAD 0.00617284 + txt002 + SPHERE CENTER 0.338566 0.51316 0.360393 RAD 0.00617284 + txt002 + SPHERE CENTER 0.31749 0.509544 0.372739 RAD 0.00617284 + txt002 + SPHERE CENTER 0.338566 0.51316 0.385084 RAD 0.00617284 + txt002 + SPHERE CENTER 0.356025 0.495701 0.360393 RAD 0.00617284 + txt002 + SPHERE CENTER 0.356025 0.495701 0.385084 RAD 0.00617284 + txt002 + SPHERE CENTER 0.352409 0.474625 0.372739 RAD 0.00617284 + txt002 + SPHERE CENTER 0.368397 0.435193 0.406378 RAD 0.0185185 + txt002 + SPHERE CENTER 0.389015 0.440864 0.394032 RAD 0.00617284 + txt002 + SPHERE CENTER 0.367697 0.451857 0.388171 RAD 0.00617284 + txt002 + SPHERE CENTER 0.37895 0.457301 0.409464 RAD 0.00617284 + txt002 + SPHERE CENTER 0.389715 0.4242 0.412239 RAD 0.00617284 + txt002 + SPHERE CENTER 0.37965 0.440637 0.427671 RAD 0.00617284 + txt002 + SPHERE CENTER 0.369098 0.418529 0.424584 RAD 0.00617284 + txt002 + SPHERE CENTER 0.378463 0.418755 0.390945 RAD 0.00617284 + txt002 + SPHERE CENTER 0.357845 0.413085 0.403291 RAD 0.00617284 + txt002 + SPHERE CENTER 0.357145 0.429748 0.385084 RAD 0.00617284 + txt002 + SPHERE CENTER 0.305171 0.424345 0.369341 RAD 0.0185185 + txt002 + SPHERE CENTER 0.315605 0.40568 0.356995 RAD 0.00617284 + txt002 + SPHERE CENTER 0.329161 0.419383 0.372427 RAD 0.00617284 + txt002 + SPHERE CENTER 0.312107 0.403931 0.381374 RAD 0.00617284 + txt002 + SPHERE CENTER 0.291616 0.410643 0.353908 RAD 0.00617284 + txt002 + SPHERE CENTER 0.288117 0.408893 0.378288 RAD 0.00617284 + txt002 + SPHERE CENTER 0.281181 0.429307 0.366254 RAD 0.00617284 + txt002 + SPHERE CENTER 0.30867 0.426095 0.344961 RAD 0.00617284 + txt002 + SPHERE CENTER 0.298235 0.444759 0.357307 RAD 0.00617284 + txt002 + SPHERE CENTER 0.322225 0.439797 0.360393 RAD 0.00617284 + txt002 + SPHERE CENTER 0.271262 0.518736 0.399581 RAD 0.0185185 + txt002 + SPHERE CENTER 0.274878 0.539811 0.387235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.290264 0.533373 0.405442 RAD 0.00617284 + txt002 + SPHERE CENTER 0.290418 0.520873 0.384149 RAD 0.00617284 + txt002 + SPHERE CENTER 0.255876 0.525174 0.381374 RAD 0.00617284 + txt002 + SPHERE CENTER 0.271416 0.506236 0.378288 RAD 0.00617284 + txt002 + SPHERE CENTER 0.25226 0.504099 0.39372 RAD 0.00617284 + txt002 + SPHERE CENTER 0.255722 0.537674 0.402668 RAD 0.00617284 + txt002 + SPHERE CENTER 0.252106 0.516598 0.415013 RAD 0.00617284 + txt002 + SPHERE CENTER 0.271108 0.531235 0.420874 RAD 0.00617284 + txt002 + SPHERE CENTER 0.241483 0.450996 0.396183 RAD 0.0185185 + txt002 + SPHERE CENTER 0.217147 0.455172 0.396183 RAD 0.00617284 + txt002 + SPHERE CENTER 0.228983 0.45115 0.417476 RAD 0.00617284 + txt002 + SPHERE CENTER 0.232599 0.472226 0.40513 RAD 0.00617284 + txt002 + SPHERE CENTER 0.229647 0.455018 0.37489 RAD 0.00617284 + txt002 + SPHERE CENTER 0.245099 0.472072 0.383837 RAD 0.00617284 + txt002 + SPHERE CENTER 0.253983 0.450842 0.37489 RAD 0.00617284 + txt002 + SPHERE CENTER 0.226031 0.433942 0.387235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.250367 0.429767 0.387235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.237867 0.429921 0.408529 RAD 0.00617284 + txt002 + SPHERE CENTER 0.241021 0.488495 0.460062 RAD 0.0185185 + txt002 + SPHERE CENTER 0.230587 0.50716 0.472408 RAD 0.00617284 + txt002 + SPHERE CENTER 0.253381 0.499694 0.478269 RAD 0.00617284 + txt002 + SPHERE CENTER 0.24936 0.51153 0.456976 RAD 0.00617284 + txt002 + SPHERE CENTER 0.218227 0.495961 0.454201 RAD 0.00617284 + txt002 + SPHERE CENTER 0.237 0.500331 0.438769 RAD 0.00617284 + txt002 + SPHERE CENTER 0.228661 0.477296 0.441856 RAD 0.00617284 + txt002 + SPHERE CENTER 0.222248 0.484125 0.475494 RAD 0.00617284 + txt002 + SPHERE CENTER 0.232683 0.46546 0.463149 RAD 0.00617284 + txt002 + SPHERE CENTER 0.245042 0.476659 0.481355 RAD 0.00617284 + txt002 + SPHERE CENTER 0.334488 0.529584 0.436618 RAD 0.0185185 + txt002 + SPHERE CENTER 0.347572 0.546497 0.424272 RAD 0.00617284 + txt002 + SPHERE CENTER 0.352406 0.522481 0.421186 RAD 0.00617284 + txt002 + SPHERE CENTER 0.331508 0.532117 0.412239 RAD 0.00617284 + txt002 + SPHERE CENTER 0.329654 0.5536 0.439705 RAD 0.00617284 + txt002 + SPHERE CENTER 0.313589 0.53922 0.427671 RAD 0.00617284 + txt002 + SPHERE CENTER 0.31657 0.536686 0.45205 RAD 0.00617284 + txt002 + SPHERE CENTER 0.350552 0.543964 0.448652 RAD 0.00617284 + txt002 + SPHERE CENTER 0.337468 0.52705 0.460998 RAD 0.00617284 + txt002 + SPHERE CENTER 0.355387 0.519948 0.445566 RAD 0.00617284 + txt002 + SPHERE CENTER 0.304247 0.499343 0.497099 RAD 0.0185185 + txt002 + SPHERE CENTER 0.314219 0.518259 0.509445 RAD 0.00617284 + txt002 + SPHERE CENTER 0.328108 0.504895 0.494013 RAD 0.00617284 + txt002 + SPHERE CENTER 0.310678 0.519922 0.485065 RAD 0.00617284 + txt002 + SPHERE CENTER 0.290358 0.512708 0.512531 RAD 0.00617284 + txt002 + SPHERE CENTER 0.286818 0.51437 0.488152 RAD 0.00617284 + txt002 + SPHERE CENTER 0.280387 0.493791 0.500186 RAD 0.00617284 + txt002 + SPHERE CENTER 0.307788 0.49768 0.521479 RAD 0.00617284 + txt002 + SPHERE CENTER 0.297816 0.478764 0.509133 RAD 0.00617284 + txt002 + SPHERE CENTER 0.321677 0.484316 0.506047 RAD 0.00617284 + txt002 + SPHERE CENTER 0.367935 0.472692 0.470257 RAD 0.0185185 + txt002 + SPHERE CENTER 0.389488 0.48474 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER 0.379669 0.477004 0.448964 RAD 0.00617284 + txt002 + SPHERE CENTER 0.369235 0.495668 0.46131 RAD 0.00617284 + txt002 + SPHERE CENTER 0.377754 0.480429 0.49155 RAD 0.00617284 + txt002 + SPHERE CENTER 0.357501 0.491357 0.482603 RAD 0.00617284 + txt002 + SPHERE CENTER 0.356202 0.46838 0.49155 RAD 0.00617284 + txt002 + SPHERE CENTER 0.388188 0.461764 0.479204 RAD 0.00617284 + txt002 + SPHERE CENTER 0.366636 0.449715 0.479204 RAD 0.00617284 + txt002 + SPHERE CENTER 0.37837 0.454027 0.457911 RAD 0.00617284 + txt002 + SPHERE CENTER 0.230635 0.38777 0.729516 RAD 0.0555556 + txt002 + SPHERE CENTER 0.2506 0.446614 0.769837 RAD 0.0185185 + txt002 + SPHERE CENTER 0.264242 0.467193 0.770086 RAD 0.00617284 + txt002 + SPHERE CENTER 0.272442 0.447086 0.758332 RAD 0.00617284 + txt002 + SPHERE CENTER 0.253384 0.459832 0.749168 RAD 0.00617284 + txt002 + SPHERE CENTER 0.2424 0.46672 0.781591 RAD 0.00617284 + txt002 + SPHERE CENTER 0.231541 0.459359 0.760673 RAD 0.00617284 + txt002 + SPHERE CENTER 0.228758 0.446141 0.781342 RAD 0.00617284 + txt002 + SPHERE CENTER 0.261459 0.453974 0.790755 RAD 0.00617284 + txt002 + SPHERE CENTER 0.247817 0.433396 0.790506 RAD 0.00617284 + txt002 + SPHERE CENTER 0.269659 0.433868 0.779001 RAD 0.00617284 + txt002 + SPHERE CENTER 0.301839 0.407906 0.732914 RAD 0.0185185 + txt002 + SPHERE CENTER 0.319874 0.420236 0.72141 RAD 0.00617284 + txt002 + SPHERE CENTER 0.303021 0.407886 0.708251 RAD 0.00617284 + txt002 + SPHERE CENTER 0.296625 0.428474 0.720288 RAD 0.00617284 + txt002 + SPHERE CENTER 0.318692 0.420256 0.746073 RAD 0.00617284 + txt002 + SPHERE CENTER 0.295442 0.428494 0.744951 RAD 0.00617284 + txt002 + SPHERE CENTER 0.300656 0.407926 0.757577 RAD 0.00617284 + txt002 + SPHERE CENTER 0.325088 0.399668 0.734036 RAD 0.00617284 + txt002 + SPHERE CENTER 0.307053 0.387338 0.745541 RAD 0.00617284 + txt002 + SPHERE CENTER 0.308235 0.387318 0.720878 RAD 0.00617284 + txt002 + SPHERE CENTER 0.253236 0.449775 0.695877 RAD 0.0185185 + txt002 + SPHERE CENTER 0.263032 0.459076 0.675209 RAD 0.00617284 + txt002 + SPHERE CENTER 0.270029 0.436804 0.683251 RAD 0.00617284 + txt002 + SPHERE CENTER 0.247378 0.440021 0.673964 RAD 0.00617284 + txt002 + SPHERE CENTER 0.246239 0.472047 0.687835 RAD 0.00617284 + txt002 + SPHERE CENTER 0.230585 0.452992 0.68659 RAD 0.00617284 + txt002 + SPHERE CENTER 0.236443 0.462746 0.708504 RAD 0.00617284 + txt002 + SPHERE CENTER 0.26889 0.468829 0.697123 RAD 0.00617284 + txt002 + SPHERE CENTER 0.259094 0.459528 0.717791 RAD 0.00617284 + txt002 + SPHERE CENTER 0.275887 0.446557 0.705165 RAD 0.00617284 + txt002 + SPHERE CENTER 0.179397 0.426478 0.766439 RAD 0.0185185 + txt002 + SPHERE CENTER 0.174744 0.447688 0.778193 RAD 0.00617284 + txt002 + SPHERE CENTER 0.197172 0.437457 0.779597 RAD 0.00617284 + txt002 + SPHERE CENTER 0.1895 0.447523 0.758396 RAD 0.00617284 + txt002 + SPHERE CENTER 0.156968 0.436708 0.765035 RAD 0.00617284 + txt002 + SPHERE CENTER 0.171724 0.436544 0.745238 RAD 0.00617284 + txt002 + SPHERE CENTER 0.161621 0.415499 0.753281 RAD 0.00617284 + txt002 + SPHERE CENTER 0.164641 0.426642 0.786236 RAD 0.00617284 + txt002 + SPHERE CENTER 0.169293 0.405432 0.774481 RAD 0.00617284 + txt002 + SPHERE CENTER 0.187069 0.416412 0.787639 RAD 0.00617284 + txt002 + SPHERE CENTER 0.182032 0.429639 0.692479 RAD 0.0185185 + txt002 + SPHERE CENTER 0.177682 0.45215 0.683315 RAD 0.00617284 + txt002 + SPHERE CENTER 0.190087 0.449636 0.704516 RAD 0.00617284 + txt002 + SPHERE CENTER 0.200611 0.44299 0.683192 RAD 0.00617284 + txt002 + SPHERE CENTER 0.169628 0.432153 0.671279 RAD 0.00617284 + txt002 + SPHERE CENTER 0.192556 0.422992 0.671155 RAD 0.00617284 + txt002 + SPHERE CENTER 0.173978 0.409641 0.680442 RAD 0.00617284 + txt002 + SPHERE CENTER 0.159104 0.438799 0.692603 RAD 0.00617284 + txt002 + SPHERE CENTER 0.163454 0.416288 0.701767 RAD 0.00617284 + txt002 + SPHERE CENTER 0.171508 0.436286 0.713804 RAD 0.00617284 + txt002 + SPHERE CENTER 0.159431 0.367634 0.726118 RAD 0.0185185 + txt002 + SPHERE CENTER 0.13761 0.368692 0.737623 RAD 0.00617284 + txt002 + SPHERE CENTER 0.158434 0.366998 0.750781 RAD 0.00617284 + txt002 + SPHERE CENTER 0.153102 0.387887 0.738744 RAD 0.00617284 + txt002 + SPHERE CENTER 0.138607 0.369329 0.71296 RAD 0.00617284 + txt002 + SPHERE CENTER 0.154099 0.388523 0.714081 RAD 0.00617284 + txt002 + SPHERE CENTER 0.160429 0.36827 0.701455 RAD 0.00617284 + txt002 + SPHERE CENTER 0.14394 0.34844 0.724997 RAD 0.00617284 + txt002 + SPHERE CENTER 0.165761 0.347381 0.713492 RAD 0.00617284 + txt002 + SPHERE CENTER 0.164764 0.346745 0.738155 RAD 0.00617284 + txt002 + SPHERE CENTER 0.227999 0.384609 0.803476 RAD 0.0185185 + txt002 + SPHERE CENTER 0.237348 0.393812 0.824394 RAD 0.00617284 + txt002 + SPHERE CENTER 0.251829 0.390976 0.804597 RAD 0.00617284 + txt002 + SPHERE CENTER 0.234368 0.408432 0.804721 RAD 0.00617284 + txt002 + SPHERE CENTER 0.213518 0.387445 0.823273 RAD 0.00617284 + txt002 + SPHERE CENTER 0.210538 0.402066 0.8036 RAD 0.00617284 + txt002 + SPHERE CENTER 0.204169 0.378242 0.802355 RAD 0.00617284 + txt002 + SPHERE CENTER 0.23098 0.369989 0.823149 RAD 0.00617284 + txt002 + SPHERE CENTER 0.221631 0.360786 0.802231 RAD 0.00617284 + txt002 + SPHERE CENTER 0.245461 0.367152 0.803352 RAD 0.00617284 + txt002 + SPHERE CENTER 0.208034 0.325765 0.763155 RAD 0.0185185 + txt002 + SPHERE CENTER 0.209548 0.312342 0.783824 RAD 0.00617284 + txt002 + SPHERE CENTER 0.229235 0.324887 0.775781 RAD 0.00617284 + txt002 + SPHERE CENTER 0.209827 0.337 0.785069 RAD 0.00617284 + txt002 + SPHERE CENTER 0.188347 0.31322 0.771198 RAD 0.00617284 + txt002 + SPHERE CENTER 0.188626 0.337878 0.772443 RAD 0.00617284 + txt002 + SPHERE CENTER 0.186834 0.326643 0.750529 RAD 0.00617284 + txt002 + SPHERE CENTER 0.207755 0.301107 0.76191 RAD 0.00617284 + txt002 + SPHERE CENTER 0.206242 0.31453 0.741241 RAD 0.00617284 + txt002 + SPHERE CENTER 0.227442 0.313652 0.753867 RAD 0.00617284 + txt002 + SPHERE CENTER 0.279238 0.345901 0.766553 RAD 0.0185185 + txt002 + SPHERE CENTER 0.302145 0.344931 0.775717 RAD 0.00617284 + txt002 + SPHERE CENTER 0.297823 0.356827 0.754517 RAD 0.00617284 + txt002 + SPHERE CENTER 0.289691 0.366251 0.775841 RAD 0.00617284 + txt002 + SPHERE CENTER 0.28356 0.334005 0.787754 RAD 0.00617284 + txt002 + SPHERE CENTER 0.271106 0.355325 0.787878 RAD 0.00617284 + txt002 + SPHERE CENTER 0.260653 0.334975 0.77859 RAD 0.00617284 + txt002 + SPHERE CENTER 0.291692 0.324581 0.766429 RAD 0.00617284 + txt002 + SPHERE CENTER 0.268785 0.325551 0.757266 RAD 0.00617284 + txt002 + SPHERE CENTER 0.28737 0.336477 0.745229 RAD 0.00617284 + txt002 + SPHERE CENTER 0.115031 0.4293 0.544331 RAD 0.0555556 + txt002 + SPHERE CENTER 0.102505 0.502308 0.544331 RAD 0.0185185 + txt002 + SPHERE CENTER 0.110567 0.524146 0.536101 RAD 0.00617284 + txt002 + SPHERE CENTER 0.126738 0.506465 0.542066 RAD 0.00617284 + txt002 + SPHERE CENTER 0.112687 0.504055 0.521905 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0863343 0.519988 0.538366 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0884544 0.499897 0.524171 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0782715 0.49815 0.546597 RAD 0.00617284 + txt002 + SPHERE CENTER 0.100385 0.522399 0.558526 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0923218 0.500561 0.566757 RAD 0.00617284 + txt002 + SPHERE CENTER 0.116555 0.504718 0.564491 RAD 0.00617284 + txt002 + SPHERE CENTER 0.160392 0.474661 0.581368 RAD 0.0185185 + txt002 + SPHERE CENTER 0.177777 0.492047 0.579103 RAD 0.00617284 + txt002 + SPHERE CENTER 0.176681 0.473492 0.56285 RAD 0.00617284 + txt002 + SPHERE CENTER 0.159222 0.490951 0.56285 RAD 0.00617284 + txt002 + SPHERE CENTER 0.161488 0.493217 0.597621 RAD 0.00617284 + txt002 + SPHERE CENTER 0.142932 0.492121 0.581368 RAD 0.00617284 + txt002 + SPHERE CENTER 0.144102 0.475831 0.599887 RAD 0.00617284 + txt002 + SPHERE CENTER 0.178947 0.475757 0.597621 RAD 0.00617284 + txt002 + SPHERE CENTER 0.161561 0.458371 0.599887 RAD 0.00617284 + txt002 + SPHERE CENTER 0.177851 0.457202 0.581368 RAD 0.00617284 + txt002 + SPHERE CENTER 0.160392 0.474661 0.507294 RAD 0.0185185 + txt002 + SPHERE CENTER 0.167697 0.481967 0.484868 RAD 0.00617284 + txt002 + SPHERE CENTER 0.161561 0.458371 0.488775 RAD 0.00617284 + txt002 + SPHERE CENTER 0.144102 0.475831 0.488775 RAD 0.00617284 + txt002 + SPHERE CENTER 0.166528 0.498257 0.503387 RAD 0.00617284 + txt002 + SPHERE CENTER 0.142932 0.492121 0.507294 RAD 0.00617284 + txt002 + SPHERE CENTER 0.159222 0.490951 0.525813 RAD 0.00617284 + txt002 + SPHERE CENTER 0.183987 0.480797 0.503387 RAD 0.00617284 + txt002 + SPHERE CENTER 0.176681 0.473492 0.525813 RAD 0.00617284 + txt002 + SPHERE CENTER 0.177851 0.457202 0.507294 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0571437 0.456947 0.507294 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0450372 0.477623 0.501329 RAD 0.00617284 + txt002 + SPHERE CENTER 0.055591 0.475469 0.523547 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0696413 0.47788 0.503387 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0465898 0.4591 0.485076 RAD 0.00617284 + txt002 + SPHERE CENTER 0.071194 0.459357 0.487134 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0586963 0.438424 0.491041 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0325396 0.45669 0.505236 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0446461 0.436013 0.511201 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0430934 0.454536 0.527454 RAD 0.00617284 + txt002 + SPHERE CENTER 0.115031 0.4293 0.470257 RAD 0.0185185 + txt002 + SPHERE CENTER 0.10495 0.439381 0.450097 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0911807 0.435691 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER 0.10864 0.45315 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER 0.128801 0.43299 0.450097 RAD 0.00617284 + txt002 + SPHERE CENTER 0.13249 0.44676 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER 0.138881 0.42291 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER 0.111341 0.415531 0.450097 RAD 0.00617284 + txt002 + SPHERE CENTER 0.121421 0.40545 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0975713 0.411841 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0696698 0.383939 0.507294 RAD 0.0185185 + txt002 + SPHERE CENTER 0.052284 0.366554 0.509559 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0708393 0.36765 0.525813 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0533799 0.385109 0.525813 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0511144 0.382844 0.491041 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0522103 0.401399 0.507294 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0685002 0.400229 0.488775 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0685739 0.365384 0.491041 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0859596 0.38277 0.488775 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0871292 0.36648 0.507294 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0571437 0.456947 0.581368 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0493251 0.475575 0.595564 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0725262 0.467381 0.597621 RAD 0.00617284 + txt002 + SPHERE CENTER 0.06557 0.479825 0.577461 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0339426 0.465141 0.57931 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0501875 0.46939 0.561208 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0417612 0.446512 0.565115 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0408988 0.452697 0.599471 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0487174 0.434069 0.585275 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0640999 0.444504 0.601529 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0696698 0.383939 0.581368 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0623642 0.376634 0.603794 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0859596 0.38277 0.599887 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0685002 0.400229 0.599887 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0460743 0.377803 0.585275 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0522103 0.401399 0.581368 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0533799 0.385109 0.56285 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0635337 0.360344 0.585275 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0708393 0.36765 0.56285 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0871292 0.36648 0.581368 RAD 0.00617284 + txt002 + SPHERE CENTER 0.115031 0.4293 0.618405 RAD 0.0185185 + txt002 + SPHERE CENTER 0.125111 0.439381 0.638566 RAD 0.00617284 + txt002 + SPHERE CENTER 0.138881 0.435691 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER 0.121421 0.45315 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER 0.101261 0.43299 0.638566 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0975713 0.44676 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0911807 0.42291 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER 0.11872 0.415531 0.638566 RAD 0.00617284 + txt002 + SPHERE CENTER 0.10864 0.40545 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER 0.13249 0.411841 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER 0.082487 0.239622 0.655442 RAD 0.0555556 + txt002 + SPHERE CENTER 0.0438957 0.258053 0.715923 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0426858 0.273525 0.735128 RAD 0.00617284 + txt002 + SPHERE CENTER 0.064638 0.265928 0.726759 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0510334 0.281546 0.713318 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0219434 0.26565 0.724292 RAD 0.00617284 + txt002 + SPHERE CENTER 0.030291 0.273671 0.702483 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0231533 0.250178 0.705088 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0355481 0.250032 0.737733 RAD 0.00617284 + txt002 + SPHERE CENTER 0.036758 0.23456 0.718528 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0575003 0.242434 0.729364 RAD 0.00617284 + txt002 + SPHERE CENTER 0.117687 0.252557 0.719322 RAD 0.0185185 + txt002 + SPHERE CENTER 0.135677 0.265544 0.730157 RAD 0.00617284 + txt002 + SPHERE CENTER 0.138361 0.25778 0.706872 RAD 0.00617284 + txt002 + SPHERE CENTER 0.12224 0.275732 0.71212 RAD 0.00617284 + txt002 + SPHERE CENTER 0.115003 0.26032 0.742607 RAD 0.00617284 + txt002 + SPHERE CENTER 0.101567 0.270508 0.72457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.097014 0.247334 0.731771 RAD 0.00617284 + txt002 + SPHERE CENTER 0.131123 0.242369 0.737359 RAD 0.00617284 + txt002 + SPHERE CENTER 0.113134 0.229382 0.726523 RAD 0.00617284 + txt002 + SPHERE CENTER 0.133808 0.234605 0.714074 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0863845 0.308551 0.682285 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0971427 0.330622 0.67968 RAD 0.00617284 + txt002 + SPHERE CENTER 0.109956 0.310023 0.675083 RAD 0.00617284 + txt002 + SPHERE CENTER 0.091905 0.317013 0.659755 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0735708 0.329151 0.686881 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0683331 0.315541 0.666956 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0628126 0.30708 0.689486 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0916222 0.322161 0.702209 RAD 0.00617284 + txt002 + SPHERE CENTER 0.080864 0.30009 0.704814 RAD 0.00617284 + txt002 + SPHERE CENTER 0.104436 0.301561 0.697613 RAD 0.00617284 + txt002 + SPHERE CENTER 0.00869528 0.245118 0.652044 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0110117 0.257416 0.660413 RAD 0.00617284 + txt002 + SPHERE CENTER 0.00823377 0.253319 0.675329 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0102865 0.269325 0.656641 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0105502 0.249215 0.637128 RAD 0.00617284 + txt002 + SPHERE CENTER 0.010748 0.261124 0.633356 RAD 0.00617284 + txt002 + SPHERE CENTER 0.00915679 0.236916 0.628759 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0126029 0.233209 0.655816 RAD 0.00617284 + txt002 + SPHERE CENTER 0.00710408 0.22091 0.647447 RAD 0.00617284 + txt002 + SPHERE CENTER 0.00664257 0.229111 0.670732 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0511841 0.295616 0.618405 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0555846 0.315856 0.604965 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0705987 0.309941 0.623653 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0705297 0.296292 0.603077 RAD 0.00617284 + txt002 + SPHERE CENTER 0.03617 0.301531 0.599717 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0511152 0.281968 0.597829 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0317696 0.281291 0.613157 RAD 0.00617284 + txt002 + SPHERE CENTER 0.036239 0.31518 0.620293 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0318385 0.29494 0.633733 RAD 0.00617284 + txt002 + SPHERE CENTER 0.051253 0.309265 0.638981 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0472866 0.226687 0.591563 RAD 0.0185185 + txt002 + SPHERE CENTER 0.025169 0.224935 0.580727 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0281502 0.217281 0.604012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0288111 0.241399 0.598764 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0443054 0.234341 0.568278 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0479475 0.250805 0.586315 RAD 0.00617284 + txt002 + SPHERE CENTER 0.066423 0.236092 0.579113 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0436445 0.210223 0.573526 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0657621 0.211974 0.584361 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0466257 0.202569 0.596811 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0399982 0.189123 0.689081 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0335228 0.179527 0.71089 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0567332 0.187058 0.707118 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0385291 0.203632 0.709006 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0167878 0.181593 0.692853 RAD 0.00617284 + txt002 + SPHERE CENTER 0.021794 0.205698 0.690969 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0232631 0.191189 0.671044 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0349919 0.165018 0.690965 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0414672 0.174615 0.669156 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0582023 0.172549 0.687193 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0785895 0.170692 0.6286 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0867911 0.147549 0.631205 RAD 0.00617284 + txt002 + SPHERE CENTER 0.101845 0.166573 0.635801 RAD 0.00617284 + txt002 + SPHERE CENTER 0.083121 0.161663 0.65113 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0635354 0.151669 0.624003 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0598652 0.165782 0.643928 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0553337 0.174812 0.621398 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0822597 0.156579 0.608675 RAD 0.00617284 + txt002 + SPHERE CENTER 0.074058 0.179722 0.60607 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0973138 0.175603 0.613272 RAD 0.00617284 + txt002 + SPHERE CENTER 0.11379 0.183628 0.692479 RAD 0.0185185 + txt002 + SPHERE CENTER 0.133336 0.176775 0.705919 RAD 0.00617284 + txt002 + SPHERE CENTER 0.136161 0.192663 0.687231 RAD 0.00617284 + txt002 + SPHERE CENTER 0.124499 0.199753 0.707807 RAD 0.00617284 + txt002 + SPHERE CENTER 0.110965 0.167739 0.711167 RAD 0.00617284 + txt002 + SPHERE CENTER 0.102127 0.190718 0.713055 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0914184 0.174592 0.697727 RAD 0.00617284 + txt002 + SPHERE CENTER 0.122627 0.160649 0.690591 RAD 0.00617284 + txt002 + SPHERE CENTER 0.103081 0.167502 0.677151 RAD 0.00617284 + txt002 + SPHERE CENTER 0.125452 0.176537 0.671903 RAD 0.00617284 + txt002 + SPHERE CENTER 0.38777 0.230635 0.729516 RAD 0.0555556 + txt002 + SPHERE CENTER 0.446614 0.2506 0.769837 RAD 0.0185185 + txt002 + SPHERE CENTER 0.467193 0.264242 0.770086 RAD 0.00617284 + txt002 + SPHERE CENTER 0.459832 0.253384 0.749168 RAD 0.00617284 + txt002 + SPHERE CENTER 0.447086 0.272442 0.758332 RAD 0.00617284 + txt002 + SPHERE CENTER 0.453974 0.261459 0.790755 RAD 0.00617284 + txt002 + SPHERE CENTER 0.433868 0.269659 0.779001 RAD 0.00617284 + txt002 + SPHERE CENTER 0.433396 0.247817 0.790506 RAD 0.00617284 + txt002 + SPHERE CENTER 0.46672 0.2424 0.781591 RAD 0.00617284 + txt002 + SPHERE CENTER 0.446141 0.228758 0.781342 RAD 0.00617284 + txt002 + SPHERE CENTER 0.459359 0.231541 0.760673 RAD 0.00617284 + txt002 + SPHERE CENTER 0.449775 0.253236 0.695877 RAD 0.0185185 + txt002 + SPHERE CENTER 0.459076 0.263032 0.675209 RAD 0.00617284 + txt002 + SPHERE CENTER 0.440021 0.247378 0.673964 RAD 0.00617284 + txt002 + SPHERE CENTER 0.436804 0.270029 0.683251 RAD 0.00617284 + txt002 + SPHERE CENTER 0.468829 0.26889 0.697123 RAD 0.00617284 + txt002 + SPHERE CENTER 0.446557 0.275887 0.705165 RAD 0.00617284 + txt002 + SPHERE CENTER 0.459528 0.259094 0.717791 RAD 0.00617284 + txt002 + SPHERE CENTER 0.472047 0.246239 0.687835 RAD 0.00617284 + txt002 + SPHERE CENTER 0.462746 0.236443 0.708504 RAD 0.00617284 + txt002 + SPHERE CENTER 0.452992 0.230585 0.68659 RAD 0.00617284 + txt002 + SPHERE CENTER 0.407906 0.301839 0.732914 RAD 0.0185185 + txt002 + SPHERE CENTER 0.420236 0.319874 0.72141 RAD 0.00617284 + txt002 + SPHERE CENTER 0.428474 0.296625 0.720288 RAD 0.00617284 + txt002 + SPHERE CENTER 0.407886 0.303021 0.708251 RAD 0.00617284 + txt002 + SPHERE CENTER 0.399668 0.325088 0.734036 RAD 0.00617284 + txt002 + SPHERE CENTER 0.387318 0.308235 0.720878 RAD 0.00617284 + txt002 + SPHERE CENTER 0.387338 0.307053 0.745541 RAD 0.00617284 + txt002 + SPHERE CENTER 0.420256 0.318692 0.746073 RAD 0.00617284 + txt002 + SPHERE CENTER 0.407926 0.300656 0.757577 RAD 0.00617284 + txt002 + SPHERE CENTER 0.428494 0.295442 0.744951 RAD 0.00617284 + txt002 + SPHERE CENTER 0.384609 0.227999 0.803476 RAD 0.0185185 + txt002 + SPHERE CENTER 0.393812 0.237348 0.824394 RAD 0.00617284 + txt002 + SPHERE CENTER 0.408432 0.234368 0.804721 RAD 0.00617284 + txt002 + SPHERE CENTER 0.390976 0.251829 0.804597 RAD 0.00617284 + txt002 + SPHERE CENTER 0.369989 0.23098 0.823149 RAD 0.00617284 + txt002 + SPHERE CENTER 0.367152 0.245461 0.803352 RAD 0.00617284 + txt002 + SPHERE CENTER 0.360786 0.221631 0.802231 RAD 0.00617284 + txt002 + SPHERE CENTER 0.387445 0.213518 0.823273 RAD 0.00617284 + txt002 + SPHERE CENTER 0.378242 0.204169 0.802355 RAD 0.00617284 + txt002 + SPHERE CENTER 0.402066 0.210538 0.8036 RAD 0.00617284 + txt002 + SPHERE CENTER 0.345901 0.279238 0.766553 RAD 0.0185185 + txt002 + SPHERE CENTER 0.344931 0.302145 0.775717 RAD 0.00617284 + txt002 + SPHERE CENTER 0.366251 0.289691 0.775841 RAD 0.00617284 + txt002 + SPHERE CENTER 0.356827 0.297823 0.754517 RAD 0.00617284 + txt002 + SPHERE CENTER 0.324581 0.291692 0.766429 RAD 0.00617284 + txt002 + SPHERE CENTER 0.336477 0.28737 0.745229 RAD 0.00617284 + txt002 + SPHERE CENTER 0.325551 0.268785 0.757266 RAD 0.00617284 + txt002 + SPHERE CENTER 0.334005 0.28356 0.787754 RAD 0.00617284 + txt002 + SPHERE CENTER 0.334975 0.260653 0.77859 RAD 0.00617284 + txt002 + SPHERE CENTER 0.355325 0.271106 0.787878 RAD 0.00617284 + txt002 + SPHERE CENTER 0.325765 0.208034 0.763155 RAD 0.0185185 + txt002 + SPHERE CENTER 0.312342 0.209548 0.783824 RAD 0.00617284 + txt002 + SPHERE CENTER 0.337 0.209827 0.785069 RAD 0.00617284 + txt002 + SPHERE CENTER 0.324887 0.229235 0.775781 RAD 0.00617284 + txt002 + SPHERE CENTER 0.301107 0.207755 0.76191 RAD 0.00617284 + txt002 + SPHERE CENTER 0.313652 0.227442 0.753867 RAD 0.00617284 + txt002 + SPHERE CENTER 0.31453 0.206242 0.741241 RAD 0.00617284 + txt002 + SPHERE CENTER 0.31322 0.188347 0.771198 RAD 0.00617284 + txt002 + SPHERE CENTER 0.326643 0.186834 0.750529 RAD 0.00617284 + txt002 + SPHERE CENTER 0.337878 0.188626 0.772443 RAD 0.00617284 + txt002 + SPHERE CENTER 0.426478 0.179397 0.766439 RAD 0.0185185 + txt002 + SPHERE CENTER 0.447688 0.174744 0.778193 RAD 0.00617284 + txt002 + SPHERE CENTER 0.447523 0.1895 0.758396 RAD 0.00617284 + txt002 + SPHERE CENTER 0.437457 0.197172 0.779597 RAD 0.00617284 + txt002 + SPHERE CENTER 0.426642 0.164641 0.786236 RAD 0.00617284 + txt002 + SPHERE CENTER 0.416412 0.187069 0.787639 RAD 0.00617284 + txt002 + SPHERE CENTER 0.405432 0.169293 0.774481 RAD 0.00617284 + txt002 + SPHERE CENTER 0.436708 0.156968 0.765035 RAD 0.00617284 + txt002 + SPHERE CENTER 0.415499 0.161621 0.753281 RAD 0.00617284 + txt002 + SPHERE CENTER 0.436544 0.171724 0.745238 RAD 0.00617284 + txt002 + SPHERE CENTER 0.367634 0.159431 0.726118 RAD 0.0185185 + txt002 + SPHERE CENTER 0.368692 0.13761 0.737623 RAD 0.00617284 + txt002 + SPHERE CENTER 0.387887 0.153102 0.738744 RAD 0.00617284 + txt002 + SPHERE CENTER 0.366998 0.158434 0.750781 RAD 0.00617284 + txt002 + SPHERE CENTER 0.34844 0.14394 0.724997 RAD 0.00617284 + txt002 + SPHERE CENTER 0.346745 0.164764 0.738155 RAD 0.00617284 + txt002 + SPHERE CENTER 0.347381 0.165761 0.713492 RAD 0.00617284 + txt002 + SPHERE CENTER 0.369329 0.138607 0.71296 RAD 0.00617284 + txt002 + SPHERE CENTER 0.36827 0.160429 0.701455 RAD 0.00617284 + txt002 + SPHERE CENTER 0.388523 0.154099 0.714081 RAD 0.00617284 + txt002 + SPHERE CENTER 0.429639 0.182032 0.692479 RAD 0.0185185 + txt002 + SPHERE CENTER 0.45215 0.177682 0.683315 RAD 0.00617284 + txt002 + SPHERE CENTER 0.44299 0.200611 0.683192 RAD 0.00617284 + txt002 + SPHERE CENTER 0.449636 0.190087 0.704516 RAD 0.00617284 + txt002 + SPHERE CENTER 0.438799 0.159104 0.692603 RAD 0.00617284 + txt002 + SPHERE CENTER 0.436286 0.171508 0.713804 RAD 0.00617284 + txt002 + SPHERE CENTER 0.416288 0.163454 0.701767 RAD 0.00617284 + txt002 + SPHERE CENTER 0.432153 0.169628 0.671279 RAD 0.00617284 + txt002 + SPHERE CENTER 0.409641 0.173978 0.680442 RAD 0.00617284 + txt002 + SPHERE CENTER 0.422992 0.192556 0.671155 RAD 0.00617284 + txt002 + SPHERE CENTER 0.239622 0.082487 0.655442 RAD 0.0555556 + txt002 + SPHERE CENTER 0.258053 0.0438957 0.715923 RAD 0.0185185 + txt002 + SPHERE CENTER 0.273525 0.0426858 0.735128 RAD 0.00617284 + txt002 + SPHERE CENTER 0.281546 0.0510334 0.713318 RAD 0.00617284 + txt002 + SPHERE CENTER 0.265928 0.064638 0.726759 RAD 0.00617284 + txt002 + SPHERE CENTER 0.250032 0.0355481 0.737733 RAD 0.00617284 + txt002 + SPHERE CENTER 0.242434 0.0575003 0.729364 RAD 0.00617284 + txt002 + SPHERE CENTER 0.23456 0.036758 0.718528 RAD 0.00617284 + txt002 + SPHERE CENTER 0.26565 0.0219434 0.724292 RAD 0.00617284 + txt002 + SPHERE CENTER 0.250178 0.0231533 0.705088 RAD 0.00617284 + txt002 + SPHERE CENTER 0.273671 0.030291 0.702483 RAD 0.00617284 + txt002 + SPHERE CENTER 0.308551 0.0863845 0.682285 RAD 0.0185185 + txt002 + SPHERE CENTER 0.330622 0.0971427 0.67968 RAD 0.00617284 + txt002 + SPHERE CENTER 0.317013 0.091905 0.659755 RAD 0.00617284 + txt002 + SPHERE CENTER 0.310023 0.109956 0.675083 RAD 0.00617284 + txt002 + SPHERE CENTER 0.322161 0.0916222 0.702209 RAD 0.00617284 + txt002 + SPHERE CENTER 0.301561 0.104436 0.697613 RAD 0.00617284 + txt002 + SPHERE CENTER 0.30009 0.080864 0.704814 RAD 0.00617284 + txt002 + SPHERE CENTER 0.329151 0.0735708 0.686881 RAD 0.00617284 + txt002 + SPHERE CENTER 0.30708 0.0628126 0.689486 RAD 0.00617284 + txt002 + SPHERE CENTER 0.315541 0.0683331 0.666956 RAD 0.00617284 + txt002 + SPHERE CENTER 0.252557 0.117687 0.719322 RAD 0.0185185 + txt002 + SPHERE CENTER 0.265544 0.135677 0.730157 RAD 0.00617284 + txt002 + SPHERE CENTER 0.275732 0.12224 0.71212 RAD 0.00617284 + txt002 + SPHERE CENTER 0.25778 0.138361 0.706872 RAD 0.00617284 + txt002 + SPHERE CENTER 0.242369 0.131123 0.737359 RAD 0.00617284 + txt002 + SPHERE CENTER 0.234605 0.133808 0.714074 RAD 0.00617284 + txt002 + SPHERE CENTER 0.229382 0.113134 0.726523 RAD 0.00617284 + txt002 + SPHERE CENTER 0.26032 0.115003 0.742607 RAD 0.00617284 + txt002 + SPHERE CENTER 0.247334 0.097014 0.731771 RAD 0.00617284 + txt002 + SPHERE CENTER 0.270508 0.101567 0.72457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.189123 0.0399982 0.689081 RAD 0.0185185 + txt002 + SPHERE CENTER 0.179527 0.0335228 0.71089 RAD 0.00617284 + txt002 + SPHERE CENTER 0.203632 0.0385291 0.709006 RAD 0.00617284 + txt002 + SPHERE CENTER 0.187058 0.0567332 0.707118 RAD 0.00617284 + txt002 + SPHERE CENTER 0.165018 0.0349919 0.690965 RAD 0.00617284 + txt002 + SPHERE CENTER 0.172549 0.0582023 0.687193 RAD 0.00617284 + txt002 + SPHERE CENTER 0.174615 0.0414672 0.669156 RAD 0.00617284 + txt002 + SPHERE CENTER 0.181593 0.0167878 0.692853 RAD 0.00617284 + txt002 + SPHERE CENTER 0.191189 0.0232631 0.671044 RAD 0.00617284 + txt002 + SPHERE CENTER 0.205698 0.021794 0.690969 RAD 0.00617284 + txt002 + SPHERE CENTER 0.183628 0.11379 0.692479 RAD 0.0185185 + txt002 + SPHERE CENTER 0.176775 0.133336 0.705919 RAD 0.00617284 + txt002 + SPHERE CENTER 0.199753 0.124499 0.707807 RAD 0.00617284 + txt002 + SPHERE CENTER 0.192663 0.136161 0.687231 RAD 0.00617284 + txt002 + SPHERE CENTER 0.160649 0.122627 0.690591 RAD 0.00617284 + txt002 + SPHERE CENTER 0.176537 0.125452 0.671903 RAD 0.00617284 + txt002 + SPHERE CENTER 0.167502 0.103081 0.677151 RAD 0.00617284 + txt002 + SPHERE CENTER 0.167739 0.110965 0.711167 RAD 0.00617284 + txt002 + SPHERE CENTER 0.174592 0.0914184 0.697727 RAD 0.00617284 + txt002 + SPHERE CENTER 0.190718 0.102127 0.713055 RAD 0.00617284 + txt002 + SPHERE CENTER 0.170692 0.0785895 0.6286 RAD 0.0185185 + txt002 + SPHERE CENTER 0.147549 0.0867911 0.631205 RAD 0.00617284 + txt002 + SPHERE CENTER 0.161663 0.083121 0.65113 RAD 0.00617284 + txt002 + SPHERE CENTER 0.166573 0.101845 0.635801 RAD 0.00617284 + txt002 + SPHERE CENTER 0.156579 0.0822597 0.608675 RAD 0.00617284 + txt002 + SPHERE CENTER 0.175603 0.0973138 0.613272 RAD 0.00617284 + txt002 + SPHERE CENTER 0.179722 0.074058 0.60607 RAD 0.00617284 + txt002 + SPHERE CENTER 0.151669 0.0635354 0.624003 RAD 0.00617284 + txt002 + SPHERE CENTER 0.174812 0.0553337 0.621398 RAD 0.00617284 + txt002 + SPHERE CENTER 0.165782 0.0598652 0.643928 RAD 0.00617284 + txt002 + SPHERE CENTER 0.245118 0.00869528 0.652044 RAD 0.0185185 + txt002 + SPHERE CENTER 0.257416 -0.0110117 0.660413 RAD 0.00617284 + txt002 + SPHERE CENTER 0.269325 0.0102865 0.656641 RAD 0.00617284 + txt002 + SPHERE CENTER 0.253319 0.00823377 0.675329 RAD 0.00617284 + txt002 + SPHERE CENTER 0.233209 -0.0126029 0.655816 RAD 0.00617284 + txt002 + SPHERE CENTER 0.229111 0.00664257 0.670732 RAD 0.00617284 + txt002 + SPHERE CENTER 0.22091 0.00710408 0.647447 RAD 0.00617284 + txt002 + SPHERE CENTER 0.249215 -0.0105502 0.637128 RAD 0.00617284 + txt002 + SPHERE CENTER 0.236916 0.00915679 0.628759 RAD 0.00617284 + txt002 + SPHERE CENTER 0.261124 0.010748 0.633356 RAD 0.00617284 + txt002 + SPHERE CENTER 0.226687 0.0472866 0.591563 RAD 0.0185185 + txt002 + SPHERE CENTER 0.224935 0.025169 0.580727 RAD 0.00617284 + txt002 + SPHERE CENTER 0.241399 0.0288111 0.598764 RAD 0.00617284 + txt002 + SPHERE CENTER 0.217281 0.0281502 0.604012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.210223 0.0436445 0.573526 RAD 0.00617284 + txt002 + SPHERE CENTER 0.202569 0.0466257 0.596811 RAD 0.00617284 + txt002 + SPHERE CENTER 0.211974 0.0657621 0.584361 RAD 0.00617284 + txt002 + SPHERE CENTER 0.234341 0.0443054 0.568278 RAD 0.00617284 + txt002 + SPHERE CENTER 0.236092 0.066423 0.579113 RAD 0.00617284 + txt002 + SPHERE CENTER 0.250805 0.0479475 0.586315 RAD 0.00617284 + txt002 + SPHERE CENTER 0.295616 0.0511841 0.618405 RAD 0.0185185 + txt002 + SPHERE CENTER 0.315856 0.0555846 0.604965 RAD 0.00617284 + txt002 + SPHERE CENTER 0.296292 0.0705297 0.603077 RAD 0.00617284 + txt002 + SPHERE CENTER 0.309941 0.0705987 0.623653 RAD 0.00617284 + txt002 + SPHERE CENTER 0.31518 0.036239 0.620293 RAD 0.00617284 + txt002 + SPHERE CENTER 0.309265 0.051253 0.638981 RAD 0.00617284 + txt002 + SPHERE CENTER 0.29494 0.0318385 0.633733 RAD 0.00617284 + txt002 + SPHERE CENTER 0.301531 0.03617 0.599717 RAD 0.00617284 + txt002 + SPHERE CENTER 0.281291 0.0317696 0.613157 RAD 0.00617284 + txt002 + SPHERE CENTER 0.281968 0.0511152 0.597829 RAD 0.00617284 + txt002 + SPHERE CENTER 0.4293 0.115031 0.544331 RAD 0.0555556 + txt002 + SPHERE CENTER 0.502308 0.102505 0.544331 RAD 0.0185185 + txt002 + SPHERE CENTER 0.524146 0.110567 0.536101 RAD 0.00617284 + txt002 + SPHERE CENTER 0.504055 0.112687 0.521905 RAD 0.00617284 + txt002 + SPHERE CENTER 0.506465 0.126738 0.542066 RAD 0.00617284 + txt002 + SPHERE CENTER 0.522399 0.100385 0.558526 RAD 0.00617284 + txt002 + SPHERE CENTER 0.504718 0.116555 0.564491 RAD 0.00617284 + txt002 + SPHERE CENTER 0.500561 0.0923218 0.566757 RAD 0.00617284 + txt002 + SPHERE CENTER 0.519988 0.0863343 0.538366 RAD 0.00617284 + txt002 + SPHERE CENTER 0.49815 0.0782715 0.546597 RAD 0.00617284 + txt002 + SPHERE CENTER 0.499897 0.0884544 0.524171 RAD 0.00617284 + txt002 + SPHERE CENTER 0.474661 0.160392 0.507294 RAD 0.0185185 + txt002 + SPHERE CENTER 0.481967 0.167697 0.484868 RAD 0.00617284 + txt002 + SPHERE CENTER 0.475831 0.144102 0.488775 RAD 0.00617284 + txt002 + SPHERE CENTER 0.458371 0.161561 0.488775 RAD 0.00617284 + txt002 + SPHERE CENTER 0.480797 0.183987 0.503387 RAD 0.00617284 + txt002 + SPHERE CENTER 0.457202 0.177851 0.507294 RAD 0.00617284 + txt002 + SPHERE CENTER 0.473492 0.176681 0.525813 RAD 0.00617284 + txt002 + SPHERE CENTER 0.498257 0.166528 0.503387 RAD 0.00617284 + txt002 + SPHERE CENTER 0.490951 0.159222 0.525813 RAD 0.00617284 + txt002 + SPHERE CENTER 0.492121 0.142932 0.507294 RAD 0.00617284 + txt002 + SPHERE CENTER 0.474661 0.160392 0.581368 RAD 0.0185185 + txt002 + SPHERE CENTER 0.492047 0.177777 0.579103 RAD 0.00617284 + txt002 + SPHERE CENTER 0.490951 0.159222 0.56285 RAD 0.00617284 + txt002 + SPHERE CENTER 0.473492 0.176681 0.56285 RAD 0.00617284 + txt002 + SPHERE CENTER 0.475757 0.178947 0.597621 RAD 0.00617284 + txt002 + SPHERE CENTER 0.457202 0.177851 0.581368 RAD 0.00617284 + txt002 + SPHERE CENTER 0.458371 0.161561 0.599887 RAD 0.00617284 + txt002 + SPHERE CENTER 0.493217 0.161488 0.597621 RAD 0.00617284 + txt002 + SPHERE CENTER 0.475831 0.144102 0.599887 RAD 0.00617284 + txt002 + SPHERE CENTER 0.492121 0.142932 0.581368 RAD 0.00617284 + txt002 + SPHERE CENTER 0.456947 0.0571437 0.581368 RAD 0.0185185 + txt002 + SPHERE CENTER 0.475575 0.0493251 0.595564 RAD 0.00617284 + txt002 + SPHERE CENTER 0.479825 0.06557 0.577461 RAD 0.00617284 + txt002 + SPHERE CENTER 0.467381 0.0725262 0.597621 RAD 0.00617284 + txt002 + SPHERE CENTER 0.452697 0.0408988 0.599471 RAD 0.00617284 + txt002 + SPHERE CENTER 0.444504 0.0640999 0.601529 RAD 0.00617284 + txt002 + SPHERE CENTER 0.434069 0.0487174 0.585275 RAD 0.00617284 + txt002 + SPHERE CENTER 0.465141 0.0339426 0.57931 RAD 0.00617284 + txt002 + SPHERE CENTER 0.446512 0.0417612 0.565115 RAD 0.00617284 + txt002 + SPHERE CENTER 0.46939 0.0501875 0.561208 RAD 0.00617284 + txt002 + SPHERE CENTER 0.4293 0.115031 0.618405 RAD 0.0185185 + txt002 + SPHERE CENTER 0.439381 0.125111 0.638566 RAD 0.00617284 + txt002 + SPHERE CENTER 0.45315 0.121421 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER 0.435691 0.138881 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER 0.415531 0.11872 0.638566 RAD 0.00617284 + txt002 + SPHERE CENTER 0.411841 0.13249 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER 0.40545 0.10864 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER 0.43299 0.101261 0.638566 RAD 0.00617284 + txt002 + SPHERE CENTER 0.42291 0.0911807 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER 0.44676 0.0975713 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER 0.383939 0.0696698 0.581368 RAD 0.0185185 + txt002 + SPHERE CENTER 0.376634 0.0623642 0.603794 RAD 0.00617284 + txt002 + SPHERE CENTER 0.400229 0.0685002 0.599887 RAD 0.00617284 + txt002 + SPHERE CENTER 0.38277 0.0859596 0.599887 RAD 0.00617284 + txt002 + SPHERE CENTER 0.360344 0.0635337 0.585275 RAD 0.00617284 + txt002 + SPHERE CENTER 0.36648 0.0871292 0.581368 RAD 0.00617284 + txt002 + SPHERE CENTER 0.36765 0.0708393 0.56285 RAD 0.00617284 + txt002 + SPHERE CENTER 0.377803 0.0460743 0.585275 RAD 0.00617284 + txt002 + SPHERE CENTER 0.385109 0.0533799 0.56285 RAD 0.00617284 + txt002 + SPHERE CENTER 0.401399 0.0522103 0.581368 RAD 0.00617284 + txt002 + SPHERE CENTER 0.456947 0.0571437 0.507294 RAD 0.0185185 + txt002 + SPHERE CENTER 0.477623 0.0450372 0.501329 RAD 0.00617284 + txt002 + SPHERE CENTER 0.47788 0.0696413 0.503387 RAD 0.00617284 + txt002 + SPHERE CENTER 0.475469 0.055591 0.523547 RAD 0.00617284 + txt002 + SPHERE CENTER 0.45669 0.0325396 0.505236 RAD 0.00617284 + txt002 + SPHERE CENTER 0.454536 0.0430934 0.527454 RAD 0.00617284 + txt002 + SPHERE CENTER 0.436013 0.0446461 0.511201 RAD 0.00617284 + txt002 + SPHERE CENTER 0.4591 0.0465898 0.485076 RAD 0.00617284 + txt002 + SPHERE CENTER 0.438424 0.0586963 0.491041 RAD 0.00617284 + txt002 + SPHERE CENTER 0.459357 0.071194 0.487134 RAD 0.00617284 + txt002 + SPHERE CENTER 0.383939 0.0696698 0.507294 RAD 0.0185185 + txt002 + SPHERE CENTER 0.366554 0.052284 0.509559 RAD 0.00617284 + txt002 + SPHERE CENTER 0.385109 0.0533799 0.525813 RAD 0.00617284 + txt002 + SPHERE CENTER 0.36765 0.0708393 0.525813 RAD 0.00617284 + txt002 + SPHERE CENTER 0.365384 0.0685739 0.491041 RAD 0.00617284 + txt002 + SPHERE CENTER 0.36648 0.0871292 0.507294 RAD 0.00617284 + txt002 + SPHERE CENTER 0.38277 0.0859596 0.488775 RAD 0.00617284 + txt002 + SPHERE CENTER 0.382844 0.0511144 0.491041 RAD 0.00617284 + txt002 + SPHERE CENTER 0.400229 0.0685002 0.488775 RAD 0.00617284 + txt002 + SPHERE CENTER 0.401399 0.0522103 0.507294 RAD 0.00617284 + txt002 + SPHERE CENTER 0.4293 0.115031 0.470257 RAD 0.0185185 + txt002 + SPHERE CENTER 0.41922 0.125111 0.450097 RAD 0.00617284 + txt002 + SPHERE CENTER 0.40545 0.121421 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER 0.42291 0.138881 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER 0.44307 0.11872 0.450097 RAD 0.00617284 + txt002 + SPHERE CENTER 0.44676 0.13249 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER 0.45315 0.10864 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER 0.425611 0.101261 0.450097 RAD 0.00617284 + txt002 + SPHERE CENTER 0.435691 0.0911807 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER 0.411841 0.0975713 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER 0.643951 0.172546 1.11022e-16 RAD 0.166667 + txt002 + SPHERE CENTER 0.802608 0.281471 -0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER 0.824035 0.30566 -0.177765 RAD 0.0185185 + txt002 + SPHERE CENTER 0.822021 0.302088 -0.202114 RAD 0.00617284 + txt002 + SPHERE CENTER 0.821938 0.282758 -0.186751 RAD 0.00617284 + txt002 + SPHERE CENTER 0.802598 0.298094 -0.187402 RAD 0.00617284 + txt002 + SPHERE CENTER 0.824119 0.32499 -0.193128 RAD 0.00617284 + txt002 + SPHERE CENTER 0.804695 0.320997 -0.178416 RAD 0.00617284 + txt002 + SPHERE CENTER 0.826132 0.328563 -0.16878 RAD 0.00617284 + txt002 + SPHERE CENTER 0.843459 0.309654 -0.192477 RAD 0.00617284 + txt002 + SPHERE CENTER 0.845472 0.313227 -0.168128 RAD 0.00617284 + txt002 + SPHERE CENTER 0.843375 0.290324 -0.177114 RAD 0.00617284 + txt002 + SPHERE CENTER 0.787796 0.241352 -0.171592 RAD 0.0185185 + txt002 + SPHERE CENTER 0.785699 0.218449 -0.180578 RAD 0.00617284 + txt002 + SPHERE CENTER 0.802677 0.22345 -0.163362 RAD 0.00617284 + txt002 + SPHERE CENTER 0.778718 0.223304 -0.157397 RAD 0.00617284 + txt002 + SPHERE CENTER 0.770818 0.236351 -0.188808 RAD 0.00617284 + txt002 + SPHERE CENTER 0.763837 0.241205 -0.165627 RAD 0.00617284 + txt002 + SPHERE CENTER 0.772915 0.259253 -0.179823 RAD 0.00617284 + txt002 + SPHERE CENTER 0.794777 0.236497 -0.194773 RAD 0.00617284 + txt002 + SPHERE CENTER 0.796874 0.2594 -0.185788 RAD 0.00617284 + txt002 + SPHERE CENTER 0.811756 0.241498 -0.177557 RAD 0.00617284 + txt002 + SPHERE CENTER 0.752156 0.305221 -0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER 0.741263 0.325175 -0.169507 RAD 0.00617284 + txt002 + SPHERE CENTER 0.747715 0.32493 -0.145675 RAD 0.00617284 + txt002 + SPHERE CENTER 0.765112 0.325981 -0.163165 RAD 0.00617284 + txt002 + SPHERE CENTER 0.745704 0.305466 -0.183703 RAD 0.00617284 + txt002 + SPHERE CENTER 0.769553 0.306272 -0.17736 RAD 0.00617284 + txt002 + SPHERE CENTER 0.756597 0.285513 -0.174066 RAD 0.00617284 + txt002 + SPHERE CENTER 0.728307 0.304415 -0.166213 RAD 0.00617284 + txt002 + SPHERE CENTER 0.7392 0.284462 -0.156576 RAD 0.00617284 + txt002 + SPHERE CENTER 0.734759 0.304171 -0.142381 RAD 0.00617284 + txt002 + SPHERE CENTER 0.838847 0.34578 -0.117284 RAD 0.0185185 + txt002 + SPHERE CENTER 0.851488 0.360404 -0.132647 RAD 0.00617284 + txt002 + SPHERE CENTER 0.853509 0.335865 -0.1345 RAD 0.00617284 + txt002 + SPHERE CENTER 0.832518 0.347059 -0.141116 RAD 0.00617284 + txt002 + SPHERE CENTER 0.836826 0.370319 -0.115431 RAD 0.00617284 + txt002 + SPHERE CENTER 0.817857 0.356973 -0.1239 RAD 0.00617284 + txt002 + SPHERE CENTER 0.824185 0.355695 -0.100068 RAD 0.00617284 + txt002 + SPHERE CENTER 0.857816 0.359125 -0.108814 RAD 0.00617284 + txt002 + SPHERE CENTER 0.845176 0.344501 -0.0934517 RAD 0.00617284 + txt002 + SPHERE CENTER 0.859838 0.334587 -0.110668 RAD 0.00617284 + txt002 + SPHERE CENTER 0.766968 0.345341 -0.099389 RAD 0.0185185 + txt002 + SPHERE CENTER 0.768944 0.369945 -0.10004 RAD 0.00617284 + txt002 + SPHERE CENTER 0.788341 0.356172 -0.093424 RAD 0.00617284 + txt002 + SPHERE CENTER 0.780624 0.356171 -0.116879 RAD 0.00617284 + txt002 + SPHERE CENTER 0.747572 0.359113 -0.106005 RAD 0.00617284 + txt002 + SPHERE CENTER 0.759252 0.34534 -0.122844 RAD 0.00617284 + txt002 + SPHERE CENTER 0.745596 0.33451 -0.105354 RAD 0.00617284 + txt002 + SPHERE CENTER 0.755289 0.359115 -0.0825505 RAD 0.00617284 + txt002 + SPHERE CENTER 0.753313 0.334511 -0.0818993 RAD 0.00617284 + txt002 + SPHERE CENTER 0.774685 0.345342 -0.0759343 RAD 0.00617284 + txt002 + SPHERE CENTER 0.817421 0.321591 -0.0506299 RAD 0.0185185 + txt002 + SPHERE CENTER 0.83071 0.340361 -0.0416443 RAD 0.00617284 + txt002 + SPHERE CENTER 0.840365 0.325527 -0.0588603 RAD 0.00617284 + txt002 + SPHERE CENTER 0.822249 0.341208 -0.0648253 RAD 0.00617284 + txt002 + SPHERE CENTER 0.807766 0.336425 -0.0334138 RAD 0.00617284 + txt002 + SPHERE CENTER 0.799305 0.337272 -0.0565949 RAD 0.00617284 + txt002 + SPHERE CENTER 0.794477 0.317654 -0.0423994 RAD 0.00617284 + txt002 + SPHERE CENTER 0.825882 0.320744 -0.0274488 RAD 0.00617284 + txt002 + SPHERE CENTER 0.812593 0.301973 -0.0364345 RAD 0.00617284 + txt002 + SPHERE CENTER 0.835537 0.30591 -0.0446649 RAD 0.00617284 + txt002 + SPHERE CENTER 0.874487 0.28191 -0.129006 RAD 0.0185185 + txt002 + SPHERE CENTER 0.891539 0.292033 -0.143718 RAD 0.00617284 + txt002 + SPHERE CENTER 0.868678 0.28812 -0.152187 RAD 0.00617284 + txt002 + SPHERE CENTER 0.872763 0.305711 -0.135349 RAD 0.00617284 + txt002 + SPHERE CENTER 0.897348 0.285824 -0.120537 RAD 0.00617284 + txt002 + SPHERE CENTER 0.878572 0.299501 -0.112168 RAD 0.00617284 + txt002 + SPHERE CENTER 0.880296 0.275701 -0.105825 RAD 0.00617284 + txt002 + SPHERE CENTER 0.893263 0.268233 -0.137375 RAD 0.00617284 + txt002 + SPHERE CENTER 0.876212 0.25811 -0.122663 RAD 0.00617284 + txt002 + SPHERE CENTER 0.870402 0.264319 -0.145845 RAD 0.00617284 + txt002 + SPHERE CENTER 0.853061 0.257721 -0.062352 RAD 0.0185185 + txt002 + SPHERE CENTER 0.87538 0.26204 -0.0527151 RAD 0.00617284 + txt002 + SPHERE CENTER 0.87108 0.266856 -0.0765474 RAD 0.00617284 + txt002 + SPHERE CENTER 0.860805 0.280934 -0.0590577 RAD 0.00617284 + txt002 + SPHERE CENTER 0.857361 0.252905 -0.0385197 RAD 0.00617284 + txt002 + SPHERE CENTER 0.842785 0.271799 -0.0448623 RAD 0.00617284 + txt002 + SPHERE CENTER 0.835041 0.248586 -0.0481565 RAD 0.00617284 + txt002 + SPHERE CENTER 0.867636 0.238827 -0.0560094 RAD 0.00617284 + txt002 + SPHERE CENTER 0.845317 0.234508 -0.0656463 RAD 0.00617284 + txt002 + SPHERE CENTER 0.863337 0.243643 -0.0798417 RAD 0.00617284 + txt002 + SPHERE CENTER 0.838248 0.217602 -0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER 0.860225 0.206363 -0.122182 RAD 0.00617284 + txt002 + SPHERE CENTER 0.858689 0.230102 -0.128798 RAD 0.00617284 + txt002 + SPHERE CENTER 0.854636 0.223536 -0.105343 RAD 0.00617284 + txt002 + SPHERE CENTER 0.839784 0.193863 -0.116217 RAD 0.00617284 + txt002 + SPHERE CENTER 0.834196 0.211035 -0.0993785 RAD 0.00617284 + txt002 + SPHERE CENTER 0.817808 0.205101 -0.116868 RAD 0.00617284 + txt002 + SPHERE CENTER 0.843837 0.200429 -0.139672 RAD 0.00617284 + txt002 + SPHERE CENTER 0.821861 0.211667 -0.140323 RAD 0.00617284 + txt002 + SPHERE CENTER 0.842301 0.224168 -0.146288 RAD 0.00617284 + txt002 + SPHERE CENTER 0.643951 0.172546 -0.222222 RAD 0.0555556 + txt002 + SPHERE CENTER 0.61371 0.202787 -0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER 0.61556 0.221097 -0.299164 RAD 0.00617284 + txt002 + SPHERE CENTER 0.621702 0.225035 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER 0.635958 0.210779 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER 0.607567 0.198849 -0.306292 RAD 0.00617284 + txt002 + SPHERE CENTER 0.627965 0.188531 -0.296959 RAD 0.00617284 + txt002 + SPHERE CENTER 0.605717 0.180539 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER 0.593312 0.213105 -0.292037 RAD 0.00617284 + txt002 + SPHERE CENTER 0.591462 0.194794 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER 0.599454 0.217042 -0.268448 RAD 0.00617284 + txt002 + SPHERE CENTER 0.5724 0.191718 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.556122 0.208861 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER 0.575596 0.203643 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.578791 0.215568 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.552927 0.196936 -0.236478 RAD 0.00617284 + txt002 + SPHERE CENTER 0.575596 0.203643 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.569205 0.179793 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.549732 0.185011 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER 0.56601 0.167868 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.569205 0.179793 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.624779 0.244096 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.631486 0.266765 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER 0.648629 0.250487 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.636704 0.247291 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.607636 0.260374 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER 0.612854 0.240901 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.600929 0.237705 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.619561 0.26357 -0.207967 RAD 0.00617284 + txt002 + SPHERE CENTER 0.612854 0.240901 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.636704 0.247291 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.68526 0.183615 -0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER 0.684921 0.190903 -0.306292 RAD 0.00617284 + txt002 + SPHERE CENTER 0.665787 0.178397 -0.296959 RAD 0.00617284 + txt002 + SPHERE CENTER 0.669989 0.201661 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER 0.704395 0.196121 -0.292037 RAD 0.00617284 + txt002 + SPHERE CENTER 0.689462 0.206879 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER 0.704733 0.188833 -0.268448 RAD 0.00617284 + txt002 + SPHERE CENTER 0.700193 0.172858 -0.299164 RAD 0.00617284 + txt002 + SPHERE CENTER 0.700531 0.165569 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER 0.681058 0.160351 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER 0.696329 0.224924 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.710584 0.23918 -0.236478 RAD 0.00617284 + txt002 + SPHERE CENTER 0.705059 0.216195 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.687599 0.233654 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.701855 0.24791 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER 0.678869 0.242384 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.687599 0.233654 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.719314 0.23045 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER 0.705059 0.216195 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.713788 0.207465 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.715501 0.153374 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.738169 0.160081 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER 0.718696 0.165299 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.721891 0.177224 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.734974 0.148156 -0.207967 RAD 0.00617284 + txt002 + SPHERE CENTER 0.718696 0.165299 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.712305 0.141449 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.731779 0.136231 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER 0.70911 0.129524 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.712305 0.141449 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.632882 0.131237 -0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER 0.634145 0.108412 -0.292037 RAD 0.00617284 + txt002 + SPHERE CENTER 0.650927 0.115965 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER 0.627664 0.111763 -0.268448 RAD 0.00617284 + txt002 + SPHERE CENTER 0.616099 0.123683 -0.299164 RAD 0.00617284 + txt002 + SPHERE CENTER 0.609618 0.127034 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER 0.614836 0.146508 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER 0.639363 0.127886 -0.306292 RAD 0.00617284 + txt002 + SPHERE CENTER 0.6381 0.15071 -0.296959 RAD 0.00617284 + txt002 + SPHERE CENTER 0.656145 0.135439 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER 0.663122 0.100996 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.680265 0.0847178 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER 0.686972 0.107387 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.675047 0.104191 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.656415 0.0783272 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER 0.651197 0.0978007 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.639272 0.0946054 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.66834 0.0815225 -0.236478 RAD 0.00617284 + txt002 + SPHERE CENTER 0.651197 0.0978007 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.675047 0.104191 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.591572 0.120168 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.577317 0.105912 -0.207967 RAD 0.00617284 + txt002 + SPHERE CENTER 0.600302 0.111438 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.582843 0.128897 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.568587 0.114642 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER 0.574113 0.137627 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.582843 0.128897 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.586046 0.0971825 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER 0.600302 0.111438 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.609032 0.102708 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.594141 0.358439 -0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER 0.619127 0.408291 -0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER 0.625955 0.411883 -0.183325 RAD 0.00617284 + txt002 + SPHERE CENTER 0.630791 0.390369 -0.172216 RAD 0.00617284 + txt002 + SPHERE CENTER 0.607547 0.396287 -0.178077 RAD 0.00617284 + txt002 + SPHERE CENTER 0.61429 0.429805 -0.170979 RAD 0.00617284 + txt002 + SPHERE CENTER 0.595882 0.414208 -0.165731 RAD 0.00617284 + txt002 + SPHERE CENTER 0.607462 0.426212 -0.147525 RAD 0.00617284 + txt002 + SPHERE CENTER 0.637535 0.423887 -0.165118 RAD 0.00617284 + txt002 + SPHERE CENTER 0.630706 0.420295 -0.141664 RAD 0.00617284 + txt002 + SPHERE CENTER 0.642371 0.402373 -0.154009 RAD 0.00617284 + txt002 + SPHERE CENTER 0.665691 0.37761 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.68332 0.389713 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.665691 0.37761 -0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER 0.660156 0.398265 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.68332 0.389713 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.660156 0.398265 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.665691 0.37761 -0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER 0.688854 0.369058 -0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER 0.671225 0.356956 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.671225 0.356956 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.638217 0.337042 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.652948 0.344865 -0.184873 RAD 0.00617284 + txt002 + SPHERE CENTER 0.632683 0.357697 -0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.651954 0.357326 -0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.658482 0.324211 -0.172528 RAD 0.00617284 + txt002 + SPHERE CENTER 0.657489 0.336672 -0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.643752 0.316388 -0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER 0.639211 0.324581 -0.18796 RAD 0.00617284 + txt002 + SPHERE CENTER 0.624481 0.316758 -0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER 0.618946 0.337413 -0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.547576 0.389119 -0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER 0.541008 0.410169 -0.170979 RAD 0.00617284 + txt002 + SPHERE CENTER 0.548718 0.410472 -0.147525 RAD 0.00617284 + txt002 + SPHERE CENTER 0.564748 0.405866 -0.165731 RAD 0.00617284 + txt002 + SPHERE CENTER 0.539866 0.388816 -0.183325 RAD 0.00617284 + txt002 + SPHERE CENTER 0.563607 0.384513 -0.178077 RAD 0.00617284 + txt002 + SPHERE CENTER 0.546435 0.367766 -0.172216 RAD 0.00617284 + txt002 + SPHERE CENTER 0.523836 0.393422 -0.165118 RAD 0.00617284 + txt002 + SPHERE CENTER 0.530405 0.372372 -0.154009 RAD 0.00617284 + txt002 + SPHERE CENTER 0.531546 0.393725 -0.141664 RAD 0.00617284 + txt002 + SPHERE CENTER 0.566667 0.317871 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.555534 0.296626 -0.172528 RAD 0.00617284 + txt002 + SPHERE CENTER 0.572202 0.297216 -0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER 0.550163 0.307914 -0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.549999 0.31728 -0.184873 RAD 0.00617284 + txt002 + SPHERE CENTER 0.544629 0.328569 -0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.561133 0.338525 -0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.572037 0.306582 -0.18796 RAD 0.00617284 + txt002 + SPHERE CENTER 0.583171 0.327827 -0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.588706 0.307172 -0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER 0.522591 0.339267 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.501272 0.340934 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.522591 0.339267 -0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER 0.517056 0.359921 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.501272 0.340934 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.517056 0.359921 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.522591 0.339267 -0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER 0.506807 0.320279 -0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER 0.528125 0.318612 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.528125 0.318612 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.57505 0.429687 -0.104315 RAD 0.0185185 + txt002 + SPHERE CENTER 0.58161 0.452905 -0.109563 RAD 0.00617284 + txt002 + SPHERE CENTER 0.5989 0.436077 -0.104315 RAD 0.00617284 + txt002 + SPHERE CENTER 0.586467 0.434777 -0.125608 RAD 0.00617284 + txt002 + SPHERE CENTER 0.55776 0.446515 -0.109563 RAD 0.00617284 + txt002 + SPHERE CENTER 0.562617 0.428387 -0.125608 RAD 0.00617284 + txt002 + SPHERE CENTER 0.5512 0.423296 -0.104315 RAD 0.00617284 + txt002 + SPHERE CENTER 0.570193 0.447815 -0.0882695 RAD 0.00617284 + txt002 + SPHERE CENTER 0.563633 0.424596 -0.0830215 RAD 0.00617284 + txt002 + SPHERE CENTER 0.587483 0.430987 -0.0830215 RAD 0.00617284 + txt002 + SPHERE CENTER 0.550064 0.379835 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.547099 0.396248 -0.0373488 RAD 0.00617284 + txt002 + SPHERE CENTER 0.569716 0.388263 -0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.557504 0.403175 -0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER 0.527447 0.387819 -0.0496945 RAD 0.00617284 + txt002 + SPHERE CENTER 0.537852 0.394747 -0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.530412 0.371406 -0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.539659 0.372907 -0.0342624 RAD 0.00617284 + txt002 + SPHERE CENTER 0.542624 0.356494 -0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER 0.562276 0.364922 -0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.621614 0.399007 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.637209 0.41723 -0.0496945 RAD 0.00617284 + txt002 + SPHERE CENTER 0.642848 0.401533 -0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.624734 0.418027 -0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.615976 0.414703 -0.0373488 RAD 0.00617284 + txt002 + SPHERE CENTER 0.603501 0.4155 -0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER 0.600381 0.39648 -0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.634089 0.39821 -0.0342624 RAD 0.00617284 + txt002 + SPHERE CENTER 0.618494 0.379986 -0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.639728 0.382513 -0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER 0.802608 0.281471 0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER 0.858698 0.329459 0.104938 RAD 0.0185185 + txt002 + SPHERE CENTER 0.872345 0.34259 0.0890951 RAD 0.00617284 + txt002 + SPHERE CENTER 0.86421 0.32016 0.0827387 RAD 0.00617284 + txt002 + SPHERE CENTER 0.848329 0.338969 0.0846485 RAD 0.00617284 + txt002 + SPHERE CENTER 0.866833 0.351888 0.111295 RAD 0.00617284 + txt002 + SPHERE CENTER 0.842817 0.348268 0.106848 RAD 0.00617284 + txt002 + SPHERE CENTER 0.853186 0.338757 0.127138 RAD 0.00617284 + txt002 + SPHERE CENTER 0.882715 0.333079 0.109385 RAD 0.00617284 + txt002 + SPHERE CENTER 0.869068 0.319948 0.125228 RAD 0.00617284 + txt002 + SPHERE CENTER 0.87458 0.310649 0.103028 RAD 0.00617284 + txt002 + SPHERE CENTER 0.845371 0.280879 0.0506299 RAD 0.0185185 + txt002 + SPHERE CENTER 0.849036 0.291048 0.0284303 RAD 0.00617284 + txt002 + SPHERE CENTER 0.826067 0.287867 0.0369125 RAD 0.00617284 + txt002 + SPHERE CENTER 0.840755 0.304882 0.0471312 RAD 0.00617284 + txt002 + SPHERE CENTER 0.868341 0.28406 0.0421477 RAD 0.00617284 + txt002 + SPHERE CENTER 0.86006 0.297894 0.0608487 RAD 0.00617284 + txt002 + SPHERE CENTER 0.864676 0.273891 0.0643473 RAD 0.00617284 + txt002 + SPHERE CENTER 0.853652 0.267046 0.0319289 RAD 0.00617284 + txt002 + SPHERE CENTER 0.849987 0.256877 0.0541285 RAD 0.00617284 + txt002 + SPHERE CENTER 0.830683 0.263865 0.0404111 RAD 0.00617284 + txt002 + SPHERE CENTER 0.798572 0.337088 0.062352 RAD 0.0185185 + txt002 + SPHERE CENTER 0.808673 0.346884 0.0420622 RAD 0.00617284 + txt002 + SPHERE CENTER 0.82298 0.335792 0.0588533 RAD 0.00617284 + txt002 + SPHERE CENTER 0.807762 0.322361 0.044793 RAD 0.00617284 + txt002 + SPHERE CENTER 0.784265 0.34818 0.0455609 RAD 0.00617284 + txt002 + SPHERE CENTER 0.783355 0.323657 0.0482916 RAD 0.00617284 + txt002 + SPHERE CENTER 0.774164 0.338384 0.0658506 RAD 0.00617284 + txt002 + SPHERE CENTER 0.799483 0.361611 0.0596212 RAD 0.00617284 + txt002 + SPHERE CENTER 0.789382 0.351815 0.079911 RAD 0.00617284 + txt002 + SPHERE CENTER 0.81379 0.350519 0.0764123 RAD 0.00617284 + txt002 + SPHERE CENTER 0.815936 0.330051 0.165419 RAD 0.0185185 + txt002 + SPHERE CENTER 0.828769 0.350165 0.171776 RAD 0.00617284 + txt002 + SPHERE CENTER 0.838905 0.333232 0.156937 RAD 0.00617284 + txt002 + SPHERE CENTER 0.820583 0.347547 0.148628 RAD 0.00617284 + txt002 + SPHERE CENTER 0.805799 0.346984 0.180258 RAD 0.00617284 + txt002 + SPHERE CENTER 0.797614 0.344366 0.157111 RAD 0.00617284 + txt002 + SPHERE CENTER 0.792966 0.32687 0.173902 RAD 0.00617284 + txt002 + SPHERE CENTER 0.824121 0.332668 0.188567 RAD 0.00617284 + txt002 + SPHERE CENTER 0.811288 0.312554 0.182211 RAD 0.00617284 + txt002 + SPHERE CENTER 0.834258 0.315735 0.173728 RAD 0.00617284 + txt002 + SPHERE CENTER 0.75581 0.33768 0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER 0.753851 0.362219 0.124743 RAD 0.00617284 + txt002 + SPHERE CENTER 0.774086 0.350765 0.133052 RAD 0.00617284 + txt002 + SPHERE CENTER 0.76987 0.352319 0.108773 RAD 0.00617284 + txt002 + SPHERE CENTER 0.735575 0.349134 0.114524 RAD 0.00617284 + txt002 + SPHERE CENTER 0.751594 0.339233 0.0985541 RAD 0.00617284 + txt002 + SPHERE CENTER 0.737534 0.324595 0.112614 RAD 0.00617284 + txt002 + SPHERE CENTER 0.739791 0.347581 0.138803 RAD 0.00617284 + txt002 + SPHERE CENTER 0.74175 0.323042 0.136894 RAD 0.00617284 + txt002 + SPHERE CENTER 0.760026 0.336127 0.147112 RAD 0.00617284 + txt002 + SPHERE CENTER 0.759846 0.282063 0.171592 RAD 0.0185185 + txt002 + SPHERE CENTER 0.756464 0.29233 0.193792 RAD 0.00617284 + txt002 + SPHERE CENTER 0.779336 0.288514 0.18531 RAD 0.00617284 + txt002 + SPHERE CENTER 0.765125 0.305929 0.175091 RAD 0.00617284 + txt002 + SPHERE CENTER 0.736973 0.285879 0.180075 RAD 0.00617284 + txt002 + SPHERE CENTER 0.745634 0.299478 0.161374 RAD 0.00617284 + txt002 + SPHERE CENTER 0.740355 0.275612 0.157875 RAD 0.00617284 + txt002 + SPHERE CENTER 0.751185 0.268464 0.190293 RAD 0.00617284 + txt002 + SPHERE CENTER 0.754567 0.258198 0.168094 RAD 0.00617284 + txt002 + SPHERE CENTER 0.774058 0.264649 0.181811 RAD 0.00617284 + txt002 + SPHERE CENTER 0.862735 0.273842 0.153697 RAD 0.0185185 + txt002 + SPHERE CENTER 0.885497 0.282313 0.158144 RAD 0.00617284 + txt002 + SPHERE CENTER 0.876946 0.281455 0.134996 RAD 0.00617284 + txt002 + SPHERE CENTER 0.867718 0.29787 0.150967 RAD 0.00617284 + txt002 + SPHERE CENTER 0.871286 0.274699 0.176845 RAD 0.00617284 + txt002 + SPHERE CENTER 0.853506 0.290257 0.169668 RAD 0.00617284 + txt002 + SPHERE CENTER 0.848523 0.266228 0.172398 RAD 0.00617284 + txt002 + SPHERE CENTER 0.880514 0.258284 0.160875 RAD 0.00617284 + txt002 + SPHERE CENTER 0.857752 0.249813 0.156428 RAD 0.00617284 + txt002 + SPHERE CENTER 0.871963 0.257427 0.137727 RAD 0.00617284 + txt002 + SPHERE CENTER 0.806645 0.225855 0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER 0.818054 0.21762 0.18016 RAD 0.00617284 + txt002 + SPHERE CENTER 0.83061 0.230661 0.163369 RAD 0.00617284 + txt002 + SPHERE CENTER 0.813612 0.241754 0.177429 RAD 0.00617284 + txt002 + SPHERE CENTER 0.794089 0.212813 0.176661 RAD 0.00617284 + txt002 + SPHERE CENTER 0.789647 0.236948 0.173931 RAD 0.00617284 + txt002 + SPHERE CENTER 0.78268 0.221048 0.156372 RAD 0.00617284 + txt002 + SPHERE CENTER 0.811087 0.20172 0.162601 RAD 0.00617284 + txt002 + SPHERE CENTER 0.799677 0.209955 0.142311 RAD 0.00617284 + txt002 + SPHERE CENTER 0.823642 0.214761 0.14581 RAD 0.00617284 + txt002 + SPHERE CENTER 0.849407 0.225263 0.099389 RAD 0.0185185 + txt002 + SPHERE CENTER 0.873186 0.21889 0.0974792 RAD 0.00617284 + txt002 + SPHERE CENTER 0.865588 0.240865 0.0891702 RAD 0.00617284 + txt002 + SPHERE CENTER 0.866351 0.236437 0.113449 RAD 0.00617284 + txt002 + SPHERE CENTER 0.857005 0.203288 0.107698 RAD 0.00617284 + txt002 + SPHERE CENTER 0.850171 0.220835 0.123668 RAD 0.00617284 + txt002 + SPHERE CENTER 0.833227 0.20966 0.109608 RAD 0.00617284 + txt002 + SPHERE CENTER 0.856242 0.207715 0.0834188 RAD 0.00617284 + txt002 + SPHERE CENTER 0.832464 0.214088 0.0853287 RAD 0.00617284 + txt002 + SPHERE CENTER 0.848644 0.22969 0.0751099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.594141 0.358439 0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER 0.613592 0.428945 0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER 0.626191 0.448155 0.113782 RAD 0.00617284 + txt002 + SPHERE CENTER 0.634643 0.42519 0.110488 RAD 0.00617284 + txt002 + SPHERE CENTER 0.614455 0.43276 0.0984536 RAD 0.00617284 + txt002 + SPHERE CENTER 0.60514 0.45191 0.126127 RAD 0.00617284 + txt002 + SPHERE CENTER 0.593404 0.436515 0.110799 RAD 0.00617284 + txt002 + SPHERE CENTER 0.592541 0.4327 0.135179 RAD 0.00617284 + txt002 + SPHERE CENTER 0.625328 0.44434 0.138161 RAD 0.00617284 + txt002 + SPHERE CENTER 0.612729 0.42513 0.147213 RAD 0.00617284 + txt002 + SPHERE CENTER 0.63378 0.421375 0.134867 RAD 0.00617284 + txt002 + SPHERE CENTER 0.665691 0.37761 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.68332 0.389713 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.665691 0.37761 0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER 0.660156 0.398265 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.68332 0.389713 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.660156 0.398265 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.665691 0.37761 0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER 0.688854 0.369058 0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER 0.671225 0.356956 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.671225 0.356956 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.621614 0.399007 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.625435 0.399844 0.031176 RAD 0.00617284 + txt002 + SPHERE CENTER 0.627149 0.378352 0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.60511 0.38905 0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.619901 0.420499 0.0435217 RAD 0.00617284 + txt002 + SPHERE CENTER 0.599576 0.409705 0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER 0.61608 0.419661 0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.641939 0.409801 0.0466081 RAD 0.00617284 + txt002 + SPHERE CENTER 0.638118 0.408963 0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.643653 0.388308 0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER 0.542042 0.409774 0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER 0.53788 0.433888 0.126127 RAD 0.00617284 + txt002 + SPHERE CENTER 0.558395 0.423551 0.135179 RAD 0.00617284 + txt002 + SPHERE CENTER 0.55574 0.426423 0.110799 RAD 0.00617284 + txt002 + SPHERE CENTER 0.521526 0.42011 0.113782 RAD 0.00617284 + txt002 + SPHERE CENTER 0.539387 0.412646 0.0984536 RAD 0.00617284 + txt002 + SPHERE CENTER 0.525689 0.395996 0.110488 RAD 0.00617284 + txt002 + SPHERE CENTER 0.524182 0.417238 0.138161 RAD 0.00617284 + txt002 + SPHERE CENTER 0.528344 0.393124 0.134867 RAD 0.00617284 + txt002 + SPHERE CENTER 0.544697 0.406901 0.147213 RAD 0.00617284 + txt002 + SPHERE CENTER 0.550064 0.379835 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.540802 0.399304 0.0435217 RAD 0.00617284 + txt002 + SPHERE CENTER 0.54453 0.400489 0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.563801 0.400119 0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER 0.546337 0.37865 0.031176 RAD 0.00617284 + txt002 + SPHERE CENTER 0.569335 0.379464 0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.555599 0.35918 0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.527065 0.37902 0.0466081 RAD 0.00617284 + txt002 + SPHERE CENTER 0.536327 0.359551 0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER 0.530793 0.380205 0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.522591 0.339267 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.501272 0.340934 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.522591 0.339267 0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER 0.517056 0.359921 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.501272 0.340934 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.517056 0.359921 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.522591 0.339267 0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER 0.506807 0.320279 0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER 0.528125 0.318612 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.528125 0.318612 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.586119 0.388377 0.178389 RAD 0.0185185 + txt002 + SPHERE CENTER 0.594185 0.405974 0.193717 RAD 0.00617284 + txt002 + SPHERE CENTER 0.609969 0.394768 0.178389 RAD 0.00617284 + txt002 + SPHERE CENTER 0.593017 0.410332 0.169441 RAD 0.00617284 + txt002 + SPHERE CENTER 0.570335 0.399584 0.193717 RAD 0.00617284 + txt002 + SPHERE CENTER 0.569167 0.403942 0.169441 RAD 0.00617284 + txt002 + SPHERE CENTER 0.562269 0.381987 0.178389 RAD 0.00617284 + txt002 + SPHERE CENTER 0.587286 0.384019 0.202664 RAD 0.00617284 + txt002 + SPHERE CENTER 0.57922 0.366422 0.187336 RAD 0.00617284 + txt002 + SPHERE CENTER 0.60307 0.372813 0.187336 RAD 0.00617284 + txt002 + SPHERE CENTER 0.566667 0.317871 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.567308 0.314012 0.191046 RAD 0.00617284 + txt002 + SPHERE CENTER 0.587901 0.320398 0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.569787 0.336891 0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.546074 0.311485 0.178701 RAD 0.00617284 + txt002 + SPHERE CENTER 0.548554 0.334364 0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER 0.545434 0.315344 0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER 0.564188 0.294991 0.175614 RAD 0.00617284 + txt002 + SPHERE CENTER 0.563547 0.29885 0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.584781 0.301377 0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.638217 0.337042 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.659244 0.341809 0.178701 RAD 0.00617284 + txt002 + SPHERE CENTER 0.65787 0.345471 0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER 0.645657 0.360383 0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER 0.639592 0.33338 0.191046 RAD 0.00617284 + txt002 + SPHERE CENTER 0.626005 0.351955 0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.618565 0.328614 0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.651804 0.318468 0.175614 RAD 0.00617284 + txt002 + SPHERE CENTER 0.630777 0.313702 0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.65043 0.32213 0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.643951 0.172546 0.222222 RAD 0.0555556 + txt002 + SPHERE CENTER 0.674191 0.202787 0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER 0.690652 0.219248 0.290934 RAD 0.00617284 + txt002 + SPHERE CENTER 0.695267 0.206403 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.677807 0.223862 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.669577 0.215632 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER 0.656732 0.220246 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER 0.653116 0.199171 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER 0.687036 0.198172 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER 0.670575 0.181711 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER 0.691651 0.185327 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER 0.715501 0.191718 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.733129 0.203821 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.715501 0.191718 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER 0.709966 0.212373 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.733129 0.203821 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.709966 0.212373 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.715501 0.191718 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER 0.738664 0.183166 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.721035 0.171063 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.721035 0.171063 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.663122 0.244096 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.675225 0.261725 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.683777 0.238562 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.663122 0.244096 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER 0.65457 0.267259 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.642468 0.249631 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.642468 0.249631 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.675225 0.261725 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.663122 0.244096 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER 0.683777 0.238562 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.602641 0.183615 0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER 0.600215 0.197046 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER 0.622701 0.191021 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER 0.609032 0.207465 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER 0.580155 0.18964 0.290934 RAD 0.00617284 + txt002 + SPHERE CENTER 0.588972 0.200059 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.582581 0.176209 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.593824 0.173196 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER 0.596251 0.159765 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER 0.61631 0.167171 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER 0.591572 0.224924 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.587397 0.24926 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.606693 0.240045 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.606693 0.240045 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.572277 0.23414 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.591572 0.224924 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER 0.576452 0.209804 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.572277 0.23414 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.576452 0.209804 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.591572 0.224924 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER 0.5724 0.153374 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.551082 0.155041 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.5724 0.153374 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER 0.566866 0.174029 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.551082 0.155041 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.566866 0.174029 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.5724 0.153374 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER 0.556617 0.134387 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.577935 0.13272 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.577935 0.13272 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.655019 0.131237 0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER 0.668451 0.12881 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER 0.678869 0.137627 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER 0.662426 0.151296 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER 0.644601 0.12242 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER 0.638576 0.144906 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER 0.631169 0.124846 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER 0.661044 0.108751 0.290934 RAD 0.00617284 + txt002 + SPHERE CENTER 0.647613 0.111177 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.671463 0.117567 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.624779 0.100996 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.626446 0.0796777 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.645433 0.0954616 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.624779 0.100996 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER 0.605791 0.0852121 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.604124 0.10653 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.604124 0.10653 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.626446 0.0796777 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.624779 0.100996 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER 0.645433 0.0954616 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.696329 0.120168 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.720665 0.115992 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.711449 0.135288 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.711449 0.135288 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.705544 0.100872 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.696329 0.120168 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER 0.681209 0.105047 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.705544 0.100872 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.681209 0.105047 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.696329 0.120168 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER 0.852418 0.0955788 1.89979e-16 RAD 0.0555556 + txt002 + SPHERE CENTER 0.922609 0.11107 -0.0178949 RAD 0.0185185 + txt002 + SPHERE CENTER 0.937225 0.122151 -0.0344251 RAD 0.00617284 + txt002 + SPHERE CENTER 0.916553 0.11086 -0.0418311 RAD 0.00617284 + txt002 + SPHERE CENTER 0.915202 0.131874 -0.0289382 RAD 0.00617284 + txt002 + SPHERE CENTER 0.943281 0.12236 -0.0104889 RAD 0.00617284 + txt002 + SPHERE CENTER 0.921258 0.132084 -0.00500196 RAD 0.00617284 + txt002 + SPHERE CENTER 0.928665 0.111279 0.00604126 RAD 0.00617284 + txt002 + SPHERE CENTER 0.944632 0.101346 -0.0233819 RAD 0.00617284 + txt002 + SPHERE CENTER 0.930016 0.0902645 -0.00685171 RAD 0.00617284 + txt002 + SPHERE CENTER 0.92396 0.090055 -0.0307879 RAD 0.00617284 + txt002 + SPHERE CENTER 0.867231 0.135698 -0.0604812 RAD 0.0185185 + txt002 + SPHERE CENTER 0.873196 0.134634 -0.0844174 RAD 0.00617284 + txt002 + SPHERE CENTER 0.882112 0.117797 -0.0687117 RAD 0.00617284 + txt002 + SPHERE CENTER 0.858152 0.11765 -0.0746767 RAD 0.00617284 + txt002 + SPHERE CENTER 0.858315 0.152536 -0.076187 RAD 0.00617284 + txt002 + SPHERE CENTER 0.843271 0.135552 -0.0664462 RAD 0.00617284 + txt002 + SPHERE CENTER 0.852349 0.1536 -0.0522508 RAD 0.00617284 + txt002 + SPHERE CENTER 0.882275 0.152682 -0.070222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.876309 0.153747 -0.0462858 RAD 0.00617284 + txt002 + SPHERE CENTER 0.89119 0.135845 -0.0545162 RAD 0.00617284 + txt002 + SPHERE CENTER 0.877966 0.164775 0.00679642 RAD 0.0185185 + txt002 + SPHERE CENTER 0.890926 0.182656 -0.0042468 RAD 0.00617284 + txt002 + SPHERE CENTER 0.897331 0.159019 -0.00739901 RAD 0.00617284 + txt002 + SPHERE CENTER 0.876622 0.167676 -0.0176871 RAD 0.00617284 + txt002 + SPHERE CENTER 0.871561 0.188412 0.00994863 RAD 0.00617284 + txt002 + SPHERE CENTER 0.857256 0.173431 -0.00349164 RAD 0.00617284 + txt002 + SPHERE CENTER 0.8586 0.17053 0.0209919 RAD 0.00617284 + txt002 + SPHERE CENTER 0.89227 0.179755 0.0202367 RAD 0.00617284 + txt002 + SPHERE CENTER 0.87931 0.161874 0.0312799 RAD 0.00617284 + txt002 + SPHERE CENTER 0.898675 0.156118 0.0170845 RAD 0.00617284 + txt002 + SPHERE CENTER 0.907797 0.0709499 0.0425863 RAD 0.0185185 + txt002 + SPHERE CENTER 0.930963 0.0752104 0.0499923 RAD 0.00617284 + txt002 + SPHERE CENTER 0.924191 0.0806562 0.0268805 RAD 0.00617284 + txt002 + SPHERE CENTER 0.915684 0.0941344 0.0457385 RAD 0.00617284 + txt002 + SPHERE CENTER 0.914568 0.0655041 0.065698 RAD 0.00617284 + txt002 + SPHERE CENTER 0.899289 0.0844281 0.0614442 RAD 0.00617284 + txt002 + SPHERE CENTER 0.891402 0.0612436 0.058292 RAD 0.00617284 + txt002 + SPHERE CENTER 0.923076 0.0520258 0.0468401 RAD 0.00617284 + txt002 + SPHERE CENTER 0.89991 0.0477654 0.0394341 RAD 0.00617284 + txt002 + SPHERE CENTER 0.916304 0.0574717 0.0237283 RAD 0.00617284 + txt002 + SPHERE CENTER 0.863153 0.124655 0.0672777 RAD 0.0185185 + txt002 + SPHERE CENTER 0.875744 0.141535 0.0801706 RAD 0.00617284 + txt002 + SPHERE CENTER 0.88655 0.129819 0.0613127 RAD 0.00617284 + txt002 + SPHERE CENTER 0.868763 0.146389 0.0569896 RAD 0.00617284 + txt002 + SPHERE CENTER 0.852347 0.136371 0.0861356 RAD 0.00617284 + txt002 + SPHERE CENTER 0.845366 0.141225 0.0629546 RAD 0.00617284 + txt002 + SPHERE CENTER 0.839756 0.119492 0.0732426 RAD 0.00617284 + txt002 + SPHERE CENTER 0.870135 0.119801 0.0904587 RAD 0.00617284 + txt002 + SPHERE CENTER 0.857544 0.102922 0.0775657 RAD 0.00617284 + txt002 + SPHERE CENTER 0.880941 0.108085 0.0716007 RAD 0.00617284 + txt002 + SPHERE CENTER 0.837606 0.0554592 0.0604812 RAD 0.0185185 + txt002 + SPHERE CENTER 0.842832 0.0523913 0.0844174 RAD 0.00617284 + txt002 + SPHERE CENTER 0.86055 0.0593957 0.0687117 RAD 0.00617284 + txt002 + SPHERE CENTER 0.842434 0.0750766 0.0746767 RAD 0.00617284 + txt002 + SPHERE CENTER 0.819888 0.0484547 0.076187 RAD 0.00617284 + txt002 + SPHERE CENTER 0.81949 0.07114 0.0664462 RAD 0.00617284 + txt002 + SPHERE CENTER 0.814662 0.0515226 0.0522508 RAD 0.00617284 + txt002 + SPHERE CENTER 0.838004 0.0327739 0.070222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.832778 0.0358417 0.0462858 RAD 0.00617284 + txt002 + SPHERE CENTER 0.855722 0.0397783 0.0545162 RAD 0.00617284 + txt002 + SPHERE CENTER 0.897062 0.0418734 -0.0246914 RAD 0.0185185 + txt002 + SPHERE CENTER 0.920407 0.0359958 -0.0301783 RAD 0.00617284 + txt002 + SPHERE CENTER 0.912106 0.0588574 -0.0344321 RAD 0.00617284 + txt002 + SPHERE CENTER 0.915603 0.0511067 -0.0112511 RAD 0.00617284 + txt002 + SPHERE CENTER 0.905363 0.0190117 -0.0204376 RAD 0.00617284 + txt002 + SPHERE CENTER 0.900559 0.0341227 -0.00151032 RAD 0.00617284 + txt002 + SPHERE CENTER 0.882018 0.0248894 -0.0149506 RAD 0.00617284 + txt002 + SPHERE CENTER 0.901866 0.0267625 -0.0436186 RAD 0.00617284 + txt002 + SPHERE CENTER 0.878521 0.0326401 -0.0381316 RAD 0.00617284 + txt002 + SPHERE CENTER 0.893565 0.0496241 -0.0478724 RAD 0.00617284 + txt002 + SPHERE CENTER 0.826871 0.0263827 -0.00679642 RAD 0.0185185 + txt002 + SPHERE CENTER 0.825102 0.00436945 0.0042468 RAD 0.00617284 + txt002 + SPHERE CENTER 0.84533 0.018173 0.00739901 RAD 0.00617284 + txt002 + SPHERE CENTER 0.823964 0.025051 0.0176871 RAD 0.00617284 + txt002 + SPHERE CENTER 0.806642 0.0125791 -0.00994863 RAD 0.00617284 + txt002 + SPHERE CENTER 0.805505 0.0332607 0.00349164 RAD 0.00617284 + txt002 + SPHERE CENTER 0.808411 0.0345923 -0.0209919 RAD 0.00617284 + txt002 + SPHERE CENTER 0.828008 0.00570109 -0.0202367 RAD 0.00617284 + txt002 + SPHERE CENTER 0.829777 0.0277143 -0.0312799 RAD 0.00617284 + txt002 + SPHERE CENTER 0.848237 0.0195047 -0.0170845 RAD 0.00617284 + txt002 + SPHERE CENTER 0.841683 0.0665023 -0.0672777 RAD 0.0185185 + txt002 + SPHERE CENTER 0.840284 0.0454909 -0.0801706 RAD 0.00617284 + txt002 + SPHERE CENTER 0.856111 0.0473735 -0.0613127 RAD 0.00617284 + txt002 + SPHERE CENTER 0.831823 0.0463379 -0.0569896 RAD 0.00617284 + txt002 + SPHERE CENTER 0.825856 0.0646197 -0.0861356 RAD 0.00617284 + txt002 + SPHERE CENTER 0.817395 0.0654667 -0.0629546 RAD 0.00617284 + txt002 + SPHERE CENTER 0.827255 0.0856311 -0.0732426 RAD 0.00617284 + txt002 + SPHERE CENTER 0.850144 0.0656554 -0.0904587 RAD 0.00617284 + txt002 + SPHERE CENTER 0.851543 0.0866667 -0.0775657 RAD 0.00617284 + txt002 + SPHERE CENTER 0.865971 0.0675379 -0.0716007 RAD 0.00617284 + txt002 + SPHERE CENTER 0.69376 -0.0133465 0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER 0.740325 -0.0440268 0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER 0.762259 -0.0417568 0.170979 RAD 0.00617284 + txt002 + SPHERE CENTER 0.759495 -0.0345526 0.147525 RAD 0.00617284 + txt002 + SPHERE CENTER 0.748937 -0.0216407 0.165731 RAD 0.00617284 + txt002 + SPHERE CENTER 0.743089 -0.051231 0.183325 RAD 0.00617284 + txt002 + SPHERE CENTER 0.729767 -0.0311149 0.178077 RAD 0.00617284 + txt002 + SPHERE CENTER 0.721155 -0.053501 0.172216 RAD 0.00617284 + txt002 + SPHERE CENTER 0.753646 -0.0641429 0.165118 RAD 0.00617284 + txt002 + SPHERE CENTER 0.731712 -0.0664129 0.154009 RAD 0.00617284 + txt002 + SPHERE CENTER 0.750882 -0.0569387 0.141664 RAD 0.00617284 + txt002 + SPHERE CENTER 0.76531 0.0058253 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.782939 0.0179281 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.76531 0.0058253 0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER 0.759776 0.02648 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.782939 0.0179281 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.759776 0.02648 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.76531 0.0058253 0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER 0.788473 -0.00272662 0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER 0.770845 -0.0148294 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.770845 -0.0148294 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.721234 0.0272215 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.736829 0.0454452 0.172528 RAD 0.00617284 + txt002 + SPHERE CENTER 0.742467 0.0297485 0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER 0.724354 0.046242 0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.715595 0.0429182 0.184873 RAD 0.00617284 + txt002 + SPHERE CENTER 0.70312 0.043715 0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.7 0.0246945 0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.733709 0.0264247 0.18796 RAD 0.00617284 + txt002 + SPHERE CENTER 0.718114 0.00820099 0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.739347 0.010728 0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER 0.668775 -0.0631985 0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER 0.669983 -0.0708196 0.183325 RAD 0.00617284 + txt002 + SPHERE CENTER 0.690113 -0.0618185 0.172216 RAD 0.00617284 + txt002 + SPHERE CENTER 0.671462 -0.0467378 0.178077 RAD 0.00617284 + txt002 + SPHERE CENTER 0.648644 -0.0721997 0.170979 RAD 0.00617284 + txt002 + SPHERE CENTER 0.650123 -0.0481178 0.165731 RAD 0.00617284 + txt002 + SPHERE CENTER 0.647436 -0.0645786 0.147525 RAD 0.00617284 + txt002 + SPHERE CENTER 0.667296 -0.0872804 0.165118 RAD 0.00617284 + txt002 + SPHERE CENTER 0.666087 -0.0796593 0.141664 RAD 0.00617284 + txt002 + SPHERE CENTER 0.687426 -0.0782793 0.154009 RAD 0.00617284 + txt002 + SPHERE CENTER 0.649684 0.00804971 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.646718 0.0244627 0.184873 RAD 0.00617284 + txt002 + SPHERE CENTER 0.669336 0.016478 0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.657124 0.0313903 0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.627066 0.0160343 0.172528 RAD 0.00617284 + txt002 + SPHERE CENTER 0.637471 0.022962 0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.630031 -0.000378614 0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER 0.639278 0.00112207 0.18796 RAD 0.00617284 + txt002 + SPHERE CENTER 0.642244 -0.0152909 0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER 0.661896 -0.00686255 0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.62221 -0.0325183 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.600892 -0.0308513 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.62221 -0.0325183 0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER 0.616676 -0.0118635 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.600892 -0.0308513 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.616676 -0.0118635 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.62221 -0.0325183 0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER 0.606426 -0.051506 0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER 0.627745 -0.053173 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.627745 -0.053173 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.712851 -0.0845947 0.104315 RAD 0.0185185 + txt002 + SPHERE CENTER 0.730141 -0.101422 0.109563 RAD 0.00617284 + txt002 + SPHERE CENTER 0.736701 -0.0782041 0.104315 RAD 0.00617284 + txt002 + SPHERE CENTER 0.725284 -0.0832945 0.125608 RAD 0.00617284 + txt002 + SPHERE CENTER 0.706291 -0.107813 0.109563 RAD 0.00617284 + txt002 + SPHERE CENTER 0.701434 -0.0896851 0.125608 RAD 0.00617284 + txt002 + SPHERE CENTER 0.689001 -0.0909853 0.104315 RAD 0.00617284 + txt002 + SPHERE CENTER 0.717709 -0.102723 0.0882695 RAD 0.00617284 + txt002 + SPHERE CENTER 0.700418 -0.0858949 0.0830215 RAD 0.00617284 + txt002 + SPHERE CENTER 0.724268 -0.0795043 0.0830215 RAD 0.00617284 + txt002 + SPHERE CENTER 0.666287 -0.0539145 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.655153 -0.0751594 0.0496945 RAD 0.00617284 + txt002 + SPHERE CENTER 0.671821 -0.0745692 0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.649783 -0.0638711 0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.649619 -0.0545047 0.0373488 RAD 0.00617284 + txt002 + SPHERE CENTER 0.644249 -0.0432164 0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER 0.660752 -0.0332597 0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.671657 -0.0652028 0.0342624 RAD 0.00617284 + txt002 + SPHERE CENTER 0.682791 -0.0439578 0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.688325 -0.0646126 0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER 0.737837 -0.0347427 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.752567 -0.0269197 0.0373488 RAD 0.00617284 + txt002 + SPHERE CENTER 0.732303 -0.014088 0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.751574 -0.0144587 0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER 0.758102 -0.0475745 0.0496945 RAD 0.00617284 + txt002 + SPHERE CENTER 0.757108 -0.0351134 0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.743371 -0.0553974 0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.73883 -0.0472037 0.0342624 RAD 0.00617284 + txt002 + SPHERE CENTER 0.7241 -0.0550267 0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER 0.718566 -0.0343719 0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.69376 -0.0133465 -0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER 0.745859 -0.0646815 -0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER 0.770032 -0.0684873 -0.126127 RAD 0.00617284 + txt002 + SPHERE CENTER 0.759394 -0.0481266 -0.135179 RAD 0.00617284 + txt002 + SPHERE CENTER 0.762305 -0.0507391 -0.110799 RAD 0.00617284 + txt002 + SPHERE CENTER 0.756497 -0.0850422 -0.113782 RAD 0.00617284 + txt002 + SPHERE CENTER 0.74877 -0.067294 -0.0984536 RAD 0.00617284 + txt002 + SPHERE CENTER 0.732325 -0.0812364 -0.110488 RAD 0.00617284 + txt002 + SPHERE CENTER 0.753586 -0.0824297 -0.138161 RAD 0.00617284 + txt002 + SPHERE CENTER 0.729413 -0.0786239 -0.134867 RAD 0.00617284 + txt002 + SPHERE CENTER 0.742948 -0.062069 -0.147213 RAD 0.00617284 + txt002 + SPHERE CENTER 0.76531 0.0058253 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.782939 0.0179281 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.76531 0.0058253 -0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER 0.759776 0.02648 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.782939 0.0179281 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.759776 0.02648 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.76531 0.0058253 -0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER 0.788473 -0.00272662 -0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER 0.770845 -0.0148294 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.770845 -0.0148294 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.737837 -0.0347427 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.758864 -0.0299763 -0.0435217 RAD 0.00617284 + txt002 + SPHERE CENTER 0.757489 -0.0263144 -0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.745277 -0.0114021 -0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER 0.739212 -0.0384047 -0.031176 RAD 0.00617284 + txt002 + SPHERE CENTER 0.725625 -0.0198304 -0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.718185 -0.043171 -0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.751424 -0.0533169 -0.0466081 RAD 0.00617284 + txt002 + SPHERE CENTER 0.730397 -0.0580833 -0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER 0.750049 -0.0496549 -0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.674309 -0.0838533 -0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER 0.675276 -0.106805 -0.113782 RAD 0.00617284 + txt002 + SPHERE CENTER 0.694308 -0.091423 -0.110488 RAD 0.00617284 + txt002 + SPHERE CENTER 0.673094 -0.0875713 -0.0984536 RAD 0.00617284 + txt002 + SPHERE CENTER 0.655278 -0.0992356 -0.126127 RAD 0.00617284 + txt002 + SPHERE CENTER 0.653095 -0.0800016 -0.110799 RAD 0.00617284 + txt002 + SPHERE CENTER 0.65431 -0.0762835 -0.135179 RAD 0.00617284 + txt002 + SPHERE CENTER 0.676491 -0.103087 -0.138161 RAD 0.00617284 + txt002 + SPHERE CENTER 0.675524 -0.0801352 -0.147213 RAD 0.00617284 + txt002 + SPHERE CENTER 0.695522 -0.0877049 -0.134867 RAD 0.00617284 + txt002 + SPHERE CENTER 0.666287 -0.0539145 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.666927 -0.0577732 -0.031176 RAD 0.00617284 + txt002 + SPHERE CENTER 0.68752 -0.0513875 -0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.669407 -0.034894 -0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.645694 -0.0603001 -0.0435217 RAD 0.00617284 + txt002 + SPHERE CENTER 0.648173 -0.0374209 -0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER 0.645053 -0.0564414 -0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.663807 -0.0767937 -0.0466081 RAD 0.00617284 + txt002 + SPHERE CENTER 0.663167 -0.072935 -0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.6844 -0.070408 -0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER 0.62221 -0.0325183 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.600892 -0.0308513 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.62221 -0.0325183 -0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER 0.616676 -0.0118635 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.600892 -0.0308513 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.616676 -0.0118635 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.62221 -0.0325183 -0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER 0.606426 -0.051506 -0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER 0.627745 -0.053173 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.627745 -0.053173 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.701782 -0.0432853 -0.178389 RAD 0.0185185 + txt002 + SPHERE CENTER 0.717566 -0.0544915 -0.193717 RAD 0.00617284 + txt002 + SPHERE CENTER 0.725632 -0.0368947 -0.178389 RAD 0.00617284 + txt002 + SPHERE CENTER 0.718734 -0.0588496 -0.169441 RAD 0.00617284 + txt002 + SPHERE CENTER 0.693716 -0.0608821 -0.193717 RAD 0.00617284 + txt002 + SPHERE CENTER 0.694884 -0.0652402 -0.169441 RAD 0.00617284 + txt002 + SPHERE CENTER 0.677932 -0.0496759 -0.178389 RAD 0.00617284 + txt002 + SPHERE CENTER 0.700615 -0.0389272 -0.202664 RAD 0.00617284 + txt002 + SPHERE CENTER 0.684831 -0.027721 -0.187336 RAD 0.00617284 + txt002 + SPHERE CENTER 0.708681 -0.0213304 -0.187336 RAD 0.00617284 + txt002 + SPHERE CENTER 0.649684 0.00804971 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.640422 0.0275193 -0.178701 RAD 0.00617284 + txt002 + SPHERE CENTER 0.644149 0.0287044 -0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER 0.66342 0.0283337 -0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER 0.645956 0.00686453 -0.191046 RAD 0.00617284 + txt002 + SPHERE CENTER 0.668955 0.00767898 -0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.655218 -0.012605 -0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.626685 0.00723527 -0.175614 RAD 0.00617284 + txt002 + SPHERE CENTER 0.635947 -0.0122343 -0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.630413 0.00842045 -0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.721234 0.0272215 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.725055 0.0280589 -0.191046 RAD 0.00617284 + txt002 + SPHERE CENTER 0.726768 0.00656677 -0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.70473 0.0172649 -0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.71952 0.0487136 -0.178701 RAD 0.00617284 + txt002 + SPHERE CENTER 0.699195 0.0379196 -0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER 0.715699 0.0478762 -0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER 0.741558 0.0380155 -0.175614 RAD 0.00617284 + txt002 + SPHERE CENTER 0.737738 0.0371781 -0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.743272 0.0165234 -0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.172546 0.643951 1.11022e-16 RAD 0.166667 + txt002 + SPHERE CENTER 0.281471 0.802608 -0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER 0.30566 0.824035 -0.177765 RAD 0.0185185 + txt002 + SPHERE CENTER 0.302088 0.822021 -0.202114 RAD 0.00617284 + txt002 + SPHERE CENTER 0.298094 0.802598 -0.187402 RAD 0.00617284 + txt002 + SPHERE CENTER 0.282758 0.821938 -0.186751 RAD 0.00617284 + txt002 + SPHERE CENTER 0.309654 0.843459 -0.192477 RAD 0.00617284 + txt002 + SPHERE CENTER 0.290324 0.843375 -0.177114 RAD 0.00617284 + txt002 + SPHERE CENTER 0.313227 0.845472 -0.168128 RAD 0.00617284 + txt002 + SPHERE CENTER 0.32499 0.824119 -0.193128 RAD 0.00617284 + txt002 + SPHERE CENTER 0.328563 0.826132 -0.16878 RAD 0.00617284 + txt002 + SPHERE CENTER 0.320997 0.804695 -0.178416 RAD 0.00617284 + txt002 + SPHERE CENTER 0.305221 0.752156 -0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER 0.325175 0.741263 -0.169507 RAD 0.00617284 + txt002 + SPHERE CENTER 0.325981 0.765112 -0.163165 RAD 0.00617284 + txt002 + SPHERE CENTER 0.32493 0.747715 -0.145675 RAD 0.00617284 + txt002 + SPHERE CENTER 0.304415 0.728307 -0.166213 RAD 0.00617284 + txt002 + SPHERE CENTER 0.304171 0.734759 -0.142381 RAD 0.00617284 + txt002 + SPHERE CENTER 0.284462 0.7392 -0.156576 RAD 0.00617284 + txt002 + SPHERE CENTER 0.305466 0.745704 -0.183703 RAD 0.00617284 + txt002 + SPHERE CENTER 0.285513 0.756597 -0.174066 RAD 0.00617284 + txt002 + SPHERE CENTER 0.306272 0.769553 -0.17736 RAD 0.00617284 + txt002 + SPHERE CENTER 0.241352 0.787796 -0.171592 RAD 0.0185185 + txt002 + SPHERE CENTER 0.218449 0.785699 -0.180578 RAD 0.00617284 + txt002 + SPHERE CENTER 0.223304 0.778718 -0.157397 RAD 0.00617284 + txt002 + SPHERE CENTER 0.22345 0.802677 -0.163362 RAD 0.00617284 + txt002 + SPHERE CENTER 0.236497 0.794777 -0.194773 RAD 0.00617284 + txt002 + SPHERE CENTER 0.241498 0.811756 -0.177557 RAD 0.00617284 + txt002 + SPHERE CENTER 0.2594 0.796874 -0.185788 RAD 0.00617284 + txt002 + SPHERE CENTER 0.236351 0.770818 -0.188808 RAD 0.00617284 + txt002 + SPHERE CENTER 0.259253 0.772915 -0.179823 RAD 0.00617284 + txt002 + SPHERE CENTER 0.241205 0.763837 -0.165627 RAD 0.00617284 + txt002 + SPHERE CENTER 0.28191 0.874487 -0.129006 RAD 0.0185185 + txt002 + SPHERE CENTER 0.292033 0.891539 -0.143718 RAD 0.00617284 + txt002 + SPHERE CENTER 0.305711 0.872763 -0.135349 RAD 0.00617284 + txt002 + SPHERE CENTER 0.28812 0.868678 -0.152187 RAD 0.00617284 + txt002 + SPHERE CENTER 0.268233 0.893263 -0.137375 RAD 0.00617284 + txt002 + SPHERE CENTER 0.264319 0.870402 -0.145845 RAD 0.00617284 + txt002 + SPHERE CENTER 0.25811 0.876212 -0.122663 RAD 0.00617284 + txt002 + SPHERE CENTER 0.285824 0.897348 -0.120537 RAD 0.00617284 + txt002 + SPHERE CENTER 0.275701 0.880296 -0.105825 RAD 0.00617284 + txt002 + SPHERE CENTER 0.299501 0.878572 -0.112168 RAD 0.00617284 + txt002 + SPHERE CENTER 0.217602 0.838248 -0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER 0.206363 0.860225 -0.122182 RAD 0.00617284 + txt002 + SPHERE CENTER 0.223536 0.854636 -0.105343 RAD 0.00617284 + txt002 + SPHERE CENTER 0.230102 0.858689 -0.128798 RAD 0.00617284 + txt002 + SPHERE CENTER 0.200429 0.843837 -0.139672 RAD 0.00617284 + txt002 + SPHERE CENTER 0.224168 0.842301 -0.146288 RAD 0.00617284 + txt002 + SPHERE CENTER 0.211667 0.821861 -0.140323 RAD 0.00617284 + txt002 + SPHERE CENTER 0.193863 0.839784 -0.116217 RAD 0.00617284 + txt002 + SPHERE CENTER 0.205101 0.817808 -0.116868 RAD 0.00617284 + txt002 + SPHERE CENTER 0.211035 0.834196 -0.0993785 RAD 0.00617284 + txt002 + SPHERE CENTER 0.257721 0.853061 -0.062352 RAD 0.0185185 + txt002 + SPHERE CENTER 0.26204 0.87538 -0.0527151 RAD 0.00617284 + txt002 + SPHERE CENTER 0.280934 0.860805 -0.0590577 RAD 0.00617284 + txt002 + SPHERE CENTER 0.266856 0.87108 -0.0765474 RAD 0.00617284 + txt002 + SPHERE CENTER 0.238827 0.867636 -0.0560094 RAD 0.00617284 + txt002 + SPHERE CENTER 0.243643 0.863337 -0.0798417 RAD 0.00617284 + txt002 + SPHERE CENTER 0.234508 0.845317 -0.0656463 RAD 0.00617284 + txt002 + SPHERE CENTER 0.252905 0.857361 -0.0385197 RAD 0.00617284 + txt002 + SPHERE CENTER 0.248586 0.835041 -0.0481565 RAD 0.00617284 + txt002 + SPHERE CENTER 0.271799 0.842785 -0.0448623 RAD 0.00617284 + txt002 + SPHERE CENTER 0.34578 0.838847 -0.117284 RAD 0.0185185 + txt002 + SPHERE CENTER 0.360404 0.851488 -0.132647 RAD 0.00617284 + txt002 + SPHERE CENTER 0.347059 0.832518 -0.141116 RAD 0.00617284 + txt002 + SPHERE CENTER 0.335865 0.853509 -0.1345 RAD 0.00617284 + txt002 + SPHERE CENTER 0.359125 0.857816 -0.108814 RAD 0.00617284 + txt002 + SPHERE CENTER 0.334587 0.859838 -0.110668 RAD 0.00617284 + txt002 + SPHERE CENTER 0.344501 0.845176 -0.0934517 RAD 0.00617284 + txt002 + SPHERE CENTER 0.370319 0.836826 -0.115431 RAD 0.00617284 + txt002 + SPHERE CENTER 0.355695 0.824185 -0.100068 RAD 0.00617284 + txt002 + SPHERE CENTER 0.356973 0.817857 -0.1239 RAD 0.00617284 + txt002 + SPHERE CENTER 0.321591 0.817421 -0.0506299 RAD 0.0185185 + txt002 + SPHERE CENTER 0.340361 0.83071 -0.0416443 RAD 0.00617284 + txt002 + SPHERE CENTER 0.341208 0.822249 -0.0648253 RAD 0.00617284 + txt002 + SPHERE CENTER 0.325527 0.840365 -0.0588603 RAD 0.00617284 + txt002 + SPHERE CENTER 0.320744 0.825882 -0.0274488 RAD 0.00617284 + txt002 + SPHERE CENTER 0.30591 0.835537 -0.0446649 RAD 0.00617284 + txt002 + SPHERE CENTER 0.301973 0.812593 -0.0364345 RAD 0.00617284 + txt002 + SPHERE CENTER 0.336425 0.807766 -0.0334138 RAD 0.00617284 + txt002 + SPHERE CENTER 0.317654 0.794477 -0.0423994 RAD 0.00617284 + txt002 + SPHERE CENTER 0.337272 0.799305 -0.0565949 RAD 0.00617284 + txt002 + SPHERE CENTER 0.345341 0.766968 -0.099389 RAD 0.0185185 + txt002 + SPHERE CENTER 0.369945 0.768944 -0.10004 RAD 0.00617284 + txt002 + SPHERE CENTER 0.356171 0.780624 -0.116879 RAD 0.00617284 + txt002 + SPHERE CENTER 0.356172 0.788341 -0.093424 RAD 0.00617284 + txt002 + SPHERE CENTER 0.359115 0.755289 -0.0825505 RAD 0.00617284 + txt002 + SPHERE CENTER 0.345342 0.774685 -0.0759343 RAD 0.00617284 + txt002 + SPHERE CENTER 0.334511 0.753313 -0.0818993 RAD 0.00617284 + txt002 + SPHERE CENTER 0.359113 0.747572 -0.106005 RAD 0.00617284 + txt002 + SPHERE CENTER 0.33451 0.745596 -0.105354 RAD 0.00617284 + txt002 + SPHERE CENTER 0.34534 0.759252 -0.122844 RAD 0.00617284 + txt002 + SPHERE CENTER 0.358439 0.594141 -0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER 0.408291 0.619127 -0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER 0.411883 0.625955 -0.183325 RAD 0.00617284 + txt002 + SPHERE CENTER 0.396287 0.607547 -0.178077 RAD 0.00617284 + txt002 + SPHERE CENTER 0.390369 0.630791 -0.172216 RAD 0.00617284 + txt002 + SPHERE CENTER 0.423887 0.637535 -0.165118 RAD 0.00617284 + txt002 + SPHERE CENTER 0.402373 0.642371 -0.154009 RAD 0.00617284 + txt002 + SPHERE CENTER 0.420295 0.630706 -0.141664 RAD 0.00617284 + txt002 + SPHERE CENTER 0.429805 0.61429 -0.170979 RAD 0.00617284 + txt002 + SPHERE CENTER 0.426212 0.607462 -0.147525 RAD 0.00617284 + txt002 + SPHERE CENTER 0.414208 0.595882 -0.165731 RAD 0.00617284 + txt002 + SPHERE CENTER 0.337042 0.638217 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.344865 0.652948 -0.184873 RAD 0.00617284 + txt002 + SPHERE CENTER 0.357326 0.651954 -0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.357697 0.632683 -0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.324581 0.639211 -0.18796 RAD 0.00617284 + txt002 + SPHERE CENTER 0.337413 0.618946 -0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.316758 0.624481 -0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER 0.324211 0.658482 -0.172528 RAD 0.00617284 + txt002 + SPHERE CENTER 0.316388 0.643752 -0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER 0.336672 0.657489 -0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.37761 0.665691 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.389713 0.68332 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.398265 0.660156 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.37761 0.665691 -0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER 0.369058 0.688854 -0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER 0.356956 0.671225 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.356956 0.671225 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.389713 0.68332 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.37761 0.665691 -0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER 0.398265 0.660156 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.429687 0.57505 -0.104315 RAD 0.0185185 + txt002 + SPHERE CENTER 0.452905 0.58161 -0.109563 RAD 0.00617284 + txt002 + SPHERE CENTER 0.434777 0.586467 -0.125608 RAD 0.00617284 + txt002 + SPHERE CENTER 0.436077 0.5989 -0.104315 RAD 0.00617284 + txt002 + SPHERE CENTER 0.447815 0.570193 -0.0882695 RAD 0.00617284 + txt002 + SPHERE CENTER 0.430987 0.587483 -0.0830215 RAD 0.00617284 + txt002 + SPHERE CENTER 0.424596 0.563633 -0.0830215 RAD 0.00617284 + txt002 + SPHERE CENTER 0.446515 0.55776 -0.109563 RAD 0.00617284 + txt002 + SPHERE CENTER 0.423296 0.5512 -0.104315 RAD 0.00617284 + txt002 + SPHERE CENTER 0.428387 0.562617 -0.125608 RAD 0.00617284 + txt002 + SPHERE CENTER 0.399007 0.621614 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.41723 0.637209 -0.0496945 RAD 0.00617284 + txt002 + SPHERE CENTER 0.418027 0.624734 -0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.401533 0.642848 -0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.39821 0.634089 -0.0342624 RAD 0.00617284 + txt002 + SPHERE CENTER 0.382513 0.639728 -0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER 0.379986 0.618494 -0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.414703 0.615976 -0.0373488 RAD 0.00617284 + txt002 + SPHERE CENTER 0.39648 0.600381 -0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.4155 0.603501 -0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER 0.379835 0.550064 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.396248 0.547099 -0.0373488 RAD 0.00617284 + txt002 + SPHERE CENTER 0.403175 0.557504 -0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER 0.388263 0.569716 -0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.372907 0.539659 -0.0342624 RAD 0.00617284 + txt002 + SPHERE CENTER 0.364922 0.562276 -0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.356494 0.542624 -0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER 0.387819 0.527447 -0.0496945 RAD 0.00617284 + txt002 + SPHERE CENTER 0.371406 0.530412 -0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.394747 0.537852 -0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.389119 0.547576 -0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER 0.410169 0.541008 -0.170979 RAD 0.00617284 + txt002 + SPHERE CENTER 0.405866 0.564748 -0.165731 RAD 0.00617284 + txt002 + SPHERE CENTER 0.410472 0.548718 -0.147525 RAD 0.00617284 + txt002 + SPHERE CENTER 0.393422 0.523836 -0.165118 RAD 0.00617284 + txt002 + SPHERE CENTER 0.393725 0.531546 -0.141664 RAD 0.00617284 + txt002 + SPHERE CENTER 0.372372 0.530405 -0.154009 RAD 0.00617284 + txt002 + SPHERE CENTER 0.388816 0.539866 -0.183325 RAD 0.00617284 + txt002 + SPHERE CENTER 0.367766 0.546435 -0.172216 RAD 0.00617284 + txt002 + SPHERE CENTER 0.384513 0.563607 -0.178077 RAD 0.00617284 + txt002 + SPHERE CENTER 0.339267 0.522591 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.340934 0.501272 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.359921 0.517056 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.339267 0.522591 -0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER 0.320279 0.506807 -0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER 0.318612 0.528125 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.318612 0.528125 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.340934 0.501272 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.339267 0.522591 -0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER 0.359921 0.517056 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.317871 0.566667 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.296626 0.555534 -0.172528 RAD 0.00617284 + txt002 + SPHERE CENTER 0.307914 0.550163 -0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.297216 0.572202 -0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER 0.306582 0.572037 -0.18796 RAD 0.00617284 + txt002 + SPHERE CENTER 0.307172 0.588706 -0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER 0.327827 0.583171 -0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.31728 0.549999 -0.184873 RAD 0.00617284 + txt002 + SPHERE CENTER 0.338525 0.561133 -0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.328569 0.544629 -0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.172546 0.643951 -0.222222 RAD 0.0555556 + txt002 + SPHERE CENTER 0.142305 0.674191 -0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER 0.144155 0.692502 -0.299164 RAD 0.00617284 + txt002 + SPHERE CENTER 0.150298 0.696439 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER 0.164554 0.682184 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER 0.136163 0.670254 -0.306292 RAD 0.00617284 + txt002 + SPHERE CENTER 0.156561 0.659936 -0.296959 RAD 0.00617284 + txt002 + SPHERE CENTER 0.134313 0.651943 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER 0.121907 0.684509 -0.292037 RAD 0.00617284 + txt002 + SPHERE CENTER 0.120057 0.666199 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER 0.12805 0.688447 -0.268448 RAD 0.00617284 + txt002 + SPHERE CENTER 0.100996 0.663122 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0847178 0.680265 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER 0.104191 0.675047 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.107387 0.686972 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0815225 0.66834 -0.236478 RAD 0.00617284 + txt002 + SPHERE CENTER 0.104191 0.675047 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0978007 0.651197 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0783272 0.656415 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0946054 0.639272 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0978007 0.651197 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.153374 0.715501 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.160081 0.738169 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER 0.177224 0.721891 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.165299 0.718696 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.136231 0.731779 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER 0.141449 0.712305 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.129524 0.70911 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.148156 0.734974 -0.207967 RAD 0.00617284 + txt002 + SPHERE CENTER 0.141449 0.712305 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.165299 0.718696 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.213855 0.655019 -0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER 0.213517 0.662308 -0.306292 RAD 0.00617284 + txt002 + SPHERE CENTER 0.194382 0.649801 -0.296959 RAD 0.00617284 + txt002 + SPHERE CENTER 0.198584 0.673065 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER 0.23299 0.667526 -0.292037 RAD 0.00617284 + txt002 + SPHERE CENTER 0.218058 0.678283 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER 0.233329 0.660237 -0.268448 RAD 0.00617284 + txt002 + SPHERE CENTER 0.228788 0.644262 -0.299164 RAD 0.00617284 + txt002 + SPHERE CENTER 0.229127 0.636974 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER 0.209653 0.631756 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER 0.224924 0.696329 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.23918 0.710584 -0.236478 RAD 0.00617284 + txt002 + SPHERE CENTER 0.233654 0.687599 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.216195 0.705059 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.23045 0.719314 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER 0.207465 0.713788 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.216195 0.705059 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.24791 0.701855 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER 0.233654 0.687599 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.242384 0.678869 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.244096 0.624779 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.266765 0.631486 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER 0.247291 0.636704 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.250487 0.648629 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.26357 0.619561 -0.207967 RAD 0.00617284 + txt002 + SPHERE CENTER 0.247291 0.636704 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.240901 0.612854 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.260374 0.607636 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER 0.237705 0.600929 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.240901 0.612854 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.161477 0.602641 -0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER 0.162741 0.579817 -0.292037 RAD 0.00617284 + txt002 + SPHERE CENTER 0.179523 0.58737 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER 0.156259 0.583168 -0.268448 RAD 0.00617284 + txt002 + SPHERE CENTER 0.144695 0.595088 -0.299164 RAD 0.00617284 + txt002 + SPHERE CENTER 0.138214 0.598439 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER 0.143431 0.617912 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER 0.167958 0.59929 -0.306292 RAD 0.00617284 + txt002 + SPHERE CENTER 0.166695 0.622115 -0.296959 RAD 0.00617284 + txt002 + SPHERE CENTER 0.184741 0.606843 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER 0.191718 0.5724 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.208861 0.556122 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER 0.215568 0.578791 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.203643 0.575596 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.185011 0.549732 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER 0.179793 0.569205 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.167868 0.56601 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.196936 0.552927 -0.236478 RAD 0.00617284 + txt002 + SPHERE CENTER 0.179793 0.569205 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.203643 0.575596 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.120168 0.591572 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.105912 0.577317 -0.207967 RAD 0.00617284 + txt002 + SPHERE CENTER 0.128897 0.582843 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.111438 0.600302 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0971825 0.586046 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER 0.102708 0.609032 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.111438 0.600302 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.114642 0.568587 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER 0.128897 0.582843 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.137627 0.574113 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0955788 0.852418 9.1293e-17 RAD 0.0555556 + txt002 + SPHERE CENTER 0.11107 0.922609 -0.0178949 RAD 0.0185185 + txt002 + SPHERE CENTER 0.122151 0.937225 -0.0344251 RAD 0.00617284 + txt002 + SPHERE CENTER 0.131874 0.915202 -0.0289382 RAD 0.00617284 + txt002 + SPHERE CENTER 0.11086 0.916553 -0.0418311 RAD 0.00617284 + txt002 + SPHERE CENTER 0.101346 0.944632 -0.0233819 RAD 0.00617284 + txt002 + SPHERE CENTER 0.090055 0.92396 -0.0307879 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0902645 0.930016 -0.00685171 RAD 0.00617284 + txt002 + SPHERE CENTER 0.12236 0.943281 -0.0104889 RAD 0.00617284 + txt002 + SPHERE CENTER 0.111279 0.928665 0.00604126 RAD 0.00617284 + txt002 + SPHERE CENTER 0.132084 0.921258 -0.00500196 RAD 0.00617284 + txt002 + SPHERE CENTER 0.164775 0.877966 0.00679642 RAD 0.0185185 + txt002 + SPHERE CENTER 0.182656 0.890926 -0.0042468 RAD 0.00617284 + txt002 + SPHERE CENTER 0.167676 0.876622 -0.0176871 RAD 0.00617284 + txt002 + SPHERE CENTER 0.159019 0.897331 -0.00739901 RAD 0.00617284 + txt002 + SPHERE CENTER 0.179755 0.89227 0.0202367 RAD 0.00617284 + txt002 + SPHERE CENTER 0.156118 0.898675 0.0170845 RAD 0.00617284 + txt002 + SPHERE CENTER 0.161874 0.87931 0.0312799 RAD 0.00617284 + txt002 + SPHERE CENTER 0.188412 0.871561 0.00994863 RAD 0.00617284 + txt002 + SPHERE CENTER 0.17053 0.8586 0.0209919 RAD 0.00617284 + txt002 + SPHERE CENTER 0.173431 0.857256 -0.00349164 RAD 0.00617284 + txt002 + SPHERE CENTER 0.135698 0.867231 -0.0604812 RAD 0.0185185 + txt002 + SPHERE CENTER 0.134634 0.873196 -0.0844174 RAD 0.00617284 + txt002 + SPHERE CENTER 0.11765 0.858152 -0.0746767 RAD 0.00617284 + txt002 + SPHERE CENTER 0.117797 0.882112 -0.0687117 RAD 0.00617284 + txt002 + SPHERE CENTER 0.152682 0.882275 -0.070222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.135845 0.89119 -0.0545162 RAD 0.00617284 + txt002 + SPHERE CENTER 0.153747 0.876309 -0.0462858 RAD 0.00617284 + txt002 + SPHERE CENTER 0.152536 0.858315 -0.076187 RAD 0.00617284 + txt002 + SPHERE CENTER 0.1536 0.852349 -0.0522508 RAD 0.00617284 + txt002 + SPHERE CENTER 0.135552 0.843271 -0.0664462 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0418734 0.897062 -0.0246914 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0359958 0.920407 -0.0301783 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0511067 0.915603 -0.0112511 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0588574 0.912106 -0.0344321 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0267625 0.901866 -0.0436186 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0496241 0.893565 -0.0478724 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0326401 0.878521 -0.0381316 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0190117 0.905363 -0.0204376 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0248894 0.882018 -0.0149506 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0341227 0.900559 -0.00151032 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0665023 0.841683 -0.0672777 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0454909 0.840284 -0.0801706 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0463379 0.831823 -0.0569896 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0473735 0.856111 -0.0613127 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0656554 0.850144 -0.0904587 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0675379 0.865971 -0.0716007 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0866667 0.851543 -0.0775657 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0646197 0.825856 -0.0861356 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0856311 0.827255 -0.0732426 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0654667 0.817395 -0.0629546 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0263827 0.826871 -0.00679642 RAD 0.0185185 + txt002 + SPHERE CENTER 0.00436945 0.825102 0.0042468 RAD 0.00617284 + txt002 + SPHERE CENTER 0.025051 0.823964 0.0176871 RAD 0.00617284 + txt002 + SPHERE CENTER 0.018173 0.84533 0.00739901 RAD 0.00617284 + txt002 + SPHERE CENTER 0.00570109 0.828008 -0.0202367 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0195047 0.848237 -0.0170845 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0277143 0.829777 -0.0312799 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0125791 0.806642 -0.00994863 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0345923 0.808411 -0.0209919 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0332607 0.805505 0.00349164 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0709499 0.907797 0.0425863 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0752104 0.930963 0.0499923 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0941344 0.915684 0.0457385 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0806562 0.924191 0.0268805 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0520258 0.923076 0.0468401 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0574717 0.916304 0.0237283 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0477654 0.89991 0.0394341 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0655041 0.914568 0.065698 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0612436 0.891402 0.058292 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0844281 0.899289 0.0614442 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0554592 0.837606 0.0604812 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0523913 0.842832 0.0844174 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0750766 0.842434 0.0746767 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0593957 0.86055 0.0687117 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0327739 0.838004 0.070222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0397783 0.855722 0.0545162 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0358417 0.832778 0.0462858 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0484547 0.819888 0.076187 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0515226 0.814662 0.0522508 RAD 0.00617284 + txt002 + SPHERE CENTER 0.07114 0.81949 0.0664462 RAD 0.00617284 + txt002 + SPHERE CENTER 0.124655 0.863153 0.0672777 RAD 0.0185185 + txt002 + SPHERE CENTER 0.141535 0.875744 0.0801706 RAD 0.00617284 + txt002 + SPHERE CENTER 0.146389 0.868763 0.0569896 RAD 0.00617284 + txt002 + SPHERE CENTER 0.129819 0.88655 0.0613127 RAD 0.00617284 + txt002 + SPHERE CENTER 0.119801 0.870135 0.0904587 RAD 0.00617284 + txt002 + SPHERE CENTER 0.108085 0.880941 0.0716007 RAD 0.00617284 + txt002 + SPHERE CENTER 0.102922 0.857544 0.0775657 RAD 0.00617284 + txt002 + SPHERE CENTER 0.136371 0.852347 0.0861356 RAD 0.00617284 + txt002 + SPHERE CENTER 0.119492 0.839756 0.0732426 RAD 0.00617284 + txt002 + SPHERE CENTER 0.141225 0.845366 0.0629546 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0133465 0.69376 -0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER -0.0646815 0.745859 -0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0684873 0.770032 -0.126127 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0507391 0.762305 -0.110799 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0481266 0.759394 -0.135179 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0824297 0.753586 -0.138161 RAD 0.00617284 + txt002 + SPHERE CENTER -0.062069 0.742948 -0.147213 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0786239 0.729413 -0.134867 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0850422 0.756497 -0.113782 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0812364 0.732325 -0.110488 RAD 0.00617284 + txt002 + SPHERE CENTER -0.067294 0.74877 -0.0984536 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0347427 0.737837 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0299763 0.758864 -0.0435217 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0114021 0.745277 -0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0263144 0.757489 -0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0533169 0.751424 -0.0466081 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0496549 0.750049 -0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0580833 0.730397 -0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0384047 0.739212 -0.031176 RAD 0.00617284 + txt002 + SPHERE CENTER -0.043171 0.718185 -0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0198304 0.725625 -0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0058253 0.76531 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0179281 0.782939 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.02648 0.759776 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0058253 0.76531 -0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER -0.00272662 0.788473 -0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0148294 0.770845 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0148294 0.770845 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0179281 0.782939 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0058253 0.76531 -0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER 0.02648 0.759776 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0432853 0.701782 -0.178389 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0544915 0.717566 -0.193717 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0588496 0.718734 -0.169441 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0368947 0.725632 -0.178389 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0389272 0.700615 -0.202664 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0213304 0.708681 -0.187336 RAD 0.00617284 + txt002 + SPHERE CENTER -0.027721 0.684831 -0.187336 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0608821 0.693716 -0.193717 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0496759 0.677932 -0.178389 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0652402 0.694884 -0.169441 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0272215 0.721234 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0280589 0.725055 -0.191046 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0172649 0.70473 -0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.00656677 0.726768 -0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0380155 0.741558 -0.175614 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0165234 0.743272 -0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0371781 0.737738 -0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0487136 0.71952 -0.178701 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0478762 0.715699 -0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0379196 0.699195 -0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER 0.00804971 0.649684 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0275193 0.640422 -0.178701 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0283337 0.66342 -0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0287044 0.644149 -0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER 0.00723527 0.626685 -0.175614 RAD 0.00617284 + txt002 + SPHERE CENTER 0.00842045 0.630413 -0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0122343 0.635947 -0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.00686453 0.645956 -0.191046 RAD 0.00617284 + txt002 + SPHERE CENTER -0.012605 0.655218 -0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.00767898 0.668955 -0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0838533 0.674309 -0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER -0.106805 0.675276 -0.113782 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0875713 0.673094 -0.0984536 RAD 0.00617284 + txt002 + SPHERE CENTER -0.091423 0.694308 -0.110488 RAD 0.00617284 + txt002 + SPHERE CENTER -0.103087 0.676491 -0.138161 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0877049 0.695522 -0.134867 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0801352 0.675524 -0.147213 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0992356 0.655278 -0.126127 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0762835 0.65431 -0.135179 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0800016 0.653095 -0.110799 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0325183 0.62221 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0308513 0.600892 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0118635 0.616676 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0325183 0.62221 -0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER -0.051506 0.606426 -0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER -0.053173 0.627745 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.053173 0.627745 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0308513 0.600892 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0325183 0.62221 -0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0118635 0.616676 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0539145 0.666287 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0577732 0.666927 -0.031176 RAD 0.00617284 + txt002 + SPHERE CENTER -0.034894 0.669407 -0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0513875 0.68752 -0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0767937 0.663807 -0.0466081 RAD 0.00617284 + txt002 + SPHERE CENTER -0.070408 0.6844 -0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER -0.072935 0.663167 -0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0603001 0.645694 -0.0435217 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0564414 0.645053 -0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0374209 0.648173 -0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0133465 0.69376 0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER -0.0440268 0.740325 0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0417568 0.762259 0.170979 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0216407 0.748937 0.165731 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0345526 0.759495 0.147525 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0641429 0.753646 0.165118 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0569387 0.750882 0.141664 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0664129 0.731712 0.154009 RAD 0.00617284 + txt002 + SPHERE CENTER -0.051231 0.743089 0.183325 RAD 0.00617284 + txt002 + SPHERE CENTER -0.053501 0.721155 0.172216 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0311149 0.729767 0.178077 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0272215 0.721234 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0454452 0.736829 0.172528 RAD 0.00617284 + txt002 + SPHERE CENTER 0.046242 0.724354 0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0297485 0.742467 0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0264247 0.733709 0.18796 RAD 0.00617284 + txt002 + SPHERE CENTER 0.010728 0.739347 0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER 0.00820099 0.718114 0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0429182 0.715595 0.184873 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0246945 0.7 0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.043715 0.70312 0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0058253 0.76531 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0179281 0.782939 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.02648 0.759776 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0058253 0.76531 0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER -0.00272662 0.788473 0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0148294 0.770845 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0148294 0.770845 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0179281 0.782939 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0058253 0.76531 0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER 0.02648 0.759776 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0845947 0.712851 0.104315 RAD 0.0185185 + txt002 + SPHERE CENTER -0.101422 0.730141 0.109563 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0832945 0.725284 0.125608 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0782041 0.736701 0.104315 RAD 0.00617284 + txt002 + SPHERE CENTER -0.102723 0.717709 0.0882695 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0795043 0.724268 0.0830215 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0858949 0.700418 0.0830215 RAD 0.00617284 + txt002 + SPHERE CENTER -0.107813 0.706291 0.109563 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0909853 0.689001 0.104315 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0896851 0.701434 0.125608 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0347427 0.737837 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0269197 0.752567 0.0373488 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0144587 0.751574 0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER -0.014088 0.732303 0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0472037 0.73883 0.0342624 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0343719 0.718566 0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0550267 0.7241 0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0475745 0.758102 0.0496945 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0553974 0.743371 0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0351134 0.757108 0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0539145 0.666287 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0751594 0.655153 0.0496945 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0638711 0.649783 0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0745692 0.671821 0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0652028 0.671657 0.0342624 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0646126 0.688325 0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0439578 0.682791 0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0545047 0.649619 0.0373488 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0332597 0.660752 0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0432164 0.644249 0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0631985 0.668775 0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0708196 0.669983 0.183325 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0467378 0.671462 0.178077 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0618185 0.690113 0.172216 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0872804 0.667296 0.165118 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0782793 0.687426 0.154009 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0796593 0.666087 0.141664 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0721997 0.648644 0.170979 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0645786 0.647436 0.147525 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0481178 0.650123 0.165731 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0325183 0.62221 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0308513 0.600892 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0118635 0.616676 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0325183 0.62221 0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER -0.051506 0.606426 0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER -0.053173 0.627745 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.053173 0.627745 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0308513 0.600892 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0325183 0.62221 0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0118635 0.616676 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.00804971 0.649684 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0244627 0.646718 0.184873 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0313903 0.657124 0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.016478 0.669336 0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.00112207 0.639278 0.18796 RAD 0.00617284 + txt002 + SPHERE CENTER -0.00686255 0.661896 0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0152909 0.642244 0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0160343 0.627066 0.172528 RAD 0.00617284 + txt002 + SPHERE CENTER -0.000378614 0.630031 0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER 0.022962 0.637471 0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.281471 0.802608 0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER 0.329459 0.858698 0.104938 RAD 0.0185185 + txt002 + SPHERE CENTER 0.34259 0.872345 0.0890951 RAD 0.00617284 + txt002 + SPHERE CENTER 0.338969 0.848329 0.0846485 RAD 0.00617284 + txt002 + SPHERE CENTER 0.32016 0.86421 0.0827387 RAD 0.00617284 + txt002 + SPHERE CENTER 0.333079 0.882715 0.109385 RAD 0.00617284 + txt002 + SPHERE CENTER 0.310649 0.87458 0.103028 RAD 0.00617284 + txt002 + SPHERE CENTER 0.319948 0.869068 0.125228 RAD 0.00617284 + txt002 + SPHERE CENTER 0.351888 0.866833 0.111295 RAD 0.00617284 + txt002 + SPHERE CENTER 0.338757 0.853186 0.127138 RAD 0.00617284 + txt002 + SPHERE CENTER 0.348268 0.842817 0.106848 RAD 0.00617284 + txt002 + SPHERE CENTER 0.337088 0.798572 0.062352 RAD 0.0185185 + txt002 + SPHERE CENTER 0.346884 0.808673 0.0420622 RAD 0.00617284 + txt002 + SPHERE CENTER 0.322361 0.807762 0.044793 RAD 0.00617284 + txt002 + SPHERE CENTER 0.335792 0.82298 0.0588533 RAD 0.00617284 + txt002 + SPHERE CENTER 0.361611 0.799483 0.0596212 RAD 0.00617284 + txt002 + SPHERE CENTER 0.350519 0.81379 0.0764123 RAD 0.00617284 + txt002 + SPHERE CENTER 0.351815 0.789382 0.079911 RAD 0.00617284 + txt002 + SPHERE CENTER 0.34818 0.784265 0.0455609 RAD 0.00617284 + txt002 + SPHERE CENTER 0.338384 0.774164 0.0658506 RAD 0.00617284 + txt002 + SPHERE CENTER 0.323657 0.783355 0.0482916 RAD 0.00617284 + txt002 + SPHERE CENTER 0.280879 0.845371 0.0506299 RAD 0.0185185 + txt002 + SPHERE CENTER 0.291048 0.849036 0.0284303 RAD 0.00617284 + txt002 + SPHERE CENTER 0.304882 0.840755 0.0471312 RAD 0.00617284 + txt002 + SPHERE CENTER 0.287867 0.826067 0.0369125 RAD 0.00617284 + txt002 + SPHERE CENTER 0.267046 0.853652 0.0319289 RAD 0.00617284 + txt002 + SPHERE CENTER 0.263865 0.830683 0.0404111 RAD 0.00617284 + txt002 + SPHERE CENTER 0.256877 0.849987 0.0541285 RAD 0.00617284 + txt002 + SPHERE CENTER 0.28406 0.868341 0.0421477 RAD 0.00617284 + txt002 + SPHERE CENTER 0.273891 0.864676 0.0643473 RAD 0.00617284 + txt002 + SPHERE CENTER 0.297894 0.86006 0.0608487 RAD 0.00617284 + txt002 + SPHERE CENTER 0.273842 0.862735 0.153697 RAD 0.0185185 + txt002 + SPHERE CENTER 0.282313 0.885497 0.158144 RAD 0.00617284 + txt002 + SPHERE CENTER 0.29787 0.867718 0.150967 RAD 0.00617284 + txt002 + SPHERE CENTER 0.281455 0.876946 0.134996 RAD 0.00617284 + txt002 + SPHERE CENTER 0.258284 0.880514 0.160875 RAD 0.00617284 + txt002 + SPHERE CENTER 0.257427 0.871963 0.137727 RAD 0.00617284 + txt002 + SPHERE CENTER 0.249813 0.857752 0.156428 RAD 0.00617284 + txt002 + SPHERE CENTER 0.274699 0.871286 0.176845 RAD 0.00617284 + txt002 + SPHERE CENTER 0.266228 0.848523 0.172398 RAD 0.00617284 + txt002 + SPHERE CENTER 0.290257 0.853506 0.169668 RAD 0.00617284 + txt002 + SPHERE CENTER 0.225263 0.849407 0.099389 RAD 0.0185185 + txt002 + SPHERE CENTER 0.21889 0.873186 0.0974792 RAD 0.00617284 + txt002 + SPHERE CENTER 0.236437 0.866351 0.113449 RAD 0.00617284 + txt002 + SPHERE CENTER 0.240865 0.865588 0.0891702 RAD 0.00617284 + txt002 + SPHERE CENTER 0.207715 0.856242 0.0834188 RAD 0.00617284 + txt002 + SPHERE CENTER 0.22969 0.848644 0.0751099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.214088 0.832464 0.0853287 RAD 0.00617284 + txt002 + SPHERE CENTER 0.203288 0.857005 0.107698 RAD 0.00617284 + txt002 + SPHERE CENTER 0.20966 0.833227 0.109608 RAD 0.00617284 + txt002 + SPHERE CENTER 0.220835 0.850171 0.123668 RAD 0.00617284 + txt002 + SPHERE CENTER 0.225855 0.806645 0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER 0.21762 0.818054 0.18016 RAD 0.00617284 + txt002 + SPHERE CENTER 0.241754 0.813612 0.177429 RAD 0.00617284 + txt002 + SPHERE CENTER 0.230661 0.83061 0.163369 RAD 0.00617284 + txt002 + SPHERE CENTER 0.20172 0.811087 0.162601 RAD 0.00617284 + txt002 + SPHERE CENTER 0.214761 0.823642 0.14581 RAD 0.00617284 + txt002 + SPHERE CENTER 0.209955 0.799677 0.142311 RAD 0.00617284 + txt002 + SPHERE CENTER 0.212813 0.794089 0.176661 RAD 0.00617284 + txt002 + SPHERE CENTER 0.221048 0.78268 0.156372 RAD 0.00617284 + txt002 + SPHERE CENTER 0.236948 0.789647 0.173931 RAD 0.00617284 + txt002 + SPHERE CENTER 0.330051 0.815936 0.165419 RAD 0.0185185 + txt002 + SPHERE CENTER 0.350165 0.828769 0.171776 RAD 0.00617284 + txt002 + SPHERE CENTER 0.347547 0.820583 0.148628 RAD 0.00617284 + txt002 + SPHERE CENTER 0.333232 0.838905 0.156937 RAD 0.00617284 + txt002 + SPHERE CENTER 0.332668 0.824121 0.188567 RAD 0.00617284 + txt002 + SPHERE CENTER 0.315735 0.834258 0.173728 RAD 0.00617284 + txt002 + SPHERE CENTER 0.312554 0.811288 0.182211 RAD 0.00617284 + txt002 + SPHERE CENTER 0.346984 0.805799 0.180258 RAD 0.00617284 + txt002 + SPHERE CENTER 0.32687 0.792966 0.173902 RAD 0.00617284 + txt002 + SPHERE CENTER 0.344366 0.797614 0.157111 RAD 0.00617284 + txt002 + SPHERE CENTER 0.282063 0.759846 0.171592 RAD 0.0185185 + txt002 + SPHERE CENTER 0.29233 0.756464 0.193792 RAD 0.00617284 + txt002 + SPHERE CENTER 0.305929 0.765125 0.175091 RAD 0.00617284 + txt002 + SPHERE CENTER 0.288514 0.779336 0.18531 RAD 0.00617284 + txt002 + SPHERE CENTER 0.268464 0.751185 0.190293 RAD 0.00617284 + txt002 + SPHERE CENTER 0.264649 0.774058 0.181811 RAD 0.00617284 + txt002 + SPHERE CENTER 0.258198 0.754567 0.168094 RAD 0.00617284 + txt002 + SPHERE CENTER 0.285879 0.736973 0.180075 RAD 0.00617284 + txt002 + SPHERE CENTER 0.275612 0.740355 0.157875 RAD 0.00617284 + txt002 + SPHERE CENTER 0.299478 0.745634 0.161374 RAD 0.00617284 + txt002 + SPHERE CENTER 0.33768 0.75581 0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER 0.362219 0.753851 0.124743 RAD 0.00617284 + txt002 + SPHERE CENTER 0.352319 0.76987 0.108773 RAD 0.00617284 + txt002 + SPHERE CENTER 0.350765 0.774086 0.133052 RAD 0.00617284 + txt002 + SPHERE CENTER 0.347581 0.739791 0.138803 RAD 0.00617284 + txt002 + SPHERE CENTER 0.336127 0.760026 0.147112 RAD 0.00617284 + txt002 + SPHERE CENTER 0.323042 0.74175 0.136894 RAD 0.00617284 + txt002 + SPHERE CENTER 0.349134 0.735575 0.114524 RAD 0.00617284 + txt002 + SPHERE CENTER 0.324595 0.737534 0.112614 RAD 0.00617284 + txt002 + SPHERE CENTER 0.339233 0.751594 0.0985541 RAD 0.00617284 + txt002 + SPHERE CENTER 0.172546 0.643951 0.222222 RAD 0.0555556 + txt002 + SPHERE CENTER 0.202787 0.674191 0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER 0.219248 0.690652 0.290934 RAD 0.00617284 + txt002 + SPHERE CENTER 0.223862 0.677807 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.206403 0.695267 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.198172 0.687036 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER 0.185327 0.691651 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER 0.181711 0.670575 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER 0.215632 0.669577 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER 0.199171 0.653116 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER 0.220246 0.656732 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER 0.244096 0.663122 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.261725 0.675225 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.244096 0.663122 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER 0.238562 0.683777 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.261725 0.675225 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.238562 0.683777 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.244096 0.663122 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER 0.267259 0.65457 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.249631 0.642468 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.249631 0.642468 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.191718 0.715501 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.203821 0.733129 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.212373 0.709966 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.191718 0.715501 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER 0.183166 0.738664 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.171063 0.721035 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.171063 0.721035 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.203821 0.733129 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.191718 0.715501 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER 0.212373 0.709966 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.131237 0.655019 0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER 0.12881 0.668451 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER 0.151296 0.662426 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER 0.137627 0.678869 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER 0.108751 0.661044 0.290934 RAD 0.00617284 + txt002 + SPHERE CENTER 0.117567 0.671463 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.111177 0.647613 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.12242 0.644601 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER 0.124846 0.631169 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER 0.144906 0.638576 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER 0.120168 0.696329 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.115992 0.720665 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.135288 0.711449 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.135288 0.711449 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.100872 0.705544 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.120168 0.696329 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER 0.105047 0.681209 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.100872 0.705544 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.105047 0.681209 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.120168 0.696329 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER 0.100996 0.624779 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0796777 0.626446 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.100996 0.624779 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0954616 0.645433 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0796777 0.626446 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0954616 0.645433 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.100996 0.624779 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0852121 0.605791 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.10653 0.604124 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.10653 0.604124 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.183615 0.602641 0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER 0.197046 0.600215 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER 0.207465 0.609032 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER 0.191021 0.622701 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER 0.173196 0.593824 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER 0.167171 0.61631 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER 0.159765 0.596251 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER 0.18964 0.580155 0.290934 RAD 0.00617284 + txt002 + SPHERE CENTER 0.176209 0.582581 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.200059 0.588972 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.153374 0.5724 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.155041 0.551082 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.174029 0.566866 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.153374 0.5724 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER 0.134387 0.556617 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.13272 0.577935 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.13272 0.577935 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.155041 0.551082 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.153374 0.5724 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER 0.174029 0.566866 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.224924 0.591572 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.24926 0.587397 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.240045 0.606693 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.240045 0.606693 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.23414 0.572277 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.224924 0.591572 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER 0.209804 0.576452 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.23414 0.572277 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.209804 0.576452 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.224924 0.591572 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER 0.358439 0.594141 0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER 0.428945 0.613592 0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER 0.448155 0.626191 0.113782 RAD 0.00617284 + txt002 + SPHERE CENTER 0.43276 0.614455 0.0984536 RAD 0.00617284 + txt002 + SPHERE CENTER 0.42519 0.634643 0.110488 RAD 0.00617284 + txt002 + SPHERE CENTER 0.44434 0.625328 0.138161 RAD 0.00617284 + txt002 + SPHERE CENTER 0.421375 0.63378 0.134867 RAD 0.00617284 + txt002 + SPHERE CENTER 0.42513 0.612729 0.147213 RAD 0.00617284 + txt002 + SPHERE CENTER 0.45191 0.60514 0.126127 RAD 0.00617284 + txt002 + SPHERE CENTER 0.4327 0.592541 0.135179 RAD 0.00617284 + txt002 + SPHERE CENTER 0.436515 0.593404 0.110799 RAD 0.00617284 + txt002 + SPHERE CENTER 0.399007 0.621614 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.399844 0.625435 0.031176 RAD 0.00617284 + txt002 + SPHERE CENTER 0.38905 0.60511 0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.378352 0.627149 0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.409801 0.641939 0.0466081 RAD 0.00617284 + txt002 + SPHERE CENTER 0.388308 0.643653 0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER 0.408963 0.638118 0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.420499 0.619901 0.0435217 RAD 0.00617284 + txt002 + SPHERE CENTER 0.419661 0.61608 0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.409705 0.599576 0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER 0.37761 0.665691 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.389713 0.68332 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.398265 0.660156 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.37761 0.665691 0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER 0.369058 0.688854 0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER 0.356956 0.671225 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.356956 0.671225 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.389713 0.68332 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.37761 0.665691 0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER 0.398265 0.660156 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.388377 0.586119 0.178389 RAD 0.0185185 + txt002 + SPHERE CENTER 0.405974 0.594185 0.193717 RAD 0.00617284 + txt002 + SPHERE CENTER 0.410332 0.593017 0.169441 RAD 0.00617284 + txt002 + SPHERE CENTER 0.394768 0.609969 0.178389 RAD 0.00617284 + txt002 + SPHERE CENTER 0.384019 0.587286 0.202664 RAD 0.00617284 + txt002 + SPHERE CENTER 0.372813 0.60307 0.187336 RAD 0.00617284 + txt002 + SPHERE CENTER 0.366422 0.57922 0.187336 RAD 0.00617284 + txt002 + SPHERE CENTER 0.399584 0.570335 0.193717 RAD 0.00617284 + txt002 + SPHERE CENTER 0.381987 0.562269 0.178389 RAD 0.00617284 + txt002 + SPHERE CENTER 0.403942 0.569167 0.169441 RAD 0.00617284 + txt002 + SPHERE CENTER 0.337042 0.638217 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.341809 0.659244 0.178701 RAD 0.00617284 + txt002 + SPHERE CENTER 0.360383 0.645657 0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER 0.345471 0.65787 0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER 0.318468 0.651804 0.175614 RAD 0.00617284 + txt002 + SPHERE CENTER 0.32213 0.65043 0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.313702 0.630777 0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.33338 0.639592 0.191046 RAD 0.00617284 + txt002 + SPHERE CENTER 0.328614 0.618565 0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.351955 0.626005 0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.317871 0.566667 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.314012 0.567308 0.191046 RAD 0.00617284 + txt002 + SPHERE CENTER 0.336891 0.569787 0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.320398 0.587901 0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.294991 0.564188 0.175614 RAD 0.00617284 + txt002 + SPHERE CENTER 0.301377 0.584781 0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.29885 0.563547 0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.311485 0.546074 0.178701 RAD 0.00617284 + txt002 + SPHERE CENTER 0.315344 0.545434 0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER 0.334364 0.548554 0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER 0.409774 0.542042 0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER 0.433888 0.53788 0.126127 RAD 0.00617284 + txt002 + SPHERE CENTER 0.426423 0.55574 0.110799 RAD 0.00617284 + txt002 + SPHERE CENTER 0.423551 0.558395 0.135179 RAD 0.00617284 + txt002 + SPHERE CENTER 0.417238 0.524182 0.138161 RAD 0.00617284 + txt002 + SPHERE CENTER 0.406901 0.544697 0.147213 RAD 0.00617284 + txt002 + SPHERE CENTER 0.393124 0.528344 0.134867 RAD 0.00617284 + txt002 + SPHERE CENTER 0.42011 0.521526 0.113782 RAD 0.00617284 + txt002 + SPHERE CENTER 0.395996 0.525689 0.110488 RAD 0.00617284 + txt002 + SPHERE CENTER 0.412646 0.539387 0.0984536 RAD 0.00617284 + txt002 + SPHERE CENTER 0.339267 0.522591 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.340934 0.501272 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.359921 0.517056 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.339267 0.522591 0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER 0.320279 0.506807 0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER 0.318612 0.528125 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.318612 0.528125 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.340934 0.501272 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.339267 0.522591 0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER 0.359921 0.517056 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.379835 0.550064 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.399304 0.540802 0.0435217 RAD 0.00617284 + txt002 + SPHERE CENTER 0.400119 0.563801 0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER 0.400489 0.54453 0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.37902 0.527065 0.0466081 RAD 0.00617284 + txt002 + SPHERE CENTER 0.380205 0.530793 0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.359551 0.536327 0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER 0.37865 0.546337 0.031176 RAD 0.00617284 + txt002 + SPHERE CENTER 0.35918 0.555599 0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.379464 0.569335 0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.371785 0.0996195 0.544331 RAD 0.166667 + txt002 + SPHERE CENTER -0.393621 0.220501 0.729516 RAD 0.0555556 + txt002 + SPHERE CENTER -0.368601 0.279642 0.766439 RAD 0.0185185 + txt002 + SPHERE CENTER -0.354293 0.299716 0.765035 RAD 0.00617284 + txt002 + SPHERE CENTER -0.347717 0.279022 0.753281 RAD 0.00617284 + txt002 + SPHERE CENTER -0.366989 0.292196 0.745238 RAD 0.00617284 + txt002 + SPHERE CENTER -0.375177 0.300337 0.778193 RAD 0.00617284 + txt002 + SPHERE CENTER -0.387873 0.292817 0.758396 RAD 0.00617284 + txt002 + SPHERE CENTER -0.389485 0.280263 0.779597 RAD 0.00617284 + txt002 + SPHERE CENTER -0.355904 0.287162 0.786236 RAD 0.00617284 + txt002 + SPHERE CENTER -0.370213 0.267088 0.787639 RAD 0.00617284 + txt002 + SPHERE CENTER -0.349329 0.266468 0.774481 RAD 0.00617284 + txt002 + SPHERE CENTER -0.321889 0.238665 0.726118 RAD 0.0185185 + txt002 + SPHERE CENTER -0.304702 0.250544 0.71296 RAD 0.00617284 + txt002 + SPHERE CENTER -0.32307 0.238717 0.701455 RAD 0.00617284 + txt002 + SPHERE CENTER -0.327715 0.259421 0.714081 RAD 0.00617284 + txt002 + SPHERE CENTER -0.30352 0.250492 0.737623 RAD 0.00617284 + txt002 + SPHERE CENTER -0.326533 0.259369 0.738744 RAD 0.00617284 + txt002 + SPHERE CENTER -0.320707 0.238612 0.750781 RAD 0.00617284 + txt002 + SPHERE CENTER -0.298875 0.229788 0.724997 RAD 0.00617284 + txt002 + SPHERE CENTER -0.316063 0.217908 0.738155 RAD 0.00617284 + txt002 + SPHERE CENTER -0.317244 0.21796 0.713492 RAD 0.00617284 + txt002 + SPHERE CENTER -0.372464 0.281062 0.692479 RAD 0.0185185 + txt002 + SPHERE CENTER -0.362978 0.289441 0.671279 RAD 0.00617284 + txt002 + SPHERE CENTER -0.35549 0.267771 0.680442 RAD 0.00617284 + txt002 + SPHERE CENTER -0.378255 0.270044 0.671155 RAD 0.00617284 + txt002 + SPHERE CENTER -0.379952 0.302733 0.683315 RAD 0.00617284 + txt002 + SPHERE CENTER -0.395229 0.283335 0.683192 RAD 0.00617284 + txt002 + SPHERE CENTER -0.389438 0.294353 0.704516 RAD 0.00617284 + txt002 + SPHERE CENTER -0.357187 0.30046 0.692603 RAD 0.00617284 + txt002 + SPHERE CENTER -0.366673 0.29208 0.713804 RAD 0.00617284 + txt002 + SPHERE CENTER -0.349699 0.278789 0.701767 RAD 0.00617284 + txt002 + SPHERE CENTER -0.440333 0.261479 0.769837 RAD 0.0185185 + txt002 + SPHERE CENTER -0.443285 0.282991 0.781591 RAD 0.00617284 + txt002 + SPHERE CENTER -0.421181 0.271991 0.781342 RAD 0.00617284 + txt002 + SPHERE CENTER -0.4302 0.282046 0.760673 RAD 0.00617284 + txt002 + SPHERE CENTER -0.462437 0.27248 0.770086 RAD 0.00617284 + txt002 + SPHERE CENTER -0.449353 0.271534 0.749168 RAD 0.00617284 + txt002 + SPHERE CENTER -0.459485 0.250967 0.758332 RAD 0.00617284 + txt002 + SPHERE CENTER -0.453417 0.262424 0.790755 RAD 0.00617284 + txt002 + SPHERE CENTER -0.450466 0.240911 0.779001 RAD 0.00617284 + txt002 + SPHERE CENTER -0.431313 0.251423 0.790506 RAD 0.00617284 + txt002 + SPHERE CENTER -0.444196 0.262898 0.695877 RAD 0.0185185 + txt002 + SPHERE CENTER -0.449273 0.285685 0.687835 RAD 0.00617284 + txt002 + SPHERE CENTER -0.436139 0.282528 0.708504 RAD 0.00617284 + txt002 + SPHERE CENTER -0.426189 0.27701 0.68659 RAD 0.00617284 + txt002 + SPHERE CENTER -0.45733 0.266055 0.675209 RAD 0.00617284 + txt002 + SPHERE CENTER -0.434246 0.257381 0.673964 RAD 0.00617284 + txt002 + SPHERE CENTER -0.452254 0.243269 0.683251 RAD 0.00617284 + txt002 + SPHERE CENTER -0.46728 0.271573 0.697123 RAD 0.00617284 + txt002 + SPHERE CENTER -0.462204 0.248787 0.705165 RAD 0.00617284 + txt002 + SPHERE CENTER -0.454146 0.268416 0.717791 RAD 0.00617284 + txt002 + SPHERE CENTER -0.465353 0.202338 0.732914 RAD 0.0185185 + txt002 + SPHERE CENTER -0.486123 0.204606 0.746073 RAD 0.00617284 + txt002 + SPHERE CENTER -0.464339 0.202946 0.757577 RAD 0.00617284 + txt002 + SPHERE CENTER -0.470107 0.223366 0.744951 RAD 0.00617284 + txt002 + SPHERE CENTER -0.487137 0.203998 0.72141 RAD 0.00617284 + txt002 + SPHERE CENTER -0.471122 0.222757 0.720288 RAD 0.00617284 + txt002 + SPHERE CENTER -0.466367 0.201729 0.708251 RAD 0.00617284 + txt002 + SPHERE CENTER -0.481368 0.183578 0.734036 RAD 0.00617284 + txt002 + SPHERE CENTER -0.460599 0.18131 0.720878 RAD 0.00617284 + txt002 + SPHERE CENTER -0.459584 0.181918 0.745541 RAD 0.00617284 + txt002 + SPHERE CENTER -0.389758 0.219082 0.803476 RAD 0.0185185 + txt002 + SPHERE CENTER -0.378635 0.228779 0.823273 RAD 0.00617284 + txt002 + SPHERE CENTER -0.365937 0.225483 0.802355 RAD 0.00617284 + txt002 + SPHERE CENTER -0.383364 0.24293 0.8036 RAD 0.00617284 + txt002 + SPHERE CENTER -0.402455 0.222377 0.824394 RAD 0.00617284 + txt002 + SPHERE CENTER -0.407185 0.236529 0.804721 RAD 0.00617284 + txt002 + SPHERE CENTER -0.413578 0.21268 0.804597 RAD 0.00617284 + txt002 + SPHERE CENTER -0.385029 0.20493 0.823149 RAD 0.00617284 + txt002 + SPHERE CENTER -0.396152 0.195233 0.803352 RAD 0.00617284 + txt002 + SPHERE CENTER -0.372331 0.201634 0.802231 RAD 0.00617284 + txt002 + SPHERE CENTER -0.414778 0.15994 0.766553 RAD 0.0185185 + txt002 + SPHERE CENTER -0.412573 0.147477 0.787754 RAD 0.00617284 + txt002 + SPHERE CENTER -0.39322 0.15977 0.77859 RAD 0.00617284 + txt002 + SPHERE CENTER -0.412448 0.172167 0.787878 RAD 0.00617284 + txt002 + SPHERE CENTER -0.434131 0.147647 0.775717 RAD 0.00617284 + txt002 + SPHERE CENTER -0.434006 0.172338 0.775841 RAD 0.00617284 + txt002 + SPHERE CENTER -0.436336 0.16011 0.754517 RAD 0.00617284 + txt002 + SPHERE CENTER -0.414903 0.13525 0.766429 RAD 0.00617284 + txt002 + SPHERE CENTER -0.417108 0.147713 0.745229 RAD 0.00617284 + txt002 + SPHERE CENTER -0.39555 0.147543 0.757266 RAD 0.00617284 + txt002 + SPHERE CENTER -0.343046 0.178104 0.763155 RAD 0.0185185 + txt002 + SPHERE CENTER -0.319723 0.177083 0.771198 RAD 0.00617284 + txt002 + SPHERE CENTER -0.325124 0.189464 0.750529 RAD 0.00617284 + txt002 + SPHERE CENTER -0.332294 0.198298 0.772443 RAD 0.00617284 + txt002 + SPHERE CENTER -0.337645 0.165722 0.783824 RAD 0.00617284 + txt002 + SPHERE CENTER -0.350216 0.186938 0.785069 RAD 0.00617284 + txt002 + SPHERE CENTER -0.360967 0.166743 0.775781 RAD 0.00617284 + txt002 + SPHERE CENTER -0.330475 0.156889 0.76191 RAD 0.00617284 + txt002 + SPHERE CENTER -0.353797 0.157909 0.753867 RAD 0.00617284 + txt002 + SPHERE CENTER -0.335876 0.16927 0.741241 RAD 0.00617284 + txt002 + SPHERE CENTER -0.191247 0.166275 0.655442 RAD 0.0555556 + txt002 + SPHERE CENTER -0.130089 0.20793 0.652044 RAD 0.0185185 + txt002 + SPHERE CENTER -0.115471 0.221102 0.637128 RAD 0.00617284 + txt002 + SPHERE CENTER -0.126388 0.200597 0.628759 RAD 0.00617284 + txt002 + SPHERE CENTER -0.13987 0.220766 0.633356 RAD 0.00617284 + txt002 + SPHERE CENTER -0.119172 0.228435 0.660413 RAD 0.00617284 + txt002 + SPHERE CENTER -0.143571 0.228099 0.656641 RAD 0.00617284 + txt002 + SPHERE CENTER -0.13379 0.215264 0.675329 RAD 0.00617284 + txt002 + SPHERE CENTER -0.10569 0.208266 0.655816 RAD 0.00617284 + txt002 + SPHERE CENTER -0.120308 0.195095 0.670732 RAD 0.00617284 + txt002 + SPHERE CENTER -0.116607 0.187762 0.647447 RAD 0.00617284 + txt002 + SPHERE CENTER -0.154295 0.172673 0.591563 RAD 0.0185185 + txt002 + SPHERE CENTER -0.15554 0.180792 0.568278 RAD 0.00617284 + txt002 + SPHERE CENTER -0.17557 0.171251 0.579113 RAD 0.00617284 + txt002 + SPHERE CENTER -0.166926 0.19323 0.586315 RAD 0.00617284 + txt002 + SPHERE CENTER -0.134265 0.182215 0.580727 RAD 0.00617284 + txt002 + SPHERE CENTER -0.145651 0.194652 0.598764 RAD 0.00617284 + txt002 + SPHERE CENTER -0.133019 0.174096 0.604012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.142909 0.160236 0.573526 RAD 0.00617284 + txt002 + SPHERE CENTER -0.141663 0.152117 0.596811 RAD 0.00617284 + txt002 + SPHERE CENTER -0.162939 0.150694 0.584361 RAD 0.00617284 + txt002 + SPHERE CENTER -0.192135 0.230419 0.618405 RAD 0.0185185 + txt002 + SPHERE CENTER -0.18209 0.243049 0.599717 RAD 0.00617284 + txt002 + SPHERE CENTER -0.168159 0.227721 0.613157 RAD 0.00617284 + txt002 + SPHERE CENTER -0.185251 0.218634 0.597829 RAD 0.00617284 + txt002 + SPHERE CENTER -0.206066 0.245747 0.604965 RAD 0.00617284 + txt002 + SPHERE CENTER -0.209227 0.221332 0.603077 RAD 0.00617284 + txt002 + SPHERE CENTER -0.216111 0.233117 0.623653 RAD 0.00617284 + txt002 + SPHERE CENTER -0.188974 0.254834 0.620293 RAD 0.00617284 + txt002 + SPHERE CENTER -0.199019 0.242204 0.638981 RAD 0.00617284 + txt002 + SPHERE CENTER -0.175043 0.239506 0.633733 RAD 0.00617284 + txt002 + SPHERE CENTER -0.167041 0.201532 0.715923 RAD 0.0185185 + txt002 + SPHERE CENTER -0.151829 0.219088 0.724292 RAD 0.00617284 + txt002 + SPHERE CENTER -0.14514 0.205084 0.705088 RAD 0.00617284 + txt002 + SPHERE CENTER -0.163068 0.221861 0.702483 RAD 0.00617284 + txt002 + SPHERE CENTER -0.173729 0.215537 0.735128 RAD 0.00617284 + txt002 + SPHERE CENTER -0.184969 0.218309 0.713318 RAD 0.00617284 + txt002 + SPHERE CENTER -0.188942 0.197981 0.726759 RAD 0.00617284 + txt002 + SPHERE CENTER -0.155801 0.19876 0.737733 RAD 0.00617284 + txt002 + SPHERE CENTER -0.171014 0.181204 0.729364 RAD 0.00617284 + txt002 + SPHERE CENTER -0.149113 0.184756 0.718528 RAD 0.00617284 + txt002 + SPHERE CENTER -0.229087 0.224021 0.682285 RAD 0.0185185 + txt002 + SPHERE CENTER -0.22829 0.248268 0.686881 RAD 0.00617284 + txt002 + SPHERE CENTER -0.207937 0.234532 0.689486 RAD 0.00617284 + txt002 + SPHERE CENTER -0.216949 0.2391 0.666956 RAD 0.00617284 + txt002 + SPHERE CENTER -0.249439 0.237756 0.67968 RAD 0.00617284 + txt002 + SPHERE CENTER -0.238098 0.228589 0.659755 RAD 0.00617284 + txt002 + SPHERE CENTER -0.250236 0.213509 0.675083 RAD 0.00617284 + txt002 + SPHERE CENTER -0.240428 0.233189 0.702209 RAD 0.00617284 + txt002 + SPHERE CENTER -0.241225 0.208942 0.697613 RAD 0.00617284 + txt002 + SPHERE CENTER -0.220075 0.219453 0.704814 RAD 0.00617284 + txt002 + SPHERE CENTER -0.228199 0.159877 0.719322 RAD 0.0185185 + txt002 + SPHERE CENTER -0.229756 0.167942 0.742607 RAD 0.00617284 + txt002 + SPHERE CENTER -0.207683 0.16569 0.731771 RAD 0.00617284 + txt002 + SPHERE CENTER -0.223214 0.183484 0.72457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.250271 0.162129 0.730157 RAD 0.00617284 + txt002 + SPHERE CENTER -0.243729 0.177671 0.71212 RAD 0.00617284 + txt002 + SPHERE CENTER -0.248714 0.154064 0.706872 RAD 0.00617284 + txt002 + SPHERE CENTER -0.234741 0.144336 0.737359 RAD 0.00617284 + txt002 + SPHERE CENTER -0.233184 0.13627 0.714074 RAD 0.00617284 + txt002 + SPHERE CENTER -0.212668 0.142084 0.726523 RAD 0.00617284 + txt002 + SPHERE CENTER -0.129201 0.143787 0.689081 RAD 0.0185185 + txt002 + SPHERE CENTER -0.105335 0.14887 0.692853 RAD 0.00617284 + txt002 + SPHERE CENTER -0.115741 0.153943 0.671044 RAD 0.00617284 + txt002 + SPHERE CENTER -0.121723 0.167242 0.690969 RAD 0.00617284 + txt002 + SPHERE CENTER -0.118795 0.138714 0.71089 RAD 0.00617284 + txt002 + SPHERE CENTER -0.135183 0.157086 0.709006 RAD 0.00617284 + txt002 + SPHERE CENTER -0.142661 0.13363 0.707118 RAD 0.00617284 + txt002 + SPHERE CENTER -0.112813 0.125414 0.690965 RAD 0.00617284 + txt002 + SPHERE CENTER -0.136679 0.120331 0.687193 RAD 0.00617284 + txt002 + SPHERE CENTER -0.123219 0.130487 0.669156 RAD 0.00617284 + txt002 + SPHERE CENTER -0.190359 0.102131 0.692479 RAD 0.0185185 + txt002 + SPHERE CENTER -0.179968 0.0897843 0.711167 RAD 0.00617284 + txt002 + SPHERE CENTER -0.166467 0.105492 0.697727 RAD 0.00617284 + txt002 + SPHERE CENTER -0.183804 0.114103 0.713055 RAD 0.00617284 + txt002 + SPHERE CENTER -0.20386 0.0864233 0.705919 RAD 0.00617284 + txt002 + SPHERE CENTER -0.207696 0.110742 0.707807 RAD 0.00617284 + txt002 + SPHERE CENTER -0.214251 0.0987702 0.687231 RAD 0.00617284 + txt002 + SPHERE CENTER -0.186523 0.0778128 0.690591 RAD 0.00617284 + txt002 + SPHERE CENTER -0.196914 0.0901597 0.671903 RAD 0.00617284 + txt002 + SPHERE CENTER -0.173022 0.0935207 0.677151 RAD 0.00617284 + txt002 + SPHERE CENTER -0.153407 0.108529 0.6286 RAD 0.0185185 + txt002 + SPHERE CENTER -0.130858 0.0995811 0.624003 RAD 0.00617284 + txt002 + SPHERE CENTER -0.135326 0.123725 0.621398 RAD 0.00617284 + txt002 + SPHERE CENTER -0.134736 0.113639 0.643928 RAD 0.00617284 + txt002 + SPHERE CENTER -0.148938 0.0843858 0.631205 RAD 0.00617284 + txt002 + SPHERE CENTER -0.152816 0.0984435 0.65113 RAD 0.00617284 + txt002 + SPHERE CENTER -0.171487 0.0933338 0.635801 RAD 0.00617284 + txt002 + SPHERE CENTER -0.149528 0.0944715 0.608675 RAD 0.00617284 + txt002 + SPHERE CENTER -0.172078 0.10342 0.613272 RAD 0.00617284 + txt002 + SPHERE CENTER -0.153997 0.118615 0.60607 RAD 0.00617284 + txt002 + SPHERE CENTER -0.31427 0.31427 0.544331 RAD 0.0555556 + txt002 + SPHERE CENTER -0.277961 0.367156 0.507294 RAD 0.0185185 + txt002 + SPHERE CENTER -0.269898 0.374298 0.485076 RAD 0.00617284 + txt002 + SPHERE CENTER -0.270045 0.350338 0.491041 RAD 0.00617284 + txt002 + SPHERE CENTER -0.291334 0.362218 0.487134 RAD 0.00617284 + txt002 + SPHERE CENTER -0.277815 0.391115 0.501329 RAD 0.00617284 + txt002 + SPHERE CENTER -0.299251 0.379036 0.503387 RAD 0.00617284 + txt002 + SPHERE CENTER -0.285878 0.383973 0.523547 RAD 0.00617284 + txt002 + SPHERE CENTER -0.256525 0.379235 0.505236 RAD 0.00617284 + txt002 + SPHERE CENTER -0.264588 0.372093 0.527454 RAD 0.00617284 + txt002 + SPHERE CENTER -0.256671 0.355276 0.511201 RAD 0.00617284 + txt002 + SPHERE CENTER -0.252306 0.297666 0.507294 RAD 0.0185185 + txt002 + SPHERE CENTER -0.235688 0.305995 0.491041 RAD 0.00617284 + txt002 + SPHERE CENTER -0.259438 0.312359 0.488775 RAD 0.00617284 + txt002 + SPHERE CENTER -0.245915 0.321516 0.507294 RAD 0.00617284 + txt002 + SPHERE CENTER -0.228556 0.291303 0.509559 RAD 0.00617284 + txt002 + SPHERE CENTER -0.238783 0.306824 0.525813 RAD 0.00617284 + txt002 + SPHERE CENTER -0.245173 0.282974 0.525813 RAD 0.00617284 + txt002 + SPHERE CENTER -0.242079 0.282145 0.491041 RAD 0.00617284 + txt002 + SPHERE CENTER -0.258696 0.273816 0.507294 RAD 0.00617284 + txt002 + SPHERE CENTER -0.265828 0.288509 0.488775 RAD 0.00617284 + txt002 + SPHERE CENTER -0.31427 0.31427 0.470257 RAD 0.0185185 + txt002 + SPHERE CENTER -0.32435 0.32435 0.450097 RAD 0.00617284 + txt002 + SPHERE CENTER -0.33812 0.32066 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER -0.32066 0.33812 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER -0.3005 0.317959 0.450097 RAD 0.00617284 + txt002 + SPHERE CENTER -0.29681 0.331729 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER -0.29042 0.307879 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER -0.317959 0.3005 0.450097 RAD 0.00617284 + txt002 + SPHERE CENTER -0.307879 0.29042 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER -0.331729 0.29681 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER -0.339925 0.383759 0.544331 RAD 0.0185185 + txt002 + SPHERE CENTER -0.334762 0.407156 0.538366 RAD 0.00617284 + txt002 + SPHERE CENTER -0.31686 0.392275 0.546597 RAD 0.00617284 + txt002 + SPHERE CENTER -0.326552 0.388696 0.524171 RAD 0.00617284 + txt002 + SPHERE CENTER -0.357827 0.39864 0.536101 RAD 0.00617284 + txt002 + SPHERE CENTER -0.349618 0.380181 0.521905 RAD 0.00617284 + txt002 + SPHERE CENTER -0.362991 0.375243 0.542066 RAD 0.00617284 + txt002 + SPHERE CENTER -0.348135 0.402218 0.558526 RAD 0.00617284 + txt002 + SPHERE CENTER -0.353299 0.378821 0.564491 RAD 0.00617284 + txt002 + SPHERE CENTER -0.330233 0.387337 0.566757 RAD 0.00617284 + txt002 + SPHERE CENTER -0.376234 0.330873 0.507294 RAD 0.0185185 + txt002 + SPHERE CENTER -0.393346 0.348239 0.503387 RAD 0.00617284 + txt002 + SPHERE CENTER -0.383366 0.345565 0.525813 RAD 0.00617284 + txt002 + SPHERE CENTER -0.369843 0.354723 0.507294 RAD 0.00617284 + txt002 + SPHERE CENTER -0.386213 0.333547 0.484868 RAD 0.00617284 + txt002 + SPHERE CENTER -0.362711 0.340031 0.488775 RAD 0.00617284 + txt002 + SPHERE CENTER -0.369102 0.316181 0.488775 RAD 0.00617284 + txt002 + SPHERE CENTER -0.399736 0.324389 0.503387 RAD 0.00617284 + txt002 + SPHERE CENTER -0.382624 0.307023 0.507294 RAD 0.00617284 + txt002 + SPHERE CENTER -0.389757 0.321715 0.525813 RAD 0.00617284 + txt002 + SPHERE CENTER -0.376234 0.330873 0.581368 RAD 0.0185185 + txt002 + SPHERE CENTER -0.386461 0.346394 0.597621 RAD 0.00617284 + txt002 + SPHERE CENTER -0.362711 0.340031 0.599887 RAD 0.00617284 + txt002 + SPHERE CENTER -0.369843 0.354723 0.581368 RAD 0.00617284 + txt002 + SPHERE CENTER -0.399983 0.337237 0.579103 RAD 0.00617284 + txt002 + SPHERE CENTER -0.383366 0.345565 0.56285 RAD 0.00617284 + txt002 + SPHERE CENTER -0.389757 0.321715 0.56285 RAD 0.00617284 + txt002 + SPHERE CENTER -0.392851 0.322544 0.597621 RAD 0.00617284 + txt002 + SPHERE CENTER -0.382624 0.307023 0.581368 RAD 0.00617284 + txt002 + SPHERE CENTER -0.369102 0.316181 0.599887 RAD 0.00617284 + txt002 + SPHERE CENTER -0.277961 0.367156 0.581368 RAD 0.0185185 + txt002 + SPHERE CENTER -0.261966 0.385852 0.57931 RAD 0.00617284 + txt002 + SPHERE CENTER -0.259422 0.36581 0.565115 RAD 0.00617284 + txt002 + SPHERE CENTER -0.278159 0.38141 0.561208 RAD 0.00617284 + txt002 + SPHERE CENTER -0.280504 0.387198 0.595564 RAD 0.00617284 + txt002 + SPHERE CENTER -0.296698 0.382755 0.577461 RAD 0.00617284 + txt002 + SPHERE CENTER -0.2965 0.368501 0.597621 RAD 0.00617284 + txt002 + SPHERE CENTER -0.261768 0.371598 0.599471 RAD 0.00617284 + txt002 + SPHERE CENTER -0.277764 0.352901 0.601529 RAD 0.00617284 + txt002 + SPHERE CENTER -0.259225 0.351556 0.585275 RAD 0.00617284 + txt002 + SPHERE CENTER -0.31427 0.31427 0.618405 RAD 0.0185185 + txt002 + SPHERE CENTER -0.304189 0.32435 0.638566 RAD 0.00617284 + txt002 + SPHERE CENTER -0.29042 0.32066 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER -0.307879 0.33812 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER -0.328039 0.317959 0.638566 RAD 0.00617284 + txt002 + SPHERE CENTER -0.331729 0.331729 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER -0.33812 0.307879 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER -0.31058 0.3005 0.638566 RAD 0.00617284 + txt002 + SPHERE CENTER -0.32066 0.29042 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER -0.29681 0.29681 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER -0.252306 0.297666 0.581368 RAD 0.0185185 + txt002 + SPHERE CENTER -0.228803 0.30415 0.585275 RAD 0.00617284 + txt002 + SPHERE CENTER -0.238783 0.306824 0.56285 RAD 0.00617284 + txt002 + SPHERE CENTER -0.245915 0.321516 0.581368 RAD 0.00617284 + txt002 + SPHERE CENTER -0.242326 0.294992 0.603794 RAD 0.00617284 + txt002 + SPHERE CENTER -0.259438 0.312359 0.599887 RAD 0.00617284 + txt002 + SPHERE CENTER -0.265828 0.288509 0.599887 RAD 0.00617284 + txt002 + SPHERE CENTER -0.235194 0.2803 0.585275 RAD 0.00617284 + txt002 + SPHERE CENTER -0.258696 0.273816 0.581368 RAD 0.00617284 + txt002 + SPHERE CENTER -0.245173 0.282974 0.56285 RAD 0.00617284 + txt002 + SPHERE CENTER -0.574159 0.153845 0.618405 RAD 0.0555556 + txt002 + SPHERE CENTER -0.612768 0.202534 0.658726 RAD 0.0185185 + txt002 + SPHERE CENTER -0.612732 0.225282 0.668328 RAD 0.00617284 + txt002 + SPHERE CENTER -0.591695 0.212428 0.666956 RAD 0.00617284 + txt002 + SPHERE CENTER -0.60221 0.22113 0.64638 RAD 0.00617284 + txt002 + SPHERE CENTER -0.633805 0.215388 0.660098 RAD 0.00617284 + txt002 + SPHERE CENTER -0.623283 0.211236 0.63815 RAD 0.00617284 + txt002 + SPHERE CENTER -0.63384 0.192641 0.650495 RAD 0.00617284 + txt002 + SPHERE CENTER -0.62329 0.206686 0.680674 RAD 0.00617284 + txt002 + SPHERE CENTER -0.623325 0.183939 0.671072 RAD 0.00617284 + txt002 + SPHERE CENTER -0.602253 0.193832 0.679302 RAD 0.00617284 + txt002 + SPHERE CENTER -0.543919 0.184086 0.678886 RAD 0.0185185 + txt002 + SPHERE CENTER -0.527458 0.200547 0.687117 RAD 0.00617284 + txt002 + SPHERE CENTER -0.522843 0.187702 0.666541 RAD 0.00617284 + txt002 + SPHERE CENTER -0.540303 0.205161 0.666541 RAD 0.00617284 + txt002 + SPHERE CENTER -0.548533 0.196931 0.699462 RAD 0.00617284 + txt002 + SPHERE CENTER -0.561378 0.201546 0.678886 RAD 0.00617284 + txt002 + SPHERE CENTER -0.564994 0.18047 0.691232 RAD 0.00617284 + txt002 + SPHERE CENTER -0.531074 0.179472 0.699462 RAD 0.00617284 + txt002 + SPHERE CENTER -0.547535 0.163011 0.691232 RAD 0.00617284 + txt002 + SPHERE CENTER -0.526459 0.166627 0.678886 RAD 0.00617284 + txt002 + SPHERE CENTER -0.554987 0.225396 0.618405 RAD 0.0185185 + txt002 + SPHERE CENTER -0.542885 0.243024 0.606059 RAD 0.00617284 + txt002 + SPHERE CENTER -0.534333 0.219861 0.606059 RAD 0.00617284 + txt002 + SPHERE CENTER -0.554987 0.225396 0.593714 RAD 0.00617284 + txt002 + SPHERE CENTER -0.563539 0.248559 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER -0.575642 0.23093 0.606059 RAD 0.00617284 + txt002 + SPHERE CENTER -0.575642 0.23093 0.630751 RAD 0.00617284 + txt002 + SPHERE CENTER -0.542885 0.243024 0.630751 RAD 0.00617284 + txt002 + SPHERE CENTER -0.554987 0.225396 0.643096 RAD 0.00617284 + txt002 + SPHERE CENTER -0.534333 0.219861 0.630751 RAD 0.00617284 + txt002 + SPHERE CENTER -0.643008 0.172294 0.598245 RAD 0.0185185 + txt002 + SPHERE CENTER -0.660425 0.189742 0.599616 RAD 0.00617284 + txt002 + SPHERE CENTER -0.645434 0.185725 0.618821 RAD 0.00617284 + txt002 + SPHERE CENTER -0.636618 0.196144 0.598245 RAD 0.00617284 + txt002 + SPHERE CENTER -0.657999 0.17631 0.57904 RAD 0.00617284 + txt002 + SPHERE CENTER -0.634191 0.182712 0.577669 RAD 0.00617284 + txt002 + SPHERE CENTER -0.640582 0.158862 0.577669 RAD 0.00617284 + txt002 + SPHERE CENTER -0.666816 0.165892 0.599616 RAD 0.00617284 + txt002 + SPHERE CENTER -0.649399 0.148444 0.598245 RAD 0.00617284 + txt002 + SPHERE CENTER -0.651825 0.161875 0.618821 RAD 0.00617284 + txt002 + SPHERE CENTER -0.585228 0.195155 0.557924 RAD 0.0185185 + txt002 + SPHERE CENTER -0.574809 0.203972 0.537348 RAD 0.00617284 + txt002 + SPHERE CENTER -0.561378 0.201546 0.557924 RAD 0.00617284 + txt002 + SPHERE CENTER -0.568784 0.181486 0.545578 RAD 0.00617284 + txt002 + SPHERE CENTER -0.598659 0.197581 0.537348 RAD 0.00617284 + txt002 + SPHERE CENTER -0.592634 0.175095 0.545578 RAD 0.00617284 + txt002 + SPHERE CENTER -0.609078 0.188764 0.557924 RAD 0.00617284 + txt002 + SPHERE CENTER -0.591253 0.217641 0.549693 RAD 0.00617284 + txt002 + SPHERE CENTER -0.601672 0.208824 0.57027 RAD 0.00617284 + txt002 + SPHERE CENTER -0.577822 0.215215 0.57027 RAD 0.00617284 + txt002 + SPHERE CENTER -0.6044 0.123605 0.557924 RAD 0.0185185 + txt002 + SPHERE CENTER -0.620861 0.107144 0.549693 RAD 0.00617284 + txt002 + SPHERE CENTER -0.608016 0.102529 0.57027 RAD 0.00617284 + txt002 + SPHERE CENTER -0.625475 0.119989 0.57027 RAD 0.00617284 + txt002 + SPHERE CENTER -0.617245 0.128219 0.537348 RAD 0.00617284 + txt002 + SPHERE CENTER -0.621859 0.141064 0.557924 RAD 0.00617284 + txt002 + SPHERE CENTER -0.600784 0.14468 0.545578 RAD 0.00617284 + txt002 + SPHERE CENTER -0.599785 0.11076 0.537348 RAD 0.00617284 + txt002 + SPHERE CENTER -0.583324 0.127221 0.545578 RAD 0.00617284 + txt002 + SPHERE CENTER -0.58694 0.106145 0.557924 RAD 0.00617284 + txt002 + SPHERE CENTER -0.631939 0.130984 0.658726 RAD 0.0185185 + txt002 + SPHERE CENTER -0.643128 0.132649 0.680674 RAD 0.00617284 + txt002 + SPHERE CENTER -0.618482 0.133263 0.679302 RAD 0.00617284 + txt002 + SPHERE CENTER -0.631785 0.152367 0.671072 RAD 0.00617284 + txt002 + SPHERE CENTER -0.656585 0.130371 0.660098 RAD 0.00617284 + txt002 + SPHERE CENTER -0.645242 0.150088 0.650495 RAD 0.00617284 + txt002 + SPHERE CENTER -0.645397 0.128706 0.63815 RAD 0.00617284 + txt002 + SPHERE CENTER -0.643283 0.111266 0.668328 RAD 0.00617284 + txt002 + SPHERE CENTER -0.632094 0.109601 0.64638 RAD 0.00617284 + txt002 + SPHERE CENTER -0.618637 0.11188 0.666956 RAD 0.00617284 + txt002 + SPHERE CENTER -0.593331 0.0822954 0.618405 RAD 0.0185185 + txt002 + SPHERE CENTER -0.591664 0.0609772 0.630751 RAD 0.00617284 + txt002 + SPHERE CENTER -0.572676 0.076761 0.630751 RAD 0.00617284 + txt002 + SPHERE CENTER -0.593331 0.0822954 0.643096 RAD 0.00617284 + txt002 + SPHERE CENTER -0.612319 0.0665116 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER -0.613986 0.0878298 0.630751 RAD 0.00617284 + txt002 + SPHERE CENTER -0.613986 0.0878298 0.606059 RAD 0.00617284 + txt002 + SPHERE CENTER -0.591664 0.0609772 0.606059 RAD 0.00617284 + txt002 + SPHERE CENTER -0.593331 0.0822954 0.593714 RAD 0.00617284 + txt002 + SPHERE CENTER -0.572676 0.076761 0.606059 RAD 0.00617284 + txt002 + SPHERE CENTER -0.56309 0.112536 0.678886 RAD 0.0185185 + txt002 + SPHERE CENTER -0.549659 0.11011 0.699462 RAD 0.00617284 + txt002 + SPHERE CENTER -0.53924 0.118927 0.678886 RAD 0.00617284 + txt002 + SPHERE CENTER -0.555684 0.132596 0.691232 RAD 0.00617284 + txt002 + SPHERE CENTER -0.573509 0.103719 0.699462 RAD 0.00617284 + txt002 + SPHERE CENTER -0.579534 0.126205 0.691232 RAD 0.00617284 + txt002 + SPHERE CENTER -0.58694 0.106145 0.678886 RAD 0.00617284 + txt002 + SPHERE CENTER -0.557065 0.09005 0.687117 RAD 0.00617284 + txt002 + SPHERE CENTER -0.570497 0.0924762 0.666541 RAD 0.00617284 + txt002 + SPHERE CENTER -0.546646 0.0988668 0.666541 RAD 0.00617284 + txt002 + SPHERE CENTER -0.494808 0.247614 0.43322 RAD 0.0555556 + txt002 + SPHERE CENTER -0.494287 0.313607 0.399581 RAD 0.0185185 + txt002 + SPHERE CENTER -0.484182 0.326876 0.381374 RAD 0.00617284 + txt002 + SPHERE CENTER -0.470513 0.310432 0.39372 RAD 0.00617284 + txt002 + SPHERE CENTER -0.488171 0.302705 0.378288 RAD 0.00617284 + txt002 + SPHERE CENTER -0.507957 0.330051 0.387235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.511946 0.305881 0.384149 RAD 0.00617284 + txt002 + SPHERE CENTER -0.518062 0.316783 0.405442 RAD 0.00617284 + txt002 + SPHERE CENTER -0.490299 0.337778 0.402668 RAD 0.00617284 + txt002 + SPHERE CENTER -0.500404 0.324509 0.420874 RAD 0.00617284 + txt002 + SPHERE CENTER -0.476629 0.321334 0.415013 RAD 0.00617284 + txt002 + SPHERE CENTER -0.452978 0.302539 0.460062 RAD 0.0185185 + txt002 + SPHERE CENTER -0.436971 0.320401 0.454201 RAD 0.00617284 + txt002 + SPHERE CENTER -0.436675 0.29902 0.441856 RAD 0.00617284 + txt002 + SPHERE CENTER -0.455413 0.3148 0.438769 RAD 0.00617284 + txt002 + SPHERE CENTER -0.453274 0.32392 0.472408 RAD 0.00617284 + txt002 + SPHERE CENTER -0.471717 0.318318 0.456976 RAD 0.00617284 + txt002 + SPHERE CENTER -0.469281 0.306057 0.478269 RAD 0.00617284 + txt002 + SPHERE CENTER -0.434535 0.30814 0.475494 RAD 0.00617284 + txt002 + SPHERE CENTER -0.450543 0.290278 0.481355 RAD 0.00617284 + txt002 + SPHERE CENTER -0.434239 0.286759 0.463149 RAD 0.00617284 + txt002 + SPHERE CENTER -0.434629 0.269833 0.396183 RAD 0.0185185 + txt002 + SPHERE CENTER -0.426389 0.279233 0.37489 RAD 0.00617284 + txt002 + SPHERE CENTER -0.445377 0.263449 0.37489 RAD 0.00617284 + txt002 + SPHERE CENTER -0.448298 0.286276 0.383837 RAD 0.00617284 + txt002 + SPHERE CENTER -0.415641 0.285616 0.396183 RAD 0.00617284 + txt002 + SPHERE CENTER -0.43755 0.29266 0.40513 RAD 0.00617284 + txt002 + SPHERE CENTER -0.42388 0.276216 0.417476 RAD 0.00617284 + txt002 + SPHERE CENTER -0.41272 0.262789 0.387235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.420959 0.253389 0.408529 RAD 0.00617284 + txt002 + SPHERE CENTER -0.431707 0.247006 0.387235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.536117 0.258683 0.372739 RAD 0.0185185 + txt002 + SPHERE CENTER -0.549787 0.275127 0.360393 RAD 0.00617284 + txt002 + SPHERE CENTER -0.549787 0.275127 0.385084 RAD 0.00617284 + txt002 + SPHERE CENTER -0.529727 0.282533 0.372739 RAD 0.00617284 + txt002 + SPHERE CENTER -0.536117 0.258683 0.348047 RAD 0.00617284 + txt002 + SPHERE CENTER -0.516058 0.266089 0.360393 RAD 0.00617284 + txt002 + SPHERE CENTER -0.522448 0.242239 0.360393 RAD 0.00617284 + txt002 + SPHERE CENTER -0.556177 0.251277 0.360393 RAD 0.00617284 + txt002 + SPHERE CENTER -0.542508 0.234833 0.372739 RAD 0.00617284 + txt002 + SPHERE CENTER -0.556177 0.251277 0.385084 RAD 0.00617284 + txt002 + SPHERE CENTER -0.476459 0.214908 0.369341 RAD 0.0185185 + txt002 + SPHERE CENTER -0.457868 0.209819 0.353908 RAD 0.00617284 + txt002 + SPHERE CENTER -0.458164 0.2312 0.366254 RAD 0.00617284 + txt002 + SPHERE CENTER -0.453963 0.210053 0.378288 RAD 0.00617284 + txt002 + SPHERE CENTER -0.476163 0.193527 0.356995 RAD 0.00617284 + txt002 + SPHERE CENTER -0.472258 0.193761 0.381374 RAD 0.00617284 + txt002 + SPHERE CENTER -0.494753 0.198616 0.372427 RAD 0.00617284 + txt002 + SPHERE CENTER -0.480363 0.214674 0.344961 RAD 0.00617284 + txt002 + SPHERE CENTER -0.498954 0.219763 0.360393 RAD 0.00617284 + txt002 + SPHERE CENTER -0.480659 0.236055 0.357307 RAD 0.00617284 + txt002 + SPHERE CENTER -0.536638 0.19269 0.406378 RAD 0.0185185 + txt002 + SPHERE CENTER -0.549603 0.17251 0.412239 RAD 0.00617284 + txt002 + SPHERE CENTER -0.528912 0.177908 0.424584 RAD 0.00617284 + txt002 + SPHERE CENTER -0.549105 0.191778 0.427671 RAD 0.00617284 + txt002 + SPHERE CENTER -0.557329 0.187292 0.394032 RAD 0.00617284 + txt002 + SPHERE CENTER -0.556831 0.20656 0.409464 RAD 0.00617284 + txt002 + SPHERE CENTER -0.544363 0.207471 0.388171 RAD 0.00617284 + txt002 + SPHERE CENTER -0.537136 0.173421 0.390945 RAD 0.00617284 + txt002 + SPHERE CENTER -0.524171 0.193601 0.385084 RAD 0.00617284 + txt002 + SPHERE CENTER -0.516445 0.178819 0.403291 RAD 0.00617284 + txt002 + SPHERE CENTER -0.554467 0.291389 0.436618 RAD 0.0185185 + txt002 + SPHERE CENTER -0.562288 0.314604 0.439705 RAD 0.00617284 + txt002 + SPHERE CENTER -0.542501 0.306499 0.45205 RAD 0.00617284 + txt002 + SPHERE CENTER -0.541186 0.310183 0.427671 RAD 0.00617284 + txt002 + SPHERE CENTER -0.574255 0.299494 0.424272 RAD 0.00617284 + txt002 + SPHERE CENTER -0.553152 0.295073 0.412239 RAD 0.00617284 + txt002 + SPHERE CENTER -0.566433 0.276279 0.421186 RAD 0.00617284 + txt002 + SPHERE CENTER -0.575569 0.29581 0.448652 RAD 0.00617284 + txt002 + SPHERE CENTER -0.567748 0.272595 0.445566 RAD 0.00617284 + txt002 + SPHERE CENTER -0.555781 0.287705 0.460998 RAD 0.00617284 + txt002 + SPHERE CENTER -0.554987 0.225396 0.470257 RAD 0.0185185 + txt002 + SPHERE CENTER -0.567359 0.227186 0.49155 RAD 0.00617284 + txt002 + SPHERE CENTER -0.54267 0.227528 0.49155 RAD 0.00617284 + txt002 + SPHERE CENTER -0.555283 0.246777 0.482603 RAD 0.00617284 + txt002 + SPHERE CENTER -0.579676 0.225054 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER -0.567601 0.244644 0.46131 RAD 0.00617284 + txt002 + SPHERE CENTER -0.567305 0.223263 0.448964 RAD 0.00617284 + txt002 + SPHERE CENTER -0.567063 0.205805 0.479204 RAD 0.00617284 + txt002 + SPHERE CENTER -0.554691 0.204014 0.457911 RAD 0.00617284 + txt002 + SPHERE CENTER -0.542374 0.206147 0.479204 RAD 0.00617284 + txt002 + SPHERE CENTER -0.513157 0.28032 0.497099 RAD 0.0185185 + txt002 + SPHERE CENTER -0.507811 0.298839 0.512531 RAD 0.00617284 + txt002 + SPHERE CENTER -0.489718 0.287442 0.500186 RAD 0.00617284 + txt002 + SPHERE CENTER -0.505577 0.302049 0.488152 RAD 0.00617284 + txt002 + SPHERE CENTER -0.531251 0.291716 0.509445 RAD 0.00617284 + txt002 + SPHERE CENTER -0.529016 0.294927 0.485065 RAD 0.00617284 + txt002 + SPHERE CENTER -0.536597 0.273198 0.494013 RAD 0.00617284 + txt002 + SPHERE CENTER -0.515392 0.27711 0.521479 RAD 0.00617284 + txt002 + SPHERE CENTER -0.520738 0.258591 0.506047 RAD 0.00617284 + txt002 + SPHERE CENTER -0.497299 0.265714 0.509133 RAD 0.00617284 + txt002 + SPHERE CENTER -0.552323 0.0329639 0.43322 RAD 0.0555556 + txt002 + SPHERE CENTER -0.625877 0.0248832 0.436618 RAD 0.0185185 + txt002 + SPHERE CENTER -0.646362 0.0316054 0.448652 RAD 0.00617284 + txt002 + SPHERE CENTER -0.625173 0.0287309 0.460998 RAD 0.00617284 + txt002 + SPHERE CENTER -0.627981 0.0478 0.445566 RAD 0.00617284 + txt002 + SPHERE CENTER -0.647066 0.0277577 0.424272 RAD 0.00617284 + txt002 + SPHERE CENTER -0.628685 0.0439523 0.421186 RAD 0.00617284 + txt002 + SPHERE CENTER -0.62658 0.0210355 0.412239 RAD 0.00617284 + txt002 + SPHERE CENTER -0.644258 0.00868865 0.439705 RAD 0.00617284 + txt002 + SPHERE CENTER -0.623773 0.00196644 0.427671 RAD 0.00617284 + txt002 + SPHERE CENTER -0.623069 0.00581415 0.45205 RAD 0.00617284 + txt002 + SPHERE CENTER -0.584567 0.0138144 0.497099 RAD 0.0185185 + txt002 + SPHERE CENTER -0.584898 0.0177119 0.521479 RAD 0.00617284 + txt002 + SPHERE CENTER -0.56353 0.0185345 0.509133 RAD 0.00617284 + txt002 + SPHERE CENTER -0.580268 0.0364224 0.506047 RAD 0.00617284 + txt002 + SPHERE CENTER -0.605935 0.0129918 0.509445 RAD 0.00617284 + txt002 + SPHERE CENTER -0.601305 0.0317022 0.494013 RAD 0.00617284 + txt002 + SPHERE CENTER -0.605605 0.00909422 0.485065 RAD 0.00617284 + txt002 + SPHERE CENTER -0.589197 -0.00489609 0.512531 RAD 0.00617284 + txt002 + SPHERE CENTER -0.588867 -0.00879364 0.488152 RAD 0.00617284 + txt002 + SPHERE CENTER -0.567829 -0.00407348 0.500186 RAD 0.00617284 + txt002 + SPHERE CENTER -0.593331 0.0822954 0.470257 RAD 0.0185185 + txt002 + SPHERE CENTER -0.593994 0.105299 0.479204 RAD 0.00617284 + txt002 + SPHERE CENTER -0.572783 0.0926585 0.479204 RAD 0.00617284 + txt002 + SPHERE CENTER -0.582384 0.100664 0.457911 RAD 0.00617284 + txt002 + SPHERE CENTER -0.614541 0.0949359 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER -0.602932 0.090301 0.448964 RAD 0.00617284 + txt002 + SPHERE CENTER -0.613879 0.0719323 0.46131 RAD 0.00617284 + txt002 + SPHERE CENTER -0.604941 0.0869303 0.49155 RAD 0.00617284 + txt002 + SPHERE CENTER -0.604278 0.0639267 0.482603 RAD 0.00617284 + txt002 + SPHERE CENTER -0.58373 0.0742898 0.49155 RAD 0.00617284 + txt002 + SPHERE CENTER -0.593633 0.0440327 0.372739 RAD 0.0185185 + txt002 + SPHERE CENTER -0.607302 0.0604766 0.360393 RAD 0.00617284 + txt002 + SPHERE CENTER -0.607302 0.0604766 0.385084 RAD 0.00617284 + txt002 + SPHERE CENTER -0.587242 0.0678827 0.372739 RAD 0.00617284 + txt002 + SPHERE CENTER -0.593633 0.0440327 0.348047 RAD 0.00617284 + txt002 + SPHERE CENTER -0.573573 0.0514389 0.360393 RAD 0.00617284 + txt002 + SPHERE CENTER -0.579964 0.0275889 0.360393 RAD 0.00617284 + txt002 + SPHERE CENTER -0.613693 0.0366265 0.360393 RAD 0.00617284 + txt002 + SPHERE CENTER -0.600023 0.0201827 0.372739 RAD 0.00617284 + txt002 + SPHERE CENTER -0.613693 0.0366265 0.385084 RAD 0.00617284 + txt002 + SPHERE CENTER -0.561087 0.101445 0.406378 RAD 0.0185185 + txt002 + SPHERE CENTER -0.551884 0.118381 0.390945 RAD 0.00617284 + txt002 + SPHERE CENTER -0.536664 0.103361 0.403291 RAD 0.00617284 + txt002 + SPHERE CENTER -0.550745 0.0944221 0.385084 RAD 0.00617284 + txt002 + SPHERE CENTER -0.576307 0.116465 0.394032 RAD 0.00617284 + txt002 + SPHERE CENTER -0.575168 0.0925065 0.388171 RAD 0.00617284 + txt002 + SPHERE CENTER -0.58551 0.0995293 0.409464 RAD 0.00617284 + txt002 + SPHERE CENTER -0.562225 0.125404 0.412239 RAD 0.00617284 + txt002 + SPHERE CENTER -0.571428 0.108468 0.427671 RAD 0.00617284 + txt002 + SPHERE CENTER -0.547006 0.110383 0.424584 RAD 0.00617284 + txt002 + SPHERE CENTER -0.520079 0.0521134 0.369341 RAD 0.0185185 + txt002 + SPHERE CENTER -0.523344 0.0542684 0.344961 RAD 0.00617284 + txt002 + SPHERE CENTER -0.534291 0.0358996 0.357307 RAD 0.00617284 + txt002 + SPHERE CENTER -0.541988 0.0591566 0.360393 RAD 0.00617284 + txt002 + SPHERE CENTER -0.509132 0.0704822 0.356995 RAD 0.00617284 + txt002 + SPHERE CENTER -0.527777 0.0753703 0.372427 RAD 0.00617284 + txt002 + SPHERE CENTER -0.505868 0.0683272 0.381374 RAD 0.00617284 + txt002 + SPHERE CENTER -0.501435 0.0472252 0.353908 RAD 0.00617284 + txt002 + SPHERE CENTER -0.49817 0.0450702 0.378288 RAD 0.00617284 + txt002 + SPHERE CENTER -0.512382 0.0288565 0.366254 RAD 0.00617284 + txt002 + SPHERE CENTER -0.584869 -0.0244483 0.399581 RAD 0.0185185 + txt002 + SPHERE CENTER -0.5935 -0.0473753 0.402668 RAD 0.00617284 + txt002 + SPHERE CENTER -0.57344 -0.0399691 0.415013 RAD 0.00617284 + txt002 + SPHERE CENTER -0.595617 -0.0308315 0.420874 RAD 0.00617284 + txt002 + SPHERE CENTER -0.604929 -0.0318545 0.387235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.607046 -0.0153107 0.405442 RAD 0.00617284 + txt002 + SPHERE CENTER -0.596298 -0.00892756 0.384149 RAD 0.00617284 + txt002 + SPHERE CENTER -0.582752 -0.0409921 0.381374 RAD 0.00617284 + txt002 + SPHERE CENTER -0.574121 -0.0180651 0.378288 RAD 0.00617284 + txt002 + SPHERE CENTER -0.562692 -0.0335859 0.39372 RAD 0.00617284 + txt002 + SPHERE CENTER -0.511316 -0.0163676 0.396183 RAD 0.0185185 + txt002 + SPHERE CENTER -0.48882 -0.0212225 0.387235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.497372 0.00194055 0.387235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.491256 -0.00896145 0.408529 RAD 0.00617284 + txt002 + SPHERE CENTER -0.502764 -0.0395307 0.396183 RAD 0.00617284 + txt002 + SPHERE CENTER -0.505199 -0.0272696 0.417476 RAD 0.00617284 + txt002 + SPHERE CENTER -0.525259 -0.0346758 0.40513 RAD 0.00617284 + txt002 + SPHERE CENTER -0.50888 -0.0286287 0.37489 RAD 0.00617284 + txt002 + SPHERE CENTER -0.531375 -0.0237738 0.383837 RAD 0.00617284 + txt002 + SPHERE CENTER -0.517432 -0.00546563 0.37489 RAD 0.00617284 + txt002 + SPHERE CENTER -0.54356 -0.0355172 0.460062 RAD 0.0185185 + txt002 + SPHERE CENTER -0.530389 -0.0495897 0.475494 RAD 0.00617284 + txt002 + SPHERE CENTER -0.519442 -0.031221 0.463149 RAD 0.00617284 + txt002 + SPHERE CENTER -0.53532 -0.0261165 0.481355 RAD 0.00617284 + txt002 + SPHERE CENTER -0.554507 -0.0538859 0.472408 RAD 0.00617284 + txt002 + SPHERE CENTER -0.559438 -0.0304127 0.478269 RAD 0.00617284 + txt002 + SPHERE CENTER -0.567678 -0.0398133 0.456976 RAD 0.00617284 + txt002 + SPHERE CENTER -0.538628 -0.0589904 0.454201 RAD 0.00617284 + txt002 + SPHERE CENTER -0.551799 -0.0449178 0.438769 RAD 0.00617284 + txt002 + SPHERE CENTER -0.527681 -0.0406217 0.441856 RAD 0.00617284 + txt002 + SPHERE CENTER -0.451136 0.0058509 0.729516 RAD 0.0555556 + txt002 + SPHERE CENTER -0.447081 0.0051487 0.803476 RAD 0.0185185 + txt002 + SPHERE CENTER -0.435909 0.01504 0.823149 RAD 0.00617284 + txt002 + SPHERE CENTER -0.423265 0.0115452 0.802231 RAD 0.00617284 + txt002 + SPHERE CENTER -0.440694 0.0289993 0.803352 RAD 0.00617284 + txt002 + SPHERE CENTER -0.459725 0.00864346 0.824394 RAD 0.00617284 + txt002 + SPHERE CENTER -0.46451 0.0226028 0.804597 RAD 0.00617284 + txt002 + SPHERE CENTER -0.470897 -0.0012478 0.804721 RAD 0.00617284 + txt002 + SPHERE CENTER -0.442297 -0.00881065 0.823273 RAD 0.00617284 + txt002 + SPHERE CENTER -0.453468 -0.0187019 0.8036 RAD 0.00617284 + txt002 + SPHERE CENTER -0.429652 -0.0123054 0.802355 RAD 0.00617284 + txt002 + SPHERE CENTER -0.386138 0.0172804 0.763155 RAD 0.0185185 + txt002 + SPHERE CENTER -0.364644 0.0293677 0.76191 RAD 0.00617284 + txt002 + SPHERE CENTER -0.375512 0.0213457 0.741241 RAD 0.00617284 + txt002 + SPHERE CENTER -0.385352 0.0401449 0.753867 RAD 0.00617284 + txt002 + SPHERE CENTER -0.37527 0.0253024 0.783824 RAD 0.00617284 + txt002 + SPHERE CENTER -0.395978 0.0360796 0.775781 RAD 0.00617284 + txt002 + SPHERE CENTER -0.396764 0.0132151 0.785069 RAD 0.00617284 + txt002 + SPHERE CENTER -0.36543 0.0065032 0.771198 RAD 0.00617284 + txt002 + SPHERE CENTER -0.386924 -0.00558411 0.772443 RAD 0.00617284 + txt002 + SPHERE CENTER -0.376298 -0.00151881 0.750529 RAD 0.00617284 + txt002 + SPHERE CENTER -0.439178 0.0688765 0.766553 RAD 0.0185185 + txt002 + SPHERE CENTER -0.426942 0.0903221 0.766429 RAD 0.00617284 + txt002 + SPHERE CENTER -0.416328 0.0699989 0.757266 RAD 0.00617284 + txt002 + SPHERE CENTER -0.435083 0.0806307 0.745229 RAD 0.00617284 + txt002 + SPHERE CENTER -0.449792 0.0891998 0.775717 RAD 0.00617284 + txt002 + SPHERE CENTER -0.457933 0.0795084 0.754517 RAD 0.00617284 + txt002 + SPHERE CENTER -0.462029 0.0677542 0.775841 RAD 0.00617284 + txt002 + SPHERE CENTER -0.431037 0.078568 0.787754 RAD 0.00617284 + txt002 + SPHERE CENTER -0.443274 0.0571224 0.787878 RAD 0.00617284 + txt002 + SPHERE CENTER -0.420423 0.0582447 0.77859 RAD 0.00617284 + txt002 + SPHERE CENTER -0.512079 -0.00628079 0.769837 RAD 0.0185185 + txt002 + SPHERE CENTER -0.523883 -0.000557006 0.790755 RAD 0.00617284 + txt002 + SPHERE CENTER -0.49924 -0.00208214 0.790506 RAD 0.00617284 + txt002 + SPHERE CENTER -0.51057 0.0165974 0.779001 RAD 0.00617284 + txt002 + SPHERE CENTER -0.536722 -0.00475566 0.770086 RAD 0.00617284 + txt002 + SPHERE CENTER -0.523409 0.0123987 0.758332 RAD 0.00617284 + txt002 + SPHERE CENTER -0.524918 -0.0104794 0.749168 RAD 0.00617284 + txt002 + SPHERE CENTER -0.525392 -0.0234352 0.781591 RAD 0.00617284 + txt002 + SPHERE CENTER -0.513588 -0.029159 0.760673 RAD 0.00617284 + txt002 + SPHERE CENTER -0.500749 -0.0249603 0.781342 RAD 0.00617284 + txt002 + SPHERE CENTER -0.504176 0.0574471 0.732914 RAD 0.0185185 + txt002 + SPHERE CENTER -0.508666 0.0817008 0.734036 RAD 0.00617284 + txt002 + SPHERE CENTER -0.488971 0.0722467 0.745541 RAD 0.00617284 + txt002 + SPHERE CENTER -0.489545 0.0732807 0.720878 RAD 0.00617284 + txt002 + SPHERE CENTER -0.523872 0.0669012 0.72141 RAD 0.00617284 + txt002 + SPHERE CENTER -0.504751 0.058481 0.708251 RAD 0.00617284 + txt002 + SPHERE CENTER -0.519382 0.0426474 0.720288 RAD 0.00617284 + txt002 + SPHERE CENTER -0.523298 0.0658672 0.746073 RAD 0.00617284 + txt002 + SPHERE CENTER -0.518808 0.0416134 0.744951 RAD 0.00617284 + txt002 + SPHERE CENTER -0.503602 0.0564131 0.757577 RAD 0.00617284 + txt002 + SPHERE CENTER -0.516134 -0.00557859 0.695877 RAD 0.0185185 + txt002 + SPHERE CENTER -0.540463 -0.00154892 0.697123 RAD 0.00617284 + txt002 + SPHERE CENTER -0.52751 -0.00538221 0.717791 RAD 0.00617284 + txt002 + SPHERE CENTER -0.524673 0.0156462 0.705165 RAD 0.00617284 + txt002 + SPHERE CENTER -0.529087 -0.00174531 0.675209 RAD 0.00617284 + txt002 + SPHERE CENTER -0.513298 0.0154498 0.683251 RAD 0.00617284 + txt002 + SPHERE CENTER -0.504759 -0.00577498 0.673964 RAD 0.00617284 + txt002 + SPHERE CENTER -0.531924 -0.0227737 0.687835 RAD 0.00617284 + txt002 + SPHERE CENTER -0.507596 -0.0268034 0.68659 RAD 0.00617284 + txt002 + SPHERE CENTER -0.518971 -0.026607 0.708504 RAD 0.00617284 + txt002 + SPHERE CENTER -0.459039 -0.0578769 0.766439 RAD 0.0185185 + txt002 + SPHERE CENTER -0.451803 -0.0707378 0.786236 RAD 0.00617284 + txt002 + SPHERE CENTER -0.435761 -0.0561039 0.774481 RAD 0.00617284 + txt002 + SPHERE CENTER -0.454158 -0.0461991 0.787639 RAD 0.00617284 + txt002 + SPHERE CENTER -0.475081 -0.0725109 0.778193 RAD 0.00617284 + txt002 + SPHERE CENTER -0.477435 -0.0479721 0.779597 RAD 0.00617284 + txt002 + SPHERE CENTER -0.482316 -0.05965 0.758396 RAD 0.00617284 + txt002 + SPHERE CENTER -0.456685 -0.0824157 0.765035 RAD 0.00617284 + txt002 + SPHERE CENTER -0.46392 -0.0695548 0.745238 RAD 0.00617284 + txt002 + SPHERE CENTER -0.440643 -0.0677817 0.753281 RAD 0.00617284 + txt002 + SPHERE CENTER -0.463094 -0.0571747 0.692479 RAD 0.0185185 + txt002 + SPHERE CENTER -0.459563 -0.081612 0.692603 RAD 0.00617284 + txt002 + SPHERE CENTER -0.442243 -0.0665888 0.701767 RAD 0.00617284 + txt002 + SPHERE CENTER -0.463589 -0.0696122 0.713804 RAD 0.00617284 + txt002 + SPHERE CENTER -0.480415 -0.0721979 0.683315 RAD 0.00617284 + txt002 + SPHERE CENTER -0.48444 -0.0601982 0.704516 RAD 0.00617284 + txt002 + SPHERE CENTER -0.483946 -0.0477607 0.683192 RAD 0.00617284 + txt002 + SPHERE CENTER -0.459069 -0.0691745 0.671279 RAD 0.00617284 + txt002 + SPHERE CENTER -0.4626 -0.0447373 0.671155 RAD 0.00617284 + txt002 + SPHERE CENTER -0.441749 -0.0541513 0.680442 RAD 0.00617284 + txt002 + SPHERE CENTER -0.398096 -0.0457452 0.726118 RAD 0.0185185 + txt002 + SPHERE CENTER -0.373728 -0.0495643 0.724997 RAD 0.00617284 + txt002 + SPHERE CENTER -0.383722 -0.030137 0.713492 RAD 0.00617284 + txt002 + SPHERE CENTER -0.382672 -0.0306825 0.738155 RAD 0.00617284 + txt002 + SPHERE CENTER -0.388102 -0.0651725 0.737623 RAD 0.00617284 + txt002 + SPHERE CENTER -0.397047 -0.0462908 0.750781 RAD 0.00617284 + txt002 + SPHERE CENTER -0.41247 -0.0613535 0.738744 RAD 0.00617284 + txt002 + SPHERE CENTER -0.389151 -0.064627 0.71296 RAD 0.00617284 + txt002 + SPHERE CENTER -0.41352 -0.060808 0.714081 RAD 0.00617284 + txt002 + SPHERE CENTER -0.399146 -0.0451997 0.701455 RAD 0.00617284 + txt002 + SPHERE CENTER -0.4293 -0.115031 0.544331 RAD 0.0555556 + txt002 + SPHERE CENTER -0.424299 -0.178985 0.581368 RAD 0.0185185 + txt002 + SPHERE CENTER -0.412497 -0.190929 0.599471 RAD 0.00617284 + txt002 + SPHERE CENTER -0.400273 -0.174844 0.585275 RAD 0.00617284 + txt002 + SPHERE CENTER -0.417001 -0.16674 0.601529 RAD 0.00617284 + txt002 + SPHERE CENTER -0.436523 -0.195071 0.595564 RAD 0.00617284 + txt002 + SPHERE CENTER -0.441027 -0.170881 0.597621 RAD 0.00617284 + txt002 + SPHERE CENTER -0.448325 -0.183127 0.577461 RAD 0.00617284 + txt002 + SPHERE CENTER -0.419795 -0.203175 0.57931 RAD 0.00617284 + txt002 + SPHERE CENTER -0.431597 -0.191231 0.561208 RAD 0.00617284 + txt002 + SPHERE CENTER -0.407571 -0.18709 0.565115 RAD 0.00617284 + txt002 + SPHERE CENTER -0.367336 -0.131634 0.581368 RAD 0.0185185 + txt002 + SPHERE CENTER -0.343834 -0.12515 0.585275 RAD 0.00617284 + txt002 + SPHERE CENTER -0.353814 -0.122476 0.56285 RAD 0.00617284 + txt002 + SPHERE CENTER -0.360946 -0.107784 0.581368 RAD 0.00617284 + txt002 + SPHERE CENTER -0.357357 -0.134308 0.603794 RAD 0.00617284 + txt002 + SPHERE CENTER -0.374468 -0.116942 0.599887 RAD 0.00617284 + txt002 + SPHERE CENTER -0.380859 -0.140792 0.599887 RAD 0.00617284 + txt002 + SPHERE CENTER -0.350225 -0.149 0.585275 RAD 0.00617284 + txt002 + SPHERE CENTER -0.373727 -0.155484 0.581368 RAD 0.00617284 + txt002 + SPHERE CENTER -0.360204 -0.146326 0.56285 RAD 0.00617284 + txt002 + SPHERE CENTER -0.4293 -0.115031 0.618405 RAD 0.0185185 + txt002 + SPHERE CENTER -0.41922 -0.10495 0.638566 RAD 0.00617284 + txt002 + SPHERE CENTER -0.40545 -0.10864 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER -0.42291 -0.0911807 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER -0.44307 -0.111341 0.638566 RAD 0.00617284 + txt002 + SPHERE CENTER -0.44676 -0.0975713 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER -0.45315 -0.121421 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER -0.425611 -0.128801 0.638566 RAD 0.00617284 + txt002 + SPHERE CENTER -0.435691 -0.138881 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER -0.411841 -0.13249 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER -0.486264 -0.162382 0.544331 RAD 0.0185185 + txt002 + SPHERE CENTER -0.502603 -0.174264 0.558526 RAD 0.00617284 + txt002 + SPHERE CENTER -0.479659 -0.170327 0.566757 RAD 0.00617284 + txt002 + SPHERE CENTER -0.495376 -0.15142 0.564491 RAD 0.00617284 + txt002 + SPHERE CENTER -0.509207 -0.166319 0.536101 RAD 0.00617284 + txt002 + SPHERE CENTER -0.501981 -0.143475 0.542066 RAD 0.00617284 + txt002 + SPHERE CENTER -0.492868 -0.154437 0.521905 RAD 0.00617284 + txt002 + SPHERE CENTER -0.49349 -0.185226 0.538366 RAD 0.00617284 + txt002 + SPHERE CENTER -0.477151 -0.173345 0.524171 RAD 0.00617284 + txt002 + SPHERE CENTER -0.470546 -0.18129 0.546597 RAD 0.00617284 + txt002 + SPHERE CENTER -0.491265 -0.0984274 0.581368 RAD 0.0185185 + txt002 + SPHERE CENTER -0.501491 -0.082906 0.597621 RAD 0.00617284 + txt002 + SPHERE CENTER -0.477742 -0.0892696 0.599887 RAD 0.00617284 + txt002 + SPHERE CENTER -0.484874 -0.0745774 0.581368 RAD 0.00617284 + txt002 + SPHERE CENTER -0.515014 -0.0920638 0.579103 RAD 0.00617284 + txt002 + SPHERE CENTER -0.498397 -0.0837352 0.56285 RAD 0.00617284 + txt002 + SPHERE CENTER -0.504787 -0.107585 0.56285 RAD 0.00617284 + txt002 + SPHERE CENTER -0.507882 -0.106756 0.597621 RAD 0.00617284 + txt002 + SPHERE CENTER -0.497655 -0.122277 0.581368 RAD 0.00617284 + txt002 + SPHERE CENTER -0.484132 -0.11312 0.599887 RAD 0.00617284 + txt002 + SPHERE CENTER -0.491265 -0.0984274 0.507294 RAD 0.0185185 + txt002 + SPHERE CENTER -0.508376 -0.0810612 0.503387 RAD 0.00617284 + txt002 + SPHERE CENTER -0.498397 -0.0837352 0.525813 RAD 0.00617284 + txt002 + SPHERE CENTER -0.484874 -0.0745774 0.507294 RAD 0.00617284 + txt002 + SPHERE CENTER -0.501244 -0.0957534 0.484868 RAD 0.00617284 + txt002 + SPHERE CENTER -0.477742 -0.0892696 0.488775 RAD 0.00617284 + txt002 + SPHERE CENTER -0.484132 -0.11312 0.488775 RAD 0.00617284 + txt002 + SPHERE CENTER -0.514767 -0.104911 0.503387 RAD 0.00617284 + txt002 + SPHERE CENTER -0.497655 -0.122277 0.507294 RAD 0.00617284 + txt002 + SPHERE CENTER -0.504787 -0.107585 0.525813 RAD 0.00617284 + txt002 + SPHERE CENTER -0.424299 -0.178985 0.507294 RAD 0.0185185 + txt002 + SPHERE CENTER -0.411775 -0.200165 0.505236 RAD 0.00617284 + txt002 + SPHERE CENTER -0.399922 -0.179342 0.511201 RAD 0.00617284 + txt002 + SPHERE CENTER -0.415187 -0.189948 0.527454 RAD 0.00617284 + txt002 + SPHERE CENTER -0.436152 -0.199808 0.501329 RAD 0.00617284 + txt002 + SPHERE CENTER -0.439564 -0.189591 0.523547 RAD 0.00617284 + txt002 + SPHERE CENTER -0.448677 -0.178629 0.503387 RAD 0.00617284 + txt002 + SPHERE CENTER -0.420888 -0.189202 0.485076 RAD 0.00617284 + txt002 + SPHERE CENTER -0.433412 -0.168023 0.487134 RAD 0.00617284 + txt002 + SPHERE CENTER -0.409035 -0.168379 0.491041 RAD 0.00617284 + txt002 + SPHERE CENTER -0.4293 -0.115031 0.470257 RAD 0.0185185 + txt002 + SPHERE CENTER -0.439381 -0.10495 0.450097 RAD 0.00617284 + txt002 + SPHERE CENTER -0.45315 -0.10864 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER -0.435691 -0.0911807 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER -0.415531 -0.111341 0.450097 RAD 0.00617284 + txt002 + SPHERE CENTER -0.411841 -0.0975713 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER -0.40545 -0.121421 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER -0.43299 -0.128801 0.450097 RAD 0.00617284 + txt002 + SPHERE CENTER -0.42291 -0.138881 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER -0.44676 -0.13249 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER -0.367336 -0.131634 0.507294 RAD 0.0185185 + txt002 + SPHERE CENTER -0.350719 -0.123305 0.491041 RAD 0.00617284 + txt002 + SPHERE CENTER -0.374468 -0.116942 0.488775 RAD 0.00617284 + txt002 + SPHERE CENTER -0.360946 -0.107784 0.507294 RAD 0.00617284 + txt002 + SPHERE CENTER -0.343587 -0.137998 0.509559 RAD 0.00617284 + txt002 + SPHERE CENTER -0.353814 -0.122476 0.525813 RAD 0.00617284 + txt002 + SPHERE CENTER -0.360204 -0.146326 0.525813 RAD 0.00617284 + txt002 + SPHERE CENTER -0.357109 -0.147155 0.491041 RAD 0.00617284 + txt002 + SPHERE CENTER -0.373727 -0.155484 0.507294 RAD 0.00617284 + txt002 + SPHERE CENTER -0.380859 -0.140792 0.488775 RAD 0.00617284 + txt002 + SPHERE CENTER -0.248762 -0.0483751 0.655442 RAD 0.0555556 + txt002 + SPHERE CENTER -0.183785 -0.0599222 0.689081 RAD 0.0185185 + txt002 + SPHERE CENTER -0.160406 -0.0522053 0.690965 RAD 0.00617284 + txt002 + SPHERE CENTER -0.171954 -0.0513956 0.669156 RAD 0.00617284 + txt002 + SPHERE CENTER -0.178533 -0.0358698 0.687193 RAD 0.00617284 + txt002 + SPHERE CENTER -0.172236 -0.0607319 0.71089 RAD 0.00617284 + txt002 + SPHERE CENTER -0.190363 -0.0443964 0.707118 RAD 0.00617284 + txt002 + SPHERE CENTER -0.195615 -0.0684488 0.709006 RAD 0.00617284 + txt002 + SPHERE CENTER -0.165658 -0.0762577 0.692853 RAD 0.00617284 + txt002 + SPHERE CENTER -0.189036 -0.0839747 0.690969 RAD 0.00617284 + txt002 + SPHERE CENTER -0.177206 -0.075448 0.671044 RAD 0.00617284 + txt002 + SPHERE CENTER -0.187119 -0.0172857 0.6286 RAD 0.0185185 + txt002 + SPHERE CENTER -0.176731 -0.00705049 0.608675 RAD 0.00617284 + txt002 + SPHERE CENTER -0.192673 -0.025725 0.60607 RAD 0.00617284 + txt002 + SPHERE CENTER -0.200733 -0.00352517 0.613272 RAD 0.00617284 + txt002 + SPHERE CENTER -0.171177 0.00138875 0.631205 RAD 0.00617284 + txt002 + SPHERE CENTER -0.195179 0.00491406 0.635801 RAD 0.00617284 + txt002 + SPHERE CENTER -0.181564 -0.00884647 0.65113 RAD 0.00617284 + txt002 + SPHERE CENTER -0.163117 -0.020811 0.624003 RAD 0.00617284 + txt002 + SPHERE CENTER -0.173504 -0.0310463 0.643928 RAD 0.00617284 + txt002 + SPHERE CENTER -0.179058 -0.0394855 0.621398 RAD 0.00617284 + txt002 + SPHERE CENTER -0.215921 0.00673113 0.692479 RAD 0.0185185 + txt002 + SPHERE CENTER -0.20044 0.0258737 0.690591 RAD 0.00617284 + txt002 + SPHERE CENTER -0.196602 0.00551963 0.677151 RAD 0.00617284 + txt002 + SPHERE CENTER -0.215612 0.0203763 0.671903 RAD 0.00617284 + txt002 + SPHERE CENTER -0.21976 0.0270852 0.705919 RAD 0.00617284 + txt002 + SPHERE CENTER -0.234932 0.0215878 0.687231 RAD 0.00617284 + txt002 + SPHERE CENTER -0.235241 0.00794264 0.707807 RAD 0.00617284 + txt002 + SPHERE CENTER -0.200749 0.0122285 0.711167 RAD 0.00617284 + txt002 + SPHERE CENTER -0.21623 -0.00691403 0.713055 RAD 0.00617284 + txt002 + SPHERE CENTER -0.196911 -0.00812553 0.697727 RAD 0.00617284 + txt002 + SPHERE CENTER -0.245428 -0.0910116 0.715923 RAD 0.0185185 + txt002 + SPHERE CENTER -0.234308 -0.0942304 0.737733 RAD 0.00617284 + txt002 + SPHERE CENTER -0.221514 -0.0854464 0.718528 RAD 0.00617284 + txt002 + SPHERE CENTER -0.238704 -0.0714204 0.729364 RAD 0.00617284 + txt002 + SPHERE CENTER -0.258223 -0.0997955 0.735128 RAD 0.00617284 + txt002 + SPHERE CENTER -0.262619 -0.0769856 0.726759 RAD 0.00617284 + txt002 + SPHERE CENTER -0.269343 -0.0965768 0.713318 RAD 0.00617284 + txt002 + SPHERE CENTER -0.241032 -0.113822 0.724292 RAD 0.00617284 + txt002 + SPHERE CENTER -0.252152 -0.110603 0.702483 RAD 0.00617284 + txt002 + SPHERE CENTER -0.228237 -0.105038 0.705088 RAD 0.00617284 + txt002 + SPHERE CENTER -0.277564 -0.0243582 0.719322 RAD 0.0185185 + txt002 + SPHERE CENTER -0.275459 -0.0076281 0.737359 RAD 0.00617284 + txt002 + SPHERE CENTER -0.255218 -0.0167139 0.726523 RAD 0.00617284 + txt002 + SPHERE CENTER -0.270078 -0.00142185 0.714074 RAD 0.00617284 + txt002 + SPHERE CENTER -0.297806 -0.0152725 0.730157 RAD 0.00617284 + txt002 + SPHERE CENTER -0.292425 -0.00906621 0.706872 RAD 0.00617284 + txt002 + SPHERE CENTER -0.299911 -0.0320026 0.71212 RAD 0.00617284 + txt002 + SPHERE CENTER -0.282946 -0.0305645 0.742607 RAD 0.00617284 + txt002 + SPHERE CENTER -0.285051 -0.0472946 0.72457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.262704 -0.0396503 0.731771 RAD 0.00617284 + txt002 + SPHERE CENTER -0.310405 -0.0794645 0.682285 RAD 0.0185185 + txt002 + SPHERE CENTER -0.324811 -0.0817333 0.702209 RAD 0.00617284 + txt002 + SPHERE CENTER -0.300317 -0.0800146 0.704814 RAD 0.00617284 + txt002 + SPHERE CENTER -0.313378 -0.0603366 0.697613 RAD 0.00617284 + txt002 + SPHERE CENTER -0.334899 -0.0811832 0.67968 RAD 0.00617284 + txt002 + SPHERE CENTER -0.323466 -0.0597864 0.675083 RAD 0.00617284 + txt002 + SPHERE CENTER -0.320493 -0.0789143 0.659755 RAD 0.00617284 + txt002 + SPHERE CENTER -0.321838 -0.100861 0.686881 RAD 0.00617284 + txt002 + SPHERE CENTER -0.307433 -0.0985923 0.666956 RAD 0.00617284 + txt002 + SPHERE CENTER -0.297345 -0.0991425 0.689486 RAD 0.00617284 + txt002 + SPHERE CENTER -0.216626 -0.115028 0.652044 RAD 0.0185185 + txt002 + SPHERE CENTER -0.195663 -0.127519 0.655816 RAD 0.00617284 + txt002 + SPHERE CENTER -0.194866 -0.104303 0.647447 RAD 0.00617284 + txt002 + SPHERE CENTER -0.201738 -0.108803 0.670732 RAD 0.00617284 + txt002 + SPHERE CENTER -0.217423 -0.138245 0.660413 RAD 0.00617284 + txt002 + SPHERE CENTER -0.223497 -0.119529 0.675329 RAD 0.00617284 + txt002 + SPHERE CENTER -0.238386 -0.125754 0.656641 RAD 0.00617284 + txt002 + SPHERE CENTER -0.210551 -0.133744 0.637128 RAD 0.00617284 + txt002 + SPHERE CENTER -0.231514 -0.121254 0.633356 RAD 0.00617284 + txt002 + SPHERE CENTER -0.209754 -0.110528 0.628759 RAD 0.00617284 + txt002 + SPHERE CENTER -0.281603 -0.103481 0.618405 RAD 0.0185185 + txt002 + SPHERE CENTER -0.291073 -0.126206 0.620293 RAD 0.00617284 + txt002 + SPHERE CENTER -0.271345 -0.119897 0.633733 RAD 0.00617284 + txt002 + SPHERE CENTER -0.293457 -0.110246 0.638981 RAD 0.00617284 + txt002 + SPHERE CENTER -0.301332 -0.10979 0.604965 RAD 0.00617284 + txt002 + SPHERE CENTER -0.303716 -0.0938302 0.623653 RAD 0.00617284 + txt002 + SPHERE CENTER -0.291862 -0.0870656 0.603077 RAD 0.00617284 + txt002 + SPHERE CENTER -0.279219 -0.119442 0.599717 RAD 0.00617284 + txt002 + SPHERE CENTER -0.269749 -0.0967168 0.597829 RAD 0.00617284 + txt002 + SPHERE CENTER -0.25949 -0.113132 0.613157 RAD 0.00617284 + txt002 + SPHERE CENTER -0.21996 -0.0723919 0.591563 RAD 0.0185185 + txt002 + SPHERE CENTER -0.20388 -0.0673141 0.573526 RAD 0.00617284 + txt002 + SPHERE CENTER -0.216456 -0.0490355 0.584361 RAD 0.00617284 + txt002 + SPHERE CENTER -0.198742 -0.0609052 0.596811 RAD 0.00617284 + txt002 + SPHERE CENTER -0.207384 -0.0906706 0.580727 RAD 0.00617284 + txt002 + SPHERE CENTER -0.202246 -0.0842617 0.604012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.223463 -0.0957484 0.598764 RAD 0.00617284 + txt002 + SPHERE CENTER -0.225098 -0.0788008 0.568278 RAD 0.00617284 + txt002 + SPHERE CENTER -0.241177 -0.0838786 0.586315 RAD 0.00617284 + txt002 + SPHERE CENTER -0.237674 -0.0605222 0.579113 RAD 0.00617284 + txt002 + SPHERE CENTER -0.471405 0.471405 1.11022e-16 RAD 0.166667 + txt002 + SPHERE CENTER -0.508983 0.690426 8.51251e-17 RAD 0.0555556 + txt002 + SPHERE CENTER -0.484794 0.755941 -0.0246914 RAD 0.0185185 + txt002 + SPHERE CENTER -0.47411 0.767658 -0.0436186 RAD 0.00617284 + txt002 + SPHERE CENTER -0.467528 0.744501 -0.0381316 RAD 0.00617284 + txt002 + SPHERE CENTER -0.489758 0.749038 -0.0478724 RAD 0.00617284 + txt002 + SPHERE CENTER -0.491377 0.779098 -0.0301783 RAD 0.00617284 + txt002 + SPHERE CENTER -0.507025 0.760478 -0.0344321 RAD 0.00617284 + txt002 + SPHERE CENTER -0.502061 0.767382 -0.0112511 RAD 0.00617284 + txt002 + SPHERE CENTER -0.469146 0.774562 -0.0204376 RAD 0.00617284 + txt002 + SPHERE CENTER -0.47983 0.762845 -0.00151032 RAD 0.00617284 + txt002 + SPHERE CENTER -0.462564 0.751405 -0.0149506 RAD 0.00617284 + txt002 + SPHERE CENTER -0.436283 0.7029 -0.00679642 RAD 0.0185185 + txt002 + SPHERE CENTER -0.418941 0.714226 -0.0202367 RAD 0.00617284 + txt002 + SPHERE CENTER -0.43889 0.704751 -0.0312799 RAD 0.00617284 + txt002 + SPHERE CENTER -0.44101 0.724842 -0.0170845 RAD 0.00617284 + txt002 + SPHERE CENTER -0.416335 0.712374 0.0042468 RAD 0.00617284 + txt002 + SPHERE CENTER -0.438403 0.722991 0.00739901 RAD 0.00617284 + txt002 + SPHERE CENTER -0.433677 0.701048 0.0176871 RAD 0.00617284 + txt002 + SPHERE CENTER -0.414215 0.692283 -0.00994863 RAD 0.00617284 + txt002 + SPHERE CENTER -0.431557 0.680957 0.00349164 RAD 0.00617284 + txt002 + SPHERE CENTER -0.434163 0.682808 -0.0209919 RAD 0.00617284 + txt002 + SPHERE CENTER -0.478434 0.695668 -0.0672777 RAD 0.0185185 + txt002 + SPHERE CENTER -0.481931 0.703418 -0.0904587 RAD 0.00617284 + txt002 + SPHERE CENTER -0.500827 0.694124 -0.0775657 RAD 0.00617284 + txt002 + SPHERE CENTER -0.491475 0.716184 -0.0716007 RAD 0.00617284 + txt002 + SPHERE CENTER -0.459538 0.704962 -0.0801706 RAD 0.00617284 + txt002 + SPHERE CENTER -0.469082 0.717727 -0.0613127 RAD 0.00617284 + txt002 + SPHERE CENTER -0.456041 0.697211 -0.0569896 RAD 0.00617284 + txt002 + SPHERE CENTER -0.46889 0.682902 -0.0861356 RAD 0.00617284 + txt002 + SPHERE CENTER -0.465393 0.675152 -0.0629546 RAD 0.00617284 + txt002 + SPHERE CENTER -0.487786 0.673608 -0.0732426 RAD 0.00617284 + txt002 + SPHERE CENTER -0.557494 0.743468 -0.0178949 RAD 0.0185185 + txt002 + SPHERE CENTER -0.560084 0.767402 -0.0233819 RAD 0.00617284 + txt002 + SPHERE CENTER -0.543179 0.760285 -0.00685171 RAD 0.00617284 + txt002 + SPHERE CENTER -0.53997 0.755145 -0.0307879 RAD 0.00617284 + txt002 + SPHERE CENTER -0.574398 0.750585 -0.0344251 RAD 0.00617284 + txt002 + SPHERE CENTER -0.554284 0.738328 -0.0418311 RAD 0.00617284 + txt002 + SPHERE CENTER -0.571808 0.726651 -0.0289382 RAD 0.00617284 + txt002 + SPHERE CENTER -0.577608 0.755725 -0.0104889 RAD 0.00617284 + txt002 + SPHERE CENTER -0.575017 0.731791 -0.00500196 RAD 0.00617284 + txt002 + SPHERE CENTER -0.560703 0.748608 0.00604126 RAD 0.00617284 + txt002 + SPHERE CENTER -0.551134 0.683194 -0.0604812 RAD 0.0185185 + txt002 + SPHERE CENTER -0.573364 0.687731 -0.070222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.571303 0.682033 -0.0462858 RAD 0.00617284 + txt002 + SPHERE CENTER -0.56324 0.703871 -0.0545162 RAD 0.00617284 + txt002 + SPHERE CENTER -0.553195 0.688893 -0.0844174 RAD 0.00617284 + txt002 + SPHERE CENTER -0.543071 0.705033 -0.0687117 RAD 0.00617284 + txt002 + SPHERE CENTER -0.530964 0.684356 -0.0746767 RAD 0.00617284 + txt002 + SPHERE CENTER -0.561258 0.667055 -0.076187 RAD 0.00617284 + txt002 + SPHERE CENTER -0.539027 0.662518 -0.0664462 RAD 0.00617284 + txt002 + SPHERE CENTER -0.559196 0.661356 -0.0522508 RAD 0.00617284 + txt002 + SPHERE CENTER -0.581682 0.677953 0.00679642 RAD 0.0185185 + txt002 + SPHERE CENTER -0.601808 0.682851 0.0202367 RAD 0.00617284 + txt002 + SPHERE CENTER -0.579842 0.680568 0.0312799 RAD 0.00617284 + txt002 + SPHERE CENTER -0.58454 0.700216 0.0170845 RAD 0.00617284 + txt002 + SPHERE CENTER -0.603648 0.680237 -0.0042468 RAD 0.00617284 + txt002 + SPHERE CENTER -0.58638 0.697602 -0.00739901 RAD 0.00617284 + txt002 + SPHERE CENTER -0.583522 0.675339 -0.0176871 RAD 0.00617284 + txt002 + SPHERE CENTER -0.59895 0.660588 0.00994863 RAD 0.00617284 + txt002 + SPHERE CENTER -0.578824 0.65569 -0.00349164 RAD 0.00617284 + txt002 + SPHERE CENTER -0.576984 0.658304 0.0209919 RAD 0.00617284 + txt002 + SPHERE CENTER -0.515343 0.7507 0.0425863 RAD 0.0185185 + txt002 + SPHERE CENTER -0.506594 0.773394 0.0468401 RAD 0.00617284 + txt002 + SPHERE CENTER -0.491321 0.755462 0.0394341 RAD 0.00617284 + txt002 + SPHERE CENTER -0.507924 0.764807 0.0237283 RAD 0.00617284 + txt002 + SPHERE CENTER -0.530616 0.768632 0.0499923 RAD 0.00617284 + txt002 + SPHERE CENTER -0.531946 0.760045 0.0268805 RAD 0.00617284 + txt002 + SPHERE CENTER -0.539365 0.745938 0.0457385 RAD 0.00617284 + txt002 + SPHERE CENTER -0.514012 0.759287 0.065698 RAD 0.00617284 + txt002 + SPHERE CENTER -0.522762 0.736593 0.0614442 RAD 0.00617284 + txt002 + SPHERE CENTER -0.49874 0.741355 0.058292 RAD 0.00617284 + txt002 + SPHERE CENTER -0.539531 0.685185 0.0672777 RAD 0.0185185 + txt002 + SPHERE CENTER -0.538818 0.693658 0.0904587 RAD 0.00617284 + txt002 + SPHERE CENTER -0.517905 0.691194 0.0775657 RAD 0.00617284 + txt002 + SPHERE CENTER -0.534075 0.708875 0.0716007 RAD 0.00617284 + txt002 + SPHERE CENTER -0.560445 0.687649 0.0801706 RAD 0.00617284 + txt002 + SPHERE CENTER -0.555702 0.702866 0.0613127 RAD 0.00617284 + txt002 + SPHERE CENTER -0.561158 0.679176 0.0569896 RAD 0.00617284 + txt002 + SPHERE CENTER -0.544274 0.669969 0.0861356 RAD 0.00617284 + txt002 + SPHERE CENTER -0.544988 0.661495 0.0629546 RAD 0.00617284 + txt002 + SPHERE CENTER -0.523361 0.667505 0.0732426 RAD 0.00617284 + txt002 + SPHERE CENTER -0.466832 0.697658 0.0604812 RAD 0.0185185 + txt002 + SPHERE CENTER -0.447385 0.709346 0.070222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.447429 0.703286 0.0462858 RAD 0.00617284 + txt002 + SPHERE CENTER -0.46231 0.721188 0.0545162 RAD 0.00617284 + txt002 + SPHERE CENTER -0.466788 0.703718 0.0844174 RAD 0.00617284 + txt002 + SPHERE CENTER -0.481713 0.71556 0.0687117 RAD 0.00617284 + txt002 + SPHERE CENTER -0.486235 0.692031 0.0746767 RAD 0.00617284 + txt002 + SPHERE CENTER -0.451907 0.685816 0.076187 RAD 0.00617284 + txt002 + SPHERE CENTER -0.471354 0.674129 0.0664462 RAD 0.00617284 + txt002 + SPHERE CENTER -0.451951 0.679757 0.0522508 RAD 0.00617284 + txt002 + SPHERE CENTER -0.335322 0.607487 0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER -0.283164 0.659645 0.104315 RAD 0.0185185 + txt002 + SPHERE CENTER -0.269894 0.672915 0.0882695 RAD 0.00617284 + txt002 + SPHERE CENTER -0.275822 0.649528 0.0830215 RAD 0.00617284 + txt002 + SPHERE CENTER -0.293281 0.666987 0.0830215 RAD 0.00617284 + txt002 + SPHERE CENTER -0.277236 0.683032 0.109563 RAD 0.00617284 + txt002 + SPHERE CENTER -0.300624 0.677104 0.104315 RAD 0.00617284 + txt002 + SPHERE CENTER -0.290507 0.669762 0.125608 RAD 0.00617284 + txt002 + SPHERE CENTER -0.259777 0.665573 0.109563 RAD 0.00617284 + txt002 + SPHERE CENTER -0.273047 0.652302 0.125608 RAD 0.00617284 + txt002 + SPHERE CENTER -0.265705 0.642185 0.104315 RAD 0.00617284 + txt002 + SPHERE CENTER -0.286452 0.603979 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.279361 0.614273 0.0342624 RAD 0.00617284 + txt002 + SPHERE CENTER -0.303327 0.613293 0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.288206 0.628413 0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER -0.262487 0.604959 0.0496945 RAD 0.00617284 + txt002 + SPHERE CENTER -0.271332 0.619099 0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.269578 0.594664 0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.277607 0.589839 0.0373488 RAD 0.00617284 + txt002 + SPHERE CENTER -0.284698 0.579544 0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER -0.301572 0.588858 0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.33883 0.656357 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.328536 0.663448 0.0342624 RAD 0.00617284 + txt002 + SPHERE CENTER -0.314396 0.654603 0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER -0.329516 0.639482 0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.35297 0.665202 0.0373488 RAD 0.00617284 + txt002 + SPHERE CENTER -0.353951 0.641237 0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.363265 0.658111 0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER -0.33785 0.680322 0.0496945 RAD 0.00617284 + txt002 + SPHERE CENTER -0.348145 0.673232 0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.32371 0.671477 0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.332034 0.663153 0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER -0.321274 0.684748 0.165118 RAD 0.00617284 + txt002 + SPHERE CENTER -0.308341 0.666888 0.154009 RAD 0.00617284 + txt002 + SPHERE CENTER -0.326131 0.678752 0.141664 RAD 0.00617284 + txt002 + SPHERE CENTER -0.344967 0.681014 0.170979 RAD 0.00617284 + txt002 + SPHERE CENTER -0.349824 0.675018 0.147525 RAD 0.00617284 + txt002 + SPHERE CENTER -0.355727 0.659419 0.165731 RAD 0.00617284 + txt002 + SPHERE CENTER -0.327177 0.669149 0.183325 RAD 0.00617284 + txt002 + SPHERE CENTER -0.337937 0.647554 0.178077 RAD 0.00617284 + txt002 + SPHERE CENTER -0.314244 0.651289 0.172216 RAD 0.00617284 + txt002 + SPHERE CENTER -0.3877 0.659866 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.391875 0.684201 0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER -0.37258 0.674986 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.37258 0.674986 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.406996 0.669081 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.3877 0.659866 0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER -0.40282 0.644745 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.406996 0.669081 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.40282 0.644745 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.3877 0.659866 0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER -0.384191 0.610996 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.389739 0.622198 0.18796 RAD 0.00617284 + txt002 + SPHERE CENTER -0.366159 0.617804 0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.378964 0.63493 0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER -0.407771 0.61539 0.172528 RAD 0.00617284 + txt002 + SPHERE CENTER -0.396997 0.628121 0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER -0.402224 0.604188 0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.394966 0.598265 0.184873 RAD 0.00617284 + txt002 + SPHERE CENTER -0.389418 0.587062 0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.371386 0.593871 0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.279656 0.610775 0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER -0.258061 0.621535 0.165118 RAD 0.00617284 + txt002 + SPHERE CENTER -0.264057 0.616678 0.141664 RAD 0.00617284 + txt002 + SPHERE CENTER -0.275921 0.634468 0.154009 RAD 0.00617284 + txt002 + SPHERE CENTER -0.27366 0.615632 0.183325 RAD 0.00617284 + txt002 + SPHERE CENTER -0.29152 0.628565 0.172216 RAD 0.00617284 + txt002 + SPHERE CENTER -0.295255 0.604872 0.178077 RAD 0.00617284 + txt002 + SPHERE CENTER -0.261795 0.597842 0.170979 RAD 0.00617284 + txt002 + SPHERE CENTER -0.28339 0.587082 0.165731 RAD 0.00617284 + txt002 + SPHERE CENTER -0.267791 0.592985 0.147525 RAD 0.00617284 + txt002 + SPHERE CENTER -0.331813 0.558618 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.320611 0.55307 0.18796 RAD 0.00617284 + txt002 + SPHERE CENTER -0.30788 0.563845 0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER -0.325005 0.57665 0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.344544 0.547843 0.184873 RAD 0.00617284 + txt002 + SPHERE CENTER -0.348938 0.571423 0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.355747 0.553391 0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.327419 0.535038 0.172528 RAD 0.00617284 + txt002 + SPHERE CENTER -0.338621 0.540585 0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.314688 0.545813 0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER -0.282943 0.555109 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.258608 0.550934 0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER -0.267823 0.570229 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.267823 0.570229 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.273728 0.535813 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.282943 0.555109 0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER -0.298064 0.539989 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.273728 0.535813 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.298064 0.539989 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.282943 0.555109 0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER -0.335322 0.607487 -0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER -0.313405 0.629404 -0.178389 RAD 0.0185185 + txt002 + SPHERE CENTER -0.316595 0.626214 -0.202664 RAD 0.00617284 + txt002 + SPHERE CENTER -0.318408 0.606941 -0.187336 RAD 0.00617284 + txt002 + SPHERE CENTER -0.335868 0.624401 -0.187336 RAD 0.00617284 + txt002 + SPHERE CENTER -0.311592 0.648676 -0.193717 RAD 0.00617284 + txt002 + SPHERE CENTER -0.330864 0.646863 -0.178389 RAD 0.00617284 + txt002 + SPHERE CENTER -0.308402 0.651867 -0.169441 RAD 0.00617284 + txt002 + SPHERE CENTER -0.294133 0.631217 -0.193717 RAD 0.00617284 + txt002 + SPHERE CENTER -0.290942 0.634407 -0.169441 RAD 0.00617284 + txt002 + SPHERE CENTER -0.295946 0.611945 -0.178389 RAD 0.00617284 + txt002 + SPHERE CENTER -0.331813 0.558618 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.319608 0.539107 -0.175614 RAD 0.00617284 + txt002 + SPHERE CENTER -0.307378 0.556863 -0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.322499 0.541743 -0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.344043 0.540862 -0.178701 RAD 0.00617284 + txt002 + SPHERE CENTER -0.346933 0.543497 -0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER -0.356248 0.560372 -0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER -0.328923 0.555982 -0.191046 RAD 0.00617284 + txt002 + SPHERE CENTER -0.341128 0.575492 -0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.316693 0.573738 -0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.384191 0.610996 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.403702 0.623201 -0.175614 RAD 0.00617284 + txt002 + SPHERE CENTER -0.401066 0.62031 -0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.385946 0.635431 -0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.386827 0.613886 -0.191046 RAD 0.00617284 + txt002 + SPHERE CENTER -0.369071 0.626116 -0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.367317 0.601681 -0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.401947 0.598766 -0.178701 RAD 0.00617284 + txt002 + SPHERE CENTER -0.382437 0.586561 -0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER -0.399312 0.595876 -0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER -0.316914 0.678274 -0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER -0.305407 0.69384 -0.138161 RAD 0.00617284 + txt002 + SPHERE CENTER -0.296616 0.671002 -0.134867 RAD 0.00617284 + txt002 + SPHERE CENTER -0.317721 0.674446 -0.147213 RAD 0.00617284 + txt002 + SPHERE CENTER -0.325704 0.701111 -0.126127 RAD 0.00617284 + txt002 + SPHERE CENTER -0.338018 0.681717 -0.135179 RAD 0.00617284 + txt002 + SPHERE CENTER -0.337211 0.685545 -0.110799 RAD 0.00617284 + txt002 + SPHERE CENTER -0.3046 0.697667 -0.113782 RAD 0.00617284 + txt002 + SPHERE CENTER -0.316107 0.682101 -0.0984536 RAD 0.00617284 + txt002 + SPHERE CENTER -0.295809 0.67483 -0.110488 RAD 0.00617284 + txt002 + SPHERE CENTER -0.3877 0.659866 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.391875 0.684201 -0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER -0.37258 0.674986 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.37258 0.674986 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.406996 0.669081 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.3877 0.659866 -0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER -0.40282 0.644745 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.406996 0.669081 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.40282 0.644745 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.3877 0.659866 -0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER -0.33883 0.656357 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.329538 0.677411 -0.0466081 RAD 0.00617284 + txt002 + SPHERE CENTER -0.314897 0.661584 -0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER -0.332022 0.674389 -0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.353472 0.672184 -0.0435217 RAD 0.00617284 + txt002 + SPHERE CENTER -0.355956 0.669162 -0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.362764 0.65113 -0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER -0.336346 0.659378 -0.031176 RAD 0.00617284 + txt002 + SPHERE CENTER -0.345639 0.638325 -0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.321705 0.643552 -0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.264535 0.625895 -0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER -0.248969 0.637402 -0.138161 RAD 0.00617284 + txt002 + SPHERE CENTER -0.268363 0.625088 -0.147213 RAD 0.00617284 + txt002 + SPHERE CENTER -0.271807 0.646193 -0.134867 RAD 0.00617284 + txt002 + SPHERE CENTER -0.245142 0.638209 -0.113782 RAD 0.00617284 + txt002 + SPHERE CENTER -0.267979 0.647 -0.110488 RAD 0.00617284 + txt002 + SPHERE CENTER -0.260708 0.626702 -0.0984536 RAD 0.00617284 + txt002 + SPHERE CENTER -0.241698 0.617105 -0.126127 RAD 0.00617284 + txt002 + SPHERE CENTER -0.257264 0.605598 -0.110799 RAD 0.00617284 + txt002 + SPHERE CENTER -0.261092 0.604791 -0.135179 RAD 0.00617284 + txt002 + SPHERE CENTER -0.286452 0.603979 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.265398 0.613271 -0.0466081 RAD 0.00617284 + txt002 + SPHERE CENTER -0.26842 0.610787 -0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.281225 0.627912 -0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER -0.283431 0.606463 -0.031176 RAD 0.00617284 + txt002 + SPHERE CENTER -0.299257 0.621104 -0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.304484 0.59717 -0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.270625 0.589337 -0.0435217 RAD 0.00617284 + txt002 + SPHERE CENTER -0.291679 0.580045 -0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER -0.273647 0.586853 -0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.282943 0.555109 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.258608 0.550934 -0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER -0.267823 0.570229 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.267823 0.570229 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.273728 0.535813 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.282943 0.555109 -0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER -0.298064 0.539989 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.273728 0.535813 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.298064 0.539989 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.282943 0.555109 -0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER -0.645066 0.554344 -0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER -0.681385 0.616373 -0.129006 RAD 0.0185185 + txt002 + SPHERE CENTER -0.678928 0.639472 -0.137375 RAD 0.00617284 + txt002 + SPHERE CENTER -0.661636 0.629767 -0.122663 RAD 0.00617284 + txt002 + SPHERE CENTER -0.664108 0.621631 -0.145845 RAD 0.00617284 + txt002 + SPHERE CENTER -0.698678 0.626079 -0.143718 RAD 0.00617284 + txt002 + SPHERE CENTER -0.683858 0.608237 -0.152187 RAD 0.00617284 + txt002 + SPHERE CENTER -0.701135 0.602979 -0.135349 RAD 0.00617284 + txt002 + SPHERE CENTER -0.696205 0.634214 -0.120537 RAD 0.00617284 + txt002 + SPHERE CENTER -0.698662 0.611115 -0.112168 RAD 0.00617284 + txt002 + SPHERE CENTER -0.678912 0.624508 -0.105825 RAD 0.00617284 + txt002 + SPHERE CENTER -0.649723 0.609912 -0.062352 RAD 0.0185185 + txt002 + SPHERE CENTER -0.640648 0.631982 -0.0560094 RAD 0.00617284 + txt002 + SPHERE CENTER -0.625749 0.614812 -0.0656463 RAD 0.00617284 + txt002 + SPHERE CENTER -0.64267 0.62585 -0.0798417 RAD 0.00617284 + txt002 + SPHERE CENTER -0.664623 0.627081 -0.0527151 RAD 0.00617284 + txt002 + SPHERE CENTER -0.666645 0.620949 -0.0765474 RAD 0.00617284 + txt002 + SPHERE CENTER -0.673698 0.605012 -0.0590577 RAD 0.00617284 + txt002 + SPHERE CENTER -0.647702 0.616044 -0.0385197 RAD 0.00617284 + txt002 + SPHERE CENTER -0.656777 0.593974 -0.0448623 RAD 0.00617284 + txt002 + SPHERE CENTER -0.632802 0.598874 -0.0481565 RAD 0.00617284 + txt002 + SPHERE CENTER -0.607573 0.617144 -0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER -0.595495 0.63057 -0.139672 RAD 0.00617284 + txt002 + SPHERE CENTER -0.594239 0.605919 -0.140323 RAD 0.00617284 + txt002 + SPHERE CENTER -0.615286 0.617371 -0.146288 RAD 0.00617284 + txt002 + SPHERE CENTER -0.608828 0.641795 -0.122182 RAD 0.00617284 + txt002 + SPHERE CENTER -0.628619 0.628595 -0.128798 RAD 0.00617284 + txt002 + SPHERE CENTER -0.620906 0.628369 -0.105343 RAD 0.00617284 + txt002 + SPHERE CENTER -0.587782 0.630343 -0.116217 RAD 0.00617284 + txt002 + SPHERE CENTER -0.59986 0.616917 -0.0993785 RAD 0.00617284 + txt002 + SPHERE CENTER -0.586526 0.605692 -0.116868 RAD 0.00617284 + txt002 + SPHERE CENTER -0.676727 0.560805 -0.177765 RAD 0.0185185 + txt002 + SPHERE CENTER -0.689897 0.57563 -0.192477 RAD 0.00617284 + txt002 + SPHERE CENTER -0.693998 0.575587 -0.168128 RAD 0.00617284 + txt002 + SPHERE CENTER -0.673115 0.585222 -0.177114 RAD 0.00617284 + txt002 + SPHERE CENTER -0.672626 0.560848 -0.202114 RAD 0.00617284 + txt002 + SPHERE CENTER -0.655844 0.57044 -0.186751 RAD 0.00617284 + txt002 + SPHERE CENTER -0.659456 0.546023 -0.187402 RAD 0.00617284 + txt002 + SPHERE CENTER -0.693509 0.551213 -0.193128 RAD 0.00617284 + txt002 + SPHERE CENTER -0.680339 0.536388 -0.178416 RAD 0.00617284 + txt002 + SPHERE CENTER -0.69761 0.55117 -0.16878 RAD 0.00617284 + txt002 + SPHERE CENTER -0.602915 0.561576 -0.171592 RAD 0.0185185 + txt002 + SPHERE CENTER -0.602201 0.570049 -0.194773 RAD 0.00617284 + txt002 + SPHERE CENTER -0.623084 0.560414 -0.185788 RAD 0.00617284 + txt002 + SPHERE CENTER -0.615021 0.582252 -0.177557 RAD 0.00617284 + txt002 + SPHERE CENTER -0.582032 0.571211 -0.180578 RAD 0.00617284 + txt002 + SPHERE CENTER -0.594852 0.583414 -0.163362 RAD 0.00617284 + txt002 + SPHERE CENTER -0.582745 0.562738 -0.157397 RAD 0.00617284 + txt002 + SPHERE CENTER -0.590095 0.549372 -0.188808 RAD 0.00617284 + txt002 + SPHERE CENTER -0.590808 0.540899 -0.165627 RAD 0.00617284 + txt002 + SPHERE CENTER -0.610978 0.539737 -0.179823 RAD 0.00617284 + txt002 + SPHERE CENTER -0.640408 0.498776 -0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER -0.627785 0.478525 -0.166213 RAD 0.00617284 + txt002 + SPHERE CENTER -0.615951 0.497935 -0.156576 RAD 0.00617284 + txt002 + SPHERE CENTER -0.630799 0.484234 -0.142381 RAD 0.00617284 + txt002 + SPHERE CENTER -0.652241 0.479365 -0.169507 RAD 0.00617284 + txt002 + SPHERE CENTER -0.655255 0.485075 -0.145675 RAD 0.00617284 + txt002 + SPHERE CENTER -0.664864 0.499616 -0.163165 RAD 0.00617284 + txt002 + SPHERE CENTER -0.637394 0.493066 -0.183703 RAD 0.00617284 + txt002 + SPHERE CENTER -0.650016 0.513317 -0.17736 RAD 0.00617284 + txt002 + SPHERE CENTER -0.62556 0.512476 -0.174066 RAD 0.00617284 + txt002 + SPHERE CENTER -0.718878 0.553573 -0.117284 RAD 0.0185185 + txt002 + SPHERE CENTER -0.73992 0.563328 -0.108814 RAD 0.00617284 + txt002 + SPHERE CENTER -0.720935 0.559693 -0.0934517 RAD 0.00617284 + txt002 + SPHERE CENTER -0.719679 0.577348 -0.110668 RAD 0.00617284 + txt002 + SPHERE CENTER -0.737863 0.557208 -0.132647 RAD 0.00617284 + txt002 + SPHERE CENTER -0.717623 0.571228 -0.1345 RAD 0.00617284 + txt002 + SPHERE CENTER -0.716821 0.547453 -0.141116 RAD 0.00617284 + txt002 + SPHERE CENTER -0.739118 0.539553 -0.115431 RAD 0.00617284 + txt002 + SPHERE CENTER -0.718076 0.529798 -0.1239 RAD 0.00617284 + txt002 + SPHERE CENTER -0.720133 0.535918 -0.100068 RAD 0.00617284 + txt002 + SPHERE CENTER -0.682558 0.491544 -0.099389 RAD 0.0185185 + txt002 + SPHERE CENTER -0.688647 0.474542 -0.0825505 RAD 0.00617284 + txt002 + SPHERE CENTER -0.666351 0.485132 -0.0818993 RAD 0.00617284 + txt002 + SPHERE CENTER -0.686417 0.498226 -0.0759343 RAD 0.00617284 + txt002 + SPHERE CENTER -0.704854 0.480953 -0.10004 RAD 0.00617284 + txt002 + SPHERE CENTER -0.702624 0.504637 -0.093424 RAD 0.00617284 + txt002 + SPHERE CENTER -0.698765 0.497955 -0.116879 RAD 0.00617284 + txt002 + SPHERE CENTER -0.684788 0.46786 -0.106005 RAD 0.00617284 + txt002 + SPHERE CENTER -0.678699 0.484862 -0.122844 RAD 0.00617284 + txt002 + SPHERE CENTER -0.662492 0.47845 -0.105354 RAD 0.00617284 + txt002 + SPHERE CENTER -0.687216 0.547112 -0.0506299 RAD 0.0185185 + txt002 + SPHERE CENTER -0.690713 0.554862 -0.0274488 RAD 0.00617284 + txt002 + SPHERE CENTER -0.667813 0.552739 -0.0364345 RAD 0.00617284 + txt002 + SPHERE CENTER -0.682694 0.570641 -0.0446649 RAD 0.00617284 + txt002 + SPHERE CENTER -0.710116 0.549235 -0.0416443 RAD 0.00617284 + txt002 + SPHERE CENTER -0.702097 0.565014 -0.0588603 RAD 0.00617284 + txt002 + SPHERE CENTER -0.706619 0.541484 -0.0648253 RAD 0.00617284 + txt002 + SPHERE CENTER -0.695235 0.531333 -0.0334138 RAD 0.00617284 + txt002 + SPHERE CENTER -0.691738 0.523582 -0.0565949 RAD 0.00617284 + txt002 + SPHERE CENTER -0.672335 0.52921 -0.0423994 RAD 0.00617284 + txt002 + SPHERE CENTER -0.471405 0.471405 -0.222222 RAD 0.0555556 + txt002 + SPHERE CENTER -0.501645 0.501645 -0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER -0.499795 0.519956 -0.299164 RAD 0.00617284 + txt002 + SPHERE CENTER -0.493653 0.523893 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER -0.479397 0.509638 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER -0.507788 0.497708 -0.306292 RAD 0.00617284 + txt002 + SPHERE CENTER -0.48739 0.48739 -0.296959 RAD 0.00617284 + txt002 + SPHERE CENTER -0.509638 0.479397 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER -0.522043 0.511963 -0.292037 RAD 0.00617284 + txt002 + SPHERE CENTER -0.523893 0.493653 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER -0.515901 0.515901 -0.268448 RAD 0.00617284 + txt002 + SPHERE CENTER -0.542955 0.490576 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.559233 0.507719 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER -0.539759 0.502501 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.536564 0.514426 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.562428 0.495794 -0.236478 RAD 0.00617284 + txt002 + SPHERE CENTER -0.539759 0.502501 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.54615 0.478651 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.565623 0.483869 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER -0.549345 0.466726 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.54615 0.478651 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.490576 0.542955 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.483869 0.565623 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER -0.466726 0.549345 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.478651 0.54615 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.507719 0.559233 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER -0.502501 0.539759 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.514426 0.536564 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.495794 0.562428 -0.207967 RAD 0.00617284 + txt002 + SPHERE CENTER -0.502501 0.539759 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.478651 0.54615 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.430095 0.482473 -0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER -0.430434 0.489762 -0.306292 RAD 0.00617284 + txt002 + SPHERE CENTER -0.449569 0.477255 -0.296959 RAD 0.00617284 + txt002 + SPHERE CENTER -0.445366 0.500519 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER -0.41096 0.49498 -0.292037 RAD 0.00617284 + txt002 + SPHERE CENTER -0.425893 0.505737 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER -0.410622 0.487691 -0.268448 RAD 0.00617284 + txt002 + SPHERE CENTER -0.415162 0.471716 -0.299164 RAD 0.00617284 + txt002 + SPHERE CENTER -0.414824 0.464428 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER -0.434297 0.45921 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER -0.419026 0.523783 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.404771 0.538038 -0.236478 RAD 0.00617284 + txt002 + SPHERE CENTER -0.410297 0.515053 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.427756 0.532513 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.4135 0.546768 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER -0.436486 0.541242 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.427756 0.532513 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.396041 0.529309 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER -0.410297 0.515053 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.401567 0.506323 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.399854 0.452233 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.377186 0.45894 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER -0.396659 0.464158 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.393464 0.476083 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.380381 0.447015 -0.207967 RAD 0.00617284 + txt002 + SPHERE CENTER -0.396659 0.464158 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.40305 0.440308 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.383576 0.43509 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER -0.406245 0.428383 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.40305 0.440308 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.482473 0.430095 -0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER -0.48121 0.407271 -0.292037 RAD 0.00617284 + txt002 + SPHERE CENTER -0.464428 0.414824 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER -0.487691 0.410622 -0.268448 RAD 0.00617284 + txt002 + SPHERE CENTER -0.499256 0.422542 -0.299164 RAD 0.00617284 + txt002 + SPHERE CENTER -0.505737 0.425893 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER -0.500519 0.445366 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER -0.475992 0.426744 -0.306292 RAD 0.00617284 + txt002 + SPHERE CENTER -0.477255 0.449569 -0.296959 RAD 0.00617284 + txt002 + SPHERE CENTER -0.45921 0.434297 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER -0.452233 0.399854 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.43509 0.383576 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER -0.428383 0.406245 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.440308 0.40305 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.45894 0.377186 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER -0.464158 0.396659 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.476083 0.393464 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.447015 0.380381 -0.236478 RAD 0.00617284 + txt002 + SPHERE CENTER -0.464158 0.396659 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.440308 0.40305 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.523783 0.419026 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.538038 0.404771 -0.207967 RAD 0.00617284 + txt002 + SPHERE CENTER -0.515053 0.410297 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.532513 0.427756 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.546768 0.4135 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER -0.541242 0.436486 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.532513 0.427756 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.529309 0.396041 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER -0.515053 0.410297 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.506323 0.401567 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.607487 0.335322 -0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER -0.659645 0.283164 -0.104315 RAD 0.0185185 + txt002 + SPHERE CENTER -0.672915 0.269894 -0.0882695 RAD 0.00617284 + txt002 + SPHERE CENTER -0.649528 0.275822 -0.0830215 RAD 0.00617284 + txt002 + SPHERE CENTER -0.666987 0.293281 -0.0830215 RAD 0.00617284 + txt002 + SPHERE CENTER -0.683032 0.277236 -0.109563 RAD 0.00617284 + txt002 + SPHERE CENTER -0.677104 0.300624 -0.104315 RAD 0.00617284 + txt002 + SPHERE CENTER -0.669762 0.290507 -0.125608 RAD 0.00617284 + txt002 + SPHERE CENTER -0.665573 0.259777 -0.109563 RAD 0.00617284 + txt002 + SPHERE CENTER -0.652302 0.273047 -0.125608 RAD 0.00617284 + txt002 + SPHERE CENTER -0.642185 0.265705 -0.104315 RAD 0.00617284 + txt002 + SPHERE CENTER -0.603979 0.286452 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.592776 0.280905 -0.0342624 RAD 0.00617284 + txt002 + SPHERE CENTER -0.580045 0.291679 -0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER -0.59717 0.304484 -0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.61671 0.275678 -0.0373488 RAD 0.00617284 + txt002 + SPHERE CENTER -0.621104 0.299257 -0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.627912 0.281225 -0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER -0.599585 0.262872 -0.0496945 RAD 0.00617284 + txt002 + SPHERE CENTER -0.610787 0.26842 -0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.586853 0.273647 -0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.656357 0.33883 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.661904 0.350033 -0.0342624 RAD 0.00617284 + txt002 + SPHERE CENTER -0.638325 0.345639 -0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.65113 0.362764 -0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER -0.679937 0.343224 -0.0496945 RAD 0.00617284 + txt002 + SPHERE CENTER -0.669162 0.355956 -0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.674389 0.332022 -0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.667131 0.326099 -0.0373488 RAD 0.00617284 + txt002 + SPHERE CENTER -0.661584 0.314897 -0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER -0.643552 0.321705 -0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.663153 0.332034 -0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER -0.685865 0.340177 -0.165118 RAD 0.00617284 + txt002 + SPHERE CENTER -0.679339 0.33606 -0.141664 RAD 0.00617284 + txt002 + SPHERE CENTER -0.669651 0.355123 -0.154009 RAD 0.00617284 + txt002 + SPHERE CENTER -0.669679 0.336151 -0.183325 RAD 0.00617284 + txt002 + SPHERE CENTER -0.653465 0.351097 -0.172216 RAD 0.00617284 + txt002 + SPHERE CENTER -0.646968 0.328008 -0.178077 RAD 0.00617284 + txt002 + SPHERE CENTER -0.679367 0.317089 -0.170979 RAD 0.00617284 + txt002 + SPHERE CENTER -0.656656 0.308945 -0.165731 RAD 0.00617284 + txt002 + SPHERE CENTER -0.672841 0.312971 -0.147525 RAD 0.00617284 + txt002 + SPHERE CENTER -0.659866 0.3877 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.664041 0.412036 -0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER -0.644745 0.40282 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.644745 0.40282 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.679161 0.396915 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.659866 0.3877 -0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER -0.674986 0.37258 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.679161 0.396915 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.674986 0.37258 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.659866 0.3877 -0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER -0.610996 0.384191 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.600701 0.391282 -0.18796 RAD 0.00617284 + txt002 + SPHERE CENTER -0.586561 0.382437 -0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER -0.601681 0.367317 -0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.625136 0.393037 -0.184873 RAD 0.00617284 + txt002 + SPHERE CENTER -0.626116 0.369071 -0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.635431 0.385946 -0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.610016 0.408157 -0.172528 RAD 0.00617284 + txt002 + SPHERE CENTER -0.62031 0.401066 -0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.595876 0.399312 -0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER -0.610775 0.279656 -0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER -0.602632 0.256944 -0.165118 RAD 0.00617284 + txt002 + SPHERE CENTER -0.587686 0.273158 -0.154009 RAD 0.00617284 + txt002 + SPHERE CENTER -0.606749 0.26347 -0.141664 RAD 0.00617284 + txt002 + SPHERE CENTER -0.62572 0.263442 -0.170979 RAD 0.00617284 + txt002 + SPHERE CENTER -0.629838 0.269968 -0.147525 RAD 0.00617284 + txt002 + SPHERE CENTER -0.633864 0.286153 -0.165731 RAD 0.00617284 + txt002 + SPHERE CENTER -0.606658 0.27313 -0.183325 RAD 0.00617284 + txt002 + SPHERE CENTER -0.614801 0.295841 -0.178077 RAD 0.00617284 + txt002 + SPHERE CENTER -0.591712 0.289344 -0.172216 RAD 0.00617284 + txt002 + SPHERE CENTER -0.558618 0.331813 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.551527 0.342108 -0.18796 RAD 0.00617284 + txt002 + SPHERE CENTER -0.575492 0.341128 -0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.560372 0.356248 -0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER -0.534652 0.332793 -0.172528 RAD 0.00617284 + txt002 + SPHERE CENTER -0.543497 0.346933 -0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER -0.541743 0.322499 -0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.549772 0.317673 -0.184873 RAD 0.00617284 + txt002 + SPHERE CENTER -0.556863 0.307378 -0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.573738 0.316693 -0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.555109 0.282943 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.530773 0.278768 -0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER -0.539989 0.298064 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.539989 0.298064 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.545894 0.263648 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.555109 0.282943 -0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER -0.570229 0.267823 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.545894 0.263648 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.570229 0.267823 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.555109 0.282943 -0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER -0.645066 0.554344 0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER -0.668521 0.610229 0.153697 RAD 0.0185185 + txt002 + SPHERE CENTER -0.663938 0.633406 0.160875 RAD 0.00617284 + txt002 + SPHERE CENTER -0.64522 0.617928 0.156428 RAD 0.00617284 + txt002 + SPHERE CENTER -0.65892 0.626429 0.137727 RAD 0.00617284 + txt002 + SPHERE CENTER -0.687239 0.625707 0.158144 RAD 0.00617284 + txt002 + SPHERE CENTER -0.682221 0.61873 0.134996 RAD 0.00617284 + txt002 + SPHERE CENTER -0.691822 0.602531 0.150967 RAD 0.00617284 + txt002 + SPHERE CENTER -0.673539 0.617206 0.176845 RAD 0.00617284 + txt002 + SPHERE CENTER -0.678123 0.59403 0.169668 RAD 0.00617284 + txt002 + SPHERE CENTER -0.654822 0.601728 0.172398 RAD 0.00617284 + txt002 + SPHERE CENTER -0.598918 0.585648 0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER -0.580238 0.601562 0.162601 RAD 0.00617284 + txt002 + SPHERE CENTER -0.581665 0.587563 0.142311 RAD 0.00617284 + txt002 + SPHERE CENTER -0.59781 0.605914 0.14581 RAD 0.00617284 + txt002 + SPHERE CENTER -0.597491 0.599646 0.18016 RAD 0.00617284 + txt002 + SPHERE CENTER -0.615063 0.603999 0.163369 RAD 0.00617284 + txt002 + SPHERE CENTER -0.616171 0.583732 0.177429 RAD 0.00617284 + txt002 + SPHERE CENTER -0.581346 0.581295 0.176661 RAD 0.00617284 + txt002 + SPHERE CENTER -0.600026 0.565381 0.173931 RAD 0.00617284 + txt002 + SPHERE CENTER -0.582773 0.567297 0.156372 RAD 0.00617284 + txt002 + SPHERE CENTER -0.619787 0.622977 0.099389 RAD 0.0185185 + txt002 + SPHERE CENTER -0.608008 0.63767 0.0834188 RAD 0.00617284 + txt002 + SPHERE CENTER -0.601637 0.613891 0.0853287 RAD 0.00617284 + txt002 + SPHERE CENTER -0.623239 0.620102 0.0751099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.626157 0.646756 0.0974792 RAD 0.00617284 + txt002 + SPHERE CENTER -0.641389 0.629188 0.0891702 RAD 0.00617284 + txt002 + SPHERE CENTER -0.637936 0.632063 0.113449 RAD 0.00617284 + txt002 + SPHERE CENTER -0.604555 0.640545 0.107698 RAD 0.00617284 + txt002 + SPHERE CENTER -0.616334 0.625852 0.123668 RAD 0.00617284 + txt002 + SPHERE CENTER -0.598184 0.616766 0.109608 RAD 0.00617284 + txt002 + SPHERE CENTER -0.714669 0.578925 0.104938 RAD 0.0185185 + txt002 + SPHERE CENTER -0.729812 0.597914 0.109385 RAD 0.00617284 + txt002 + SPHERE CENTER -0.711617 0.592661 0.125228 RAD 0.00617284 + txt002 + SPHERE CENTER -0.70632 0.602084 0.103028 RAD 0.00617284 + txt002 + SPHERE CENTER -0.732864 0.584178 0.0890951 RAD 0.00617284 + txt002 + SPHERE CENTER -0.709372 0.588348 0.0827387 RAD 0.00617284 + txt002 + SPHERE CENTER -0.71772 0.565189 0.0846485 RAD 0.00617284 + txt002 + SPHERE CENTER -0.738161 0.574755 0.111295 RAD 0.00617284 + txt002 + SPHERE CENTER -0.723017 0.555767 0.106848 RAD 0.00617284 + txt002 + SPHERE CENTER -0.719965 0.569503 0.127138 RAD 0.00617284 + txt002 + SPHERE CENTER -0.665934 0.591673 0.0506299 RAD 0.0185185 + txt002 + SPHERE CENTER -0.658095 0.605761 0.0319289 RAD 0.00617284 + txt002 + SPHERE CENTER -0.647455 0.607672 0.0541285 RAD 0.00617284 + txt002 + SPHERE CENTER -0.643855 0.58746 0.0404111 RAD 0.00617284 + txt002 + SPHERE CENTER -0.676573 0.589763 0.0284303 RAD 0.00617284 + txt002 + SPHERE CENTER -0.662334 0.571461 0.0369125 RAD 0.00617284 + txt002 + SPHERE CENTER -0.684413 0.575674 0.0471312 RAD 0.00617284 + txt002 + SPHERE CENTER -0.680174 0.609975 0.0421477 RAD 0.00617284 + txt002 + SPHERE CENTER -0.688013 0.595887 0.0608487 RAD 0.00617284 + txt002 + SPHERE CENTER -0.669535 0.611885 0.0643473 RAD 0.00617284 + txt002 + SPHERE CENTER -0.691213 0.52304 0.062352 RAD 0.0185185 + txt002 + SPHERE CENTER -0.712906 0.511567 0.0596212 RAD 0.00617284 + txt002 + SPHERE CENTER -0.699372 0.507717 0.079911 RAD 0.00617284 + txt002 + SPHERE CENTER -0.710453 0.529503 0.0764123 RAD 0.00617284 + txt002 + SPHERE CENTER -0.704747 0.526889 0.0420622 RAD 0.00617284 + txt002 + SPHERE CENTER -0.702295 0.544826 0.0588533 RAD 0.00617284 + txt002 + SPHERE CENTER -0.683054 0.538362 0.044793 RAD 0.00617284 + txt002 + SPHERE CENTER -0.693665 0.505104 0.0455609 RAD 0.00617284 + txt002 + SPHERE CENTER -0.671972 0.516576 0.0482916 RAD 0.00617284 + txt002 + SPHERE CENTER -0.680131 0.501254 0.0658506 RAD 0.00617284 + txt002 + SPHERE CENTER -0.6938 0.541596 0.165419 RAD 0.0185185 + txt002 + SPHERE CENTER -0.70016 0.547376 0.188567 RAD 0.00617284 + txt002 + SPHERE CENTER -0.676324 0.546319 0.182211 RAD 0.00617284 + txt002 + SPHERE CENTER -0.690564 0.564621 0.173728 RAD 0.00617284 + txt002 + SPHERE CENTER -0.717636 0.542652 0.171776 RAD 0.00617284 + txt002 + SPHERE CENTER -0.70804 0.559898 0.156937 RAD 0.00617284 + txt002 + SPHERE CENTER -0.711276 0.536873 0.148628 RAD 0.00617284 + txt002 + SPHERE CENTER -0.703396 0.524351 0.180258 RAD 0.00617284 + txt002 + SPHERE CENTER -0.697037 0.518571 0.157111 RAD 0.00617284 + txt002 + SPHERE CENTER -0.679561 0.523294 0.173902 RAD 0.00617284 + txt002 + SPHERE CENTER -0.670344 0.48571 0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER -0.67091 0.466887 0.138803 RAD 0.00617284 + txt002 + SPHERE CENTER -0.650637 0.480853 0.136894 RAD 0.00617284 + txt002 + SPHERE CENTER -0.671107 0.490138 0.147112 RAD 0.00617284 + txt002 + SPHERE CENTER -0.690617 0.471745 0.124743 RAD 0.00617284 + txt002 + SPHERE CENTER -0.690815 0.494995 0.133052 RAD 0.00617284 + txt002 + SPHERE CENTER -0.690052 0.490567 0.108773 RAD 0.00617284 + txt002 + SPHERE CENTER -0.670147 0.46246 0.114524 RAD 0.00617284 + txt002 + SPHERE CENTER -0.669581 0.481283 0.0985541 RAD 0.00617284 + txt002 + SPHERE CENTER -0.649874 0.476425 0.112614 RAD 0.00617284 + txt002 + SPHERE CENTER -0.624197 0.517014 0.171592 RAD 0.0185185 + txt002 + SPHERE CENTER -0.60809 0.516313 0.190293 RAD 0.00617284 + txt002 + SPHERE CENTER -0.60089 0.524375 0.168094 RAD 0.00617284 + txt002 + SPHERE CENTER -0.616221 0.538029 0.181811 RAD 0.00617284 + txt002 + SPHERE CENTER -0.631397 0.508952 0.193792 RAD 0.00617284 + txt002 + SPHERE CENTER -0.639529 0.530668 0.18531 RAD 0.00617284 + txt002 + SPHERE CENTER -0.647504 0.509653 0.175091 RAD 0.00617284 + txt002 + SPHERE CENTER -0.616065 0.495298 0.180075 RAD 0.00617284 + txt002 + SPHERE CENTER -0.632172 0.495999 0.161374 RAD 0.00617284 + txt002 + SPHERE CENTER -0.608865 0.50336 0.157875 RAD 0.00617284 + txt002 + SPHERE CENTER -0.607487 0.335322 0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER -0.629404 0.313405 0.178389 RAD 0.0185185 + txt002 + SPHERE CENTER -0.626214 0.316595 0.202664 RAD 0.00617284 + txt002 + SPHERE CENTER -0.606941 0.318408 0.187336 RAD 0.00617284 + txt002 + SPHERE CENTER -0.624401 0.335868 0.187336 RAD 0.00617284 + txt002 + SPHERE CENTER -0.648676 0.311592 0.193717 RAD 0.00617284 + txt002 + SPHERE CENTER -0.646863 0.330864 0.178389 RAD 0.00617284 + txt002 + SPHERE CENTER -0.651867 0.308402 0.169441 RAD 0.00617284 + txt002 + SPHERE CENTER -0.631217 0.294133 0.193717 RAD 0.00617284 + txt002 + SPHERE CENTER -0.634407 0.290942 0.169441 RAD 0.00617284 + txt002 + SPHERE CENTER -0.611945 0.295946 0.178389 RAD 0.00617284 + txt002 + SPHERE CENTER -0.558618 0.331813 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.537564 0.341105 0.175614 RAD 0.00617284 + txt002 + SPHERE CENTER -0.540585 0.338621 0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.553391 0.355747 0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.555596 0.334297 0.191046 RAD 0.00617284 + txt002 + SPHERE CENTER -0.571423 0.348938 0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.57665 0.325005 0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.542791 0.317172 0.178701 RAD 0.00617284 + txt002 + SPHERE CENTER -0.563845 0.30788 0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER -0.545813 0.314688 0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER -0.610996 0.384191 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.601704 0.405245 0.175614 RAD 0.00617284 + txt002 + SPHERE CENTER -0.587062 0.389418 0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.604188 0.402224 0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.625637 0.400018 0.178701 RAD 0.00617284 + txt002 + SPHERE CENTER -0.628121 0.396997 0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER -0.63493 0.378964 0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER -0.608512 0.387213 0.191046 RAD 0.00617284 + txt002 + SPHERE CENTER -0.617804 0.366159 0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.593871 0.371386 0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.678274 0.316914 0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER -0.697473 0.31938 0.138161 RAD 0.00617284 + txt002 + SPHERE CENTER -0.674538 0.318074 0.147213 RAD 0.00617284 + txt002 + SPHERE CENTER -0.681812 0.338182 0.134867 RAD 0.00617284 + txt002 + SPHERE CENTER -0.701209 0.31822 0.113782 RAD 0.00617284 + txt002 + SPHERE CENTER -0.685547 0.337022 0.110488 RAD 0.00617284 + txt002 + SPHERE CENTER -0.682009 0.315754 0.0984536 RAD 0.00617284 + txt002 + SPHERE CENTER -0.693935 0.298112 0.126127 RAD 0.00617284 + txt002 + SPHERE CENTER -0.674736 0.295646 0.110799 RAD 0.00617284 + txt002 + SPHERE CENTER -0.671 0.296805 0.135179 RAD 0.00617284 + txt002 + SPHERE CENTER -0.659866 0.3877 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.664041 0.412036 0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER -0.644745 0.40282 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.644745 0.40282 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.679161 0.396915 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.659866 0.3877 0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER -0.674986 0.37258 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.679161 0.396915 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.674986 0.37258 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.659866 0.3877 0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER -0.656357 0.33883 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.675867 0.351035 0.0466081 RAD 0.00617284 + txt002 + SPHERE CENTER -0.673232 0.348145 0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.658111 0.363265 0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER -0.658993 0.341721 0.031176 RAD 0.00617284 + txt002 + SPHERE CENTER -0.641237 0.353951 0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.639482 0.329516 0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.674113 0.3266 0.0435217 RAD 0.00617284 + txt002 + SPHERE CENTER -0.654603 0.314396 0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER -0.671477 0.32371 0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.625895 0.264535 0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER -0.623429 0.245336 0.138161 RAD 0.00617284 + txt002 + SPHERE CENTER -0.604627 0.260997 0.134867 RAD 0.00617284 + txt002 + SPHERE CENTER -0.624736 0.268271 0.147213 RAD 0.00617284 + txt002 + SPHERE CENTER -0.644697 0.248874 0.126127 RAD 0.00617284 + txt002 + SPHERE CENTER -0.646004 0.271809 0.135179 RAD 0.00617284 + txt002 + SPHERE CENTER -0.647163 0.268073 0.110799 RAD 0.00617284 + txt002 + SPHERE CENTER -0.624589 0.2416 0.113782 RAD 0.00617284 + txt002 + SPHERE CENTER -0.627055 0.2608 0.0984536 RAD 0.00617284 + txt002 + SPHERE CENTER -0.605787 0.257262 0.110488 RAD 0.00617284 + txt002 + SPHERE CENTER -0.603979 0.286452 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.591774 0.266942 0.0466081 RAD 0.00617284 + txt002 + SPHERE CENTER -0.579544 0.284698 0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER -0.594664 0.269578 0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.616209 0.268696 0.0435217 RAD 0.00617284 + txt002 + SPHERE CENTER -0.619099 0.271332 0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.628413 0.288206 0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER -0.601088 0.283817 0.031176 RAD 0.00617284 + txt002 + SPHERE CENTER -0.613293 0.303327 0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.588858 0.301572 0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.555109 0.282943 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.530773 0.278768 0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER -0.539989 0.298064 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.539989 0.298064 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.545894 0.263648 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.555109 0.282943 0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER -0.570229 0.267823 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.545894 0.263648 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.570229 0.267823 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.555109 0.282943 0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER -0.471405 0.471405 0.222222 RAD 0.0555556 + txt002 + SPHERE CENTER -0.441164 0.501645 0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER -0.424703 0.518106 0.290934 RAD 0.00617284 + txt002 + SPHERE CENTER -0.420089 0.505261 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.437548 0.522721 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.445778 0.51449 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER -0.458623 0.519105 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER -0.462239 0.498029 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER -0.428319 0.497031 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER -0.44478 0.48057 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER -0.423704 0.484186 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER -0.399854 0.490576 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.382226 0.502679 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.399854 0.490576 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER -0.405389 0.511231 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.382226 0.502679 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.405389 0.511231 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.399854 0.490576 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER -0.376691 0.482024 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.39432 0.469922 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.39432 0.469922 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.452233 0.542955 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.44013 0.560583 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.431578 0.53742 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.452233 0.542955 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER -0.460785 0.566118 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.472887 0.548489 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.472887 0.548489 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.44013 0.560583 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.452233 0.542955 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER -0.431578 0.53742 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.512714 0.482473 0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER -0.51514 0.495905 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER -0.492654 0.48988 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER -0.506323 0.506323 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER -0.5352 0.488498 0.290934 RAD 0.00617284 + txt002 + SPHERE CENTER -0.526383 0.498917 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.532774 0.475067 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.521531 0.472055 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER -0.519105 0.458623 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER -0.499045 0.46603 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER -0.523783 0.523783 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.527958 0.548119 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.508662 0.538903 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.508662 0.538903 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.543078 0.532998 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.523783 0.523783 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER -0.538903 0.508662 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.543078 0.532998 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.538903 0.508662 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.523783 0.523783 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER -0.542955 0.452233 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.564273 0.4539 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.542955 0.452233 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER -0.548489 0.472887 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.564273 0.4539 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.548489 0.472887 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.542955 0.452233 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER -0.558738 0.433245 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.53742 0.431578 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.53742 0.431578 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.460336 0.430095 0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER -0.446904 0.427669 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER -0.436486 0.436486 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER -0.45293 0.450155 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER -0.470754 0.421278 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER -0.47678 0.443764 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER -0.484186 0.423704 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER -0.454311 0.407609 0.290934 RAD 0.00617284 + txt002 + SPHERE CENTER -0.467742 0.410035 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.443892 0.416426 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.490576 0.399854 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.488909 0.378536 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.469922 0.39432 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.490576 0.399854 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER -0.509564 0.384071 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.511231 0.405389 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.511231 0.405389 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.488909 0.378536 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.490576 0.399854 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER -0.469922 0.39432 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.419026 0.419026 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.39469 0.414851 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.403906 0.434147 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.403906 0.434147 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.409811 0.399731 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.419026 0.419026 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER -0.434147 0.403906 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.409811 0.399731 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.434147 0.403906 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.419026 0.419026 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER -0.643951 -0.172546 1.11022e-16 RAD 0.166667 + txt002 + SPHERE CENTER -0.835815 -0.157543 0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER -0.871646 -0.122136 0.165419 RAD 0.0185185 + txt002 + SPHERE CENTER -0.871334 -0.102403 0.180258 RAD 0.00617284 + txt002 + SPHERE CENTER -0.850164 -0.113406 0.173902 RAD 0.00617284 + txt002 + SPHERE CENTER -0.862937 -0.100577 0.157111 RAD 0.00617284 + txt002 + SPHERE CENTER -0.892817 -0.111133 0.171776 RAD 0.00617284 + txt002 + SPHERE CENTER -0.884419 -0.109307 0.148628 RAD 0.00617284 + txt002 + SPHERE CENTER -0.893129 -0.130866 0.156937 RAD 0.00617284 + txt002 + SPHERE CENTER -0.880044 -0.123961 0.188567 RAD 0.00617284 + txt002 + SPHERE CENTER -0.880356 -0.143694 0.173728 RAD 0.00617284 + txt002 + SPHERE CENTER -0.858873 -0.134964 0.182211 RAD 0.00617284 + txt002 + SPHERE CENTER -0.799077 -0.135649 0.171592 RAD 0.0185185 + txt002 + SPHERE CENTER -0.781177 -0.120908 0.180075 RAD 0.00617284 + txt002 + SPHERE CENTER -0.778973 -0.13149 0.157875 RAD 0.00617284 + txt002 + SPHERE CENTER -0.795477 -0.113462 0.161374 RAD 0.00617284 + txt002 + SPHERE CENTER -0.801282 -0.125067 0.193792 RAD 0.00617284 + txt002 + SPHERE CENTER -0.815582 -0.11762 0.175091 RAD 0.00617284 + txt002 + SPHERE CENTER -0.819182 -0.139808 0.18531 RAD 0.00617284 + txt002 + SPHERE CENTER -0.784778 -0.143095 0.190293 RAD 0.00617284 + txt002 + SPHERE CENTER -0.802678 -0.157836 0.181811 RAD 0.00617284 + txt002 + SPHERE CENTER -0.782573 -0.153678 0.168094 RAD 0.00617284 + txt002 + SPHERE CENTER -0.82339 -0.0854653 0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER -0.811594 -0.0654286 0.114524 RAD 0.00617284 + txt002 + SPHERE CENTER -0.80102 -0.0876595 0.112614 RAD 0.00617284 + txt002 + SPHERE CENTER -0.820516 -0.0820122 0.0985541 RAD 0.00617284 + txt002 + SPHERE CENTER -0.833964 -0.0632344 0.124743 RAD 0.00617284 + txt002 + SPHERE CENTER -0.842886 -0.079818 0.108773 RAD 0.00617284 + txt002 + SPHERE CENTER -0.845761 -0.083271 0.133052 RAD 0.00617284 + txt002 + SPHERE CENTER -0.814468 -0.0688817 0.138803 RAD 0.00617284 + txt002 + SPHERE CENTER -0.826265 -0.0889183 0.147112 RAD 0.00617284 + txt002 + SPHERE CENTER -0.803895 -0.0911125 0.136894 RAD 0.00617284 + txt002 + SPHERE CENTER -0.908384 -0.14403 0.104938 RAD 0.0185185 + txt002 + SPHERE CENTER -0.926643 -0.128672 0.111295 RAD 0.00617284 + txt002 + SPHERE CENTER -0.90826 -0.133221 0.127138 RAD 0.00617284 + txt002 + SPHERE CENTER -0.904034 -0.1198 0.106848 RAD 0.00617284 + txt002 + SPHERE CENTER -0.926768 -0.139481 0.0890951 RAD 0.00617284 + txt002 + SPHERE CENTER -0.904159 -0.130608 0.0846485 RAD 0.00617284 + txt002 + SPHERE CENTER -0.908508 -0.154838 0.0827387 RAD 0.00617284 + txt002 + SPHERE CENTER -0.930993 -0.152902 0.109385 RAD 0.00617284 + txt002 + SPHERE CENTER -0.912733 -0.16826 0.103028 RAD 0.00617284 + txt002 + SPHERE CENTER -0.912609 -0.157451 0.125228 RAD 0.00617284 + txt002 + SPHERE CENTER -0.860128 -0.107359 0.062352 RAD 0.0185185 + txt002 + SPHERE CENTER -0.853284 -0.0905999 0.0455609 RAD 0.00617284 + txt002 + SPHERE CENTER -0.839638 -0.0940331 0.0658506 RAD 0.00617284 + txt002 + SPHERE CENTER -0.840233 -0.111382 0.0482916 RAD 0.00617284 + txt002 + SPHERE CENTER -0.873773 -0.103926 0.0420622 RAD 0.00617284 + txt002 + SPHERE CENTER -0.860723 -0.124708 0.044793 RAD 0.00617284 + txt002 + SPHERE CENTER -0.880618 -0.120685 0.0588533 RAD 0.00617284 + txt002 + SPHERE CENTER -0.873178 -0.086577 0.0596212 RAD 0.00617284 + txt002 + SPHERE CENTER -0.880022 -0.103336 0.0764123 RAD 0.00617284 + txt002 + SPHERE CENTER -0.859532 -0.0900102 0.079911 RAD 0.00617284 + txt002 + SPHERE CENTER -0.872552 -0.179437 0.0506299 RAD 0.0185185 + txt002 + SPHERE CENTER -0.894035 -0.188167 0.0421477 RAD 0.00617284 + txt002 + SPHERE CENTER -0.885777 -0.195141 0.0643473 RAD 0.00617284 + txt002 + SPHERE CENTER -0.89378 -0.172046 0.0608487 RAD 0.00617284 + txt002 + SPHERE CENTER -0.880811 -0.172463 0.0284303 RAD 0.00617284 + txt002 + SPHERE CENTER -0.880556 -0.156342 0.0471312 RAD 0.00617284 + txt002 + SPHERE CENTER -0.859328 -0.163733 0.0369125 RAD 0.00617284 + txt002 + SPHERE CENTER -0.872807 -0.195558 0.0319289 RAD 0.00617284 + txt002 + SPHERE CENTER -0.851325 -0.186828 0.0404111 RAD 0.00617284 + txt002 + SPHERE CENTER -0.864549 -0.202532 0.0541285 RAD 0.00617284 + txt002 + SPHERE CENTER -0.884071 -0.194213 0.153697 RAD 0.0185185 + txt002 + SPHERE CENTER -0.891905 -0.197746 0.176845 RAD 0.00617284 + txt002 + SPHERE CENTER -0.867957 -0.193701 0.172398 RAD 0.00617284 + txt002 + SPHERE CENTER -0.884286 -0.175383 0.169668 RAD 0.00617284 + txt002 + SPHERE CENTER -0.908019 -0.198259 0.158144 RAD 0.00617284 + txt002 + SPHERE CENTER -0.900401 -0.175896 0.150967 RAD 0.00617284 + txt002 + SPHERE CENTER -0.900186 -0.194726 0.134996 RAD 0.00617284 + txt002 + SPHERE CENTER -0.89169 -0.216576 0.160875 RAD 0.00617284 + txt002 + SPHERE CENTER -0.883856 -0.213043 0.137727 RAD 0.00617284 + txt002 + SPHERE CENTER -0.867741 -0.212531 0.156428 RAD 0.00617284 + txt002 + SPHERE CENTER -0.84824 -0.229621 0.099389 RAD 0.0185185 + txt002 + SPHERE CENTER -0.843832 -0.25245 0.107698 RAD 0.00617284 + txt002 + SPHERE CENTER -0.826426 -0.235043 0.109608 RAD 0.00617284 + txt002 + SPHERE CENTER -0.846687 -0.233837 0.123668 RAD 0.00617284 + txt002 + SPHERE CENTER -0.865646 -0.247028 0.0974792 RAD 0.00617284 + txt002 + SPHERE CENTER -0.868501 -0.228415 0.113449 RAD 0.00617284 + txt002 + SPHERE CENTER -0.870053 -0.224198 0.0891702 RAD 0.00617284 + txt002 + SPHERE CENTER -0.845385 -0.248234 0.0834188 RAD 0.00617284 + txt002 + SPHERE CENTER -0.849792 -0.225404 0.0751099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.827978 -0.230827 0.0853287 RAD 0.00617284 + txt002 + SPHERE CENTER -0.811502 -0.207727 0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER -0.794108 -0.212743 0.176661 RAD 0.00617284 + txt002 + SPHERE CENTER -0.788345 -0.199907 0.156372 RAD 0.00617284 + txt002 + SPHERE CENTER -0.802328 -0.189621 0.173931 RAD 0.00617284 + txt002 + SPHERE CENTER -0.817265 -0.220563 0.18016 RAD 0.00617284 + txt002 + SPHERE CENTER -0.825486 -0.197441 0.177429 RAD 0.00617284 + txt002 + SPHERE CENTER -0.83466 -0.215547 0.163369 RAD 0.00617284 + txt002 + SPHERE CENTER -0.803282 -0.230849 0.162601 RAD 0.00617284 + txt002 + SPHERE CENTER -0.820676 -0.225832 0.14581 RAD 0.00617284 + txt002 + SPHERE CENTER -0.797518 -0.218012 0.142311 RAD 0.00617284 + txt002 + SPHERE CENTER -0.643951 -0.172546 0.222222 RAD 0.0555556 + txt002 + SPHERE CENTER -0.61371 -0.142305 0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER -0.597249 -0.125845 0.290934 RAD 0.00617284 + txt002 + SPHERE CENTER -0.592635 -0.138689 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.610094 -0.12123 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.618324 -0.12946 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER -0.631169 -0.124846 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER -0.634785 -0.145921 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER -0.600865 -0.14692 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER -0.617326 -0.163381 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER -0.596251 -0.159765 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER -0.5724 -0.153374 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.554772 -0.141271 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.5724 -0.153374 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER -0.577935 -0.13272 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.554772 -0.141271 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.577935 -0.13272 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.5724 -0.153374 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER -0.549237 -0.161926 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.566866 -0.174029 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.566866 -0.174029 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.624779 -0.100996 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.612676 -0.0833673 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.604124 -0.10653 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.624779 -0.100996 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER -0.633331 -0.0778329 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.645433 -0.0954616 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.645433 -0.0954616 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.612676 -0.0833673 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.624779 -0.100996 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER -0.604124 -0.10653 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.68526 -0.161477 0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER -0.687686 -0.148046 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER -0.6652 -0.154071 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER -0.678869 -0.137627 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER -0.707746 -0.155452 0.290934 RAD 0.00617284 + txt002 + SPHERE CENTER -0.698929 -0.145033 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.70532 -0.168883 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.694077 -0.171896 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER -0.691651 -0.185327 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER -0.671591 -0.177921 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER -0.696329 -0.120168 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.700504 -0.095832 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.681209 -0.105047 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.681209 -0.105047 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.715624 -0.110952 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.696329 -0.120168 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER -0.711449 -0.135288 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.715624 -0.110952 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.711449 -0.135288 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.696329 -0.120168 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER -0.715501 -0.191718 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.736819 -0.190051 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.715501 -0.191718 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER -0.721035 -0.171063 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.736819 -0.190051 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.721035 -0.171063 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.715501 -0.191718 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER -0.731284 -0.210706 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.709966 -0.212373 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.709966 -0.212373 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.632882 -0.213855 0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER -0.61945 -0.216282 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER -0.609032 -0.207465 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER -0.625476 -0.193796 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER -0.6433 -0.222672 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER -0.649326 -0.200186 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER -0.656732 -0.220246 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER -0.626857 -0.236341 0.290934 RAD 0.00617284 + txt002 + SPHERE CENTER -0.640288 -0.233915 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.616438 -0.227525 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.663122 -0.244096 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.661455 -0.265414 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.642468 -0.249631 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.663122 -0.244096 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER -0.68211 -0.25988 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.683777 -0.238562 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.683777 -0.238562 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.661455 -0.265414 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.663122 -0.244096 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER -0.642468 -0.249631 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.591572 -0.224924 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.567237 -0.2291 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.576452 -0.209804 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.576452 -0.209804 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.582357 -0.24422 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.591572 -0.224924 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER -0.606693 -0.240045 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.582357 -0.24422 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.606693 -0.240045 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.591572 -0.224924 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER -0.69376 0.0133465 0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER -0.674309 0.0838533 0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER -0.66171 0.103063 0.113782 RAD 0.00617284 + txt002 + SPHERE CENTER -0.653258 0.0800983 0.110488 RAD 0.00617284 + txt002 + SPHERE CENTER -0.673446 0.0876683 0.0984536 RAD 0.00617284 + txt002 + SPHERE CENTER -0.682761 0.106818 0.126127 RAD 0.00617284 + txt002 + SPHERE CENTER -0.694497 0.0914233 0.110799 RAD 0.00617284 + txt002 + SPHERE CENTER -0.69536 0.0876083 0.135179 RAD 0.00617284 + txt002 + SPHERE CENTER -0.662574 0.0992478 0.138161 RAD 0.00617284 + txt002 + SPHERE CENTER -0.675172 0.0800382 0.147213 RAD 0.00617284 + txt002 + SPHERE CENTER -0.654121 0.0762832 0.134867 RAD 0.00617284 + txt002 + SPHERE CENTER -0.62221 0.0325183 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.604582 0.0446211 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.62221 0.0325183 0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER -0.627745 0.053173 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.604582 0.0446211 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.627745 0.053173 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.62221 0.0325183 0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER -0.599047 0.0239663 0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER -0.616676 0.0118635 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.616676 0.0118635 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.666287 0.0539145 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.662466 0.0547519 0.031176 RAD 0.00617284 + txt002 + SPHERE CENTER -0.660752 0.0332597 0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.682791 0.0439578 0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.668 0.0754066 0.0435217 RAD 0.00617284 + txt002 + SPHERE CENTER -0.688325 0.0646126 0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER -0.671821 0.0745692 0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.645962 0.0647085 0.0466081 RAD 0.00617284 + txt002 + SPHERE CENTER -0.649783 0.0638711 0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.644249 0.0432164 0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER -0.745859 0.0646815 0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER -0.750021 0.0887955 0.126127 RAD 0.00617284 + txt002 + SPHERE CENTER -0.729506 0.078459 0.135179 RAD 0.00617284 + txt002 + SPHERE CENTER -0.732161 0.0813312 0.110799 RAD 0.00617284 + txt002 + SPHERE CENTER -0.766375 0.075018 0.113782 RAD 0.00617284 + txt002 + SPHERE CENTER -0.748514 0.0675537 0.0984536 RAD 0.00617284 + txt002 + SPHERE CENTER -0.762212 0.050904 0.110488 RAD 0.00617284 + txt002 + SPHERE CENTER -0.763719 0.0721458 0.138161 RAD 0.00617284 + txt002 + SPHERE CENTER -0.759557 0.0480318 0.134867 RAD 0.00617284 + txt002 + SPHERE CENTER -0.743204 0.0618093 0.147213 RAD 0.00617284 + txt002 + SPHERE CENTER -0.737837 0.0347427 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.747099 0.0542122 0.0435217 RAD 0.00617284 + txt002 + SPHERE CENTER -0.743371 0.0553974 0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.7241 0.0550267 0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER -0.741565 0.0335575 0.031176 RAD 0.00617284 + txt002 + SPHERE CENTER -0.718566 0.0343719 0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.732303 0.014088 0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.760836 0.0339282 0.0466081 RAD 0.00617284 + txt002 + SPHERE CENTER -0.751574 0.0144587 0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER -0.757108 0.0351134 0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.76531 -0.0058253 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.786629 -0.00415829 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.76531 -0.0058253 0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER -0.770845 0.0148294 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.786629 -0.00415829 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.770845 0.0148294 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.76531 -0.0058253 0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER -0.781094 -0.024813 0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER -0.759776 -0.02648 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.759776 -0.02648 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.701782 0.0432853 0.178389 RAD 0.0185185 + txt002 + SPHERE CENTER -0.693716 0.0608821 0.193717 RAD 0.00617284 + txt002 + SPHERE CENTER -0.677932 0.0496759 0.178389 RAD 0.00617284 + txt002 + SPHERE CENTER -0.694884 0.0652402 0.169441 RAD 0.00617284 + txt002 + SPHERE CENTER -0.717566 0.0544915 0.193717 RAD 0.00617284 + txt002 + SPHERE CENTER -0.718734 0.0588496 0.169441 RAD 0.00617284 + txt002 + SPHERE CENTER -0.725632 0.0368947 0.178389 RAD 0.00617284 + txt002 + SPHERE CENTER -0.700615 0.0389272 0.202664 RAD 0.00617284 + txt002 + SPHERE CENTER -0.708681 0.0213304 0.187336 RAD 0.00617284 + txt002 + SPHERE CENTER -0.684831 0.027721 0.187336 RAD 0.00617284 + txt002 + SPHERE CENTER -0.721234 -0.0272215 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.720593 -0.0310802 0.191046 RAD 0.00617284 + txt002 + SPHERE CENTER -0.7 -0.0246945 0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.718114 -0.00820099 0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.741827 -0.0336072 0.178701 RAD 0.00617284 + txt002 + SPHERE CENTER -0.739347 -0.010728 0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER -0.742467 -0.0297485 0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER -0.723713 -0.0501007 0.175614 RAD 0.00617284 + txt002 + SPHERE CENTER -0.724354 -0.046242 0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.70312 -0.043715 0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.649684 -0.00804971 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.628657 -0.00328338 0.178701 RAD 0.00617284 + txt002 + SPHERE CENTER -0.630031 0.000378614 0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER -0.642244 0.0152909 0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER -0.648309 -0.0117117 0.191046 RAD 0.00617284 + txt002 + SPHERE CENTER -0.661896 0.00686255 0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.669336 -0.016478 0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.636097 -0.026624 0.175614 RAD 0.00617284 + txt002 + SPHERE CENTER -0.657124 -0.0313903 0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.637471 -0.022962 0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.835815 -0.157543 -0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER -0.899353 -0.119969 -0.117284 RAD 0.0185185 + txt002 + SPHERE CENTER -0.909872 -0.0977075 -0.115431 RAD 0.00617284 + txt002 + SPHERE CENTER -0.891613 -0.104052 -0.100068 RAD 0.00617284 + txt002 + SPHERE CENTER -0.886771 -0.0997803 -0.1239 RAD 0.00617284 + txt002 + SPHERE CENTER -0.917612 -0.113625 -0.132647 RAD 0.00617284 + txt002 + SPHERE CENTER -0.894512 -0.115698 -0.141116 RAD 0.00617284 + txt002 + SPHERE CENTER -0.907093 -0.135886 -0.1345 RAD 0.00617284 + txt002 + SPHERE CENTER -0.922453 -0.117896 -0.108814 RAD 0.00617284 + txt002 + SPHERE CENTER -0.911935 -0.140158 -0.110668 RAD 0.00617284 + txt002 + SPHERE CENTER -0.904194 -0.124241 -0.0934517 RAD 0.00617284 + txt002 + SPHERE CENTER -0.868703 -0.130205 -0.0506299 RAD 0.0185185 + txt002 + SPHERE CENTER -0.867758 -0.11253 -0.0334138 RAD 0.00617284 + txt002 + SPHERE CENTER -0.846864 -0.122142 -0.0423994 RAD 0.00617284 + txt002 + SPHERE CENTER -0.860854 -0.107566 -0.0565949 RAD 0.00617284 + txt002 + SPHERE CENTER -0.889596 -0.120593 -0.0416443 RAD 0.00617284 + txt002 + SPHERE CENTER -0.882692 -0.115629 -0.0648253 RAD 0.00617284 + txt002 + SPHERE CENTER -0.890541 -0.138267 -0.0588603 RAD 0.00617284 + txt002 + SPHERE CENTER -0.875606 -0.135168 -0.0274488 RAD 0.00617284 + txt002 + SPHERE CENTER -0.876551 -0.152843 -0.0446649 RAD 0.00617284 + txt002 + SPHERE CENTER -0.854713 -0.14478 -0.0364345 RAD 0.00617284 + txt002 + SPHERE CENTER -0.836885 -0.0844101 -0.099389 RAD 0.0185185 + txt002 + SPHERE CENTER -0.826973 -0.0627848 -0.106005 RAD 0.00617284 + txt002 + SPHERE CENTER -0.81296 -0.083104 -0.105354 RAD 0.00617284 + txt002 + SPHERE CENTER -0.830202 -0.0805529 -0.122844 RAD 0.00617284 + txt002 + SPHERE CENTER -0.850898 -0.0640908 -0.10004 RAD 0.00617284 + txt002 + SPHERE CENTER -0.854126 -0.0818589 -0.116879 RAD 0.00617284 + txt002 + SPHERE CENTER -0.860809 -0.0857161 -0.093424 RAD 0.00617284 + txt002 + SPHERE CENTER -0.833656 -0.0666419 -0.0825505 RAD 0.00617284 + txt002 + SPHERE CENTER -0.843568 -0.0882673 -0.0759343 RAD 0.00617284 + txt002 + SPHERE CENTER -0.819643 -0.0869612 -0.0818993 RAD 0.00617284 + txt002 + SPHERE CENTER -0.866465 -0.147308 -0.177765 RAD 0.0185185 + txt002 + SPHERE CENTER -0.876203 -0.130609 -0.193128 RAD 0.00617284 + txt002 + SPHERE CENTER -0.879733 -0.128522 -0.16878 RAD 0.00617284 + txt002 + SPHERE CENTER -0.857385 -0.124356 -0.178416 RAD 0.00617284 + txt002 + SPHERE CENTER -0.862935 -0.149395 -0.202114 RAD 0.00617284 + txt002 + SPHERE CENTER -0.844117 -0.143141 -0.187402 RAD 0.00617284 + txt002 + SPHERE CENTER -0.853198 -0.166093 -0.186751 RAD 0.00617284 + txt002 + SPHERE CENTER -0.885283 -0.153561 -0.192477 RAD 0.00617284 + txt002 + SPHERE CENTER -0.875546 -0.170259 -0.177114 RAD 0.00617284 + txt002 + SPHERE CENTER -0.888813 -0.151474 -0.168128 RAD 0.00617284 + txt002 + SPHERE CENTER -0.803997 -0.111748 -0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER -0.798532 -0.108311 -0.183703 RAD 0.00617284 + txt002 + SPHERE CENTER -0.797989 -0.131037 -0.174066 RAD 0.00617284 + txt002 + SPHERE CENTER -0.819589 -0.119537 -0.17736 RAD 0.00617284 + txt002 + SPHERE CENTER -0.80454 -0.0890219 -0.169507 RAD 0.00617284 + txt002 + SPHERE CENTER -0.825597 -0.100248 -0.163165 RAD 0.00617284 + txt002 + SPHERE CENTER -0.810005 -0.0924597 -0.145675 RAD 0.00617284 + txt002 + SPHERE CENTER -0.78294 -0.100522 -0.166213 RAD 0.00617284 + txt002 + SPHERE CENTER -0.788405 -0.10396 -0.142381 RAD 0.00617284 + txt002 + SPHERE CENTER -0.782397 -0.123249 -0.156576 RAD 0.00617284 + txt002 + SPHERE CENTER -0.802927 -0.184881 -0.171592 RAD 0.0185185 + txt002 + SPHERE CENTER -0.785723 -0.180723 -0.188808 RAD 0.00617284 + txt002 + SPHERE CENTER -0.798991 -0.161937 -0.179823 RAD 0.00617284 + txt002 + SPHERE CENTER -0.782104 -0.173028 -0.165627 RAD 0.00617284 + txt002 + SPHERE CENTER -0.78966 -0.203667 -0.180578 RAD 0.00617284 + txt002 + SPHERE CENTER -0.786041 -0.195972 -0.157397 RAD 0.00617284 + txt002 + SPHERE CENTER -0.806864 -0.207825 -0.163362 RAD 0.00617284 + txt002 + SPHERE CENTER -0.806546 -0.192576 -0.194773 RAD 0.00617284 + txt002 + SPHERE CENTER -0.82375 -0.196734 -0.177557 RAD 0.00617284 + txt002 + SPHERE CENTER -0.819813 -0.17379 -0.185788 RAD 0.00617284 + txt002 + SPHERE CENTER -0.898283 -0.193102 -0.129006 RAD 0.0185185 + txt002 + SPHERE CENTER -0.920038 -0.201143 -0.120537 RAD 0.00617284 + txt002 + SPHERE CENTER -0.900209 -0.201384 -0.105825 RAD 0.00617284 + txt002 + SPHERE CENTER -0.910616 -0.17991 -0.112168 RAD 0.00617284 + txt002 + SPHERE CENTER -0.918112 -0.192861 -0.143718 RAD 0.00617284 + txt002 + SPHERE CENTER -0.90869 -0.171628 -0.135349 RAD 0.00617284 + txt002 + SPHERE CENTER -0.896357 -0.18482 -0.152187 RAD 0.00617284 + txt002 + SPHERE CENTER -0.907705 -0.214335 -0.137375 RAD 0.00617284 + txt002 + SPHERE CENTER -0.88595 -0.206294 -0.145845 RAD 0.00617284 + txt002 + SPHERE CENTER -0.887876 -0.214576 -0.122663 RAD 0.00617284 + txt002 + SPHERE CENTER -0.834745 -0.230676 -0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER -0.824206 -0.252002 -0.116217 RAD 0.00617284 + txt002 + SPHERE CENTER -0.810793 -0.231282 -0.116868 RAD 0.00617284 + txt002 + SPHERE CENTER -0.827952 -0.234336 -0.0993785 RAD 0.00617284 + txt002 + SPHERE CENTER -0.848158 -0.251396 -0.122182 RAD 0.00617284 + txt002 + SPHERE CENTER -0.851905 -0.23373 -0.105343 RAD 0.00617284 + txt002 + SPHERE CENTER -0.858698 -0.23007 -0.128798 RAD 0.00617284 + txt002 + SPHERE CENTER -0.830999 -0.248342 -0.139672 RAD 0.00617284 + txt002 + SPHERE CENTER -0.841538 -0.227016 -0.146288 RAD 0.00617284 + txt002 + SPHERE CENTER -0.817586 -0.227621 -0.140323 RAD 0.00617284 + txt002 + SPHERE CENTER -0.867633 -0.203337 -0.062352 RAD 0.0185185 + txt002 + SPHERE CENTER -0.868948 -0.209658 -0.0385197 RAD 0.00617284 + txt002 + SPHERE CENTER -0.84746 -0.202239 -0.0481565 RAD 0.00617284 + txt002 + SPHERE CENTER -0.865773 -0.186008 -0.0448623 RAD 0.00617284 + txt002 + SPHERE CENTER -0.889121 -0.210757 -0.0527151 RAD 0.00617284 + txt002 + SPHERE CENTER -0.885946 -0.187106 -0.0590577 RAD 0.00617284 + txt002 + SPHERE CENTER -0.887806 -0.204436 -0.0765474 RAD 0.00617284 + txt002 + SPHERE CENTER -0.870808 -0.226988 -0.0560094 RAD 0.00617284 + txt002 + SPHERE CENTER -0.869493 -0.220667 -0.0798417 RAD 0.00617284 + txt002 + SPHERE CENTER -0.84932 -0.219569 -0.0656463 RAD 0.00617284 + txt002 + SPHERE CENTER -0.69376 0.0133465 -0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER -0.668775 0.0631985 -0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER -0.661946 0.0667914 -0.183325 RAD 0.00617284 + txt002 + SPHERE CENTER -0.65711 0.0452771 -0.172216 RAD 0.00617284 + txt002 + SPHERE CENTER -0.680354 0.0511945 -0.178077 RAD 0.00617284 + txt002 + SPHERE CENTER -0.673611 0.0847128 -0.170979 RAD 0.00617284 + txt002 + SPHERE CENTER -0.692019 0.069116 -0.165731 RAD 0.00617284 + txt002 + SPHERE CENTER -0.680439 0.08112 -0.147525 RAD 0.00617284 + txt002 + SPHERE CENTER -0.650366 0.0787954 -0.165118 RAD 0.00617284 + txt002 + SPHERE CENTER -0.657195 0.0752026 -0.141664 RAD 0.00617284 + txt002 + SPHERE CENTER -0.64553 0.0572811 -0.154009 RAD 0.00617284 + txt002 + SPHERE CENTER -0.62221 0.0325183 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.604582 0.0446211 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.62221 0.0325183 -0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER -0.627745 0.053173 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.604582 0.0446211 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.627745 0.053173 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.62221 0.0325183 -0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER -0.599047 0.0239663 -0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER -0.616676 0.0118635 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.616676 0.0118635 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.649684 -0.00804971 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.634953 -0.000226782 -0.184873 RAD 0.00617284 + txt002 + SPHERE CENTER -0.655218 0.012605 -0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.635947 0.0122343 -0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.629419 -0.0208815 -0.172528 RAD 0.00617284 + txt002 + SPHERE CENTER -0.630413 -0.00842045 -0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.644149 -0.0287044 -0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER -0.64869 -0.0205108 -0.18796 RAD 0.00617284 + txt002 + SPHERE CENTER -0.66342 -0.0283337 -0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER -0.668955 -0.00767898 -0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.740325 0.0440268 -0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER -0.746894 0.0650768 -0.170979 RAD 0.00617284 + txt002 + SPHERE CENTER -0.739183 0.0653796 -0.147525 RAD 0.00617284 + txt002 + SPHERE CENTER -0.723153 0.0607735 -0.165731 RAD 0.00617284 + txt002 + SPHERE CENTER -0.748035 0.0437239 -0.183325 RAD 0.00617284 + txt002 + SPHERE CENTER -0.724295 0.0394207 -0.178077 RAD 0.00617284 + txt002 + SPHERE CENTER -0.741466 0.0226739 -0.172216 RAD 0.00617284 + txt002 + SPHERE CENTER -0.764065 0.04833 -0.165118 RAD 0.00617284 + txt002 + SPHERE CENTER -0.757496 0.02728 -0.154009 RAD 0.00617284 + txt002 + SPHERE CENTER -0.756355 0.0486329 -0.141664 RAD 0.00617284 + txt002 + SPHERE CENTER -0.721234 -0.0272215 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.732368 -0.0484665 -0.172528 RAD 0.00617284 + txt002 + SPHERE CENTER -0.715699 -0.0478762 -0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER -0.737738 -0.0371781 -0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.737902 -0.0278118 -0.184873 RAD 0.00617284 + txt002 + SPHERE CENTER -0.743272 -0.0165234 -0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.726768 -0.00656677 -0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.715864 -0.0385099 -0.18796 RAD 0.00617284 + txt002 + SPHERE CENTER -0.70473 -0.0172649 -0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.699195 -0.0379196 -0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER -0.76531 -0.0058253 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.786629 -0.00415829 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.76531 -0.0058253 -0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER -0.770845 0.0148294 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.786629 -0.00415829 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.770845 0.0148294 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.76531 -0.0058253 -0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER -0.781094 -0.024813 -0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER -0.759776 -0.02648 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.759776 -0.02648 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.712851 0.0845947 -0.104315 RAD 0.0185185 + txt002 + SPHERE CENTER -0.706291 0.107813 -0.109563 RAD 0.00617284 + txt002 + SPHERE CENTER -0.689001 0.0909853 -0.104315 RAD 0.00617284 + txt002 + SPHERE CENTER -0.701434 0.0896851 -0.125608 RAD 0.00617284 + txt002 + SPHERE CENTER -0.730141 0.101422 -0.109563 RAD 0.00617284 + txt002 + SPHERE CENTER -0.725284 0.0832945 -0.125608 RAD 0.00617284 + txt002 + SPHERE CENTER -0.736701 0.0782041 -0.104315 RAD 0.00617284 + txt002 + SPHERE CENTER -0.717709 0.102723 -0.0882695 RAD 0.00617284 + txt002 + SPHERE CENTER -0.724268 0.0795043 -0.0830215 RAD 0.00617284 + txt002 + SPHERE CENTER -0.700418 0.0858949 -0.0830215 RAD 0.00617284 + txt002 + SPHERE CENTER -0.737837 0.0347427 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.740802 0.0511556 -0.0373488 RAD 0.00617284 + txt002 + SPHERE CENTER -0.718185 0.043171 -0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.730397 0.0580833 -0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER -0.760455 0.0427273 -0.0496945 RAD 0.00617284 + txt002 + SPHERE CENTER -0.750049 0.0496549 -0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.757489 0.0263144 -0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.748242 0.027815 -0.0342624 RAD 0.00617284 + txt002 + SPHERE CENTER -0.745277 0.0114021 -0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER -0.725625 0.0198304 -0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.666287 0.0539145 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.650692 0.0721382 -0.0496945 RAD 0.00617284 + txt002 + SPHERE CENTER -0.645053 0.0564414 -0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.663167 0.072935 -0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.671925 0.0696112 -0.0373488 RAD 0.00617284 + txt002 + SPHERE CENTER -0.6844 0.070408 -0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER -0.68752 0.0513875 -0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.653812 0.0531177 -0.0342624 RAD 0.00617284 + txt002 + SPHERE CENTER -0.669407 0.034894 -0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.648173 0.0374209 -0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER -0.643951 -0.172546 -0.222222 RAD 0.0555556 + txt002 + SPHERE CENTER -0.674191 -0.142305 -0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER -0.672341 -0.123995 -0.299164 RAD 0.00617284 + txt002 + SPHERE CENTER -0.666199 -0.120057 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER -0.651943 -0.134313 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER -0.680334 -0.146243 -0.306292 RAD 0.00617284 + txt002 + SPHERE CENTER -0.659936 -0.156561 -0.296959 RAD 0.00617284 + txt002 + SPHERE CENTER -0.682184 -0.164554 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER -0.69459 -0.131987 -0.292037 RAD 0.00617284 + txt002 + SPHERE CENTER -0.696439 -0.150298 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER -0.688447 -0.12805 -0.268448 RAD 0.00617284 + txt002 + SPHERE CENTER -0.715501 -0.153374 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.731779 -0.136231 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER -0.712305 -0.141449 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.70911 -0.129524 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.734974 -0.148156 -0.236478 RAD 0.00617284 + txt002 + SPHERE CENTER -0.712305 -0.141449 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.718696 -0.165299 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.738169 -0.160081 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER -0.721891 -0.177224 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.718696 -0.165299 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.663122 -0.100996 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.656415 -0.0783272 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER -0.639272 -0.0946054 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.651197 -0.0978007 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.680265 -0.0847178 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER -0.675047 -0.104191 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.686972 -0.107387 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.66834 -0.0815225 -0.207967 RAD 0.00617284 + txt002 + SPHERE CENTER -0.675047 -0.104191 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.651197 -0.0978007 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.602641 -0.161477 -0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER -0.60298 -0.154189 -0.306292 RAD 0.00617284 + txt002 + SPHERE CENTER -0.622115 -0.166695 -0.296959 RAD 0.00617284 + txt002 + SPHERE CENTER -0.617912 -0.143431 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER -0.583506 -0.148971 -0.292037 RAD 0.00617284 + txt002 + SPHERE CENTER -0.598439 -0.138214 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER -0.583168 -0.156259 -0.268448 RAD 0.00617284 + txt002 + SPHERE CENTER -0.587708 -0.172234 -0.299164 RAD 0.00617284 + txt002 + SPHERE CENTER -0.58737 -0.179523 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER -0.606843 -0.184741 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER -0.591572 -0.120168 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.577317 -0.105912 -0.236478 RAD 0.00617284 + txt002 + SPHERE CENTER -0.582843 -0.128897 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.600302 -0.111438 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.586046 -0.0971825 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER -0.609032 -0.102708 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.600302 -0.111438 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.568587 -0.114642 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER -0.582843 -0.128897 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.574113 -0.137627 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.5724 -0.191718 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.549732 -0.185011 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER -0.569205 -0.179793 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.56601 -0.167868 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.552927 -0.196936 -0.207967 RAD 0.00617284 + txt002 + SPHERE CENTER -0.569205 -0.179793 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.575596 -0.203643 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.556122 -0.208861 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER -0.578791 -0.215568 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.575596 -0.203643 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.655019 -0.213855 -0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER -0.653756 -0.23668 -0.292037 RAD 0.00617284 + txt002 + SPHERE CENTER -0.636974 -0.229127 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER -0.660237 -0.233329 -0.268448 RAD 0.00617284 + txt002 + SPHERE CENTER -0.671802 -0.221409 -0.299164 RAD 0.00617284 + txt002 + SPHERE CENTER -0.678283 -0.218058 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER -0.673065 -0.198584 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER -0.648538 -0.217207 -0.306292 RAD 0.00617284 + txt002 + SPHERE CENTER -0.649801 -0.194382 -0.296959 RAD 0.00617284 + txt002 + SPHERE CENTER -0.631756 -0.209653 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER -0.624779 -0.244096 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.607636 -0.260374 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER -0.600929 -0.237705 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.612854 -0.240901 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.631486 -0.266765 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER -0.636704 -0.247291 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.648629 -0.250487 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.619561 -0.26357 -0.236478 RAD 0.00617284 + txt002 + SPHERE CENTER -0.636704 -0.247291 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.612854 -0.240901 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.696329 -0.224924 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.710584 -0.23918 -0.207967 RAD 0.00617284 + txt002 + SPHERE CENTER -0.687599 -0.233654 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.705059 -0.216195 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.719314 -0.23045 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER -0.713788 -0.207465 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.705059 -0.216195 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.701855 -0.24791 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER -0.687599 -0.233654 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.678869 -0.242384 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.786005 -0.343435 8.51251e-17 RAD 0.0555556 + txt002 + SPHERE CENTER -0.82165 -0.392454 0.0425863 RAD 0.0185185 + txt002 + SPHERE CENTER -0.824791 -0.400556 0.065698 RAD 0.00617284 + txt002 + SPHERE CENTER -0.802599 -0.392663 0.058292 RAD 0.00617284 + txt002 + SPHERE CENTER -0.821021 -0.376528 0.0614442 RAD 0.00617284 + txt002 + SPHERE CENTER -0.843843 -0.400347 0.0499923 RAD 0.00617284 + txt002 + SPHERE CENTER -0.840073 -0.376319 0.0457385 RAD 0.00617284 + txt002 + SPHERE CENTER -0.840701 -0.392245 0.0268805 RAD 0.00617284 + txt002 + SPHERE CENTER -0.82542 -0.416482 0.0468401 RAD 0.00617284 + txt002 + SPHERE CENTER -0.822279 -0.40838 0.0237283 RAD 0.00617284 + txt002 + SPHERE CENTER -0.803228 -0.408589 0.0394341 RAD 0.00617284 + txt002 + SPHERE CENTER -0.753118 -0.370774 0.0604812 RAD 0.0185185 + txt002 + SPHERE CENTER -0.734271 -0.367981 0.076187 RAD 0.00617284 + txt002 + SPHERE CENTER -0.731279 -0.362711 0.0522508 RAD 0.00617284 + txt002 + SPHERE CENTER -0.745269 -0.348136 0.0664462 RAD 0.00617284 + txt002 + SPHERE CENTER -0.756109 -0.376044 0.0844174 RAD 0.00617284 + txt002 + SPHERE CENTER -0.767107 -0.356199 0.0746767 RAD 0.00617284 + txt002 + SPHERE CENTER -0.774956 -0.378837 0.0687117 RAD 0.00617284 + txt002 + SPHERE CENTER -0.74212 -0.390619 0.070222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.760966 -0.393412 0.0545162 RAD 0.00617284 + txt002 + SPHERE CENTER -0.739128 -0.385349 0.0462858 RAD 0.00617284 + txt002 + SPHERE CENTER -0.80984 -0.323622 0.0672777 RAD 0.0185185 + txt002 + SPHERE CENTER -0.80634 -0.308073 0.0861356 RAD 0.00617284 + txt002 + SPHERE CENTER -0.786996 -0.316395 0.0732426 RAD 0.00617284 + txt002 + SPHERE CENTER -0.802721 -0.300378 0.0629546 RAD 0.00617284 + txt002 + SPHERE CENTER -0.829184 -0.315299 0.0801706 RAD 0.00617284 + txt002 + SPHERE CENTER -0.825565 -0.307605 0.0569896 RAD 0.00617284 + txt002 + SPHERE CENTER -0.832685 -0.330849 0.0613127 RAD 0.00617284 + txt002 + SPHERE CENTER -0.813459 -0.331317 0.0904587 RAD 0.00617284 + txt002 + SPHERE CENTER -0.81696 -0.346866 0.0716007 RAD 0.00617284 + txt002 + SPHERE CENTER -0.794116 -0.339639 0.0775657 RAD 0.00617284 + txt002 + SPHERE CENTER -0.854538 -0.365116 -0.0178949 RAD 0.0185185 + txt002 + SPHERE CENTER -0.878086 -0.365674 -0.0104889 RAD 0.00617284 + txt002 + SPHERE CENTER -0.859887 -0.367962 0.00604126 RAD 0.00617284 + txt002 + SPHERE CENTER -0.863875 -0.346241 -0.00500196 RAD 0.00617284 + txt002 + SPHERE CENTER -0.872736 -0.362827 -0.0344251 RAD 0.00617284 + txt002 + SPHERE CENTER -0.858526 -0.343394 -0.0289382 RAD 0.00617284 + txt002 + SPHERE CENTER -0.849188 -0.362269 -0.0418311 RAD 0.00617284 + txt002 + SPHERE CENTER -0.868748 -0.384548 -0.0233819 RAD 0.00617284 + txt002 + SPHERE CENTER -0.8452 -0.38399 -0.0307879 RAD 0.00617284 + txt002 + SPHERE CENTER -0.85055 -0.386837 -0.00685171 RAD 0.00617284 + txt002 + SPHERE CENTER -0.842728 -0.296284 0.00679642 RAD 0.0185185 + txt002 + SPHERE CENTER -0.848999 -0.272611 0.00994863 RAD 0.00617284 + txt002 + SPHERE CENTER -0.828835 -0.281616 0.0209919 RAD 0.00617284 + txt002 + SPHERE CENTER -0.829121 -0.278432 -0.00349164 RAD 0.00617284 + txt002 + SPHERE CENTER -0.862893 -0.287278 -0.0042468 RAD 0.00617284 + txt002 + SPHERE CENTER -0.843015 -0.293099 -0.0176871 RAD 0.00617284 + txt002 + SPHERE CENTER -0.856621 -0.310951 -0.00739901 RAD 0.00617284 + txt002 + SPHERE CENTER -0.862606 -0.290462 0.0202367 RAD 0.00617284 + txt002 + SPHERE CENTER -0.856335 -0.314135 0.0170845 RAD 0.00617284 + txt002 + SPHERE CENTER -0.842441 -0.299468 0.0312799 RAD 0.00617284 + txt002 + SPHERE CENTER -0.818893 -0.316097 -0.0604812 RAD 0.0185185 + txt002 + SPHERE CENTER -0.819591 -0.297057 -0.076187 RAD 0.00617284 + txt002 + SPHERE CENTER -0.814956 -0.293153 -0.0522508 RAD 0.00617284 + txt002 + SPHERE CENTER -0.79807 -0.304244 -0.0664462 RAD 0.00617284 + txt002 + SPHERE CENTER -0.823527 -0.320001 -0.0844174 RAD 0.00617284 + txt002 + SPHERE CENTER -0.802007 -0.327188 -0.0746767 RAD 0.00617284 + txt002 + SPHERE CENTER -0.822829 -0.339041 -0.0687117 RAD 0.00617284 + txt002 + SPHERE CENTER -0.840413 -0.30891 -0.070222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.839716 -0.32795 -0.0545162 RAD 0.00617284 + txt002 + SPHERE CENTER -0.835779 -0.305006 -0.0462858 RAD 0.00617284 + txt002 + SPHERE CENTER -0.797815 -0.412267 -0.0246914 RAD 0.0185185 + txt002 + SPHERE CENTER -0.793573 -0.436217 -0.0204376 RAD 0.00617284 + txt002 + SPHERE CENTER -0.776294 -0.419454 -0.0149506 RAD 0.00617284 + txt002 + SPHERE CENTER -0.796968 -0.420728 -0.00151032 RAD 0.00617284 + txt002 + SPHERE CENTER -0.815094 -0.42903 -0.0301783 RAD 0.00617284 + txt002 + SPHERE CENTER -0.818489 -0.413542 -0.0112511 RAD 0.00617284 + txt002 + SPHERE CENTER -0.819335 -0.405081 -0.0344321 RAD 0.00617284 + txt002 + SPHERE CENTER -0.79442 -0.427756 -0.0436186 RAD 0.00617284 + txt002 + SPHERE CENTER -0.798662 -0.403807 -0.0478724 RAD 0.00617284 + txt002 + SPHERE CENTER -0.777141 -0.410993 -0.0381316 RAD 0.00617284 + txt002 + SPHERE CENTER -0.76217 -0.363249 -0.0672777 RAD 0.0185185 + txt002 + SPHERE CENTER -0.747522 -0.356966 -0.0861356 RAD 0.00617284 + txt002 + SPHERE CENTER -0.759239 -0.339469 -0.0732426 RAD 0.00617284 + txt002 + SPHERE CENTER -0.740618 -0.352002 -0.0629546 RAD 0.00617284 + txt002 + SPHERE CENTER -0.750453 -0.380746 -0.0801706 RAD 0.00617284 + txt002 + SPHERE CENTER -0.743549 -0.375782 -0.0569896 RAD 0.00617284 + txt002 + SPHERE CENTER -0.765101 -0.387029 -0.0613127 RAD 0.00617284 + txt002 + SPHERE CENTER -0.769074 -0.368213 -0.0904587 RAD 0.00617284 + txt002 + SPHERE CENTER -0.783722 -0.374496 -0.0716007 RAD 0.00617284 + txt002 + SPHERE CENTER -0.780791 -0.350716 -0.0775657 RAD 0.00617284 + txt002 + SPHERE CENTER -0.729282 -0.390587 -0.00679642 RAD 0.0185185 + txt002 + SPHERE CENTER -0.704862 -0.392427 -0.00994863 RAD 0.00617284 + txt002 + SPHERE CENTER -0.717401 -0.374248 -0.0209919 RAD 0.00617284 + txt002 + SPHERE CENTER -0.714218 -0.373948 0.00349164 RAD 0.00617284 + txt002 + SPHERE CENTER -0.716744 -0.408767 0.0042468 RAD 0.00617284 + txt002 + SPHERE CENTER -0.726099 -0.390287 0.0176871 RAD 0.00617284 + txt002 + SPHERE CENTER -0.741164 -0.406927 0.00739901 RAD 0.00617284 + txt002 + SPHERE CENTER -0.719927 -0.409067 -0.0202367 RAD 0.00617284 + txt002 + SPHERE CENTER -0.744347 -0.407227 -0.0170845 RAD 0.00617284 + txt002 + SPHERE CENTER -0.732465 -0.390887 -0.0312799 RAD 0.00617284 + txt002 + SPHERE CENTER -0.594141 -0.358439 -0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER -0.542042 -0.409774 -0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER -0.517869 -0.413579 -0.126127 RAD 0.00617284 + txt002 + SPHERE CENTER -0.528508 -0.393219 -0.135179 RAD 0.00617284 + txt002 + SPHERE CENTER -0.525596 -0.395831 -0.110799 RAD 0.00617284 + txt002 + SPHERE CENTER -0.531404 -0.430134 -0.113782 RAD 0.00617284 + txt002 + SPHERE CENTER -0.539131 -0.412386 -0.0984536 RAD 0.00617284 + txt002 + SPHERE CENTER -0.555577 -0.426328 -0.110488 RAD 0.00617284 + txt002 + SPHERE CENTER -0.534315 -0.427522 -0.138161 RAD 0.00617284 + txt002 + SPHERE CENTER -0.558488 -0.423716 -0.134867 RAD 0.00617284 + txt002 + SPHERE CENTER -0.544953 -0.407161 -0.147213 RAD 0.00617284 + txt002 + SPHERE CENTER -0.522591 -0.339267 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.504962 -0.327164 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.522591 -0.339267 -0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER -0.528125 -0.318612 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.504962 -0.327164 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.528125 -0.318612 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.522591 -0.339267 -0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER -0.499428 -0.347819 -0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER -0.517056 -0.359921 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.517056 -0.359921 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.550064 -0.379835 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.529037 -0.375068 -0.0435217 RAD 0.00617284 + txt002 + SPHERE CENTER -0.530412 -0.371406 -0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.542624 -0.356494 -0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER -0.548689 -0.383497 -0.031176 RAD 0.00617284 + txt002 + SPHERE CENTER -0.562276 -0.364922 -0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.569716 -0.388263 -0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.536477 -0.398409 -0.0466081 RAD 0.00617284 + txt002 + SPHERE CENTER -0.557504 -0.403175 -0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER -0.537852 -0.394747 -0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.613592 -0.428945 -0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER -0.612625 -0.451897 -0.113782 RAD 0.00617284 + txt002 + SPHERE CENTER -0.593593 -0.436515 -0.110488 RAD 0.00617284 + txt002 + SPHERE CENTER -0.614807 -0.432663 -0.0984536 RAD 0.00617284 + txt002 + SPHERE CENTER -0.632624 -0.444328 -0.126127 RAD 0.00617284 + txt002 + SPHERE CENTER -0.634806 -0.425094 -0.110799 RAD 0.00617284 + txt002 + SPHERE CENTER -0.633591 -0.421376 -0.135179 RAD 0.00617284 + txt002 + SPHERE CENTER -0.61141 -0.448179 -0.138161 RAD 0.00617284 + txt002 + SPHERE CENTER -0.612377 -0.425227 -0.147213 RAD 0.00617284 + txt002 + SPHERE CENTER -0.592379 -0.432797 -0.134867 RAD 0.00617284 + txt002 + SPHERE CENTER -0.621614 -0.399007 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.620974 -0.402865 -0.031176 RAD 0.00617284 + txt002 + SPHERE CENTER -0.600381 -0.39648 -0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.618494 -0.379986 -0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.642207 -0.405392 -0.0435217 RAD 0.00617284 + txt002 + SPHERE CENTER -0.639728 -0.382513 -0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER -0.642848 -0.401533 -0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.624094 -0.421886 -0.0466081 RAD 0.00617284 + txt002 + SPHERE CENTER -0.624734 -0.418027 -0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.603501 -0.4155 -0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER -0.665691 -0.37761 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.687009 -0.375943 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.665691 -0.37761 -0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER -0.671225 -0.356956 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.687009 -0.375943 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.671225 -0.356956 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.665691 -0.37761 -0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER -0.681475 -0.396598 -0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER -0.660156 -0.398265 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.660156 -0.398265 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.586119 -0.388377 -0.178389 RAD 0.0185185 + txt002 + SPHERE CENTER -0.570335 -0.399584 -0.193717 RAD 0.00617284 + txt002 + SPHERE CENTER -0.562269 -0.381987 -0.178389 RAD 0.00617284 + txt002 + SPHERE CENTER -0.569167 -0.403942 -0.169441 RAD 0.00617284 + txt002 + SPHERE CENTER -0.594185 -0.405974 -0.193717 RAD 0.00617284 + txt002 + SPHERE CENTER -0.593017 -0.410332 -0.169441 RAD 0.00617284 + txt002 + SPHERE CENTER -0.609969 -0.394768 -0.178389 RAD 0.00617284 + txt002 + SPHERE CENTER -0.587286 -0.384019 -0.202664 RAD 0.00617284 + txt002 + SPHERE CENTER -0.60307 -0.372813 -0.187336 RAD 0.00617284 + txt002 + SPHERE CENTER -0.57922 -0.366422 -0.187336 RAD 0.00617284 + txt002 + SPHERE CENTER -0.638217 -0.337042 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.64748 -0.317573 -0.178701 RAD 0.00617284 + txt002 + SPHERE CENTER -0.643752 -0.316388 -0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER -0.624481 -0.316758 -0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER -0.641945 -0.338228 -0.191046 RAD 0.00617284 + txt002 + SPHERE CENTER -0.618946 -0.337413 -0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.632683 -0.357697 -0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.661216 -0.337857 -0.175614 RAD 0.00617284 + txt002 + SPHERE CENTER -0.651954 -0.357326 -0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.657489 -0.336672 -0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.566667 -0.317871 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.562847 -0.317033 -0.191046 RAD 0.00617284 + txt002 + SPHERE CENTER -0.561133 -0.338525 -0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.583171 -0.327827 -0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.568381 -0.296378 -0.178701 RAD 0.00617284 + txt002 + SPHERE CENTER -0.588706 -0.307172 -0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER -0.572202 -0.297216 -0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER -0.546343 -0.307077 -0.175614 RAD 0.00617284 + txt002 + SPHERE CENTER -0.550163 -0.307914 -0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.544629 -0.328569 -0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.594141 -0.358439 0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER -0.547576 -0.389119 0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER -0.525642 -0.386849 0.170979 RAD 0.00617284 + txt002 + SPHERE CENTER -0.528407 -0.379645 0.147525 RAD 0.00617284 + txt002 + SPHERE CENTER -0.538964 -0.366733 0.165731 RAD 0.00617284 + txt002 + SPHERE CENTER -0.544812 -0.396323 0.183325 RAD 0.00617284 + txt002 + SPHERE CENTER -0.558134 -0.376207 0.178077 RAD 0.00617284 + txt002 + SPHERE CENTER -0.566746 -0.398593 0.172216 RAD 0.00617284 + txt002 + SPHERE CENTER -0.534255 -0.409235 0.165118 RAD 0.00617284 + txt002 + SPHERE CENTER -0.556189 -0.411505 0.154009 RAD 0.00617284 + txt002 + SPHERE CENTER -0.537019 -0.402031 0.141664 RAD 0.00617284 + txt002 + SPHERE CENTER -0.522591 -0.339267 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.504962 -0.327164 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.522591 -0.339267 0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER -0.528125 -0.318612 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.504962 -0.327164 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.528125 -0.318612 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.522591 -0.339267 0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER -0.499428 -0.347819 0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER -0.517056 -0.359921 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.517056 -0.359921 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.566667 -0.317871 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.551072 -0.299647 0.172528 RAD 0.00617284 + txt002 + SPHERE CENTER -0.545434 -0.315344 0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER -0.563547 -0.29885 0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.572306 -0.302174 0.184873 RAD 0.00617284 + txt002 + SPHERE CENTER -0.584781 -0.301377 0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.587901 -0.320398 0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.554192 -0.318667 0.18796 RAD 0.00617284 + txt002 + SPHERE CENTER -0.569787 -0.336891 0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.548554 -0.334364 0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER -0.619127 -0.408291 0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER -0.617918 -0.415912 0.183325 RAD 0.00617284 + txt002 + SPHERE CENTER -0.597788 -0.406911 0.172216 RAD 0.00617284 + txt002 + SPHERE CENTER -0.616439 -0.39183 0.178077 RAD 0.00617284 + txt002 + SPHERE CENTER -0.639257 -0.417292 0.170979 RAD 0.00617284 + txt002 + SPHERE CENTER -0.637778 -0.39321 0.165731 RAD 0.00617284 + txt002 + SPHERE CENTER -0.640465 -0.409671 0.147525 RAD 0.00617284 + txt002 + SPHERE CENTER -0.620605 -0.432372 0.165118 RAD 0.00617284 + txt002 + SPHERE CENTER -0.621814 -0.424751 0.141664 RAD 0.00617284 + txt002 + SPHERE CENTER -0.600475 -0.423371 0.154009 RAD 0.00617284 + txt002 + SPHERE CENTER -0.638217 -0.337042 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.641183 -0.320629 0.184873 RAD 0.00617284 + txt002 + SPHERE CENTER -0.618565 -0.328614 0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.630777 -0.313702 0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.660835 -0.329058 0.172528 RAD 0.00617284 + txt002 + SPHERE CENTER -0.65043 -0.32213 0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.65787 -0.345471 0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER -0.648623 -0.34397 0.18796 RAD 0.00617284 + txt002 + SPHERE CENTER -0.645657 -0.360383 0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER -0.626005 -0.351955 0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.665691 -0.37761 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.687009 -0.375943 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.665691 -0.37761 0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER -0.671225 -0.356956 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.687009 -0.375943 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.671225 -0.356956 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.665691 -0.37761 0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER -0.681475 -0.396598 0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER -0.660156 -0.398265 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.660156 -0.398265 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.57505 -0.429687 0.104315 RAD 0.0185185 + txt002 + SPHERE CENTER -0.55776 -0.446515 0.109563 RAD 0.00617284 + txt002 + SPHERE CENTER -0.5512 -0.423296 0.104315 RAD 0.00617284 + txt002 + SPHERE CENTER -0.562617 -0.428387 0.125608 RAD 0.00617284 + txt002 + SPHERE CENTER -0.58161 -0.452905 0.109563 RAD 0.00617284 + txt002 + SPHERE CENTER -0.586467 -0.434777 0.125608 RAD 0.00617284 + txt002 + SPHERE CENTER -0.5989 -0.436077 0.104315 RAD 0.00617284 + txt002 + SPHERE CENTER -0.570193 -0.447815 0.0882695 RAD 0.00617284 + txt002 + SPHERE CENTER -0.587483 -0.430987 0.0830215 RAD 0.00617284 + txt002 + SPHERE CENTER -0.563633 -0.424596 0.0830215 RAD 0.00617284 + txt002 + SPHERE CENTER -0.621614 -0.399007 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.632748 -0.420252 0.0496945 RAD 0.00617284 + txt002 + SPHERE CENTER -0.61608 -0.419661 0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.638118 -0.408963 0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.638282 -0.399597 0.0373488 RAD 0.00617284 + txt002 + SPHERE CENTER -0.643653 -0.388308 0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER -0.627149 -0.378352 0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.616244 -0.410295 0.0342624 RAD 0.00617284 + txt002 + SPHERE CENTER -0.60511 -0.38905 0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.599576 -0.409705 0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER -0.550064 -0.379835 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.535334 -0.372012 0.0373488 RAD 0.00617284 + txt002 + SPHERE CENTER -0.555599 -0.35918 0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.536327 -0.359551 0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER -0.529799 -0.392667 0.0496945 RAD 0.00617284 + txt002 + SPHERE CENTER -0.530793 -0.380205 0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.54453 -0.400489 0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.549071 -0.392296 0.0342624 RAD 0.00617284 + txt002 + SPHERE CENTER -0.563801 -0.400119 0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER -0.569335 -0.379464 0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0996195 -0.371785 0.544331 RAD 0.166667 + txt002 + SPHERE CENTER 0.220501 -0.393621 0.729516 RAD 0.0555556 + txt002 + SPHERE CENTER 0.279642 -0.368601 0.766439 RAD 0.0185185 + txt002 + SPHERE CENTER 0.299716 -0.354293 0.765035 RAD 0.00617284 + txt002 + SPHERE CENTER 0.292196 -0.366989 0.745238 RAD 0.00617284 + txt002 + SPHERE CENTER 0.279022 -0.347717 0.753281 RAD 0.00617284 + txt002 + SPHERE CENTER 0.287162 -0.355904 0.786236 RAD 0.00617284 + txt002 + SPHERE CENTER 0.266468 -0.349329 0.774481 RAD 0.00617284 + txt002 + SPHERE CENTER 0.267088 -0.370213 0.787639 RAD 0.00617284 + txt002 + SPHERE CENTER 0.300337 -0.375177 0.778193 RAD 0.00617284 + txt002 + SPHERE CENTER 0.280263 -0.389485 0.779597 RAD 0.00617284 + txt002 + SPHERE CENTER 0.292817 -0.387873 0.758396 RAD 0.00617284 + txt002 + SPHERE CENTER 0.281062 -0.372464 0.692479 RAD 0.0185185 + txt002 + SPHERE CENTER 0.289441 -0.362978 0.671279 RAD 0.00617284 + txt002 + SPHERE CENTER 0.270044 -0.378255 0.671155 RAD 0.00617284 + txt002 + SPHERE CENTER 0.267771 -0.35549 0.680442 RAD 0.00617284 + txt002 + SPHERE CENTER 0.30046 -0.357187 0.692603 RAD 0.00617284 + txt002 + SPHERE CENTER 0.278789 -0.349699 0.701767 RAD 0.00617284 + txt002 + SPHERE CENTER 0.29208 -0.366673 0.713804 RAD 0.00617284 + txt002 + SPHERE CENTER 0.302733 -0.379952 0.683315 RAD 0.00617284 + txt002 + SPHERE CENTER 0.294353 -0.389438 0.704516 RAD 0.00617284 + txt002 + SPHERE CENTER 0.283335 -0.395229 0.683192 RAD 0.00617284 + txt002 + SPHERE CENTER 0.238665 -0.321889 0.726118 RAD 0.0185185 + txt002 + SPHERE CENTER 0.250544 -0.304702 0.71296 RAD 0.00617284 + txt002 + SPHERE CENTER 0.259421 -0.327715 0.714081 RAD 0.00617284 + txt002 + SPHERE CENTER 0.238717 -0.32307 0.701455 RAD 0.00617284 + txt002 + SPHERE CENTER 0.229788 -0.298875 0.724997 RAD 0.00617284 + txt002 + SPHERE CENTER 0.21796 -0.317244 0.713492 RAD 0.00617284 + txt002 + SPHERE CENTER 0.217908 -0.316063 0.738155 RAD 0.00617284 + txt002 + SPHERE CENTER 0.250492 -0.30352 0.737623 RAD 0.00617284 + txt002 + SPHERE CENTER 0.238612 -0.320707 0.750781 RAD 0.00617284 + txt002 + SPHERE CENTER 0.259369 -0.326533 0.738744 RAD 0.00617284 + txt002 + SPHERE CENTER 0.219082 -0.389758 0.803476 RAD 0.0185185 + txt002 + SPHERE CENTER 0.228779 -0.378635 0.823273 RAD 0.00617284 + txt002 + SPHERE CENTER 0.24293 -0.383364 0.8036 RAD 0.00617284 + txt002 + SPHERE CENTER 0.225483 -0.365937 0.802355 RAD 0.00617284 + txt002 + SPHERE CENTER 0.20493 -0.385029 0.823149 RAD 0.00617284 + txt002 + SPHERE CENTER 0.201634 -0.372331 0.802231 RAD 0.00617284 + txt002 + SPHERE CENTER 0.195233 -0.396152 0.803352 RAD 0.00617284 + txt002 + SPHERE CENTER 0.222377 -0.402455 0.824394 RAD 0.00617284 + txt002 + SPHERE CENTER 0.21268 -0.413578 0.804597 RAD 0.00617284 + txt002 + SPHERE CENTER 0.236529 -0.407185 0.804721 RAD 0.00617284 + txt002 + SPHERE CENTER 0.178104 -0.343046 0.763155 RAD 0.0185185 + txt002 + SPHERE CENTER 0.177083 -0.319723 0.771198 RAD 0.00617284 + txt002 + SPHERE CENTER 0.198298 -0.332294 0.772443 RAD 0.00617284 + txt002 + SPHERE CENTER 0.189464 -0.325124 0.750529 RAD 0.00617284 + txt002 + SPHERE CENTER 0.156889 -0.330475 0.76191 RAD 0.00617284 + txt002 + SPHERE CENTER 0.16927 -0.335876 0.741241 RAD 0.00617284 + txt002 + SPHERE CENTER 0.157909 -0.353797 0.753867 RAD 0.00617284 + txt002 + SPHERE CENTER 0.165722 -0.337645 0.783824 RAD 0.00617284 + txt002 + SPHERE CENTER 0.166743 -0.360967 0.775781 RAD 0.00617284 + txt002 + SPHERE CENTER 0.186938 -0.350216 0.785069 RAD 0.00617284 + txt002 + SPHERE CENTER 0.15994 -0.414778 0.766553 RAD 0.0185185 + txt002 + SPHERE CENTER 0.147477 -0.412573 0.787754 RAD 0.00617284 + txt002 + SPHERE CENTER 0.172167 -0.412448 0.787878 RAD 0.00617284 + txt002 + SPHERE CENTER 0.15977 -0.39322 0.77859 RAD 0.00617284 + txt002 + SPHERE CENTER 0.13525 -0.414903 0.766429 RAD 0.00617284 + txt002 + SPHERE CENTER 0.147543 -0.39555 0.757266 RAD 0.00617284 + txt002 + SPHERE CENTER 0.147713 -0.417108 0.745229 RAD 0.00617284 + txt002 + SPHERE CENTER 0.147647 -0.434131 0.775717 RAD 0.00617284 + txt002 + SPHERE CENTER 0.16011 -0.436336 0.754517 RAD 0.00617284 + txt002 + SPHERE CENTER 0.172338 -0.434006 0.775841 RAD 0.00617284 + txt002 + SPHERE CENTER 0.261479 -0.440333 0.769837 RAD 0.0185185 + txt002 + SPHERE CENTER 0.282991 -0.443285 0.781591 RAD 0.00617284 + txt002 + SPHERE CENTER 0.282046 -0.4302 0.760673 RAD 0.00617284 + txt002 + SPHERE CENTER 0.271991 -0.421181 0.781342 RAD 0.00617284 + txt002 + SPHERE CENTER 0.262424 -0.453417 0.790755 RAD 0.00617284 + txt002 + SPHERE CENTER 0.251423 -0.431313 0.790506 RAD 0.00617284 + txt002 + SPHERE CENTER 0.240911 -0.450466 0.779001 RAD 0.00617284 + txt002 + SPHERE CENTER 0.27248 -0.462437 0.770086 RAD 0.00617284 + txt002 + SPHERE CENTER 0.250967 -0.459485 0.758332 RAD 0.00617284 + txt002 + SPHERE CENTER 0.271534 -0.449353 0.749168 RAD 0.00617284 + txt002 + SPHERE CENTER 0.202338 -0.465353 0.732914 RAD 0.0185185 + txt002 + SPHERE CENTER 0.204606 -0.486123 0.746073 RAD 0.00617284 + txt002 + SPHERE CENTER 0.223366 -0.470107 0.744951 RAD 0.00617284 + txt002 + SPHERE CENTER 0.202946 -0.464339 0.757577 RAD 0.00617284 + txt002 + SPHERE CENTER 0.183578 -0.481368 0.734036 RAD 0.00617284 + txt002 + SPHERE CENTER 0.181918 -0.459584 0.745541 RAD 0.00617284 + txt002 + SPHERE CENTER 0.18131 -0.460599 0.720878 RAD 0.00617284 + txt002 + SPHERE CENTER 0.203998 -0.487137 0.72141 RAD 0.00617284 + txt002 + SPHERE CENTER 0.201729 -0.466367 0.708251 RAD 0.00617284 + txt002 + SPHERE CENTER 0.222757 -0.471122 0.720288 RAD 0.00617284 + txt002 + SPHERE CENTER 0.262898 -0.444196 0.695877 RAD 0.0185185 + txt002 + SPHERE CENTER 0.285685 -0.449273 0.687835 RAD 0.00617284 + txt002 + SPHERE CENTER 0.27701 -0.426189 0.68659 RAD 0.00617284 + txt002 + SPHERE CENTER 0.282528 -0.436139 0.708504 RAD 0.00617284 + txt002 + SPHERE CENTER 0.271573 -0.46728 0.697123 RAD 0.00617284 + txt002 + SPHERE CENTER 0.268416 -0.454146 0.717791 RAD 0.00617284 + txt002 + SPHERE CENTER 0.248787 -0.462204 0.705165 RAD 0.00617284 + txt002 + SPHERE CENTER 0.266055 -0.45733 0.675209 RAD 0.00617284 + txt002 + SPHERE CENTER 0.243269 -0.452254 0.683251 RAD 0.00617284 + txt002 + SPHERE CENTER 0.257381 -0.434246 0.673964 RAD 0.00617284 + txt002 + SPHERE CENTER 0.31427 -0.31427 0.544331 RAD 0.0555556 + txt002 + SPHERE CENTER 0.367156 -0.277961 0.507294 RAD 0.0185185 + txt002 + SPHERE CENTER 0.374298 -0.269898 0.485076 RAD 0.00617284 + txt002 + SPHERE CENTER 0.362218 -0.291334 0.487134 RAD 0.00617284 + txt002 + SPHERE CENTER 0.350338 -0.270045 0.491041 RAD 0.00617284 + txt002 + SPHERE CENTER 0.379235 -0.256525 0.505236 RAD 0.00617284 + txt002 + SPHERE CENTER 0.355276 -0.256671 0.511201 RAD 0.00617284 + txt002 + SPHERE CENTER 0.372093 -0.264588 0.527454 RAD 0.00617284 + txt002 + SPHERE CENTER 0.391115 -0.277815 0.501329 RAD 0.00617284 + txt002 + SPHERE CENTER 0.383973 -0.285878 0.523547 RAD 0.00617284 + txt002 + SPHERE CENTER 0.379036 -0.299251 0.503387 RAD 0.00617284 + txt002 + SPHERE CENTER 0.31427 -0.31427 0.470257 RAD 0.0185185 + txt002 + SPHERE CENTER 0.304189 -0.304189 0.450097 RAD 0.00617284 + txt002 + SPHERE CENTER 0.29042 -0.307879 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER 0.307879 -0.29042 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER 0.328039 -0.31058 0.450097 RAD 0.00617284 + txt002 + SPHERE CENTER 0.331729 -0.29681 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER 0.33812 -0.32066 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER 0.31058 -0.328039 0.450097 RAD 0.00617284 + txt002 + SPHERE CENTER 0.32066 -0.33812 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER 0.29681 -0.331729 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER 0.297666 -0.252306 0.507294 RAD 0.0185185 + txt002 + SPHERE CENTER 0.305995 -0.235688 0.491041 RAD 0.00617284 + txt002 + SPHERE CENTER 0.321516 -0.245915 0.507294 RAD 0.00617284 + txt002 + SPHERE CENTER 0.312359 -0.259438 0.488775 RAD 0.00617284 + txt002 + SPHERE CENTER 0.282145 -0.242079 0.491041 RAD 0.00617284 + txt002 + SPHERE CENTER 0.288509 -0.265828 0.488775 RAD 0.00617284 + txt002 + SPHERE CENTER 0.273816 -0.258696 0.507294 RAD 0.00617284 + txt002 + SPHERE CENTER 0.291303 -0.228556 0.509559 RAD 0.00617284 + txt002 + SPHERE CENTER 0.282974 -0.245173 0.525813 RAD 0.00617284 + txt002 + SPHERE CENTER 0.306824 -0.238783 0.525813 RAD 0.00617284 + txt002 + SPHERE CENTER 0.367156 -0.277961 0.581368 RAD 0.0185185 + txt002 + SPHERE CENTER 0.385852 -0.261966 0.57931 RAD 0.00617284 + txt002 + SPHERE CENTER 0.38141 -0.278159 0.561208 RAD 0.00617284 + txt002 + SPHERE CENTER 0.36581 -0.259422 0.565115 RAD 0.00617284 + txt002 + SPHERE CENTER 0.371598 -0.261768 0.599471 RAD 0.00617284 + txt002 + SPHERE CENTER 0.351556 -0.259225 0.585275 RAD 0.00617284 + txt002 + SPHERE CENTER 0.352901 -0.277764 0.601529 RAD 0.00617284 + txt002 + SPHERE CENTER 0.387198 -0.280504 0.595564 RAD 0.00617284 + txt002 + SPHERE CENTER 0.368501 -0.2965 0.597621 RAD 0.00617284 + txt002 + SPHERE CENTER 0.382755 -0.296698 0.577461 RAD 0.00617284 + txt002 + SPHERE CENTER 0.297666 -0.252306 0.581368 RAD 0.0185185 + txt002 + SPHERE CENTER 0.30415 -0.228803 0.585275 RAD 0.00617284 + txt002 + SPHERE CENTER 0.321516 -0.245915 0.581368 RAD 0.00617284 + txt002 + SPHERE CENTER 0.306824 -0.238783 0.56285 RAD 0.00617284 + txt002 + SPHERE CENTER 0.2803 -0.235194 0.585275 RAD 0.00617284 + txt002 + SPHERE CENTER 0.282974 -0.245173 0.56285 RAD 0.00617284 + txt002 + SPHERE CENTER 0.273816 -0.258696 0.581368 RAD 0.00617284 + txt002 + SPHERE CENTER 0.294992 -0.242326 0.603794 RAD 0.00617284 + txt002 + SPHERE CENTER 0.288509 -0.265828 0.599887 RAD 0.00617284 + txt002 + SPHERE CENTER 0.312359 -0.259438 0.599887 RAD 0.00617284 + txt002 + SPHERE CENTER 0.31427 -0.31427 0.618405 RAD 0.0185185 + txt002 + SPHERE CENTER 0.32435 -0.304189 0.638566 RAD 0.00617284 + txt002 + SPHERE CENTER 0.33812 -0.307879 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER 0.32066 -0.29042 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER 0.3005 -0.31058 0.638566 RAD 0.00617284 + txt002 + SPHERE CENTER 0.29681 -0.29681 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER 0.29042 -0.32066 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER 0.317959 -0.328039 0.638566 RAD 0.00617284 + txt002 + SPHERE CENTER 0.307879 -0.33812 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER 0.331729 -0.331729 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER 0.383759 -0.339925 0.544331 RAD 0.0185185 + txt002 + SPHERE CENTER 0.407156 -0.334762 0.538366 RAD 0.00617284 + txt002 + SPHERE CENTER 0.388696 -0.326552 0.524171 RAD 0.00617284 + txt002 + SPHERE CENTER 0.392275 -0.31686 0.546597 RAD 0.00617284 + txt002 + SPHERE CENTER 0.402218 -0.348135 0.558526 RAD 0.00617284 + txt002 + SPHERE CENTER 0.387337 -0.330233 0.566757 RAD 0.00617284 + txt002 + SPHERE CENTER 0.378821 -0.353299 0.564491 RAD 0.00617284 + txt002 + SPHERE CENTER 0.39864 -0.357827 0.536101 RAD 0.00617284 + txt002 + SPHERE CENTER 0.375243 -0.362991 0.542066 RAD 0.00617284 + txt002 + SPHERE CENTER 0.380181 -0.349618 0.521905 RAD 0.00617284 + txt002 + SPHERE CENTER 0.330873 -0.376234 0.581368 RAD 0.0185185 + txt002 + SPHERE CENTER 0.346394 -0.386461 0.597621 RAD 0.00617284 + txt002 + SPHERE CENTER 0.354723 -0.369843 0.581368 RAD 0.00617284 + txt002 + SPHERE CENTER 0.340031 -0.362711 0.599887 RAD 0.00617284 + txt002 + SPHERE CENTER 0.322544 -0.392851 0.597621 RAD 0.00617284 + txt002 + SPHERE CENTER 0.316181 -0.369102 0.599887 RAD 0.00617284 + txt002 + SPHERE CENTER 0.307023 -0.382624 0.581368 RAD 0.00617284 + txt002 + SPHERE CENTER 0.337237 -0.399983 0.579103 RAD 0.00617284 + txt002 + SPHERE CENTER 0.321715 -0.389757 0.56285 RAD 0.00617284 + txt002 + SPHERE CENTER 0.345565 -0.383366 0.56285 RAD 0.00617284 + txt002 + SPHERE CENTER 0.330873 -0.376234 0.507294 RAD 0.0185185 + txt002 + SPHERE CENTER 0.348239 -0.393346 0.503387 RAD 0.00617284 + txt002 + SPHERE CENTER 0.354723 -0.369843 0.507294 RAD 0.00617284 + txt002 + SPHERE CENTER 0.345565 -0.383366 0.525813 RAD 0.00617284 + txt002 + SPHERE CENTER 0.324389 -0.399736 0.503387 RAD 0.00617284 + txt002 + SPHERE CENTER 0.321715 -0.389757 0.525813 RAD 0.00617284 + txt002 + SPHERE CENTER 0.307023 -0.382624 0.507294 RAD 0.00617284 + txt002 + SPHERE CENTER 0.333547 -0.386213 0.484868 RAD 0.00617284 + txt002 + SPHERE CENTER 0.316181 -0.369102 0.488775 RAD 0.00617284 + txt002 + SPHERE CENTER 0.340031 -0.362711 0.488775 RAD 0.00617284 + txt002 + SPHERE CENTER 0.166275 -0.191247 0.655442 RAD 0.0555556 + txt002 + SPHERE CENTER 0.20793 -0.130089 0.652044 RAD 0.0185185 + txt002 + SPHERE CENTER 0.221102 -0.115471 0.637128 RAD 0.00617284 + txt002 + SPHERE CENTER 0.220766 -0.13987 0.633356 RAD 0.00617284 + txt002 + SPHERE CENTER 0.200597 -0.126388 0.628759 RAD 0.00617284 + txt002 + SPHERE CENTER 0.208266 -0.10569 0.655816 RAD 0.00617284 + txt002 + SPHERE CENTER 0.187762 -0.116607 0.647447 RAD 0.00617284 + txt002 + SPHERE CENTER 0.195095 -0.120308 0.670732 RAD 0.00617284 + txt002 + SPHERE CENTER 0.228435 -0.119172 0.660413 RAD 0.00617284 + txt002 + SPHERE CENTER 0.215264 -0.13379 0.675329 RAD 0.00617284 + txt002 + SPHERE CENTER 0.228099 -0.143571 0.656641 RAD 0.00617284 + txt002 + SPHERE CENTER 0.230419 -0.192135 0.618405 RAD 0.0185185 + txt002 + SPHERE CENTER 0.243049 -0.18209 0.599717 RAD 0.00617284 + txt002 + SPHERE CENTER 0.218634 -0.185251 0.597829 RAD 0.00617284 + txt002 + SPHERE CENTER 0.227721 -0.168159 0.613157 RAD 0.00617284 + txt002 + SPHERE CENTER 0.254834 -0.188974 0.620293 RAD 0.00617284 + txt002 + SPHERE CENTER 0.239506 -0.175043 0.633733 RAD 0.00617284 + txt002 + SPHERE CENTER 0.242204 -0.199019 0.638981 RAD 0.00617284 + txt002 + SPHERE CENTER 0.245747 -0.206066 0.604965 RAD 0.00617284 + txt002 + SPHERE CENTER 0.233117 -0.216111 0.623653 RAD 0.00617284 + txt002 + SPHERE CENTER 0.221332 -0.209227 0.603077 RAD 0.00617284 + txt002 + SPHERE CENTER 0.172673 -0.154295 0.591563 RAD 0.0185185 + txt002 + SPHERE CENTER 0.180792 -0.15554 0.568278 RAD 0.00617284 + txt002 + SPHERE CENTER 0.19323 -0.166926 0.586315 RAD 0.00617284 + txt002 + SPHERE CENTER 0.171251 -0.17557 0.579113 RAD 0.00617284 + txt002 + SPHERE CENTER 0.160236 -0.142909 0.573526 RAD 0.00617284 + txt002 + SPHERE CENTER 0.150694 -0.162939 0.584361 RAD 0.00617284 + txt002 + SPHERE CENTER 0.152117 -0.141663 0.596811 RAD 0.00617284 + txt002 + SPHERE CENTER 0.182215 -0.134265 0.580727 RAD 0.00617284 + txt002 + SPHERE CENTER 0.174096 -0.133019 0.604012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.194652 -0.145651 0.598764 RAD 0.00617284 + txt002 + SPHERE CENTER 0.143787 -0.129201 0.689081 RAD 0.0185185 + txt002 + SPHERE CENTER 0.14887 -0.105335 0.692853 RAD 0.00617284 + txt002 + SPHERE CENTER 0.167242 -0.121723 0.690969 RAD 0.00617284 + txt002 + SPHERE CENTER 0.153943 -0.115741 0.671044 RAD 0.00617284 + txt002 + SPHERE CENTER 0.125414 -0.112813 0.690965 RAD 0.00617284 + txt002 + SPHERE CENTER 0.130487 -0.123219 0.669156 RAD 0.00617284 + txt002 + SPHERE CENTER 0.120331 -0.136679 0.687193 RAD 0.00617284 + txt002 + SPHERE CENTER 0.138714 -0.118795 0.71089 RAD 0.00617284 + txt002 + SPHERE CENTER 0.13363 -0.142661 0.707118 RAD 0.00617284 + txt002 + SPHERE CENTER 0.157086 -0.135183 0.709006 RAD 0.00617284 + txt002 + SPHERE CENTER 0.108529 -0.153407 0.6286 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0995811 -0.130858 0.624003 RAD 0.00617284 + txt002 + SPHERE CENTER 0.113639 -0.134736 0.643928 RAD 0.00617284 + txt002 + SPHERE CENTER 0.123725 -0.135326 0.621398 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0944715 -0.149528 0.608675 RAD 0.00617284 + txt002 + SPHERE CENTER 0.118615 -0.153997 0.60607 RAD 0.00617284 + txt002 + SPHERE CENTER 0.10342 -0.172078 0.613272 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0843858 -0.148938 0.631205 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0933338 -0.171487 0.635801 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0984435 -0.152816 0.65113 RAD 0.00617284 + txt002 + SPHERE CENTER 0.102131 -0.190359 0.692479 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0897843 -0.179968 0.711167 RAD 0.00617284 + txt002 + SPHERE CENTER 0.114103 -0.183804 0.713055 RAD 0.00617284 + txt002 + SPHERE CENTER 0.105492 -0.166467 0.697727 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0778128 -0.186523 0.690591 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0935207 -0.173022 0.677151 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0901597 -0.196914 0.671903 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0864233 -0.20386 0.705919 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0987702 -0.214251 0.687231 RAD 0.00617284 + txt002 + SPHERE CENTER 0.110742 -0.207696 0.707807 RAD 0.00617284 + txt002 + SPHERE CENTER 0.201532 -0.167041 0.715923 RAD 0.0185185 + txt002 + SPHERE CENTER 0.219088 -0.151829 0.724292 RAD 0.00617284 + txt002 + SPHERE CENTER 0.221861 -0.163068 0.702483 RAD 0.00617284 + txt002 + SPHERE CENTER 0.205084 -0.14514 0.705088 RAD 0.00617284 + txt002 + SPHERE CENTER 0.19876 -0.155801 0.737733 RAD 0.00617284 + txt002 + SPHERE CENTER 0.184756 -0.149113 0.718528 RAD 0.00617284 + txt002 + SPHERE CENTER 0.181204 -0.171014 0.729364 RAD 0.00617284 + txt002 + SPHERE CENTER 0.215537 -0.173729 0.735128 RAD 0.00617284 + txt002 + SPHERE CENTER 0.197981 -0.188942 0.726759 RAD 0.00617284 + txt002 + SPHERE CENTER 0.218309 -0.184969 0.713318 RAD 0.00617284 + txt002 + SPHERE CENTER 0.159877 -0.228199 0.719322 RAD 0.0185185 + txt002 + SPHERE CENTER 0.167942 -0.229756 0.742607 RAD 0.00617284 + txt002 + SPHERE CENTER 0.183484 -0.223214 0.72457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.16569 -0.207683 0.731771 RAD 0.00617284 + txt002 + SPHERE CENTER 0.144336 -0.234741 0.737359 RAD 0.00617284 + txt002 + SPHERE CENTER 0.142084 -0.212668 0.726523 RAD 0.00617284 + txt002 + SPHERE CENTER 0.13627 -0.233184 0.714074 RAD 0.00617284 + txt002 + SPHERE CENTER 0.162129 -0.250271 0.730157 RAD 0.00617284 + txt002 + SPHERE CENTER 0.154064 -0.248714 0.706872 RAD 0.00617284 + txt002 + SPHERE CENTER 0.177671 -0.243729 0.71212 RAD 0.00617284 + txt002 + SPHERE CENTER 0.224021 -0.229087 0.682285 RAD 0.0185185 + txt002 + SPHERE CENTER 0.248268 -0.22829 0.686881 RAD 0.00617284 + txt002 + SPHERE CENTER 0.2391 -0.216949 0.666956 RAD 0.00617284 + txt002 + SPHERE CENTER 0.234532 -0.207937 0.689486 RAD 0.00617284 + txt002 + SPHERE CENTER 0.233189 -0.240428 0.702209 RAD 0.00617284 + txt002 + SPHERE CENTER 0.219453 -0.220075 0.704814 RAD 0.00617284 + txt002 + SPHERE CENTER 0.208942 -0.241225 0.697613 RAD 0.00617284 + txt002 + SPHERE CENTER 0.237756 -0.249439 0.67968 RAD 0.00617284 + txt002 + SPHERE CENTER 0.213509 -0.250236 0.675083 RAD 0.00617284 + txt002 + SPHERE CENTER 0.228589 -0.238098 0.659755 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0058509 -0.451136 0.729516 RAD 0.0555556 + txt002 + SPHERE CENTER 0.0051487 -0.447081 0.803476 RAD 0.0185185 + txt002 + SPHERE CENTER 0.01504 -0.435909 0.823149 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0289993 -0.440694 0.803352 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0115452 -0.423265 0.802231 RAD 0.00617284 + txt002 + SPHERE CENTER -0.00881065 -0.442297 0.823273 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0123054 -0.429652 0.802355 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0187019 -0.453468 0.8036 RAD 0.00617284 + txt002 + SPHERE CENTER 0.00864346 -0.459725 0.824394 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0012478 -0.470897 0.804721 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0226028 -0.46451 0.804597 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0688765 -0.439178 0.766553 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0903221 -0.426942 0.766429 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0806307 -0.435083 0.745229 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0699989 -0.416328 0.757266 RAD 0.00617284 + txt002 + SPHERE CENTER 0.078568 -0.431037 0.787754 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0582447 -0.420423 0.77859 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0571224 -0.443274 0.787878 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0891998 -0.449792 0.775717 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0677542 -0.462029 0.775841 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0795084 -0.457933 0.754517 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0172804 -0.386138 0.763155 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0293677 -0.364644 0.76191 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0401449 -0.385352 0.753867 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0213457 -0.375512 0.741241 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0065032 -0.36543 0.771198 RAD 0.00617284 + txt002 + SPHERE CENTER -0.00151881 -0.376298 0.750529 RAD 0.00617284 + txt002 + SPHERE CENTER -0.00558411 -0.386924 0.772443 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0253024 -0.37527 0.783824 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0132151 -0.396764 0.785069 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0360796 -0.395978 0.775781 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0578769 -0.459039 0.766439 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0707378 -0.451803 0.786236 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0461991 -0.454158 0.787639 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0561039 -0.435761 0.774481 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0824157 -0.456685 0.765035 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0677817 -0.440643 0.753281 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0695548 -0.46392 0.745238 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0725109 -0.475081 0.778193 RAD 0.00617284 + txt002 + SPHERE CENTER -0.05965 -0.482316 0.758396 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0479721 -0.477435 0.779597 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0457452 -0.398096 0.726118 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0495643 -0.373728 0.724997 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0306825 -0.382672 0.738155 RAD 0.00617284 + txt002 + SPHERE CENTER -0.030137 -0.383722 0.713492 RAD 0.00617284 + txt002 + SPHERE CENTER -0.064627 -0.389151 0.71296 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0451997 -0.399146 0.701455 RAD 0.00617284 + txt002 + SPHERE CENTER -0.060808 -0.41352 0.714081 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0651725 -0.388102 0.737623 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0613535 -0.41247 0.738744 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0462908 -0.397047 0.750781 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0571747 -0.463094 0.692479 RAD 0.0185185 + txt002 + SPHERE CENTER -0.081612 -0.459563 0.692603 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0696122 -0.463589 0.713804 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0665888 -0.442243 0.701767 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0691745 -0.459069 0.671279 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0541513 -0.441749 0.680442 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0447373 -0.4626 0.671155 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0721979 -0.480415 0.683315 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0477607 -0.483946 0.683192 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0601982 -0.48444 0.704516 RAD 0.00617284 + txt002 + SPHERE CENTER -0.00628079 -0.512079 0.769837 RAD 0.0185185 + txt002 + SPHERE CENTER -0.000557006 -0.523883 0.790755 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0165974 -0.51057 0.779001 RAD 0.00617284 + txt002 + SPHERE CENTER -0.00208214 -0.49924 0.790506 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0234352 -0.525392 0.781591 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0249603 -0.500749 0.781342 RAD 0.00617284 + txt002 + SPHERE CENTER -0.029159 -0.513588 0.760673 RAD 0.00617284 + txt002 + SPHERE CENTER -0.00475566 -0.536722 0.770086 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0104794 -0.524918 0.749168 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0123987 -0.523409 0.758332 RAD 0.00617284 + txt002 + SPHERE CENTER -0.00557859 -0.516134 0.695877 RAD 0.0185185 + txt002 + SPHERE CENTER -0.00154892 -0.540463 0.697123 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0156462 -0.524673 0.705165 RAD 0.00617284 + txt002 + SPHERE CENTER -0.00538221 -0.52751 0.717791 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0227737 -0.531924 0.687835 RAD 0.00617284 + txt002 + SPHERE CENTER -0.026607 -0.518971 0.708504 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0268034 -0.507596 0.68659 RAD 0.00617284 + txt002 + SPHERE CENTER -0.00174531 -0.529087 0.675209 RAD 0.00617284 + txt002 + SPHERE CENTER -0.00577498 -0.504759 0.673964 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0154498 -0.513298 0.683251 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0574471 -0.504176 0.732914 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0817008 -0.508666 0.734036 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0732807 -0.489545 0.720878 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0722467 -0.488971 0.745541 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0658672 -0.523298 0.746073 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0564131 -0.503602 0.757577 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0416134 -0.518808 0.744951 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0669012 -0.523872 0.72141 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0426474 -0.519382 0.720288 RAD 0.00617284 + txt002 + SPHERE CENTER 0.058481 -0.504751 0.708251 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0483751 -0.248762 0.655442 RAD 0.0555556 + txt002 + SPHERE CENTER -0.0599222 -0.183785 0.689081 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0522053 -0.160406 0.690965 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0358698 -0.178533 0.687193 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0513956 -0.171954 0.669156 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0762577 -0.165658 0.692853 RAD 0.00617284 + txt002 + SPHERE CENTER -0.075448 -0.177206 0.671044 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0839747 -0.189036 0.690969 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0607319 -0.172236 0.71089 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0684488 -0.195615 0.709006 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0443964 -0.190363 0.707118 RAD 0.00617284 + txt002 + SPHERE CENTER 0.00673113 -0.215921 0.692479 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0258737 -0.20044 0.690591 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0203763 -0.215612 0.671903 RAD 0.00617284 + txt002 + SPHERE CENTER 0.00551963 -0.196602 0.677151 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0122285 -0.200749 0.711167 RAD 0.00617284 + txt002 + SPHERE CENTER -0.00812553 -0.196911 0.697727 RAD 0.00617284 + txt002 + SPHERE CENTER -0.00691403 -0.21623 0.713055 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0270852 -0.21976 0.705919 RAD 0.00617284 + txt002 + SPHERE CENTER 0.00794264 -0.235241 0.707807 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0215878 -0.234932 0.687231 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0172857 -0.187119 0.6286 RAD 0.0185185 + txt002 + SPHERE CENTER -0.00705049 -0.176731 0.608675 RAD 0.00617284 + txt002 + SPHERE CENTER -0.00352517 -0.200733 0.613272 RAD 0.00617284 + txt002 + SPHERE CENTER -0.025725 -0.192673 0.60607 RAD 0.00617284 + txt002 + SPHERE CENTER -0.020811 -0.163117 0.624003 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0394855 -0.179058 0.621398 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0310463 -0.173504 0.643928 RAD 0.00617284 + txt002 + SPHERE CENTER 0.00138875 -0.171177 0.631205 RAD 0.00617284 + txt002 + SPHERE CENTER -0.00884647 -0.181564 0.65113 RAD 0.00617284 + txt002 + SPHERE CENTER 0.00491406 -0.195179 0.635801 RAD 0.00617284 + txt002 + SPHERE CENTER -0.115028 -0.216626 0.652044 RAD 0.0185185 + txt002 + SPHERE CENTER -0.127519 -0.195663 0.655816 RAD 0.00617284 + txt002 + SPHERE CENTER -0.108803 -0.201738 0.670732 RAD 0.00617284 + txt002 + SPHERE CENTER -0.104303 -0.194866 0.647447 RAD 0.00617284 + txt002 + SPHERE CENTER -0.133744 -0.210551 0.637128 RAD 0.00617284 + txt002 + SPHERE CENTER -0.110528 -0.209754 0.628759 RAD 0.00617284 + txt002 + SPHERE CENTER -0.121254 -0.231514 0.633356 RAD 0.00617284 + txt002 + SPHERE CENTER -0.138245 -0.217423 0.660413 RAD 0.00617284 + txt002 + SPHERE CENTER -0.125754 -0.238386 0.656641 RAD 0.00617284 + txt002 + SPHERE CENTER -0.119529 -0.223497 0.675329 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0723919 -0.21996 0.591563 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0673141 -0.20388 0.573526 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0609052 -0.198742 0.596811 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0490355 -0.216456 0.584361 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0788008 -0.225098 0.568278 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0605222 -0.237674 0.579113 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0838786 -0.241177 0.586315 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0906706 -0.207384 0.580727 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0957484 -0.223463 0.598764 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0842617 -0.202246 0.604012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.103481 -0.281603 0.618405 RAD 0.0185185 + txt002 + SPHERE CENTER -0.126206 -0.291073 0.620293 RAD 0.00617284 + txt002 + SPHERE CENTER -0.110246 -0.293457 0.638981 RAD 0.00617284 + txt002 + SPHERE CENTER -0.119897 -0.271345 0.633733 RAD 0.00617284 + txt002 + SPHERE CENTER -0.119442 -0.279219 0.599717 RAD 0.00617284 + txt002 + SPHERE CENTER -0.113132 -0.25949 0.613157 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0967168 -0.269749 0.597829 RAD 0.00617284 + txt002 + SPHERE CENTER -0.10979 -0.301332 0.604965 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0870656 -0.291862 0.603077 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0938302 -0.303716 0.623653 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0910116 -0.245428 0.715923 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0942304 -0.234308 0.737733 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0714204 -0.238704 0.729364 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0854464 -0.221514 0.718528 RAD 0.00617284 + txt002 + SPHERE CENTER -0.113822 -0.241032 0.724292 RAD 0.00617284 + txt002 + SPHERE CENTER -0.105038 -0.228237 0.705088 RAD 0.00617284 + txt002 + SPHERE CENTER -0.110603 -0.252152 0.702483 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0997955 -0.258223 0.735128 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0965768 -0.269343 0.713318 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0769856 -0.262619 0.726759 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0794645 -0.310405 0.682285 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0817333 -0.324811 0.702209 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0603366 -0.313378 0.697613 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0800146 -0.300317 0.704814 RAD 0.00617284 + txt002 + SPHERE CENTER -0.100861 -0.321838 0.686881 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0991425 -0.297345 0.689486 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0985923 -0.307433 0.666956 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0811832 -0.334899 0.67968 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0789143 -0.320493 0.659755 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0597864 -0.323466 0.675083 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0243582 -0.277564 0.719322 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0076281 -0.275459 0.737359 RAD 0.00617284 + txt002 + SPHERE CENTER -0.00142185 -0.270078 0.714074 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0167139 -0.255218 0.726523 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0305645 -0.282946 0.742607 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0396503 -0.262704 0.731771 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0472946 -0.285051 0.72457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0152725 -0.297806 0.730157 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0320026 -0.299911 0.71212 RAD 0.00617284 + txt002 + SPHERE CENTER -0.00906621 -0.292425 0.706872 RAD 0.00617284 + txt002 + SPHERE CENTER -0.115031 -0.4293 0.544331 RAD 0.0555556 + txt002 + SPHERE CENTER -0.178985 -0.424299 0.581368 RAD 0.0185185 + txt002 + SPHERE CENTER -0.190929 -0.412497 0.599471 RAD 0.00617284 + txt002 + SPHERE CENTER -0.16674 -0.417001 0.601529 RAD 0.00617284 + txt002 + SPHERE CENTER -0.174844 -0.400273 0.585275 RAD 0.00617284 + txt002 + SPHERE CENTER -0.203175 -0.419795 0.57931 RAD 0.00617284 + txt002 + SPHERE CENTER -0.18709 -0.407571 0.565115 RAD 0.00617284 + txt002 + SPHERE CENTER -0.191231 -0.431597 0.561208 RAD 0.00617284 + txt002 + SPHERE CENTER -0.195071 -0.436523 0.595564 RAD 0.00617284 + txt002 + SPHERE CENTER -0.183127 -0.448325 0.577461 RAD 0.00617284 + txt002 + SPHERE CENTER -0.170881 -0.441027 0.597621 RAD 0.00617284 + txt002 + SPHERE CENTER -0.115031 -0.4293 0.618405 RAD 0.0185185 + txt002 + SPHERE CENTER -0.10495 -0.41922 0.638566 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0911807 -0.42291 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER -0.10864 -0.40545 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER -0.128801 -0.425611 0.638566 RAD 0.00617284 + txt002 + SPHERE CENTER -0.13249 -0.411841 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER -0.138881 -0.435691 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER -0.111341 -0.44307 0.638566 RAD 0.00617284 + txt002 + SPHERE CENTER -0.121421 -0.45315 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0975713 -0.44676 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER -0.131634 -0.367336 0.581368 RAD 0.0185185 + txt002 + SPHERE CENTER -0.12515 -0.343834 0.585275 RAD 0.00617284 + txt002 + SPHERE CENTER -0.107784 -0.360946 0.581368 RAD 0.00617284 + txt002 + SPHERE CENTER -0.122476 -0.353814 0.56285 RAD 0.00617284 + txt002 + SPHERE CENTER -0.149 -0.350225 0.585275 RAD 0.00617284 + txt002 + SPHERE CENTER -0.146326 -0.360204 0.56285 RAD 0.00617284 + txt002 + SPHERE CENTER -0.155484 -0.373727 0.581368 RAD 0.00617284 + txt002 + SPHERE CENTER -0.134308 -0.357357 0.603794 RAD 0.00617284 + txt002 + SPHERE CENTER -0.140792 -0.380859 0.599887 RAD 0.00617284 + txt002 + SPHERE CENTER -0.116942 -0.374468 0.599887 RAD 0.00617284 + txt002 + SPHERE CENTER -0.178985 -0.424299 0.507294 RAD 0.0185185 + txt002 + SPHERE CENTER -0.200165 -0.411775 0.505236 RAD 0.00617284 + txt002 + SPHERE CENTER -0.189948 -0.415187 0.527454 RAD 0.00617284 + txt002 + SPHERE CENTER -0.179342 -0.399922 0.511201 RAD 0.00617284 + txt002 + SPHERE CENTER -0.189202 -0.420888 0.485076 RAD 0.00617284 + txt002 + SPHERE CENTER -0.168379 -0.409035 0.491041 RAD 0.00617284 + txt002 + SPHERE CENTER -0.168023 -0.433412 0.487134 RAD 0.00617284 + txt002 + SPHERE CENTER -0.199808 -0.436152 0.501329 RAD 0.00617284 + txt002 + SPHERE CENTER -0.178629 -0.448677 0.503387 RAD 0.00617284 + txt002 + SPHERE CENTER -0.189591 -0.439564 0.523547 RAD 0.00617284 + txt002 + SPHERE CENTER -0.131634 -0.367336 0.507294 RAD 0.0185185 + txt002 + SPHERE CENTER -0.123305 -0.350719 0.491041 RAD 0.00617284 + txt002 + SPHERE CENTER -0.107784 -0.360946 0.507294 RAD 0.00617284 + txt002 + SPHERE CENTER -0.116942 -0.374468 0.488775 RAD 0.00617284 + txt002 + SPHERE CENTER -0.147155 -0.357109 0.491041 RAD 0.00617284 + txt002 + SPHERE CENTER -0.140792 -0.380859 0.488775 RAD 0.00617284 + txt002 + SPHERE CENTER -0.155484 -0.373727 0.507294 RAD 0.00617284 + txt002 + SPHERE CENTER -0.137998 -0.343587 0.509559 RAD 0.00617284 + txt002 + SPHERE CENTER -0.146326 -0.360204 0.525813 RAD 0.00617284 + txt002 + SPHERE CENTER -0.122476 -0.353814 0.525813 RAD 0.00617284 + txt002 + SPHERE CENTER -0.115031 -0.4293 0.470257 RAD 0.0185185 + txt002 + SPHERE CENTER -0.125111 -0.41922 0.450097 RAD 0.00617284 + txt002 + SPHERE CENTER -0.138881 -0.42291 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER -0.121421 -0.40545 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER -0.101261 -0.425611 0.450097 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0975713 -0.411841 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0911807 -0.435691 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER -0.11872 -0.44307 0.450097 RAD 0.00617284 + txt002 + SPHERE CENTER -0.10864 -0.45315 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER -0.13249 -0.44676 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER -0.162382 -0.486264 0.544331 RAD 0.0185185 + txt002 + SPHERE CENTER -0.174264 -0.502603 0.558526 RAD 0.00617284 + txt002 + SPHERE CENTER -0.15142 -0.495376 0.564491 RAD 0.00617284 + txt002 + SPHERE CENTER -0.170327 -0.479659 0.566757 RAD 0.00617284 + txt002 + SPHERE CENTER -0.185226 -0.49349 0.538366 RAD 0.00617284 + txt002 + SPHERE CENTER -0.18129 -0.470546 0.546597 RAD 0.00617284 + txt002 + SPHERE CENTER -0.173345 -0.477151 0.524171 RAD 0.00617284 + txt002 + SPHERE CENTER -0.166319 -0.509207 0.536101 RAD 0.00617284 + txt002 + SPHERE CENTER -0.154437 -0.492868 0.521905 RAD 0.00617284 + txt002 + SPHERE CENTER -0.143475 -0.501981 0.542066 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0984274 -0.491265 0.507294 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0810612 -0.508376 0.503387 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0745774 -0.484874 0.507294 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0837352 -0.498397 0.525813 RAD 0.00617284 + txt002 + SPHERE CENTER -0.104911 -0.514767 0.503387 RAD 0.00617284 + txt002 + SPHERE CENTER -0.107585 -0.504787 0.525813 RAD 0.00617284 + txt002 + SPHERE CENTER -0.122277 -0.497655 0.507294 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0957534 -0.501244 0.484868 RAD 0.00617284 + txt002 + SPHERE CENTER -0.11312 -0.484132 0.488775 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0892696 -0.477742 0.488775 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0984274 -0.491265 0.581368 RAD 0.0185185 + txt002 + SPHERE CENTER -0.082906 -0.501491 0.597621 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0745774 -0.484874 0.581368 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0892696 -0.477742 0.599887 RAD 0.00617284 + txt002 + SPHERE CENTER -0.106756 -0.507882 0.597621 RAD 0.00617284 + txt002 + SPHERE CENTER -0.11312 -0.484132 0.599887 RAD 0.00617284 + txt002 + SPHERE CENTER -0.122277 -0.497655 0.581368 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0920638 -0.515014 0.579103 RAD 0.00617284 + txt002 + SPHERE CENTER -0.107585 -0.504787 0.56285 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0837352 -0.498397 0.56285 RAD 0.00617284 + txt002 + SPHERE CENTER 0.153845 -0.574159 0.618405 RAD 0.0555556 + txt002 + SPHERE CENTER 0.202534 -0.612768 0.658726 RAD 0.0185185 + txt002 + SPHERE CENTER 0.225282 -0.612732 0.668328 RAD 0.00617284 + txt002 + SPHERE CENTER 0.22113 -0.60221 0.64638 RAD 0.00617284 + txt002 + SPHERE CENTER 0.212428 -0.591695 0.666956 RAD 0.00617284 + txt002 + SPHERE CENTER 0.206686 -0.62329 0.680674 RAD 0.00617284 + txt002 + SPHERE CENTER 0.193832 -0.602253 0.679302 RAD 0.00617284 + txt002 + SPHERE CENTER 0.183939 -0.623325 0.671072 RAD 0.00617284 + txt002 + SPHERE CENTER 0.215388 -0.633805 0.660098 RAD 0.00617284 + txt002 + SPHERE CENTER 0.192641 -0.63384 0.650495 RAD 0.00617284 + txt002 + SPHERE CENTER 0.211236 -0.623283 0.63815 RAD 0.00617284 + txt002 + SPHERE CENTER 0.225396 -0.554987 0.618405 RAD 0.0185185 + txt002 + SPHERE CENTER 0.243024 -0.542885 0.606059 RAD 0.00617284 + txt002 + SPHERE CENTER 0.225396 -0.554987 0.593714 RAD 0.00617284 + txt002 + SPHERE CENTER 0.219861 -0.534333 0.606059 RAD 0.00617284 + txt002 + SPHERE CENTER 0.243024 -0.542885 0.630751 RAD 0.00617284 + txt002 + SPHERE CENTER 0.219861 -0.534333 0.630751 RAD 0.00617284 + txt002 + SPHERE CENTER 0.225396 -0.554987 0.643096 RAD 0.00617284 + txt002 + SPHERE CENTER 0.248559 -0.563539 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER 0.23093 -0.575642 0.630751 RAD 0.00617284 + txt002 + SPHERE CENTER 0.23093 -0.575642 0.606059 RAD 0.00617284 + txt002 + SPHERE CENTER 0.184086 -0.543919 0.678886 RAD 0.0185185 + txt002 + SPHERE CENTER 0.200547 -0.527458 0.687117 RAD 0.00617284 + txt002 + SPHERE CENTER 0.205161 -0.540303 0.666541 RAD 0.00617284 + txt002 + SPHERE CENTER 0.187702 -0.522843 0.666541 RAD 0.00617284 + txt002 + SPHERE CENTER 0.179472 -0.531074 0.699462 RAD 0.00617284 + txt002 + SPHERE CENTER 0.166627 -0.526459 0.678886 RAD 0.00617284 + txt002 + SPHERE CENTER 0.163011 -0.547535 0.691232 RAD 0.00617284 + txt002 + SPHERE CENTER 0.196931 -0.548533 0.699462 RAD 0.00617284 + txt002 + SPHERE CENTER 0.18047 -0.564994 0.691232 RAD 0.00617284 + txt002 + SPHERE CENTER 0.201546 -0.561378 0.678886 RAD 0.00617284 + txt002 + SPHERE CENTER 0.130984 -0.631939 0.658726 RAD 0.0185185 + txt002 + SPHERE CENTER 0.132649 -0.643128 0.680674 RAD 0.00617284 + txt002 + SPHERE CENTER 0.152367 -0.631785 0.671072 RAD 0.00617284 + txt002 + SPHERE CENTER 0.133263 -0.618482 0.679302 RAD 0.00617284 + txt002 + SPHERE CENTER 0.111266 -0.643283 0.668328 RAD 0.00617284 + txt002 + SPHERE CENTER 0.11188 -0.618637 0.666956 RAD 0.00617284 + txt002 + SPHERE CENTER 0.109601 -0.632094 0.64638 RAD 0.00617284 + txt002 + SPHERE CENTER 0.130371 -0.656585 0.660098 RAD 0.00617284 + txt002 + SPHERE CENTER 0.128706 -0.645397 0.63815 RAD 0.00617284 + txt002 + SPHERE CENTER 0.150088 -0.645242 0.650495 RAD 0.00617284 + txt002 + SPHERE CENTER 0.112536 -0.56309 0.678886 RAD 0.0185185 + txt002 + SPHERE CENTER 0.11011 -0.549659 0.699462 RAD 0.00617284 + txt002 + SPHERE CENTER 0.132596 -0.555684 0.691232 RAD 0.00617284 + txt002 + SPHERE CENTER 0.118927 -0.53924 0.678886 RAD 0.00617284 + txt002 + SPHERE CENTER 0.09005 -0.557065 0.687117 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0988668 -0.546646 0.666541 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0924762 -0.570497 0.666541 RAD 0.00617284 + txt002 + SPHERE CENTER 0.103719 -0.573509 0.699462 RAD 0.00617284 + txt002 + SPHERE CENTER 0.106145 -0.58694 0.678886 RAD 0.00617284 + txt002 + SPHERE CENTER 0.126205 -0.579534 0.691232 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0822954 -0.593331 0.618405 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0609772 -0.591664 0.630751 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0822954 -0.593331 0.643096 RAD 0.00617284 + txt002 + SPHERE CENTER 0.076761 -0.572676 0.630751 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0609772 -0.591664 0.606059 RAD 0.00617284 + txt002 + SPHERE CENTER 0.076761 -0.572676 0.606059 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0822954 -0.593331 0.593714 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0665116 -0.612319 0.618405 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0878298 -0.613986 0.606059 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0878298 -0.613986 0.630751 RAD 0.00617284 + txt002 + SPHERE CENTER 0.172294 -0.643008 0.598245 RAD 0.0185185 + txt002 + SPHERE CENTER 0.189742 -0.660425 0.599616 RAD 0.00617284 + txt002 + SPHERE CENTER 0.196144 -0.636618 0.598245 RAD 0.00617284 + txt002 + SPHERE CENTER 0.185725 -0.645434 0.618821 RAD 0.00617284 + txt002 + SPHERE CENTER 0.165892 -0.666816 0.599616 RAD 0.00617284 + txt002 + SPHERE CENTER 0.161875 -0.651825 0.618821 RAD 0.00617284 + txt002 + SPHERE CENTER 0.148444 -0.649399 0.598245 RAD 0.00617284 + txt002 + SPHERE CENTER 0.17631 -0.657999 0.57904 RAD 0.00617284 + txt002 + SPHERE CENTER 0.158862 -0.640582 0.577669 RAD 0.00617284 + txt002 + SPHERE CENTER 0.182712 -0.634191 0.577669 RAD 0.00617284 + txt002 + SPHERE CENTER 0.123605 -0.6044 0.557924 RAD 0.0185185 + txt002 + SPHERE CENTER 0.107144 -0.620861 0.549693 RAD 0.00617284 + txt002 + SPHERE CENTER 0.119989 -0.625475 0.57027 RAD 0.00617284 + txt002 + SPHERE CENTER 0.102529 -0.608016 0.57027 RAD 0.00617284 + txt002 + SPHERE CENTER 0.11076 -0.599785 0.537348 RAD 0.00617284 + txt002 + SPHERE CENTER 0.106145 -0.58694 0.557924 RAD 0.00617284 + txt002 + SPHERE CENTER 0.127221 -0.583324 0.545578 RAD 0.00617284 + txt002 + SPHERE CENTER 0.128219 -0.617245 0.537348 RAD 0.00617284 + txt002 + SPHERE CENTER 0.14468 -0.600784 0.545578 RAD 0.00617284 + txt002 + SPHERE CENTER 0.141064 -0.621859 0.557924 RAD 0.00617284 + txt002 + SPHERE CENTER 0.195155 -0.585228 0.557924 RAD 0.0185185 + txt002 + SPHERE CENTER 0.203972 -0.574809 0.537348 RAD 0.00617284 + txt002 + SPHERE CENTER 0.181486 -0.568784 0.545578 RAD 0.00617284 + txt002 + SPHERE CENTER 0.201546 -0.561378 0.557924 RAD 0.00617284 + txt002 + SPHERE CENTER 0.217641 -0.591253 0.549693 RAD 0.00617284 + txt002 + SPHERE CENTER 0.215215 -0.577822 0.57027 RAD 0.00617284 + txt002 + SPHERE CENTER 0.208824 -0.601672 0.57027 RAD 0.00617284 + txt002 + SPHERE CENTER 0.197581 -0.598659 0.537348 RAD 0.00617284 + txt002 + SPHERE CENTER 0.188764 -0.609078 0.557924 RAD 0.00617284 + txt002 + SPHERE CENTER 0.175095 -0.592634 0.545578 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0329639 -0.552323 0.43322 RAD 0.0555556 + txt002 + SPHERE CENTER 0.0248832 -0.625877 0.436618 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0316054 -0.646362 0.448652 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0478 -0.627981 0.445566 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0287309 -0.625173 0.460998 RAD 0.00617284 + txt002 + SPHERE CENTER 0.00868865 -0.644258 0.439705 RAD 0.00617284 + txt002 + SPHERE CENTER 0.00581415 -0.623069 0.45205 RAD 0.00617284 + txt002 + SPHERE CENTER 0.00196644 -0.623773 0.427671 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0277577 -0.647066 0.424272 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0210355 -0.62658 0.412239 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0439523 -0.628685 0.421186 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0822954 -0.593331 0.470257 RAD 0.0185185 + txt002 + SPHERE CENTER 0.105299 -0.593994 0.479204 RAD 0.00617284 + txt002 + SPHERE CENTER 0.100664 -0.582384 0.457911 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0926585 -0.572783 0.479204 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0869303 -0.604941 0.49155 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0742898 -0.58373 0.49155 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0639267 -0.604278 0.482603 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0949359 -0.614541 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0719323 -0.613879 0.46131 RAD 0.00617284 + txt002 + SPHERE CENTER 0.090301 -0.602932 0.448964 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0138144 -0.584567 0.497099 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0177119 -0.584898 0.521479 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0364224 -0.580268 0.506047 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0185345 -0.56353 0.509133 RAD 0.00617284 + txt002 + SPHERE CENTER -0.00489609 -0.589197 0.512531 RAD 0.00617284 + txt002 + SPHERE CENTER -0.00407348 -0.567829 0.500186 RAD 0.00617284 + txt002 + SPHERE CENTER -0.00879364 -0.588867 0.488152 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0129918 -0.605935 0.509445 RAD 0.00617284 + txt002 + SPHERE CENTER 0.00909422 -0.605605 0.485065 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0317022 -0.601305 0.494013 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0244483 -0.584869 0.399581 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0473753 -0.5935 0.402668 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0308315 -0.595617 0.420874 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0399691 -0.57344 0.415013 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0409921 -0.582752 0.381374 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0335859 -0.562692 0.39372 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0180651 -0.574121 0.378288 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0318545 -0.604929 0.387235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.00892756 -0.596298 0.384149 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0153107 -0.607046 0.405442 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0355172 -0.54356 0.460062 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0495897 -0.530389 0.475494 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0261165 -0.53532 0.481355 RAD 0.00617284 + txt002 + SPHERE CENTER -0.031221 -0.519442 0.463149 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0589904 -0.538628 0.454201 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0406217 -0.527681 0.441856 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0449178 -0.551799 0.438769 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0538859 -0.554507 0.472408 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0398133 -0.567678 0.456976 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0304127 -0.559438 0.478269 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0163676 -0.511316 0.396183 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0212225 -0.48882 0.387235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.00896145 -0.491256 0.408529 RAD 0.00617284 + txt002 + SPHERE CENTER 0.00194055 -0.497372 0.387235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0286287 -0.50888 0.37489 RAD 0.00617284 + txt002 + SPHERE CENTER -0.00546563 -0.517432 0.37489 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0237738 -0.531375 0.383837 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0395307 -0.502764 0.396183 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0346758 -0.525259 0.40513 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0272696 -0.505199 0.417476 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0440327 -0.593633 0.372739 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0604766 -0.607302 0.360393 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0678827 -0.587242 0.372739 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0604766 -0.607302 0.385084 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0366265 -0.613693 0.360393 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0366265 -0.613693 0.385084 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0201827 -0.600023 0.372739 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0440327 -0.593633 0.348047 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0275889 -0.579964 0.360393 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0514389 -0.573573 0.360393 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0521134 -0.520079 0.369341 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0542684 -0.523344 0.344961 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0591566 -0.541988 0.360393 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0358996 -0.534291 0.357307 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0472252 -0.501435 0.353908 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0288565 -0.512382 0.366254 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0450702 -0.49817 0.378288 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0704822 -0.509132 0.356995 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0683272 -0.505868 0.381374 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0753703 -0.527777 0.372427 RAD 0.00617284 + txt002 + SPHERE CENTER 0.101445 -0.561087 0.406378 RAD 0.0185185 + txt002 + SPHERE CENTER 0.118381 -0.551884 0.390945 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0944221 -0.550745 0.385084 RAD 0.00617284 + txt002 + SPHERE CENTER 0.103361 -0.536664 0.403291 RAD 0.00617284 + txt002 + SPHERE CENTER 0.125404 -0.562225 0.412239 RAD 0.00617284 + txt002 + SPHERE CENTER 0.110383 -0.547006 0.424584 RAD 0.00617284 + txt002 + SPHERE CENTER 0.108468 -0.571428 0.427671 RAD 0.00617284 + txt002 + SPHERE CENTER 0.116465 -0.576307 0.394032 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0995293 -0.58551 0.409464 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0925065 -0.575168 0.388171 RAD 0.00617284 + txt002 + SPHERE CENTER 0.247614 -0.494808 0.43322 RAD 0.0555556 + txt002 + SPHERE CENTER 0.313607 -0.494287 0.399581 RAD 0.0185185 + txt002 + SPHERE CENTER 0.326876 -0.484182 0.381374 RAD 0.00617284 + txt002 + SPHERE CENTER 0.302705 -0.488171 0.378288 RAD 0.00617284 + txt002 + SPHERE CENTER 0.310432 -0.470513 0.39372 RAD 0.00617284 + txt002 + SPHERE CENTER 0.337778 -0.490299 0.402668 RAD 0.00617284 + txt002 + SPHERE CENTER 0.321334 -0.476629 0.415013 RAD 0.00617284 + txt002 + SPHERE CENTER 0.324509 -0.500404 0.420874 RAD 0.00617284 + txt002 + SPHERE CENTER 0.330051 -0.507957 0.387235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.316783 -0.518062 0.405442 RAD 0.00617284 + txt002 + SPHERE CENTER 0.305881 -0.511946 0.384149 RAD 0.00617284 + txt002 + SPHERE CENTER 0.269833 -0.434629 0.396183 RAD 0.0185185 + txt002 + SPHERE CENTER 0.279233 -0.426389 0.37489 RAD 0.00617284 + txt002 + SPHERE CENTER 0.286276 -0.448298 0.383837 RAD 0.00617284 + txt002 + SPHERE CENTER 0.263449 -0.445377 0.37489 RAD 0.00617284 + txt002 + SPHERE CENTER 0.262789 -0.41272 0.387235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.247006 -0.431707 0.387235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.253389 -0.420959 0.408529 RAD 0.00617284 + txt002 + SPHERE CENTER 0.285616 -0.415641 0.396183 RAD 0.00617284 + txt002 + SPHERE CENTER 0.276216 -0.42388 0.417476 RAD 0.00617284 + txt002 + SPHERE CENTER 0.29266 -0.43755 0.40513 RAD 0.00617284 + txt002 + SPHERE CENTER 0.302539 -0.452978 0.460062 RAD 0.0185185 + txt002 + SPHERE CENTER 0.320401 -0.436971 0.454201 RAD 0.00617284 + txt002 + SPHERE CENTER 0.3148 -0.455413 0.438769 RAD 0.00617284 + txt002 + SPHERE CENTER 0.29902 -0.436675 0.441856 RAD 0.00617284 + txt002 + SPHERE CENTER 0.30814 -0.434535 0.475494 RAD 0.00617284 + txt002 + SPHERE CENTER 0.286759 -0.434239 0.463149 RAD 0.00617284 + txt002 + SPHERE CENTER 0.290278 -0.450543 0.481355 RAD 0.00617284 + txt002 + SPHERE CENTER 0.32392 -0.453274 0.472408 RAD 0.00617284 + txt002 + SPHERE CENTER 0.306057 -0.469281 0.478269 RAD 0.00617284 + txt002 + SPHERE CENTER 0.318318 -0.471717 0.456976 RAD 0.00617284 + txt002 + SPHERE CENTER 0.291389 -0.554467 0.436618 RAD 0.0185185 + txt002 + SPHERE CENTER 0.314604 -0.562288 0.439705 RAD 0.00617284 + txt002 + SPHERE CENTER 0.310183 -0.541186 0.427671 RAD 0.00617284 + txt002 + SPHERE CENTER 0.306499 -0.542501 0.45205 RAD 0.00617284 + txt002 + SPHERE CENTER 0.29581 -0.575569 0.448652 RAD 0.00617284 + txt002 + SPHERE CENTER 0.287705 -0.555781 0.460998 RAD 0.00617284 + txt002 + SPHERE CENTER 0.272595 -0.567748 0.445566 RAD 0.00617284 + txt002 + SPHERE CENTER 0.299494 -0.574255 0.424272 RAD 0.00617284 + txt002 + SPHERE CENTER 0.276279 -0.566433 0.421186 RAD 0.00617284 + txt002 + SPHERE CENTER 0.295073 -0.553152 0.412239 RAD 0.00617284 + txt002 + SPHERE CENTER 0.28032 -0.513157 0.497099 RAD 0.0185185 + txt002 + SPHERE CENTER 0.298839 -0.507811 0.512531 RAD 0.00617284 + txt002 + SPHERE CENTER 0.302049 -0.505577 0.488152 RAD 0.00617284 + txt002 + SPHERE CENTER 0.287442 -0.489718 0.500186 RAD 0.00617284 + txt002 + SPHERE CENTER 0.27711 -0.515392 0.521479 RAD 0.00617284 + txt002 + SPHERE CENTER 0.265714 -0.497299 0.509133 RAD 0.00617284 + txt002 + SPHERE CENTER 0.258591 -0.520738 0.506047 RAD 0.00617284 + txt002 + SPHERE CENTER 0.291716 -0.531251 0.509445 RAD 0.00617284 + txt002 + SPHERE CENTER 0.273198 -0.536597 0.494013 RAD 0.00617284 + txt002 + SPHERE CENTER 0.294927 -0.529016 0.485065 RAD 0.00617284 + txt002 + SPHERE CENTER 0.225396 -0.554987 0.470257 RAD 0.0185185 + txt002 + SPHERE CENTER 0.227186 -0.567359 0.49155 RAD 0.00617284 + txt002 + SPHERE CENTER 0.246777 -0.555283 0.482603 RAD 0.00617284 + txt002 + SPHERE CENTER 0.227528 -0.54267 0.49155 RAD 0.00617284 + txt002 + SPHERE CENTER 0.205805 -0.567063 0.479204 RAD 0.00617284 + txt002 + SPHERE CENTER 0.206147 -0.542374 0.479204 RAD 0.00617284 + txt002 + SPHERE CENTER 0.204014 -0.554691 0.457911 RAD 0.00617284 + txt002 + SPHERE CENTER 0.225054 -0.579676 0.470257 RAD 0.00617284 + txt002 + SPHERE CENTER 0.223263 -0.567305 0.448964 RAD 0.00617284 + txt002 + SPHERE CENTER 0.244644 -0.567601 0.46131 RAD 0.00617284 + txt002 + SPHERE CENTER 0.258683 -0.536117 0.372739 RAD 0.0185185 + txt002 + SPHERE CENTER 0.275127 -0.549787 0.360393 RAD 0.00617284 + txt002 + SPHERE CENTER 0.282533 -0.529727 0.372739 RAD 0.00617284 + txt002 + SPHERE CENTER 0.275127 -0.549787 0.385084 RAD 0.00617284 + txt002 + SPHERE CENTER 0.251277 -0.556177 0.360393 RAD 0.00617284 + txt002 + SPHERE CENTER 0.251277 -0.556177 0.385084 RAD 0.00617284 + txt002 + SPHERE CENTER 0.234833 -0.542508 0.372739 RAD 0.00617284 + txt002 + SPHERE CENTER 0.258683 -0.536117 0.348047 RAD 0.00617284 + txt002 + SPHERE CENTER 0.242239 -0.522448 0.360393 RAD 0.00617284 + txt002 + SPHERE CENTER 0.266089 -0.516058 0.360393 RAD 0.00617284 + txt002 + SPHERE CENTER 0.19269 -0.536638 0.406378 RAD 0.0185185 + txt002 + SPHERE CENTER 0.17251 -0.549603 0.412239 RAD 0.00617284 + txt002 + SPHERE CENTER 0.191778 -0.549105 0.427671 RAD 0.00617284 + txt002 + SPHERE CENTER 0.177908 -0.528912 0.424584 RAD 0.00617284 + txt002 + SPHERE CENTER 0.173421 -0.537136 0.390945 RAD 0.00617284 + txt002 + SPHERE CENTER 0.178819 -0.516445 0.403291 RAD 0.00617284 + txt002 + SPHERE CENTER 0.193601 -0.524171 0.385084 RAD 0.00617284 + txt002 + SPHERE CENTER 0.187292 -0.557329 0.394032 RAD 0.00617284 + txt002 + SPHERE CENTER 0.207471 -0.544363 0.388171 RAD 0.00617284 + txt002 + SPHERE CENTER 0.20656 -0.556831 0.409464 RAD 0.00617284 + txt002 + SPHERE CENTER 0.214908 -0.476459 0.369341 RAD 0.0185185 + txt002 + SPHERE CENTER 0.209819 -0.457868 0.353908 RAD 0.00617284 + txt002 + SPHERE CENTER 0.210053 -0.453963 0.378288 RAD 0.00617284 + txt002 + SPHERE CENTER 0.2312 -0.458164 0.366254 RAD 0.00617284 + txt002 + SPHERE CENTER 0.214674 -0.480363 0.344961 RAD 0.00617284 + txt002 + SPHERE CENTER 0.236055 -0.480659 0.357307 RAD 0.00617284 + txt002 + SPHERE CENTER 0.219763 -0.498954 0.360393 RAD 0.00617284 + txt002 + SPHERE CENTER 0.193527 -0.476163 0.356995 RAD 0.00617284 + txt002 + SPHERE CENTER 0.198616 -0.494753 0.372427 RAD 0.00617284 + txt002 + SPHERE CENTER 0.193761 -0.472258 0.381374 RAD 0.00617284 + txt002 + SPHERE CENTER -0.172546 -0.643951 1.11022e-16 RAD 0.166667 + txt002 + SPHERE CENTER -0.157543 -0.835815 0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER -0.122136 -0.871646 0.165419 RAD 0.0185185 + txt002 + SPHERE CENTER -0.102403 -0.871334 0.180258 RAD 0.00617284 + txt002 + SPHERE CENTER -0.100577 -0.862937 0.157111 RAD 0.00617284 + txt002 + SPHERE CENTER -0.113406 -0.850164 0.173902 RAD 0.00617284 + txt002 + SPHERE CENTER -0.123961 -0.880044 0.188567 RAD 0.00617284 + txt002 + SPHERE CENTER -0.134964 -0.858873 0.182211 RAD 0.00617284 + txt002 + SPHERE CENTER -0.143694 -0.880356 0.173728 RAD 0.00617284 + txt002 + SPHERE CENTER -0.111133 -0.892817 0.171776 RAD 0.00617284 + txt002 + SPHERE CENTER -0.130866 -0.893129 0.156937 RAD 0.00617284 + txt002 + SPHERE CENTER -0.109307 -0.884419 0.148628 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0854653 -0.82339 0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0654286 -0.811594 0.114524 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0820122 -0.820516 0.0985541 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0876595 -0.80102 0.112614 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0688817 -0.814468 0.138803 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0911125 -0.803895 0.136894 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0889183 -0.826265 0.147112 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0632344 -0.833964 0.124743 RAD 0.00617284 + txt002 + SPHERE CENTER -0.083271 -0.845761 0.133052 RAD 0.00617284 + txt002 + SPHERE CENTER -0.079818 -0.842886 0.108773 RAD 0.00617284 + txt002 + SPHERE CENTER -0.135649 -0.799077 0.171592 RAD 0.0185185 + txt002 + SPHERE CENTER -0.120908 -0.781177 0.180075 RAD 0.00617284 + txt002 + SPHERE CENTER -0.113462 -0.795477 0.161374 RAD 0.00617284 + txt002 + SPHERE CENTER -0.13149 -0.778973 0.157875 RAD 0.00617284 + txt002 + SPHERE CENTER -0.143095 -0.784778 0.190293 RAD 0.00617284 + txt002 + SPHERE CENTER -0.153678 -0.782573 0.168094 RAD 0.00617284 + txt002 + SPHERE CENTER -0.157836 -0.802678 0.181811 RAD 0.00617284 + txt002 + SPHERE CENTER -0.125067 -0.801282 0.193792 RAD 0.00617284 + txt002 + SPHERE CENTER -0.139808 -0.819182 0.18531 RAD 0.00617284 + txt002 + SPHERE CENTER -0.11762 -0.815582 0.175091 RAD 0.00617284 + txt002 + SPHERE CENTER -0.194213 -0.884071 0.153697 RAD 0.0185185 + txt002 + SPHERE CENTER -0.197746 -0.891905 0.176845 RAD 0.00617284 + txt002 + SPHERE CENTER -0.175383 -0.884286 0.169668 RAD 0.00617284 + txt002 + SPHERE CENTER -0.193701 -0.867957 0.172398 RAD 0.00617284 + txt002 + SPHERE CENTER -0.216576 -0.89169 0.160875 RAD 0.00617284 + txt002 + SPHERE CENTER -0.212531 -0.867741 0.156428 RAD 0.00617284 + txt002 + SPHERE CENTER -0.213043 -0.883856 0.137727 RAD 0.00617284 + txt002 + SPHERE CENTER -0.198259 -0.908019 0.158144 RAD 0.00617284 + txt002 + SPHERE CENTER -0.194726 -0.900186 0.134996 RAD 0.00617284 + txt002 + SPHERE CENTER -0.175896 -0.900401 0.150967 RAD 0.00617284 + txt002 + SPHERE CENTER -0.207727 -0.811502 0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER -0.212743 -0.794108 0.176661 RAD 0.00617284 + txt002 + SPHERE CENTER -0.189621 -0.802328 0.173931 RAD 0.00617284 + txt002 + SPHERE CENTER -0.199907 -0.788345 0.156372 RAD 0.00617284 + txt002 + SPHERE CENTER -0.230849 -0.803282 0.162601 RAD 0.00617284 + txt002 + SPHERE CENTER -0.218012 -0.797518 0.142311 RAD 0.00617284 + txt002 + SPHERE CENTER -0.225832 -0.820676 0.14581 RAD 0.00617284 + txt002 + SPHERE CENTER -0.220563 -0.817265 0.18016 RAD 0.00617284 + txt002 + SPHERE CENTER -0.215547 -0.83466 0.163369 RAD 0.00617284 + txt002 + SPHERE CENTER -0.197441 -0.825486 0.177429 RAD 0.00617284 + txt002 + SPHERE CENTER -0.229621 -0.84824 0.099389 RAD 0.0185185 + txt002 + SPHERE CENTER -0.25245 -0.843832 0.107698 RAD 0.00617284 + txt002 + SPHERE CENTER -0.233837 -0.846687 0.123668 RAD 0.00617284 + txt002 + SPHERE CENTER -0.235043 -0.826426 0.109608 RAD 0.00617284 + txt002 + SPHERE CENTER -0.248234 -0.845385 0.0834188 RAD 0.00617284 + txt002 + SPHERE CENTER -0.230827 -0.827978 0.0853287 RAD 0.00617284 + txt002 + SPHERE CENTER -0.225404 -0.849792 0.0751099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.247028 -0.865646 0.0974792 RAD 0.00617284 + txt002 + SPHERE CENTER -0.224198 -0.870053 0.0891702 RAD 0.00617284 + txt002 + SPHERE CENTER -0.228415 -0.868501 0.113449 RAD 0.00617284 + txt002 + SPHERE CENTER -0.14403 -0.908384 0.104938 RAD 0.0185185 + txt002 + SPHERE CENTER -0.128672 -0.926643 0.111295 RAD 0.00617284 + txt002 + SPHERE CENTER -0.1198 -0.904034 0.106848 RAD 0.00617284 + txt002 + SPHERE CENTER -0.133221 -0.90826 0.127138 RAD 0.00617284 + txt002 + SPHERE CENTER -0.152902 -0.930993 0.109385 RAD 0.00617284 + txt002 + SPHERE CENTER -0.157451 -0.912609 0.125228 RAD 0.00617284 + txt002 + SPHERE CENTER -0.16826 -0.912733 0.103028 RAD 0.00617284 + txt002 + SPHERE CENTER -0.139481 -0.926768 0.0890951 RAD 0.00617284 + txt002 + SPHERE CENTER -0.154838 -0.908508 0.0827387 RAD 0.00617284 + txt002 + SPHERE CENTER -0.130608 -0.904159 0.0846485 RAD 0.00617284 + txt002 + SPHERE CENTER -0.179437 -0.872552 0.0506299 RAD 0.0185185 + txt002 + SPHERE CENTER -0.188167 -0.894035 0.0421477 RAD 0.00617284 + txt002 + SPHERE CENTER -0.172046 -0.89378 0.0608487 RAD 0.00617284 + txt002 + SPHERE CENTER -0.195141 -0.885777 0.0643473 RAD 0.00617284 + txt002 + SPHERE CENTER -0.195558 -0.872807 0.0319289 RAD 0.00617284 + txt002 + SPHERE CENTER -0.202532 -0.864549 0.0541285 RAD 0.00617284 + txt002 + SPHERE CENTER -0.186828 -0.851325 0.0404111 RAD 0.00617284 + txt002 + SPHERE CENTER -0.172463 -0.880811 0.0284303 RAD 0.00617284 + txt002 + SPHERE CENTER -0.163733 -0.859328 0.0369125 RAD 0.00617284 + txt002 + SPHERE CENTER -0.156342 -0.880556 0.0471312 RAD 0.00617284 + txt002 + SPHERE CENTER -0.107359 -0.860128 0.062352 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0905999 -0.853284 0.0455609 RAD 0.00617284 + txt002 + SPHERE CENTER -0.111382 -0.840233 0.0482916 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0940331 -0.839638 0.0658506 RAD 0.00617284 + txt002 + SPHERE CENTER -0.086577 -0.873178 0.0596212 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0900102 -0.859532 0.079911 RAD 0.00617284 + txt002 + SPHERE CENTER -0.103336 -0.880022 0.0764123 RAD 0.00617284 + txt002 + SPHERE CENTER -0.103926 -0.873773 0.0420622 RAD 0.00617284 + txt002 + SPHERE CENTER -0.120685 -0.880618 0.0588533 RAD 0.00617284 + txt002 + SPHERE CENTER -0.124708 -0.860723 0.044793 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0133465 -0.69376 0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER 0.0838533 -0.674309 0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER 0.103063 -0.66171 0.113782 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0876683 -0.673446 0.0984536 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0800983 -0.653258 0.110488 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0992478 -0.662574 0.138161 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0762832 -0.654121 0.134867 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0800382 -0.675172 0.147213 RAD 0.00617284 + txt002 + SPHERE CENTER 0.106818 -0.682761 0.126127 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0876083 -0.69536 0.135179 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0914233 -0.694497 0.110799 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0539145 -0.666287 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0547519 -0.662466 0.031176 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0439578 -0.682791 0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0332597 -0.660752 0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0647085 -0.645962 0.0466081 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0432164 -0.644249 0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0638711 -0.649783 0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0754066 -0.668 0.0435217 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0745692 -0.671821 0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0646126 -0.688325 0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0325183 -0.62221 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0446211 -0.604582 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.053173 -0.627745 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0325183 -0.62221 0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0239663 -0.599047 0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0118635 -0.616676 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0118635 -0.616676 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0446211 -0.604582 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0325183 -0.62221 0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER 0.053173 -0.627745 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0432853 -0.701782 0.178389 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0608821 -0.693716 0.193717 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0652402 -0.694884 0.169441 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0496759 -0.677932 0.178389 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0389272 -0.700615 0.202664 RAD 0.00617284 + txt002 + SPHERE CENTER 0.027721 -0.684831 0.187336 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0213304 -0.708681 0.187336 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0544915 -0.717566 0.193717 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0368947 -0.725632 0.178389 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0588496 -0.718734 0.169441 RAD 0.00617284 + txt002 + SPHERE CENTER -0.00804971 -0.649684 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.00328338 -0.628657 0.178701 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0152909 -0.642244 0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER 0.000378614 -0.630031 0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER -0.026624 -0.636097 0.175614 RAD 0.00617284 + txt002 + SPHERE CENTER -0.022962 -0.637471 0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0313903 -0.657124 0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0117117 -0.648309 0.191046 RAD 0.00617284 + txt002 + SPHERE CENTER -0.016478 -0.669336 0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.00686255 -0.661896 0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0272215 -0.721234 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0310802 -0.720593 0.191046 RAD 0.00617284 + txt002 + SPHERE CENTER -0.00820099 -0.718114 0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0246945 -0.7 0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0501007 -0.723713 0.175614 RAD 0.00617284 + txt002 + SPHERE CENTER -0.043715 -0.70312 0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.046242 -0.724354 0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0336072 -0.741827 0.178701 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0297485 -0.742467 0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER -0.010728 -0.739347 0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0646815 -0.745859 0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0887955 -0.750021 0.126127 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0813312 -0.732161 0.110799 RAD 0.00617284 + txt002 + SPHERE CENTER 0.078459 -0.729506 0.135179 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0721458 -0.763719 0.138161 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0618093 -0.743204 0.147213 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0480318 -0.759557 0.134867 RAD 0.00617284 + txt002 + SPHERE CENTER 0.075018 -0.766375 0.113782 RAD 0.00617284 + txt002 + SPHERE CENTER 0.050904 -0.762212 0.110488 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0675537 -0.748514 0.0984536 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0058253 -0.76531 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.00415829 -0.786629 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0148294 -0.770845 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0058253 -0.76531 0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER -0.024813 -0.781094 0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER -0.02648 -0.759776 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.02648 -0.759776 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.00415829 -0.786629 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0058253 -0.76531 0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0148294 -0.770845 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0347427 -0.737837 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0542122 -0.747099 0.0435217 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0550267 -0.7241 0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0553974 -0.743371 0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0339282 -0.760836 0.0466081 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0351134 -0.757108 0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0144587 -0.751574 0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0335575 -0.741565 0.031176 RAD 0.00617284 + txt002 + SPHERE CENTER 0.014088 -0.732303 0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0343719 -0.718566 0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.172546 -0.643951 0.222222 RAD 0.0555556 + txt002 + SPHERE CENTER -0.142305 -0.61371 0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER -0.125845 -0.597249 0.290934 RAD 0.00617284 + txt002 + SPHERE CENTER -0.12123 -0.610094 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.138689 -0.592635 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.14692 -0.600865 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER -0.159765 -0.596251 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER -0.163381 -0.617326 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER -0.12946 -0.618324 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER -0.145921 -0.634785 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER -0.124846 -0.631169 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER -0.100996 -0.624779 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0833673 -0.612676 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.100996 -0.624779 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER -0.10653 -0.604124 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0833673 -0.612676 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.10653 -0.604124 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.100996 -0.624779 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0778329 -0.633331 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0954616 -0.645433 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0954616 -0.645433 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.153374 -0.5724 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.141271 -0.554772 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.13272 -0.577935 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.153374 -0.5724 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER -0.161926 -0.549237 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.174029 -0.566866 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.174029 -0.566866 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.141271 -0.554772 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.153374 -0.5724 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER -0.13272 -0.577935 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.213855 -0.632882 0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER -0.216282 -0.61945 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER -0.193796 -0.625476 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER -0.207465 -0.609032 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER -0.236341 -0.626857 0.290934 RAD 0.00617284 + txt002 + SPHERE CENTER -0.227525 -0.616438 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.233915 -0.640288 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.222672 -0.6433 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER -0.220246 -0.656732 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER -0.200186 -0.649326 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER -0.224924 -0.591572 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.2291 -0.567237 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.209804 -0.576452 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.209804 -0.576452 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.24422 -0.582357 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.224924 -0.591572 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER -0.240045 -0.606693 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.24422 -0.582357 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.240045 -0.606693 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.224924 -0.591572 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER -0.244096 -0.663122 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.265414 -0.661455 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.244096 -0.663122 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER -0.249631 -0.642468 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.265414 -0.661455 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.249631 -0.642468 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.244096 -0.663122 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER -0.25988 -0.68211 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.238562 -0.683777 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.238562 -0.683777 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.161477 -0.68526 0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER -0.148046 -0.687686 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER -0.137627 -0.678869 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER -0.154071 -0.6652 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER -0.171896 -0.694077 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER -0.177921 -0.671591 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER -0.185327 -0.691651 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER -0.155452 -0.707746 0.290934 RAD 0.00617284 + txt002 + SPHERE CENTER -0.168883 -0.70532 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.145033 -0.698929 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.191718 -0.715501 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.190051 -0.736819 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.171063 -0.721035 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.191718 -0.715501 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER -0.210706 -0.731284 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.212373 -0.709966 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.212373 -0.709966 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.190051 -0.736819 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.191718 -0.715501 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER -0.171063 -0.721035 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.120168 -0.696329 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.095832 -0.700504 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.105047 -0.681209 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.105047 -0.681209 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.110952 -0.715624 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.120168 -0.696329 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER -0.135288 -0.711449 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER -0.110952 -0.715624 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.135288 -0.711449 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.120168 -0.696329 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER -0.343435 -0.786005 8.51251e-17 RAD 0.0555556 + txt002 + SPHERE CENTER -0.392454 -0.82165 0.0425863 RAD 0.0185185 + txt002 + SPHERE CENTER -0.400556 -0.824791 0.065698 RAD 0.00617284 + txt002 + SPHERE CENTER -0.376528 -0.821021 0.0614442 RAD 0.00617284 + txt002 + SPHERE CENTER -0.392663 -0.802599 0.058292 RAD 0.00617284 + txt002 + SPHERE CENTER -0.416482 -0.82542 0.0468401 RAD 0.00617284 + txt002 + SPHERE CENTER -0.408589 -0.803228 0.0394341 RAD 0.00617284 + txt002 + SPHERE CENTER -0.40838 -0.822279 0.0237283 RAD 0.00617284 + txt002 + SPHERE CENTER -0.400347 -0.843843 0.0499923 RAD 0.00617284 + txt002 + SPHERE CENTER -0.392245 -0.840701 0.0268805 RAD 0.00617284 + txt002 + SPHERE CENTER -0.376319 -0.840073 0.0457385 RAD 0.00617284 + txt002 + SPHERE CENTER -0.323622 -0.80984 0.0672777 RAD 0.0185185 + txt002 + SPHERE CENTER -0.308073 -0.80634 0.0861356 RAD 0.00617284 + txt002 + SPHERE CENTER -0.300378 -0.802721 0.0629546 RAD 0.00617284 + txt002 + SPHERE CENTER -0.316395 -0.786996 0.0732426 RAD 0.00617284 + txt002 + SPHERE CENTER -0.331317 -0.813459 0.0904587 RAD 0.00617284 + txt002 + SPHERE CENTER -0.339639 -0.794116 0.0775657 RAD 0.00617284 + txt002 + SPHERE CENTER -0.346866 -0.81696 0.0716007 RAD 0.00617284 + txt002 + SPHERE CENTER -0.315299 -0.829184 0.0801706 RAD 0.00617284 + txt002 + SPHERE CENTER -0.330849 -0.832685 0.0613127 RAD 0.00617284 + txt002 + SPHERE CENTER -0.307605 -0.825565 0.0569896 RAD 0.00617284 + txt002 + SPHERE CENTER -0.370774 -0.753118 0.0604812 RAD 0.0185185 + txt002 + SPHERE CENTER -0.367981 -0.734271 0.076187 RAD 0.00617284 + txt002 + SPHERE CENTER -0.348136 -0.745269 0.0664462 RAD 0.00617284 + txt002 + SPHERE CENTER -0.362711 -0.731279 0.0522508 RAD 0.00617284 + txt002 + SPHERE CENTER -0.390619 -0.74212 0.070222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.385349 -0.739128 0.0462858 RAD 0.00617284 + txt002 + SPHERE CENTER -0.393412 -0.760966 0.0545162 RAD 0.00617284 + txt002 + SPHERE CENTER -0.376044 -0.756109 0.0844174 RAD 0.00617284 + txt002 + SPHERE CENTER -0.378837 -0.774956 0.0687117 RAD 0.00617284 + txt002 + SPHERE CENTER -0.356199 -0.767107 0.0746767 RAD 0.00617284 + txt002 + SPHERE CENTER -0.412267 -0.797815 -0.0246914 RAD 0.0185185 + txt002 + SPHERE CENTER -0.436217 -0.793573 -0.0204376 RAD 0.00617284 + txt002 + SPHERE CENTER -0.420728 -0.796968 -0.00151032 RAD 0.00617284 + txt002 + SPHERE CENTER -0.419454 -0.776294 -0.0149506 RAD 0.00617284 + txt002 + SPHERE CENTER -0.427756 -0.79442 -0.0436186 RAD 0.00617284 + txt002 + SPHERE CENTER -0.410993 -0.777141 -0.0381316 RAD 0.00617284 + txt002 + SPHERE CENTER -0.403807 -0.798662 -0.0478724 RAD 0.00617284 + txt002 + SPHERE CENTER -0.42903 -0.815094 -0.0301783 RAD 0.00617284 + txt002 + SPHERE CENTER -0.405081 -0.819335 -0.0344321 RAD 0.00617284 + txt002 + SPHERE CENTER -0.413542 -0.818489 -0.0112511 RAD 0.00617284 + txt002 + SPHERE CENTER -0.390587 -0.729282 -0.00679642 RAD 0.0185185 + txt002 + SPHERE CENTER -0.392427 -0.704862 -0.00994863 RAD 0.00617284 + txt002 + SPHERE CENTER -0.373948 -0.714218 0.00349164 RAD 0.00617284 + txt002 + SPHERE CENTER -0.374248 -0.717401 -0.0209919 RAD 0.00617284 + txt002 + SPHERE CENTER -0.409067 -0.719927 -0.0202367 RAD 0.00617284 + txt002 + SPHERE CENTER -0.390887 -0.732465 -0.0312799 RAD 0.00617284 + txt002 + SPHERE CENTER -0.407227 -0.744347 -0.0170845 RAD 0.00617284 + txt002 + SPHERE CENTER -0.408767 -0.716744 0.0042468 RAD 0.00617284 + txt002 + SPHERE CENTER -0.406927 -0.741164 0.00739901 RAD 0.00617284 + txt002 + SPHERE CENTER -0.390287 -0.726099 0.0176871 RAD 0.00617284 + txt002 + SPHERE CENTER -0.363249 -0.76217 -0.0672777 RAD 0.0185185 + txt002 + SPHERE CENTER -0.356966 -0.747522 -0.0861356 RAD 0.00617284 + txt002 + SPHERE CENTER -0.352002 -0.740618 -0.0629546 RAD 0.00617284 + txt002 + SPHERE CENTER -0.339469 -0.759239 -0.0732426 RAD 0.00617284 + txt002 + SPHERE CENTER -0.368213 -0.769074 -0.0904587 RAD 0.00617284 + txt002 + SPHERE CENTER -0.350716 -0.780791 -0.0775657 RAD 0.00617284 + txt002 + SPHERE CENTER -0.374496 -0.783722 -0.0716007 RAD 0.00617284 + txt002 + SPHERE CENTER -0.380746 -0.750453 -0.0801706 RAD 0.00617284 + txt002 + SPHERE CENTER -0.387029 -0.765101 -0.0613127 RAD 0.00617284 + txt002 + SPHERE CENTER -0.375782 -0.743549 -0.0569896 RAD 0.00617284 + txt002 + SPHERE CENTER -0.365116 -0.854538 -0.0178949 RAD 0.0185185 + txt002 + SPHERE CENTER -0.365674 -0.878086 -0.0104889 RAD 0.00617284 + txt002 + SPHERE CENTER -0.346241 -0.863875 -0.00500196 RAD 0.00617284 + txt002 + SPHERE CENTER -0.367962 -0.859887 0.00604126 RAD 0.00617284 + txt002 + SPHERE CENTER -0.384548 -0.868748 -0.0233819 RAD 0.00617284 + txt002 + SPHERE CENTER -0.386837 -0.85055 -0.00685171 RAD 0.00617284 + txt002 + SPHERE CENTER -0.38399 -0.8452 -0.0307879 RAD 0.00617284 + txt002 + SPHERE CENTER -0.362827 -0.872736 -0.0344251 RAD 0.00617284 + txt002 + SPHERE CENTER -0.362269 -0.849188 -0.0418311 RAD 0.00617284 + txt002 + SPHERE CENTER -0.343394 -0.858526 -0.0289382 RAD 0.00617284 + txt002 + SPHERE CENTER -0.316097 -0.818893 -0.0604812 RAD 0.0185185 + txt002 + SPHERE CENTER -0.297057 -0.819591 -0.076187 RAD 0.00617284 + txt002 + SPHERE CENTER -0.304244 -0.79807 -0.0664462 RAD 0.00617284 + txt002 + SPHERE CENTER -0.293153 -0.814956 -0.0522508 RAD 0.00617284 + txt002 + SPHERE CENTER -0.30891 -0.840413 -0.070222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.305006 -0.835779 -0.0462858 RAD 0.00617284 + txt002 + SPHERE CENTER -0.32795 -0.839716 -0.0545162 RAD 0.00617284 + txt002 + SPHERE CENTER -0.320001 -0.823527 -0.0844174 RAD 0.00617284 + txt002 + SPHERE CENTER -0.339041 -0.822829 -0.0687117 RAD 0.00617284 + txt002 + SPHERE CENTER -0.327188 -0.802007 -0.0746767 RAD 0.00617284 + txt002 + SPHERE CENTER -0.296284 -0.842728 0.00679642 RAD 0.0185185 + txt002 + SPHERE CENTER -0.272611 -0.848999 0.00994863 RAD 0.00617284 + txt002 + SPHERE CENTER -0.278432 -0.829121 -0.00349164 RAD 0.00617284 + txt002 + SPHERE CENTER -0.281616 -0.828835 0.0209919 RAD 0.00617284 + txt002 + SPHERE CENTER -0.290462 -0.862606 0.0202367 RAD 0.00617284 + txt002 + SPHERE CENTER -0.299468 -0.842441 0.0312799 RAD 0.00617284 + txt002 + SPHERE CENTER -0.314135 -0.856335 0.0170845 RAD 0.00617284 + txt002 + SPHERE CENTER -0.287278 -0.862893 -0.0042468 RAD 0.00617284 + txt002 + SPHERE CENTER -0.310951 -0.856621 -0.00739901 RAD 0.00617284 + txt002 + SPHERE CENTER -0.293099 -0.843015 -0.0176871 RAD 0.00617284 + txt002 + SPHERE CENTER -0.358439 -0.594141 0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER -0.389119 -0.547576 0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER -0.386849 -0.525642 0.170979 RAD 0.00617284 + txt002 + SPHERE CENTER -0.366733 -0.538964 0.165731 RAD 0.00617284 + txt002 + SPHERE CENTER -0.379645 -0.528407 0.147525 RAD 0.00617284 + txt002 + SPHERE CENTER -0.409235 -0.534255 0.165118 RAD 0.00617284 + txt002 + SPHERE CENTER -0.402031 -0.537019 0.141664 RAD 0.00617284 + txt002 + SPHERE CENTER -0.411505 -0.556189 0.154009 RAD 0.00617284 + txt002 + SPHERE CENTER -0.396323 -0.544812 0.183325 RAD 0.00617284 + txt002 + SPHERE CENTER -0.398593 -0.566746 0.172216 RAD 0.00617284 + txt002 + SPHERE CENTER -0.376207 -0.558134 0.178077 RAD 0.00617284 + txt002 + SPHERE CENTER -0.317871 -0.566667 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.299647 -0.551072 0.172528 RAD 0.00617284 + txt002 + SPHERE CENTER -0.29885 -0.563547 0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.315344 -0.545434 0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER -0.318667 -0.554192 0.18796 RAD 0.00617284 + txt002 + SPHERE CENTER -0.334364 -0.548554 0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER -0.336891 -0.569787 0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.302174 -0.572306 0.184873 RAD 0.00617284 + txt002 + SPHERE CENTER -0.320398 -0.587901 0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.301377 -0.584781 0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.339267 -0.522591 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.327164 -0.504962 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.318612 -0.528125 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.339267 -0.522591 0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER -0.347819 -0.499428 0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER -0.359921 -0.517056 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.359921 -0.517056 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.327164 -0.504962 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.339267 -0.522591 0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER -0.318612 -0.528125 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.429687 -0.57505 0.104315 RAD 0.0185185 + txt002 + SPHERE CENTER -0.446515 -0.55776 0.109563 RAD 0.00617284 + txt002 + SPHERE CENTER -0.428387 -0.562617 0.125608 RAD 0.00617284 + txt002 + SPHERE CENTER -0.423296 -0.5512 0.104315 RAD 0.00617284 + txt002 + SPHERE CENTER -0.447815 -0.570193 0.0882695 RAD 0.00617284 + txt002 + SPHERE CENTER -0.424596 -0.563633 0.0830215 RAD 0.00617284 + txt002 + SPHERE CENTER -0.430987 -0.587483 0.0830215 RAD 0.00617284 + txt002 + SPHERE CENTER -0.452905 -0.58161 0.109563 RAD 0.00617284 + txt002 + SPHERE CENTER -0.436077 -0.5989 0.104315 RAD 0.00617284 + txt002 + SPHERE CENTER -0.434777 -0.586467 0.125608 RAD 0.00617284 + txt002 + SPHERE CENTER -0.379835 -0.550064 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.372012 -0.535334 0.0373488 RAD 0.00617284 + txt002 + SPHERE CENTER -0.359551 -0.536327 0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER -0.35918 -0.555599 0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.392296 -0.549071 0.0342624 RAD 0.00617284 + txt002 + SPHERE CENTER -0.379464 -0.569335 0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.400119 -0.563801 0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER -0.392667 -0.529799 0.0496945 RAD 0.00617284 + txt002 + SPHERE CENTER -0.400489 -0.54453 0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.380205 -0.530793 0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.399007 -0.621614 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.420252 -0.632748 0.0496945 RAD 0.00617284 + txt002 + SPHERE CENTER -0.408963 -0.638118 0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.419661 -0.61608 0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.410295 -0.616244 0.0342624 RAD 0.00617284 + txt002 + SPHERE CENTER -0.409705 -0.599576 0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER -0.38905 -0.60511 0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.399597 -0.638282 0.0373488 RAD 0.00617284 + txt002 + SPHERE CENTER -0.378352 -0.627149 0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.388308 -0.643653 0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER -0.408291 -0.619127 0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER -0.415912 -0.617918 0.183325 RAD 0.00617284 + txt002 + SPHERE CENTER -0.39183 -0.616439 0.178077 RAD 0.00617284 + txt002 + SPHERE CENTER -0.406911 -0.597788 0.172216 RAD 0.00617284 + txt002 + SPHERE CENTER -0.432372 -0.620605 0.165118 RAD 0.00617284 + txt002 + SPHERE CENTER -0.423371 -0.600475 0.154009 RAD 0.00617284 + txt002 + SPHERE CENTER -0.424751 -0.621814 0.141664 RAD 0.00617284 + txt002 + SPHERE CENTER -0.417292 -0.639257 0.170979 RAD 0.00617284 + txt002 + SPHERE CENTER -0.409671 -0.640465 0.147525 RAD 0.00617284 + txt002 + SPHERE CENTER -0.39321 -0.637778 0.165731 RAD 0.00617284 + txt002 + SPHERE CENTER -0.37761 -0.665691 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.375943 -0.687009 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.356956 -0.671225 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.37761 -0.665691 0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER -0.396598 -0.681475 0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER -0.398265 -0.660156 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.398265 -0.660156 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.375943 -0.687009 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.37761 -0.665691 0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER -0.356956 -0.671225 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.337042 -0.638217 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.320629 -0.641183 0.184873 RAD 0.00617284 + txt002 + SPHERE CENTER -0.313702 -0.630777 0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.328614 -0.618565 0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.34397 -0.648623 0.18796 RAD 0.00617284 + txt002 + SPHERE CENTER -0.351955 -0.626005 0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.360383 -0.645657 0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER -0.329058 -0.660835 0.172528 RAD 0.00617284 + txt002 + SPHERE CENTER -0.345471 -0.65787 0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER -0.32213 -0.65043 0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.358439 -0.594141 -0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER -0.409774 -0.542042 -0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER -0.413579 -0.517869 -0.126127 RAD 0.00617284 + txt002 + SPHERE CENTER -0.395831 -0.525596 -0.110799 RAD 0.00617284 + txt002 + SPHERE CENTER -0.393219 -0.528508 -0.135179 RAD 0.00617284 + txt002 + SPHERE CENTER -0.427522 -0.534315 -0.138161 RAD 0.00617284 + txt002 + SPHERE CENTER -0.407161 -0.544953 -0.147213 RAD 0.00617284 + txt002 + SPHERE CENTER -0.423716 -0.558488 -0.134867 RAD 0.00617284 + txt002 + SPHERE CENTER -0.430134 -0.531404 -0.113782 RAD 0.00617284 + txt002 + SPHERE CENTER -0.426328 -0.555577 -0.110488 RAD 0.00617284 + txt002 + SPHERE CENTER -0.412386 -0.539131 -0.0984536 RAD 0.00617284 + txt002 + SPHERE CENTER -0.379835 -0.550064 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.375068 -0.529037 -0.0435217 RAD 0.00617284 + txt002 + SPHERE CENTER -0.356494 -0.542624 -0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER -0.371406 -0.530412 -0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.398409 -0.536477 -0.0466081 RAD 0.00617284 + txt002 + SPHERE CENTER -0.394747 -0.537852 -0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.403175 -0.557504 -0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER -0.383497 -0.548689 -0.031176 RAD 0.00617284 + txt002 + SPHERE CENTER -0.388263 -0.569716 -0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.364922 -0.562276 -0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.339267 -0.522591 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.327164 -0.504962 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.318612 -0.528125 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.339267 -0.522591 -0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER -0.347819 -0.499428 -0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER -0.359921 -0.517056 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.359921 -0.517056 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.327164 -0.504962 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.339267 -0.522591 -0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER -0.318612 -0.528125 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.388377 -0.586119 -0.178389 RAD 0.0185185 + txt002 + SPHERE CENTER -0.399584 -0.570335 -0.193717 RAD 0.00617284 + txt002 + SPHERE CENTER -0.403942 -0.569167 -0.169441 RAD 0.00617284 + txt002 + SPHERE CENTER -0.381987 -0.562269 -0.178389 RAD 0.00617284 + txt002 + SPHERE CENTER -0.384019 -0.587286 -0.202664 RAD 0.00617284 + txt002 + SPHERE CENTER -0.366422 -0.57922 -0.187336 RAD 0.00617284 + txt002 + SPHERE CENTER -0.372813 -0.60307 -0.187336 RAD 0.00617284 + txt002 + SPHERE CENTER -0.405974 -0.594185 -0.193717 RAD 0.00617284 + txt002 + SPHERE CENTER -0.394768 -0.609969 -0.178389 RAD 0.00617284 + txt002 + SPHERE CENTER -0.410332 -0.593017 -0.169441 RAD 0.00617284 + txt002 + SPHERE CENTER -0.317871 -0.566667 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.317033 -0.562847 -0.191046 RAD 0.00617284 + txt002 + SPHERE CENTER -0.327827 -0.583171 -0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.338525 -0.561133 -0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.307077 -0.546343 -0.175614 RAD 0.00617284 + txt002 + SPHERE CENTER -0.328569 -0.544629 -0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.307914 -0.550163 -0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.296378 -0.568381 -0.178701 RAD 0.00617284 + txt002 + SPHERE CENTER -0.297216 -0.572202 -0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER -0.307172 -0.588706 -0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER -0.337042 -0.638217 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.317573 -0.64748 -0.178701 RAD 0.00617284 + txt002 + SPHERE CENTER -0.316758 -0.624481 -0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER -0.316388 -0.643752 -0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER -0.337857 -0.661216 -0.175614 RAD 0.00617284 + txt002 + SPHERE CENTER -0.336672 -0.657489 -0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.357326 -0.651954 -0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER -0.338228 -0.641945 -0.191046 RAD 0.00617284 + txt002 + SPHERE CENTER -0.357697 -0.632683 -0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.337413 -0.618946 -0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.428945 -0.613592 -0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER -0.451897 -0.612625 -0.113782 RAD 0.00617284 + txt002 + SPHERE CENTER -0.432663 -0.614807 -0.0984536 RAD 0.00617284 + txt002 + SPHERE CENTER -0.436515 -0.593593 -0.110488 RAD 0.00617284 + txt002 + SPHERE CENTER -0.448179 -0.61141 -0.138161 RAD 0.00617284 + txt002 + SPHERE CENTER -0.432797 -0.592379 -0.134867 RAD 0.00617284 + txt002 + SPHERE CENTER -0.425227 -0.612377 -0.147213 RAD 0.00617284 + txt002 + SPHERE CENTER -0.444328 -0.632624 -0.126127 RAD 0.00617284 + txt002 + SPHERE CENTER -0.421376 -0.633591 -0.135179 RAD 0.00617284 + txt002 + SPHERE CENTER -0.425094 -0.634806 -0.110799 RAD 0.00617284 + txt002 + SPHERE CENTER -0.37761 -0.665691 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.375943 -0.687009 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.356956 -0.671225 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.37761 -0.665691 -0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER -0.396598 -0.681475 -0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER -0.398265 -0.660156 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.398265 -0.660156 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.375943 -0.687009 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.37761 -0.665691 -0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER -0.356956 -0.671225 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.399007 -0.621614 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER -0.402865 -0.620974 -0.031176 RAD 0.00617284 + txt002 + SPHERE CENTER -0.379986 -0.618494 -0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.39648 -0.600381 -0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.421886 -0.624094 -0.0466081 RAD 0.00617284 + txt002 + SPHERE CENTER -0.4155 -0.603501 -0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER -0.418027 -0.624734 -0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER -0.405392 -0.642207 -0.0435217 RAD 0.00617284 + txt002 + SPHERE CENTER -0.401533 -0.642848 -0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.382513 -0.639728 -0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER -0.157543 -0.835815 -0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER -0.119969 -0.899353 -0.117284 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0977075 -0.909872 -0.115431 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0997803 -0.886771 -0.1239 RAD 0.00617284 + txt002 + SPHERE CENTER -0.104052 -0.891613 -0.100068 RAD 0.00617284 + txt002 + SPHERE CENTER -0.117896 -0.922453 -0.108814 RAD 0.00617284 + txt002 + SPHERE CENTER -0.124241 -0.904194 -0.0934517 RAD 0.00617284 + txt002 + SPHERE CENTER -0.140158 -0.911935 -0.110668 RAD 0.00617284 + txt002 + SPHERE CENTER -0.113625 -0.917612 -0.132647 RAD 0.00617284 + txt002 + SPHERE CENTER -0.135886 -0.907093 -0.1345 RAD 0.00617284 + txt002 + SPHERE CENTER -0.115698 -0.894512 -0.141116 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0844101 -0.836885 -0.099389 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0627848 -0.826973 -0.106005 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0805529 -0.830202 -0.122844 RAD 0.00617284 + txt002 + SPHERE CENTER -0.083104 -0.81296 -0.105354 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0666419 -0.833656 -0.0825505 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0869612 -0.819643 -0.0818993 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0882673 -0.843568 -0.0759343 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0640908 -0.850898 -0.10004 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0857161 -0.860809 -0.093424 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0818589 -0.854126 -0.116879 RAD 0.00617284 + txt002 + SPHERE CENTER -0.130205 -0.868703 -0.0506299 RAD 0.0185185 + txt002 + SPHERE CENTER -0.11253 -0.867758 -0.0334138 RAD 0.00617284 + txt002 + SPHERE CENTER -0.107566 -0.860854 -0.0565949 RAD 0.00617284 + txt002 + SPHERE CENTER -0.122142 -0.846864 -0.0423994 RAD 0.00617284 + txt002 + SPHERE CENTER -0.135168 -0.875606 -0.0274488 RAD 0.00617284 + txt002 + SPHERE CENTER -0.14478 -0.854713 -0.0364345 RAD 0.00617284 + txt002 + SPHERE CENTER -0.152843 -0.876551 -0.0446649 RAD 0.00617284 + txt002 + SPHERE CENTER -0.120593 -0.889596 -0.0416443 RAD 0.00617284 + txt002 + SPHERE CENTER -0.138267 -0.890541 -0.0588603 RAD 0.00617284 + txt002 + SPHERE CENTER -0.115629 -0.882692 -0.0648253 RAD 0.00617284 + txt002 + SPHERE CENTER -0.193102 -0.898283 -0.129006 RAD 0.0185185 + txt002 + SPHERE CENTER -0.201143 -0.920038 -0.120537 RAD 0.00617284 + txt002 + SPHERE CENTER -0.17991 -0.910616 -0.112168 RAD 0.00617284 + txt002 + SPHERE CENTER -0.201384 -0.900209 -0.105825 RAD 0.00617284 + txt002 + SPHERE CENTER -0.214335 -0.907705 -0.137375 RAD 0.00617284 + txt002 + SPHERE CENTER -0.214576 -0.887876 -0.122663 RAD 0.00617284 + txt002 + SPHERE CENTER -0.206294 -0.88595 -0.145845 RAD 0.00617284 + txt002 + SPHERE CENTER -0.192861 -0.918112 -0.143718 RAD 0.00617284 + txt002 + SPHERE CENTER -0.18482 -0.896357 -0.152187 RAD 0.00617284 + txt002 + SPHERE CENTER -0.171628 -0.90869 -0.135349 RAD 0.00617284 + txt002 + SPHERE CENTER -0.203337 -0.867633 -0.062352 RAD 0.0185185 + txt002 + SPHERE CENTER -0.209658 -0.868948 -0.0385197 RAD 0.00617284 + txt002 + SPHERE CENTER -0.186008 -0.865773 -0.0448623 RAD 0.00617284 + txt002 + SPHERE CENTER -0.202239 -0.84746 -0.0481565 RAD 0.00617284 + txt002 + SPHERE CENTER -0.226988 -0.870808 -0.0560094 RAD 0.00617284 + txt002 + SPHERE CENTER -0.219569 -0.84932 -0.0656463 RAD 0.00617284 + txt002 + SPHERE CENTER -0.220667 -0.869493 -0.0798417 RAD 0.00617284 + txt002 + SPHERE CENTER -0.210757 -0.889121 -0.0527151 RAD 0.00617284 + txt002 + SPHERE CENTER -0.204436 -0.887806 -0.0765474 RAD 0.00617284 + txt002 + SPHERE CENTER -0.187106 -0.885946 -0.0590577 RAD 0.00617284 + txt002 + SPHERE CENTER -0.230676 -0.834745 -0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER -0.252002 -0.824206 -0.116217 RAD 0.00617284 + txt002 + SPHERE CENTER -0.234336 -0.827952 -0.0993785 RAD 0.00617284 + txt002 + SPHERE CENTER -0.231282 -0.810793 -0.116868 RAD 0.00617284 + txt002 + SPHERE CENTER -0.248342 -0.830999 -0.139672 RAD 0.00617284 + txt002 + SPHERE CENTER -0.227621 -0.817586 -0.140323 RAD 0.00617284 + txt002 + SPHERE CENTER -0.227016 -0.841538 -0.146288 RAD 0.00617284 + txt002 + SPHERE CENTER -0.251396 -0.848158 -0.122182 RAD 0.00617284 + txt002 + SPHERE CENTER -0.23007 -0.858698 -0.128798 RAD 0.00617284 + txt002 + SPHERE CENTER -0.23373 -0.851905 -0.105343 RAD 0.00617284 + txt002 + SPHERE CENTER -0.147308 -0.866465 -0.177765 RAD 0.0185185 + txt002 + SPHERE CENTER -0.130609 -0.876203 -0.193128 RAD 0.00617284 + txt002 + SPHERE CENTER -0.124356 -0.857385 -0.178416 RAD 0.00617284 + txt002 + SPHERE CENTER -0.128522 -0.879733 -0.16878 RAD 0.00617284 + txt002 + SPHERE CENTER -0.153561 -0.885283 -0.192477 RAD 0.00617284 + txt002 + SPHERE CENTER -0.151474 -0.888813 -0.168128 RAD 0.00617284 + txt002 + SPHERE CENTER -0.170259 -0.875546 -0.177114 RAD 0.00617284 + txt002 + SPHERE CENTER -0.149395 -0.862935 -0.202114 RAD 0.00617284 + txt002 + SPHERE CENTER -0.166093 -0.853198 -0.186751 RAD 0.00617284 + txt002 + SPHERE CENTER -0.143141 -0.844117 -0.187402 RAD 0.00617284 + txt002 + SPHERE CENTER -0.184881 -0.802927 -0.171592 RAD 0.0185185 + txt002 + SPHERE CENTER -0.180723 -0.785723 -0.188808 RAD 0.00617284 + txt002 + SPHERE CENTER -0.173028 -0.782104 -0.165627 RAD 0.00617284 + txt002 + SPHERE CENTER -0.161937 -0.798991 -0.179823 RAD 0.00617284 + txt002 + SPHERE CENTER -0.192576 -0.806546 -0.194773 RAD 0.00617284 + txt002 + SPHERE CENTER -0.17379 -0.819813 -0.185788 RAD 0.00617284 + txt002 + SPHERE CENTER -0.196734 -0.82375 -0.177557 RAD 0.00617284 + txt002 + SPHERE CENTER -0.203667 -0.78966 -0.180578 RAD 0.00617284 + txt002 + SPHERE CENTER -0.207825 -0.806864 -0.163362 RAD 0.00617284 + txt002 + SPHERE CENTER -0.195972 -0.786041 -0.157397 RAD 0.00617284 + txt002 + SPHERE CENTER -0.111748 -0.803997 -0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER -0.108311 -0.798532 -0.183703 RAD 0.00617284 + txt002 + SPHERE CENTER -0.119537 -0.819589 -0.17736 RAD 0.00617284 + txt002 + SPHERE CENTER -0.131037 -0.797989 -0.174066 RAD 0.00617284 + txt002 + SPHERE CENTER -0.100522 -0.78294 -0.166213 RAD 0.00617284 + txt002 + SPHERE CENTER -0.123249 -0.782397 -0.156576 RAD 0.00617284 + txt002 + SPHERE CENTER -0.10396 -0.788405 -0.142381 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0890219 -0.80454 -0.169507 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0924597 -0.810005 -0.145675 RAD 0.00617284 + txt002 + SPHERE CENTER -0.100248 -0.825597 -0.163165 RAD 0.00617284 + txt002 + SPHERE CENTER -0.172546 -0.643951 -0.222222 RAD 0.0555556 + txt002 + SPHERE CENTER -0.202787 -0.61371 -0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER -0.200937 -0.595399 -0.299164 RAD 0.00617284 + txt002 + SPHERE CENTER -0.194794 -0.591462 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER -0.180539 -0.605717 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER -0.208929 -0.617647 -0.306292 RAD 0.00617284 + txt002 + SPHERE CENTER -0.188531 -0.627965 -0.296959 RAD 0.00617284 + txt002 + SPHERE CENTER -0.210779 -0.635958 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER -0.223185 -0.603392 -0.292037 RAD 0.00617284 + txt002 + SPHERE CENTER -0.225035 -0.621702 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER -0.217042 -0.599454 -0.268448 RAD 0.00617284 + txt002 + SPHERE CENTER -0.244096 -0.624779 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.260374 -0.607636 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER -0.240901 -0.612854 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.237705 -0.600929 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.26357 -0.619561 -0.236478 RAD 0.00617284 + txt002 + SPHERE CENTER -0.240901 -0.612854 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.247291 -0.636704 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.266765 -0.631486 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER -0.250487 -0.648629 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.247291 -0.636704 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.191718 -0.5724 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.185011 -0.549732 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER -0.167868 -0.56601 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.179793 -0.569205 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.208861 -0.556122 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER -0.203643 -0.575596 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.215568 -0.578791 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.196936 -0.552927 -0.207967 RAD 0.00617284 + txt002 + SPHERE CENTER -0.203643 -0.575596 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.179793 -0.569205 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.131237 -0.632882 -0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER -0.131575 -0.625593 -0.306292 RAD 0.00617284 + txt002 + SPHERE CENTER -0.15071 -0.6381 -0.296959 RAD 0.00617284 + txt002 + SPHERE CENTER -0.146508 -0.614836 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER -0.112102 -0.620375 -0.292037 RAD 0.00617284 + txt002 + SPHERE CENTER -0.127034 -0.609618 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER -0.111763 -0.627664 -0.268448 RAD 0.00617284 + txt002 + SPHERE CENTER -0.116304 -0.643639 -0.299164 RAD 0.00617284 + txt002 + SPHERE CENTER -0.115965 -0.650927 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER -0.135439 -0.656145 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER -0.120168 -0.591572 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.105912 -0.577317 -0.236478 RAD 0.00617284 + txt002 + SPHERE CENTER -0.111438 -0.600302 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.128897 -0.582843 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.114642 -0.568587 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER -0.137627 -0.574113 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.128897 -0.582843 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0971825 -0.586046 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER -0.111438 -0.600302 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.102708 -0.609032 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.100996 -0.663122 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0783272 -0.656415 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0978007 -0.651197 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0946054 -0.639272 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0815225 -0.66834 -0.207967 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0978007 -0.651197 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.104191 -0.675047 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0847178 -0.680265 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER -0.107387 -0.686972 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.104191 -0.675047 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.183615 -0.68526 -0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER -0.182351 -0.708085 -0.292037 RAD 0.00617284 + txt002 + SPHERE CENTER -0.165569 -0.700531 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER -0.188833 -0.704733 -0.268448 RAD 0.00617284 + txt002 + SPHERE CENTER -0.200397 -0.692813 -0.299164 RAD 0.00617284 + txt002 + SPHERE CENTER -0.206879 -0.689462 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER -0.201661 -0.669989 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER -0.177134 -0.688611 -0.306292 RAD 0.00617284 + txt002 + SPHERE CENTER -0.178397 -0.665787 -0.296959 RAD 0.00617284 + txt002 + SPHERE CENTER -0.160351 -0.681058 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER -0.153374 -0.715501 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.136231 -0.731779 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER -0.129524 -0.70911 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.141449 -0.712305 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.160081 -0.738169 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER -0.165299 -0.718696 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.177224 -0.721891 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.148156 -0.734974 -0.236478 RAD 0.00617284 + txt002 + SPHERE CENTER -0.165299 -0.718696 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.141449 -0.712305 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.224924 -0.696329 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER -0.23918 -0.710584 -0.207967 RAD 0.00617284 + txt002 + SPHERE CENTER -0.216195 -0.705059 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.233654 -0.687599 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER -0.24791 -0.701855 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER -0.242384 -0.678869 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER -0.233654 -0.687599 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.23045 -0.719314 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER -0.216195 -0.705059 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER -0.207465 -0.713788 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0133465 -0.69376 -0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER 0.0631985 -0.668775 -0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0667914 -0.661946 -0.183325 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0511945 -0.680354 -0.178077 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0452771 -0.65711 -0.172216 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0787954 -0.650366 -0.165118 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0572811 -0.64553 -0.154009 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0752026 -0.657195 -0.141664 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0847128 -0.673611 -0.170979 RAD 0.00617284 + txt002 + SPHERE CENTER 0.08112 -0.680439 -0.147525 RAD 0.00617284 + txt002 + SPHERE CENTER 0.069116 -0.692019 -0.165731 RAD 0.00617284 + txt002 + SPHERE CENTER -0.00804971 -0.649684 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.000226782 -0.634953 -0.184873 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0122343 -0.635947 -0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.012605 -0.655218 -0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0205108 -0.64869 -0.18796 RAD 0.00617284 + txt002 + SPHERE CENTER -0.00767898 -0.668955 -0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0283337 -0.66342 -0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0208815 -0.629419 -0.172528 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0287044 -0.644149 -0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER -0.00842045 -0.630413 -0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0325183 -0.62221 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0446211 -0.604582 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.053173 -0.627745 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0325183 -0.62221 -0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0239663 -0.599047 -0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0118635 -0.616676 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0118635 -0.616676 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0446211 -0.604582 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0325183 -0.62221 -0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER 0.053173 -0.627745 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0845947 -0.712851 -0.104315 RAD 0.0185185 + txt002 + SPHERE CENTER 0.107813 -0.706291 -0.109563 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0896851 -0.701434 -0.125608 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0909853 -0.689001 -0.104315 RAD 0.00617284 + txt002 + SPHERE CENTER 0.102723 -0.717709 -0.0882695 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0858949 -0.700418 -0.0830215 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0795043 -0.724268 -0.0830215 RAD 0.00617284 + txt002 + SPHERE CENTER 0.101422 -0.730141 -0.109563 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0782041 -0.736701 -0.104315 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0832945 -0.725284 -0.125608 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0539145 -0.666287 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0721382 -0.650692 -0.0496945 RAD 0.00617284 + txt002 + SPHERE CENTER 0.072935 -0.663167 -0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0564414 -0.645053 -0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0531177 -0.653812 -0.0342624 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0374209 -0.648173 -0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER 0.034894 -0.669407 -0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0696112 -0.671925 -0.0373488 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0513875 -0.68752 -0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.070408 -0.6844 -0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0347427 -0.737837 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0511556 -0.740802 -0.0373488 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0580833 -0.730397 -0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER 0.043171 -0.718185 -0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.027815 -0.748242 -0.0342624 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0198304 -0.725625 -0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0114021 -0.745277 -0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0427273 -0.760455 -0.0496945 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0263144 -0.757489 -0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0496549 -0.750049 -0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0440268 -0.740325 -0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER 0.0650768 -0.746894 -0.170979 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0607735 -0.723153 -0.165731 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0653796 -0.739183 -0.147525 RAD 0.00617284 + txt002 + SPHERE CENTER 0.04833 -0.764065 -0.165118 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0486329 -0.756355 -0.141664 RAD 0.00617284 + txt002 + SPHERE CENTER 0.02728 -0.757496 -0.154009 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0437239 -0.748035 -0.183325 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0226739 -0.741466 -0.172216 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0394207 -0.724295 -0.178077 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0058253 -0.76531 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER -0.00415829 -0.786629 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0148294 -0.770845 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0058253 -0.76531 -0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER -0.024813 -0.781094 -0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER -0.02648 -0.759776 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER -0.02648 -0.759776 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.00415829 -0.786629 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0058253 -0.76531 -0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER 0.0148294 -0.770845 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0272215 -0.721234 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER -0.0484665 -0.732368 -0.172528 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0371781 -0.737738 -0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0478762 -0.715699 -0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0385099 -0.715864 -0.18796 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0379196 -0.699195 -0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0172649 -0.70473 -0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0278118 -0.737902 -0.184873 RAD 0.00617284 + txt002 + SPHERE CENTER -0.00656677 -0.726768 -0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER -0.0165234 -0.743272 -0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.471405 -0.471405 1.11022e-16 RAD 0.166667 + txt002 + SPHERE CENTER 0.690426 -0.508983 1.83812e-16 RAD 0.0555556 + txt002 + SPHERE CENTER 0.755941 -0.484794 -0.0246914 RAD 0.0185185 + txt002 + SPHERE CENTER 0.767658 -0.47411 -0.0436186 RAD 0.00617284 + txt002 + SPHERE CENTER 0.749038 -0.489758 -0.0478724 RAD 0.00617284 + txt002 + SPHERE CENTER 0.744501 -0.467528 -0.0381316 RAD 0.00617284 + txt002 + SPHERE CENTER 0.774562 -0.469146 -0.0204376 RAD 0.00617284 + txt002 + SPHERE CENTER 0.751405 -0.462564 -0.0149506 RAD 0.00617284 + txt002 + SPHERE CENTER 0.762845 -0.47983 -0.00151032 RAD 0.00617284 + txt002 + SPHERE CENTER 0.779098 -0.491377 -0.0301783 RAD 0.00617284 + txt002 + SPHERE CENTER 0.767382 -0.502061 -0.0112511 RAD 0.00617284 + txt002 + SPHERE CENTER 0.760478 -0.507025 -0.0344321 RAD 0.00617284 + txt002 + SPHERE CENTER 0.695668 -0.478434 -0.0672777 RAD 0.0185185 + txt002 + SPHERE CENTER 0.703418 -0.481931 -0.0904587 RAD 0.00617284 + txt002 + SPHERE CENTER 0.716184 -0.491475 -0.0716007 RAD 0.00617284 + txt002 + SPHERE CENTER 0.694124 -0.500827 -0.0775657 RAD 0.00617284 + txt002 + SPHERE CENTER 0.682902 -0.46889 -0.0861356 RAD 0.00617284 + txt002 + SPHERE CENTER 0.673608 -0.487786 -0.0732426 RAD 0.00617284 + txt002 + SPHERE CENTER 0.675152 -0.465393 -0.0629546 RAD 0.00617284 + txt002 + SPHERE CENTER 0.704962 -0.459538 -0.0801706 RAD 0.00617284 + txt002 + SPHERE CENTER 0.697211 -0.456041 -0.0569896 RAD 0.00617284 + txt002 + SPHERE CENTER 0.717727 -0.469082 -0.0613127 RAD 0.00617284 + txt002 + SPHERE CENTER 0.7029 -0.436283 -0.00679642 RAD 0.0185185 + txt002 + SPHERE CENTER 0.714226 -0.418941 -0.0202367 RAD 0.00617284 + txt002 + SPHERE CENTER 0.724842 -0.44101 -0.0170845 RAD 0.00617284 + txt002 + SPHERE CENTER 0.704751 -0.43889 -0.0312799 RAD 0.00617284 + txt002 + SPHERE CENTER 0.692283 -0.414215 -0.00994863 RAD 0.00617284 + txt002 + SPHERE CENTER 0.682808 -0.434163 -0.0209919 RAD 0.00617284 + txt002 + SPHERE CENTER 0.680957 -0.431557 0.00349164 RAD 0.00617284 + txt002 + SPHERE CENTER 0.712374 -0.416335 0.0042468 RAD 0.00617284 + txt002 + SPHERE CENTER 0.701048 -0.433677 0.0176871 RAD 0.00617284 + txt002 + SPHERE CENTER 0.722991 -0.438403 0.00739901 RAD 0.00617284 + txt002 + SPHERE CENTER 0.7507 -0.515343 0.0425863 RAD 0.0185185 + txt002 + SPHERE CENTER 0.773394 -0.506594 0.0468401 RAD 0.00617284 + txt002 + SPHERE CENTER 0.764807 -0.507924 0.0237283 RAD 0.00617284 + txt002 + SPHERE CENTER 0.755462 -0.491321 0.0394341 RAD 0.00617284 + txt002 + SPHERE CENTER 0.759287 -0.514012 0.065698 RAD 0.00617284 + txt002 + SPHERE CENTER 0.741355 -0.49874 0.058292 RAD 0.00617284 + txt002 + SPHERE CENTER 0.736593 -0.522762 0.0614442 RAD 0.00617284 + txt002 + SPHERE CENTER 0.768632 -0.530616 0.0499923 RAD 0.00617284 + txt002 + SPHERE CENTER 0.745938 -0.539365 0.0457385 RAD 0.00617284 + txt002 + SPHERE CENTER 0.760045 -0.531946 0.0268805 RAD 0.00617284 + txt002 + SPHERE CENTER 0.697658 -0.466832 0.0604812 RAD 0.0185185 + txt002 + SPHERE CENTER 0.709346 -0.447385 0.070222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.721188 -0.46231 0.0545162 RAD 0.00617284 + txt002 + SPHERE CENTER 0.703286 -0.447429 0.0462858 RAD 0.00617284 + txt002 + SPHERE CENTER 0.685816 -0.451907 0.076187 RAD 0.00617284 + txt002 + SPHERE CENTER 0.679757 -0.451951 0.0522508 RAD 0.00617284 + txt002 + SPHERE CENTER 0.674129 -0.471354 0.0664462 RAD 0.00617284 + txt002 + SPHERE CENTER 0.703718 -0.466788 0.0844174 RAD 0.00617284 + txt002 + SPHERE CENTER 0.692031 -0.486235 0.0746767 RAD 0.00617284 + txt002 + SPHERE CENTER 0.71556 -0.481713 0.0687117 RAD 0.00617284 + txt002 + SPHERE CENTER 0.685185 -0.539531 0.0672777 RAD 0.0185185 + txt002 + SPHERE CENTER 0.693658 -0.538818 0.0904587 RAD 0.00617284 + txt002 + SPHERE CENTER 0.708875 -0.534075 0.0716007 RAD 0.00617284 + txt002 + SPHERE CENTER 0.691194 -0.517905 0.0775657 RAD 0.00617284 + txt002 + SPHERE CENTER 0.669969 -0.544274 0.0861356 RAD 0.00617284 + txt002 + SPHERE CENTER 0.667505 -0.523361 0.0732426 RAD 0.00617284 + txt002 + SPHERE CENTER 0.661495 -0.544988 0.0629546 RAD 0.00617284 + txt002 + SPHERE CENTER 0.687649 -0.560445 0.0801706 RAD 0.00617284 + txt002 + SPHERE CENTER 0.679176 -0.561158 0.0569896 RAD 0.00617284 + txt002 + SPHERE CENTER 0.702866 -0.555702 0.0613127 RAD 0.00617284 + txt002 + SPHERE CENTER 0.743468 -0.557494 -0.0178949 RAD 0.0185185 + txt002 + SPHERE CENTER 0.767402 -0.560084 -0.0233819 RAD 0.00617284 + txt002 + SPHERE CENTER 0.755145 -0.53997 -0.0307879 RAD 0.00617284 + txt002 + SPHERE CENTER 0.760285 -0.543179 -0.00685171 RAD 0.00617284 + txt002 + SPHERE CENTER 0.755725 -0.577608 -0.0104889 RAD 0.00617284 + txt002 + SPHERE CENTER 0.748608 -0.560703 0.00604126 RAD 0.00617284 + txt002 + SPHERE CENTER 0.731791 -0.575017 -0.00500196 RAD 0.00617284 + txt002 + SPHERE CENTER 0.750585 -0.574398 -0.0344251 RAD 0.00617284 + txt002 + SPHERE CENTER 0.726651 -0.571808 -0.0289382 RAD 0.00617284 + txt002 + SPHERE CENTER 0.738328 -0.554284 -0.0418311 RAD 0.00617284 + txt002 + SPHERE CENTER 0.677953 -0.581682 0.00679642 RAD 0.0185185 + txt002 + SPHERE CENTER 0.682851 -0.601808 0.0202367 RAD 0.00617284 + txt002 + SPHERE CENTER 0.700216 -0.58454 0.0170845 RAD 0.00617284 + txt002 + SPHERE CENTER 0.680568 -0.579842 0.0312799 RAD 0.00617284 + txt002 + SPHERE CENTER 0.660588 -0.59895 0.00994863 RAD 0.00617284 + txt002 + SPHERE CENTER 0.658304 -0.576984 0.0209919 RAD 0.00617284 + txt002 + SPHERE CENTER 0.65569 -0.578824 -0.00349164 RAD 0.00617284 + txt002 + SPHERE CENTER 0.680237 -0.603648 -0.0042468 RAD 0.00617284 + txt002 + SPHERE CENTER 0.675339 -0.583522 -0.0176871 RAD 0.00617284 + txt002 + SPHERE CENTER 0.697602 -0.58638 -0.00739901 RAD 0.00617284 + txt002 + SPHERE CENTER 0.683194 -0.551134 -0.0604812 RAD 0.0185185 + txt002 + SPHERE CENTER 0.687731 -0.573364 -0.070222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.703871 -0.56324 -0.0545162 RAD 0.00617284 + txt002 + SPHERE CENTER 0.682033 -0.571303 -0.0462858 RAD 0.00617284 + txt002 + SPHERE CENTER 0.667055 -0.561258 -0.076187 RAD 0.00617284 + txt002 + SPHERE CENTER 0.661356 -0.559196 -0.0522508 RAD 0.00617284 + txt002 + SPHERE CENTER 0.662518 -0.539027 -0.0664462 RAD 0.00617284 + txt002 + SPHERE CENTER 0.688893 -0.553195 -0.0844174 RAD 0.00617284 + txt002 + SPHERE CENTER 0.684356 -0.530964 -0.0746767 RAD 0.00617284 + txt002 + SPHERE CENTER 0.705033 -0.543071 -0.0687117 RAD 0.00617284 + txt002 + SPHERE CENTER 0.607487 -0.335322 -0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER 0.629404 -0.313405 -0.178389 RAD 0.0185185 + txt002 + SPHERE CENTER 0.626214 -0.316595 -0.202664 RAD 0.00617284 + txt002 + SPHERE CENTER 0.624401 -0.335868 -0.187336 RAD 0.00617284 + txt002 + SPHERE CENTER 0.606941 -0.318408 -0.187336 RAD 0.00617284 + txt002 + SPHERE CENTER 0.631217 -0.294133 -0.193717 RAD 0.00617284 + txt002 + SPHERE CENTER 0.611945 -0.295946 -0.178389 RAD 0.00617284 + txt002 + SPHERE CENTER 0.634407 -0.290942 -0.169441 RAD 0.00617284 + txt002 + SPHERE CENTER 0.648676 -0.311592 -0.193717 RAD 0.00617284 + txt002 + SPHERE CENTER 0.651867 -0.308402 -0.169441 RAD 0.00617284 + txt002 + SPHERE CENTER 0.646863 -0.330864 -0.178389 RAD 0.00617284 + txt002 + SPHERE CENTER 0.610996 -0.384191 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.623201 -0.403702 -0.175614 RAD 0.00617284 + txt002 + SPHERE CENTER 0.635431 -0.385946 -0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.62031 -0.401066 -0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.598766 -0.401947 -0.178701 RAD 0.00617284 + txt002 + SPHERE CENTER 0.595876 -0.399312 -0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER 0.586561 -0.382437 -0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER 0.613886 -0.386827 -0.191046 RAD 0.00617284 + txt002 + SPHERE CENTER 0.601681 -0.367317 -0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.626116 -0.369071 -0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.558618 -0.331813 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.539107 -0.319608 -0.175614 RAD 0.00617284 + txt002 + SPHERE CENTER 0.541743 -0.322499 -0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.556863 -0.307378 -0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.555982 -0.328923 -0.191046 RAD 0.00617284 + txt002 + SPHERE CENTER 0.573738 -0.316693 -0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.575492 -0.341128 -0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.540862 -0.344043 -0.178701 RAD 0.00617284 + txt002 + SPHERE CENTER 0.560372 -0.356248 -0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER 0.543497 -0.346933 -0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER 0.625895 -0.264535 -0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER 0.637402 -0.248969 -0.138161 RAD 0.00617284 + txt002 + SPHERE CENTER 0.646193 -0.271807 -0.134867 RAD 0.00617284 + txt002 + SPHERE CENTER 0.625088 -0.268363 -0.147213 RAD 0.00617284 + txt002 + SPHERE CENTER 0.617105 -0.241698 -0.126127 RAD 0.00617284 + txt002 + SPHERE CENTER 0.604791 -0.261092 -0.135179 RAD 0.00617284 + txt002 + SPHERE CENTER 0.605598 -0.257264 -0.110799 RAD 0.00617284 + txt002 + SPHERE CENTER 0.638209 -0.245142 -0.113782 RAD 0.00617284 + txt002 + SPHERE CENTER 0.626702 -0.260708 -0.0984536 RAD 0.00617284 + txt002 + SPHERE CENTER 0.647 -0.267979 -0.110488 RAD 0.00617284 + txt002 + SPHERE CENTER 0.555109 -0.282943 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.550934 -0.258608 -0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER 0.570229 -0.267823 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.570229 -0.267823 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.535813 -0.273728 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.555109 -0.282943 -0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER 0.539989 -0.298064 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.535813 -0.273728 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.539989 -0.298064 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.555109 -0.282943 -0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER 0.603979 -0.286452 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.613271 -0.265398 -0.0466081 RAD 0.00617284 + txt002 + SPHERE CENTER 0.627912 -0.281225 -0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER 0.610787 -0.26842 -0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.589337 -0.270625 -0.0435217 RAD 0.00617284 + txt002 + SPHERE CENTER 0.586853 -0.273647 -0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.580045 -0.291679 -0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER 0.606463 -0.283431 -0.031176 RAD 0.00617284 + txt002 + SPHERE CENTER 0.59717 -0.304484 -0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.621104 -0.299257 -0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.678274 -0.316914 -0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER 0.69384 -0.305407 -0.138161 RAD 0.00617284 + txt002 + SPHERE CENTER 0.674446 -0.317721 -0.147213 RAD 0.00617284 + txt002 + SPHERE CENTER 0.671002 -0.296616 -0.134867 RAD 0.00617284 + txt002 + SPHERE CENTER 0.697667 -0.3046 -0.113782 RAD 0.00617284 + txt002 + SPHERE CENTER 0.67483 -0.295809 -0.110488 RAD 0.00617284 + txt002 + SPHERE CENTER 0.682101 -0.316107 -0.0984536 RAD 0.00617284 + txt002 + SPHERE CENTER 0.701111 -0.325704 -0.126127 RAD 0.00617284 + txt002 + SPHERE CENTER 0.685545 -0.337211 -0.110799 RAD 0.00617284 + txt002 + SPHERE CENTER 0.681717 -0.338018 -0.135179 RAD 0.00617284 + txt002 + SPHERE CENTER 0.656357 -0.33883 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.677411 -0.329538 -0.0466081 RAD 0.00617284 + txt002 + SPHERE CENTER 0.674389 -0.332022 -0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.661584 -0.314897 -0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER 0.659378 -0.336346 -0.031176 RAD 0.00617284 + txt002 + SPHERE CENTER 0.643552 -0.321705 -0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.638325 -0.345639 -0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.672184 -0.353472 -0.0435217 RAD 0.00617284 + txt002 + SPHERE CENTER 0.65113 -0.362764 -0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER 0.669162 -0.355956 -0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.659866 -0.3877 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.684201 -0.391875 -0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER 0.674986 -0.37258 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.674986 -0.37258 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.669081 -0.406996 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.659866 -0.3877 -0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER 0.644745 -0.40282 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.669081 -0.406996 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.644745 -0.40282 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.659866 -0.3877 -0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER 0.607487 -0.335322 0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER 0.659645 -0.283164 0.104315 RAD 0.0185185 + txt002 + SPHERE CENTER 0.672915 -0.269894 0.0882695 RAD 0.00617284 + txt002 + SPHERE CENTER 0.666987 -0.293281 0.0830215 RAD 0.00617284 + txt002 + SPHERE CENTER 0.649528 -0.275822 0.0830215 RAD 0.00617284 + txt002 + SPHERE CENTER 0.665573 -0.259777 0.109563 RAD 0.00617284 + txt002 + SPHERE CENTER 0.642185 -0.265705 0.104315 RAD 0.00617284 + txt002 + SPHERE CENTER 0.652302 -0.273047 0.125608 RAD 0.00617284 + txt002 + SPHERE CENTER 0.683032 -0.277236 0.109563 RAD 0.00617284 + txt002 + SPHERE CENTER 0.669762 -0.290507 0.125608 RAD 0.00617284 + txt002 + SPHERE CENTER 0.677104 -0.300624 0.104315 RAD 0.00617284 + txt002 + SPHERE CENTER 0.656357 -0.33883 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.663448 -0.328536 0.0342624 RAD 0.00617284 + txt002 + SPHERE CENTER 0.639482 -0.329516 0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.654603 -0.314396 0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER 0.680322 -0.33785 0.0496945 RAD 0.00617284 + txt002 + SPHERE CENTER 0.671477 -0.32371 0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.673232 -0.348145 0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.665202 -0.35297 0.0373488 RAD 0.00617284 + txt002 + SPHERE CENTER 0.658111 -0.363265 0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER 0.641237 -0.353951 0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.603979 -0.286452 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.614273 -0.279361 0.0342624 RAD 0.00617284 + txt002 + SPHERE CENTER 0.628413 -0.288206 0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER 0.613293 -0.303327 0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.589839 -0.277607 0.0373488 RAD 0.00617284 + txt002 + SPHERE CENTER 0.588858 -0.301572 0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.579544 -0.284698 0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER 0.604959 -0.262487 0.0496945 RAD 0.00617284 + txt002 + SPHERE CENTER 0.594664 -0.269578 0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.619099 -0.271332 0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.610775 -0.279656 0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER 0.621535 -0.258061 0.165118 RAD 0.00617284 + txt002 + SPHERE CENTER 0.634468 -0.275921 0.154009 RAD 0.00617284 + txt002 + SPHERE CENTER 0.616678 -0.264057 0.141664 RAD 0.00617284 + txt002 + SPHERE CENTER 0.597842 -0.261795 0.170979 RAD 0.00617284 + txt002 + SPHERE CENTER 0.592985 -0.267791 0.147525 RAD 0.00617284 + txt002 + SPHERE CENTER 0.587082 -0.28339 0.165731 RAD 0.00617284 + txt002 + SPHERE CENTER 0.615632 -0.27366 0.183325 RAD 0.00617284 + txt002 + SPHERE CENTER 0.604872 -0.295255 0.178077 RAD 0.00617284 + txt002 + SPHERE CENTER 0.628565 -0.29152 0.172216 RAD 0.00617284 + txt002 + SPHERE CENTER 0.555109 -0.282943 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.550934 -0.258608 0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER 0.570229 -0.267823 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.570229 -0.267823 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.535813 -0.273728 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.555109 -0.282943 0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER 0.539989 -0.298064 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.535813 -0.273728 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.539989 -0.298064 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.555109 -0.282943 0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER 0.558618 -0.331813 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.55307 -0.320611 0.18796 RAD 0.00617284 + txt002 + SPHERE CENTER 0.57665 -0.325005 0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.563845 -0.30788 0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER 0.535038 -0.327419 0.172528 RAD 0.00617284 + txt002 + SPHERE CENTER 0.545813 -0.314688 0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER 0.540585 -0.338621 0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.547843 -0.344544 0.184873 RAD 0.00617284 + txt002 + SPHERE CENTER 0.553391 -0.355747 0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.571423 -0.348938 0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.663153 -0.332034 0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER 0.684748 -0.321274 0.165118 RAD 0.00617284 + txt002 + SPHERE CENTER 0.678752 -0.326131 0.141664 RAD 0.00617284 + txt002 + SPHERE CENTER 0.666888 -0.308341 0.154009 RAD 0.00617284 + txt002 + SPHERE CENTER 0.669149 -0.327177 0.183325 RAD 0.00617284 + txt002 + SPHERE CENTER 0.651289 -0.314244 0.172216 RAD 0.00617284 + txt002 + SPHERE CENTER 0.647554 -0.337937 0.178077 RAD 0.00617284 + txt002 + SPHERE CENTER 0.681014 -0.344967 0.170979 RAD 0.00617284 + txt002 + SPHERE CENTER 0.659419 -0.355727 0.165731 RAD 0.00617284 + txt002 + SPHERE CENTER 0.675018 -0.349824 0.147525 RAD 0.00617284 + txt002 + SPHERE CENTER 0.610996 -0.384191 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.622198 -0.389739 0.18796 RAD 0.00617284 + txt002 + SPHERE CENTER 0.63493 -0.378964 0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER 0.617804 -0.366159 0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.598265 -0.394966 0.184873 RAD 0.00617284 + txt002 + SPHERE CENTER 0.593871 -0.371386 0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.587062 -0.389418 0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.61539 -0.407771 0.172528 RAD 0.00617284 + txt002 + SPHERE CENTER 0.604188 -0.402224 0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.628121 -0.396997 0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER 0.659866 -0.3877 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.684201 -0.391875 0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER 0.674986 -0.37258 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.674986 -0.37258 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.669081 -0.406996 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.659866 -0.3877 0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER 0.644745 -0.40282 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.669081 -0.406996 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.644745 -0.40282 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.659866 -0.3877 0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER 0.554344 -0.645066 0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER 0.610229 -0.668521 0.153697 RAD 0.0185185 + txt002 + SPHERE CENTER 0.633406 -0.663938 0.160875 RAD 0.00617284 + txt002 + SPHERE CENTER 0.626429 -0.65892 0.137727 RAD 0.00617284 + txt002 + SPHERE CENTER 0.617928 -0.64522 0.156428 RAD 0.00617284 + txt002 + SPHERE CENTER 0.617206 -0.673539 0.176845 RAD 0.00617284 + txt002 + SPHERE CENTER 0.601728 -0.654822 0.172398 RAD 0.00617284 + txt002 + SPHERE CENTER 0.59403 -0.678123 0.169668 RAD 0.00617284 + txt002 + SPHERE CENTER 0.625707 -0.687239 0.158144 RAD 0.00617284 + txt002 + SPHERE CENTER 0.602531 -0.691822 0.150967 RAD 0.00617284 + txt002 + SPHERE CENTER 0.61873 -0.682221 0.134996 RAD 0.00617284 + txt002 + SPHERE CENTER 0.622977 -0.619787 0.099389 RAD 0.0185185 + txt002 + SPHERE CENTER 0.63767 -0.608008 0.0834188 RAD 0.00617284 + txt002 + SPHERE CENTER 0.620102 -0.623239 0.0751099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.613891 -0.601637 0.0853287 RAD 0.00617284 + txt002 + SPHERE CENTER 0.640545 -0.604555 0.107698 RAD 0.00617284 + txt002 + SPHERE CENTER 0.616766 -0.598184 0.109608 RAD 0.00617284 + txt002 + SPHERE CENTER 0.625852 -0.616334 0.123668 RAD 0.00617284 + txt002 + SPHERE CENTER 0.646756 -0.626157 0.0974792 RAD 0.00617284 + txt002 + SPHERE CENTER 0.632063 -0.637936 0.113449 RAD 0.00617284 + txt002 + SPHERE CENTER 0.629188 -0.641389 0.0891702 RAD 0.00617284 + txt002 + SPHERE CENTER 0.585648 -0.598918 0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER 0.601562 -0.580238 0.162601 RAD 0.00617284 + txt002 + SPHERE CENTER 0.605914 -0.59781 0.14581 RAD 0.00617284 + txt002 + SPHERE CENTER 0.587563 -0.581665 0.142311 RAD 0.00617284 + txt002 + SPHERE CENTER 0.581295 -0.581346 0.176661 RAD 0.00617284 + txt002 + SPHERE CENTER 0.567297 -0.582773 0.156372 RAD 0.00617284 + txt002 + SPHERE CENTER 0.565381 -0.600026 0.173931 RAD 0.00617284 + txt002 + SPHERE CENTER 0.599646 -0.597491 0.18016 RAD 0.00617284 + txt002 + SPHERE CENTER 0.583732 -0.616171 0.177429 RAD 0.00617284 + txt002 + SPHERE CENTER 0.603999 -0.615063 0.163369 RAD 0.00617284 + txt002 + SPHERE CENTER 0.541596 -0.6938 0.165419 RAD 0.0185185 + txt002 + SPHERE CENTER 0.547376 -0.70016 0.188567 RAD 0.00617284 + txt002 + SPHERE CENTER 0.564621 -0.690564 0.173728 RAD 0.00617284 + txt002 + SPHERE CENTER 0.546319 -0.676324 0.182211 RAD 0.00617284 + txt002 + SPHERE CENTER 0.524351 -0.703396 0.180258 RAD 0.00617284 + txt002 + SPHERE CENTER 0.523294 -0.679561 0.173902 RAD 0.00617284 + txt002 + SPHERE CENTER 0.518571 -0.697037 0.157111 RAD 0.00617284 + txt002 + SPHERE CENTER 0.542652 -0.717636 0.171776 RAD 0.00617284 + txt002 + SPHERE CENTER 0.536873 -0.711276 0.148628 RAD 0.00617284 + txt002 + SPHERE CENTER 0.559898 -0.70804 0.156937 RAD 0.00617284 + txt002 + SPHERE CENTER 0.517014 -0.624197 0.171592 RAD 0.0185185 + txt002 + SPHERE CENTER 0.516313 -0.60809 0.190293 RAD 0.00617284 + txt002 + SPHERE CENTER 0.538029 -0.616221 0.181811 RAD 0.00617284 + txt002 + SPHERE CENTER 0.524375 -0.60089 0.168094 RAD 0.00617284 + txt002 + SPHERE CENTER 0.495298 -0.616065 0.180075 RAD 0.00617284 + txt002 + SPHERE CENTER 0.50336 -0.608865 0.157875 RAD 0.00617284 + txt002 + SPHERE CENTER 0.495999 -0.632172 0.161374 RAD 0.00617284 + txt002 + SPHERE CENTER 0.508952 -0.631397 0.193792 RAD 0.00617284 + txt002 + SPHERE CENTER 0.509653 -0.647504 0.175091 RAD 0.00617284 + txt002 + SPHERE CENTER 0.530668 -0.639529 0.18531 RAD 0.00617284 + txt002 + SPHERE CENTER 0.48571 -0.670344 0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER 0.466887 -0.67091 0.138803 RAD 0.00617284 + txt002 + SPHERE CENTER 0.490138 -0.671107 0.147112 RAD 0.00617284 + txt002 + SPHERE CENTER 0.480853 -0.650637 0.136894 RAD 0.00617284 + txt002 + SPHERE CENTER 0.46246 -0.670147 0.114524 RAD 0.00617284 + txt002 + SPHERE CENTER 0.476425 -0.649874 0.112614 RAD 0.00617284 + txt002 + SPHERE CENTER 0.481283 -0.669581 0.0985541 RAD 0.00617284 + txt002 + SPHERE CENTER 0.471745 -0.690617 0.124743 RAD 0.00617284 + txt002 + SPHERE CENTER 0.490567 -0.690052 0.108773 RAD 0.00617284 + txt002 + SPHERE CENTER 0.494995 -0.690815 0.133052 RAD 0.00617284 + txt002 + SPHERE CENTER 0.578925 -0.714669 0.104938 RAD 0.0185185 + txt002 + SPHERE CENTER 0.597914 -0.729812 0.109385 RAD 0.00617284 + txt002 + SPHERE CENTER 0.602084 -0.70632 0.103028 RAD 0.00617284 + txt002 + SPHERE CENTER 0.592661 -0.711617 0.125228 RAD 0.00617284 + txt002 + SPHERE CENTER 0.574755 -0.738161 0.111295 RAD 0.00617284 + txt002 + SPHERE CENTER 0.569503 -0.719965 0.127138 RAD 0.00617284 + txt002 + SPHERE CENTER 0.555767 -0.723017 0.106848 RAD 0.00617284 + txt002 + SPHERE CENTER 0.584178 -0.732864 0.0890951 RAD 0.00617284 + txt002 + SPHERE CENTER 0.565189 -0.71772 0.0846485 RAD 0.00617284 + txt002 + SPHERE CENTER 0.588348 -0.709372 0.0827387 RAD 0.00617284 + txt002 + SPHERE CENTER 0.52304 -0.691213 0.062352 RAD 0.0185185 + txt002 + SPHERE CENTER 0.511567 -0.712906 0.0596212 RAD 0.00617284 + txt002 + SPHERE CENTER 0.529503 -0.710453 0.0764123 RAD 0.00617284 + txt002 + SPHERE CENTER 0.507717 -0.699372 0.079911 RAD 0.00617284 + txt002 + SPHERE CENTER 0.505104 -0.693665 0.0455609 RAD 0.00617284 + txt002 + SPHERE CENTER 0.501254 -0.680131 0.0658506 RAD 0.00617284 + txt002 + SPHERE CENTER 0.516576 -0.671972 0.0482916 RAD 0.00617284 + txt002 + SPHERE CENTER 0.526889 -0.704747 0.0420622 RAD 0.00617284 + txt002 + SPHERE CENTER 0.538362 -0.683054 0.044793 RAD 0.00617284 + txt002 + SPHERE CENTER 0.544826 -0.702295 0.0588533 RAD 0.00617284 + txt002 + SPHERE CENTER 0.591673 -0.665934 0.0506299 RAD 0.0185185 + txt002 + SPHERE CENTER 0.605761 -0.658095 0.0319289 RAD 0.00617284 + txt002 + SPHERE CENTER 0.58746 -0.643855 0.0404111 RAD 0.00617284 + txt002 + SPHERE CENTER 0.607672 -0.647455 0.0541285 RAD 0.00617284 + txt002 + SPHERE CENTER 0.609975 -0.680174 0.0421477 RAD 0.00617284 + txt002 + SPHERE CENTER 0.611885 -0.669535 0.0643473 RAD 0.00617284 + txt002 + SPHERE CENTER 0.595887 -0.688013 0.0608487 RAD 0.00617284 + txt002 + SPHERE CENTER 0.589763 -0.676573 0.0284303 RAD 0.00617284 + txt002 + SPHERE CENTER 0.575674 -0.684413 0.0471312 RAD 0.00617284 + txt002 + SPHERE CENTER 0.571461 -0.662334 0.0369125 RAD 0.00617284 + txt002 + SPHERE CENTER 0.471405 -0.471405 0.222222 RAD 0.0555556 + txt002 + SPHERE CENTER 0.501645 -0.441164 0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER 0.518106 -0.424703 0.290934 RAD 0.00617284 + txt002 + SPHERE CENTER 0.522721 -0.437548 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.505261 -0.420089 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.497031 -0.428319 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER 0.484186 -0.423704 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER 0.48057 -0.44478 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER 0.51449 -0.445778 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER 0.498029 -0.462239 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER 0.519105 -0.458623 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER 0.542955 -0.452233 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.560583 -0.44013 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.542955 -0.452233 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER 0.53742 -0.431578 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.560583 -0.44013 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.53742 -0.431578 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.542955 -0.452233 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER 0.566118 -0.460785 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.548489 -0.472887 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.548489 -0.472887 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.490576 -0.399854 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.502679 -0.382226 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.511231 -0.405389 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.490576 -0.399854 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER 0.482024 -0.376691 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.469922 -0.39432 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.469922 -0.39432 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.502679 -0.382226 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.490576 -0.399854 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER 0.511231 -0.405389 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.430095 -0.460336 0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER 0.427669 -0.446904 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER 0.450155 -0.45293 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER 0.436486 -0.436486 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER 0.407609 -0.454311 0.290934 RAD 0.00617284 + txt002 + SPHERE CENTER 0.416426 -0.443892 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.410035 -0.467742 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.421278 -0.470754 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER 0.423704 -0.484186 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER 0.443764 -0.47678 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER 0.419026 -0.419026 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.414851 -0.39469 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.434147 -0.403906 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.434147 -0.403906 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.399731 -0.409811 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.419026 -0.419026 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER 0.403906 -0.434147 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.399731 -0.409811 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.403906 -0.434147 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.419026 -0.419026 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER 0.399854 -0.490576 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.378536 -0.488909 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.399854 -0.490576 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER 0.39432 -0.469922 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.378536 -0.488909 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.39432 -0.469922 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.399854 -0.490576 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER 0.384071 -0.509564 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.405389 -0.511231 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.405389 -0.511231 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.482473 -0.512714 0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER 0.495905 -0.51514 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER 0.506323 -0.506323 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER 0.48988 -0.492654 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER 0.472055 -0.521531 0.30328 RAD 0.00617284 + txt002 + SPHERE CENTER 0.46603 -0.499045 0.295049 RAD 0.00617284 + txt002 + SPHERE CENTER 0.458623 -0.519105 0.282703 RAD 0.00617284 + txt002 + SPHERE CENTER 0.488498 -0.5352 0.290934 RAD 0.00617284 + txt002 + SPHERE CENTER 0.475067 -0.532774 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.498917 -0.526383 0.270358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.452233 -0.542955 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.4539 -0.564273 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.472887 -0.548489 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.452233 -0.542955 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER 0.433245 -0.558738 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.431578 -0.53742 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.431578 -0.53742 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.4539 -0.564273 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.452233 -0.542955 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER 0.472887 -0.548489 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.523783 -0.523783 0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.548119 -0.527958 0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.538903 -0.508662 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.538903 -0.508662 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.532998 -0.543078 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.523783 -0.523783 0.246914 RAD 0.00617284 + txt002 + SPHERE CENTER 0.508662 -0.538903 0.234568 RAD 0.00617284 + txt002 + SPHERE CENTER 0.532998 -0.543078 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.508662 -0.538903 0.209877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.523783 -0.523783 0.197531 RAD 0.00617284 + txt002 + SPHERE CENTER 0.335322 -0.607487 0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER 0.313405 -0.629404 0.178389 RAD 0.0185185 + txt002 + SPHERE CENTER 0.316595 -0.626214 0.202664 RAD 0.00617284 + txt002 + SPHERE CENTER 0.335868 -0.624401 0.187336 RAD 0.00617284 + txt002 + SPHERE CENTER 0.318408 -0.606941 0.187336 RAD 0.00617284 + txt002 + SPHERE CENTER 0.294133 -0.631217 0.193717 RAD 0.00617284 + txt002 + SPHERE CENTER 0.295946 -0.611945 0.178389 RAD 0.00617284 + txt002 + SPHERE CENTER 0.290942 -0.634407 0.169441 RAD 0.00617284 + txt002 + SPHERE CENTER 0.311592 -0.648676 0.193717 RAD 0.00617284 + txt002 + SPHERE CENTER 0.308402 -0.651867 0.169441 RAD 0.00617284 + txt002 + SPHERE CENTER 0.330864 -0.646863 0.178389 RAD 0.00617284 + txt002 + SPHERE CENTER 0.384191 -0.610996 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.405245 -0.601704 0.175614 RAD 0.00617284 + txt002 + SPHERE CENTER 0.402224 -0.604188 0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.389418 -0.587062 0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.387213 -0.608512 0.191046 RAD 0.00617284 + txt002 + SPHERE CENTER 0.371386 -0.593871 0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.366159 -0.617804 0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.400018 -0.625637 0.178701 RAD 0.00617284 + txt002 + SPHERE CENTER 0.378964 -0.63493 0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER 0.396997 -0.628121 0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER 0.331813 -0.558618 0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.341105 -0.537564 0.175614 RAD 0.00617284 + txt002 + SPHERE CENTER 0.355747 -0.553391 0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.338621 -0.540585 0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.317172 -0.542791 0.178701 RAD 0.00617284 + txt002 + SPHERE CENTER 0.314688 -0.545813 0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER 0.30788 -0.563845 0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER 0.334297 -0.555596 0.191046 RAD 0.00617284 + txt002 + SPHERE CENTER 0.325005 -0.57665 0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.348938 -0.571423 0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.264535 -0.625895 0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER 0.245336 -0.623429 0.138161 RAD 0.00617284 + txt002 + SPHERE CENTER 0.268271 -0.624736 0.147213 RAD 0.00617284 + txt002 + SPHERE CENTER 0.260997 -0.604627 0.134867 RAD 0.00617284 + txt002 + SPHERE CENTER 0.2416 -0.624589 0.113782 RAD 0.00617284 + txt002 + SPHERE CENTER 0.257262 -0.605787 0.110488 RAD 0.00617284 + txt002 + SPHERE CENTER 0.2608 -0.627055 0.0984536 RAD 0.00617284 + txt002 + SPHERE CENTER 0.248874 -0.644697 0.126127 RAD 0.00617284 + txt002 + SPHERE CENTER 0.268073 -0.647163 0.110799 RAD 0.00617284 + txt002 + SPHERE CENTER 0.271809 -0.646004 0.135179 RAD 0.00617284 + txt002 + SPHERE CENTER 0.282943 -0.555109 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.278768 -0.530773 0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER 0.298064 -0.539989 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.298064 -0.539989 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.263648 -0.545894 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.282943 -0.555109 0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER 0.267823 -0.570229 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.263648 -0.545894 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.267823 -0.570229 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.282943 -0.555109 0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER 0.286452 -0.603979 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.266942 -0.591774 0.0466081 RAD 0.00617284 + txt002 + SPHERE CENTER 0.269578 -0.594664 0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.284698 -0.579544 0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER 0.283817 -0.601088 0.031176 RAD 0.00617284 + txt002 + SPHERE CENTER 0.301572 -0.588858 0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.303327 -0.613293 0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.268696 -0.616209 0.0435217 RAD 0.00617284 + txt002 + SPHERE CENTER 0.288206 -0.628413 0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER 0.271332 -0.619099 0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.316914 -0.678274 0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER 0.31938 -0.697473 0.138161 RAD 0.00617284 + txt002 + SPHERE CENTER 0.338182 -0.681812 0.134867 RAD 0.00617284 + txt002 + SPHERE CENTER 0.318074 -0.674538 0.147213 RAD 0.00617284 + txt002 + SPHERE CENTER 0.298112 -0.693935 0.126127 RAD 0.00617284 + txt002 + SPHERE CENTER 0.296805 -0.671 0.135179 RAD 0.00617284 + txt002 + SPHERE CENTER 0.295646 -0.674736 0.110799 RAD 0.00617284 + txt002 + SPHERE CENTER 0.31822 -0.701209 0.113782 RAD 0.00617284 + txt002 + SPHERE CENTER 0.315754 -0.682009 0.0984536 RAD 0.00617284 + txt002 + SPHERE CENTER 0.337022 -0.685547 0.110488 RAD 0.00617284 + txt002 + SPHERE CENTER 0.33883 -0.656357 0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.351035 -0.675867 0.0466081 RAD 0.00617284 + txt002 + SPHERE CENTER 0.363265 -0.658111 0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER 0.348145 -0.673232 0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.3266 -0.674113 0.0435217 RAD 0.00617284 + txt002 + SPHERE CENTER 0.32371 -0.671477 0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.314396 -0.654603 0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER 0.341721 -0.658993 0.031176 RAD 0.00617284 + txt002 + SPHERE CENTER 0.329516 -0.639482 0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.353951 -0.641237 0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.3877 -0.659866 0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.412036 -0.664041 0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER 0.40282 -0.644745 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.40282 -0.644745 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.396915 -0.679161 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.3877 -0.659866 0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER 0.37258 -0.674986 0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.396915 -0.679161 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.37258 -0.674986 0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.3877 -0.659866 0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER 0.554344 -0.645066 -0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER 0.616373 -0.681385 -0.129006 RAD 0.0185185 + txt002 + SPHERE CENTER 0.639472 -0.678928 -0.137375 RAD 0.00617284 + txt002 + SPHERE CENTER 0.621631 -0.664108 -0.145845 RAD 0.00617284 + txt002 + SPHERE CENTER 0.629767 -0.661636 -0.122663 RAD 0.00617284 + txt002 + SPHERE CENTER 0.634214 -0.696205 -0.120537 RAD 0.00617284 + txt002 + SPHERE CENTER 0.624508 -0.678912 -0.105825 RAD 0.00617284 + txt002 + SPHERE CENTER 0.611115 -0.698662 -0.112168 RAD 0.00617284 + txt002 + SPHERE CENTER 0.626079 -0.698678 -0.143718 RAD 0.00617284 + txt002 + SPHERE CENTER 0.602979 -0.701135 -0.135349 RAD 0.00617284 + txt002 + SPHERE CENTER 0.608237 -0.683858 -0.152187 RAD 0.00617284 + txt002 + SPHERE CENTER 0.617144 -0.607573 -0.122833 RAD 0.0185185 + txt002 + SPHERE CENTER 0.63057 -0.595495 -0.139672 RAD 0.00617284 + txt002 + SPHERE CENTER 0.617371 -0.615286 -0.146288 RAD 0.00617284 + txt002 + SPHERE CENTER 0.605919 -0.594239 -0.140323 RAD 0.00617284 + txt002 + SPHERE CENTER 0.630343 -0.587782 -0.116217 RAD 0.00617284 + txt002 + SPHERE CENTER 0.605692 -0.586526 -0.116868 RAD 0.00617284 + txt002 + SPHERE CENTER 0.616917 -0.59986 -0.0993785 RAD 0.00617284 + txt002 + SPHERE CENTER 0.641795 -0.608828 -0.122182 RAD 0.00617284 + txt002 + SPHERE CENTER 0.628369 -0.620906 -0.105343 RAD 0.00617284 + txt002 + SPHERE CENTER 0.628595 -0.628619 -0.128798 RAD 0.00617284 + txt002 + SPHERE CENTER 0.609912 -0.649723 -0.062352 RAD 0.0185185 + txt002 + SPHERE CENTER 0.631982 -0.640648 -0.0560094 RAD 0.00617284 + txt002 + SPHERE CENTER 0.62585 -0.64267 -0.0798417 RAD 0.00617284 + txt002 + SPHERE CENTER 0.614812 -0.625749 -0.0656463 RAD 0.00617284 + txt002 + SPHERE CENTER 0.616044 -0.647702 -0.0385197 RAD 0.00617284 + txt002 + SPHERE CENTER 0.598874 -0.632802 -0.0481565 RAD 0.00617284 + txt002 + SPHERE CENTER 0.593974 -0.656777 -0.0448623 RAD 0.00617284 + txt002 + SPHERE CENTER 0.627081 -0.664623 -0.0527151 RAD 0.00617284 + txt002 + SPHERE CENTER 0.605012 -0.673698 -0.0590577 RAD 0.00617284 + txt002 + SPHERE CENTER 0.620949 -0.666645 -0.0765474 RAD 0.00617284 + txt002 + SPHERE CENTER 0.553573 -0.718878 -0.117284 RAD 0.0185185 + txt002 + SPHERE CENTER 0.563328 -0.73992 -0.108814 RAD 0.00617284 + txt002 + SPHERE CENTER 0.577348 -0.719679 -0.110668 RAD 0.00617284 + txt002 + SPHERE CENTER 0.559693 -0.720935 -0.0934517 RAD 0.00617284 + txt002 + SPHERE CENTER 0.539553 -0.739118 -0.115431 RAD 0.00617284 + txt002 + SPHERE CENTER 0.535918 -0.720133 -0.100068 RAD 0.00617284 + txt002 + SPHERE CENTER 0.529798 -0.718076 -0.1239 RAD 0.00617284 + txt002 + SPHERE CENTER 0.557208 -0.737863 -0.132647 RAD 0.00617284 + txt002 + SPHERE CENTER 0.547453 -0.716821 -0.141116 RAD 0.00617284 + txt002 + SPHERE CENTER 0.571228 -0.717623 -0.1345 RAD 0.00617284 + txt002 + SPHERE CENTER 0.547112 -0.687216 -0.0506299 RAD 0.0185185 + txt002 + SPHERE CENTER 0.554862 -0.690713 -0.0274488 RAD 0.00617284 + txt002 + SPHERE CENTER 0.570641 -0.682694 -0.0446649 RAD 0.00617284 + txt002 + SPHERE CENTER 0.552739 -0.667813 -0.0364345 RAD 0.00617284 + txt002 + SPHERE CENTER 0.531333 -0.695235 -0.0334138 RAD 0.00617284 + txt002 + SPHERE CENTER 0.52921 -0.672335 -0.0423994 RAD 0.00617284 + txt002 + SPHERE CENTER 0.523582 -0.691738 -0.0565949 RAD 0.00617284 + txt002 + SPHERE CENTER 0.549235 -0.710116 -0.0416443 RAD 0.00617284 + txt002 + SPHERE CENTER 0.541484 -0.706619 -0.0648253 RAD 0.00617284 + txt002 + SPHERE CENTER 0.565014 -0.702097 -0.0588603 RAD 0.00617284 + txt002 + SPHERE CENTER 0.491544 -0.682558 -0.099389 RAD 0.0185185 + txt002 + SPHERE CENTER 0.474542 -0.688647 -0.0825505 RAD 0.00617284 + txt002 + SPHERE CENTER 0.498226 -0.686417 -0.0759343 RAD 0.00617284 + txt002 + SPHERE CENTER 0.485132 -0.666351 -0.0818993 RAD 0.00617284 + txt002 + SPHERE CENTER 0.46786 -0.684788 -0.106005 RAD 0.00617284 + txt002 + SPHERE CENTER 0.47845 -0.662492 -0.105354 RAD 0.00617284 + txt002 + SPHERE CENTER 0.484862 -0.678699 -0.122844 RAD 0.00617284 + txt002 + SPHERE CENTER 0.480953 -0.704854 -0.10004 RAD 0.00617284 + txt002 + SPHERE CENTER 0.497955 -0.698765 -0.116879 RAD 0.00617284 + txt002 + SPHERE CENTER 0.504637 -0.702624 -0.093424 RAD 0.00617284 + txt002 + SPHERE CENTER 0.560805 -0.676727 -0.177765 RAD 0.0185185 + txt002 + SPHERE CENTER 0.57563 -0.689897 -0.192477 RAD 0.00617284 + txt002 + SPHERE CENTER 0.585222 -0.673115 -0.177114 RAD 0.00617284 + txt002 + SPHERE CENTER 0.575587 -0.693998 -0.168128 RAD 0.00617284 + txt002 + SPHERE CENTER 0.551213 -0.693509 -0.193128 RAD 0.00617284 + txt002 + SPHERE CENTER 0.55117 -0.69761 -0.16878 RAD 0.00617284 + txt002 + SPHERE CENTER 0.536388 -0.680339 -0.178416 RAD 0.00617284 + txt002 + SPHERE CENTER 0.560848 -0.672626 -0.202114 RAD 0.00617284 + txt002 + SPHERE CENTER 0.546023 -0.659456 -0.187402 RAD 0.00617284 + txt002 + SPHERE CENTER 0.57044 -0.655844 -0.186751 RAD 0.00617284 + txt002 + SPHERE CENTER 0.498776 -0.640408 -0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER 0.478525 -0.627785 -0.166213 RAD 0.00617284 + txt002 + SPHERE CENTER 0.484234 -0.630799 -0.142381 RAD 0.00617284 + txt002 + SPHERE CENTER 0.497935 -0.615951 -0.156576 RAD 0.00617284 + txt002 + SPHERE CENTER 0.493066 -0.637394 -0.183703 RAD 0.00617284 + txt002 + SPHERE CENTER 0.512476 -0.62556 -0.174066 RAD 0.00617284 + txt002 + SPHERE CENTER 0.513317 -0.650016 -0.17736 RAD 0.00617284 + txt002 + SPHERE CENTER 0.479365 -0.652241 -0.169507 RAD 0.00617284 + txt002 + SPHERE CENTER 0.499616 -0.664864 -0.163165 RAD 0.00617284 + txt002 + SPHERE CENTER 0.485075 -0.655255 -0.145675 RAD 0.00617284 + txt002 + SPHERE CENTER 0.561576 -0.602915 -0.171592 RAD 0.0185185 + txt002 + SPHERE CENTER 0.570049 -0.602201 -0.194773 RAD 0.00617284 + txt002 + SPHERE CENTER 0.582252 -0.615021 -0.177557 RAD 0.00617284 + txt002 + SPHERE CENTER 0.560414 -0.623084 -0.185788 RAD 0.00617284 + txt002 + SPHERE CENTER 0.549372 -0.590095 -0.188808 RAD 0.00617284 + txt002 + SPHERE CENTER 0.539737 -0.610978 -0.179823 RAD 0.00617284 + txt002 + SPHERE CENTER 0.540899 -0.590808 -0.165627 RAD 0.00617284 + txt002 + SPHERE CENTER 0.571211 -0.582032 -0.180578 RAD 0.00617284 + txt002 + SPHERE CENTER 0.562738 -0.582745 -0.157397 RAD 0.00617284 + txt002 + SPHERE CENTER 0.583414 -0.594852 -0.163362 RAD 0.00617284 + txt002 + SPHERE CENTER 0.335322 -0.607487 -0.111111 RAD 0.0555556 + txt002 + SPHERE CENTER 0.283164 -0.659645 -0.104315 RAD 0.0185185 + txt002 + SPHERE CENTER 0.269894 -0.672915 -0.0882695 RAD 0.00617284 + txt002 + SPHERE CENTER 0.293281 -0.666987 -0.0830215 RAD 0.00617284 + txt002 + SPHERE CENTER 0.275822 -0.649528 -0.0830215 RAD 0.00617284 + txt002 + SPHERE CENTER 0.259777 -0.665573 -0.109563 RAD 0.00617284 + txt002 + SPHERE CENTER 0.265705 -0.642185 -0.104315 RAD 0.00617284 + txt002 + SPHERE CENTER 0.273047 -0.652302 -0.125608 RAD 0.00617284 + txt002 + SPHERE CENTER 0.277236 -0.683032 -0.109563 RAD 0.00617284 + txt002 + SPHERE CENTER 0.290507 -0.669762 -0.125608 RAD 0.00617284 + txt002 + SPHERE CENTER 0.300624 -0.677104 -0.104315 RAD 0.00617284 + txt002 + SPHERE CENTER 0.33883 -0.656357 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.350033 -0.661904 -0.0342624 RAD 0.00617284 + txt002 + SPHERE CENTER 0.362764 -0.65113 -0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER 0.345639 -0.638325 -0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.326099 -0.667131 -0.0373488 RAD 0.00617284 + txt002 + SPHERE CENTER 0.321705 -0.643552 -0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.314897 -0.661584 -0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER 0.343224 -0.679937 -0.0496945 RAD 0.00617284 + txt002 + SPHERE CENTER 0.332022 -0.674389 -0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.355956 -0.669162 -0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.286452 -0.603979 -0.0555556 RAD 0.0185185 + txt002 + SPHERE CENTER 0.280905 -0.592776 -0.0342624 RAD 0.00617284 + txt002 + SPHERE CENTER 0.304484 -0.59717 -0.0401235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.291679 -0.580045 -0.0524691 RAD 0.00617284 + txt002 + SPHERE CENTER 0.262872 -0.599585 -0.0496945 RAD 0.00617284 + txt002 + SPHERE CENTER 0.273647 -0.586853 -0.0679012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.26842 -0.610787 -0.0709877 RAD 0.00617284 + txt002 + SPHERE CENTER 0.275678 -0.61671 -0.0373488 RAD 0.00617284 + txt002 + SPHERE CENTER 0.281225 -0.627912 -0.058642 RAD 0.00617284 + txt002 + SPHERE CENTER 0.299257 -0.621104 -0.0432099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.279656 -0.610775 -0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER 0.256944 -0.602632 -0.165118 RAD 0.00617284 + txt002 + SPHERE CENTER 0.26347 -0.606749 -0.141664 RAD 0.00617284 + txt002 + SPHERE CENTER 0.273158 -0.587686 -0.154009 RAD 0.00617284 + txt002 + SPHERE CENTER 0.27313 -0.606658 -0.183325 RAD 0.00617284 + txt002 + SPHERE CENTER 0.289344 -0.591712 -0.172216 RAD 0.00617284 + txt002 + SPHERE CENTER 0.295841 -0.614801 -0.178077 RAD 0.00617284 + txt002 + SPHERE CENTER 0.263442 -0.62572 -0.170979 RAD 0.00617284 + txt002 + SPHERE CENTER 0.286153 -0.633864 -0.165731 RAD 0.00617284 + txt002 + SPHERE CENTER 0.269968 -0.629838 -0.147525 RAD 0.00617284 + txt002 + SPHERE CENTER 0.282943 -0.555109 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.278768 -0.530773 -0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER 0.298064 -0.539989 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.298064 -0.539989 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.263648 -0.545894 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.282943 -0.555109 -0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER 0.267823 -0.570229 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.263648 -0.545894 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.267823 -0.570229 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.282943 -0.555109 -0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER 0.331813 -0.558618 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.342108 -0.551527 -0.18796 RAD 0.00617284 + txt002 + SPHERE CENTER 0.356248 -0.560372 -0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER 0.341128 -0.575492 -0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.317673 -0.549772 -0.184873 RAD 0.00617284 + txt002 + SPHERE CENTER 0.316693 -0.573738 -0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.307378 -0.556863 -0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.332793 -0.534652 -0.172528 RAD 0.00617284 + txt002 + SPHERE CENTER 0.322499 -0.541743 -0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.346933 -0.543497 -0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER 0.332034 -0.663153 -0.15987 RAD 0.0185185 + txt002 + SPHERE CENTER 0.340177 -0.685865 -0.165118 RAD 0.00617284 + txt002 + SPHERE CENTER 0.355123 -0.669651 -0.154009 RAD 0.00617284 + txt002 + SPHERE CENTER 0.33606 -0.679339 -0.141664 RAD 0.00617284 + txt002 + SPHERE CENTER 0.317089 -0.679367 -0.170979 RAD 0.00617284 + txt002 + SPHERE CENTER 0.312971 -0.672841 -0.147525 RAD 0.00617284 + txt002 + SPHERE CENTER 0.308945 -0.656656 -0.165731 RAD 0.00617284 + txt002 + SPHERE CENTER 0.336151 -0.669679 -0.183325 RAD 0.00617284 + txt002 + SPHERE CENTER 0.328008 -0.646968 -0.178077 RAD 0.00617284 + txt002 + SPHERE CENTER 0.351097 -0.653465 -0.172216 RAD 0.00617284 + txt002 + SPHERE CENTER 0.384191 -0.610996 -0.166667 RAD 0.0185185 + txt002 + SPHERE CENTER 0.391282 -0.600701 -0.18796 RAD 0.00617284 + txt002 + SPHERE CENTER 0.367317 -0.601681 -0.182099 RAD 0.00617284 + txt002 + SPHERE CENTER 0.382437 -0.586561 -0.169753 RAD 0.00617284 + txt002 + SPHERE CENTER 0.408157 -0.610016 -0.172528 RAD 0.00617284 + txt002 + SPHERE CENTER 0.399312 -0.595876 -0.154321 RAD 0.00617284 + txt002 + SPHERE CENTER 0.401066 -0.62031 -0.151235 RAD 0.00617284 + txt002 + SPHERE CENTER 0.393037 -0.625136 -0.184873 RAD 0.00617284 + txt002 + SPHERE CENTER 0.385946 -0.635431 -0.16358 RAD 0.00617284 + txt002 + SPHERE CENTER 0.369071 -0.626116 -0.179012 RAD 0.00617284 + txt002 + SPHERE CENTER 0.3877 -0.659866 -0.111111 RAD 0.0185185 + txt002 + SPHERE CENTER 0.412036 -0.664041 -0.111111 RAD 0.00617284 + txt002 + SPHERE CENTER 0.40282 -0.644745 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.40282 -0.644745 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.396915 -0.679161 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.3877 -0.659866 -0.0864198 RAD 0.00617284 + txt002 + SPHERE CENTER 0.37258 -0.674986 -0.0987654 RAD 0.00617284 + txt002 + SPHERE CENTER 0.396915 -0.679161 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.37258 -0.674986 -0.123457 RAD 0.00617284 + txt002 + SPHERE CENTER 0.3877 -0.659866 -0.135802 RAD 0.00617284 + txt002 + SPHERE CENTER 0.471405 -0.471405 -0.222222 RAD 0.0555556 + txt002 + SPHERE CENTER 0.441164 -0.441164 -0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER 0.443014 -0.422853 -0.299164 RAD 0.00617284 + txt002 + SPHERE CENTER 0.449156 -0.418916 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER 0.463412 -0.433171 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER 0.435021 -0.445101 -0.306292 RAD 0.00617284 + txt002 + SPHERE CENTER 0.455419 -0.455419 -0.296959 RAD 0.00617284 + txt002 + SPHERE CENTER 0.433171 -0.463412 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER 0.420766 -0.430846 -0.292037 RAD 0.00617284 + txt002 + SPHERE CENTER 0.418916 -0.449156 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER 0.426908 -0.426908 -0.268448 RAD 0.00617284 + txt002 + SPHERE CENTER 0.399854 -0.452233 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.383576 -0.43509 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER 0.40305 -0.440308 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.406245 -0.428383 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.380381 -0.447015 -0.236478 RAD 0.00617284 + txt002 + SPHERE CENTER 0.40305 -0.440308 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.396659 -0.464158 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.377186 -0.45894 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER 0.393464 -0.476083 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.396659 -0.464158 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.452233 -0.399854 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.45894 -0.377186 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER 0.476083 -0.393464 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.464158 -0.396659 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.43509 -0.383576 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER 0.440308 -0.40305 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.428383 -0.406245 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.447015 -0.380381 -0.207967 RAD 0.00617284 + txt002 + SPHERE CENTER 0.440308 -0.40305 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.464158 -0.396659 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.512714 -0.460336 -0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER 0.512375 -0.453047 -0.306292 RAD 0.00617284 + txt002 + SPHERE CENTER 0.493241 -0.465554 -0.296959 RAD 0.00617284 + txt002 + SPHERE CENTER 0.497443 -0.44229 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER 0.531849 -0.447829 -0.292037 RAD 0.00617284 + txt002 + SPHERE CENTER 0.516916 -0.437072 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER 0.532187 -0.455118 -0.268448 RAD 0.00617284 + txt002 + SPHERE CENTER 0.527647 -0.471093 -0.299164 RAD 0.00617284 + txt002 + SPHERE CENTER 0.527985 -0.478381 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER 0.508512 -0.483599 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER 0.523783 -0.419026 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.538038 -0.404771 -0.236478 RAD 0.00617284 + txt002 + SPHERE CENTER 0.532513 -0.427756 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.515053 -0.410297 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.529309 -0.396041 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER 0.506323 -0.401567 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.515053 -0.410297 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.546768 -0.4135 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER 0.532513 -0.427756 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.541242 -0.436486 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.542955 -0.490576 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.565623 -0.483869 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER 0.54615 -0.478651 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.549345 -0.466726 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.562428 -0.495794 -0.207967 RAD 0.00617284 + txt002 + SPHERE CENTER 0.54615 -0.478651 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.539759 -0.502501 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.559233 -0.507719 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER 0.536564 -0.514426 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.539759 -0.502501 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.460336 -0.512714 -0.282703 RAD 0.0185185 + txt002 + SPHERE CENTER 0.461599 -0.535539 -0.292037 RAD 0.00617284 + txt002 + SPHERE CENTER 0.478381 -0.527985 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER 0.455118 -0.532187 -0.268448 RAD 0.00617284 + txt002 + SPHERE CENTER 0.443553 -0.520267 -0.299164 RAD 0.00617284 + txt002 + SPHERE CENTER 0.437072 -0.516916 -0.275576 RAD 0.00617284 + txt002 + SPHERE CENTER 0.44229 -0.497443 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER 0.466817 -0.516065 -0.306292 RAD 0.00617284 + txt002 + SPHERE CENTER 0.465554 -0.493241 -0.296959 RAD 0.00617284 + txt002 + SPHERE CENTER 0.483599 -0.508512 -0.289831 RAD 0.00617284 + txt002 + SPHERE CENTER 0.490576 -0.542955 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.507719 -0.559233 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER 0.514426 -0.536564 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.502501 -0.539759 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.483869 -0.565623 -0.215094 RAD 0.00617284 + txt002 + SPHERE CENTER 0.478651 -0.54615 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.466726 -0.549345 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.495794 -0.562428 -0.236478 RAD 0.00617284 + txt002 + SPHERE CENTER 0.478651 -0.54615 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.502501 -0.539759 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.419026 -0.523783 -0.222222 RAD 0.0185185 + txt002 + SPHERE CENTER 0.404771 -0.538038 -0.207967 RAD 0.00617284 + txt002 + SPHERE CENTER 0.427756 -0.532513 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.410297 -0.515053 -0.200839 RAD 0.00617284 + txt002 + SPHERE CENTER 0.396041 -0.529309 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER 0.401567 -0.506323 -0.222222 RAD 0.00617284 + txt002 + SPHERE CENTER 0.410297 -0.515053 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.4135 -0.546768 -0.22935 RAD 0.00617284 + txt002 + SPHERE CENTER 0.427756 -0.532513 -0.243606 RAD 0.00617284 + txt002 + SPHERE CENTER 0.436486 -0.541242 -0.222222 RAD 0.00617284 + txt002 + +END_SCENE diff --git a/xdl/third_party/tbb/examples/parallel_for/tachyon/dat/lattice.dat b/xdl/third_party/tbb/examples/parallel_for/tachyon/dat/lattice.dat new file mode 100644 index 00000000..fc40ed88 --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/tachyon/dat/lattice.dat @@ -0,0 +1,18012 @@ +BEGIN_SCENE + OUTFILE /dev/null + RESOLUTION 512 512 + VERBOSE 0 + +CAMERA + ZOOM 1.0 + ASPECTRATIO 1.0 + ANTIALIASING 0 + RAYDEPTH 8 + CENTER 0.5625 1 0.9375 + VIEWDIR 0 -0.707107 -0.707107 + UPDIR 0.272166 0.680414 -0.680414 + +END_CAMERA + +LIGHT CENTER 2 0.5 0.5 RAD 0.002 COLOR 0.5 0.5 0.5 + +LIGHT CENTER -1 0.5 0.5 RAD 0.002 COLOR 0.5 0.5 0.5 + +LIGHT CENTER 0.5 2 0.5 RAD 0.002 COLOR 0.5 0.5 0.5 + +LIGHT CENTER 0.5 -1 0.5 RAD 0.002 COLOR 0.5 0.5 0.5 + +LIGHT CENTER 0.5 0.5 2 RAD 0.002 COLOR 0.5 0.5 0.5 + +LIGHT CENTER 0.5 0.5 -1 RAD 0.002 COLOR 0.5 0.5 0.5 + +TEXDEF txt001 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0 0 RAD 0.03125 + txt001 +TEXDEF txt002 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0 0 APEX 0.109531 0 0 RAD 0.0078125 + txt002 +TEXDEF txt003 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.0154687 0 APEX 0 0.109531 0 RAD 0.0078125 + txt003 +TEXDEF txt004 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 0 0.0154687 APEX 0 0 0.109531 RAD 0.0078125 + txt004 +TEXDEF txt005 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0 0.125 RAD 0.03125 + txt005 +TEXDEF txt006 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0 0.125 APEX 0.109531 0 0.125 RAD 0.0078125 + txt006 +TEXDEF txt007 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.0154687 0.125 APEX 0 0.109531 0.125 RAD 0.0078125 + txt007 +TEXDEF txt008 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 0 0.140469 APEX 0 0 0.234531 RAD 0.0078125 + txt008 +TEXDEF txt009 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0 0.25 RAD 0.03125 + txt009 +TEXDEF txt010 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0 0.25 APEX 0.109531 0 0.25 RAD 0.0078125 + txt010 +TEXDEF txt011 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.0154687 0.25 APEX 0 0.109531 0.25 RAD 0.0078125 + txt011 +TEXDEF txt012 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 0 0.265469 APEX 0 0 0.359531 RAD 0.0078125 + txt012 +TEXDEF txt013 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0 0.375 RAD 0.03125 + txt013 +TEXDEF txt014 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0 0.375 APEX 0.109531 0 0.375 RAD 0.0078125 + txt014 +TEXDEF txt015 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.0154687 0.375 APEX 0 0.109531 0.375 RAD 0.0078125 + txt015 +TEXDEF txt016 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 0 0.390469 APEX 0 0 0.484531 RAD 0.0078125 + txt016 +TEXDEF txt017 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0 0.5 RAD 0.03125 + txt017 +TEXDEF txt018 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0 0.5 APEX 0.109531 0 0.5 RAD 0.0078125 + txt018 +TEXDEF txt019 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.0154687 0.5 APEX 0 0.109531 0.5 RAD 0.0078125 + txt019 +TEXDEF txt020 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 0 0.515469 APEX 0 0 0.609531 RAD 0.0078125 + txt020 +TEXDEF txt021 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0 0.625 RAD 0.03125 + txt021 +TEXDEF txt022 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0 0.625 APEX 0.109531 0 0.625 RAD 0.0078125 + txt022 +TEXDEF txt023 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.0154687 0.625 APEX 0 0.109531 0.625 RAD 0.0078125 + txt023 +TEXDEF txt024 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 0 0.640469 APEX 0 0 0.734531 RAD 0.0078125 + txt024 +TEXDEF txt025 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0 0.75 RAD 0.03125 + txt025 +TEXDEF txt026 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0 0.75 APEX 0.109531 0 0.75 RAD 0.0078125 + txt026 +TEXDEF txt027 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.0154687 0.75 APEX 0 0.109531 0.75 RAD 0.0078125 + txt027 +TEXDEF txt028 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 0 0.765469 APEX 0 0 0.859531 RAD 0.0078125 + txt028 +TEXDEF txt029 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0 0.875 RAD 0.03125 + txt029 +TEXDEF txt030 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0 0.875 APEX 0.109531 0 0.875 RAD 0.0078125 + txt030 +TEXDEF txt031 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.0154687 0.875 APEX 0 0.109531 0.875 RAD 0.0078125 + txt031 +TEXDEF txt032 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 0 0.890469 APEX 0 0 0.984531 RAD 0.0078125 + txt032 +TEXDEF txt033 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0 1 RAD 0.03125 + txt033 +TEXDEF txt034 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0 1 APEX 0.109531 0 1 RAD 0.0078125 + txt034 +TEXDEF txt035 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.0154687 1 APEX 0 0.109531 1 RAD 0.0078125 + txt035 +TEXDEF txt036 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0.125 0 RAD 0.03125 + txt036 +TEXDEF txt037 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0.125 0 APEX 0.109531 0.125 0 RAD 0.0078125 + txt037 +TEXDEF txt038 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.140469 0 APEX 0 0.234531 0 RAD 0.0078125 + txt038 +TEXDEF txt039 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.125 0.0154687 APEX 0 0.125 0.109531 RAD 0.0078125 + txt039 +TEXDEF txt040 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0.125 0.125 RAD 0.03125 + txt040 +TEXDEF txt041 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0.125 0.125 APEX 0.109531 0.125 0.125 RAD 0.0078125 + txt041 +TEXDEF txt042 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.140469 0.125 APEX 0 0.234531 0.125 RAD 0.0078125 + txt042 +TEXDEF txt043 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.125 0.140469 APEX 0 0.125 0.234531 RAD 0.0078125 + txt043 +TEXDEF txt044 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0.125 0.25 RAD 0.03125 + txt044 +TEXDEF txt045 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0.125 0.25 APEX 0.109531 0.125 0.25 RAD 0.0078125 + txt045 +TEXDEF txt046 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.140469 0.25 APEX 0 0.234531 0.25 RAD 0.0078125 + txt046 +TEXDEF txt047 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.125 0.265469 APEX 0 0.125 0.359531 RAD 0.0078125 + txt047 +TEXDEF txt048 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0.125 0.375 RAD 0.03125 + txt048 +TEXDEF txt049 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0.125 0.375 APEX 0.109531 0.125 0.375 RAD 0.0078125 + txt049 +TEXDEF txt050 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.140469 0.375 APEX 0 0.234531 0.375 RAD 0.0078125 + txt050 +TEXDEF txt051 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.125 0.390469 APEX 0 0.125 0.484531 RAD 0.0078125 + txt051 +TEXDEF txt052 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0.125 0.5 RAD 0.03125 + txt052 +TEXDEF txt053 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0.125 0.5 APEX 0.109531 0.125 0.5 RAD 0.0078125 + txt053 +TEXDEF txt054 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.140469 0.5 APEX 0 0.234531 0.5 RAD 0.0078125 + txt054 +TEXDEF txt055 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.125 0.515469 APEX 0 0.125 0.609531 RAD 0.0078125 + txt055 +TEXDEF txt056 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0.125 0.625 RAD 0.03125 + txt056 +TEXDEF txt057 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0.125 0.625 APEX 0.109531 0.125 0.625 RAD 0.0078125 + txt057 +TEXDEF txt058 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.140469 0.625 APEX 0 0.234531 0.625 RAD 0.0078125 + txt058 +TEXDEF txt059 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.125 0.640469 APEX 0 0.125 0.734531 RAD 0.0078125 + txt059 +TEXDEF txt060 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0.125 0.75 RAD 0.03125 + txt060 +TEXDEF txt061 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0.125 0.75 APEX 0.109531 0.125 0.75 RAD 0.0078125 + txt061 +TEXDEF txt062 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.140469 0.75 APEX 0 0.234531 0.75 RAD 0.0078125 + txt062 +TEXDEF txt063 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.125 0.765469 APEX 0 0.125 0.859531 RAD 0.0078125 + txt063 +TEXDEF txt064 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0.125 0.875 RAD 0.03125 + txt064 +TEXDEF txt065 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0.125 0.875 APEX 0.109531 0.125 0.875 RAD 0.0078125 + txt065 +TEXDEF txt066 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.140469 0.875 APEX 0 0.234531 0.875 RAD 0.0078125 + txt066 +TEXDEF txt067 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.125 0.890469 APEX 0 0.125 0.984531 RAD 0.0078125 + txt067 +TEXDEF txt068 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0.125 1 RAD 0.03125 + txt068 +TEXDEF txt069 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0.125 1 APEX 0.109531 0.125 1 RAD 0.0078125 + txt069 +TEXDEF txt070 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.140469 1 APEX 0 0.234531 1 RAD 0.0078125 + txt070 +TEXDEF txt071 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0.25 0 RAD 0.03125 + txt071 +TEXDEF txt072 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0.25 0 APEX 0.109531 0.25 0 RAD 0.0078125 + txt072 +TEXDEF txt073 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.265469 0 APEX 0 0.359531 0 RAD 0.0078125 + txt073 +TEXDEF txt074 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.25 0.0154687 APEX 0 0.25 0.109531 RAD 0.0078125 + txt074 +TEXDEF txt075 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0.25 0.125 RAD 0.03125 + txt075 +TEXDEF txt076 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0.25 0.125 APEX 0.109531 0.25 0.125 RAD 0.0078125 + txt076 +TEXDEF txt077 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.265469 0.125 APEX 0 0.359531 0.125 RAD 0.0078125 + txt077 +TEXDEF txt078 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.25 0.140469 APEX 0 0.25 0.234531 RAD 0.0078125 + txt078 +TEXDEF txt079 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0.25 0.25 RAD 0.03125 + txt079 +TEXDEF txt080 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0.25 0.25 APEX 0.109531 0.25 0.25 RAD 0.0078125 + txt080 +TEXDEF txt081 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.265469 0.25 APEX 0 0.359531 0.25 RAD 0.0078125 + txt081 +TEXDEF txt082 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.25 0.265469 APEX 0 0.25 0.359531 RAD 0.0078125 + txt082 +TEXDEF txt083 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0.25 0.375 RAD 0.03125 + txt083 +TEXDEF txt084 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0.25 0.375 APEX 0.109531 0.25 0.375 RAD 0.0078125 + txt084 +TEXDEF txt085 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.265469 0.375 APEX 0 0.359531 0.375 RAD 0.0078125 + txt085 +TEXDEF txt086 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.25 0.390469 APEX 0 0.25 0.484531 RAD 0.0078125 + txt086 +TEXDEF txt087 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0.25 0.5 RAD 0.03125 + txt087 +TEXDEF txt088 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0.25 0.5 APEX 0.109531 0.25 0.5 RAD 0.0078125 + txt088 +TEXDEF txt089 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.265469 0.5 APEX 0 0.359531 0.5 RAD 0.0078125 + txt089 +TEXDEF txt090 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.25 0.515469 APEX 0 0.25 0.609531 RAD 0.0078125 + txt090 +TEXDEF txt091 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0.25 0.625 RAD 0.03125 + txt091 +TEXDEF txt092 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0.25 0.625 APEX 0.109531 0.25 0.625 RAD 0.0078125 + txt092 +TEXDEF txt093 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.265469 0.625 APEX 0 0.359531 0.625 RAD 0.0078125 + txt093 +TEXDEF txt094 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.25 0.640469 APEX 0 0.25 0.734531 RAD 0.0078125 + txt094 +TEXDEF txt095 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0.25 0.75 RAD 0.03125 + txt095 +TEXDEF txt096 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0.25 0.75 APEX 0.109531 0.25 0.75 RAD 0.0078125 + txt096 +TEXDEF txt097 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.265469 0.75 APEX 0 0.359531 0.75 RAD 0.0078125 + txt097 +TEXDEF txt098 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.25 0.765469 APEX 0 0.25 0.859531 RAD 0.0078125 + txt098 +TEXDEF txt099 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0.25 0.875 RAD 0.03125 + txt099 +TEXDEF txt100 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0.25 0.875 APEX 0.109531 0.25 0.875 RAD 0.0078125 + txt100 +TEXDEF txt101 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.265469 0.875 APEX 0 0.359531 0.875 RAD 0.0078125 + txt101 +TEXDEF txt102 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.25 0.890469 APEX 0 0.25 0.984531 RAD 0.0078125 + txt102 +TEXDEF txt103 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0.25 1 RAD 0.03125 + txt103 +TEXDEF txt104 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0.25 1 APEX 0.109531 0.25 1 RAD 0.0078125 + txt104 +TEXDEF txt105 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.265469 1 APEX 0 0.359531 1 RAD 0.0078125 + txt105 +TEXDEF txt106 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0.375 0 RAD 0.03125 + txt106 +TEXDEF txt107 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0.375 0 APEX 0.109531 0.375 0 RAD 0.0078125 + txt107 +TEXDEF txt108 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.390469 0 APEX 0 0.484531 0 RAD 0.0078125 + txt108 +TEXDEF txt109 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.375 0.0154687 APEX 0 0.375 0.109531 RAD 0.0078125 + txt109 +TEXDEF txt110 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0.375 0.125 RAD 0.03125 + txt110 +TEXDEF txt111 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0.375 0.125 APEX 0.109531 0.375 0.125 RAD 0.0078125 + txt111 +TEXDEF txt112 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.390469 0.125 APEX 0 0.484531 0.125 RAD 0.0078125 + txt112 +TEXDEF txt113 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.375 0.140469 APEX 0 0.375 0.234531 RAD 0.0078125 + txt113 +TEXDEF txt114 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0.375 0.25 RAD 0.03125 + txt114 +TEXDEF txt115 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0.375 0.25 APEX 0.109531 0.375 0.25 RAD 0.0078125 + txt115 +TEXDEF txt116 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.390469 0.25 APEX 0 0.484531 0.25 RAD 0.0078125 + txt116 +TEXDEF txt117 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.375 0.265469 APEX 0 0.375 0.359531 RAD 0.0078125 + txt117 +TEXDEF txt118 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0.375 0.375 RAD 0.03125 + txt118 +TEXDEF txt119 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0.375 0.375 APEX 0.109531 0.375 0.375 RAD 0.0078125 + txt119 +TEXDEF txt120 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.390469 0.375 APEX 0 0.484531 0.375 RAD 0.0078125 + txt120 +TEXDEF txt121 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.375 0.390469 APEX 0 0.375 0.484531 RAD 0.0078125 + txt121 +TEXDEF txt122 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0.375 0.5 RAD 0.03125 + txt122 +TEXDEF txt123 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0.375 0.5 APEX 0.109531 0.375 0.5 RAD 0.0078125 + txt123 +TEXDEF txt124 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.390469 0.5 APEX 0 0.484531 0.5 RAD 0.0078125 + txt124 +TEXDEF txt125 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.375 0.515469 APEX 0 0.375 0.609531 RAD 0.0078125 + txt125 +TEXDEF txt126 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0.375 0.625 RAD 0.03125 + txt126 +TEXDEF txt127 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0.375 0.625 APEX 0.109531 0.375 0.625 RAD 0.0078125 + txt127 +TEXDEF txt128 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.390469 0.625 APEX 0 0.484531 0.625 RAD 0.0078125 + txt128 +TEXDEF txt129 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.375 0.640469 APEX 0 0.375 0.734531 RAD 0.0078125 + txt129 +TEXDEF txt130 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0.375 0.75 RAD 0.03125 + txt130 +TEXDEF txt131 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0.375 0.75 APEX 0.109531 0.375 0.75 RAD 0.0078125 + txt131 +TEXDEF txt132 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.390469 0.75 APEX 0 0.484531 0.75 RAD 0.0078125 + txt132 +TEXDEF txt133 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.375 0.765469 APEX 0 0.375 0.859531 RAD 0.0078125 + txt133 +TEXDEF txt134 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0.375 0.875 RAD 0.03125 + txt134 +TEXDEF txt135 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0.375 0.875 APEX 0.109531 0.375 0.875 RAD 0.0078125 + txt135 +TEXDEF txt136 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.390469 0.875 APEX 0 0.484531 0.875 RAD 0.0078125 + txt136 +TEXDEF txt137 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.375 0.890469 APEX 0 0.375 0.984531 RAD 0.0078125 + txt137 +TEXDEF txt138 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0.375 1 RAD 0.03125 + txt138 +TEXDEF txt139 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0.375 1 APEX 0.109531 0.375 1 RAD 0.0078125 + txt139 +TEXDEF txt140 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.390469 1 APEX 0 0.484531 1 RAD 0.0078125 + txt140 +TEXDEF txt141 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0.5 0 RAD 0.03125 + txt141 +TEXDEF txt142 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0.5 0 APEX 0.109531 0.5 0 RAD 0.0078125 + txt142 +TEXDEF txt143 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.515469 0 APEX 0 0.609531 0 RAD 0.0078125 + txt143 +TEXDEF txt144 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.5 0.0154687 APEX 0 0.5 0.109531 RAD 0.0078125 + txt144 +TEXDEF txt145 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0.5 0.125 RAD 0.03125 + txt145 +TEXDEF txt146 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0.5 0.125 APEX 0.109531 0.5 0.125 RAD 0.0078125 + txt146 +TEXDEF txt147 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.515469 0.125 APEX 0 0.609531 0.125 RAD 0.0078125 + txt147 +TEXDEF txt148 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.5 0.140469 APEX 0 0.5 0.234531 RAD 0.0078125 + txt148 +TEXDEF txt149 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0.5 0.25 RAD 0.03125 + txt149 +TEXDEF txt150 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0.5 0.25 APEX 0.109531 0.5 0.25 RAD 0.0078125 + txt150 +TEXDEF txt151 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.515469 0.25 APEX 0 0.609531 0.25 RAD 0.0078125 + txt151 +TEXDEF txt152 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.5 0.265469 APEX 0 0.5 0.359531 RAD 0.0078125 + txt152 +TEXDEF txt153 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0.5 0.375 RAD 0.03125 + txt153 +TEXDEF txt154 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0.5 0.375 APEX 0.109531 0.5 0.375 RAD 0.0078125 + txt154 +TEXDEF txt155 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.515469 0.375 APEX 0 0.609531 0.375 RAD 0.0078125 + txt155 +TEXDEF txt156 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.5 0.390469 APEX 0 0.5 0.484531 RAD 0.0078125 + txt156 +TEXDEF txt157 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0.5 0.5 RAD 0.03125 + txt157 +TEXDEF txt158 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0.5 0.5 APEX 0.109531 0.5 0.5 RAD 0.0078125 + txt158 +TEXDEF txt159 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.515469 0.5 APEX 0 0.609531 0.5 RAD 0.0078125 + txt159 +TEXDEF txt160 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.5 0.515469 APEX 0 0.5 0.609531 RAD 0.0078125 + txt160 +TEXDEF txt161 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0.5 0.625 RAD 0.03125 + txt161 +TEXDEF txt162 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0.5 0.625 APEX 0.109531 0.5 0.625 RAD 0.0078125 + txt162 +TEXDEF txt163 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.515469 0.625 APEX 0 0.609531 0.625 RAD 0.0078125 + txt163 +TEXDEF txt164 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.5 0.640469 APEX 0 0.5 0.734531 RAD 0.0078125 + txt164 +TEXDEF txt165 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0.5 0.75 RAD 0.03125 + txt165 +TEXDEF txt166 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0.5 0.75 APEX 0.109531 0.5 0.75 RAD 0.0078125 + txt166 +TEXDEF txt167 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.515469 0.75 APEX 0 0.609531 0.75 RAD 0.0078125 + txt167 +TEXDEF txt168 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.5 0.765469 APEX 0 0.5 0.859531 RAD 0.0078125 + txt168 +TEXDEF txt169 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0.5 0.875 RAD 0.03125 + txt169 +TEXDEF txt170 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0.5 0.875 APEX 0.109531 0.5 0.875 RAD 0.0078125 + txt170 +TEXDEF txt171 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.515469 0.875 APEX 0 0.609531 0.875 RAD 0.0078125 + txt171 +TEXDEF txt172 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.5 0.890469 APEX 0 0.5 0.984531 RAD 0.0078125 + txt172 +TEXDEF txt173 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0.5 1 RAD 0.03125 + txt173 +TEXDEF txt174 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0.5 1 APEX 0.109531 0.5 1 RAD 0.0078125 + txt174 +TEXDEF txt175 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.515469 1 APEX 0 0.609531 1 RAD 0.0078125 + txt175 +TEXDEF txt176 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0.625 0 RAD 0.03125 + txt176 +TEXDEF txt177 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0.625 0 APEX 0.109531 0.625 0 RAD 0.0078125 + txt177 +TEXDEF txt178 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.640469 0 APEX 0 0.734531 0 RAD 0.0078125 + txt178 +TEXDEF txt179 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.625 0.0154687 APEX 0 0.625 0.109531 RAD 0.0078125 + txt179 +TEXDEF txt180 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0.625 0.125 RAD 0.03125 + txt180 +TEXDEF txt181 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0.625 0.125 APEX 0.109531 0.625 0.125 RAD 0.0078125 + txt181 +TEXDEF txt182 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.640469 0.125 APEX 0 0.734531 0.125 RAD 0.0078125 + txt182 +TEXDEF txt183 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.625 0.140469 APEX 0 0.625 0.234531 RAD 0.0078125 + txt183 +TEXDEF txt184 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0.625 0.25 RAD 0.03125 + txt184 +TEXDEF txt185 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0.625 0.25 APEX 0.109531 0.625 0.25 RAD 0.0078125 + txt185 +TEXDEF txt186 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.640469 0.25 APEX 0 0.734531 0.25 RAD 0.0078125 + txt186 +TEXDEF txt187 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.625 0.265469 APEX 0 0.625 0.359531 RAD 0.0078125 + txt187 +TEXDEF txt188 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0.625 0.375 RAD 0.03125 + txt188 +TEXDEF txt189 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0.625 0.375 APEX 0.109531 0.625 0.375 RAD 0.0078125 + txt189 +TEXDEF txt190 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.640469 0.375 APEX 0 0.734531 0.375 RAD 0.0078125 + txt190 +TEXDEF txt191 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.625 0.390469 APEX 0 0.625 0.484531 RAD 0.0078125 + txt191 +TEXDEF txt192 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0.625 0.5 RAD 0.03125 + txt192 +TEXDEF txt193 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0.625 0.5 APEX 0.109531 0.625 0.5 RAD 0.0078125 + txt193 +TEXDEF txt194 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.640469 0.5 APEX 0 0.734531 0.5 RAD 0.0078125 + txt194 +TEXDEF txt195 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.625 0.515469 APEX 0 0.625 0.609531 RAD 0.0078125 + txt195 +TEXDEF txt196 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0.625 0.625 RAD 0.03125 + txt196 +TEXDEF txt197 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0.625 0.625 APEX 0.109531 0.625 0.625 RAD 0.0078125 + txt197 +TEXDEF txt198 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.640469 0.625 APEX 0 0.734531 0.625 RAD 0.0078125 + txt198 +TEXDEF txt199 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.625 0.640469 APEX 0 0.625 0.734531 RAD 0.0078125 + txt199 +TEXDEF txt200 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0.625 0.75 RAD 0.03125 + txt200 +TEXDEF txt201 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0.625 0.75 APEX 0.109531 0.625 0.75 RAD 0.0078125 + txt201 +TEXDEF txt202 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.640469 0.75 APEX 0 0.734531 0.75 RAD 0.0078125 + txt202 +TEXDEF txt203 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.625 0.765469 APEX 0 0.625 0.859531 RAD 0.0078125 + txt203 +TEXDEF txt204 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0.625 0.875 RAD 0.03125 + txt204 +TEXDEF txt205 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0.625 0.875 APEX 0.109531 0.625 0.875 RAD 0.0078125 + txt205 +TEXDEF txt206 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.640469 0.875 APEX 0 0.734531 0.875 RAD 0.0078125 + txt206 +TEXDEF txt207 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.625 0.890469 APEX 0 0.625 0.984531 RAD 0.0078125 + txt207 +TEXDEF txt208 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0.625 1 RAD 0.03125 + txt208 +TEXDEF txt209 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0.625 1 APEX 0.109531 0.625 1 RAD 0.0078125 + txt209 +TEXDEF txt210 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.640469 1 APEX 0 0.734531 1 RAD 0.0078125 + txt210 +TEXDEF txt211 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0.75 0 RAD 0.03125 + txt211 +TEXDEF txt212 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0.75 0 APEX 0.109531 0.75 0 RAD 0.0078125 + txt212 +TEXDEF txt213 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.765469 0 APEX 0 0.859531 0 RAD 0.0078125 + txt213 +TEXDEF txt214 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.75 0.0154687 APEX 0 0.75 0.109531 RAD 0.0078125 + txt214 +TEXDEF txt215 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0.75 0.125 RAD 0.03125 + txt215 +TEXDEF txt216 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0.75 0.125 APEX 0.109531 0.75 0.125 RAD 0.0078125 + txt216 +TEXDEF txt217 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.765469 0.125 APEX 0 0.859531 0.125 RAD 0.0078125 + txt217 +TEXDEF txt218 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.75 0.140469 APEX 0 0.75 0.234531 RAD 0.0078125 + txt218 +TEXDEF txt219 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0.75 0.25 RAD 0.03125 + txt219 +TEXDEF txt220 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0.75 0.25 APEX 0.109531 0.75 0.25 RAD 0.0078125 + txt220 +TEXDEF txt221 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.765469 0.25 APEX 0 0.859531 0.25 RAD 0.0078125 + txt221 +TEXDEF txt222 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.75 0.265469 APEX 0 0.75 0.359531 RAD 0.0078125 + txt222 +TEXDEF txt223 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0.75 0.375 RAD 0.03125 + txt223 +TEXDEF txt224 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0.75 0.375 APEX 0.109531 0.75 0.375 RAD 0.0078125 + txt224 +TEXDEF txt225 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.765469 0.375 APEX 0 0.859531 0.375 RAD 0.0078125 + txt225 +TEXDEF txt226 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.75 0.390469 APEX 0 0.75 0.484531 RAD 0.0078125 + txt226 +TEXDEF txt227 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0.75 0.5 RAD 0.03125 + txt227 +TEXDEF txt228 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0.75 0.5 APEX 0.109531 0.75 0.5 RAD 0.0078125 + txt228 +TEXDEF txt229 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.765469 0.5 APEX 0 0.859531 0.5 RAD 0.0078125 + txt229 +TEXDEF txt230 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.75 0.515469 APEX 0 0.75 0.609531 RAD 0.0078125 + txt230 +TEXDEF txt231 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0.75 0.625 RAD 0.03125 + txt231 +TEXDEF txt232 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0.75 0.625 APEX 0.109531 0.75 0.625 RAD 0.0078125 + txt232 +TEXDEF txt233 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.765469 0.625 APEX 0 0.859531 0.625 RAD 0.0078125 + txt233 +TEXDEF txt234 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.75 0.640469 APEX 0 0.75 0.734531 RAD 0.0078125 + txt234 +TEXDEF txt235 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0.75 0.75 RAD 0.03125 + txt235 +TEXDEF txt236 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0.75 0.75 APEX 0.109531 0.75 0.75 RAD 0.0078125 + txt236 +TEXDEF txt237 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.765469 0.75 APEX 0 0.859531 0.75 RAD 0.0078125 + txt237 +TEXDEF txt238 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.75 0.765469 APEX 0 0.75 0.859531 RAD 0.0078125 + txt238 +TEXDEF txt239 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0.75 0.875 RAD 0.03125 + txt239 +TEXDEF txt240 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0.75 0.875 APEX 0.109531 0.75 0.875 RAD 0.0078125 + txt240 +TEXDEF txt241 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.765469 0.875 APEX 0 0.859531 0.875 RAD 0.0078125 + txt241 +TEXDEF txt242 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.75 0.890469 APEX 0 0.75 0.984531 RAD 0.0078125 + txt242 +TEXDEF txt243 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0.75 1 RAD 0.03125 + txt243 +TEXDEF txt244 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0.75 1 APEX 0.109531 0.75 1 RAD 0.0078125 + txt244 +TEXDEF txt245 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.765469 1 APEX 0 0.859531 1 RAD 0.0078125 + txt245 +TEXDEF txt246 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0.875 0 RAD 0.03125 + txt246 +TEXDEF txt247 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0.875 0 APEX 0.109531 0.875 0 RAD 0.0078125 + txt247 +TEXDEF txt248 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.890469 0 APEX 0 0.984531 0 RAD 0.0078125 + txt248 +TEXDEF txt249 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.875 0.0154687 APEX 0 0.875 0.109531 RAD 0.0078125 + txt249 +TEXDEF txt250 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0.875 0.125 RAD 0.03125 + txt250 +TEXDEF txt251 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0.875 0.125 APEX 0.109531 0.875 0.125 RAD 0.0078125 + txt251 +TEXDEF txt252 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.890469 0.125 APEX 0 0.984531 0.125 RAD 0.0078125 + txt252 +TEXDEF txt253 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.875 0.140469 APEX 0 0.875 0.234531 RAD 0.0078125 + txt253 +TEXDEF txt254 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0.875 0.25 RAD 0.03125 + txt254 +TEXDEF txt255 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0.875 0.25 APEX 0.109531 0.875 0.25 RAD 0.0078125 + txt255 +TEXDEF txt256 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.890469 0.25 APEX 0 0.984531 0.25 RAD 0.0078125 + txt256 +TEXDEF txt257 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.875 0.265469 APEX 0 0.875 0.359531 RAD 0.0078125 + txt257 +TEXDEF txt258 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0.875 0.375 RAD 0.03125 + txt258 +TEXDEF txt259 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0.875 0.375 APEX 0.109531 0.875 0.375 RAD 0.0078125 + txt259 +TEXDEF txt260 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.890469 0.375 APEX 0 0.984531 0.375 RAD 0.0078125 + txt260 +TEXDEF txt261 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.875 0.390469 APEX 0 0.875 0.484531 RAD 0.0078125 + txt261 +TEXDEF txt262 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0.875 0.5 RAD 0.03125 + txt262 +TEXDEF txt263 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0.875 0.5 APEX 0.109531 0.875 0.5 RAD 0.0078125 + txt263 +TEXDEF txt264 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.890469 0.5 APEX 0 0.984531 0.5 RAD 0.0078125 + txt264 +TEXDEF txt265 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.875 0.515469 APEX 0 0.875 0.609531 RAD 0.0078125 + txt265 +TEXDEF txt266 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0.875 0.625 RAD 0.03125 + txt266 +TEXDEF txt267 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0.875 0.625 APEX 0.109531 0.875 0.625 RAD 0.0078125 + txt267 +TEXDEF txt268 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.890469 0.625 APEX 0 0.984531 0.625 RAD 0.0078125 + txt268 +TEXDEF txt269 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.875 0.640469 APEX 0 0.875 0.734531 RAD 0.0078125 + txt269 +TEXDEF txt270 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0.875 0.75 RAD 0.03125 + txt270 +TEXDEF txt271 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0.875 0.75 APEX 0.109531 0.875 0.75 RAD 0.0078125 + txt271 +TEXDEF txt272 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.890469 0.75 APEX 0 0.984531 0.75 RAD 0.0078125 + txt272 +TEXDEF txt273 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.875 0.765469 APEX 0 0.875 0.859531 RAD 0.0078125 + txt273 +TEXDEF txt274 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0.875 0.875 RAD 0.03125 + txt274 +TEXDEF txt275 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0.875 0.875 APEX 0.109531 0.875 0.875 RAD 0.0078125 + txt275 +TEXDEF txt276 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.890469 0.875 APEX 0 0.984531 0.875 RAD 0.0078125 + txt276 +TEXDEF txt277 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.875 0.890469 APEX 0 0.875 0.984531 RAD 0.0078125 + txt277 +TEXDEF txt278 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 0.875 1 RAD 0.03125 + txt278 +TEXDEF txt279 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 0.875 1 APEX 0.109531 0.875 1 RAD 0.0078125 + txt279 +TEXDEF txt280 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0 0.890469 1 APEX 0 0.984531 1 RAD 0.0078125 + txt280 +TEXDEF txt281 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 1 0 RAD 0.03125 + txt281 +TEXDEF txt282 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 1 0 APEX 0.109531 1 0 RAD 0.0078125 + txt282 +TEXDEF txt283 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 1 0.0154687 APEX 0 1 0.109531 RAD 0.0078125 + txt283 +TEXDEF txt284 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 1 0.125 RAD 0.03125 + txt284 +TEXDEF txt285 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 1 0.125 APEX 0.109531 1 0.125 RAD 0.0078125 + txt285 +TEXDEF txt286 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 1 0.140469 APEX 0 1 0.234531 RAD 0.0078125 + txt286 +TEXDEF txt287 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 1 0.25 RAD 0.03125 + txt287 +TEXDEF txt288 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 1 0.25 APEX 0.109531 1 0.25 RAD 0.0078125 + txt288 +TEXDEF txt289 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 1 0.265469 APEX 0 1 0.359531 RAD 0.0078125 + txt289 +TEXDEF txt290 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 1 0.375 RAD 0.03125 + txt290 +TEXDEF txt291 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 1 0.375 APEX 0.109531 1 0.375 RAD 0.0078125 + txt291 +TEXDEF txt292 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 1 0.390469 APEX 0 1 0.484531 RAD 0.0078125 + txt292 +TEXDEF txt293 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 1 0.5 RAD 0.03125 + txt293 +TEXDEF txt294 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 1 0.5 APEX 0.109531 1 0.5 RAD 0.0078125 + txt294 +TEXDEF txt295 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 1 0.515469 APEX 0 1 0.609531 RAD 0.0078125 + txt295 +TEXDEF txt296 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 1 0.625 RAD 0.03125 + txt296 +TEXDEF txt297 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 1 0.625 APEX 0.109531 1 0.625 RAD 0.0078125 + txt297 +TEXDEF txt298 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 1 0.640469 APEX 0 1 0.734531 RAD 0.0078125 + txt298 +TEXDEF txt299 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 1 0.75 RAD 0.03125 + txt299 +TEXDEF txt300 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 1 0.75 APEX 0.109531 1 0.75 RAD 0.0078125 + txt300 +TEXDEF txt301 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 1 0.765469 APEX 0 1 0.859531 RAD 0.0078125 + txt301 +TEXDEF txt302 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 1 0.875 RAD 0.03125 + txt302 +TEXDEF txt303 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 1 0.875 APEX 0.109531 1 0.875 RAD 0.0078125 + txt303 +TEXDEF txt304 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0 1 0.890469 APEX 0 1 0.984531 RAD 0.0078125 + txt304 +TEXDEF txt305 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0 1 1 RAD 0.03125 + txt305 +TEXDEF txt306 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.0154687 1 1 APEX 0.109531 1 1 RAD 0.0078125 + txt306 +TEXDEF txt307 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0 0 RAD 0.03125 + txt307 +TEXDEF txt308 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0 0 APEX 0.234531 0 0 RAD 0.0078125 + txt308 +TEXDEF txt309 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.0154687 0 APEX 0.125 0.109531 0 RAD 0.0078125 + txt309 +TEXDEF txt310 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0 0.0154687 APEX 0.125 0 0.109531 RAD 0.0078125 + txt310 +TEXDEF txt311 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0 0.125 RAD 0.03125 + txt311 +TEXDEF txt312 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0 0.125 APEX 0.234531 0 0.125 RAD 0.0078125 + txt312 +TEXDEF txt313 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.0154687 0.125 APEX 0.125 0.109531 0.125 RAD 0.0078125 + txt313 +TEXDEF txt314 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0 0.140469 APEX 0.125 0 0.234531 RAD 0.0078125 + txt314 +TEXDEF txt315 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0 0.25 RAD 0.03125 + txt315 +TEXDEF txt316 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0 0.25 APEX 0.234531 0 0.25 RAD 0.0078125 + txt316 +TEXDEF txt317 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.0154687 0.25 APEX 0.125 0.109531 0.25 RAD 0.0078125 + txt317 +TEXDEF txt318 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0 0.265469 APEX 0.125 0 0.359531 RAD 0.0078125 + txt318 +TEXDEF txt319 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0 0.375 RAD 0.03125 + txt319 +TEXDEF txt320 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0 0.375 APEX 0.234531 0 0.375 RAD 0.0078125 + txt320 +TEXDEF txt321 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.0154687 0.375 APEX 0.125 0.109531 0.375 RAD 0.0078125 + txt321 +TEXDEF txt322 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0 0.390469 APEX 0.125 0 0.484531 RAD 0.0078125 + txt322 +TEXDEF txt323 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0 0.5 RAD 0.03125 + txt323 +TEXDEF txt324 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0 0.5 APEX 0.234531 0 0.5 RAD 0.0078125 + txt324 +TEXDEF txt325 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.0154687 0.5 APEX 0.125 0.109531 0.5 RAD 0.0078125 + txt325 +TEXDEF txt326 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0 0.515469 APEX 0.125 0 0.609531 RAD 0.0078125 + txt326 +TEXDEF txt327 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0 0.625 RAD 0.03125 + txt327 +TEXDEF txt328 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0 0.625 APEX 0.234531 0 0.625 RAD 0.0078125 + txt328 +TEXDEF txt329 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.0154687 0.625 APEX 0.125 0.109531 0.625 RAD 0.0078125 + txt329 +TEXDEF txt330 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0 0.640469 APEX 0.125 0 0.734531 RAD 0.0078125 + txt330 +TEXDEF txt331 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0 0.75 RAD 0.03125 + txt331 +TEXDEF txt332 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0 0.75 APEX 0.234531 0 0.75 RAD 0.0078125 + txt332 +TEXDEF txt333 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.0154687 0.75 APEX 0.125 0.109531 0.75 RAD 0.0078125 + txt333 +TEXDEF txt334 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0 0.765469 APEX 0.125 0 0.859531 RAD 0.0078125 + txt334 +TEXDEF txt335 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0 0.875 RAD 0.03125 + txt335 +TEXDEF txt336 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0 0.875 APEX 0.234531 0 0.875 RAD 0.0078125 + txt336 +TEXDEF txt337 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.0154687 0.875 APEX 0.125 0.109531 0.875 RAD 0.0078125 + txt337 +TEXDEF txt338 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0 0.890469 APEX 0.125 0 0.984531 RAD 0.0078125 + txt338 +TEXDEF txt339 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0 1 RAD 0.03125 + txt339 +TEXDEF txt340 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0 1 APEX 0.234531 0 1 RAD 0.0078125 + txt340 +TEXDEF txt341 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.0154687 1 APEX 0.125 0.109531 1 RAD 0.0078125 + txt341 +TEXDEF txt342 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0.125 0 RAD 0.03125 + txt342 +TEXDEF txt343 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0.125 0 APEX 0.234531 0.125 0 RAD 0.0078125 + txt343 +TEXDEF txt344 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.140469 0 APEX 0.125 0.234531 0 RAD 0.0078125 + txt344 +TEXDEF txt345 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.125 0.0154687 APEX 0.125 0.125 0.109531 RAD 0.0078125 + txt345 +TEXDEF txt346 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0.125 0.125 RAD 0.03125 + txt346 +TEXDEF txt347 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0.125 0.125 APEX 0.234531 0.125 0.125 RAD 0.0078125 + txt347 +TEXDEF txt348 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.140469 0.125 APEX 0.125 0.234531 0.125 RAD 0.0078125 + txt348 +TEXDEF txt349 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.125 0.140469 APEX 0.125 0.125 0.234531 RAD 0.0078125 + txt349 +TEXDEF txt350 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0.125 0.25 RAD 0.03125 + txt350 +TEXDEF txt351 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0.125 0.25 APEX 0.234531 0.125 0.25 RAD 0.0078125 + txt351 +TEXDEF txt352 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.140469 0.25 APEX 0.125 0.234531 0.25 RAD 0.0078125 + txt352 +TEXDEF txt353 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.125 0.265469 APEX 0.125 0.125 0.359531 RAD 0.0078125 + txt353 +TEXDEF txt354 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0.125 0.375 RAD 0.03125 + txt354 +TEXDEF txt355 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0.125 0.375 APEX 0.234531 0.125 0.375 RAD 0.0078125 + txt355 +TEXDEF txt356 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.140469 0.375 APEX 0.125 0.234531 0.375 RAD 0.0078125 + txt356 +TEXDEF txt357 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.125 0.390469 APEX 0.125 0.125 0.484531 RAD 0.0078125 + txt357 +TEXDEF txt358 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0.125 0.5 RAD 0.03125 + txt358 +TEXDEF txt359 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0.125 0.5 APEX 0.234531 0.125 0.5 RAD 0.0078125 + txt359 +TEXDEF txt360 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.140469 0.5 APEX 0.125 0.234531 0.5 RAD 0.0078125 + txt360 +TEXDEF txt361 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.125 0.515469 APEX 0.125 0.125 0.609531 RAD 0.0078125 + txt361 +TEXDEF txt362 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0.125 0.625 RAD 0.03125 + txt362 +TEXDEF txt363 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0.125 0.625 APEX 0.234531 0.125 0.625 RAD 0.0078125 + txt363 +TEXDEF txt364 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.140469 0.625 APEX 0.125 0.234531 0.625 RAD 0.0078125 + txt364 +TEXDEF txt365 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.125 0.640469 APEX 0.125 0.125 0.734531 RAD 0.0078125 + txt365 +TEXDEF txt366 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0.125 0.75 RAD 0.03125 + txt366 +TEXDEF txt367 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0.125 0.75 APEX 0.234531 0.125 0.75 RAD 0.0078125 + txt367 +TEXDEF txt368 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.140469 0.75 APEX 0.125 0.234531 0.75 RAD 0.0078125 + txt368 +TEXDEF txt369 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.125 0.765469 APEX 0.125 0.125 0.859531 RAD 0.0078125 + txt369 +TEXDEF txt370 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0.125 0.875 RAD 0.03125 + txt370 +TEXDEF txt371 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0.125 0.875 APEX 0.234531 0.125 0.875 RAD 0.0078125 + txt371 +TEXDEF txt372 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.140469 0.875 APEX 0.125 0.234531 0.875 RAD 0.0078125 + txt372 +TEXDEF txt373 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.125 0.890469 APEX 0.125 0.125 0.984531 RAD 0.0078125 + txt373 +TEXDEF txt374 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0.125 1 RAD 0.03125 + txt374 +TEXDEF txt375 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0.125 1 APEX 0.234531 0.125 1 RAD 0.0078125 + txt375 +TEXDEF txt376 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.140469 1 APEX 0.125 0.234531 1 RAD 0.0078125 + txt376 +TEXDEF txt377 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0.25 0 RAD 0.03125 + txt377 +TEXDEF txt378 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0.25 0 APEX 0.234531 0.25 0 RAD 0.0078125 + txt378 +TEXDEF txt379 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.265469 0 APEX 0.125 0.359531 0 RAD 0.0078125 + txt379 +TEXDEF txt380 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.25 0.0154687 APEX 0.125 0.25 0.109531 RAD 0.0078125 + txt380 +TEXDEF txt381 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0.25 0.125 RAD 0.03125 + txt381 +TEXDEF txt382 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0.25 0.125 APEX 0.234531 0.25 0.125 RAD 0.0078125 + txt382 +TEXDEF txt383 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.265469 0.125 APEX 0.125 0.359531 0.125 RAD 0.0078125 + txt383 +TEXDEF txt384 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.25 0.140469 APEX 0.125 0.25 0.234531 RAD 0.0078125 + txt384 +TEXDEF txt385 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0.25 0.25 RAD 0.03125 + txt385 +TEXDEF txt386 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0.25 0.25 APEX 0.234531 0.25 0.25 RAD 0.0078125 + txt386 +TEXDEF txt387 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.265469 0.25 APEX 0.125 0.359531 0.25 RAD 0.0078125 + txt387 +TEXDEF txt388 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.25 0.265469 APEX 0.125 0.25 0.359531 RAD 0.0078125 + txt388 +TEXDEF txt389 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0.25 0.375 RAD 0.03125 + txt389 +TEXDEF txt390 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0.25 0.375 APEX 0.234531 0.25 0.375 RAD 0.0078125 + txt390 +TEXDEF txt391 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.265469 0.375 APEX 0.125 0.359531 0.375 RAD 0.0078125 + txt391 +TEXDEF txt392 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.25 0.390469 APEX 0.125 0.25 0.484531 RAD 0.0078125 + txt392 +TEXDEF txt393 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0.25 0.5 RAD 0.03125 + txt393 +TEXDEF txt394 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0.25 0.5 APEX 0.234531 0.25 0.5 RAD 0.0078125 + txt394 +TEXDEF txt395 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.265469 0.5 APEX 0.125 0.359531 0.5 RAD 0.0078125 + txt395 +TEXDEF txt396 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.25 0.515469 APEX 0.125 0.25 0.609531 RAD 0.0078125 + txt396 +TEXDEF txt397 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0.25 0.625 RAD 0.03125 + txt397 +TEXDEF txt398 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0.25 0.625 APEX 0.234531 0.25 0.625 RAD 0.0078125 + txt398 +TEXDEF txt399 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.265469 0.625 APEX 0.125 0.359531 0.625 RAD 0.0078125 + txt399 +TEXDEF txt400 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.25 0.640469 APEX 0.125 0.25 0.734531 RAD 0.0078125 + txt400 +TEXDEF txt401 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0.25 0.75 RAD 0.03125 + txt401 +TEXDEF txt402 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0.25 0.75 APEX 0.234531 0.25 0.75 RAD 0.0078125 + txt402 +TEXDEF txt403 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.265469 0.75 APEX 0.125 0.359531 0.75 RAD 0.0078125 + txt403 +TEXDEF txt404 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.25 0.765469 APEX 0.125 0.25 0.859531 RAD 0.0078125 + txt404 +TEXDEF txt405 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0.25 0.875 RAD 0.03125 + txt405 +TEXDEF txt406 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0.25 0.875 APEX 0.234531 0.25 0.875 RAD 0.0078125 + txt406 +TEXDEF txt407 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.265469 0.875 APEX 0.125 0.359531 0.875 RAD 0.0078125 + txt407 +TEXDEF txt408 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.25 0.890469 APEX 0.125 0.25 0.984531 RAD 0.0078125 + txt408 +TEXDEF txt409 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0.25 1 RAD 0.03125 + txt409 +TEXDEF txt410 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0.25 1 APEX 0.234531 0.25 1 RAD 0.0078125 + txt410 +TEXDEF txt411 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.265469 1 APEX 0.125 0.359531 1 RAD 0.0078125 + txt411 +TEXDEF txt412 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0.375 0 RAD 0.03125 + txt412 +TEXDEF txt413 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0.375 0 APEX 0.234531 0.375 0 RAD 0.0078125 + txt413 +TEXDEF txt414 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.390469 0 APEX 0.125 0.484531 0 RAD 0.0078125 + txt414 +TEXDEF txt415 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.375 0.0154687 APEX 0.125 0.375 0.109531 RAD 0.0078125 + txt415 +TEXDEF txt416 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0.375 0.125 RAD 0.03125 + txt416 +TEXDEF txt417 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0.375 0.125 APEX 0.234531 0.375 0.125 RAD 0.0078125 + txt417 +TEXDEF txt418 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.390469 0.125 APEX 0.125 0.484531 0.125 RAD 0.0078125 + txt418 +TEXDEF txt419 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.375 0.140469 APEX 0.125 0.375 0.234531 RAD 0.0078125 + txt419 +TEXDEF txt420 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0.375 0.25 RAD 0.03125 + txt420 +TEXDEF txt421 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0.375 0.25 APEX 0.234531 0.375 0.25 RAD 0.0078125 + txt421 +TEXDEF txt422 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.390469 0.25 APEX 0.125 0.484531 0.25 RAD 0.0078125 + txt422 +TEXDEF txt423 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.375 0.265469 APEX 0.125 0.375 0.359531 RAD 0.0078125 + txt423 +TEXDEF txt424 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0.375 0.375 RAD 0.03125 + txt424 +TEXDEF txt425 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0.375 0.375 APEX 0.234531 0.375 0.375 RAD 0.0078125 + txt425 +TEXDEF txt426 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.390469 0.375 APEX 0.125 0.484531 0.375 RAD 0.0078125 + txt426 +TEXDEF txt427 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.375 0.390469 APEX 0.125 0.375 0.484531 RAD 0.0078125 + txt427 +TEXDEF txt428 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0.375 0.5 RAD 0.03125 + txt428 +TEXDEF txt429 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0.375 0.5 APEX 0.234531 0.375 0.5 RAD 0.0078125 + txt429 +TEXDEF txt430 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.390469 0.5 APEX 0.125 0.484531 0.5 RAD 0.0078125 + txt430 +TEXDEF txt431 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.375 0.515469 APEX 0.125 0.375 0.609531 RAD 0.0078125 + txt431 +TEXDEF txt432 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0.375 0.625 RAD 0.03125 + txt432 +TEXDEF txt433 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0.375 0.625 APEX 0.234531 0.375 0.625 RAD 0.0078125 + txt433 +TEXDEF txt434 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.390469 0.625 APEX 0.125 0.484531 0.625 RAD 0.0078125 + txt434 +TEXDEF txt435 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.375 0.640469 APEX 0.125 0.375 0.734531 RAD 0.0078125 + txt435 +TEXDEF txt436 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0.375 0.75 RAD 0.03125 + txt436 +TEXDEF txt437 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0.375 0.75 APEX 0.234531 0.375 0.75 RAD 0.0078125 + txt437 +TEXDEF txt438 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.390469 0.75 APEX 0.125 0.484531 0.75 RAD 0.0078125 + txt438 +TEXDEF txt439 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.375 0.765469 APEX 0.125 0.375 0.859531 RAD 0.0078125 + txt439 +TEXDEF txt440 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0.375 0.875 RAD 0.03125 + txt440 +TEXDEF txt441 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0.375 0.875 APEX 0.234531 0.375 0.875 RAD 0.0078125 + txt441 +TEXDEF txt442 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.390469 0.875 APEX 0.125 0.484531 0.875 RAD 0.0078125 + txt442 +TEXDEF txt443 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.375 0.890469 APEX 0.125 0.375 0.984531 RAD 0.0078125 + txt443 +TEXDEF txt444 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0.375 1 RAD 0.03125 + txt444 +TEXDEF txt445 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0.375 1 APEX 0.234531 0.375 1 RAD 0.0078125 + txt445 +TEXDEF txt446 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.390469 1 APEX 0.125 0.484531 1 RAD 0.0078125 + txt446 +TEXDEF txt447 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0.5 0 RAD 0.03125 + txt447 +TEXDEF txt448 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0.5 0 APEX 0.234531 0.5 0 RAD 0.0078125 + txt448 +TEXDEF txt449 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.515469 0 APEX 0.125 0.609531 0 RAD 0.0078125 + txt449 +TEXDEF txt450 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.5 0.0154687 APEX 0.125 0.5 0.109531 RAD 0.0078125 + txt450 +TEXDEF txt451 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0.5 0.125 RAD 0.03125 + txt451 +TEXDEF txt452 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0.5 0.125 APEX 0.234531 0.5 0.125 RAD 0.0078125 + txt452 +TEXDEF txt453 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.515469 0.125 APEX 0.125 0.609531 0.125 RAD 0.0078125 + txt453 +TEXDEF txt454 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.5 0.140469 APEX 0.125 0.5 0.234531 RAD 0.0078125 + txt454 +TEXDEF txt455 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0.5 0.25 RAD 0.03125 + txt455 +TEXDEF txt456 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0.5 0.25 APEX 0.234531 0.5 0.25 RAD 0.0078125 + txt456 +TEXDEF txt457 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.515469 0.25 APEX 0.125 0.609531 0.25 RAD 0.0078125 + txt457 +TEXDEF txt458 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.5 0.265469 APEX 0.125 0.5 0.359531 RAD 0.0078125 + txt458 +TEXDEF txt459 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0.5 0.375 RAD 0.03125 + txt459 +TEXDEF txt460 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0.5 0.375 APEX 0.234531 0.5 0.375 RAD 0.0078125 + txt460 +TEXDEF txt461 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.515469 0.375 APEX 0.125 0.609531 0.375 RAD 0.0078125 + txt461 +TEXDEF txt462 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.5 0.390469 APEX 0.125 0.5 0.484531 RAD 0.0078125 + txt462 +TEXDEF txt463 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0.5 0.5 RAD 0.03125 + txt463 +TEXDEF txt464 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0.5 0.5 APEX 0.234531 0.5 0.5 RAD 0.0078125 + txt464 +TEXDEF txt465 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.515469 0.5 APEX 0.125 0.609531 0.5 RAD 0.0078125 + txt465 +TEXDEF txt466 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.5 0.515469 APEX 0.125 0.5 0.609531 RAD 0.0078125 + txt466 +TEXDEF txt467 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0.5 0.625 RAD 0.03125 + txt467 +TEXDEF txt468 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0.5 0.625 APEX 0.234531 0.5 0.625 RAD 0.0078125 + txt468 +TEXDEF txt469 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.515469 0.625 APEX 0.125 0.609531 0.625 RAD 0.0078125 + txt469 +TEXDEF txt470 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.5 0.640469 APEX 0.125 0.5 0.734531 RAD 0.0078125 + txt470 +TEXDEF txt471 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0.5 0.75 RAD 0.03125 + txt471 +TEXDEF txt472 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0.5 0.75 APEX 0.234531 0.5 0.75 RAD 0.0078125 + txt472 +TEXDEF txt473 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.515469 0.75 APEX 0.125 0.609531 0.75 RAD 0.0078125 + txt473 +TEXDEF txt474 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.5 0.765469 APEX 0.125 0.5 0.859531 RAD 0.0078125 + txt474 +TEXDEF txt475 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0.5 0.875 RAD 0.03125 + txt475 +TEXDEF txt476 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0.5 0.875 APEX 0.234531 0.5 0.875 RAD 0.0078125 + txt476 +TEXDEF txt477 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.515469 0.875 APEX 0.125 0.609531 0.875 RAD 0.0078125 + txt477 +TEXDEF txt478 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.5 0.890469 APEX 0.125 0.5 0.984531 RAD 0.0078125 + txt478 +TEXDEF txt479 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0.5 1 RAD 0.03125 + txt479 +TEXDEF txt480 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0.5 1 APEX 0.234531 0.5 1 RAD 0.0078125 + txt480 +TEXDEF txt481 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.515469 1 APEX 0.125 0.609531 1 RAD 0.0078125 + txt481 +TEXDEF txt482 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0.625 0 RAD 0.03125 + txt482 +TEXDEF txt483 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0.625 0 APEX 0.234531 0.625 0 RAD 0.0078125 + txt483 +TEXDEF txt484 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.640469 0 APEX 0.125 0.734531 0 RAD 0.0078125 + txt484 +TEXDEF txt485 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.625 0.0154687 APEX 0.125 0.625 0.109531 RAD 0.0078125 + txt485 +TEXDEF txt486 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0.625 0.125 RAD 0.03125 + txt486 +TEXDEF txt487 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0.625 0.125 APEX 0.234531 0.625 0.125 RAD 0.0078125 + txt487 +TEXDEF txt488 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.640469 0.125 APEX 0.125 0.734531 0.125 RAD 0.0078125 + txt488 +TEXDEF txt489 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.625 0.140469 APEX 0.125 0.625 0.234531 RAD 0.0078125 + txt489 +TEXDEF txt490 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0.625 0.25 RAD 0.03125 + txt490 +TEXDEF txt491 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0.625 0.25 APEX 0.234531 0.625 0.25 RAD 0.0078125 + txt491 +TEXDEF txt492 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.640469 0.25 APEX 0.125 0.734531 0.25 RAD 0.0078125 + txt492 +TEXDEF txt493 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.625 0.265469 APEX 0.125 0.625 0.359531 RAD 0.0078125 + txt493 +TEXDEF txt494 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0.625 0.375 RAD 0.03125 + txt494 +TEXDEF txt495 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0.625 0.375 APEX 0.234531 0.625 0.375 RAD 0.0078125 + txt495 +TEXDEF txt496 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.640469 0.375 APEX 0.125 0.734531 0.375 RAD 0.0078125 + txt496 +TEXDEF txt497 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.625 0.390469 APEX 0.125 0.625 0.484531 RAD 0.0078125 + txt497 +TEXDEF txt498 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0.625 0.5 RAD 0.03125 + txt498 +TEXDEF txt499 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0.625 0.5 APEX 0.234531 0.625 0.5 RAD 0.0078125 + txt499 +TEXDEF txt500 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.640469 0.5 APEX 0.125 0.734531 0.5 RAD 0.0078125 + txt500 +TEXDEF txt501 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.625 0.515469 APEX 0.125 0.625 0.609531 RAD 0.0078125 + txt501 +TEXDEF txt502 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0.625 0.625 RAD 0.03125 + txt502 +TEXDEF txt503 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0.625 0.625 APEX 0.234531 0.625 0.625 RAD 0.0078125 + txt503 +TEXDEF txt504 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.640469 0.625 APEX 0.125 0.734531 0.625 RAD 0.0078125 + txt504 +TEXDEF txt505 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.625 0.640469 APEX 0.125 0.625 0.734531 RAD 0.0078125 + txt505 +TEXDEF txt506 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0.625 0.75 RAD 0.03125 + txt506 +TEXDEF txt507 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0.625 0.75 APEX 0.234531 0.625 0.75 RAD 0.0078125 + txt507 +TEXDEF txt508 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.640469 0.75 APEX 0.125 0.734531 0.75 RAD 0.0078125 + txt508 +TEXDEF txt509 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.625 0.765469 APEX 0.125 0.625 0.859531 RAD 0.0078125 + txt509 +TEXDEF txt510 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0.625 0.875 RAD 0.03125 + txt510 +TEXDEF txt511 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0.625 0.875 APEX 0.234531 0.625 0.875 RAD 0.0078125 + txt511 +TEXDEF txt512 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.640469 0.875 APEX 0.125 0.734531 0.875 RAD 0.0078125 + txt512 +TEXDEF txt513 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.625 0.890469 APEX 0.125 0.625 0.984531 RAD 0.0078125 + txt513 +TEXDEF txt514 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0.625 1 RAD 0.03125 + txt514 +TEXDEF txt515 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0.625 1 APEX 0.234531 0.625 1 RAD 0.0078125 + txt515 +TEXDEF txt516 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.640469 1 APEX 0.125 0.734531 1 RAD 0.0078125 + txt516 +TEXDEF txt517 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0.75 0 RAD 0.03125 + txt517 +TEXDEF txt518 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0.75 0 APEX 0.234531 0.75 0 RAD 0.0078125 + txt518 +TEXDEF txt519 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.765469 0 APEX 0.125 0.859531 0 RAD 0.0078125 + txt519 +TEXDEF txt520 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.75 0.0154687 APEX 0.125 0.75 0.109531 RAD 0.0078125 + txt520 +TEXDEF txt521 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0.75 0.125 RAD 0.03125 + txt521 +TEXDEF txt522 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0.75 0.125 APEX 0.234531 0.75 0.125 RAD 0.0078125 + txt522 +TEXDEF txt523 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.765469 0.125 APEX 0.125 0.859531 0.125 RAD 0.0078125 + txt523 +TEXDEF txt524 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.75 0.140469 APEX 0.125 0.75 0.234531 RAD 0.0078125 + txt524 +TEXDEF txt525 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0.75 0.25 RAD 0.03125 + txt525 +TEXDEF txt526 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0.75 0.25 APEX 0.234531 0.75 0.25 RAD 0.0078125 + txt526 +TEXDEF txt527 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.765469 0.25 APEX 0.125 0.859531 0.25 RAD 0.0078125 + txt527 +TEXDEF txt528 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.75 0.265469 APEX 0.125 0.75 0.359531 RAD 0.0078125 + txt528 +TEXDEF txt529 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0.75 0.375 RAD 0.03125 + txt529 +TEXDEF txt530 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0.75 0.375 APEX 0.234531 0.75 0.375 RAD 0.0078125 + txt530 +TEXDEF txt531 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.765469 0.375 APEX 0.125 0.859531 0.375 RAD 0.0078125 + txt531 +TEXDEF txt532 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.75 0.390469 APEX 0.125 0.75 0.484531 RAD 0.0078125 + txt532 +TEXDEF txt533 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0.75 0.5 RAD 0.03125 + txt533 +TEXDEF txt534 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0.75 0.5 APEX 0.234531 0.75 0.5 RAD 0.0078125 + txt534 +TEXDEF txt535 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.765469 0.5 APEX 0.125 0.859531 0.5 RAD 0.0078125 + txt535 +TEXDEF txt536 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.75 0.515469 APEX 0.125 0.75 0.609531 RAD 0.0078125 + txt536 +TEXDEF txt537 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0.75 0.625 RAD 0.03125 + txt537 +TEXDEF txt538 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0.75 0.625 APEX 0.234531 0.75 0.625 RAD 0.0078125 + txt538 +TEXDEF txt539 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.765469 0.625 APEX 0.125 0.859531 0.625 RAD 0.0078125 + txt539 +TEXDEF txt540 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.75 0.640469 APEX 0.125 0.75 0.734531 RAD 0.0078125 + txt540 +TEXDEF txt541 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0.75 0.75 RAD 0.03125 + txt541 +TEXDEF txt542 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0.75 0.75 APEX 0.234531 0.75 0.75 RAD 0.0078125 + txt542 +TEXDEF txt543 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.765469 0.75 APEX 0.125 0.859531 0.75 RAD 0.0078125 + txt543 +TEXDEF txt544 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.75 0.765469 APEX 0.125 0.75 0.859531 RAD 0.0078125 + txt544 +TEXDEF txt545 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0.75 0.875 RAD 0.03125 + txt545 +TEXDEF txt546 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0.75 0.875 APEX 0.234531 0.75 0.875 RAD 0.0078125 + txt546 +TEXDEF txt547 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.765469 0.875 APEX 0.125 0.859531 0.875 RAD 0.0078125 + txt547 +TEXDEF txt548 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.75 0.890469 APEX 0.125 0.75 0.984531 RAD 0.0078125 + txt548 +TEXDEF txt549 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0.75 1 RAD 0.03125 + txt549 +TEXDEF txt550 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0.75 1 APEX 0.234531 0.75 1 RAD 0.0078125 + txt550 +TEXDEF txt551 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.765469 1 APEX 0.125 0.859531 1 RAD 0.0078125 + txt551 +TEXDEF txt552 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0.875 0 RAD 0.03125 + txt552 +TEXDEF txt553 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0.875 0 APEX 0.234531 0.875 0 RAD 0.0078125 + txt553 +TEXDEF txt554 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.890469 0 APEX 0.125 0.984531 0 RAD 0.0078125 + txt554 +TEXDEF txt555 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.875 0.0154687 APEX 0.125 0.875 0.109531 RAD 0.0078125 + txt555 +TEXDEF txt556 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0.875 0.125 RAD 0.03125 + txt556 +TEXDEF txt557 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0.875 0.125 APEX 0.234531 0.875 0.125 RAD 0.0078125 + txt557 +TEXDEF txt558 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.890469 0.125 APEX 0.125 0.984531 0.125 RAD 0.0078125 + txt558 +TEXDEF txt559 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.875 0.140469 APEX 0.125 0.875 0.234531 RAD 0.0078125 + txt559 +TEXDEF txt560 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0.875 0.25 RAD 0.03125 + txt560 +TEXDEF txt561 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0.875 0.25 APEX 0.234531 0.875 0.25 RAD 0.0078125 + txt561 +TEXDEF txt562 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.890469 0.25 APEX 0.125 0.984531 0.25 RAD 0.0078125 + txt562 +TEXDEF txt563 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.875 0.265469 APEX 0.125 0.875 0.359531 RAD 0.0078125 + txt563 +TEXDEF txt564 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0.875 0.375 RAD 0.03125 + txt564 +TEXDEF txt565 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0.875 0.375 APEX 0.234531 0.875 0.375 RAD 0.0078125 + txt565 +TEXDEF txt566 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.890469 0.375 APEX 0.125 0.984531 0.375 RAD 0.0078125 + txt566 +TEXDEF txt567 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.875 0.390469 APEX 0.125 0.875 0.484531 RAD 0.0078125 + txt567 +TEXDEF txt568 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0.875 0.5 RAD 0.03125 + txt568 +TEXDEF txt569 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0.875 0.5 APEX 0.234531 0.875 0.5 RAD 0.0078125 + txt569 +TEXDEF txt570 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.890469 0.5 APEX 0.125 0.984531 0.5 RAD 0.0078125 + txt570 +TEXDEF txt571 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.875 0.515469 APEX 0.125 0.875 0.609531 RAD 0.0078125 + txt571 +TEXDEF txt572 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0.875 0.625 RAD 0.03125 + txt572 +TEXDEF txt573 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0.875 0.625 APEX 0.234531 0.875 0.625 RAD 0.0078125 + txt573 +TEXDEF txt574 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.890469 0.625 APEX 0.125 0.984531 0.625 RAD 0.0078125 + txt574 +TEXDEF txt575 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.875 0.640469 APEX 0.125 0.875 0.734531 RAD 0.0078125 + txt575 +TEXDEF txt576 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0.875 0.75 RAD 0.03125 + txt576 +TEXDEF txt577 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0.875 0.75 APEX 0.234531 0.875 0.75 RAD 0.0078125 + txt577 +TEXDEF txt578 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.890469 0.75 APEX 0.125 0.984531 0.75 RAD 0.0078125 + txt578 +TEXDEF txt579 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.875 0.765469 APEX 0.125 0.875 0.859531 RAD 0.0078125 + txt579 +TEXDEF txt580 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0.875 0.875 RAD 0.03125 + txt580 +TEXDEF txt581 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0.875 0.875 APEX 0.234531 0.875 0.875 RAD 0.0078125 + txt581 +TEXDEF txt582 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.890469 0.875 APEX 0.125 0.984531 0.875 RAD 0.0078125 + txt582 +TEXDEF txt583 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.875 0.890469 APEX 0.125 0.875 0.984531 RAD 0.0078125 + txt583 +TEXDEF txt584 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 0.875 1 RAD 0.03125 + txt584 +TEXDEF txt585 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 0.875 1 APEX 0.234531 0.875 1 RAD 0.0078125 + txt585 +TEXDEF txt586 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 0.890469 1 APEX 0.125 0.984531 1 RAD 0.0078125 + txt586 +TEXDEF txt587 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 1 0 RAD 0.03125 + txt587 +TEXDEF txt588 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 1 0 APEX 0.234531 1 0 RAD 0.0078125 + txt588 +TEXDEF txt589 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 1 0.0154687 APEX 0.125 1 0.109531 RAD 0.0078125 + txt589 +TEXDEF txt590 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 1 0.125 RAD 0.03125 + txt590 +TEXDEF txt591 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 1 0.125 APEX 0.234531 1 0.125 RAD 0.0078125 + txt591 +TEXDEF txt592 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 1 0.140469 APEX 0.125 1 0.234531 RAD 0.0078125 + txt592 +TEXDEF txt593 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 1 0.25 RAD 0.03125 + txt593 +TEXDEF txt594 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 1 0.25 APEX 0.234531 1 0.25 RAD 0.0078125 + txt594 +TEXDEF txt595 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 1 0.265469 APEX 0.125 1 0.359531 RAD 0.0078125 + txt595 +TEXDEF txt596 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 1 0.375 RAD 0.03125 + txt596 +TEXDEF txt597 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 1 0.375 APEX 0.234531 1 0.375 RAD 0.0078125 + txt597 +TEXDEF txt598 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 1 0.390469 APEX 0.125 1 0.484531 RAD 0.0078125 + txt598 +TEXDEF txt599 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 1 0.5 RAD 0.03125 + txt599 +TEXDEF txt600 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 1 0.5 APEX 0.234531 1 0.5 RAD 0.0078125 + txt600 +TEXDEF txt601 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 1 0.515469 APEX 0.125 1 0.609531 RAD 0.0078125 + txt601 +TEXDEF txt602 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 1 0.625 RAD 0.03125 + txt602 +TEXDEF txt603 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 1 0.625 APEX 0.234531 1 0.625 RAD 0.0078125 + txt603 +TEXDEF txt604 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 1 0.640469 APEX 0.125 1 0.734531 RAD 0.0078125 + txt604 +TEXDEF txt605 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 1 0.75 RAD 0.03125 + txt605 +TEXDEF txt606 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 1 0.75 APEX 0.234531 1 0.75 RAD 0.0078125 + txt606 +TEXDEF txt607 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 1 0.765469 APEX 0.125 1 0.859531 RAD 0.0078125 + txt607 +TEXDEF txt608 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 1 0.875 RAD 0.03125 + txt608 +TEXDEF txt609 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 1 0.875 APEX 0.234531 1 0.875 RAD 0.0078125 + txt609 +TEXDEF txt610 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.125 1 0.890469 APEX 0.125 1 0.984531 RAD 0.0078125 + txt610 +TEXDEF txt611 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.125 1 1 RAD 0.03125 + txt611 +TEXDEF txt612 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.140469 1 1 APEX 0.234531 1 1 RAD 0.0078125 + txt612 +TEXDEF txt613 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0 0 RAD 0.03125 + txt613 +TEXDEF txt614 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0 0 APEX 0.359531 0 0 RAD 0.0078125 + txt614 +TEXDEF txt615 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.0154687 0 APEX 0.25 0.109531 0 RAD 0.0078125 + txt615 +TEXDEF txt616 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0 0.0154687 APEX 0.25 0 0.109531 RAD 0.0078125 + txt616 +TEXDEF txt617 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0 0.125 RAD 0.03125 + txt617 +TEXDEF txt618 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0 0.125 APEX 0.359531 0 0.125 RAD 0.0078125 + txt618 +TEXDEF txt619 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.0154687 0.125 APEX 0.25 0.109531 0.125 RAD 0.0078125 + txt619 +TEXDEF txt620 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0 0.140469 APEX 0.25 0 0.234531 RAD 0.0078125 + txt620 +TEXDEF txt621 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0 0.25 RAD 0.03125 + txt621 +TEXDEF txt622 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0 0.25 APEX 0.359531 0 0.25 RAD 0.0078125 + txt622 +TEXDEF txt623 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.0154687 0.25 APEX 0.25 0.109531 0.25 RAD 0.0078125 + txt623 +TEXDEF txt624 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0 0.265469 APEX 0.25 0 0.359531 RAD 0.0078125 + txt624 +TEXDEF txt625 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0 0.375 RAD 0.03125 + txt625 +TEXDEF txt626 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0 0.375 APEX 0.359531 0 0.375 RAD 0.0078125 + txt626 +TEXDEF txt627 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.0154687 0.375 APEX 0.25 0.109531 0.375 RAD 0.0078125 + txt627 +TEXDEF txt628 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0 0.390469 APEX 0.25 0 0.484531 RAD 0.0078125 + txt628 +TEXDEF txt629 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0 0.5 RAD 0.03125 + txt629 +TEXDEF txt630 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0 0.5 APEX 0.359531 0 0.5 RAD 0.0078125 + txt630 +TEXDEF txt631 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.0154687 0.5 APEX 0.25 0.109531 0.5 RAD 0.0078125 + txt631 +TEXDEF txt632 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0 0.515469 APEX 0.25 0 0.609531 RAD 0.0078125 + txt632 +TEXDEF txt633 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0 0.625 RAD 0.03125 + txt633 +TEXDEF txt634 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0 0.625 APEX 0.359531 0 0.625 RAD 0.0078125 + txt634 +TEXDEF txt635 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.0154687 0.625 APEX 0.25 0.109531 0.625 RAD 0.0078125 + txt635 +TEXDEF txt636 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0 0.640469 APEX 0.25 0 0.734531 RAD 0.0078125 + txt636 +TEXDEF txt637 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0 0.75 RAD 0.03125 + txt637 +TEXDEF txt638 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0 0.75 APEX 0.359531 0 0.75 RAD 0.0078125 + txt638 +TEXDEF txt639 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.0154687 0.75 APEX 0.25 0.109531 0.75 RAD 0.0078125 + txt639 +TEXDEF txt640 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0 0.765469 APEX 0.25 0 0.859531 RAD 0.0078125 + txt640 +TEXDEF txt641 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0 0.875 RAD 0.03125 + txt641 +TEXDEF txt642 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0 0.875 APEX 0.359531 0 0.875 RAD 0.0078125 + txt642 +TEXDEF txt643 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.0154687 0.875 APEX 0.25 0.109531 0.875 RAD 0.0078125 + txt643 +TEXDEF txt644 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0 0.890469 APEX 0.25 0 0.984531 RAD 0.0078125 + txt644 +TEXDEF txt645 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0 1 RAD 0.03125 + txt645 +TEXDEF txt646 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0 1 APEX 0.359531 0 1 RAD 0.0078125 + txt646 +TEXDEF txt647 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.0154687 1 APEX 0.25 0.109531 1 RAD 0.0078125 + txt647 +TEXDEF txt648 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0.125 0 RAD 0.03125 + txt648 +TEXDEF txt649 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0.125 0 APEX 0.359531 0.125 0 RAD 0.0078125 + txt649 +TEXDEF txt650 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.140469 0 APEX 0.25 0.234531 0 RAD 0.0078125 + txt650 +TEXDEF txt651 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.125 0.0154687 APEX 0.25 0.125 0.109531 RAD 0.0078125 + txt651 +TEXDEF txt652 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0.125 0.125 RAD 0.03125 + txt652 +TEXDEF txt653 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0.125 0.125 APEX 0.359531 0.125 0.125 RAD 0.0078125 + txt653 +TEXDEF txt654 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.140469 0.125 APEX 0.25 0.234531 0.125 RAD 0.0078125 + txt654 +TEXDEF txt655 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.125 0.140469 APEX 0.25 0.125 0.234531 RAD 0.0078125 + txt655 +TEXDEF txt656 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0.125 0.25 RAD 0.03125 + txt656 +TEXDEF txt657 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0.125 0.25 APEX 0.359531 0.125 0.25 RAD 0.0078125 + txt657 +TEXDEF txt658 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.140469 0.25 APEX 0.25 0.234531 0.25 RAD 0.0078125 + txt658 +TEXDEF txt659 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.125 0.265469 APEX 0.25 0.125 0.359531 RAD 0.0078125 + txt659 +TEXDEF txt660 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0.125 0.375 RAD 0.03125 + txt660 +TEXDEF txt661 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0.125 0.375 APEX 0.359531 0.125 0.375 RAD 0.0078125 + txt661 +TEXDEF txt662 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.140469 0.375 APEX 0.25 0.234531 0.375 RAD 0.0078125 + txt662 +TEXDEF txt663 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.125 0.390469 APEX 0.25 0.125 0.484531 RAD 0.0078125 + txt663 +TEXDEF txt664 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0.125 0.5 RAD 0.03125 + txt664 +TEXDEF txt665 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0.125 0.5 APEX 0.359531 0.125 0.5 RAD 0.0078125 + txt665 +TEXDEF txt666 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.140469 0.5 APEX 0.25 0.234531 0.5 RAD 0.0078125 + txt666 +TEXDEF txt667 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.125 0.515469 APEX 0.25 0.125 0.609531 RAD 0.0078125 + txt667 +TEXDEF txt668 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0.125 0.625 RAD 0.03125 + txt668 +TEXDEF txt669 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0.125 0.625 APEX 0.359531 0.125 0.625 RAD 0.0078125 + txt669 +TEXDEF txt670 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.140469 0.625 APEX 0.25 0.234531 0.625 RAD 0.0078125 + txt670 +TEXDEF txt671 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.125 0.640469 APEX 0.25 0.125 0.734531 RAD 0.0078125 + txt671 +TEXDEF txt672 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0.125 0.75 RAD 0.03125 + txt672 +TEXDEF txt673 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0.125 0.75 APEX 0.359531 0.125 0.75 RAD 0.0078125 + txt673 +TEXDEF txt674 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.140469 0.75 APEX 0.25 0.234531 0.75 RAD 0.0078125 + txt674 +TEXDEF txt675 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.125 0.765469 APEX 0.25 0.125 0.859531 RAD 0.0078125 + txt675 +TEXDEF txt676 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0.125 0.875 RAD 0.03125 + txt676 +TEXDEF txt677 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0.125 0.875 APEX 0.359531 0.125 0.875 RAD 0.0078125 + txt677 +TEXDEF txt678 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.140469 0.875 APEX 0.25 0.234531 0.875 RAD 0.0078125 + txt678 +TEXDEF txt679 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.125 0.890469 APEX 0.25 0.125 0.984531 RAD 0.0078125 + txt679 +TEXDEF txt680 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0.125 1 RAD 0.03125 + txt680 +TEXDEF txt681 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0.125 1 APEX 0.359531 0.125 1 RAD 0.0078125 + txt681 +TEXDEF txt682 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.140469 1 APEX 0.25 0.234531 1 RAD 0.0078125 + txt682 +TEXDEF txt683 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0.25 0 RAD 0.03125 + txt683 +TEXDEF txt684 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0.25 0 APEX 0.359531 0.25 0 RAD 0.0078125 + txt684 +TEXDEF txt685 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.265469 0 APEX 0.25 0.359531 0 RAD 0.0078125 + txt685 +TEXDEF txt686 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.25 0.0154687 APEX 0.25 0.25 0.109531 RAD 0.0078125 + txt686 +TEXDEF txt687 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0.25 0.125 RAD 0.03125 + txt687 +TEXDEF txt688 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0.25 0.125 APEX 0.359531 0.25 0.125 RAD 0.0078125 + txt688 +TEXDEF txt689 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.265469 0.125 APEX 0.25 0.359531 0.125 RAD 0.0078125 + txt689 +TEXDEF txt690 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.25 0.140469 APEX 0.25 0.25 0.234531 RAD 0.0078125 + txt690 +TEXDEF txt691 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0.25 0.25 RAD 0.03125 + txt691 +TEXDEF txt692 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0.25 0.25 APEX 0.359531 0.25 0.25 RAD 0.0078125 + txt692 +TEXDEF txt693 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.265469 0.25 APEX 0.25 0.359531 0.25 RAD 0.0078125 + txt693 +TEXDEF txt694 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.25 0.265469 APEX 0.25 0.25 0.359531 RAD 0.0078125 + txt694 +TEXDEF txt695 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0.25 0.375 RAD 0.03125 + txt695 +TEXDEF txt696 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0.25 0.375 APEX 0.359531 0.25 0.375 RAD 0.0078125 + txt696 +TEXDEF txt697 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.265469 0.375 APEX 0.25 0.359531 0.375 RAD 0.0078125 + txt697 +TEXDEF txt698 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.25 0.390469 APEX 0.25 0.25 0.484531 RAD 0.0078125 + txt698 +TEXDEF txt699 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0.25 0.5 RAD 0.03125 + txt699 +TEXDEF txt700 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0.25 0.5 APEX 0.359531 0.25 0.5 RAD 0.0078125 + txt700 +TEXDEF txt701 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.265469 0.5 APEX 0.25 0.359531 0.5 RAD 0.0078125 + txt701 +TEXDEF txt702 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.25 0.515469 APEX 0.25 0.25 0.609531 RAD 0.0078125 + txt702 +TEXDEF txt703 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0.25 0.625 RAD 0.03125 + txt703 +TEXDEF txt704 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0.25 0.625 APEX 0.359531 0.25 0.625 RAD 0.0078125 + txt704 +TEXDEF txt705 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.265469 0.625 APEX 0.25 0.359531 0.625 RAD 0.0078125 + txt705 +TEXDEF txt706 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.25 0.640469 APEX 0.25 0.25 0.734531 RAD 0.0078125 + txt706 +TEXDEF txt707 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0.25 0.75 RAD 0.03125 + txt707 +TEXDEF txt708 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0.25 0.75 APEX 0.359531 0.25 0.75 RAD 0.0078125 + txt708 +TEXDEF txt709 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.265469 0.75 APEX 0.25 0.359531 0.75 RAD 0.0078125 + txt709 +TEXDEF txt710 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.25 0.765469 APEX 0.25 0.25 0.859531 RAD 0.0078125 + txt710 +TEXDEF txt711 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0.25 0.875 RAD 0.03125 + txt711 +TEXDEF txt712 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0.25 0.875 APEX 0.359531 0.25 0.875 RAD 0.0078125 + txt712 +TEXDEF txt713 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.265469 0.875 APEX 0.25 0.359531 0.875 RAD 0.0078125 + txt713 +TEXDEF txt714 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.25 0.890469 APEX 0.25 0.25 0.984531 RAD 0.0078125 + txt714 +TEXDEF txt715 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0.25 1 RAD 0.03125 + txt715 +TEXDEF txt716 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0.25 1 APEX 0.359531 0.25 1 RAD 0.0078125 + txt716 +TEXDEF txt717 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.265469 1 APEX 0.25 0.359531 1 RAD 0.0078125 + txt717 +TEXDEF txt718 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0.375 0 RAD 0.03125 + txt718 +TEXDEF txt719 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0.375 0 APEX 0.359531 0.375 0 RAD 0.0078125 + txt719 +TEXDEF txt720 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.390469 0 APEX 0.25 0.484531 0 RAD 0.0078125 + txt720 +TEXDEF txt721 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.375 0.0154687 APEX 0.25 0.375 0.109531 RAD 0.0078125 + txt721 +TEXDEF txt722 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0.375 0.125 RAD 0.03125 + txt722 +TEXDEF txt723 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0.375 0.125 APEX 0.359531 0.375 0.125 RAD 0.0078125 + txt723 +TEXDEF txt724 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.390469 0.125 APEX 0.25 0.484531 0.125 RAD 0.0078125 + txt724 +TEXDEF txt725 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.375 0.140469 APEX 0.25 0.375 0.234531 RAD 0.0078125 + txt725 +TEXDEF txt726 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0.375 0.25 RAD 0.03125 + txt726 +TEXDEF txt727 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0.375 0.25 APEX 0.359531 0.375 0.25 RAD 0.0078125 + txt727 +TEXDEF txt728 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.390469 0.25 APEX 0.25 0.484531 0.25 RAD 0.0078125 + txt728 +TEXDEF txt729 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.375 0.265469 APEX 0.25 0.375 0.359531 RAD 0.0078125 + txt729 +TEXDEF txt730 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0.375 0.375 RAD 0.03125 + txt730 +TEXDEF txt731 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0.375 0.375 APEX 0.359531 0.375 0.375 RAD 0.0078125 + txt731 +TEXDEF txt732 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.390469 0.375 APEX 0.25 0.484531 0.375 RAD 0.0078125 + txt732 +TEXDEF txt733 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.375 0.390469 APEX 0.25 0.375 0.484531 RAD 0.0078125 + txt733 +TEXDEF txt734 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0.375 0.5 RAD 0.03125 + txt734 +TEXDEF txt735 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0.375 0.5 APEX 0.359531 0.375 0.5 RAD 0.0078125 + txt735 +TEXDEF txt736 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.390469 0.5 APEX 0.25 0.484531 0.5 RAD 0.0078125 + txt736 +TEXDEF txt737 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.375 0.515469 APEX 0.25 0.375 0.609531 RAD 0.0078125 + txt737 +TEXDEF txt738 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0.375 0.625 RAD 0.03125 + txt738 +TEXDEF txt739 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0.375 0.625 APEX 0.359531 0.375 0.625 RAD 0.0078125 + txt739 +TEXDEF txt740 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.390469 0.625 APEX 0.25 0.484531 0.625 RAD 0.0078125 + txt740 +TEXDEF txt741 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.375 0.640469 APEX 0.25 0.375 0.734531 RAD 0.0078125 + txt741 +TEXDEF txt742 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0.375 0.75 RAD 0.03125 + txt742 +TEXDEF txt743 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0.375 0.75 APEX 0.359531 0.375 0.75 RAD 0.0078125 + txt743 +TEXDEF txt744 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.390469 0.75 APEX 0.25 0.484531 0.75 RAD 0.0078125 + txt744 +TEXDEF txt745 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.375 0.765469 APEX 0.25 0.375 0.859531 RAD 0.0078125 + txt745 +TEXDEF txt746 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0.375 0.875 RAD 0.03125 + txt746 +TEXDEF txt747 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0.375 0.875 APEX 0.359531 0.375 0.875 RAD 0.0078125 + txt747 +TEXDEF txt748 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.390469 0.875 APEX 0.25 0.484531 0.875 RAD 0.0078125 + txt748 +TEXDEF txt749 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.375 0.890469 APEX 0.25 0.375 0.984531 RAD 0.0078125 + txt749 +TEXDEF txt750 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0.375 1 RAD 0.03125 + txt750 +TEXDEF txt751 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0.375 1 APEX 0.359531 0.375 1 RAD 0.0078125 + txt751 +TEXDEF txt752 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.390469 1 APEX 0.25 0.484531 1 RAD 0.0078125 + txt752 +TEXDEF txt753 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0.5 0 RAD 0.03125 + txt753 +TEXDEF txt754 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0.5 0 APEX 0.359531 0.5 0 RAD 0.0078125 + txt754 +TEXDEF txt755 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.515469 0 APEX 0.25 0.609531 0 RAD 0.0078125 + txt755 +TEXDEF txt756 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.5 0.0154687 APEX 0.25 0.5 0.109531 RAD 0.0078125 + txt756 +TEXDEF txt757 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0.5 0.125 RAD 0.03125 + txt757 +TEXDEF txt758 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0.5 0.125 APEX 0.359531 0.5 0.125 RAD 0.0078125 + txt758 +TEXDEF txt759 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.515469 0.125 APEX 0.25 0.609531 0.125 RAD 0.0078125 + txt759 +TEXDEF txt760 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.5 0.140469 APEX 0.25 0.5 0.234531 RAD 0.0078125 + txt760 +TEXDEF txt761 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0.5 0.25 RAD 0.03125 + txt761 +TEXDEF txt762 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0.5 0.25 APEX 0.359531 0.5 0.25 RAD 0.0078125 + txt762 +TEXDEF txt763 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.515469 0.25 APEX 0.25 0.609531 0.25 RAD 0.0078125 + txt763 +TEXDEF txt764 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.5 0.265469 APEX 0.25 0.5 0.359531 RAD 0.0078125 + txt764 +TEXDEF txt765 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0.5 0.375 RAD 0.03125 + txt765 +TEXDEF txt766 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0.5 0.375 APEX 0.359531 0.5 0.375 RAD 0.0078125 + txt766 +TEXDEF txt767 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.515469 0.375 APEX 0.25 0.609531 0.375 RAD 0.0078125 + txt767 +TEXDEF txt768 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.5 0.390469 APEX 0.25 0.5 0.484531 RAD 0.0078125 + txt768 +TEXDEF txt769 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0.5 0.5 RAD 0.03125 + txt769 +TEXDEF txt770 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0.5 0.5 APEX 0.359531 0.5 0.5 RAD 0.0078125 + txt770 +TEXDEF txt771 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.515469 0.5 APEX 0.25 0.609531 0.5 RAD 0.0078125 + txt771 +TEXDEF txt772 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.5 0.515469 APEX 0.25 0.5 0.609531 RAD 0.0078125 + txt772 +TEXDEF txt773 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0.5 0.625 RAD 0.03125 + txt773 +TEXDEF txt774 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0.5 0.625 APEX 0.359531 0.5 0.625 RAD 0.0078125 + txt774 +TEXDEF txt775 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.515469 0.625 APEX 0.25 0.609531 0.625 RAD 0.0078125 + txt775 +TEXDEF txt776 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.5 0.640469 APEX 0.25 0.5 0.734531 RAD 0.0078125 + txt776 +TEXDEF txt777 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0.5 0.75 RAD 0.03125 + txt777 +TEXDEF txt778 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0.5 0.75 APEX 0.359531 0.5 0.75 RAD 0.0078125 + txt778 +TEXDEF txt779 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.515469 0.75 APEX 0.25 0.609531 0.75 RAD 0.0078125 + txt779 +TEXDEF txt780 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.5 0.765469 APEX 0.25 0.5 0.859531 RAD 0.0078125 + txt780 +TEXDEF txt781 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0.5 0.875 RAD 0.03125 + txt781 +TEXDEF txt782 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0.5 0.875 APEX 0.359531 0.5 0.875 RAD 0.0078125 + txt782 +TEXDEF txt783 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.515469 0.875 APEX 0.25 0.609531 0.875 RAD 0.0078125 + txt783 +TEXDEF txt784 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.5 0.890469 APEX 0.25 0.5 0.984531 RAD 0.0078125 + txt784 +TEXDEF txt785 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0.5 1 RAD 0.03125 + txt785 +TEXDEF txt786 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0.5 1 APEX 0.359531 0.5 1 RAD 0.0078125 + txt786 +TEXDEF txt787 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.515469 1 APEX 0.25 0.609531 1 RAD 0.0078125 + txt787 +TEXDEF txt788 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0.625 0 RAD 0.03125 + txt788 +TEXDEF txt789 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0.625 0 APEX 0.359531 0.625 0 RAD 0.0078125 + txt789 +TEXDEF txt790 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.640469 0 APEX 0.25 0.734531 0 RAD 0.0078125 + txt790 +TEXDEF txt791 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.625 0.0154687 APEX 0.25 0.625 0.109531 RAD 0.0078125 + txt791 +TEXDEF txt792 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0.625 0.125 RAD 0.03125 + txt792 +TEXDEF txt793 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0.625 0.125 APEX 0.359531 0.625 0.125 RAD 0.0078125 + txt793 +TEXDEF txt794 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.640469 0.125 APEX 0.25 0.734531 0.125 RAD 0.0078125 + txt794 +TEXDEF txt795 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.625 0.140469 APEX 0.25 0.625 0.234531 RAD 0.0078125 + txt795 +TEXDEF txt796 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0.625 0.25 RAD 0.03125 + txt796 +TEXDEF txt797 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0.625 0.25 APEX 0.359531 0.625 0.25 RAD 0.0078125 + txt797 +TEXDEF txt798 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.640469 0.25 APEX 0.25 0.734531 0.25 RAD 0.0078125 + txt798 +TEXDEF txt799 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.625 0.265469 APEX 0.25 0.625 0.359531 RAD 0.0078125 + txt799 +TEXDEF txt800 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0.625 0.375 RAD 0.03125 + txt800 +TEXDEF txt801 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0.625 0.375 APEX 0.359531 0.625 0.375 RAD 0.0078125 + txt801 +TEXDEF txt802 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.640469 0.375 APEX 0.25 0.734531 0.375 RAD 0.0078125 + txt802 +TEXDEF txt803 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.625 0.390469 APEX 0.25 0.625 0.484531 RAD 0.0078125 + txt803 +TEXDEF txt804 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0.625 0.5 RAD 0.03125 + txt804 +TEXDEF txt805 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0.625 0.5 APEX 0.359531 0.625 0.5 RAD 0.0078125 + txt805 +TEXDEF txt806 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.640469 0.5 APEX 0.25 0.734531 0.5 RAD 0.0078125 + txt806 +TEXDEF txt807 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.625 0.515469 APEX 0.25 0.625 0.609531 RAD 0.0078125 + txt807 +TEXDEF txt808 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0.625 0.625 RAD 0.03125 + txt808 +TEXDEF txt809 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0.625 0.625 APEX 0.359531 0.625 0.625 RAD 0.0078125 + txt809 +TEXDEF txt810 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.640469 0.625 APEX 0.25 0.734531 0.625 RAD 0.0078125 + txt810 +TEXDEF txt811 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.625 0.640469 APEX 0.25 0.625 0.734531 RAD 0.0078125 + txt811 +TEXDEF txt812 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0.625 0.75 RAD 0.03125 + txt812 +TEXDEF txt813 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0.625 0.75 APEX 0.359531 0.625 0.75 RAD 0.0078125 + txt813 +TEXDEF txt814 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.640469 0.75 APEX 0.25 0.734531 0.75 RAD 0.0078125 + txt814 +TEXDEF txt815 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.625 0.765469 APEX 0.25 0.625 0.859531 RAD 0.0078125 + txt815 +TEXDEF txt816 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0.625 0.875 RAD 0.03125 + txt816 +TEXDEF txt817 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0.625 0.875 APEX 0.359531 0.625 0.875 RAD 0.0078125 + txt817 +TEXDEF txt818 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.640469 0.875 APEX 0.25 0.734531 0.875 RAD 0.0078125 + txt818 +TEXDEF txt819 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.625 0.890469 APEX 0.25 0.625 0.984531 RAD 0.0078125 + txt819 +TEXDEF txt820 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0.625 1 RAD 0.03125 + txt820 +TEXDEF txt821 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0.625 1 APEX 0.359531 0.625 1 RAD 0.0078125 + txt821 +TEXDEF txt822 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.640469 1 APEX 0.25 0.734531 1 RAD 0.0078125 + txt822 +TEXDEF txt823 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0.75 0 RAD 0.03125 + txt823 +TEXDEF txt824 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0.75 0 APEX 0.359531 0.75 0 RAD 0.0078125 + txt824 +TEXDEF txt825 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.765469 0 APEX 0.25 0.859531 0 RAD 0.0078125 + txt825 +TEXDEF txt826 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.75 0.0154687 APEX 0.25 0.75 0.109531 RAD 0.0078125 + txt826 +TEXDEF txt827 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0.75 0.125 RAD 0.03125 + txt827 +TEXDEF txt828 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0.75 0.125 APEX 0.359531 0.75 0.125 RAD 0.0078125 + txt828 +TEXDEF txt829 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.765469 0.125 APEX 0.25 0.859531 0.125 RAD 0.0078125 + txt829 +TEXDEF txt830 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.75 0.140469 APEX 0.25 0.75 0.234531 RAD 0.0078125 + txt830 +TEXDEF txt831 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0.75 0.25 RAD 0.03125 + txt831 +TEXDEF txt832 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0.75 0.25 APEX 0.359531 0.75 0.25 RAD 0.0078125 + txt832 +TEXDEF txt833 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.765469 0.25 APEX 0.25 0.859531 0.25 RAD 0.0078125 + txt833 +TEXDEF txt834 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.75 0.265469 APEX 0.25 0.75 0.359531 RAD 0.0078125 + txt834 +TEXDEF txt835 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0.75 0.375 RAD 0.03125 + txt835 +TEXDEF txt836 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0.75 0.375 APEX 0.359531 0.75 0.375 RAD 0.0078125 + txt836 +TEXDEF txt837 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.765469 0.375 APEX 0.25 0.859531 0.375 RAD 0.0078125 + txt837 +TEXDEF txt838 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.75 0.390469 APEX 0.25 0.75 0.484531 RAD 0.0078125 + txt838 +TEXDEF txt839 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0.75 0.5 RAD 0.03125 + txt839 +TEXDEF txt840 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0.75 0.5 APEX 0.359531 0.75 0.5 RAD 0.0078125 + txt840 +TEXDEF txt841 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.765469 0.5 APEX 0.25 0.859531 0.5 RAD 0.0078125 + txt841 +TEXDEF txt842 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.75 0.515469 APEX 0.25 0.75 0.609531 RAD 0.0078125 + txt842 +TEXDEF txt843 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0.75 0.625 RAD 0.03125 + txt843 +TEXDEF txt844 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0.75 0.625 APEX 0.359531 0.75 0.625 RAD 0.0078125 + txt844 +TEXDEF txt845 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.765469 0.625 APEX 0.25 0.859531 0.625 RAD 0.0078125 + txt845 +TEXDEF txt846 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.75 0.640469 APEX 0.25 0.75 0.734531 RAD 0.0078125 + txt846 +TEXDEF txt847 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0.75 0.75 RAD 0.03125 + txt847 +TEXDEF txt848 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0.75 0.75 APEX 0.359531 0.75 0.75 RAD 0.0078125 + txt848 +TEXDEF txt849 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.765469 0.75 APEX 0.25 0.859531 0.75 RAD 0.0078125 + txt849 +TEXDEF txt850 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.75 0.765469 APEX 0.25 0.75 0.859531 RAD 0.0078125 + txt850 +TEXDEF txt851 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0.75 0.875 RAD 0.03125 + txt851 +TEXDEF txt852 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0.75 0.875 APEX 0.359531 0.75 0.875 RAD 0.0078125 + txt852 +TEXDEF txt853 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.765469 0.875 APEX 0.25 0.859531 0.875 RAD 0.0078125 + txt853 +TEXDEF txt854 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.75 0.890469 APEX 0.25 0.75 0.984531 RAD 0.0078125 + txt854 +TEXDEF txt855 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0.75 1 RAD 0.03125 + txt855 +TEXDEF txt856 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0.75 1 APEX 0.359531 0.75 1 RAD 0.0078125 + txt856 +TEXDEF txt857 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.765469 1 APEX 0.25 0.859531 1 RAD 0.0078125 + txt857 +TEXDEF txt858 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0.875 0 RAD 0.03125 + txt858 +TEXDEF txt859 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0.875 0 APEX 0.359531 0.875 0 RAD 0.0078125 + txt859 +TEXDEF txt860 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.890469 0 APEX 0.25 0.984531 0 RAD 0.0078125 + txt860 +TEXDEF txt861 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.875 0.0154687 APEX 0.25 0.875 0.109531 RAD 0.0078125 + txt861 +TEXDEF txt862 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0.875 0.125 RAD 0.03125 + txt862 +TEXDEF txt863 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0.875 0.125 APEX 0.359531 0.875 0.125 RAD 0.0078125 + txt863 +TEXDEF txt864 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.890469 0.125 APEX 0.25 0.984531 0.125 RAD 0.0078125 + txt864 +TEXDEF txt865 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.875 0.140469 APEX 0.25 0.875 0.234531 RAD 0.0078125 + txt865 +TEXDEF txt866 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0.875 0.25 RAD 0.03125 + txt866 +TEXDEF txt867 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0.875 0.25 APEX 0.359531 0.875 0.25 RAD 0.0078125 + txt867 +TEXDEF txt868 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.890469 0.25 APEX 0.25 0.984531 0.25 RAD 0.0078125 + txt868 +TEXDEF txt869 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.875 0.265469 APEX 0.25 0.875 0.359531 RAD 0.0078125 + txt869 +TEXDEF txt870 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0.875 0.375 RAD 0.03125 + txt870 +TEXDEF txt871 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0.875 0.375 APEX 0.359531 0.875 0.375 RAD 0.0078125 + txt871 +TEXDEF txt872 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.890469 0.375 APEX 0.25 0.984531 0.375 RAD 0.0078125 + txt872 +TEXDEF txt873 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.875 0.390469 APEX 0.25 0.875 0.484531 RAD 0.0078125 + txt873 +TEXDEF txt874 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0.875 0.5 RAD 0.03125 + txt874 +TEXDEF txt875 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0.875 0.5 APEX 0.359531 0.875 0.5 RAD 0.0078125 + txt875 +TEXDEF txt876 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.890469 0.5 APEX 0.25 0.984531 0.5 RAD 0.0078125 + txt876 +TEXDEF txt877 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.875 0.515469 APEX 0.25 0.875 0.609531 RAD 0.0078125 + txt877 +TEXDEF txt878 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0.875 0.625 RAD 0.03125 + txt878 +TEXDEF txt879 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0.875 0.625 APEX 0.359531 0.875 0.625 RAD 0.0078125 + txt879 +TEXDEF txt880 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.890469 0.625 APEX 0.25 0.984531 0.625 RAD 0.0078125 + txt880 +TEXDEF txt881 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.875 0.640469 APEX 0.25 0.875 0.734531 RAD 0.0078125 + txt881 +TEXDEF txt882 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0.875 0.75 RAD 0.03125 + txt882 +TEXDEF txt883 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0.875 0.75 APEX 0.359531 0.875 0.75 RAD 0.0078125 + txt883 +TEXDEF txt884 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.890469 0.75 APEX 0.25 0.984531 0.75 RAD 0.0078125 + txt884 +TEXDEF txt885 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.875 0.765469 APEX 0.25 0.875 0.859531 RAD 0.0078125 + txt885 +TEXDEF txt886 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0.875 0.875 RAD 0.03125 + txt886 +TEXDEF txt887 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0.875 0.875 APEX 0.359531 0.875 0.875 RAD 0.0078125 + txt887 +TEXDEF txt888 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.890469 0.875 APEX 0.25 0.984531 0.875 RAD 0.0078125 + txt888 +TEXDEF txt889 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.875 0.890469 APEX 0.25 0.875 0.984531 RAD 0.0078125 + txt889 +TEXDEF txt890 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 0.875 1 RAD 0.03125 + txt890 +TEXDEF txt891 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 0.875 1 APEX 0.359531 0.875 1 RAD 0.0078125 + txt891 +TEXDEF txt892 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 0.890469 1 APEX 0.25 0.984531 1 RAD 0.0078125 + txt892 +TEXDEF txt893 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 1 0 RAD 0.03125 + txt893 +TEXDEF txt894 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 1 0 APEX 0.359531 1 0 RAD 0.0078125 + txt894 +TEXDEF txt895 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 1 0.0154687 APEX 0.25 1 0.109531 RAD 0.0078125 + txt895 +TEXDEF txt896 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 1 0.125 RAD 0.03125 + txt896 +TEXDEF txt897 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 1 0.125 APEX 0.359531 1 0.125 RAD 0.0078125 + txt897 +TEXDEF txt898 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 1 0.140469 APEX 0.25 1 0.234531 RAD 0.0078125 + txt898 +TEXDEF txt899 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 1 0.25 RAD 0.03125 + txt899 +TEXDEF txt900 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 1 0.25 APEX 0.359531 1 0.25 RAD 0.0078125 + txt900 +TEXDEF txt901 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 1 0.265469 APEX 0.25 1 0.359531 RAD 0.0078125 + txt901 +TEXDEF txt902 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 1 0.375 RAD 0.03125 + txt902 +TEXDEF txt903 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 1 0.375 APEX 0.359531 1 0.375 RAD 0.0078125 + txt903 +TEXDEF txt904 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 1 0.390469 APEX 0.25 1 0.484531 RAD 0.0078125 + txt904 +TEXDEF txt905 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 1 0.5 RAD 0.03125 + txt905 +TEXDEF txt906 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 1 0.5 APEX 0.359531 1 0.5 RAD 0.0078125 + txt906 +TEXDEF txt907 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 1 0.515469 APEX 0.25 1 0.609531 RAD 0.0078125 + txt907 +TEXDEF txt908 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 1 0.625 RAD 0.03125 + txt908 +TEXDEF txt909 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 1 0.625 APEX 0.359531 1 0.625 RAD 0.0078125 + txt909 +TEXDEF txt910 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 1 0.640469 APEX 0.25 1 0.734531 RAD 0.0078125 + txt910 +TEXDEF txt911 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 1 0.75 RAD 0.03125 + txt911 +TEXDEF txt912 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 1 0.75 APEX 0.359531 1 0.75 RAD 0.0078125 + txt912 +TEXDEF txt913 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 1 0.765469 APEX 0.25 1 0.859531 RAD 0.0078125 + txt913 +TEXDEF txt914 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 1 0.875 RAD 0.03125 + txt914 +TEXDEF txt915 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 1 0.875 APEX 0.359531 1 0.875 RAD 0.0078125 + txt915 +TEXDEF txt916 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.25 1 0.890469 APEX 0.25 1 0.984531 RAD 0.0078125 + txt916 +TEXDEF txt917 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.25 1 1 RAD 0.03125 + txt917 +TEXDEF txt918 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.265469 1 1 APEX 0.359531 1 1 RAD 0.0078125 + txt918 +TEXDEF txt919 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0 0 RAD 0.03125 + txt919 +TEXDEF txt920 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0 0 APEX 0.484531 0 0 RAD 0.0078125 + txt920 +TEXDEF txt921 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.0154687 0 APEX 0.375 0.109531 0 RAD 0.0078125 + txt921 +TEXDEF txt922 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0 0.0154687 APEX 0.375 0 0.109531 RAD 0.0078125 + txt922 +TEXDEF txt923 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0 0.125 RAD 0.03125 + txt923 +TEXDEF txt924 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0 0.125 APEX 0.484531 0 0.125 RAD 0.0078125 + txt924 +TEXDEF txt925 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.0154687 0.125 APEX 0.375 0.109531 0.125 RAD 0.0078125 + txt925 +TEXDEF txt926 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0 0.140469 APEX 0.375 0 0.234531 RAD 0.0078125 + txt926 +TEXDEF txt927 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0 0.25 RAD 0.03125 + txt927 +TEXDEF txt928 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0 0.25 APEX 0.484531 0 0.25 RAD 0.0078125 + txt928 +TEXDEF txt929 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.0154687 0.25 APEX 0.375 0.109531 0.25 RAD 0.0078125 + txt929 +TEXDEF txt930 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0 0.265469 APEX 0.375 0 0.359531 RAD 0.0078125 + txt930 +TEXDEF txt931 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0 0.375 RAD 0.03125 + txt931 +TEXDEF txt932 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0 0.375 APEX 0.484531 0 0.375 RAD 0.0078125 + txt932 +TEXDEF txt933 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.0154687 0.375 APEX 0.375 0.109531 0.375 RAD 0.0078125 + txt933 +TEXDEF txt934 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0 0.390469 APEX 0.375 0 0.484531 RAD 0.0078125 + txt934 +TEXDEF txt935 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0 0.5 RAD 0.03125 + txt935 +TEXDEF txt936 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0 0.5 APEX 0.484531 0 0.5 RAD 0.0078125 + txt936 +TEXDEF txt937 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.0154687 0.5 APEX 0.375 0.109531 0.5 RAD 0.0078125 + txt937 +TEXDEF txt938 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0 0.515469 APEX 0.375 0 0.609531 RAD 0.0078125 + txt938 +TEXDEF txt939 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0 0.625 RAD 0.03125 + txt939 +TEXDEF txt940 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0 0.625 APEX 0.484531 0 0.625 RAD 0.0078125 + txt940 +TEXDEF txt941 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.0154687 0.625 APEX 0.375 0.109531 0.625 RAD 0.0078125 + txt941 +TEXDEF txt942 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0 0.640469 APEX 0.375 0 0.734531 RAD 0.0078125 + txt942 +TEXDEF txt943 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0 0.75 RAD 0.03125 + txt943 +TEXDEF txt944 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0 0.75 APEX 0.484531 0 0.75 RAD 0.0078125 + txt944 +TEXDEF txt945 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.0154687 0.75 APEX 0.375 0.109531 0.75 RAD 0.0078125 + txt945 +TEXDEF txt946 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0 0.765469 APEX 0.375 0 0.859531 RAD 0.0078125 + txt946 +TEXDEF txt947 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0 0.875 RAD 0.03125 + txt947 +TEXDEF txt948 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0 0.875 APEX 0.484531 0 0.875 RAD 0.0078125 + txt948 +TEXDEF txt949 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.0154687 0.875 APEX 0.375 0.109531 0.875 RAD 0.0078125 + txt949 +TEXDEF txt950 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0 0.890469 APEX 0.375 0 0.984531 RAD 0.0078125 + txt950 +TEXDEF txt951 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0 1 RAD 0.03125 + txt951 +TEXDEF txt952 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0 1 APEX 0.484531 0 1 RAD 0.0078125 + txt952 +TEXDEF txt953 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.0154687 1 APEX 0.375 0.109531 1 RAD 0.0078125 + txt953 +TEXDEF txt954 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0.125 0 RAD 0.03125 + txt954 +TEXDEF txt955 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0.125 0 APEX 0.484531 0.125 0 RAD 0.0078125 + txt955 +TEXDEF txt956 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.140469 0 APEX 0.375 0.234531 0 RAD 0.0078125 + txt956 +TEXDEF txt957 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.125 0.0154687 APEX 0.375 0.125 0.109531 RAD 0.0078125 + txt957 +TEXDEF txt958 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0.125 0.125 RAD 0.03125 + txt958 +TEXDEF txt959 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0.125 0.125 APEX 0.484531 0.125 0.125 RAD 0.0078125 + txt959 +TEXDEF txt960 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.140469 0.125 APEX 0.375 0.234531 0.125 RAD 0.0078125 + txt960 +TEXDEF txt961 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.125 0.140469 APEX 0.375 0.125 0.234531 RAD 0.0078125 + txt961 +TEXDEF txt962 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0.125 0.25 RAD 0.03125 + txt962 +TEXDEF txt963 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0.125 0.25 APEX 0.484531 0.125 0.25 RAD 0.0078125 + txt963 +TEXDEF txt964 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.140469 0.25 APEX 0.375 0.234531 0.25 RAD 0.0078125 + txt964 +TEXDEF txt965 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.125 0.265469 APEX 0.375 0.125 0.359531 RAD 0.0078125 + txt965 +TEXDEF txt966 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0.125 0.375 RAD 0.03125 + txt966 +TEXDEF txt967 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0.125 0.375 APEX 0.484531 0.125 0.375 RAD 0.0078125 + txt967 +TEXDEF txt968 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.140469 0.375 APEX 0.375 0.234531 0.375 RAD 0.0078125 + txt968 +TEXDEF txt969 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.125 0.390469 APEX 0.375 0.125 0.484531 RAD 0.0078125 + txt969 +TEXDEF txt970 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0.125 0.5 RAD 0.03125 + txt970 +TEXDEF txt971 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0.125 0.5 APEX 0.484531 0.125 0.5 RAD 0.0078125 + txt971 +TEXDEF txt972 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.140469 0.5 APEX 0.375 0.234531 0.5 RAD 0.0078125 + txt972 +TEXDEF txt973 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.125 0.515469 APEX 0.375 0.125 0.609531 RAD 0.0078125 + txt973 +TEXDEF txt974 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0.125 0.625 RAD 0.03125 + txt974 +TEXDEF txt975 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0.125 0.625 APEX 0.484531 0.125 0.625 RAD 0.0078125 + txt975 +TEXDEF txt976 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.140469 0.625 APEX 0.375 0.234531 0.625 RAD 0.0078125 + txt976 +TEXDEF txt977 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.125 0.640469 APEX 0.375 0.125 0.734531 RAD 0.0078125 + txt977 +TEXDEF txt978 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0.125 0.75 RAD 0.03125 + txt978 +TEXDEF txt979 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0.125 0.75 APEX 0.484531 0.125 0.75 RAD 0.0078125 + txt979 +TEXDEF txt980 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.140469 0.75 APEX 0.375 0.234531 0.75 RAD 0.0078125 + txt980 +TEXDEF txt981 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.125 0.765469 APEX 0.375 0.125 0.859531 RAD 0.0078125 + txt981 +TEXDEF txt982 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0.125 0.875 RAD 0.03125 + txt982 +TEXDEF txt983 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0.125 0.875 APEX 0.484531 0.125 0.875 RAD 0.0078125 + txt983 +TEXDEF txt984 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.140469 0.875 APEX 0.375 0.234531 0.875 RAD 0.0078125 + txt984 +TEXDEF txt985 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.125 0.890469 APEX 0.375 0.125 0.984531 RAD 0.0078125 + txt985 +TEXDEF txt986 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0.125 1 RAD 0.03125 + txt986 +TEXDEF txt987 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0.125 1 APEX 0.484531 0.125 1 RAD 0.0078125 + txt987 +TEXDEF txt988 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.140469 1 APEX 0.375 0.234531 1 RAD 0.0078125 + txt988 +TEXDEF txt989 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0.25 0 RAD 0.03125 + txt989 +TEXDEF txt990 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0.25 0 APEX 0.484531 0.25 0 RAD 0.0078125 + txt990 +TEXDEF txt991 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.265469 0 APEX 0.375 0.359531 0 RAD 0.0078125 + txt991 +TEXDEF txt992 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.25 0.0154687 APEX 0.375 0.25 0.109531 RAD 0.0078125 + txt992 +TEXDEF txt993 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0.25 0.125 RAD 0.03125 + txt993 +TEXDEF txt994 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0.25 0.125 APEX 0.484531 0.25 0.125 RAD 0.0078125 + txt994 +TEXDEF txt995 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.265469 0.125 APEX 0.375 0.359531 0.125 RAD 0.0078125 + txt995 +TEXDEF txt996 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.25 0.140469 APEX 0.375 0.25 0.234531 RAD 0.0078125 + txt996 +TEXDEF txt997 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0.25 0.25 RAD 0.03125 + txt997 +TEXDEF txt998 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0.25 0.25 APEX 0.484531 0.25 0.25 RAD 0.0078125 + txt998 +TEXDEF txt999 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.265469 0.25 APEX 0.375 0.359531 0.25 RAD 0.0078125 + txt999 +TEXDEF txt100 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.25 0.265469 APEX 0.375 0.25 0.359531 RAD 0.0078125 + txt100 +TEXDEF txt100 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0.25 0.375 RAD 0.03125 + txt100 +TEXDEF txt100 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0.25 0.375 APEX 0.484531 0.25 0.375 RAD 0.0078125 + txt100 +TEXDEF txt100 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.265469 0.375 APEX 0.375 0.359531 0.375 RAD 0.0078125 + txt100 +TEXDEF txt100 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.25 0.390469 APEX 0.375 0.25 0.484531 RAD 0.0078125 + txt100 +TEXDEF txt100 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0.25 0.5 RAD 0.03125 + txt100 +TEXDEF txt100 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0.25 0.5 APEX 0.484531 0.25 0.5 RAD 0.0078125 + txt100 +TEXDEF txt100 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.265469 0.5 APEX 0.375 0.359531 0.5 RAD 0.0078125 + txt100 +TEXDEF txt100 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.25 0.515469 APEX 0.375 0.25 0.609531 RAD 0.0078125 + txt100 +TEXDEF txt100 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0.25 0.625 RAD 0.03125 + txt100 +TEXDEF txt101 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0.25 0.625 APEX 0.484531 0.25 0.625 RAD 0.0078125 + txt101 +TEXDEF txt101 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.265469 0.625 APEX 0.375 0.359531 0.625 RAD 0.0078125 + txt101 +TEXDEF txt101 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.25 0.640469 APEX 0.375 0.25 0.734531 RAD 0.0078125 + txt101 +TEXDEF txt101 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0.25 0.75 RAD 0.03125 + txt101 +TEXDEF txt101 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0.25 0.75 APEX 0.484531 0.25 0.75 RAD 0.0078125 + txt101 +TEXDEF txt101 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.265469 0.75 APEX 0.375 0.359531 0.75 RAD 0.0078125 + txt101 +TEXDEF txt101 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.25 0.765469 APEX 0.375 0.25 0.859531 RAD 0.0078125 + txt101 +TEXDEF txt101 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0.25 0.875 RAD 0.03125 + txt101 +TEXDEF txt101 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0.25 0.875 APEX 0.484531 0.25 0.875 RAD 0.0078125 + txt101 +TEXDEF txt101 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.265469 0.875 APEX 0.375 0.359531 0.875 RAD 0.0078125 + txt101 +TEXDEF txt102 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.25 0.890469 APEX 0.375 0.25 0.984531 RAD 0.0078125 + txt102 +TEXDEF txt102 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0.25 1 RAD 0.03125 + txt102 +TEXDEF txt102 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0.25 1 APEX 0.484531 0.25 1 RAD 0.0078125 + txt102 +TEXDEF txt102 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.265469 1 APEX 0.375 0.359531 1 RAD 0.0078125 + txt102 +TEXDEF txt102 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0.375 0 RAD 0.03125 + txt102 +TEXDEF txt102 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0.375 0 APEX 0.484531 0.375 0 RAD 0.0078125 + txt102 +TEXDEF txt102 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.390469 0 APEX 0.375 0.484531 0 RAD 0.0078125 + txt102 +TEXDEF txt102 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.375 0.0154687 APEX 0.375 0.375 0.109531 RAD 0.0078125 + txt102 +TEXDEF txt102 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0.375 0.125 RAD 0.03125 + txt102 +TEXDEF txt102 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0.375 0.125 APEX 0.484531 0.375 0.125 RAD 0.0078125 + txt102 +TEXDEF txt103 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.390469 0.125 APEX 0.375 0.484531 0.125 RAD 0.0078125 + txt103 +TEXDEF txt103 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.375 0.140469 APEX 0.375 0.375 0.234531 RAD 0.0078125 + txt103 +TEXDEF txt103 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0.375 0.25 RAD 0.03125 + txt103 +TEXDEF txt103 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0.375 0.25 APEX 0.484531 0.375 0.25 RAD 0.0078125 + txt103 +TEXDEF txt103 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.390469 0.25 APEX 0.375 0.484531 0.25 RAD 0.0078125 + txt103 +TEXDEF txt103 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.375 0.265469 APEX 0.375 0.375 0.359531 RAD 0.0078125 + txt103 +TEXDEF txt103 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0.375 0.375 RAD 0.03125 + txt103 +TEXDEF txt103 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0.375 0.375 APEX 0.484531 0.375 0.375 RAD 0.0078125 + txt103 +TEXDEF txt103 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.390469 0.375 APEX 0.375 0.484531 0.375 RAD 0.0078125 + txt103 +TEXDEF txt103 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.375 0.390469 APEX 0.375 0.375 0.484531 RAD 0.0078125 + txt103 +TEXDEF txt104 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0.375 0.5 RAD 0.03125 + txt104 +TEXDEF txt104 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0.375 0.5 APEX 0.484531 0.375 0.5 RAD 0.0078125 + txt104 +TEXDEF txt104 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.390469 0.5 APEX 0.375 0.484531 0.5 RAD 0.0078125 + txt104 +TEXDEF txt104 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.375 0.515469 APEX 0.375 0.375 0.609531 RAD 0.0078125 + txt104 +TEXDEF txt104 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0.375 0.625 RAD 0.03125 + txt104 +TEXDEF txt104 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0.375 0.625 APEX 0.484531 0.375 0.625 RAD 0.0078125 + txt104 +TEXDEF txt104 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.390469 0.625 APEX 0.375 0.484531 0.625 RAD 0.0078125 + txt104 +TEXDEF txt104 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.375 0.640469 APEX 0.375 0.375 0.734531 RAD 0.0078125 + txt104 +TEXDEF txt104 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0.375 0.75 RAD 0.03125 + txt104 +TEXDEF txt104 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0.375 0.75 APEX 0.484531 0.375 0.75 RAD 0.0078125 + txt104 +TEXDEF txt105 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.390469 0.75 APEX 0.375 0.484531 0.75 RAD 0.0078125 + txt105 +TEXDEF txt105 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.375 0.765469 APEX 0.375 0.375 0.859531 RAD 0.0078125 + txt105 +TEXDEF txt105 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0.375 0.875 RAD 0.03125 + txt105 +TEXDEF txt105 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0.375 0.875 APEX 0.484531 0.375 0.875 RAD 0.0078125 + txt105 +TEXDEF txt105 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.390469 0.875 APEX 0.375 0.484531 0.875 RAD 0.0078125 + txt105 +TEXDEF txt105 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.375 0.890469 APEX 0.375 0.375 0.984531 RAD 0.0078125 + txt105 +TEXDEF txt105 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0.375 1 RAD 0.03125 + txt105 +TEXDEF txt105 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0.375 1 APEX 0.484531 0.375 1 RAD 0.0078125 + txt105 +TEXDEF txt105 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.390469 1 APEX 0.375 0.484531 1 RAD 0.0078125 + txt105 +TEXDEF txt105 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0.5 0 RAD 0.03125 + txt105 +TEXDEF txt106 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0.5 0 APEX 0.484531 0.5 0 RAD 0.0078125 + txt106 +TEXDEF txt106 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.515469 0 APEX 0.375 0.609531 0 RAD 0.0078125 + txt106 +TEXDEF txt106 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.5 0.0154687 APEX 0.375 0.5 0.109531 RAD 0.0078125 + txt106 +TEXDEF txt106 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0.5 0.125 RAD 0.03125 + txt106 +TEXDEF txt106 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0.5 0.125 APEX 0.484531 0.5 0.125 RAD 0.0078125 + txt106 +TEXDEF txt106 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.515469 0.125 APEX 0.375 0.609531 0.125 RAD 0.0078125 + txt106 +TEXDEF txt106 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.5 0.140469 APEX 0.375 0.5 0.234531 RAD 0.0078125 + txt106 +TEXDEF txt106 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0.5 0.25 RAD 0.03125 + txt106 +TEXDEF txt106 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0.5 0.25 APEX 0.484531 0.5 0.25 RAD 0.0078125 + txt106 +TEXDEF txt106 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.515469 0.25 APEX 0.375 0.609531 0.25 RAD 0.0078125 + txt106 +TEXDEF txt107 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.5 0.265469 APEX 0.375 0.5 0.359531 RAD 0.0078125 + txt107 +TEXDEF txt107 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0.5 0.375 RAD 0.03125 + txt107 +TEXDEF txt107 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0.5 0.375 APEX 0.484531 0.5 0.375 RAD 0.0078125 + txt107 +TEXDEF txt107 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.515469 0.375 APEX 0.375 0.609531 0.375 RAD 0.0078125 + txt107 +TEXDEF txt107 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.5 0.390469 APEX 0.375 0.5 0.484531 RAD 0.0078125 + txt107 +TEXDEF txt107 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0.5 0.5 RAD 0.03125 + txt107 +TEXDEF txt107 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0.5 0.5 APEX 0.484531 0.5 0.5 RAD 0.0078125 + txt107 +TEXDEF txt107 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.515469 0.5 APEX 0.375 0.609531 0.5 RAD 0.0078125 + txt107 +TEXDEF txt107 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.5 0.515469 APEX 0.375 0.5 0.609531 RAD 0.0078125 + txt107 +TEXDEF txt107 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0.5 0.625 RAD 0.03125 + txt107 +TEXDEF txt108 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0.5 0.625 APEX 0.484531 0.5 0.625 RAD 0.0078125 + txt108 +TEXDEF txt108 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.515469 0.625 APEX 0.375 0.609531 0.625 RAD 0.0078125 + txt108 +TEXDEF txt108 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.5 0.640469 APEX 0.375 0.5 0.734531 RAD 0.0078125 + txt108 +TEXDEF txt108 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0.5 0.75 RAD 0.03125 + txt108 +TEXDEF txt108 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0.5 0.75 APEX 0.484531 0.5 0.75 RAD 0.0078125 + txt108 +TEXDEF txt108 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.515469 0.75 APEX 0.375 0.609531 0.75 RAD 0.0078125 + txt108 +TEXDEF txt108 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.5 0.765469 APEX 0.375 0.5 0.859531 RAD 0.0078125 + txt108 +TEXDEF txt108 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0.5 0.875 RAD 0.03125 + txt108 +TEXDEF txt108 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0.5 0.875 APEX 0.484531 0.5 0.875 RAD 0.0078125 + txt108 +TEXDEF txt108 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.515469 0.875 APEX 0.375 0.609531 0.875 RAD 0.0078125 + txt108 +TEXDEF txt109 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.5 0.890469 APEX 0.375 0.5 0.984531 RAD 0.0078125 + txt109 +TEXDEF txt109 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0.5 1 RAD 0.03125 + txt109 +TEXDEF txt109 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0.5 1 APEX 0.484531 0.5 1 RAD 0.0078125 + txt109 +TEXDEF txt109 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.515469 1 APEX 0.375 0.609531 1 RAD 0.0078125 + txt109 +TEXDEF txt109 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0.625 0 RAD 0.03125 + txt109 +TEXDEF txt109 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0.625 0 APEX 0.484531 0.625 0 RAD 0.0078125 + txt109 +TEXDEF txt109 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.640469 0 APEX 0.375 0.734531 0 RAD 0.0078125 + txt109 +TEXDEF txt109 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.625 0.0154687 APEX 0.375 0.625 0.109531 RAD 0.0078125 + txt109 +TEXDEF txt109 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0.625 0.125 RAD 0.03125 + txt109 +TEXDEF txt109 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0.625 0.125 APEX 0.484531 0.625 0.125 RAD 0.0078125 + txt109 +TEXDEF txt110 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.640469 0.125 APEX 0.375 0.734531 0.125 RAD 0.0078125 + txt110 +TEXDEF txt110 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.625 0.140469 APEX 0.375 0.625 0.234531 RAD 0.0078125 + txt110 +TEXDEF txt110 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0.625 0.25 RAD 0.03125 + txt110 +TEXDEF txt110 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0.625 0.25 APEX 0.484531 0.625 0.25 RAD 0.0078125 + txt110 +TEXDEF txt110 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.640469 0.25 APEX 0.375 0.734531 0.25 RAD 0.0078125 + txt110 +TEXDEF txt110 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.625 0.265469 APEX 0.375 0.625 0.359531 RAD 0.0078125 + txt110 +TEXDEF txt110 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0.625 0.375 RAD 0.03125 + txt110 +TEXDEF txt110 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0.625 0.375 APEX 0.484531 0.625 0.375 RAD 0.0078125 + txt110 +TEXDEF txt110 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.640469 0.375 APEX 0.375 0.734531 0.375 RAD 0.0078125 + txt110 +TEXDEF txt110 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.625 0.390469 APEX 0.375 0.625 0.484531 RAD 0.0078125 + txt110 +TEXDEF txt111 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0.625 0.5 RAD 0.03125 + txt111 +TEXDEF txt111 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0.625 0.5 APEX 0.484531 0.625 0.5 RAD 0.0078125 + txt111 +TEXDEF txt111 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.640469 0.5 APEX 0.375 0.734531 0.5 RAD 0.0078125 + txt111 +TEXDEF txt111 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.625 0.515469 APEX 0.375 0.625 0.609531 RAD 0.0078125 + txt111 +TEXDEF txt111 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0.625 0.625 RAD 0.03125 + txt111 +TEXDEF txt111 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0.625 0.625 APEX 0.484531 0.625 0.625 RAD 0.0078125 + txt111 +TEXDEF txt111 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.640469 0.625 APEX 0.375 0.734531 0.625 RAD 0.0078125 + txt111 +TEXDEF txt111 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.625 0.640469 APEX 0.375 0.625 0.734531 RAD 0.0078125 + txt111 +TEXDEF txt111 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0.625 0.75 RAD 0.03125 + txt111 +TEXDEF txt111 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0.625 0.75 APEX 0.484531 0.625 0.75 RAD 0.0078125 + txt111 +TEXDEF txt112 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.640469 0.75 APEX 0.375 0.734531 0.75 RAD 0.0078125 + txt112 +TEXDEF txt112 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.625 0.765469 APEX 0.375 0.625 0.859531 RAD 0.0078125 + txt112 +TEXDEF txt112 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0.625 0.875 RAD 0.03125 + txt112 +TEXDEF txt112 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0.625 0.875 APEX 0.484531 0.625 0.875 RAD 0.0078125 + txt112 +TEXDEF txt112 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.640469 0.875 APEX 0.375 0.734531 0.875 RAD 0.0078125 + txt112 +TEXDEF txt112 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.625 0.890469 APEX 0.375 0.625 0.984531 RAD 0.0078125 + txt112 +TEXDEF txt112 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0.625 1 RAD 0.03125 + txt112 +TEXDEF txt112 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0.625 1 APEX 0.484531 0.625 1 RAD 0.0078125 + txt112 +TEXDEF txt112 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.640469 1 APEX 0.375 0.734531 1 RAD 0.0078125 + txt112 +TEXDEF txt112 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0.75 0 RAD 0.03125 + txt112 +TEXDEF txt113 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0.75 0 APEX 0.484531 0.75 0 RAD 0.0078125 + txt113 +TEXDEF txt113 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.765469 0 APEX 0.375 0.859531 0 RAD 0.0078125 + txt113 +TEXDEF txt113 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.75 0.0154687 APEX 0.375 0.75 0.109531 RAD 0.0078125 + txt113 +TEXDEF txt113 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0.75 0.125 RAD 0.03125 + txt113 +TEXDEF txt113 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0.75 0.125 APEX 0.484531 0.75 0.125 RAD 0.0078125 + txt113 +TEXDEF txt113 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.765469 0.125 APEX 0.375 0.859531 0.125 RAD 0.0078125 + txt113 +TEXDEF txt113 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.75 0.140469 APEX 0.375 0.75 0.234531 RAD 0.0078125 + txt113 +TEXDEF txt113 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0.75 0.25 RAD 0.03125 + txt113 +TEXDEF txt113 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0.75 0.25 APEX 0.484531 0.75 0.25 RAD 0.0078125 + txt113 +TEXDEF txt113 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.765469 0.25 APEX 0.375 0.859531 0.25 RAD 0.0078125 + txt113 +TEXDEF txt114 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.75 0.265469 APEX 0.375 0.75 0.359531 RAD 0.0078125 + txt114 +TEXDEF txt114 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0.75 0.375 RAD 0.03125 + txt114 +TEXDEF txt114 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0.75 0.375 APEX 0.484531 0.75 0.375 RAD 0.0078125 + txt114 +TEXDEF txt114 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.765469 0.375 APEX 0.375 0.859531 0.375 RAD 0.0078125 + txt114 +TEXDEF txt114 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.75 0.390469 APEX 0.375 0.75 0.484531 RAD 0.0078125 + txt114 +TEXDEF txt114 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0.75 0.5 RAD 0.03125 + txt114 +TEXDEF txt114 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0.75 0.5 APEX 0.484531 0.75 0.5 RAD 0.0078125 + txt114 +TEXDEF txt114 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.765469 0.5 APEX 0.375 0.859531 0.5 RAD 0.0078125 + txt114 +TEXDEF txt114 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.75 0.515469 APEX 0.375 0.75 0.609531 RAD 0.0078125 + txt114 +TEXDEF txt114 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0.75 0.625 RAD 0.03125 + txt114 +TEXDEF txt115 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0.75 0.625 APEX 0.484531 0.75 0.625 RAD 0.0078125 + txt115 +TEXDEF txt115 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.765469 0.625 APEX 0.375 0.859531 0.625 RAD 0.0078125 + txt115 +TEXDEF txt115 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.75 0.640469 APEX 0.375 0.75 0.734531 RAD 0.0078125 + txt115 +TEXDEF txt115 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0.75 0.75 RAD 0.03125 + txt115 +TEXDEF txt115 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0.75 0.75 APEX 0.484531 0.75 0.75 RAD 0.0078125 + txt115 +TEXDEF txt115 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.765469 0.75 APEX 0.375 0.859531 0.75 RAD 0.0078125 + txt115 +TEXDEF txt115 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.75 0.765469 APEX 0.375 0.75 0.859531 RAD 0.0078125 + txt115 +TEXDEF txt115 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0.75 0.875 RAD 0.03125 + txt115 +TEXDEF txt115 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0.75 0.875 APEX 0.484531 0.75 0.875 RAD 0.0078125 + txt115 +TEXDEF txt115 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.765469 0.875 APEX 0.375 0.859531 0.875 RAD 0.0078125 + txt115 +TEXDEF txt116 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.75 0.890469 APEX 0.375 0.75 0.984531 RAD 0.0078125 + txt116 +TEXDEF txt116 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0.75 1 RAD 0.03125 + txt116 +TEXDEF txt116 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0.75 1 APEX 0.484531 0.75 1 RAD 0.0078125 + txt116 +TEXDEF txt116 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.765469 1 APEX 0.375 0.859531 1 RAD 0.0078125 + txt116 +TEXDEF txt116 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0.875 0 RAD 0.03125 + txt116 +TEXDEF txt116 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0.875 0 APEX 0.484531 0.875 0 RAD 0.0078125 + txt116 +TEXDEF txt116 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.890469 0 APEX 0.375 0.984531 0 RAD 0.0078125 + txt116 +TEXDEF txt116 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.875 0.0154687 APEX 0.375 0.875 0.109531 RAD 0.0078125 + txt116 +TEXDEF txt116 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0.875 0.125 RAD 0.03125 + txt116 +TEXDEF txt116 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0.875 0.125 APEX 0.484531 0.875 0.125 RAD 0.0078125 + txt116 +TEXDEF txt117 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.890469 0.125 APEX 0.375 0.984531 0.125 RAD 0.0078125 + txt117 +TEXDEF txt117 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.875 0.140469 APEX 0.375 0.875 0.234531 RAD 0.0078125 + txt117 +TEXDEF txt117 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0.875 0.25 RAD 0.03125 + txt117 +TEXDEF txt117 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0.875 0.25 APEX 0.484531 0.875 0.25 RAD 0.0078125 + txt117 +TEXDEF txt117 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.890469 0.25 APEX 0.375 0.984531 0.25 RAD 0.0078125 + txt117 +TEXDEF txt117 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.875 0.265469 APEX 0.375 0.875 0.359531 RAD 0.0078125 + txt117 +TEXDEF txt117 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0.875 0.375 RAD 0.03125 + txt117 +TEXDEF txt117 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0.875 0.375 APEX 0.484531 0.875 0.375 RAD 0.0078125 + txt117 +TEXDEF txt117 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.890469 0.375 APEX 0.375 0.984531 0.375 RAD 0.0078125 + txt117 +TEXDEF txt117 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.875 0.390469 APEX 0.375 0.875 0.484531 RAD 0.0078125 + txt117 +TEXDEF txt118 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0.875 0.5 RAD 0.03125 + txt118 +TEXDEF txt118 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0.875 0.5 APEX 0.484531 0.875 0.5 RAD 0.0078125 + txt118 +TEXDEF txt118 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.890469 0.5 APEX 0.375 0.984531 0.5 RAD 0.0078125 + txt118 +TEXDEF txt118 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.875 0.515469 APEX 0.375 0.875 0.609531 RAD 0.0078125 + txt118 +TEXDEF txt118 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0.875 0.625 RAD 0.03125 + txt118 +TEXDEF txt118 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0.875 0.625 APEX 0.484531 0.875 0.625 RAD 0.0078125 + txt118 +TEXDEF txt118 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.890469 0.625 APEX 0.375 0.984531 0.625 RAD 0.0078125 + txt118 +TEXDEF txt118 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.875 0.640469 APEX 0.375 0.875 0.734531 RAD 0.0078125 + txt118 +TEXDEF txt118 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0.875 0.75 RAD 0.03125 + txt118 +TEXDEF txt118 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0.875 0.75 APEX 0.484531 0.875 0.75 RAD 0.0078125 + txt118 +TEXDEF txt119 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.890469 0.75 APEX 0.375 0.984531 0.75 RAD 0.0078125 + txt119 +TEXDEF txt119 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.875 0.765469 APEX 0.375 0.875 0.859531 RAD 0.0078125 + txt119 +TEXDEF txt119 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0.875 0.875 RAD 0.03125 + txt119 +TEXDEF txt119 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0.875 0.875 APEX 0.484531 0.875 0.875 RAD 0.0078125 + txt119 +TEXDEF txt119 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.890469 0.875 APEX 0.375 0.984531 0.875 RAD 0.0078125 + txt119 +TEXDEF txt119 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.875 0.890469 APEX 0.375 0.875 0.984531 RAD 0.0078125 + txt119 +TEXDEF txt119 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 0.875 1 RAD 0.03125 + txt119 +TEXDEF txt119 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 0.875 1 APEX 0.484531 0.875 1 RAD 0.0078125 + txt119 +TEXDEF txt119 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 0.890469 1 APEX 0.375 0.984531 1 RAD 0.0078125 + txt119 +TEXDEF txt119 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 1 0 RAD 0.03125 + txt119 +TEXDEF txt120 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 1 0 APEX 0.484531 1 0 RAD 0.0078125 + txt120 +TEXDEF txt120 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 1 0.0154687 APEX 0.375 1 0.109531 RAD 0.0078125 + txt120 +TEXDEF txt120 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 1 0.125 RAD 0.03125 + txt120 +TEXDEF txt120 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 1 0.125 APEX 0.484531 1 0.125 RAD 0.0078125 + txt120 +TEXDEF txt120 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 1 0.140469 APEX 0.375 1 0.234531 RAD 0.0078125 + txt120 +TEXDEF txt120 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 1 0.25 RAD 0.03125 + txt120 +TEXDEF txt120 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 1 0.25 APEX 0.484531 1 0.25 RAD 0.0078125 + txt120 +TEXDEF txt120 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 1 0.265469 APEX 0.375 1 0.359531 RAD 0.0078125 + txt120 +TEXDEF txt120 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 1 0.375 RAD 0.03125 + txt120 +TEXDEF txt120 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 1 0.375 APEX 0.484531 1 0.375 RAD 0.0078125 + txt120 +TEXDEF txt121 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 1 0.390469 APEX 0.375 1 0.484531 RAD 0.0078125 + txt121 +TEXDEF txt121 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 1 0.5 RAD 0.03125 + txt121 +TEXDEF txt121 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 1 0.5 APEX 0.484531 1 0.5 RAD 0.0078125 + txt121 +TEXDEF txt121 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 1 0.515469 APEX 0.375 1 0.609531 RAD 0.0078125 + txt121 +TEXDEF txt121 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 1 0.625 RAD 0.03125 + txt121 +TEXDEF txt121 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 1 0.625 APEX 0.484531 1 0.625 RAD 0.0078125 + txt121 +TEXDEF txt121 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 1 0.640469 APEX 0.375 1 0.734531 RAD 0.0078125 + txt121 +TEXDEF txt121 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 1 0.75 RAD 0.03125 + txt121 +TEXDEF txt121 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 1 0.75 APEX 0.484531 1 0.75 RAD 0.0078125 + txt121 +TEXDEF txt121 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 1 0.765469 APEX 0.375 1 0.859531 RAD 0.0078125 + txt121 +TEXDEF txt122 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 1 0.875 RAD 0.03125 + txt122 +TEXDEF txt122 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 1 0.875 APEX 0.484531 1 0.875 RAD 0.0078125 + txt122 +TEXDEF txt122 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.375 1 0.890469 APEX 0.375 1 0.984531 RAD 0.0078125 + txt122 +TEXDEF txt122 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.375 1 1 RAD 0.03125 + txt122 +TEXDEF txt122 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.390469 1 1 APEX 0.484531 1 1 RAD 0.0078125 + txt122 +TEXDEF txt122 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0 0 RAD 0.03125 + txt122 +TEXDEF txt122 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0 0 APEX 0.609531 0 0 RAD 0.0078125 + txt122 +TEXDEF txt122 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.0154687 0 APEX 0.5 0.109531 0 RAD 0.0078125 + txt122 +TEXDEF txt122 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0 0.0154687 APEX 0.5 0 0.109531 RAD 0.0078125 + txt122 +TEXDEF txt122 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0 0.125 RAD 0.03125 + txt122 +TEXDEF txt123 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0 0.125 APEX 0.609531 0 0.125 RAD 0.0078125 + txt123 +TEXDEF txt123 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.0154687 0.125 APEX 0.5 0.109531 0.125 RAD 0.0078125 + txt123 +TEXDEF txt123 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0 0.140469 APEX 0.5 0 0.234531 RAD 0.0078125 + txt123 +TEXDEF txt123 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0 0.25 RAD 0.03125 + txt123 +TEXDEF txt123 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0 0.25 APEX 0.609531 0 0.25 RAD 0.0078125 + txt123 +TEXDEF txt123 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.0154687 0.25 APEX 0.5 0.109531 0.25 RAD 0.0078125 + txt123 +TEXDEF txt123 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0 0.265469 APEX 0.5 0 0.359531 RAD 0.0078125 + txt123 +TEXDEF txt123 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0 0.375 RAD 0.03125 + txt123 +TEXDEF txt123 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0 0.375 APEX 0.609531 0 0.375 RAD 0.0078125 + txt123 +TEXDEF txt123 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.0154687 0.375 APEX 0.5 0.109531 0.375 RAD 0.0078125 + txt123 +TEXDEF txt124 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0 0.390469 APEX 0.5 0 0.484531 RAD 0.0078125 + txt124 +TEXDEF txt124 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0 0.5 RAD 0.03125 + txt124 +TEXDEF txt124 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0 0.5 APEX 0.609531 0 0.5 RAD 0.0078125 + txt124 +TEXDEF txt124 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.0154687 0.5 APEX 0.5 0.109531 0.5 RAD 0.0078125 + txt124 +TEXDEF txt124 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0 0.515469 APEX 0.5 0 0.609531 RAD 0.0078125 + txt124 +TEXDEF txt124 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0 0.625 RAD 0.03125 + txt124 +TEXDEF txt124 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0 0.625 APEX 0.609531 0 0.625 RAD 0.0078125 + txt124 +TEXDEF txt124 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.0154687 0.625 APEX 0.5 0.109531 0.625 RAD 0.0078125 + txt124 +TEXDEF txt124 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0 0.640469 APEX 0.5 0 0.734531 RAD 0.0078125 + txt124 +TEXDEF txt124 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0 0.75 RAD 0.03125 + txt124 +TEXDEF txt125 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0 0.75 APEX 0.609531 0 0.75 RAD 0.0078125 + txt125 +TEXDEF txt125 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.0154687 0.75 APEX 0.5 0.109531 0.75 RAD 0.0078125 + txt125 +TEXDEF txt125 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0 0.765469 APEX 0.5 0 0.859531 RAD 0.0078125 + txt125 +TEXDEF txt125 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0 0.875 RAD 0.03125 + txt125 +TEXDEF txt125 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0 0.875 APEX 0.609531 0 0.875 RAD 0.0078125 + txt125 +TEXDEF txt125 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.0154687 0.875 APEX 0.5 0.109531 0.875 RAD 0.0078125 + txt125 +TEXDEF txt125 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0 0.890469 APEX 0.5 0 0.984531 RAD 0.0078125 + txt125 +TEXDEF txt125 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0 1 RAD 0.03125 + txt125 +TEXDEF txt125 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0 1 APEX 0.609531 0 1 RAD 0.0078125 + txt125 +TEXDEF txt125 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.0154687 1 APEX 0.5 0.109531 1 RAD 0.0078125 + txt125 +TEXDEF txt126 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0.125 0 RAD 0.03125 + txt126 +TEXDEF txt126 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0.125 0 APEX 0.609531 0.125 0 RAD 0.0078125 + txt126 +TEXDEF txt126 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.140469 0 APEX 0.5 0.234531 0 RAD 0.0078125 + txt126 +TEXDEF txt126 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.125 0.0154687 APEX 0.5 0.125 0.109531 RAD 0.0078125 + txt126 +TEXDEF txt126 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0.125 0.125 RAD 0.03125 + txt126 +TEXDEF txt126 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0.125 0.125 APEX 0.609531 0.125 0.125 RAD 0.0078125 + txt126 +TEXDEF txt126 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.140469 0.125 APEX 0.5 0.234531 0.125 RAD 0.0078125 + txt126 +TEXDEF txt126 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.125 0.140469 APEX 0.5 0.125 0.234531 RAD 0.0078125 + txt126 +TEXDEF txt126 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0.125 0.25 RAD 0.03125 + txt126 +TEXDEF txt126 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0.125 0.25 APEX 0.609531 0.125 0.25 RAD 0.0078125 + txt126 +TEXDEF txt127 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.140469 0.25 APEX 0.5 0.234531 0.25 RAD 0.0078125 + txt127 +TEXDEF txt127 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.125 0.265469 APEX 0.5 0.125 0.359531 RAD 0.0078125 + txt127 +TEXDEF txt127 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0.125 0.375 RAD 0.03125 + txt127 +TEXDEF txt127 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0.125 0.375 APEX 0.609531 0.125 0.375 RAD 0.0078125 + txt127 +TEXDEF txt127 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.140469 0.375 APEX 0.5 0.234531 0.375 RAD 0.0078125 + txt127 +TEXDEF txt127 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.125 0.390469 APEX 0.5 0.125 0.484531 RAD 0.0078125 + txt127 +TEXDEF txt127 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0.125 0.5 RAD 0.03125 + txt127 +TEXDEF txt127 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0.125 0.5 APEX 0.609531 0.125 0.5 RAD 0.0078125 + txt127 +TEXDEF txt127 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.140469 0.5 APEX 0.5 0.234531 0.5 RAD 0.0078125 + txt127 +TEXDEF txt127 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.125 0.515469 APEX 0.5 0.125 0.609531 RAD 0.0078125 + txt127 +TEXDEF txt128 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0.125 0.625 RAD 0.03125 + txt128 +TEXDEF txt128 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0.125 0.625 APEX 0.609531 0.125 0.625 RAD 0.0078125 + txt128 +TEXDEF txt128 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.140469 0.625 APEX 0.5 0.234531 0.625 RAD 0.0078125 + txt128 +TEXDEF txt128 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.125 0.640469 APEX 0.5 0.125 0.734531 RAD 0.0078125 + txt128 +TEXDEF txt128 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0.125 0.75 RAD 0.03125 + txt128 +TEXDEF txt128 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0.125 0.75 APEX 0.609531 0.125 0.75 RAD 0.0078125 + txt128 +TEXDEF txt128 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.140469 0.75 APEX 0.5 0.234531 0.75 RAD 0.0078125 + txt128 +TEXDEF txt128 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.125 0.765469 APEX 0.5 0.125 0.859531 RAD 0.0078125 + txt128 +TEXDEF txt128 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0.125 0.875 RAD 0.03125 + txt128 +TEXDEF txt128 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0.125 0.875 APEX 0.609531 0.125 0.875 RAD 0.0078125 + txt128 +TEXDEF txt129 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.140469 0.875 APEX 0.5 0.234531 0.875 RAD 0.0078125 + txt129 +TEXDEF txt129 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.125 0.890469 APEX 0.5 0.125 0.984531 RAD 0.0078125 + txt129 +TEXDEF txt129 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0.125 1 RAD 0.03125 + txt129 +TEXDEF txt129 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0.125 1 APEX 0.609531 0.125 1 RAD 0.0078125 + txt129 +TEXDEF txt129 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.140469 1 APEX 0.5 0.234531 1 RAD 0.0078125 + txt129 +TEXDEF txt129 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0.25 0 RAD 0.03125 + txt129 +TEXDEF txt129 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0.25 0 APEX 0.609531 0.25 0 RAD 0.0078125 + txt129 +TEXDEF txt129 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.265469 0 APEX 0.5 0.359531 0 RAD 0.0078125 + txt129 +TEXDEF txt129 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.25 0.0154687 APEX 0.5 0.25 0.109531 RAD 0.0078125 + txt129 +TEXDEF txt129 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0.25 0.125 RAD 0.03125 + txt129 +TEXDEF txt130 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0.25 0.125 APEX 0.609531 0.25 0.125 RAD 0.0078125 + txt130 +TEXDEF txt130 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.265469 0.125 APEX 0.5 0.359531 0.125 RAD 0.0078125 + txt130 +TEXDEF txt130 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.25 0.140469 APEX 0.5 0.25 0.234531 RAD 0.0078125 + txt130 +TEXDEF txt130 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0.25 0.25 RAD 0.03125 + txt130 +TEXDEF txt130 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0.25 0.25 APEX 0.609531 0.25 0.25 RAD 0.0078125 + txt130 +TEXDEF txt130 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.265469 0.25 APEX 0.5 0.359531 0.25 RAD 0.0078125 + txt130 +TEXDEF txt130 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.25 0.265469 APEX 0.5 0.25 0.359531 RAD 0.0078125 + txt130 +TEXDEF txt130 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0.25 0.375 RAD 0.03125 + txt130 +TEXDEF txt130 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0.25 0.375 APEX 0.609531 0.25 0.375 RAD 0.0078125 + txt130 +TEXDEF txt130 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.265469 0.375 APEX 0.5 0.359531 0.375 RAD 0.0078125 + txt130 +TEXDEF txt131 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.25 0.390469 APEX 0.5 0.25 0.484531 RAD 0.0078125 + txt131 +TEXDEF txt131 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0.25 0.5 RAD 0.03125 + txt131 +TEXDEF txt131 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0.25 0.5 APEX 0.609531 0.25 0.5 RAD 0.0078125 + txt131 +TEXDEF txt131 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.265469 0.5 APEX 0.5 0.359531 0.5 RAD 0.0078125 + txt131 +TEXDEF txt131 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.25 0.515469 APEX 0.5 0.25 0.609531 RAD 0.0078125 + txt131 +TEXDEF txt131 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0.25 0.625 RAD 0.03125 + txt131 +TEXDEF txt131 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0.25 0.625 APEX 0.609531 0.25 0.625 RAD 0.0078125 + txt131 +TEXDEF txt131 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.265469 0.625 APEX 0.5 0.359531 0.625 RAD 0.0078125 + txt131 +TEXDEF txt131 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.25 0.640469 APEX 0.5 0.25 0.734531 RAD 0.0078125 + txt131 +TEXDEF txt131 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0.25 0.75 RAD 0.03125 + txt131 +TEXDEF txt132 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0.25 0.75 APEX 0.609531 0.25 0.75 RAD 0.0078125 + txt132 +TEXDEF txt132 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.265469 0.75 APEX 0.5 0.359531 0.75 RAD 0.0078125 + txt132 +TEXDEF txt132 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.25 0.765469 APEX 0.5 0.25 0.859531 RAD 0.0078125 + txt132 +TEXDEF txt132 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0.25 0.875 RAD 0.03125 + txt132 +TEXDEF txt132 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0.25 0.875 APEX 0.609531 0.25 0.875 RAD 0.0078125 + txt132 +TEXDEF txt132 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.265469 0.875 APEX 0.5 0.359531 0.875 RAD 0.0078125 + txt132 +TEXDEF txt132 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.25 0.890469 APEX 0.5 0.25 0.984531 RAD 0.0078125 + txt132 +TEXDEF txt132 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0.25 1 RAD 0.03125 + txt132 +TEXDEF txt132 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0.25 1 APEX 0.609531 0.25 1 RAD 0.0078125 + txt132 +TEXDEF txt132 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.265469 1 APEX 0.5 0.359531 1 RAD 0.0078125 + txt132 +TEXDEF txt133 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0.375 0 RAD 0.03125 + txt133 +TEXDEF txt133 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0.375 0 APEX 0.609531 0.375 0 RAD 0.0078125 + txt133 +TEXDEF txt133 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.390469 0 APEX 0.5 0.484531 0 RAD 0.0078125 + txt133 +TEXDEF txt133 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.375 0.0154687 APEX 0.5 0.375 0.109531 RAD 0.0078125 + txt133 +TEXDEF txt133 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0.375 0.125 RAD 0.03125 + txt133 +TEXDEF txt133 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0.375 0.125 APEX 0.609531 0.375 0.125 RAD 0.0078125 + txt133 +TEXDEF txt133 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.390469 0.125 APEX 0.5 0.484531 0.125 RAD 0.0078125 + txt133 +TEXDEF txt133 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.375 0.140469 APEX 0.5 0.375 0.234531 RAD 0.0078125 + txt133 +TEXDEF txt133 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0.375 0.25 RAD 0.03125 + txt133 +TEXDEF txt133 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0.375 0.25 APEX 0.609531 0.375 0.25 RAD 0.0078125 + txt133 +TEXDEF txt134 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.390469 0.25 APEX 0.5 0.484531 0.25 RAD 0.0078125 + txt134 +TEXDEF txt134 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.375 0.265469 APEX 0.5 0.375 0.359531 RAD 0.0078125 + txt134 +TEXDEF txt134 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0.375 0.375 RAD 0.03125 + txt134 +TEXDEF txt134 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0.375 0.375 APEX 0.609531 0.375 0.375 RAD 0.0078125 + txt134 +TEXDEF txt134 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.390469 0.375 APEX 0.5 0.484531 0.375 RAD 0.0078125 + txt134 +TEXDEF txt134 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.375 0.390469 APEX 0.5 0.375 0.484531 RAD 0.0078125 + txt134 +TEXDEF txt134 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0.375 0.5 RAD 0.03125 + txt134 +TEXDEF txt134 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0.375 0.5 APEX 0.609531 0.375 0.5 RAD 0.0078125 + txt134 +TEXDEF txt134 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.390469 0.5 APEX 0.5 0.484531 0.5 RAD 0.0078125 + txt134 +TEXDEF txt134 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.375 0.515469 APEX 0.5 0.375 0.609531 RAD 0.0078125 + txt134 +TEXDEF txt135 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0.375 0.625 RAD 0.03125 + txt135 +TEXDEF txt135 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0.375 0.625 APEX 0.609531 0.375 0.625 RAD 0.0078125 + txt135 +TEXDEF txt135 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.390469 0.625 APEX 0.5 0.484531 0.625 RAD 0.0078125 + txt135 +TEXDEF txt135 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.375 0.640469 APEX 0.5 0.375 0.734531 RAD 0.0078125 + txt135 +TEXDEF txt135 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0.375 0.75 RAD 0.03125 + txt135 +TEXDEF txt135 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0.375 0.75 APEX 0.609531 0.375 0.75 RAD 0.0078125 + txt135 +TEXDEF txt135 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.390469 0.75 APEX 0.5 0.484531 0.75 RAD 0.0078125 + txt135 +TEXDEF txt135 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.375 0.765469 APEX 0.5 0.375 0.859531 RAD 0.0078125 + txt135 +TEXDEF txt135 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0.375 0.875 RAD 0.03125 + txt135 +TEXDEF txt135 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0.375 0.875 APEX 0.609531 0.375 0.875 RAD 0.0078125 + txt135 +TEXDEF txt136 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.390469 0.875 APEX 0.5 0.484531 0.875 RAD 0.0078125 + txt136 +TEXDEF txt136 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.375 0.890469 APEX 0.5 0.375 0.984531 RAD 0.0078125 + txt136 +TEXDEF txt136 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0.375 1 RAD 0.03125 + txt136 +TEXDEF txt136 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0.375 1 APEX 0.609531 0.375 1 RAD 0.0078125 + txt136 +TEXDEF txt136 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.390469 1 APEX 0.5 0.484531 1 RAD 0.0078125 + txt136 +TEXDEF txt136 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0.5 0 RAD 0.03125 + txt136 +TEXDEF txt136 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0.5 0 APEX 0.609531 0.5 0 RAD 0.0078125 + txt136 +TEXDEF txt136 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.515469 0 APEX 0.5 0.609531 0 RAD 0.0078125 + txt136 +TEXDEF txt136 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.5 0.0154687 APEX 0.5 0.5 0.109531 RAD 0.0078125 + txt136 +TEXDEF txt136 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0.5 0.125 RAD 0.03125 + txt136 +TEXDEF txt137 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0.5 0.125 APEX 0.609531 0.5 0.125 RAD 0.0078125 + txt137 +TEXDEF txt137 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.515469 0.125 APEX 0.5 0.609531 0.125 RAD 0.0078125 + txt137 +TEXDEF txt137 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.5 0.140469 APEX 0.5 0.5 0.234531 RAD 0.0078125 + txt137 +TEXDEF txt137 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0.5 0.25 RAD 0.03125 + txt137 +TEXDEF txt137 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0.5 0.25 APEX 0.609531 0.5 0.25 RAD 0.0078125 + txt137 +TEXDEF txt137 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.515469 0.25 APEX 0.5 0.609531 0.25 RAD 0.0078125 + txt137 +TEXDEF txt137 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.5 0.265469 APEX 0.5 0.5 0.359531 RAD 0.0078125 + txt137 +TEXDEF txt137 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0.5 0.375 RAD 0.03125 + txt137 +TEXDEF txt137 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0.5 0.375 APEX 0.609531 0.5 0.375 RAD 0.0078125 + txt137 +TEXDEF txt137 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.515469 0.375 APEX 0.5 0.609531 0.375 RAD 0.0078125 + txt137 +TEXDEF txt138 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.5 0.390469 APEX 0.5 0.5 0.484531 RAD 0.0078125 + txt138 +TEXDEF txt138 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0.5 0.5 RAD 0.03125 + txt138 +TEXDEF txt138 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0.5 0.5 APEX 0.609531 0.5 0.5 RAD 0.0078125 + txt138 +TEXDEF txt138 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.515469 0.5 APEX 0.5 0.609531 0.5 RAD 0.0078125 + txt138 +TEXDEF txt138 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.5 0.515469 APEX 0.5 0.5 0.609531 RAD 0.0078125 + txt138 +TEXDEF txt138 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0.5 0.625 RAD 0.03125 + txt138 +TEXDEF txt138 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0.5 0.625 APEX 0.609531 0.5 0.625 RAD 0.0078125 + txt138 +TEXDEF txt138 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.515469 0.625 APEX 0.5 0.609531 0.625 RAD 0.0078125 + txt138 +TEXDEF txt138 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.5 0.640469 APEX 0.5 0.5 0.734531 RAD 0.0078125 + txt138 +TEXDEF txt138 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0.5 0.75 RAD 0.03125 + txt138 +TEXDEF txt139 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0.5 0.75 APEX 0.609531 0.5 0.75 RAD 0.0078125 + txt139 +TEXDEF txt139 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.515469 0.75 APEX 0.5 0.609531 0.75 RAD 0.0078125 + txt139 +TEXDEF txt139 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.5 0.765469 APEX 0.5 0.5 0.859531 RAD 0.0078125 + txt139 +TEXDEF txt139 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0.5 0.875 RAD 0.03125 + txt139 +TEXDEF txt139 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0.5 0.875 APEX 0.609531 0.5 0.875 RAD 0.0078125 + txt139 +TEXDEF txt139 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.515469 0.875 APEX 0.5 0.609531 0.875 RAD 0.0078125 + txt139 +TEXDEF txt139 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.5 0.890469 APEX 0.5 0.5 0.984531 RAD 0.0078125 + txt139 +TEXDEF txt139 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0.5 1 RAD 0.03125 + txt139 +TEXDEF txt139 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0.5 1 APEX 0.609531 0.5 1 RAD 0.0078125 + txt139 +TEXDEF txt139 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.515469 1 APEX 0.5 0.609531 1 RAD 0.0078125 + txt139 +TEXDEF txt140 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0.625 0 RAD 0.03125 + txt140 +TEXDEF txt140 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0.625 0 APEX 0.609531 0.625 0 RAD 0.0078125 + txt140 +TEXDEF txt140 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.640469 0 APEX 0.5 0.734531 0 RAD 0.0078125 + txt140 +TEXDEF txt140 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.625 0.0154687 APEX 0.5 0.625 0.109531 RAD 0.0078125 + txt140 +TEXDEF txt140 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0.625 0.125 RAD 0.03125 + txt140 +TEXDEF txt140 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0.625 0.125 APEX 0.609531 0.625 0.125 RAD 0.0078125 + txt140 +TEXDEF txt140 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.640469 0.125 APEX 0.5 0.734531 0.125 RAD 0.0078125 + txt140 +TEXDEF txt140 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.625 0.140469 APEX 0.5 0.625 0.234531 RAD 0.0078125 + txt140 +TEXDEF txt140 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0.625 0.25 RAD 0.03125 + txt140 +TEXDEF txt140 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0.625 0.25 APEX 0.609531 0.625 0.25 RAD 0.0078125 + txt140 +TEXDEF txt141 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.640469 0.25 APEX 0.5 0.734531 0.25 RAD 0.0078125 + txt141 +TEXDEF txt141 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.625 0.265469 APEX 0.5 0.625 0.359531 RAD 0.0078125 + txt141 +TEXDEF txt141 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0.625 0.375 RAD 0.03125 + txt141 +TEXDEF txt141 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0.625 0.375 APEX 0.609531 0.625 0.375 RAD 0.0078125 + txt141 +TEXDEF txt141 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.640469 0.375 APEX 0.5 0.734531 0.375 RAD 0.0078125 + txt141 +TEXDEF txt141 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.625 0.390469 APEX 0.5 0.625 0.484531 RAD 0.0078125 + txt141 +TEXDEF txt141 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0.625 0.5 RAD 0.03125 + txt141 +TEXDEF txt141 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0.625 0.5 APEX 0.609531 0.625 0.5 RAD 0.0078125 + txt141 +TEXDEF txt141 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.640469 0.5 APEX 0.5 0.734531 0.5 RAD 0.0078125 + txt141 +TEXDEF txt141 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.625 0.515469 APEX 0.5 0.625 0.609531 RAD 0.0078125 + txt141 +TEXDEF txt142 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0.625 0.625 RAD 0.03125 + txt142 +TEXDEF txt142 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0.625 0.625 APEX 0.609531 0.625 0.625 RAD 0.0078125 + txt142 +TEXDEF txt142 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.640469 0.625 APEX 0.5 0.734531 0.625 RAD 0.0078125 + txt142 +TEXDEF txt142 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.625 0.640469 APEX 0.5 0.625 0.734531 RAD 0.0078125 + txt142 +TEXDEF txt142 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0.625 0.75 RAD 0.03125 + txt142 +TEXDEF txt142 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0.625 0.75 APEX 0.609531 0.625 0.75 RAD 0.0078125 + txt142 +TEXDEF txt142 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.640469 0.75 APEX 0.5 0.734531 0.75 RAD 0.0078125 + txt142 +TEXDEF txt142 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.625 0.765469 APEX 0.5 0.625 0.859531 RAD 0.0078125 + txt142 +TEXDEF txt142 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0.625 0.875 RAD 0.03125 + txt142 +TEXDEF txt142 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0.625 0.875 APEX 0.609531 0.625 0.875 RAD 0.0078125 + txt142 +TEXDEF txt143 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.640469 0.875 APEX 0.5 0.734531 0.875 RAD 0.0078125 + txt143 +TEXDEF txt143 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.625 0.890469 APEX 0.5 0.625 0.984531 RAD 0.0078125 + txt143 +TEXDEF txt143 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0.625 1 RAD 0.03125 + txt143 +TEXDEF txt143 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0.625 1 APEX 0.609531 0.625 1 RAD 0.0078125 + txt143 +TEXDEF txt143 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.640469 1 APEX 0.5 0.734531 1 RAD 0.0078125 + txt143 +TEXDEF txt143 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0.75 0 RAD 0.03125 + txt143 +TEXDEF txt143 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0.75 0 APEX 0.609531 0.75 0 RAD 0.0078125 + txt143 +TEXDEF txt143 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.765469 0 APEX 0.5 0.859531 0 RAD 0.0078125 + txt143 +TEXDEF txt143 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.75 0.0154687 APEX 0.5 0.75 0.109531 RAD 0.0078125 + txt143 +TEXDEF txt143 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0.75 0.125 RAD 0.03125 + txt143 +TEXDEF txt144 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0.75 0.125 APEX 0.609531 0.75 0.125 RAD 0.0078125 + txt144 +TEXDEF txt144 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.765469 0.125 APEX 0.5 0.859531 0.125 RAD 0.0078125 + txt144 +TEXDEF txt144 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.75 0.140469 APEX 0.5 0.75 0.234531 RAD 0.0078125 + txt144 +TEXDEF txt144 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0.75 0.25 RAD 0.03125 + txt144 +TEXDEF txt144 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0.75 0.25 APEX 0.609531 0.75 0.25 RAD 0.0078125 + txt144 +TEXDEF txt144 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.765469 0.25 APEX 0.5 0.859531 0.25 RAD 0.0078125 + txt144 +TEXDEF txt144 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.75 0.265469 APEX 0.5 0.75 0.359531 RAD 0.0078125 + txt144 +TEXDEF txt144 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0.75 0.375 RAD 0.03125 + txt144 +TEXDEF txt144 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0.75 0.375 APEX 0.609531 0.75 0.375 RAD 0.0078125 + txt144 +TEXDEF txt144 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.765469 0.375 APEX 0.5 0.859531 0.375 RAD 0.0078125 + txt144 +TEXDEF txt145 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.75 0.390469 APEX 0.5 0.75 0.484531 RAD 0.0078125 + txt145 +TEXDEF txt145 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0.75 0.5 RAD 0.03125 + txt145 +TEXDEF txt145 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0.75 0.5 APEX 0.609531 0.75 0.5 RAD 0.0078125 + txt145 +TEXDEF txt145 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.765469 0.5 APEX 0.5 0.859531 0.5 RAD 0.0078125 + txt145 +TEXDEF txt145 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.75 0.515469 APEX 0.5 0.75 0.609531 RAD 0.0078125 + txt145 +TEXDEF txt145 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0.75 0.625 RAD 0.03125 + txt145 +TEXDEF txt145 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0.75 0.625 APEX 0.609531 0.75 0.625 RAD 0.0078125 + txt145 +TEXDEF txt145 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.765469 0.625 APEX 0.5 0.859531 0.625 RAD 0.0078125 + txt145 +TEXDEF txt145 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.75 0.640469 APEX 0.5 0.75 0.734531 RAD 0.0078125 + txt145 +TEXDEF txt145 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0.75 0.75 RAD 0.03125 + txt145 +TEXDEF txt146 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0.75 0.75 APEX 0.609531 0.75 0.75 RAD 0.0078125 + txt146 +TEXDEF txt146 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.765469 0.75 APEX 0.5 0.859531 0.75 RAD 0.0078125 + txt146 +TEXDEF txt146 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.75 0.765469 APEX 0.5 0.75 0.859531 RAD 0.0078125 + txt146 +TEXDEF txt146 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0.75 0.875 RAD 0.03125 + txt146 +TEXDEF txt146 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0.75 0.875 APEX 0.609531 0.75 0.875 RAD 0.0078125 + txt146 +TEXDEF txt146 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.765469 0.875 APEX 0.5 0.859531 0.875 RAD 0.0078125 + txt146 +TEXDEF txt146 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.75 0.890469 APEX 0.5 0.75 0.984531 RAD 0.0078125 + txt146 +TEXDEF txt146 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0.75 1 RAD 0.03125 + txt146 +TEXDEF txt146 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0.75 1 APEX 0.609531 0.75 1 RAD 0.0078125 + txt146 +TEXDEF txt146 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.765469 1 APEX 0.5 0.859531 1 RAD 0.0078125 + txt146 +TEXDEF txt147 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0.875 0 RAD 0.03125 + txt147 +TEXDEF txt147 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0.875 0 APEX 0.609531 0.875 0 RAD 0.0078125 + txt147 +TEXDEF txt147 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.890469 0 APEX 0.5 0.984531 0 RAD 0.0078125 + txt147 +TEXDEF txt147 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.875 0.0154687 APEX 0.5 0.875 0.109531 RAD 0.0078125 + txt147 +TEXDEF txt147 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0.875 0.125 RAD 0.03125 + txt147 +TEXDEF txt147 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0.875 0.125 APEX 0.609531 0.875 0.125 RAD 0.0078125 + txt147 +TEXDEF txt147 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.890469 0.125 APEX 0.5 0.984531 0.125 RAD 0.0078125 + txt147 +TEXDEF txt147 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.875 0.140469 APEX 0.5 0.875 0.234531 RAD 0.0078125 + txt147 +TEXDEF txt147 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0.875 0.25 RAD 0.03125 + txt147 +TEXDEF txt147 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0.875 0.25 APEX 0.609531 0.875 0.25 RAD 0.0078125 + txt147 +TEXDEF txt148 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.890469 0.25 APEX 0.5 0.984531 0.25 RAD 0.0078125 + txt148 +TEXDEF txt148 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.875 0.265469 APEX 0.5 0.875 0.359531 RAD 0.0078125 + txt148 +TEXDEF txt148 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0.875 0.375 RAD 0.03125 + txt148 +TEXDEF txt148 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0.875 0.375 APEX 0.609531 0.875 0.375 RAD 0.0078125 + txt148 +TEXDEF txt148 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.890469 0.375 APEX 0.5 0.984531 0.375 RAD 0.0078125 + txt148 +TEXDEF txt148 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.875 0.390469 APEX 0.5 0.875 0.484531 RAD 0.0078125 + txt148 +TEXDEF txt148 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0.875 0.5 RAD 0.03125 + txt148 +TEXDEF txt148 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0.875 0.5 APEX 0.609531 0.875 0.5 RAD 0.0078125 + txt148 +TEXDEF txt148 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.890469 0.5 APEX 0.5 0.984531 0.5 RAD 0.0078125 + txt148 +TEXDEF txt148 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.875 0.515469 APEX 0.5 0.875 0.609531 RAD 0.0078125 + txt148 +TEXDEF txt149 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0.875 0.625 RAD 0.03125 + txt149 +TEXDEF txt149 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0.875 0.625 APEX 0.609531 0.875 0.625 RAD 0.0078125 + txt149 +TEXDEF txt149 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.890469 0.625 APEX 0.5 0.984531 0.625 RAD 0.0078125 + txt149 +TEXDEF txt149 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.875 0.640469 APEX 0.5 0.875 0.734531 RAD 0.0078125 + txt149 +TEXDEF txt149 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0.875 0.75 RAD 0.03125 + txt149 +TEXDEF txt149 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0.875 0.75 APEX 0.609531 0.875 0.75 RAD 0.0078125 + txt149 +TEXDEF txt149 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.890469 0.75 APEX 0.5 0.984531 0.75 RAD 0.0078125 + txt149 +TEXDEF txt149 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.875 0.765469 APEX 0.5 0.875 0.859531 RAD 0.0078125 + txt149 +TEXDEF txt149 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0.875 0.875 RAD 0.03125 + txt149 +TEXDEF txt149 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0.875 0.875 APEX 0.609531 0.875 0.875 RAD 0.0078125 + txt149 +TEXDEF txt150 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.890469 0.875 APEX 0.5 0.984531 0.875 RAD 0.0078125 + txt150 +TEXDEF txt150 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.875 0.890469 APEX 0.5 0.875 0.984531 RAD 0.0078125 + txt150 +TEXDEF txt150 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 0.875 1 RAD 0.03125 + txt150 +TEXDEF txt150 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 0.875 1 APEX 0.609531 0.875 1 RAD 0.0078125 + txt150 +TEXDEF txt150 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 0.890469 1 APEX 0.5 0.984531 1 RAD 0.0078125 + txt150 +TEXDEF txt150 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 1 0 RAD 0.03125 + txt150 +TEXDEF txt150 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 1 0 APEX 0.609531 1 0 RAD 0.0078125 + txt150 +TEXDEF txt150 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 1 0.0154687 APEX 0.5 1 0.109531 RAD 0.0078125 + txt150 +TEXDEF txt150 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 1 0.125 RAD 0.03125 + txt150 +TEXDEF txt150 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 1 0.125 APEX 0.609531 1 0.125 RAD 0.0078125 + txt150 +TEXDEF txt151 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 1 0.140469 APEX 0.5 1 0.234531 RAD 0.0078125 + txt151 +TEXDEF txt151 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 1 0.25 RAD 0.03125 + txt151 +TEXDEF txt151 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 1 0.25 APEX 0.609531 1 0.25 RAD 0.0078125 + txt151 +TEXDEF txt151 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 1 0.265469 APEX 0.5 1 0.359531 RAD 0.0078125 + txt151 +TEXDEF txt151 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 1 0.375 RAD 0.03125 + txt151 +TEXDEF txt151 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 1 0.375 APEX 0.609531 1 0.375 RAD 0.0078125 + txt151 +TEXDEF txt151 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 1 0.390469 APEX 0.5 1 0.484531 RAD 0.0078125 + txt151 +TEXDEF txt151 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 1 0.5 RAD 0.03125 + txt151 +TEXDEF txt151 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 1 0.5 APEX 0.609531 1 0.5 RAD 0.0078125 + txt151 +TEXDEF txt151 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 1 0.515469 APEX 0.5 1 0.609531 RAD 0.0078125 + txt151 +TEXDEF txt152 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 1 0.625 RAD 0.03125 + txt152 +TEXDEF txt152 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 1 0.625 APEX 0.609531 1 0.625 RAD 0.0078125 + txt152 +TEXDEF txt152 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 1 0.640469 APEX 0.5 1 0.734531 RAD 0.0078125 + txt152 +TEXDEF txt152 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 1 0.75 RAD 0.03125 + txt152 +TEXDEF txt152 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 1 0.75 APEX 0.609531 1 0.75 RAD 0.0078125 + txt152 +TEXDEF txt152 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 1 0.765469 APEX 0.5 1 0.859531 RAD 0.0078125 + txt152 +TEXDEF txt152 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 1 0.875 RAD 0.03125 + txt152 +TEXDEF txt152 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 1 0.875 APEX 0.609531 1 0.875 RAD 0.0078125 + txt152 +TEXDEF txt152 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.5 1 0.890469 APEX 0.5 1 0.984531 RAD 0.0078125 + txt152 +TEXDEF txt152 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.5 1 1 RAD 0.03125 + txt152 +TEXDEF txt153 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.515469 1 1 APEX 0.609531 1 1 RAD 0.0078125 + txt153 +TEXDEF txt153 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0 0 RAD 0.03125 + txt153 +TEXDEF txt153 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0 0 APEX 0.734531 0 0 RAD 0.0078125 + txt153 +TEXDEF txt153 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.0154687 0 APEX 0.625 0.109531 0 RAD 0.0078125 + txt153 +TEXDEF txt153 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0 0.0154687 APEX 0.625 0 0.109531 RAD 0.0078125 + txt153 +TEXDEF txt153 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0 0.125 RAD 0.03125 + txt153 +TEXDEF txt153 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0 0.125 APEX 0.734531 0 0.125 RAD 0.0078125 + txt153 +TEXDEF txt153 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.0154687 0.125 APEX 0.625 0.109531 0.125 RAD 0.0078125 + txt153 +TEXDEF txt153 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0 0.140469 APEX 0.625 0 0.234531 RAD 0.0078125 + txt153 +TEXDEF txt153 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0 0.25 RAD 0.03125 + txt153 +TEXDEF txt154 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0 0.25 APEX 0.734531 0 0.25 RAD 0.0078125 + txt154 +TEXDEF txt154 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.0154687 0.25 APEX 0.625 0.109531 0.25 RAD 0.0078125 + txt154 +TEXDEF txt154 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0 0.265469 APEX 0.625 0 0.359531 RAD 0.0078125 + txt154 +TEXDEF txt154 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0 0.375 RAD 0.03125 + txt154 +TEXDEF txt154 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0 0.375 APEX 0.734531 0 0.375 RAD 0.0078125 + txt154 +TEXDEF txt154 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.0154687 0.375 APEX 0.625 0.109531 0.375 RAD 0.0078125 + txt154 +TEXDEF txt154 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0 0.390469 APEX 0.625 0 0.484531 RAD 0.0078125 + txt154 +TEXDEF txt154 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0 0.5 RAD 0.03125 + txt154 +TEXDEF txt154 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0 0.5 APEX 0.734531 0 0.5 RAD 0.0078125 + txt154 +TEXDEF txt154 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.0154687 0.5 APEX 0.625 0.109531 0.5 RAD 0.0078125 + txt154 +TEXDEF txt155 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0 0.515469 APEX 0.625 0 0.609531 RAD 0.0078125 + txt155 +TEXDEF txt155 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0 0.625 RAD 0.03125 + txt155 +TEXDEF txt155 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0 0.625 APEX 0.734531 0 0.625 RAD 0.0078125 + txt155 +TEXDEF txt155 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.0154687 0.625 APEX 0.625 0.109531 0.625 RAD 0.0078125 + txt155 +TEXDEF txt155 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0 0.640469 APEX 0.625 0 0.734531 RAD 0.0078125 + txt155 +TEXDEF txt155 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0 0.75 RAD 0.03125 + txt155 +TEXDEF txt155 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0 0.75 APEX 0.734531 0 0.75 RAD 0.0078125 + txt155 +TEXDEF txt155 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.0154687 0.75 APEX 0.625 0.109531 0.75 RAD 0.0078125 + txt155 +TEXDEF txt155 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0 0.765469 APEX 0.625 0 0.859531 RAD 0.0078125 + txt155 +TEXDEF txt155 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0 0.875 RAD 0.03125 + txt155 +TEXDEF txt156 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0 0.875 APEX 0.734531 0 0.875 RAD 0.0078125 + txt156 +TEXDEF txt156 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.0154687 0.875 APEX 0.625 0.109531 0.875 RAD 0.0078125 + txt156 +TEXDEF txt156 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0 0.890469 APEX 0.625 0 0.984531 RAD 0.0078125 + txt156 +TEXDEF txt156 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0 1 RAD 0.03125 + txt156 +TEXDEF txt156 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0 1 APEX 0.734531 0 1 RAD 0.0078125 + txt156 +TEXDEF txt156 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.0154687 1 APEX 0.625 0.109531 1 RAD 0.0078125 + txt156 +TEXDEF txt156 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0.125 0 RAD 0.03125 + txt156 +TEXDEF txt156 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0.125 0 APEX 0.734531 0.125 0 RAD 0.0078125 + txt156 +TEXDEF txt156 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.140469 0 APEX 0.625 0.234531 0 RAD 0.0078125 + txt156 +TEXDEF txt156 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.125 0.0154687 APEX 0.625 0.125 0.109531 RAD 0.0078125 + txt156 +TEXDEF txt157 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0.125 0.125 RAD 0.03125 + txt157 +TEXDEF txt157 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0.125 0.125 APEX 0.734531 0.125 0.125 RAD 0.0078125 + txt157 +TEXDEF txt157 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.140469 0.125 APEX 0.625 0.234531 0.125 RAD 0.0078125 + txt157 +TEXDEF txt157 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.125 0.140469 APEX 0.625 0.125 0.234531 RAD 0.0078125 + txt157 +TEXDEF txt157 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0.125 0.25 RAD 0.03125 + txt157 +TEXDEF txt157 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0.125 0.25 APEX 0.734531 0.125 0.25 RAD 0.0078125 + txt157 +TEXDEF txt157 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.140469 0.25 APEX 0.625 0.234531 0.25 RAD 0.0078125 + txt157 +TEXDEF txt157 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.125 0.265469 APEX 0.625 0.125 0.359531 RAD 0.0078125 + txt157 +TEXDEF txt157 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0.125 0.375 RAD 0.03125 + txt157 +TEXDEF txt157 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0.125 0.375 APEX 0.734531 0.125 0.375 RAD 0.0078125 + txt157 +TEXDEF txt158 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.140469 0.375 APEX 0.625 0.234531 0.375 RAD 0.0078125 + txt158 +TEXDEF txt158 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.125 0.390469 APEX 0.625 0.125 0.484531 RAD 0.0078125 + txt158 +TEXDEF txt158 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0.125 0.5 RAD 0.03125 + txt158 +TEXDEF txt158 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0.125 0.5 APEX 0.734531 0.125 0.5 RAD 0.0078125 + txt158 +TEXDEF txt158 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.140469 0.5 APEX 0.625 0.234531 0.5 RAD 0.0078125 + txt158 +TEXDEF txt158 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.125 0.515469 APEX 0.625 0.125 0.609531 RAD 0.0078125 + txt158 +TEXDEF txt158 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0.125 0.625 RAD 0.03125 + txt158 +TEXDEF txt158 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0.125 0.625 APEX 0.734531 0.125 0.625 RAD 0.0078125 + txt158 +TEXDEF txt158 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.140469 0.625 APEX 0.625 0.234531 0.625 RAD 0.0078125 + txt158 +TEXDEF txt158 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.125 0.640469 APEX 0.625 0.125 0.734531 RAD 0.0078125 + txt158 +TEXDEF txt159 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0.125 0.75 RAD 0.03125 + txt159 +TEXDEF txt159 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0.125 0.75 APEX 0.734531 0.125 0.75 RAD 0.0078125 + txt159 +TEXDEF txt159 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.140469 0.75 APEX 0.625 0.234531 0.75 RAD 0.0078125 + txt159 +TEXDEF txt159 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.125 0.765469 APEX 0.625 0.125 0.859531 RAD 0.0078125 + txt159 +TEXDEF txt159 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0.125 0.875 RAD 0.03125 + txt159 +TEXDEF txt159 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0.125 0.875 APEX 0.734531 0.125 0.875 RAD 0.0078125 + txt159 +TEXDEF txt159 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.140469 0.875 APEX 0.625 0.234531 0.875 RAD 0.0078125 + txt159 +TEXDEF txt159 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.125 0.890469 APEX 0.625 0.125 0.984531 RAD 0.0078125 + txt159 +TEXDEF txt159 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0.125 1 RAD 0.03125 + txt159 +TEXDEF txt159 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0.125 1 APEX 0.734531 0.125 1 RAD 0.0078125 + txt159 +TEXDEF txt160 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.140469 1 APEX 0.625 0.234531 1 RAD 0.0078125 + txt160 +TEXDEF txt160 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0.25 0 RAD 0.03125 + txt160 +TEXDEF txt160 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0.25 0 APEX 0.734531 0.25 0 RAD 0.0078125 + txt160 +TEXDEF txt160 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.265469 0 APEX 0.625 0.359531 0 RAD 0.0078125 + txt160 +TEXDEF txt160 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.25 0.0154687 APEX 0.625 0.25 0.109531 RAD 0.0078125 + txt160 +TEXDEF txt160 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0.25 0.125 RAD 0.03125 + txt160 +TEXDEF txt160 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0.25 0.125 APEX 0.734531 0.25 0.125 RAD 0.0078125 + txt160 +TEXDEF txt160 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.265469 0.125 APEX 0.625 0.359531 0.125 RAD 0.0078125 + txt160 +TEXDEF txt160 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.25 0.140469 APEX 0.625 0.25 0.234531 RAD 0.0078125 + txt160 +TEXDEF txt160 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0.25 0.25 RAD 0.03125 + txt160 +TEXDEF txt161 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0.25 0.25 APEX 0.734531 0.25 0.25 RAD 0.0078125 + txt161 +TEXDEF txt161 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.265469 0.25 APEX 0.625 0.359531 0.25 RAD 0.0078125 + txt161 +TEXDEF txt161 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.25 0.265469 APEX 0.625 0.25 0.359531 RAD 0.0078125 + txt161 +TEXDEF txt161 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0.25 0.375 RAD 0.03125 + txt161 +TEXDEF txt161 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0.25 0.375 APEX 0.734531 0.25 0.375 RAD 0.0078125 + txt161 +TEXDEF txt161 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.265469 0.375 APEX 0.625 0.359531 0.375 RAD 0.0078125 + txt161 +TEXDEF txt161 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.25 0.390469 APEX 0.625 0.25 0.484531 RAD 0.0078125 + txt161 +TEXDEF txt161 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0.25 0.5 RAD 0.03125 + txt161 +TEXDEF txt161 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0.25 0.5 APEX 0.734531 0.25 0.5 RAD 0.0078125 + txt161 +TEXDEF txt161 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.265469 0.5 APEX 0.625 0.359531 0.5 RAD 0.0078125 + txt161 +TEXDEF txt162 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.25 0.515469 APEX 0.625 0.25 0.609531 RAD 0.0078125 + txt162 +TEXDEF txt162 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0.25 0.625 RAD 0.03125 + txt162 +TEXDEF txt162 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0.25 0.625 APEX 0.734531 0.25 0.625 RAD 0.0078125 + txt162 +TEXDEF txt162 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.265469 0.625 APEX 0.625 0.359531 0.625 RAD 0.0078125 + txt162 +TEXDEF txt162 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.25 0.640469 APEX 0.625 0.25 0.734531 RAD 0.0078125 + txt162 +TEXDEF txt162 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0.25 0.75 RAD 0.03125 + txt162 +TEXDEF txt162 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0.25 0.75 APEX 0.734531 0.25 0.75 RAD 0.0078125 + txt162 +TEXDEF txt162 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.265469 0.75 APEX 0.625 0.359531 0.75 RAD 0.0078125 + txt162 +TEXDEF txt162 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.25 0.765469 APEX 0.625 0.25 0.859531 RAD 0.0078125 + txt162 +TEXDEF txt162 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0.25 0.875 RAD 0.03125 + txt162 +TEXDEF txt163 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0.25 0.875 APEX 0.734531 0.25 0.875 RAD 0.0078125 + txt163 +TEXDEF txt163 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.265469 0.875 APEX 0.625 0.359531 0.875 RAD 0.0078125 + txt163 +TEXDEF txt163 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.25 0.890469 APEX 0.625 0.25 0.984531 RAD 0.0078125 + txt163 +TEXDEF txt163 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0.25 1 RAD 0.03125 + txt163 +TEXDEF txt163 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0.25 1 APEX 0.734531 0.25 1 RAD 0.0078125 + txt163 +TEXDEF txt163 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.265469 1 APEX 0.625 0.359531 1 RAD 0.0078125 + txt163 +TEXDEF txt163 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0.375 0 RAD 0.03125 + txt163 +TEXDEF txt163 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0.375 0 APEX 0.734531 0.375 0 RAD 0.0078125 + txt163 +TEXDEF txt163 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.390469 0 APEX 0.625 0.484531 0 RAD 0.0078125 + txt163 +TEXDEF txt163 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.375 0.0154687 APEX 0.625 0.375 0.109531 RAD 0.0078125 + txt163 +TEXDEF txt164 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0.375 0.125 RAD 0.03125 + txt164 +TEXDEF txt164 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0.375 0.125 APEX 0.734531 0.375 0.125 RAD 0.0078125 + txt164 +TEXDEF txt164 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.390469 0.125 APEX 0.625 0.484531 0.125 RAD 0.0078125 + txt164 +TEXDEF txt164 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.375 0.140469 APEX 0.625 0.375 0.234531 RAD 0.0078125 + txt164 +TEXDEF txt164 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0.375 0.25 RAD 0.03125 + txt164 +TEXDEF txt164 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0.375 0.25 APEX 0.734531 0.375 0.25 RAD 0.0078125 + txt164 +TEXDEF txt164 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.390469 0.25 APEX 0.625 0.484531 0.25 RAD 0.0078125 + txt164 +TEXDEF txt164 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.375 0.265469 APEX 0.625 0.375 0.359531 RAD 0.0078125 + txt164 +TEXDEF txt164 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0.375 0.375 RAD 0.03125 + txt164 +TEXDEF txt164 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0.375 0.375 APEX 0.734531 0.375 0.375 RAD 0.0078125 + txt164 +TEXDEF txt165 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.390469 0.375 APEX 0.625 0.484531 0.375 RAD 0.0078125 + txt165 +TEXDEF txt165 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.375 0.390469 APEX 0.625 0.375 0.484531 RAD 0.0078125 + txt165 +TEXDEF txt165 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0.375 0.5 RAD 0.03125 + txt165 +TEXDEF txt165 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0.375 0.5 APEX 0.734531 0.375 0.5 RAD 0.0078125 + txt165 +TEXDEF txt165 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.390469 0.5 APEX 0.625 0.484531 0.5 RAD 0.0078125 + txt165 +TEXDEF txt165 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.375 0.515469 APEX 0.625 0.375 0.609531 RAD 0.0078125 + txt165 +TEXDEF txt165 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0.375 0.625 RAD 0.03125 + txt165 +TEXDEF txt165 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0.375 0.625 APEX 0.734531 0.375 0.625 RAD 0.0078125 + txt165 +TEXDEF txt165 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.390469 0.625 APEX 0.625 0.484531 0.625 RAD 0.0078125 + txt165 +TEXDEF txt165 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.375 0.640469 APEX 0.625 0.375 0.734531 RAD 0.0078125 + txt165 +TEXDEF txt166 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0.375 0.75 RAD 0.03125 + txt166 +TEXDEF txt166 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0.375 0.75 APEX 0.734531 0.375 0.75 RAD 0.0078125 + txt166 +TEXDEF txt166 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.390469 0.75 APEX 0.625 0.484531 0.75 RAD 0.0078125 + txt166 +TEXDEF txt166 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.375 0.765469 APEX 0.625 0.375 0.859531 RAD 0.0078125 + txt166 +TEXDEF txt166 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0.375 0.875 RAD 0.03125 + txt166 +TEXDEF txt166 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0.375 0.875 APEX 0.734531 0.375 0.875 RAD 0.0078125 + txt166 +TEXDEF txt166 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.390469 0.875 APEX 0.625 0.484531 0.875 RAD 0.0078125 + txt166 +TEXDEF txt166 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.375 0.890469 APEX 0.625 0.375 0.984531 RAD 0.0078125 + txt166 +TEXDEF txt166 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0.375 1 RAD 0.03125 + txt166 +TEXDEF txt166 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0.375 1 APEX 0.734531 0.375 1 RAD 0.0078125 + txt166 +TEXDEF txt167 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.390469 1 APEX 0.625 0.484531 1 RAD 0.0078125 + txt167 +TEXDEF txt167 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0.5 0 RAD 0.03125 + txt167 +TEXDEF txt167 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0.5 0 APEX 0.734531 0.5 0 RAD 0.0078125 + txt167 +TEXDEF txt167 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.515469 0 APEX 0.625 0.609531 0 RAD 0.0078125 + txt167 +TEXDEF txt167 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.5 0.0154687 APEX 0.625 0.5 0.109531 RAD 0.0078125 + txt167 +TEXDEF txt167 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0.5 0.125 RAD 0.03125 + txt167 +TEXDEF txt167 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0.5 0.125 APEX 0.734531 0.5 0.125 RAD 0.0078125 + txt167 +TEXDEF txt167 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.515469 0.125 APEX 0.625 0.609531 0.125 RAD 0.0078125 + txt167 +TEXDEF txt167 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.5 0.140469 APEX 0.625 0.5 0.234531 RAD 0.0078125 + txt167 +TEXDEF txt167 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0.5 0.25 RAD 0.03125 + txt167 +TEXDEF txt168 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0.5 0.25 APEX 0.734531 0.5 0.25 RAD 0.0078125 + txt168 +TEXDEF txt168 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.515469 0.25 APEX 0.625 0.609531 0.25 RAD 0.0078125 + txt168 +TEXDEF txt168 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.5 0.265469 APEX 0.625 0.5 0.359531 RAD 0.0078125 + txt168 +TEXDEF txt168 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0.5 0.375 RAD 0.03125 + txt168 +TEXDEF txt168 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0.5 0.375 APEX 0.734531 0.5 0.375 RAD 0.0078125 + txt168 +TEXDEF txt168 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.515469 0.375 APEX 0.625 0.609531 0.375 RAD 0.0078125 + txt168 +TEXDEF txt168 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.5 0.390469 APEX 0.625 0.5 0.484531 RAD 0.0078125 + txt168 +TEXDEF txt168 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0.5 0.5 RAD 0.03125 + txt168 +TEXDEF txt168 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0.5 0.5 APEX 0.734531 0.5 0.5 RAD 0.0078125 + txt168 +TEXDEF txt168 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.515469 0.5 APEX 0.625 0.609531 0.5 RAD 0.0078125 + txt168 +TEXDEF txt169 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.5 0.515469 APEX 0.625 0.5 0.609531 RAD 0.0078125 + txt169 +TEXDEF txt169 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0.5 0.625 RAD 0.03125 + txt169 +TEXDEF txt169 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0.5 0.625 APEX 0.734531 0.5 0.625 RAD 0.0078125 + txt169 +TEXDEF txt169 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.515469 0.625 APEX 0.625 0.609531 0.625 RAD 0.0078125 + txt169 +TEXDEF txt169 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.5 0.640469 APEX 0.625 0.5 0.734531 RAD 0.0078125 + txt169 +TEXDEF txt169 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0.5 0.75 RAD 0.03125 + txt169 +TEXDEF txt169 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0.5 0.75 APEX 0.734531 0.5 0.75 RAD 0.0078125 + txt169 +TEXDEF txt169 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.515469 0.75 APEX 0.625 0.609531 0.75 RAD 0.0078125 + txt169 +TEXDEF txt169 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.5 0.765469 APEX 0.625 0.5 0.859531 RAD 0.0078125 + txt169 +TEXDEF txt169 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0.5 0.875 RAD 0.03125 + txt169 +TEXDEF txt170 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0.5 0.875 APEX 0.734531 0.5 0.875 RAD 0.0078125 + txt170 +TEXDEF txt170 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.515469 0.875 APEX 0.625 0.609531 0.875 RAD 0.0078125 + txt170 +TEXDEF txt170 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.5 0.890469 APEX 0.625 0.5 0.984531 RAD 0.0078125 + txt170 +TEXDEF txt170 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0.5 1 RAD 0.03125 + txt170 +TEXDEF txt170 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0.5 1 APEX 0.734531 0.5 1 RAD 0.0078125 + txt170 +TEXDEF txt170 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.515469 1 APEX 0.625 0.609531 1 RAD 0.0078125 + txt170 +TEXDEF txt170 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0.625 0 RAD 0.03125 + txt170 +TEXDEF txt170 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0.625 0 APEX 0.734531 0.625 0 RAD 0.0078125 + txt170 +TEXDEF txt170 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.640469 0 APEX 0.625 0.734531 0 RAD 0.0078125 + txt170 +TEXDEF txt170 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.625 0.0154687 APEX 0.625 0.625 0.109531 RAD 0.0078125 + txt170 +TEXDEF txt171 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0.625 0.125 RAD 0.03125 + txt171 +TEXDEF txt171 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0.625 0.125 APEX 0.734531 0.625 0.125 RAD 0.0078125 + txt171 +TEXDEF txt171 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.640469 0.125 APEX 0.625 0.734531 0.125 RAD 0.0078125 + txt171 +TEXDEF txt171 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.625 0.140469 APEX 0.625 0.625 0.234531 RAD 0.0078125 + txt171 +TEXDEF txt171 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0.625 0.25 RAD 0.03125 + txt171 +TEXDEF txt171 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0.625 0.25 APEX 0.734531 0.625 0.25 RAD 0.0078125 + txt171 +TEXDEF txt171 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.640469 0.25 APEX 0.625 0.734531 0.25 RAD 0.0078125 + txt171 +TEXDEF txt171 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.625 0.265469 APEX 0.625 0.625 0.359531 RAD 0.0078125 + txt171 +TEXDEF txt171 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0.625 0.375 RAD 0.03125 + txt171 +TEXDEF txt171 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0.625 0.375 APEX 0.734531 0.625 0.375 RAD 0.0078125 + txt171 +TEXDEF txt172 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.640469 0.375 APEX 0.625 0.734531 0.375 RAD 0.0078125 + txt172 +TEXDEF txt172 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.625 0.390469 APEX 0.625 0.625 0.484531 RAD 0.0078125 + txt172 +TEXDEF txt172 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0.625 0.5 RAD 0.03125 + txt172 +TEXDEF txt172 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0.625 0.5 APEX 0.734531 0.625 0.5 RAD 0.0078125 + txt172 +TEXDEF txt172 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.640469 0.5 APEX 0.625 0.734531 0.5 RAD 0.0078125 + txt172 +TEXDEF txt172 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.625 0.515469 APEX 0.625 0.625 0.609531 RAD 0.0078125 + txt172 +TEXDEF txt172 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0.625 0.625 RAD 0.03125 + txt172 +TEXDEF txt172 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0.625 0.625 APEX 0.734531 0.625 0.625 RAD 0.0078125 + txt172 +TEXDEF txt172 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.640469 0.625 APEX 0.625 0.734531 0.625 RAD 0.0078125 + txt172 +TEXDEF txt172 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.625 0.640469 APEX 0.625 0.625 0.734531 RAD 0.0078125 + txt172 +TEXDEF txt173 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0.625 0.75 RAD 0.03125 + txt173 +TEXDEF txt173 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0.625 0.75 APEX 0.734531 0.625 0.75 RAD 0.0078125 + txt173 +TEXDEF txt173 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.640469 0.75 APEX 0.625 0.734531 0.75 RAD 0.0078125 + txt173 +TEXDEF txt173 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.625 0.765469 APEX 0.625 0.625 0.859531 RAD 0.0078125 + txt173 +TEXDEF txt173 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0.625 0.875 RAD 0.03125 + txt173 +TEXDEF txt173 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0.625 0.875 APEX 0.734531 0.625 0.875 RAD 0.0078125 + txt173 +TEXDEF txt173 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.640469 0.875 APEX 0.625 0.734531 0.875 RAD 0.0078125 + txt173 +TEXDEF txt173 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.625 0.890469 APEX 0.625 0.625 0.984531 RAD 0.0078125 + txt173 +TEXDEF txt173 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0.625 1 RAD 0.03125 + txt173 +TEXDEF txt173 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0.625 1 APEX 0.734531 0.625 1 RAD 0.0078125 + txt173 +TEXDEF txt174 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.640469 1 APEX 0.625 0.734531 1 RAD 0.0078125 + txt174 +TEXDEF txt174 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0.75 0 RAD 0.03125 + txt174 +TEXDEF txt174 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0.75 0 APEX 0.734531 0.75 0 RAD 0.0078125 + txt174 +TEXDEF txt174 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.765469 0 APEX 0.625 0.859531 0 RAD 0.0078125 + txt174 +TEXDEF txt174 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.75 0.0154687 APEX 0.625 0.75 0.109531 RAD 0.0078125 + txt174 +TEXDEF txt174 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0.75 0.125 RAD 0.03125 + txt174 +TEXDEF txt174 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0.75 0.125 APEX 0.734531 0.75 0.125 RAD 0.0078125 + txt174 +TEXDEF txt174 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.765469 0.125 APEX 0.625 0.859531 0.125 RAD 0.0078125 + txt174 +TEXDEF txt174 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.75 0.140469 APEX 0.625 0.75 0.234531 RAD 0.0078125 + txt174 +TEXDEF txt174 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0.75 0.25 RAD 0.03125 + txt174 +TEXDEF txt175 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0.75 0.25 APEX 0.734531 0.75 0.25 RAD 0.0078125 + txt175 +TEXDEF txt175 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.765469 0.25 APEX 0.625 0.859531 0.25 RAD 0.0078125 + txt175 +TEXDEF txt175 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.75 0.265469 APEX 0.625 0.75 0.359531 RAD 0.0078125 + txt175 +TEXDEF txt175 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0.75 0.375 RAD 0.03125 + txt175 +TEXDEF txt175 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0.75 0.375 APEX 0.734531 0.75 0.375 RAD 0.0078125 + txt175 +TEXDEF txt175 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.765469 0.375 APEX 0.625 0.859531 0.375 RAD 0.0078125 + txt175 +TEXDEF txt175 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.75 0.390469 APEX 0.625 0.75 0.484531 RAD 0.0078125 + txt175 +TEXDEF txt175 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0.75 0.5 RAD 0.03125 + txt175 +TEXDEF txt175 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0.75 0.5 APEX 0.734531 0.75 0.5 RAD 0.0078125 + txt175 +TEXDEF txt175 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.765469 0.5 APEX 0.625 0.859531 0.5 RAD 0.0078125 + txt175 +TEXDEF txt176 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.75 0.515469 APEX 0.625 0.75 0.609531 RAD 0.0078125 + txt176 +TEXDEF txt176 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0.75 0.625 RAD 0.03125 + txt176 +TEXDEF txt176 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0.75 0.625 APEX 0.734531 0.75 0.625 RAD 0.0078125 + txt176 +TEXDEF txt176 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.765469 0.625 APEX 0.625 0.859531 0.625 RAD 0.0078125 + txt176 +TEXDEF txt176 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.75 0.640469 APEX 0.625 0.75 0.734531 RAD 0.0078125 + txt176 +TEXDEF txt176 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0.75 0.75 RAD 0.03125 + txt176 +TEXDEF txt176 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0.75 0.75 APEX 0.734531 0.75 0.75 RAD 0.0078125 + txt176 +TEXDEF txt176 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.765469 0.75 APEX 0.625 0.859531 0.75 RAD 0.0078125 + txt176 +TEXDEF txt176 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.75 0.765469 APEX 0.625 0.75 0.859531 RAD 0.0078125 + txt176 +TEXDEF txt176 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0.75 0.875 RAD 0.03125 + txt176 +TEXDEF txt177 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0.75 0.875 APEX 0.734531 0.75 0.875 RAD 0.0078125 + txt177 +TEXDEF txt177 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.765469 0.875 APEX 0.625 0.859531 0.875 RAD 0.0078125 + txt177 +TEXDEF txt177 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.75 0.890469 APEX 0.625 0.75 0.984531 RAD 0.0078125 + txt177 +TEXDEF txt177 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0.75 1 RAD 0.03125 + txt177 +TEXDEF txt177 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0.75 1 APEX 0.734531 0.75 1 RAD 0.0078125 + txt177 +TEXDEF txt177 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.765469 1 APEX 0.625 0.859531 1 RAD 0.0078125 + txt177 +TEXDEF txt177 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0.875 0 RAD 0.03125 + txt177 +TEXDEF txt177 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0.875 0 APEX 0.734531 0.875 0 RAD 0.0078125 + txt177 +TEXDEF txt177 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.890469 0 APEX 0.625 0.984531 0 RAD 0.0078125 + txt177 +TEXDEF txt177 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.875 0.0154687 APEX 0.625 0.875 0.109531 RAD 0.0078125 + txt177 +TEXDEF txt178 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0.875 0.125 RAD 0.03125 + txt178 +TEXDEF txt178 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0.875 0.125 APEX 0.734531 0.875 0.125 RAD 0.0078125 + txt178 +TEXDEF txt178 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.890469 0.125 APEX 0.625 0.984531 0.125 RAD 0.0078125 + txt178 +TEXDEF txt178 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.875 0.140469 APEX 0.625 0.875 0.234531 RAD 0.0078125 + txt178 +TEXDEF txt178 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0.875 0.25 RAD 0.03125 + txt178 +TEXDEF txt178 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0.875 0.25 APEX 0.734531 0.875 0.25 RAD 0.0078125 + txt178 +TEXDEF txt178 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.890469 0.25 APEX 0.625 0.984531 0.25 RAD 0.0078125 + txt178 +TEXDEF txt178 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.875 0.265469 APEX 0.625 0.875 0.359531 RAD 0.0078125 + txt178 +TEXDEF txt178 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0.875 0.375 RAD 0.03125 + txt178 +TEXDEF txt178 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0.875 0.375 APEX 0.734531 0.875 0.375 RAD 0.0078125 + txt178 +TEXDEF txt179 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.890469 0.375 APEX 0.625 0.984531 0.375 RAD 0.0078125 + txt179 +TEXDEF txt179 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.875 0.390469 APEX 0.625 0.875 0.484531 RAD 0.0078125 + txt179 +TEXDEF txt179 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0.875 0.5 RAD 0.03125 + txt179 +TEXDEF txt179 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0.875 0.5 APEX 0.734531 0.875 0.5 RAD 0.0078125 + txt179 +TEXDEF txt179 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.890469 0.5 APEX 0.625 0.984531 0.5 RAD 0.0078125 + txt179 +TEXDEF txt179 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.875 0.515469 APEX 0.625 0.875 0.609531 RAD 0.0078125 + txt179 +TEXDEF txt179 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0.875 0.625 RAD 0.03125 + txt179 +TEXDEF txt179 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0.875 0.625 APEX 0.734531 0.875 0.625 RAD 0.0078125 + txt179 +TEXDEF txt179 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.890469 0.625 APEX 0.625 0.984531 0.625 RAD 0.0078125 + txt179 +TEXDEF txt179 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.875 0.640469 APEX 0.625 0.875 0.734531 RAD 0.0078125 + txt179 +TEXDEF txt180 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0.875 0.75 RAD 0.03125 + txt180 +TEXDEF txt180 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0.875 0.75 APEX 0.734531 0.875 0.75 RAD 0.0078125 + txt180 +TEXDEF txt180 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.890469 0.75 APEX 0.625 0.984531 0.75 RAD 0.0078125 + txt180 +TEXDEF txt180 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.875 0.765469 APEX 0.625 0.875 0.859531 RAD 0.0078125 + txt180 +TEXDEF txt180 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0.875 0.875 RAD 0.03125 + txt180 +TEXDEF txt180 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0.875 0.875 APEX 0.734531 0.875 0.875 RAD 0.0078125 + txt180 +TEXDEF txt180 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.890469 0.875 APEX 0.625 0.984531 0.875 RAD 0.0078125 + txt180 +TEXDEF txt180 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.875 0.890469 APEX 0.625 0.875 0.984531 RAD 0.0078125 + txt180 +TEXDEF txt180 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 0.875 1 RAD 0.03125 + txt180 +TEXDEF txt180 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 0.875 1 APEX 0.734531 0.875 1 RAD 0.0078125 + txt180 +TEXDEF txt181 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 0.890469 1 APEX 0.625 0.984531 1 RAD 0.0078125 + txt181 +TEXDEF txt181 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 1 0 RAD 0.03125 + txt181 +TEXDEF txt181 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 1 0 APEX 0.734531 1 0 RAD 0.0078125 + txt181 +TEXDEF txt181 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 1 0.0154687 APEX 0.625 1 0.109531 RAD 0.0078125 + txt181 +TEXDEF txt181 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 1 0.125 RAD 0.03125 + txt181 +TEXDEF txt181 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 1 0.125 APEX 0.734531 1 0.125 RAD 0.0078125 + txt181 +TEXDEF txt181 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 1 0.140469 APEX 0.625 1 0.234531 RAD 0.0078125 + txt181 +TEXDEF txt181 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 1 0.25 RAD 0.03125 + txt181 +TEXDEF txt181 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 1 0.25 APEX 0.734531 1 0.25 RAD 0.0078125 + txt181 +TEXDEF txt181 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 1 0.265469 APEX 0.625 1 0.359531 RAD 0.0078125 + txt181 +TEXDEF txt182 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 1 0.375 RAD 0.03125 + txt182 +TEXDEF txt182 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 1 0.375 APEX 0.734531 1 0.375 RAD 0.0078125 + txt182 +TEXDEF txt182 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 1 0.390469 APEX 0.625 1 0.484531 RAD 0.0078125 + txt182 +TEXDEF txt182 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 1 0.5 RAD 0.03125 + txt182 +TEXDEF txt182 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 1 0.5 APEX 0.734531 1 0.5 RAD 0.0078125 + txt182 +TEXDEF txt182 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 1 0.515469 APEX 0.625 1 0.609531 RAD 0.0078125 + txt182 +TEXDEF txt182 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 1 0.625 RAD 0.03125 + txt182 +TEXDEF txt182 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 1 0.625 APEX 0.734531 1 0.625 RAD 0.0078125 + txt182 +TEXDEF txt182 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 1 0.640469 APEX 0.625 1 0.734531 RAD 0.0078125 + txt182 +TEXDEF txt182 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 1 0.75 RAD 0.03125 + txt182 +TEXDEF txt183 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 1 0.75 APEX 0.734531 1 0.75 RAD 0.0078125 + txt183 +TEXDEF txt183 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 1 0.765469 APEX 0.625 1 0.859531 RAD 0.0078125 + txt183 +TEXDEF txt183 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 1 0.875 RAD 0.03125 + txt183 +TEXDEF txt183 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 1 0.875 APEX 0.734531 1 0.875 RAD 0.0078125 + txt183 +TEXDEF txt183 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.625 1 0.890469 APEX 0.625 1 0.984531 RAD 0.0078125 + txt183 +TEXDEF txt183 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.625 1 1 RAD 0.03125 + txt183 +TEXDEF txt183 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.640469 1 1 APEX 0.734531 1 1 RAD 0.0078125 + txt183 +TEXDEF txt183 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0 0 RAD 0.03125 + txt183 +TEXDEF txt183 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0 0 APEX 0.859531 0 0 RAD 0.0078125 + txt183 +TEXDEF txt183 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.0154687 0 APEX 0.75 0.109531 0 RAD 0.0078125 + txt183 +TEXDEF txt184 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0 0.0154687 APEX 0.75 0 0.109531 RAD 0.0078125 + txt184 +TEXDEF txt184 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0 0.125 RAD 0.03125 + txt184 +TEXDEF txt184 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0 0.125 APEX 0.859531 0 0.125 RAD 0.0078125 + txt184 +TEXDEF txt184 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.0154687 0.125 APEX 0.75 0.109531 0.125 RAD 0.0078125 + txt184 +TEXDEF txt184 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0 0.140469 APEX 0.75 0 0.234531 RAD 0.0078125 + txt184 +TEXDEF txt184 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0 0.25 RAD 0.03125 + txt184 +TEXDEF txt184 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0 0.25 APEX 0.859531 0 0.25 RAD 0.0078125 + txt184 +TEXDEF txt184 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.0154687 0.25 APEX 0.75 0.109531 0.25 RAD 0.0078125 + txt184 +TEXDEF txt184 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0 0.265469 APEX 0.75 0 0.359531 RAD 0.0078125 + txt184 +TEXDEF txt184 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0 0.375 RAD 0.03125 + txt184 +TEXDEF txt185 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0 0.375 APEX 0.859531 0 0.375 RAD 0.0078125 + txt185 +TEXDEF txt185 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.0154687 0.375 APEX 0.75 0.109531 0.375 RAD 0.0078125 + txt185 +TEXDEF txt185 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0 0.390469 APEX 0.75 0 0.484531 RAD 0.0078125 + txt185 +TEXDEF txt185 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0 0.5 RAD 0.03125 + txt185 +TEXDEF txt185 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0 0.5 APEX 0.859531 0 0.5 RAD 0.0078125 + txt185 +TEXDEF txt185 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.0154687 0.5 APEX 0.75 0.109531 0.5 RAD 0.0078125 + txt185 +TEXDEF txt185 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0 0.515469 APEX 0.75 0 0.609531 RAD 0.0078125 + txt185 +TEXDEF txt185 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0 0.625 RAD 0.03125 + txt185 +TEXDEF txt185 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0 0.625 APEX 0.859531 0 0.625 RAD 0.0078125 + txt185 +TEXDEF txt185 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.0154687 0.625 APEX 0.75 0.109531 0.625 RAD 0.0078125 + txt185 +TEXDEF txt186 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0 0.640469 APEX 0.75 0 0.734531 RAD 0.0078125 + txt186 +TEXDEF txt186 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0 0.75 RAD 0.03125 + txt186 +TEXDEF txt186 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0 0.75 APEX 0.859531 0 0.75 RAD 0.0078125 + txt186 +TEXDEF txt186 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.0154687 0.75 APEX 0.75 0.109531 0.75 RAD 0.0078125 + txt186 +TEXDEF txt186 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0 0.765469 APEX 0.75 0 0.859531 RAD 0.0078125 + txt186 +TEXDEF txt186 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0 0.875 RAD 0.03125 + txt186 +TEXDEF txt186 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0 0.875 APEX 0.859531 0 0.875 RAD 0.0078125 + txt186 +TEXDEF txt186 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.0154687 0.875 APEX 0.75 0.109531 0.875 RAD 0.0078125 + txt186 +TEXDEF txt186 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0 0.890469 APEX 0.75 0 0.984531 RAD 0.0078125 + txt186 +TEXDEF txt186 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0 1 RAD 0.03125 + txt186 +TEXDEF txt187 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0 1 APEX 0.859531 0 1 RAD 0.0078125 + txt187 +TEXDEF txt187 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.0154687 1 APEX 0.75 0.109531 1 RAD 0.0078125 + txt187 +TEXDEF txt187 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0.125 0 RAD 0.03125 + txt187 +TEXDEF txt187 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0.125 0 APEX 0.859531 0.125 0 RAD 0.0078125 + txt187 +TEXDEF txt187 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.140469 0 APEX 0.75 0.234531 0 RAD 0.0078125 + txt187 +TEXDEF txt187 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.125 0.0154687 APEX 0.75 0.125 0.109531 RAD 0.0078125 + txt187 +TEXDEF txt187 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0.125 0.125 RAD 0.03125 + txt187 +TEXDEF txt187 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0.125 0.125 APEX 0.859531 0.125 0.125 RAD 0.0078125 + txt187 +TEXDEF txt187 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.140469 0.125 APEX 0.75 0.234531 0.125 RAD 0.0078125 + txt187 +TEXDEF txt187 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.125 0.140469 APEX 0.75 0.125 0.234531 RAD 0.0078125 + txt187 +TEXDEF txt188 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0.125 0.25 RAD 0.03125 + txt188 +TEXDEF txt188 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0.125 0.25 APEX 0.859531 0.125 0.25 RAD 0.0078125 + txt188 +TEXDEF txt188 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.140469 0.25 APEX 0.75 0.234531 0.25 RAD 0.0078125 + txt188 +TEXDEF txt188 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.125 0.265469 APEX 0.75 0.125 0.359531 RAD 0.0078125 + txt188 +TEXDEF txt188 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0.125 0.375 RAD 0.03125 + txt188 +TEXDEF txt188 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0.125 0.375 APEX 0.859531 0.125 0.375 RAD 0.0078125 + txt188 +TEXDEF txt188 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.140469 0.375 APEX 0.75 0.234531 0.375 RAD 0.0078125 + txt188 +TEXDEF txt188 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.125 0.390469 APEX 0.75 0.125 0.484531 RAD 0.0078125 + txt188 +TEXDEF txt188 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0.125 0.5 RAD 0.03125 + txt188 +TEXDEF txt188 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0.125 0.5 APEX 0.859531 0.125 0.5 RAD 0.0078125 + txt188 +TEXDEF txt189 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.140469 0.5 APEX 0.75 0.234531 0.5 RAD 0.0078125 + txt189 +TEXDEF txt189 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.125 0.515469 APEX 0.75 0.125 0.609531 RAD 0.0078125 + txt189 +TEXDEF txt189 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0.125 0.625 RAD 0.03125 + txt189 +TEXDEF txt189 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0.125 0.625 APEX 0.859531 0.125 0.625 RAD 0.0078125 + txt189 +TEXDEF txt189 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.140469 0.625 APEX 0.75 0.234531 0.625 RAD 0.0078125 + txt189 +TEXDEF txt189 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.125 0.640469 APEX 0.75 0.125 0.734531 RAD 0.0078125 + txt189 +TEXDEF txt189 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0.125 0.75 RAD 0.03125 + txt189 +TEXDEF txt189 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0.125 0.75 APEX 0.859531 0.125 0.75 RAD 0.0078125 + txt189 +TEXDEF txt189 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.140469 0.75 APEX 0.75 0.234531 0.75 RAD 0.0078125 + txt189 +TEXDEF txt189 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.125 0.765469 APEX 0.75 0.125 0.859531 RAD 0.0078125 + txt189 +TEXDEF txt190 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0.125 0.875 RAD 0.03125 + txt190 +TEXDEF txt190 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0.125 0.875 APEX 0.859531 0.125 0.875 RAD 0.0078125 + txt190 +TEXDEF txt190 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.140469 0.875 APEX 0.75 0.234531 0.875 RAD 0.0078125 + txt190 +TEXDEF txt190 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.125 0.890469 APEX 0.75 0.125 0.984531 RAD 0.0078125 + txt190 +TEXDEF txt190 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0.125 1 RAD 0.03125 + txt190 +TEXDEF txt190 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0.125 1 APEX 0.859531 0.125 1 RAD 0.0078125 + txt190 +TEXDEF txt190 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.140469 1 APEX 0.75 0.234531 1 RAD 0.0078125 + txt190 +TEXDEF txt190 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0.25 0 RAD 0.03125 + txt190 +TEXDEF txt190 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0.25 0 APEX 0.859531 0.25 0 RAD 0.0078125 + txt190 +TEXDEF txt190 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.265469 0 APEX 0.75 0.359531 0 RAD 0.0078125 + txt190 +TEXDEF txt191 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.25 0.0154687 APEX 0.75 0.25 0.109531 RAD 0.0078125 + txt191 +TEXDEF txt191 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0.25 0.125 RAD 0.03125 + txt191 +TEXDEF txt191 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0.25 0.125 APEX 0.859531 0.25 0.125 RAD 0.0078125 + txt191 +TEXDEF txt191 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.265469 0.125 APEX 0.75 0.359531 0.125 RAD 0.0078125 + txt191 +TEXDEF txt191 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.25 0.140469 APEX 0.75 0.25 0.234531 RAD 0.0078125 + txt191 +TEXDEF txt191 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0.25 0.25 RAD 0.03125 + txt191 +TEXDEF txt191 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0.25 0.25 APEX 0.859531 0.25 0.25 RAD 0.0078125 + txt191 +TEXDEF txt191 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.265469 0.25 APEX 0.75 0.359531 0.25 RAD 0.0078125 + txt191 +TEXDEF txt191 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.25 0.265469 APEX 0.75 0.25 0.359531 RAD 0.0078125 + txt191 +TEXDEF txt191 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0.25 0.375 RAD 0.03125 + txt191 +TEXDEF txt192 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0.25 0.375 APEX 0.859531 0.25 0.375 RAD 0.0078125 + txt192 +TEXDEF txt192 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.265469 0.375 APEX 0.75 0.359531 0.375 RAD 0.0078125 + txt192 +TEXDEF txt192 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.25 0.390469 APEX 0.75 0.25 0.484531 RAD 0.0078125 + txt192 +TEXDEF txt192 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0.25 0.5 RAD 0.03125 + txt192 +TEXDEF txt192 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0.25 0.5 APEX 0.859531 0.25 0.5 RAD 0.0078125 + txt192 +TEXDEF txt192 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.265469 0.5 APEX 0.75 0.359531 0.5 RAD 0.0078125 + txt192 +TEXDEF txt192 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.25 0.515469 APEX 0.75 0.25 0.609531 RAD 0.0078125 + txt192 +TEXDEF txt192 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0.25 0.625 RAD 0.03125 + txt192 +TEXDEF txt192 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0.25 0.625 APEX 0.859531 0.25 0.625 RAD 0.0078125 + txt192 +TEXDEF txt192 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.265469 0.625 APEX 0.75 0.359531 0.625 RAD 0.0078125 + txt192 +TEXDEF txt193 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.25 0.640469 APEX 0.75 0.25 0.734531 RAD 0.0078125 + txt193 +TEXDEF txt193 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0.25 0.75 RAD 0.03125 + txt193 +TEXDEF txt193 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0.25 0.75 APEX 0.859531 0.25 0.75 RAD 0.0078125 + txt193 +TEXDEF txt193 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.265469 0.75 APEX 0.75 0.359531 0.75 RAD 0.0078125 + txt193 +TEXDEF txt193 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.25 0.765469 APEX 0.75 0.25 0.859531 RAD 0.0078125 + txt193 +TEXDEF txt193 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0.25 0.875 RAD 0.03125 + txt193 +TEXDEF txt193 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0.25 0.875 APEX 0.859531 0.25 0.875 RAD 0.0078125 + txt193 +TEXDEF txt193 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.265469 0.875 APEX 0.75 0.359531 0.875 RAD 0.0078125 + txt193 +TEXDEF txt193 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.25 0.890469 APEX 0.75 0.25 0.984531 RAD 0.0078125 + txt193 +TEXDEF txt193 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0.25 1 RAD 0.03125 + txt193 +TEXDEF txt194 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0.25 1 APEX 0.859531 0.25 1 RAD 0.0078125 + txt194 +TEXDEF txt194 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.265469 1 APEX 0.75 0.359531 1 RAD 0.0078125 + txt194 +TEXDEF txt194 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0.375 0 RAD 0.03125 + txt194 +TEXDEF txt194 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0.375 0 APEX 0.859531 0.375 0 RAD 0.0078125 + txt194 +TEXDEF txt194 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.390469 0 APEX 0.75 0.484531 0 RAD 0.0078125 + txt194 +TEXDEF txt194 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.375 0.0154687 APEX 0.75 0.375 0.109531 RAD 0.0078125 + txt194 +TEXDEF txt194 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0.375 0.125 RAD 0.03125 + txt194 +TEXDEF txt194 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0.375 0.125 APEX 0.859531 0.375 0.125 RAD 0.0078125 + txt194 +TEXDEF txt194 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.390469 0.125 APEX 0.75 0.484531 0.125 RAD 0.0078125 + txt194 +TEXDEF txt194 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.375 0.140469 APEX 0.75 0.375 0.234531 RAD 0.0078125 + txt194 +TEXDEF txt195 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0.375 0.25 RAD 0.03125 + txt195 +TEXDEF txt195 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0.375 0.25 APEX 0.859531 0.375 0.25 RAD 0.0078125 + txt195 +TEXDEF txt195 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.390469 0.25 APEX 0.75 0.484531 0.25 RAD 0.0078125 + txt195 +TEXDEF txt195 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.375 0.265469 APEX 0.75 0.375 0.359531 RAD 0.0078125 + txt195 +TEXDEF txt195 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0.375 0.375 RAD 0.03125 + txt195 +TEXDEF txt195 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0.375 0.375 APEX 0.859531 0.375 0.375 RAD 0.0078125 + txt195 +TEXDEF txt195 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.390469 0.375 APEX 0.75 0.484531 0.375 RAD 0.0078125 + txt195 +TEXDEF txt195 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.375 0.390469 APEX 0.75 0.375 0.484531 RAD 0.0078125 + txt195 +TEXDEF txt195 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0.375 0.5 RAD 0.03125 + txt195 +TEXDEF txt195 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0.375 0.5 APEX 0.859531 0.375 0.5 RAD 0.0078125 + txt195 +TEXDEF txt196 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.390469 0.5 APEX 0.75 0.484531 0.5 RAD 0.0078125 + txt196 +TEXDEF txt196 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.375 0.515469 APEX 0.75 0.375 0.609531 RAD 0.0078125 + txt196 +TEXDEF txt196 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0.375 0.625 RAD 0.03125 + txt196 +TEXDEF txt196 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0.375 0.625 APEX 0.859531 0.375 0.625 RAD 0.0078125 + txt196 +TEXDEF txt196 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.390469 0.625 APEX 0.75 0.484531 0.625 RAD 0.0078125 + txt196 +TEXDEF txt196 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.375 0.640469 APEX 0.75 0.375 0.734531 RAD 0.0078125 + txt196 +TEXDEF txt196 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0.375 0.75 RAD 0.03125 + txt196 +TEXDEF txt196 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0.375 0.75 APEX 0.859531 0.375 0.75 RAD 0.0078125 + txt196 +TEXDEF txt196 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.390469 0.75 APEX 0.75 0.484531 0.75 RAD 0.0078125 + txt196 +TEXDEF txt196 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.375 0.765469 APEX 0.75 0.375 0.859531 RAD 0.0078125 + txt196 +TEXDEF txt197 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0.375 0.875 RAD 0.03125 + txt197 +TEXDEF txt197 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0.375 0.875 APEX 0.859531 0.375 0.875 RAD 0.0078125 + txt197 +TEXDEF txt197 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.390469 0.875 APEX 0.75 0.484531 0.875 RAD 0.0078125 + txt197 +TEXDEF txt197 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.375 0.890469 APEX 0.75 0.375 0.984531 RAD 0.0078125 + txt197 +TEXDEF txt197 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0.375 1 RAD 0.03125 + txt197 +TEXDEF txt197 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0.375 1 APEX 0.859531 0.375 1 RAD 0.0078125 + txt197 +TEXDEF txt197 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.390469 1 APEX 0.75 0.484531 1 RAD 0.0078125 + txt197 +TEXDEF txt197 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0.5 0 RAD 0.03125 + txt197 +TEXDEF txt197 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0.5 0 APEX 0.859531 0.5 0 RAD 0.0078125 + txt197 +TEXDEF txt197 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.515469 0 APEX 0.75 0.609531 0 RAD 0.0078125 + txt197 +TEXDEF txt198 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.5 0.0154687 APEX 0.75 0.5 0.109531 RAD 0.0078125 + txt198 +TEXDEF txt198 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0.5 0.125 RAD 0.03125 + txt198 +TEXDEF txt198 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0.5 0.125 APEX 0.859531 0.5 0.125 RAD 0.0078125 + txt198 +TEXDEF txt198 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.515469 0.125 APEX 0.75 0.609531 0.125 RAD 0.0078125 + txt198 +TEXDEF txt198 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.5 0.140469 APEX 0.75 0.5 0.234531 RAD 0.0078125 + txt198 +TEXDEF txt198 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0.5 0.25 RAD 0.03125 + txt198 +TEXDEF txt198 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0.5 0.25 APEX 0.859531 0.5 0.25 RAD 0.0078125 + txt198 +TEXDEF txt198 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.515469 0.25 APEX 0.75 0.609531 0.25 RAD 0.0078125 + txt198 +TEXDEF txt198 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.5 0.265469 APEX 0.75 0.5 0.359531 RAD 0.0078125 + txt198 +TEXDEF txt198 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0.5 0.375 RAD 0.03125 + txt198 +TEXDEF txt199 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0.5 0.375 APEX 0.859531 0.5 0.375 RAD 0.0078125 + txt199 +TEXDEF txt199 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.515469 0.375 APEX 0.75 0.609531 0.375 RAD 0.0078125 + txt199 +TEXDEF txt199 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.5 0.390469 APEX 0.75 0.5 0.484531 RAD 0.0078125 + txt199 +TEXDEF txt199 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0.5 0.5 RAD 0.03125 + txt199 +TEXDEF txt199 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0.5 0.5 APEX 0.859531 0.5 0.5 RAD 0.0078125 + txt199 +TEXDEF txt199 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.515469 0.5 APEX 0.75 0.609531 0.5 RAD 0.0078125 + txt199 +TEXDEF txt199 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.5 0.515469 APEX 0.75 0.5 0.609531 RAD 0.0078125 + txt199 +TEXDEF txt199 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0.5 0.625 RAD 0.03125 + txt199 +TEXDEF txt199 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0.5 0.625 APEX 0.859531 0.5 0.625 RAD 0.0078125 + txt199 +TEXDEF txt199 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.515469 0.625 APEX 0.75 0.609531 0.625 RAD 0.0078125 + txt199 +TEXDEF txt200 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.5 0.640469 APEX 0.75 0.5 0.734531 RAD 0.0078125 + txt200 +TEXDEF txt200 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0.5 0.75 RAD 0.03125 + txt200 +TEXDEF txt200 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0.5 0.75 APEX 0.859531 0.5 0.75 RAD 0.0078125 + txt200 +TEXDEF txt200 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.515469 0.75 APEX 0.75 0.609531 0.75 RAD 0.0078125 + txt200 +TEXDEF txt200 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.5 0.765469 APEX 0.75 0.5 0.859531 RAD 0.0078125 + txt200 +TEXDEF txt200 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0.5 0.875 RAD 0.03125 + txt200 +TEXDEF txt200 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0.5 0.875 APEX 0.859531 0.5 0.875 RAD 0.0078125 + txt200 +TEXDEF txt200 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.515469 0.875 APEX 0.75 0.609531 0.875 RAD 0.0078125 + txt200 +TEXDEF txt200 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.5 0.890469 APEX 0.75 0.5 0.984531 RAD 0.0078125 + txt200 +TEXDEF txt200 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0.5 1 RAD 0.03125 + txt200 +TEXDEF txt201 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0.5 1 APEX 0.859531 0.5 1 RAD 0.0078125 + txt201 +TEXDEF txt201 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.515469 1 APEX 0.75 0.609531 1 RAD 0.0078125 + txt201 +TEXDEF txt201 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0.625 0 RAD 0.03125 + txt201 +TEXDEF txt201 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0.625 0 APEX 0.859531 0.625 0 RAD 0.0078125 + txt201 +TEXDEF txt201 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.640469 0 APEX 0.75 0.734531 0 RAD 0.0078125 + txt201 +TEXDEF txt201 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.625 0.0154687 APEX 0.75 0.625 0.109531 RAD 0.0078125 + txt201 +TEXDEF txt201 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0.625 0.125 RAD 0.03125 + txt201 +TEXDEF txt201 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0.625 0.125 APEX 0.859531 0.625 0.125 RAD 0.0078125 + txt201 +TEXDEF txt201 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.640469 0.125 APEX 0.75 0.734531 0.125 RAD 0.0078125 + txt201 +TEXDEF txt201 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.625 0.140469 APEX 0.75 0.625 0.234531 RAD 0.0078125 + txt201 +TEXDEF txt202 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0.625 0.25 RAD 0.03125 + txt202 +TEXDEF txt202 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0.625 0.25 APEX 0.859531 0.625 0.25 RAD 0.0078125 + txt202 +TEXDEF txt202 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.640469 0.25 APEX 0.75 0.734531 0.25 RAD 0.0078125 + txt202 +TEXDEF txt202 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.625 0.265469 APEX 0.75 0.625 0.359531 RAD 0.0078125 + txt202 +TEXDEF txt202 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0.625 0.375 RAD 0.03125 + txt202 +TEXDEF txt202 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0.625 0.375 APEX 0.859531 0.625 0.375 RAD 0.0078125 + txt202 +TEXDEF txt202 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.640469 0.375 APEX 0.75 0.734531 0.375 RAD 0.0078125 + txt202 +TEXDEF txt202 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.625 0.390469 APEX 0.75 0.625 0.484531 RAD 0.0078125 + txt202 +TEXDEF txt202 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0.625 0.5 RAD 0.03125 + txt202 +TEXDEF txt202 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0.625 0.5 APEX 0.859531 0.625 0.5 RAD 0.0078125 + txt202 +TEXDEF txt203 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.640469 0.5 APEX 0.75 0.734531 0.5 RAD 0.0078125 + txt203 +TEXDEF txt203 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.625 0.515469 APEX 0.75 0.625 0.609531 RAD 0.0078125 + txt203 +TEXDEF txt203 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0.625 0.625 RAD 0.03125 + txt203 +TEXDEF txt203 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0.625 0.625 APEX 0.859531 0.625 0.625 RAD 0.0078125 + txt203 +TEXDEF txt203 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.640469 0.625 APEX 0.75 0.734531 0.625 RAD 0.0078125 + txt203 +TEXDEF txt203 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.625 0.640469 APEX 0.75 0.625 0.734531 RAD 0.0078125 + txt203 +TEXDEF txt203 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0.625 0.75 RAD 0.03125 + txt203 +TEXDEF txt203 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0.625 0.75 APEX 0.859531 0.625 0.75 RAD 0.0078125 + txt203 +TEXDEF txt203 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.640469 0.75 APEX 0.75 0.734531 0.75 RAD 0.0078125 + txt203 +TEXDEF txt203 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.625 0.765469 APEX 0.75 0.625 0.859531 RAD 0.0078125 + txt203 +TEXDEF txt204 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0.625 0.875 RAD 0.03125 + txt204 +TEXDEF txt204 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0.625 0.875 APEX 0.859531 0.625 0.875 RAD 0.0078125 + txt204 +TEXDEF txt204 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.640469 0.875 APEX 0.75 0.734531 0.875 RAD 0.0078125 + txt204 +TEXDEF txt204 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.625 0.890469 APEX 0.75 0.625 0.984531 RAD 0.0078125 + txt204 +TEXDEF txt204 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0.625 1 RAD 0.03125 + txt204 +TEXDEF txt204 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0.625 1 APEX 0.859531 0.625 1 RAD 0.0078125 + txt204 +TEXDEF txt204 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.640469 1 APEX 0.75 0.734531 1 RAD 0.0078125 + txt204 +TEXDEF txt204 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0.75 0 RAD 0.03125 + txt204 +TEXDEF txt204 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0.75 0 APEX 0.859531 0.75 0 RAD 0.0078125 + txt204 +TEXDEF txt204 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.765469 0 APEX 0.75 0.859531 0 RAD 0.0078125 + txt204 +TEXDEF txt205 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.75 0.0154687 APEX 0.75 0.75 0.109531 RAD 0.0078125 + txt205 +TEXDEF txt205 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0.75 0.125 RAD 0.03125 + txt205 +TEXDEF txt205 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0.75 0.125 APEX 0.859531 0.75 0.125 RAD 0.0078125 + txt205 +TEXDEF txt205 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.765469 0.125 APEX 0.75 0.859531 0.125 RAD 0.0078125 + txt205 +TEXDEF txt205 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.75 0.140469 APEX 0.75 0.75 0.234531 RAD 0.0078125 + txt205 +TEXDEF txt205 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0.75 0.25 RAD 0.03125 + txt205 +TEXDEF txt205 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0.75 0.25 APEX 0.859531 0.75 0.25 RAD 0.0078125 + txt205 +TEXDEF txt205 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.765469 0.25 APEX 0.75 0.859531 0.25 RAD 0.0078125 + txt205 +TEXDEF txt205 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.75 0.265469 APEX 0.75 0.75 0.359531 RAD 0.0078125 + txt205 +TEXDEF txt205 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0.75 0.375 RAD 0.03125 + txt205 +TEXDEF txt206 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0.75 0.375 APEX 0.859531 0.75 0.375 RAD 0.0078125 + txt206 +TEXDEF txt206 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.765469 0.375 APEX 0.75 0.859531 0.375 RAD 0.0078125 + txt206 +TEXDEF txt206 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.75 0.390469 APEX 0.75 0.75 0.484531 RAD 0.0078125 + txt206 +TEXDEF txt206 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0.75 0.5 RAD 0.03125 + txt206 +TEXDEF txt206 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0.75 0.5 APEX 0.859531 0.75 0.5 RAD 0.0078125 + txt206 +TEXDEF txt206 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.765469 0.5 APEX 0.75 0.859531 0.5 RAD 0.0078125 + txt206 +TEXDEF txt206 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.75 0.515469 APEX 0.75 0.75 0.609531 RAD 0.0078125 + txt206 +TEXDEF txt206 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0.75 0.625 RAD 0.03125 + txt206 +TEXDEF txt206 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0.75 0.625 APEX 0.859531 0.75 0.625 RAD 0.0078125 + txt206 +TEXDEF txt206 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.765469 0.625 APEX 0.75 0.859531 0.625 RAD 0.0078125 + txt206 +TEXDEF txt207 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.75 0.640469 APEX 0.75 0.75 0.734531 RAD 0.0078125 + txt207 +TEXDEF txt207 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0.75 0.75 RAD 0.03125 + txt207 +TEXDEF txt207 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0.75 0.75 APEX 0.859531 0.75 0.75 RAD 0.0078125 + txt207 +TEXDEF txt207 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.765469 0.75 APEX 0.75 0.859531 0.75 RAD 0.0078125 + txt207 +TEXDEF txt207 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.75 0.765469 APEX 0.75 0.75 0.859531 RAD 0.0078125 + txt207 +TEXDEF txt207 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0.75 0.875 RAD 0.03125 + txt207 +TEXDEF txt207 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0.75 0.875 APEX 0.859531 0.75 0.875 RAD 0.0078125 + txt207 +TEXDEF txt207 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.765469 0.875 APEX 0.75 0.859531 0.875 RAD 0.0078125 + txt207 +TEXDEF txt207 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.75 0.890469 APEX 0.75 0.75 0.984531 RAD 0.0078125 + txt207 +TEXDEF txt207 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0.75 1 RAD 0.03125 + txt207 +TEXDEF txt208 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0.75 1 APEX 0.859531 0.75 1 RAD 0.0078125 + txt208 +TEXDEF txt208 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.765469 1 APEX 0.75 0.859531 1 RAD 0.0078125 + txt208 +TEXDEF txt208 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0.875 0 RAD 0.03125 + txt208 +TEXDEF txt208 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0.875 0 APEX 0.859531 0.875 0 RAD 0.0078125 + txt208 +TEXDEF txt208 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.890469 0 APEX 0.75 0.984531 0 RAD 0.0078125 + txt208 +TEXDEF txt208 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.875 0.0154687 APEX 0.75 0.875 0.109531 RAD 0.0078125 + txt208 +TEXDEF txt208 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0.875 0.125 RAD 0.03125 + txt208 +TEXDEF txt208 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0.875 0.125 APEX 0.859531 0.875 0.125 RAD 0.0078125 + txt208 +TEXDEF txt208 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.890469 0.125 APEX 0.75 0.984531 0.125 RAD 0.0078125 + txt208 +TEXDEF txt208 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.875 0.140469 APEX 0.75 0.875 0.234531 RAD 0.0078125 + txt208 +TEXDEF txt209 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0.875 0.25 RAD 0.03125 + txt209 +TEXDEF txt209 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0.875 0.25 APEX 0.859531 0.875 0.25 RAD 0.0078125 + txt209 +TEXDEF txt209 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.890469 0.25 APEX 0.75 0.984531 0.25 RAD 0.0078125 + txt209 +TEXDEF txt209 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.875 0.265469 APEX 0.75 0.875 0.359531 RAD 0.0078125 + txt209 +TEXDEF txt209 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0.875 0.375 RAD 0.03125 + txt209 +TEXDEF txt209 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0.875 0.375 APEX 0.859531 0.875 0.375 RAD 0.0078125 + txt209 +TEXDEF txt209 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.890469 0.375 APEX 0.75 0.984531 0.375 RAD 0.0078125 + txt209 +TEXDEF txt209 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.875 0.390469 APEX 0.75 0.875 0.484531 RAD 0.0078125 + txt209 +TEXDEF txt209 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0.875 0.5 RAD 0.03125 + txt209 +TEXDEF txt209 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0.875 0.5 APEX 0.859531 0.875 0.5 RAD 0.0078125 + txt209 +TEXDEF txt210 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.890469 0.5 APEX 0.75 0.984531 0.5 RAD 0.0078125 + txt210 +TEXDEF txt210 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.875 0.515469 APEX 0.75 0.875 0.609531 RAD 0.0078125 + txt210 +TEXDEF txt210 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0.875 0.625 RAD 0.03125 + txt210 +TEXDEF txt210 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0.875 0.625 APEX 0.859531 0.875 0.625 RAD 0.0078125 + txt210 +TEXDEF txt210 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.890469 0.625 APEX 0.75 0.984531 0.625 RAD 0.0078125 + txt210 +TEXDEF txt210 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.875 0.640469 APEX 0.75 0.875 0.734531 RAD 0.0078125 + txt210 +TEXDEF txt210 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0.875 0.75 RAD 0.03125 + txt210 +TEXDEF txt210 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0.875 0.75 APEX 0.859531 0.875 0.75 RAD 0.0078125 + txt210 +TEXDEF txt210 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.890469 0.75 APEX 0.75 0.984531 0.75 RAD 0.0078125 + txt210 +TEXDEF txt210 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.875 0.765469 APEX 0.75 0.875 0.859531 RAD 0.0078125 + txt210 +TEXDEF txt211 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0.875 0.875 RAD 0.03125 + txt211 +TEXDEF txt211 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0.875 0.875 APEX 0.859531 0.875 0.875 RAD 0.0078125 + txt211 +TEXDEF txt211 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.890469 0.875 APEX 0.75 0.984531 0.875 RAD 0.0078125 + txt211 +TEXDEF txt211 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.875 0.890469 APEX 0.75 0.875 0.984531 RAD 0.0078125 + txt211 +TEXDEF txt211 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 0.875 1 RAD 0.03125 + txt211 +TEXDEF txt211 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 0.875 1 APEX 0.859531 0.875 1 RAD 0.0078125 + txt211 +TEXDEF txt211 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 0.890469 1 APEX 0.75 0.984531 1 RAD 0.0078125 + txt211 +TEXDEF txt211 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 1 0 RAD 0.03125 + txt211 +TEXDEF txt211 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 1 0 APEX 0.859531 1 0 RAD 0.0078125 + txt211 +TEXDEF txt211 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 1 0.0154687 APEX 0.75 1 0.109531 RAD 0.0078125 + txt211 +TEXDEF txt212 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 1 0.125 RAD 0.03125 + txt212 +TEXDEF txt212 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 1 0.125 APEX 0.859531 1 0.125 RAD 0.0078125 + txt212 +TEXDEF txt212 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 1 0.140469 APEX 0.75 1 0.234531 RAD 0.0078125 + txt212 +TEXDEF txt212 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 1 0.25 RAD 0.03125 + txt212 +TEXDEF txt212 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 1 0.25 APEX 0.859531 1 0.25 RAD 0.0078125 + txt212 +TEXDEF txt212 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 1 0.265469 APEX 0.75 1 0.359531 RAD 0.0078125 + txt212 +TEXDEF txt212 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 1 0.375 RAD 0.03125 + txt212 +TEXDEF txt212 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 1 0.375 APEX 0.859531 1 0.375 RAD 0.0078125 + txt212 +TEXDEF txt212 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 1 0.390469 APEX 0.75 1 0.484531 RAD 0.0078125 + txt212 +TEXDEF txt212 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 1 0.5 RAD 0.03125 + txt212 +TEXDEF txt213 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 1 0.5 APEX 0.859531 1 0.5 RAD 0.0078125 + txt213 +TEXDEF txt213 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 1 0.515469 APEX 0.75 1 0.609531 RAD 0.0078125 + txt213 +TEXDEF txt213 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 1 0.625 RAD 0.03125 + txt213 +TEXDEF txt213 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 1 0.625 APEX 0.859531 1 0.625 RAD 0.0078125 + txt213 +TEXDEF txt213 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 1 0.640469 APEX 0.75 1 0.734531 RAD 0.0078125 + txt213 +TEXDEF txt213 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 1 0.75 RAD 0.03125 + txt213 +TEXDEF txt213 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 1 0.75 APEX 0.859531 1 0.75 RAD 0.0078125 + txt213 +TEXDEF txt213 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 1 0.765469 APEX 0.75 1 0.859531 RAD 0.0078125 + txt213 +TEXDEF txt213 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 1 0.875 RAD 0.03125 + txt213 +TEXDEF txt213 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 1 0.875 APEX 0.859531 1 0.875 RAD 0.0078125 + txt213 +TEXDEF txt214 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.75 1 0.890469 APEX 0.75 1 0.984531 RAD 0.0078125 + txt214 +TEXDEF txt214 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.75 1 1 RAD 0.03125 + txt214 +TEXDEF txt214 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.765469 1 1 APEX 0.859531 1 1 RAD 0.0078125 + txt214 +TEXDEF txt214 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0 0 RAD 0.03125 + txt214 +TEXDEF txt214 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0 0 APEX 0.984531 0 0 RAD 0.0078125 + txt214 +TEXDEF txt214 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.0154687 0 APEX 0.875 0.109531 0 RAD 0.0078125 + txt214 +TEXDEF txt214 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0 0.0154687 APEX 0.875 0 0.109531 RAD 0.0078125 + txt214 +TEXDEF txt214 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0 0.125 RAD 0.03125 + txt214 +TEXDEF txt214 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0 0.125 APEX 0.984531 0 0.125 RAD 0.0078125 + txt214 +TEXDEF txt214 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.0154687 0.125 APEX 0.875 0.109531 0.125 RAD 0.0078125 + txt214 +TEXDEF txt215 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0 0.140469 APEX 0.875 0 0.234531 RAD 0.0078125 + txt215 +TEXDEF txt215 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0 0.25 RAD 0.03125 + txt215 +TEXDEF txt215 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0 0.25 APEX 0.984531 0 0.25 RAD 0.0078125 + txt215 +TEXDEF txt215 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.0154687 0.25 APEX 0.875 0.109531 0.25 RAD 0.0078125 + txt215 +TEXDEF txt215 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0 0.265469 APEX 0.875 0 0.359531 RAD 0.0078125 + txt215 +TEXDEF txt215 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0 0.375 RAD 0.03125 + txt215 +TEXDEF txt215 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0 0.375 APEX 0.984531 0 0.375 RAD 0.0078125 + txt215 +TEXDEF txt215 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.0154687 0.375 APEX 0.875 0.109531 0.375 RAD 0.0078125 + txt215 +TEXDEF txt215 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0 0.390469 APEX 0.875 0 0.484531 RAD 0.0078125 + txt215 +TEXDEF txt215 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0 0.5 RAD 0.03125 + txt215 +TEXDEF txt216 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0 0.5 APEX 0.984531 0 0.5 RAD 0.0078125 + txt216 +TEXDEF txt216 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.0154687 0.5 APEX 0.875 0.109531 0.5 RAD 0.0078125 + txt216 +TEXDEF txt216 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0 0.515469 APEX 0.875 0 0.609531 RAD 0.0078125 + txt216 +TEXDEF txt216 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0 0.625 RAD 0.03125 + txt216 +TEXDEF txt216 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0 0.625 APEX 0.984531 0 0.625 RAD 0.0078125 + txt216 +TEXDEF txt216 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.0154687 0.625 APEX 0.875 0.109531 0.625 RAD 0.0078125 + txt216 +TEXDEF txt216 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0 0.640469 APEX 0.875 0 0.734531 RAD 0.0078125 + txt216 +TEXDEF txt216 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0 0.75 RAD 0.03125 + txt216 +TEXDEF txt216 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0 0.75 APEX 0.984531 0 0.75 RAD 0.0078125 + txt216 +TEXDEF txt216 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.0154687 0.75 APEX 0.875 0.109531 0.75 RAD 0.0078125 + txt216 +TEXDEF txt217 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0 0.765469 APEX 0.875 0 0.859531 RAD 0.0078125 + txt217 +TEXDEF txt217 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0 0.875 RAD 0.03125 + txt217 +TEXDEF txt217 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0 0.875 APEX 0.984531 0 0.875 RAD 0.0078125 + txt217 +TEXDEF txt217 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.0154687 0.875 APEX 0.875 0.109531 0.875 RAD 0.0078125 + txt217 +TEXDEF txt217 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0 0.890469 APEX 0.875 0 0.984531 RAD 0.0078125 + txt217 +TEXDEF txt217 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0 1 RAD 0.03125 + txt217 +TEXDEF txt217 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0 1 APEX 0.984531 0 1 RAD 0.0078125 + txt217 +TEXDEF txt217 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.0154687 1 APEX 0.875 0.109531 1 RAD 0.0078125 + txt217 +TEXDEF txt217 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0.125 0 RAD 0.03125 + txt217 +TEXDEF txt217 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0.125 0 APEX 0.984531 0.125 0 RAD 0.0078125 + txt217 +TEXDEF txt218 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.140469 0 APEX 0.875 0.234531 0 RAD 0.0078125 + txt218 +TEXDEF txt218 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.125 0.0154687 APEX 0.875 0.125 0.109531 RAD 0.0078125 + txt218 +TEXDEF txt218 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0.125 0.125 RAD 0.03125 + txt218 +TEXDEF txt218 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0.125 0.125 APEX 0.984531 0.125 0.125 RAD 0.0078125 + txt218 +TEXDEF txt218 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.140469 0.125 APEX 0.875 0.234531 0.125 RAD 0.0078125 + txt218 +TEXDEF txt218 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.125 0.140469 APEX 0.875 0.125 0.234531 RAD 0.0078125 + txt218 +TEXDEF txt218 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0.125 0.25 RAD 0.03125 + txt218 +TEXDEF txt218 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0.125 0.25 APEX 0.984531 0.125 0.25 RAD 0.0078125 + txt218 +TEXDEF txt218 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.140469 0.25 APEX 0.875 0.234531 0.25 RAD 0.0078125 + txt218 +TEXDEF txt218 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.125 0.265469 APEX 0.875 0.125 0.359531 RAD 0.0078125 + txt218 +TEXDEF txt219 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0.125 0.375 RAD 0.03125 + txt219 +TEXDEF txt219 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0.125 0.375 APEX 0.984531 0.125 0.375 RAD 0.0078125 + txt219 +TEXDEF txt219 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.140469 0.375 APEX 0.875 0.234531 0.375 RAD 0.0078125 + txt219 +TEXDEF txt219 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.125 0.390469 APEX 0.875 0.125 0.484531 RAD 0.0078125 + txt219 +TEXDEF txt219 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0.125 0.5 RAD 0.03125 + txt219 +TEXDEF txt219 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0.125 0.5 APEX 0.984531 0.125 0.5 RAD 0.0078125 + txt219 +TEXDEF txt219 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.140469 0.5 APEX 0.875 0.234531 0.5 RAD 0.0078125 + txt219 +TEXDEF txt219 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.125 0.515469 APEX 0.875 0.125 0.609531 RAD 0.0078125 + txt219 +TEXDEF txt219 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0.125 0.625 RAD 0.03125 + txt219 +TEXDEF txt219 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0.125 0.625 APEX 0.984531 0.125 0.625 RAD 0.0078125 + txt219 +TEXDEF txt220 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.140469 0.625 APEX 0.875 0.234531 0.625 RAD 0.0078125 + txt220 +TEXDEF txt220 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.125 0.640469 APEX 0.875 0.125 0.734531 RAD 0.0078125 + txt220 +TEXDEF txt220 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0.125 0.75 RAD 0.03125 + txt220 +TEXDEF txt220 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0.125 0.75 APEX 0.984531 0.125 0.75 RAD 0.0078125 + txt220 +TEXDEF txt220 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.140469 0.75 APEX 0.875 0.234531 0.75 RAD 0.0078125 + txt220 +TEXDEF txt220 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.125 0.765469 APEX 0.875 0.125 0.859531 RAD 0.0078125 + txt220 +TEXDEF txt220 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0.125 0.875 RAD 0.03125 + txt220 +TEXDEF txt220 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0.125 0.875 APEX 0.984531 0.125 0.875 RAD 0.0078125 + txt220 +TEXDEF txt220 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.140469 0.875 APEX 0.875 0.234531 0.875 RAD 0.0078125 + txt220 +TEXDEF txt220 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.125 0.890469 APEX 0.875 0.125 0.984531 RAD 0.0078125 + txt220 +TEXDEF txt221 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0.125 1 RAD 0.03125 + txt221 +TEXDEF txt221 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0.125 1 APEX 0.984531 0.125 1 RAD 0.0078125 + txt221 +TEXDEF txt221 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.140469 1 APEX 0.875 0.234531 1 RAD 0.0078125 + txt221 +TEXDEF txt221 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0.25 0 RAD 0.03125 + txt221 +TEXDEF txt221 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0.25 0 APEX 0.984531 0.25 0 RAD 0.0078125 + txt221 +TEXDEF txt221 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.265469 0 APEX 0.875 0.359531 0 RAD 0.0078125 + txt221 +TEXDEF txt221 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.25 0.0154687 APEX 0.875 0.25 0.109531 RAD 0.0078125 + txt221 +TEXDEF txt221 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0.25 0.125 RAD 0.03125 + txt221 +TEXDEF txt221 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0.25 0.125 APEX 0.984531 0.25 0.125 RAD 0.0078125 + txt221 +TEXDEF txt221 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.265469 0.125 APEX 0.875 0.359531 0.125 RAD 0.0078125 + txt221 +TEXDEF txt222 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.25 0.140469 APEX 0.875 0.25 0.234531 RAD 0.0078125 + txt222 +TEXDEF txt222 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0.25 0.25 RAD 0.03125 + txt222 +TEXDEF txt222 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0.25 0.25 APEX 0.984531 0.25 0.25 RAD 0.0078125 + txt222 +TEXDEF txt222 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.265469 0.25 APEX 0.875 0.359531 0.25 RAD 0.0078125 + txt222 +TEXDEF txt222 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.25 0.265469 APEX 0.875 0.25 0.359531 RAD 0.0078125 + txt222 +TEXDEF txt222 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0.25 0.375 RAD 0.03125 + txt222 +TEXDEF txt222 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0.25 0.375 APEX 0.984531 0.25 0.375 RAD 0.0078125 + txt222 +TEXDEF txt222 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.265469 0.375 APEX 0.875 0.359531 0.375 RAD 0.0078125 + txt222 +TEXDEF txt222 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.25 0.390469 APEX 0.875 0.25 0.484531 RAD 0.0078125 + txt222 +TEXDEF txt222 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0.25 0.5 RAD 0.03125 + txt222 +TEXDEF txt223 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0.25 0.5 APEX 0.984531 0.25 0.5 RAD 0.0078125 + txt223 +TEXDEF txt223 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.265469 0.5 APEX 0.875 0.359531 0.5 RAD 0.0078125 + txt223 +TEXDEF txt223 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.25 0.515469 APEX 0.875 0.25 0.609531 RAD 0.0078125 + txt223 +TEXDEF txt223 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0.25 0.625 RAD 0.03125 + txt223 +TEXDEF txt223 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0.25 0.625 APEX 0.984531 0.25 0.625 RAD 0.0078125 + txt223 +TEXDEF txt223 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.265469 0.625 APEX 0.875 0.359531 0.625 RAD 0.0078125 + txt223 +TEXDEF txt223 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.25 0.640469 APEX 0.875 0.25 0.734531 RAD 0.0078125 + txt223 +TEXDEF txt223 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0.25 0.75 RAD 0.03125 + txt223 +TEXDEF txt223 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0.25 0.75 APEX 0.984531 0.25 0.75 RAD 0.0078125 + txt223 +TEXDEF txt223 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.265469 0.75 APEX 0.875 0.359531 0.75 RAD 0.0078125 + txt223 +TEXDEF txt224 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.25 0.765469 APEX 0.875 0.25 0.859531 RAD 0.0078125 + txt224 +TEXDEF txt224 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0.25 0.875 RAD 0.03125 + txt224 +TEXDEF txt224 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0.25 0.875 APEX 0.984531 0.25 0.875 RAD 0.0078125 + txt224 +TEXDEF txt224 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.265469 0.875 APEX 0.875 0.359531 0.875 RAD 0.0078125 + txt224 +TEXDEF txt224 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.25 0.890469 APEX 0.875 0.25 0.984531 RAD 0.0078125 + txt224 +TEXDEF txt224 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0.25 1 RAD 0.03125 + txt224 +TEXDEF txt224 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0.25 1 APEX 0.984531 0.25 1 RAD 0.0078125 + txt224 +TEXDEF txt224 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.265469 1 APEX 0.875 0.359531 1 RAD 0.0078125 + txt224 +TEXDEF txt224 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0.375 0 RAD 0.03125 + txt224 +TEXDEF txt224 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0.375 0 APEX 0.984531 0.375 0 RAD 0.0078125 + txt224 +TEXDEF txt225 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.390469 0 APEX 0.875 0.484531 0 RAD 0.0078125 + txt225 +TEXDEF txt225 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.375 0.0154687 APEX 0.875 0.375 0.109531 RAD 0.0078125 + txt225 +TEXDEF txt225 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0.375 0.125 RAD 0.03125 + txt225 +TEXDEF txt225 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0.375 0.125 APEX 0.984531 0.375 0.125 RAD 0.0078125 + txt225 +TEXDEF txt225 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.390469 0.125 APEX 0.875 0.484531 0.125 RAD 0.0078125 + txt225 +TEXDEF txt225 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.375 0.140469 APEX 0.875 0.375 0.234531 RAD 0.0078125 + txt225 +TEXDEF txt225 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0.375 0.25 RAD 0.03125 + txt225 +TEXDEF txt225 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0.375 0.25 APEX 0.984531 0.375 0.25 RAD 0.0078125 + txt225 +TEXDEF txt225 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.390469 0.25 APEX 0.875 0.484531 0.25 RAD 0.0078125 + txt225 +TEXDEF txt225 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.375 0.265469 APEX 0.875 0.375 0.359531 RAD 0.0078125 + txt225 +TEXDEF txt226 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0.375 0.375 RAD 0.03125 + txt226 +TEXDEF txt226 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0.375 0.375 APEX 0.984531 0.375 0.375 RAD 0.0078125 + txt226 +TEXDEF txt226 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.390469 0.375 APEX 0.875 0.484531 0.375 RAD 0.0078125 + txt226 +TEXDEF txt226 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.375 0.390469 APEX 0.875 0.375 0.484531 RAD 0.0078125 + txt226 +TEXDEF txt226 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0.375 0.5 RAD 0.03125 + txt226 +TEXDEF txt226 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0.375 0.5 APEX 0.984531 0.375 0.5 RAD 0.0078125 + txt226 +TEXDEF txt226 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.390469 0.5 APEX 0.875 0.484531 0.5 RAD 0.0078125 + txt226 +TEXDEF txt226 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.375 0.515469 APEX 0.875 0.375 0.609531 RAD 0.0078125 + txt226 +TEXDEF txt226 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0.375 0.625 RAD 0.03125 + txt226 +TEXDEF txt226 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0.375 0.625 APEX 0.984531 0.375 0.625 RAD 0.0078125 + txt226 +TEXDEF txt227 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.390469 0.625 APEX 0.875 0.484531 0.625 RAD 0.0078125 + txt227 +TEXDEF txt227 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.375 0.640469 APEX 0.875 0.375 0.734531 RAD 0.0078125 + txt227 +TEXDEF txt227 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0.375 0.75 RAD 0.03125 + txt227 +TEXDEF txt227 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0.375 0.75 APEX 0.984531 0.375 0.75 RAD 0.0078125 + txt227 +TEXDEF txt227 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.390469 0.75 APEX 0.875 0.484531 0.75 RAD 0.0078125 + txt227 +TEXDEF txt227 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.375 0.765469 APEX 0.875 0.375 0.859531 RAD 0.0078125 + txt227 +TEXDEF txt227 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0.375 0.875 RAD 0.03125 + txt227 +TEXDEF txt227 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0.375 0.875 APEX 0.984531 0.375 0.875 RAD 0.0078125 + txt227 +TEXDEF txt227 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.390469 0.875 APEX 0.875 0.484531 0.875 RAD 0.0078125 + txt227 +TEXDEF txt227 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.375 0.890469 APEX 0.875 0.375 0.984531 RAD 0.0078125 + txt227 +TEXDEF txt228 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0.375 1 RAD 0.03125 + txt228 +TEXDEF txt228 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0.375 1 APEX 0.984531 0.375 1 RAD 0.0078125 + txt228 +TEXDEF txt228 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.390469 1 APEX 0.875 0.484531 1 RAD 0.0078125 + txt228 +TEXDEF txt228 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0.5 0 RAD 0.03125 + txt228 +TEXDEF txt228 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0.5 0 APEX 0.984531 0.5 0 RAD 0.0078125 + txt228 +TEXDEF txt228 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.515469 0 APEX 0.875 0.609531 0 RAD 0.0078125 + txt228 +TEXDEF txt228 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.5 0.0154687 APEX 0.875 0.5 0.109531 RAD 0.0078125 + txt228 +TEXDEF txt228 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0.5 0.125 RAD 0.03125 + txt228 +TEXDEF txt228 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0.5 0.125 APEX 0.984531 0.5 0.125 RAD 0.0078125 + txt228 +TEXDEF txt228 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.515469 0.125 APEX 0.875 0.609531 0.125 RAD 0.0078125 + txt228 +TEXDEF txt229 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.5 0.140469 APEX 0.875 0.5 0.234531 RAD 0.0078125 + txt229 +TEXDEF txt229 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0.5 0.25 RAD 0.03125 + txt229 +TEXDEF txt229 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0.5 0.25 APEX 0.984531 0.5 0.25 RAD 0.0078125 + txt229 +TEXDEF txt229 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.515469 0.25 APEX 0.875 0.609531 0.25 RAD 0.0078125 + txt229 +TEXDEF txt229 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.5 0.265469 APEX 0.875 0.5 0.359531 RAD 0.0078125 + txt229 +TEXDEF txt229 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0.5 0.375 RAD 0.03125 + txt229 +TEXDEF txt229 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0.5 0.375 APEX 0.984531 0.5 0.375 RAD 0.0078125 + txt229 +TEXDEF txt229 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.515469 0.375 APEX 0.875 0.609531 0.375 RAD 0.0078125 + txt229 +TEXDEF txt229 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.5 0.390469 APEX 0.875 0.5 0.484531 RAD 0.0078125 + txt229 +TEXDEF txt229 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0.5 0.5 RAD 0.03125 + txt229 +TEXDEF txt230 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0.5 0.5 APEX 0.984531 0.5 0.5 RAD 0.0078125 + txt230 +TEXDEF txt230 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.515469 0.5 APEX 0.875 0.609531 0.5 RAD 0.0078125 + txt230 +TEXDEF txt230 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.5 0.515469 APEX 0.875 0.5 0.609531 RAD 0.0078125 + txt230 +TEXDEF txt230 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0.5 0.625 RAD 0.03125 + txt230 +TEXDEF txt230 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0.5 0.625 APEX 0.984531 0.5 0.625 RAD 0.0078125 + txt230 +TEXDEF txt230 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.515469 0.625 APEX 0.875 0.609531 0.625 RAD 0.0078125 + txt230 +TEXDEF txt230 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.5 0.640469 APEX 0.875 0.5 0.734531 RAD 0.0078125 + txt230 +TEXDEF txt230 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0.5 0.75 RAD 0.03125 + txt230 +TEXDEF txt230 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0.5 0.75 APEX 0.984531 0.5 0.75 RAD 0.0078125 + txt230 +TEXDEF txt230 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.515469 0.75 APEX 0.875 0.609531 0.75 RAD 0.0078125 + txt230 +TEXDEF txt231 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.5 0.765469 APEX 0.875 0.5 0.859531 RAD 0.0078125 + txt231 +TEXDEF txt231 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0.5 0.875 RAD 0.03125 + txt231 +TEXDEF txt231 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0.5 0.875 APEX 0.984531 0.5 0.875 RAD 0.0078125 + txt231 +TEXDEF txt231 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.515469 0.875 APEX 0.875 0.609531 0.875 RAD 0.0078125 + txt231 +TEXDEF txt231 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.5 0.890469 APEX 0.875 0.5 0.984531 RAD 0.0078125 + txt231 +TEXDEF txt231 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0.5 1 RAD 0.03125 + txt231 +TEXDEF txt231 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0.5 1 APEX 0.984531 0.5 1 RAD 0.0078125 + txt231 +TEXDEF txt231 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.515469 1 APEX 0.875 0.609531 1 RAD 0.0078125 + txt231 +TEXDEF txt231 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0.625 0 RAD 0.03125 + txt231 +TEXDEF txt231 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0.625 0 APEX 0.984531 0.625 0 RAD 0.0078125 + txt231 +TEXDEF txt232 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.640469 0 APEX 0.875 0.734531 0 RAD 0.0078125 + txt232 +TEXDEF txt232 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.625 0.0154687 APEX 0.875 0.625 0.109531 RAD 0.0078125 + txt232 +TEXDEF txt232 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0.625 0.125 RAD 0.03125 + txt232 +TEXDEF txt232 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0.625 0.125 APEX 0.984531 0.625 0.125 RAD 0.0078125 + txt232 +TEXDEF txt232 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.640469 0.125 APEX 0.875 0.734531 0.125 RAD 0.0078125 + txt232 +TEXDEF txt232 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.625 0.140469 APEX 0.875 0.625 0.234531 RAD 0.0078125 + txt232 +TEXDEF txt232 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0.625 0.25 RAD 0.03125 + txt232 +TEXDEF txt232 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0.625 0.25 APEX 0.984531 0.625 0.25 RAD 0.0078125 + txt232 +TEXDEF txt232 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.640469 0.25 APEX 0.875 0.734531 0.25 RAD 0.0078125 + txt232 +TEXDEF txt232 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.625 0.265469 APEX 0.875 0.625 0.359531 RAD 0.0078125 + txt232 +TEXDEF txt233 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0.625 0.375 RAD 0.03125 + txt233 +TEXDEF txt233 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0.625 0.375 APEX 0.984531 0.625 0.375 RAD 0.0078125 + txt233 +TEXDEF txt233 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.640469 0.375 APEX 0.875 0.734531 0.375 RAD 0.0078125 + txt233 +TEXDEF txt233 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.625 0.390469 APEX 0.875 0.625 0.484531 RAD 0.0078125 + txt233 +TEXDEF txt233 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0.625 0.5 RAD 0.03125 + txt233 +TEXDEF txt233 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0.625 0.5 APEX 0.984531 0.625 0.5 RAD 0.0078125 + txt233 +TEXDEF txt233 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.640469 0.5 APEX 0.875 0.734531 0.5 RAD 0.0078125 + txt233 +TEXDEF txt233 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.625 0.515469 APEX 0.875 0.625 0.609531 RAD 0.0078125 + txt233 +TEXDEF txt233 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0.625 0.625 RAD 0.03125 + txt233 +TEXDEF txt233 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0.625 0.625 APEX 0.984531 0.625 0.625 RAD 0.0078125 + txt233 +TEXDEF txt234 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.640469 0.625 APEX 0.875 0.734531 0.625 RAD 0.0078125 + txt234 +TEXDEF txt234 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.625 0.640469 APEX 0.875 0.625 0.734531 RAD 0.0078125 + txt234 +TEXDEF txt234 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0.625 0.75 RAD 0.03125 + txt234 +TEXDEF txt234 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0.625 0.75 APEX 0.984531 0.625 0.75 RAD 0.0078125 + txt234 +TEXDEF txt234 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.640469 0.75 APEX 0.875 0.734531 0.75 RAD 0.0078125 + txt234 +TEXDEF txt234 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.625 0.765469 APEX 0.875 0.625 0.859531 RAD 0.0078125 + txt234 +TEXDEF txt234 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0.625 0.875 RAD 0.03125 + txt234 +TEXDEF txt234 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0.625 0.875 APEX 0.984531 0.625 0.875 RAD 0.0078125 + txt234 +TEXDEF txt234 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.640469 0.875 APEX 0.875 0.734531 0.875 RAD 0.0078125 + txt234 +TEXDEF txt234 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.625 0.890469 APEX 0.875 0.625 0.984531 RAD 0.0078125 + txt234 +TEXDEF txt235 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0.625 1 RAD 0.03125 + txt235 +TEXDEF txt235 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0.625 1 APEX 0.984531 0.625 1 RAD 0.0078125 + txt235 +TEXDEF txt235 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.640469 1 APEX 0.875 0.734531 1 RAD 0.0078125 + txt235 +TEXDEF txt235 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0.75 0 RAD 0.03125 + txt235 +TEXDEF txt235 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0.75 0 APEX 0.984531 0.75 0 RAD 0.0078125 + txt235 +TEXDEF txt235 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.765469 0 APEX 0.875 0.859531 0 RAD 0.0078125 + txt235 +TEXDEF txt235 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.75 0.0154687 APEX 0.875 0.75 0.109531 RAD 0.0078125 + txt235 +TEXDEF txt235 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0.75 0.125 RAD 0.03125 + txt235 +TEXDEF txt235 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0.75 0.125 APEX 0.984531 0.75 0.125 RAD 0.0078125 + txt235 +TEXDEF txt235 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.765469 0.125 APEX 0.875 0.859531 0.125 RAD 0.0078125 + txt235 +TEXDEF txt236 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.75 0.140469 APEX 0.875 0.75 0.234531 RAD 0.0078125 + txt236 +TEXDEF txt236 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0.75 0.25 RAD 0.03125 + txt236 +TEXDEF txt236 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0.75 0.25 APEX 0.984531 0.75 0.25 RAD 0.0078125 + txt236 +TEXDEF txt236 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.765469 0.25 APEX 0.875 0.859531 0.25 RAD 0.0078125 + txt236 +TEXDEF txt236 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.75 0.265469 APEX 0.875 0.75 0.359531 RAD 0.0078125 + txt236 +TEXDEF txt236 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0.75 0.375 RAD 0.03125 + txt236 +TEXDEF txt236 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0.75 0.375 APEX 0.984531 0.75 0.375 RAD 0.0078125 + txt236 +TEXDEF txt236 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.765469 0.375 APEX 0.875 0.859531 0.375 RAD 0.0078125 + txt236 +TEXDEF txt236 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.75 0.390469 APEX 0.875 0.75 0.484531 RAD 0.0078125 + txt236 +TEXDEF txt236 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0.75 0.5 RAD 0.03125 + txt236 +TEXDEF txt237 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0.75 0.5 APEX 0.984531 0.75 0.5 RAD 0.0078125 + txt237 +TEXDEF txt237 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.765469 0.5 APEX 0.875 0.859531 0.5 RAD 0.0078125 + txt237 +TEXDEF txt237 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.75 0.515469 APEX 0.875 0.75 0.609531 RAD 0.0078125 + txt237 +TEXDEF txt237 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0.75 0.625 RAD 0.03125 + txt237 +TEXDEF txt237 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0.75 0.625 APEX 0.984531 0.75 0.625 RAD 0.0078125 + txt237 +TEXDEF txt237 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.765469 0.625 APEX 0.875 0.859531 0.625 RAD 0.0078125 + txt237 +TEXDEF txt237 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.75 0.640469 APEX 0.875 0.75 0.734531 RAD 0.0078125 + txt237 +TEXDEF txt237 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0.75 0.75 RAD 0.03125 + txt237 +TEXDEF txt237 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0.75 0.75 APEX 0.984531 0.75 0.75 RAD 0.0078125 + txt237 +TEXDEF txt237 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.765469 0.75 APEX 0.875 0.859531 0.75 RAD 0.0078125 + txt237 +TEXDEF txt238 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.75 0.765469 APEX 0.875 0.75 0.859531 RAD 0.0078125 + txt238 +TEXDEF txt238 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0.75 0.875 RAD 0.03125 + txt238 +TEXDEF txt238 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0.75 0.875 APEX 0.984531 0.75 0.875 RAD 0.0078125 + txt238 +TEXDEF txt238 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.765469 0.875 APEX 0.875 0.859531 0.875 RAD 0.0078125 + txt238 +TEXDEF txt238 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.75 0.890469 APEX 0.875 0.75 0.984531 RAD 0.0078125 + txt238 +TEXDEF txt238 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0.75 1 RAD 0.03125 + txt238 +TEXDEF txt238 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0.75 1 APEX 0.984531 0.75 1 RAD 0.0078125 + txt238 +TEXDEF txt238 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.765469 1 APEX 0.875 0.859531 1 RAD 0.0078125 + txt238 +TEXDEF txt238 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0.875 0 RAD 0.03125 + txt238 +TEXDEF txt238 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0.875 0 APEX 0.984531 0.875 0 RAD 0.0078125 + txt238 +TEXDEF txt239 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.890469 0 APEX 0.875 0.984531 0 RAD 0.0078125 + txt239 +TEXDEF txt239 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.875 0.0154687 APEX 0.875 0.875 0.109531 RAD 0.0078125 + txt239 +TEXDEF txt239 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0.875 0.125 RAD 0.03125 + txt239 +TEXDEF txt239 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0.875 0.125 APEX 0.984531 0.875 0.125 RAD 0.0078125 + txt239 +TEXDEF txt239 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.890469 0.125 APEX 0.875 0.984531 0.125 RAD 0.0078125 + txt239 +TEXDEF txt239 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.875 0.140469 APEX 0.875 0.875 0.234531 RAD 0.0078125 + txt239 +TEXDEF txt239 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0.875 0.25 RAD 0.03125 + txt239 +TEXDEF txt239 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0.875 0.25 APEX 0.984531 0.875 0.25 RAD 0.0078125 + txt239 +TEXDEF txt239 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.890469 0.25 APEX 0.875 0.984531 0.25 RAD 0.0078125 + txt239 +TEXDEF txt239 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.875 0.265469 APEX 0.875 0.875 0.359531 RAD 0.0078125 + txt239 +TEXDEF txt240 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0.875 0.375 RAD 0.03125 + txt240 +TEXDEF txt240 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0.875 0.375 APEX 0.984531 0.875 0.375 RAD 0.0078125 + txt240 +TEXDEF txt240 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.890469 0.375 APEX 0.875 0.984531 0.375 RAD 0.0078125 + txt240 +TEXDEF txt240 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.875 0.390469 APEX 0.875 0.875 0.484531 RAD 0.0078125 + txt240 +TEXDEF txt240 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0.875 0.5 RAD 0.03125 + txt240 +TEXDEF txt240 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0.875 0.5 APEX 0.984531 0.875 0.5 RAD 0.0078125 + txt240 +TEXDEF txt240 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.890469 0.5 APEX 0.875 0.984531 0.5 RAD 0.0078125 + txt240 +TEXDEF txt240 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.875 0.515469 APEX 0.875 0.875 0.609531 RAD 0.0078125 + txt240 +TEXDEF txt240 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0.875 0.625 RAD 0.03125 + txt240 +TEXDEF txt240 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0.875 0.625 APEX 0.984531 0.875 0.625 RAD 0.0078125 + txt240 +TEXDEF txt241 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.890469 0.625 APEX 0.875 0.984531 0.625 RAD 0.0078125 + txt241 +TEXDEF txt241 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.875 0.640469 APEX 0.875 0.875 0.734531 RAD 0.0078125 + txt241 +TEXDEF txt241 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0.875 0.75 RAD 0.03125 + txt241 +TEXDEF txt241 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0.875 0.75 APEX 0.984531 0.875 0.75 RAD 0.0078125 + txt241 +TEXDEF txt241 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.890469 0.75 APEX 0.875 0.984531 0.75 RAD 0.0078125 + txt241 +TEXDEF txt241 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.875 0.765469 APEX 0.875 0.875 0.859531 RAD 0.0078125 + txt241 +TEXDEF txt241 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0.875 0.875 RAD 0.03125 + txt241 +TEXDEF txt241 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0.875 0.875 APEX 0.984531 0.875 0.875 RAD 0.0078125 + txt241 +TEXDEF txt241 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.890469 0.875 APEX 0.875 0.984531 0.875 RAD 0.0078125 + txt241 +TEXDEF txt241 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.875 0.890469 APEX 0.875 0.875 0.984531 RAD 0.0078125 + txt241 +TEXDEF txt242 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 0.875 1 RAD 0.03125 + txt242 +TEXDEF txt242 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 0.875 1 APEX 0.984531 0.875 1 RAD 0.0078125 + txt242 +TEXDEF txt242 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 0.890469 1 APEX 0.875 0.984531 1 RAD 0.0078125 + txt242 +TEXDEF txt242 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 1 0 RAD 0.03125 + txt242 +TEXDEF txt242 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 1 0 APEX 0.984531 1 0 RAD 0.0078125 + txt242 +TEXDEF txt242 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 1 0.0154687 APEX 0.875 1 0.109531 RAD 0.0078125 + txt242 +TEXDEF txt242 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 1 0.125 RAD 0.03125 + txt242 +TEXDEF txt242 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 1 0.125 APEX 0.984531 1 0.125 RAD 0.0078125 + txt242 +TEXDEF txt242 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 1 0.140469 APEX 0.875 1 0.234531 RAD 0.0078125 + txt242 +TEXDEF txt242 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 1 0.25 RAD 0.03125 + txt242 +TEXDEF txt243 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 1 0.25 APEX 0.984531 1 0.25 RAD 0.0078125 + txt243 +TEXDEF txt243 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 1 0.265469 APEX 0.875 1 0.359531 RAD 0.0078125 + txt243 +TEXDEF txt243 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 1 0.375 RAD 0.03125 + txt243 +TEXDEF txt243 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 1 0.375 APEX 0.984531 1 0.375 RAD 0.0078125 + txt243 +TEXDEF txt243 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 1 0.390469 APEX 0.875 1 0.484531 RAD 0.0078125 + txt243 +TEXDEF txt243 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 1 0.5 RAD 0.03125 + txt243 +TEXDEF txt243 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 1 0.5 APEX 0.984531 1 0.5 RAD 0.0078125 + txt243 +TEXDEF txt243 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 1 0.515469 APEX 0.875 1 0.609531 RAD 0.0078125 + txt243 +TEXDEF txt243 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 1 0.625 RAD 0.03125 + txt243 +TEXDEF txt243 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 1 0.625 APEX 0.984531 1 0.625 RAD 0.0078125 + txt243 +TEXDEF txt244 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 1 0.640469 APEX 0.875 1 0.734531 RAD 0.0078125 + txt244 +TEXDEF txt244 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 1 0.75 RAD 0.03125 + txt244 +TEXDEF txt244 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 1 0.75 APEX 0.984531 1 0.75 RAD 0.0078125 + txt244 +TEXDEF txt244 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 1 0.765469 APEX 0.875 1 0.859531 RAD 0.0078125 + txt244 +TEXDEF txt244 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 1 0.875 RAD 0.03125 + txt244 +TEXDEF txt244 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 1 0.875 APEX 0.984531 1 0.875 RAD 0.0078125 + txt244 +TEXDEF txt244 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 0.875 1 0.890469 APEX 0.875 1 0.984531 RAD 0.0078125 + txt244 +TEXDEF txt244 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 0.875 1 1 RAD 0.03125 + txt244 +TEXDEF txt244 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.9 0.1 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 0.890469 1 1 APEX 0.984531 1 1 RAD 0.0078125 + txt244 +TEXDEF txt244 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0 0 RAD 0.03125 + txt244 +TEXDEF txt245 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.0154687 0 APEX 1 0.109531 0 RAD 0.0078125 + txt245 +TEXDEF txt245 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 0 0.0154687 APEX 1 0 0.109531 RAD 0.0078125 + txt245 +TEXDEF txt245 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0 0.125 RAD 0.03125 + txt245 +TEXDEF txt245 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.0154687 0.125 APEX 1 0.109531 0.125 RAD 0.0078125 + txt245 +TEXDEF txt245 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 0 0.140469 APEX 1 0 0.234531 RAD 0.0078125 + txt245 +TEXDEF txt245 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0 0.25 RAD 0.03125 + txt245 +TEXDEF txt245 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.0154687 0.25 APEX 1 0.109531 0.25 RAD 0.0078125 + txt245 +TEXDEF txt245 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 0 0.265469 APEX 1 0 0.359531 RAD 0.0078125 + txt245 +TEXDEF txt245 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0 0.375 RAD 0.03125 + txt245 +TEXDEF txt245 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.0154687 0.375 APEX 1 0.109531 0.375 RAD 0.0078125 + txt245 +TEXDEF txt246 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 0 0.390469 APEX 1 0 0.484531 RAD 0.0078125 + txt246 +TEXDEF txt246 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0 0.5 RAD 0.03125 + txt246 +TEXDEF txt246 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.0154687 0.5 APEX 1 0.109531 0.5 RAD 0.0078125 + txt246 +TEXDEF txt246 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 0 0.515469 APEX 1 0 0.609531 RAD 0.0078125 + txt246 +TEXDEF txt246 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0 0.625 RAD 0.03125 + txt246 +TEXDEF txt246 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.0154687 0.625 APEX 1 0.109531 0.625 RAD 0.0078125 + txt246 +TEXDEF txt246 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 0 0.640469 APEX 1 0 0.734531 RAD 0.0078125 + txt246 +TEXDEF txt246 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0 0.75 RAD 0.03125 + txt246 +TEXDEF txt246 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.0154687 0.75 APEX 1 0.109531 0.75 RAD 0.0078125 + txt246 +TEXDEF txt246 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 0 0.765469 APEX 1 0 0.859531 RAD 0.0078125 + txt246 +TEXDEF txt247 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0 0.875 RAD 0.03125 + txt247 +TEXDEF txt247 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.0154687 0.875 APEX 1 0.109531 0.875 RAD 0.0078125 + txt247 +TEXDEF txt247 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 0 0.890469 APEX 1 0 0.984531 RAD 0.0078125 + txt247 +TEXDEF txt247 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0 1 RAD 0.03125 + txt247 +TEXDEF txt247 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.0154687 1 APEX 1 0.109531 1 RAD 0.0078125 + txt247 +TEXDEF txt247 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0.125 0 RAD 0.03125 + txt247 +TEXDEF txt247 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.140469 0 APEX 1 0.234531 0 RAD 0.0078125 + txt247 +TEXDEF txt247 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.125 0.0154687 APEX 1 0.125 0.109531 RAD 0.0078125 + txt247 +TEXDEF txt247 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0.125 0.125 RAD 0.03125 + txt247 +TEXDEF txt247 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.140469 0.125 APEX 1 0.234531 0.125 RAD 0.0078125 + txt247 +TEXDEF txt248 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.125 0.140469 APEX 1 0.125 0.234531 RAD 0.0078125 + txt248 +TEXDEF txt248 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0.125 0.25 RAD 0.03125 + txt248 +TEXDEF txt248 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.140469 0.25 APEX 1 0.234531 0.25 RAD 0.0078125 + txt248 +TEXDEF txt248 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.125 0.265469 APEX 1 0.125 0.359531 RAD 0.0078125 + txt248 +TEXDEF txt248 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0.125 0.375 RAD 0.03125 + txt248 +TEXDEF txt248 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.140469 0.375 APEX 1 0.234531 0.375 RAD 0.0078125 + txt248 +TEXDEF txt248 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.125 0.390469 APEX 1 0.125 0.484531 RAD 0.0078125 + txt248 +TEXDEF txt248 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0.125 0.5 RAD 0.03125 + txt248 +TEXDEF txt248 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.140469 0.5 APEX 1 0.234531 0.5 RAD 0.0078125 + txt248 +TEXDEF txt248 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.125 0.515469 APEX 1 0.125 0.609531 RAD 0.0078125 + txt248 +TEXDEF txt249 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0.125 0.625 RAD 0.03125 + txt249 +TEXDEF txt249 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.140469 0.625 APEX 1 0.234531 0.625 RAD 0.0078125 + txt249 +TEXDEF txt249 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.125 0.640469 APEX 1 0.125 0.734531 RAD 0.0078125 + txt249 +TEXDEF txt249 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0.125 0.75 RAD 0.03125 + txt249 +TEXDEF txt249 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.140469 0.75 APEX 1 0.234531 0.75 RAD 0.0078125 + txt249 +TEXDEF txt249 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.125 0.765469 APEX 1 0.125 0.859531 RAD 0.0078125 + txt249 +TEXDEF txt249 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0.125 0.875 RAD 0.03125 + txt249 +TEXDEF txt249 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.140469 0.875 APEX 1 0.234531 0.875 RAD 0.0078125 + txt249 +TEXDEF txt249 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.125 0.890469 APEX 1 0.125 0.984531 RAD 0.0078125 + txt249 +TEXDEF txt249 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0.125 1 RAD 0.03125 + txt249 +TEXDEF txt250 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.140469 1 APEX 1 0.234531 1 RAD 0.0078125 + txt250 +TEXDEF txt250 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0.25 0 RAD 0.03125 + txt250 +TEXDEF txt250 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.265469 0 APEX 1 0.359531 0 RAD 0.0078125 + txt250 +TEXDEF txt250 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.25 0.0154687 APEX 1 0.25 0.109531 RAD 0.0078125 + txt250 +TEXDEF txt250 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0.25 0.125 RAD 0.03125 + txt250 +TEXDEF txt250 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.265469 0.125 APEX 1 0.359531 0.125 RAD 0.0078125 + txt250 +TEXDEF txt250 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.25 0.140469 APEX 1 0.25 0.234531 RAD 0.0078125 + txt250 +TEXDEF txt250 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0.25 0.25 RAD 0.03125 + txt250 +TEXDEF txt250 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.265469 0.25 APEX 1 0.359531 0.25 RAD 0.0078125 + txt250 +TEXDEF txt250 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.25 0.265469 APEX 1 0.25 0.359531 RAD 0.0078125 + txt250 +TEXDEF txt251 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0.25 0.375 RAD 0.03125 + txt251 +TEXDEF txt251 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.265469 0.375 APEX 1 0.359531 0.375 RAD 0.0078125 + txt251 +TEXDEF txt251 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.25 0.390469 APEX 1 0.25 0.484531 RAD 0.0078125 + txt251 +TEXDEF txt251 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0.25 0.5 RAD 0.03125 + txt251 +TEXDEF txt251 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.265469 0.5 APEX 1 0.359531 0.5 RAD 0.0078125 + txt251 +TEXDEF txt251 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.25 0.515469 APEX 1 0.25 0.609531 RAD 0.0078125 + txt251 +TEXDEF txt251 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0.25 0.625 RAD 0.03125 + txt251 +TEXDEF txt251 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.265469 0.625 APEX 1 0.359531 0.625 RAD 0.0078125 + txt251 +TEXDEF txt251 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.25 0.640469 APEX 1 0.25 0.734531 RAD 0.0078125 + txt251 +TEXDEF txt251 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0.25 0.75 RAD 0.03125 + txt251 +TEXDEF txt252 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.265469 0.75 APEX 1 0.359531 0.75 RAD 0.0078125 + txt252 +TEXDEF txt252 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.25 0.765469 APEX 1 0.25 0.859531 RAD 0.0078125 + txt252 +TEXDEF txt252 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0.25 0.875 RAD 0.03125 + txt252 +TEXDEF txt252 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.265469 0.875 APEX 1 0.359531 0.875 RAD 0.0078125 + txt252 +TEXDEF txt252 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.25 0.890469 APEX 1 0.25 0.984531 RAD 0.0078125 + txt252 +TEXDEF txt252 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0.25 1 RAD 0.03125 + txt252 +TEXDEF txt252 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.265469 1 APEX 1 0.359531 1 RAD 0.0078125 + txt252 +TEXDEF txt252 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0.375 0 RAD 0.03125 + txt252 +TEXDEF txt252 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.390469 0 APEX 1 0.484531 0 RAD 0.0078125 + txt252 +TEXDEF txt252 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.375 0.0154687 APEX 1 0.375 0.109531 RAD 0.0078125 + txt252 +TEXDEF txt253 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0.375 0.125 RAD 0.03125 + txt253 +TEXDEF txt253 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.390469 0.125 APEX 1 0.484531 0.125 RAD 0.0078125 + txt253 +TEXDEF txt253 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.375 0.140469 APEX 1 0.375 0.234531 RAD 0.0078125 + txt253 +TEXDEF txt253 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0.375 0.25 RAD 0.03125 + txt253 +TEXDEF txt253 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.390469 0.25 APEX 1 0.484531 0.25 RAD 0.0078125 + txt253 +TEXDEF txt253 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.375 0.265469 APEX 1 0.375 0.359531 RAD 0.0078125 + txt253 +TEXDEF txt253 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0.375 0.375 RAD 0.03125 + txt253 +TEXDEF txt253 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.390469 0.375 APEX 1 0.484531 0.375 RAD 0.0078125 + txt253 +TEXDEF txt253 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.375 0.390469 APEX 1 0.375 0.484531 RAD 0.0078125 + txt253 +TEXDEF txt253 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0.375 0.5 RAD 0.03125 + txt253 +TEXDEF txt254 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.390469 0.5 APEX 1 0.484531 0.5 RAD 0.0078125 + txt254 +TEXDEF txt254 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.375 0.515469 APEX 1 0.375 0.609531 RAD 0.0078125 + txt254 +TEXDEF txt254 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0.375 0.625 RAD 0.03125 + txt254 +TEXDEF txt254 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.390469 0.625 APEX 1 0.484531 0.625 RAD 0.0078125 + txt254 +TEXDEF txt254 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.375 0.640469 APEX 1 0.375 0.734531 RAD 0.0078125 + txt254 +TEXDEF txt254 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0.375 0.75 RAD 0.03125 + txt254 +TEXDEF txt254 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.390469 0.75 APEX 1 0.484531 0.75 RAD 0.0078125 + txt254 +TEXDEF txt254 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.375 0.765469 APEX 1 0.375 0.859531 RAD 0.0078125 + txt254 +TEXDEF txt254 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0.375 0.875 RAD 0.03125 + txt254 +TEXDEF txt254 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.390469 0.875 APEX 1 0.484531 0.875 RAD 0.0078125 + txt254 +TEXDEF txt255 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.375 0.890469 APEX 1 0.375 0.984531 RAD 0.0078125 + txt255 +TEXDEF txt255 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0.375 1 RAD 0.03125 + txt255 +TEXDEF txt255 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.390469 1 APEX 1 0.484531 1 RAD 0.0078125 + txt255 +TEXDEF txt255 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0.5 0 RAD 0.03125 + txt255 +TEXDEF txt255 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.515469 0 APEX 1 0.609531 0 RAD 0.0078125 + txt255 +TEXDEF txt255 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.5 0.0154687 APEX 1 0.5 0.109531 RAD 0.0078125 + txt255 +TEXDEF txt255 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0.5 0.125 RAD 0.03125 + txt255 +TEXDEF txt255 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.515469 0.125 APEX 1 0.609531 0.125 RAD 0.0078125 + txt255 +TEXDEF txt255 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.5 0.140469 APEX 1 0.5 0.234531 RAD 0.0078125 + txt255 +TEXDEF txt255 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0.5 0.25 RAD 0.03125 + txt255 +TEXDEF txt256 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.515469 0.25 APEX 1 0.609531 0.25 RAD 0.0078125 + txt256 +TEXDEF txt256 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.5 0.265469 APEX 1 0.5 0.359531 RAD 0.0078125 + txt256 +TEXDEF txt256 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0.5 0.375 RAD 0.03125 + txt256 +TEXDEF txt256 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.515469 0.375 APEX 1 0.609531 0.375 RAD 0.0078125 + txt256 +TEXDEF txt256 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.5 0.390469 APEX 1 0.5 0.484531 RAD 0.0078125 + txt256 +TEXDEF txt256 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0.5 0.5 RAD 0.03125 + txt256 +TEXDEF txt256 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.515469 0.5 APEX 1 0.609531 0.5 RAD 0.0078125 + txt256 +TEXDEF txt256 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.5 0.515469 APEX 1 0.5 0.609531 RAD 0.0078125 + txt256 +TEXDEF txt256 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0.5 0.625 RAD 0.03125 + txt256 +TEXDEF txt256 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.515469 0.625 APEX 1 0.609531 0.625 RAD 0.0078125 + txt256 +TEXDEF txt257 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.5 0.640469 APEX 1 0.5 0.734531 RAD 0.0078125 + txt257 +TEXDEF txt257 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0.5 0.75 RAD 0.03125 + txt257 +TEXDEF txt257 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.515469 0.75 APEX 1 0.609531 0.75 RAD 0.0078125 + txt257 +TEXDEF txt257 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.5 0.765469 APEX 1 0.5 0.859531 RAD 0.0078125 + txt257 +TEXDEF txt257 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0.5 0.875 RAD 0.03125 + txt257 +TEXDEF txt257 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.515469 0.875 APEX 1 0.609531 0.875 RAD 0.0078125 + txt257 +TEXDEF txt257 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.5 0.890469 APEX 1 0.5 0.984531 RAD 0.0078125 + txt257 +TEXDEF txt257 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0.5 1 RAD 0.03125 + txt257 +TEXDEF txt257 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.515469 1 APEX 1 0.609531 1 RAD 0.0078125 + txt257 +TEXDEF txt257 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0.625 0 RAD 0.03125 + txt257 +TEXDEF txt258 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.640469 0 APEX 1 0.734531 0 RAD 0.0078125 + txt258 +TEXDEF txt258 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.625 0.0154687 APEX 1 0.625 0.109531 RAD 0.0078125 + txt258 +TEXDEF txt258 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0.625 0.125 RAD 0.03125 + txt258 +TEXDEF txt258 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.640469 0.125 APEX 1 0.734531 0.125 RAD 0.0078125 + txt258 +TEXDEF txt258 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.625 0.140469 APEX 1 0.625 0.234531 RAD 0.0078125 + txt258 +TEXDEF txt258 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0.625 0.25 RAD 0.03125 + txt258 +TEXDEF txt258 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.640469 0.25 APEX 1 0.734531 0.25 RAD 0.0078125 + txt258 +TEXDEF txt258 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.625 0.265469 APEX 1 0.625 0.359531 RAD 0.0078125 + txt258 +TEXDEF txt258 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0.625 0.375 RAD 0.03125 + txt258 +TEXDEF txt258 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.640469 0.375 APEX 1 0.734531 0.375 RAD 0.0078125 + txt258 +TEXDEF txt259 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.625 0.390469 APEX 1 0.625 0.484531 RAD 0.0078125 + txt259 +TEXDEF txt259 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0.625 0.5 RAD 0.03125 + txt259 +TEXDEF txt259 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.640469 0.5 APEX 1 0.734531 0.5 RAD 0.0078125 + txt259 +TEXDEF txt259 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.625 0.515469 APEX 1 0.625 0.609531 RAD 0.0078125 + txt259 +TEXDEF txt259 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0.625 0.625 RAD 0.03125 + txt259 +TEXDEF txt259 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.640469 0.625 APEX 1 0.734531 0.625 RAD 0.0078125 + txt259 +TEXDEF txt259 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.625 0.640469 APEX 1 0.625 0.734531 RAD 0.0078125 + txt259 +TEXDEF txt259 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0.625 0.75 RAD 0.03125 + txt259 +TEXDEF txt259 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.640469 0.75 APEX 1 0.734531 0.75 RAD 0.0078125 + txt259 +TEXDEF txt259 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.625 0.765469 APEX 1 0.625 0.859531 RAD 0.0078125 + txt259 +TEXDEF txt260 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0.625 0.875 RAD 0.03125 + txt260 +TEXDEF txt260 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.640469 0.875 APEX 1 0.734531 0.875 RAD 0.0078125 + txt260 +TEXDEF txt260 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.625 0.890469 APEX 1 0.625 0.984531 RAD 0.0078125 + txt260 +TEXDEF txt260 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0.625 1 RAD 0.03125 + txt260 +TEXDEF txt260 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.640469 1 APEX 1 0.734531 1 RAD 0.0078125 + txt260 +TEXDEF txt260 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0.75 0 RAD 0.03125 + txt260 +TEXDEF txt260 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.765469 0 APEX 1 0.859531 0 RAD 0.0078125 + txt260 +TEXDEF txt260 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.75 0.0154687 APEX 1 0.75 0.109531 RAD 0.0078125 + txt260 +TEXDEF txt260 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0.75 0.125 RAD 0.03125 + txt260 +TEXDEF txt260 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.765469 0.125 APEX 1 0.859531 0.125 RAD 0.0078125 + txt260 +TEXDEF txt261 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.75 0.140469 APEX 1 0.75 0.234531 RAD 0.0078125 + txt261 +TEXDEF txt261 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0.75 0.25 RAD 0.03125 + txt261 +TEXDEF txt261 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.765469 0.25 APEX 1 0.859531 0.25 RAD 0.0078125 + txt261 +TEXDEF txt261 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.75 0.265469 APEX 1 0.75 0.359531 RAD 0.0078125 + txt261 +TEXDEF txt261 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0.75 0.375 RAD 0.03125 + txt261 +TEXDEF txt261 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.765469 0.375 APEX 1 0.859531 0.375 RAD 0.0078125 + txt261 +TEXDEF txt261 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.75 0.390469 APEX 1 0.75 0.484531 RAD 0.0078125 + txt261 +TEXDEF txt261 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0.75 0.5 RAD 0.03125 + txt261 +TEXDEF txt261 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.765469 0.5 APEX 1 0.859531 0.5 RAD 0.0078125 + txt261 +TEXDEF txt261 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.75 0.515469 APEX 1 0.75 0.609531 RAD 0.0078125 + txt261 +TEXDEF txt262 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0.75 0.625 RAD 0.03125 + txt262 +TEXDEF txt262 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.765469 0.625 APEX 1 0.859531 0.625 RAD 0.0078125 + txt262 +TEXDEF txt262 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.75 0.640469 APEX 1 0.75 0.734531 RAD 0.0078125 + txt262 +TEXDEF txt262 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0.75 0.75 RAD 0.03125 + txt262 +TEXDEF txt262 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.765469 0.75 APEX 1 0.859531 0.75 RAD 0.0078125 + txt262 +TEXDEF txt262 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.75 0.765469 APEX 1 0.75 0.859531 RAD 0.0078125 + txt262 +TEXDEF txt262 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0.75 0.875 RAD 0.03125 + txt262 +TEXDEF txt262 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.765469 0.875 APEX 1 0.859531 0.875 RAD 0.0078125 + txt262 +TEXDEF txt262 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.75 0.890469 APEX 1 0.75 0.984531 RAD 0.0078125 + txt262 +TEXDEF txt262 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0.75 1 RAD 0.03125 + txt262 +TEXDEF txt263 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.765469 1 APEX 1 0.859531 1 RAD 0.0078125 + txt263 +TEXDEF txt263 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0.875 0 RAD 0.03125 + txt263 +TEXDEF txt263 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.890469 0 APEX 1 0.984531 0 RAD 0.0078125 + txt263 +TEXDEF txt263 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.875 0.0154687 APEX 1 0.875 0.109531 RAD 0.0078125 + txt263 +TEXDEF txt263 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0.875 0.125 RAD 0.03125 + txt263 +TEXDEF txt263 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.890469 0.125 APEX 1 0.984531 0.125 RAD 0.0078125 + txt263 +TEXDEF txt263 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.875 0.140469 APEX 1 0.875 0.234531 RAD 0.0078125 + txt263 +TEXDEF txt263 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0.875 0.25 RAD 0.03125 + txt263 +TEXDEF txt263 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.890469 0.25 APEX 1 0.984531 0.25 RAD 0.0078125 + txt263 +TEXDEF txt263 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.875 0.265469 APEX 1 0.875 0.359531 RAD 0.0078125 + txt263 +TEXDEF txt264 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0.875 0.375 RAD 0.03125 + txt264 +TEXDEF txt264 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.890469 0.375 APEX 1 0.984531 0.375 RAD 0.0078125 + txt264 +TEXDEF txt264 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.875 0.390469 APEX 1 0.875 0.484531 RAD 0.0078125 + txt264 +TEXDEF txt264 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0.875 0.5 RAD 0.03125 + txt264 +TEXDEF txt264 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.890469 0.5 APEX 1 0.984531 0.5 RAD 0.0078125 + txt264 +TEXDEF txt264 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.875 0.515469 APEX 1 0.875 0.609531 RAD 0.0078125 + txt264 +TEXDEF txt264 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0.875 0.625 RAD 0.03125 + txt264 +TEXDEF txt264 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.890469 0.625 APEX 1 0.984531 0.625 RAD 0.0078125 + txt264 +TEXDEF txt264 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.875 0.640469 APEX 1 0.875 0.734531 RAD 0.0078125 + txt264 +TEXDEF txt264 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0.875 0.75 RAD 0.03125 + txt264 +TEXDEF txt265 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.890469 0.75 APEX 1 0.984531 0.75 RAD 0.0078125 + txt265 +TEXDEF txt265 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.875 0.765469 APEX 1 0.875 0.859531 RAD 0.0078125 + txt265 +TEXDEF txt265 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0.875 0.875 RAD 0.03125 + txt265 +TEXDEF txt265 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.890469 0.875 APEX 1 0.984531 0.875 RAD 0.0078125 + txt265 +TEXDEF txt265 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.875 0.890469 APEX 1 0.875 0.984531 RAD 0.0078125 + txt265 +TEXDEF txt265 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 0.875 1 RAD 0.03125 + txt265 +TEXDEF txt265 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.9 0.1 + TEXFUNC 0 + +FCYLINDER + BASE 1 0.890469 1 APEX 1 0.984531 1 RAD 0.0078125 + txt265 +TEXDEF txt265 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 1 0 RAD 0.03125 + txt265 +TEXDEF txt265 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 1 0.0154687 APEX 1 1 0.109531 RAD 0.0078125 + txt265 +TEXDEF txt265 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 1 0.125 RAD 0.03125 + txt265 +TEXDEF txt266 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 1 0.140469 APEX 1 1 0.234531 RAD 0.0078125 + txt266 +TEXDEF txt266 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 1 0.25 RAD 0.03125 + txt266 +TEXDEF txt266 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 1 0.265469 APEX 1 1 0.359531 RAD 0.0078125 + txt266 +TEXDEF txt266 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 1 0.375 RAD 0.03125 + txt266 +TEXDEF txt266 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 1 0.390469 APEX 1 1 0.484531 RAD 0.0078125 + txt266 +TEXDEF txt266 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 1 0.5 RAD 0.03125 + txt266 +TEXDEF txt266 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 1 0.515469 APEX 1 1 0.609531 RAD 0.0078125 + txt266 +TEXDEF txt266 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 1 0.625 RAD 0.03125 + txt266 +TEXDEF txt266 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 1 0.640469 APEX 1 1 0.734531 RAD 0.0078125 + txt266 +TEXDEF txt266 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 1 0.75 RAD 0.03125 + txt266 +TEXDEF txt267 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 1 0.765469 APEX 1 1 0.859531 RAD 0.0078125 + txt267 +TEXDEF txt267 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 1 0.875 RAD 0.03125 + txt267 +TEXDEF txt267 AMBIENT 0.1 DIFFUSE 0.99 SPECULAR 0 OPACITY 1 + COLOR 0.1 0.1 0.9 + TEXFUNC 0 + +FCYLINDER + BASE 1 1 0.890469 APEX 1 1 0.984531 RAD 0.0078125 + txt267 +TEXDEF txt267 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 + COLOR 0.9 0.9 0.9 + TEXFUNC 0 + + SPHERE CENTER 1 1 1 RAD 0.03125 + txt267 + +END_SCENE diff --git a/xdl/third_party/tbb/examples/parallel_for/tachyon/dat/model2.dat b/xdl/third_party/tbb/examples/parallel_for/tachyon/dat/model2.dat new file mode 100644 index 00000000..c57ce49c --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/tachyon/dat/model2.dat @@ -0,0 +1,104 @@ +BEGIN_SCENE + OUTFILE /dev/null + RESOLUTION 512 512 + VERBOSE 0 + +CAMERA + ZOOM 1.0 + ASPECTRATIO 1.0 + ANTIALIASING 1 + RAYDEPTH 12 + CENTER 0.0 0.0 -5.0 + VIEWDIR 0.0 0.0 1.0 + UPDIR 0.0 1.0 0.0 +END_CAMERA + +LIGHT + CENTER -5.0 0.0 -4.0 + RAD 0.2 + COLOR 1.0 0.1 0.0 + +LIGHT + CENTER 4.0 5.0 -4.0 + RAD 0.2 + COLOR 0.0 0.1 1.0 + +LIGHT + CENTER 4.0 1.5 3.0 + RAD 0.2 + COLOR 0.5 0.5 0.5 + +TRI + V0 0.0 -4.0 12.0 + V1 4.0 -4.0 8.0 + V2 -4.0 -4.0 8.0 + TEXTURE + AMBIENT 0.1 DIFFUSE 0.2 SPECULAR 0.7 OPACITY 1.0 + COLOR 1.0 1.0 1.0 + TEXFUNC 0 + +SPHERE + CENTER 0.0 0.0 5.0 + RAD 1.3 + TEXTURE + AMBIENT 0.1 DIFFUSE 0.0 SPECULAR 0.9 OPACITY 1.0 + COLOR 1.0 1.0 1.0 + TEXFUNC 0 + +SPHERE + CENTER 1.0 0.0 4.3 + RAD 0.8 + TEXTURE + AMBIENT 0.1 DIFFUSE 0.9 SPECULAR 0.0 OPACITY 1.0 + COLOR 0.3 0.3 1.0 + TEXFUNC 3 + CENTER 1.0 0.0 4.3 + ROTATE 0. 0.0 0.0 + SCALE 1.0 1.0 1.0 + +SPHERE + CENTER 0.0 2.0 8.0 + RAD 1.0 + TEXTURE + AMBIENT 0.1 DIFFUSE 0.9 SPECULAR 0.0 OPACITY 1.0 + COLOR 1.0 0.0 1.0 + TEXFUNC 4 + CENTER 0.0 1.0 8.0 + ROTATE 0. 0.0 0.0 + SCALE 1.0 1.0 1.0 + +SPHERE + CENTER -1.0 -0.5 5.0 + RAD 1.0 + TEXTURE + AMBIENT 0.1 DIFFUSE 0.9 SPECULAR 0.0 OPACITY 1.0 + COLOR 1.0 1.0 0.5 + TEXFUNC 6 + CENTER -1.0 -0.5 5.0 + ROTATE 0. 0.0 0.0 + SCALE 1.0 1.0 1.0 + +PLANE + CENTER 0.0 -5.0 0.0 + NORMAL 0.0 1.0 0.0 + TEXTURE + AMBIENT 0.1 DIFFUSE 0.9 SPECULAR 0.0 OPACITY 1.0 + COLOR 1.0 1.0 1.0 + TEXFUNC 1 + CENTER 0.0 -5.0 0.0 + ROTATE 0. 0.0 0.0 + SCALE 1.0 1.0 1.0 + +PLANE + CENTER 0.0 0.0 15.0 + NORMAL 0.0 0.0 -1.0 + TEXTURE + AMBIENT 0.1 DIFFUSE 0.9 SPECULAR 0.0 OPACITY 1.0 + COLOR 1.0 1.0 1.0 + TEXFUNC 3 + CENTER 0.0 0.0 15.0 + ROTATE 0. 0.0 0.0 + SCALE 1.0 1.0 1.0 + +END_SCENE + diff --git a/xdl/third_party/tbb/examples/parallel_for/tachyon/dat/teapot.dat b/xdl/third_party/tbb/examples/parallel_for/tachyon/dat/teapot.dat new file mode 100644 index 00000000..105afcdd --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/tachyon/dat/teapot.dat @@ -0,0 +1,9279 @@ +BEGIN_SCENE + OUTFILE /dev/null + RESOLUTION 512 512 + VERBOSE 0 + +CAMERA + ZOOM 1.20711 +ASPECTRATIO 1.0 + ANTIALIASING 0 + RAYDEPTH 5 + CENTER 4.86 7.2 5.4 + VIEWDIR -0.475149 -0.703924 -0.527943 + UPDIR -0.29537 -0.437585 0.84928 + +END_CAMERA + +BACKGROUND 0.078 0.361 0.753 + +LIGHT CENTER -3.1 9.8 12.1 RAD 0.002 COLOR 0.5 0.5 0.5 + +LIGHT CENTER 11.3 5.1 8.8 RAD 0.002 COLOR 0.5 0.5 0.5 + +TEXDEF txt001 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 +PHONG METAL 0.5 PHONG_SIZE 4.81884 + COLOR 1 1 1 + TEXFUNC 0 + +TRI + V0 -4 -2.66667 0 V1 -2.66667 -2.66667 0 V2 -4 -1.33333 0 + txt001 +TRI + V0 -2.66667 -2.66667 0 V1 -2.66667 -1.33333 0 V2 -4 -1.33333 0 + txt001 +TRI + V0 -4 0 0 V1 -2.66667 0 0 V2 -4 1.33333 0 + txt001 +TRI + V0 -2.66667 0 0 V1 -2.66667 1.33333 0 V2 -4 1.33333 0 + txt001 +TRI + V0 -4 2.66667 0 V1 -2.66667 2.66667 0 V2 -4 4 0 + txt001 +TRI + V0 -2.66667 2.66667 0 V1 -2.66667 4 0 V2 -4 4 0 + txt001 +TRI + V0 -2.66667 -4 0 V1 -1.33333 -4 0 V2 -2.66667 -2.66667 0 + txt001 +TRI + V0 -1.33333 -4 0 V1 -1.33333 -2.66667 0 V2 -2.66667 -2.66667 0 + txt001 +TRI + V0 -2.66667 -1.33333 0 V1 -1.33333 -1.33333 0 V2 -2.66667 0 0 + txt001 +TRI + V0 -1.33333 -1.33333 0 V1 -1.33333 0 0 V2 -2.66667 0 0 + txt001 +TRI + V0 -2.66667 1.33333 0 V1 -1.33333 1.33333 0 V2 -2.66667 2.66667 0 + txt001 +TRI + V0 -1.33333 1.33333 0 V1 -1.33333 2.66667 0 V2 -2.66667 2.66667 0 + txt001 +TRI + V0 -1.33333 -2.66667 0 V1 0 -2.66667 0 V2 -1.33333 -1.33333 0 + txt001 +TRI + V0 0 -2.66667 0 V1 0 -1.33333 0 V2 -1.33333 -1.33333 0 + txt001 +TRI + V0 -1.33333 0 0 V1 0 0 0 V2 -1.33333 1.33333 0 + txt001 +TRI + V0 0 0 0 V1 0 1.33333 0 V2 -1.33333 1.33333 0 + txt001 +TRI + V0 -1.33333 2.66667 0 V1 0 2.66667 0 V2 -1.33333 4 0 + txt001 +TRI + V0 0 2.66667 0 V1 0 4 0 V2 -1.33333 4 0 + txt001 +TRI + V0 0 -4 0 V1 1.33333 -4 0 V2 0 -2.66667 0 + txt001 +TRI + V0 1.33333 -4 0 V1 1.33333 -2.66667 0 V2 0 -2.66667 0 + txt001 +TRI + V0 0 -1.33333 0 V1 1.33333 -1.33333 0 V2 0 0 0 + txt001 +TRI + V0 1.33333 -1.33333 0 V1 1.33333 0 0 V2 0 0 0 + txt001 +TRI + V0 0 1.33333 0 V1 1.33333 1.33333 0 V2 0 2.66667 0 + txt001 +TRI + V0 1.33333 1.33333 0 V1 1.33333 2.66667 0 V2 0 2.66667 0 + txt001 +TRI + V0 1.33333 -2.66667 0 V1 2.66667 -2.66667 0 V2 1.33333 -1.33333 0 + txt001 +TRI + V0 2.66667 -2.66667 0 V1 2.66667 -1.33333 0 V2 1.33333 -1.33333 0 + txt001 +TRI + V0 1.33333 0 0 V1 2.66667 0 0 V2 1.33333 1.33333 0 + txt001 +TRI + V0 2.66667 0 0 V1 2.66667 1.33333 0 V2 1.33333 1.33333 0 + txt001 +TRI + V0 1.33333 2.66667 0 V1 2.66667 2.66667 0 V2 1.33333 4 0 + txt001 +TRI + V0 2.66667 2.66667 0 V1 2.66667 4 0 V2 1.33333 4 0 + txt001 +TRI + V0 2.66667 -4 0 V1 4 -4 0 V2 2.66667 -2.66667 0 + txt001 +TRI + V0 4 -4 0 V1 4 -2.66667 0 V2 2.66667 -2.66667 0 + txt001 +TRI + V0 2.66667 -1.33333 0 V1 4 -1.33333 0 V2 2.66667 0 0 + txt001 +TRI + V0 4 -1.33333 0 V1 4 0 0 V2 2.66667 0 0 + txt001 +TRI + V0 2.66667 1.33333 0 V1 4 1.33333 0 V2 2.66667 2.66667 0 + txt001 +TRI + V0 4 1.33333 0 V1 4 2.66667 0 V2 2.66667 2.66667 0 + txt001 +TEXDEF txt002 AMBIENT 0 DIFFUSE 0.5 SPECULAR 0.5 OPACITY 1 +PHONG METAL 0.5 PHONG_SIZE 4.81884 + COLOR 0.5 0.5 0.5 + TEXFUNC 0 + +TRI + V0 -4 -4 0 V1 -2.66667 -4 0 V2 -4 -2.66667 0 + txt002 +TRI + V0 -2.66667 -4 0 V1 -2.66667 -2.66667 0 V2 -4 -2.66667 0 + txt002 +TRI + V0 -4 -1.33333 0 V1 -2.66667 -1.33333 0 V2 -4 0 0 + txt002 +TRI + V0 -2.66667 -1.33333 0 V1 -2.66667 0 0 V2 -4 0 0 + txt002 +TRI + V0 -4 1.33333 0 V1 -2.66667 1.33333 0 V2 -4 2.66667 0 + txt002 +TRI + V0 -2.66667 1.33333 0 V1 -2.66667 2.66667 0 V2 -4 2.66667 0 + txt002 +TRI + V0 -2.66667 -2.66667 0 V1 -1.33333 -2.66667 0 V2 -2.66667 -1.33333 0 + txt002 +TRI + V0 -1.33333 -2.66667 0 V1 -1.33333 -1.33333 0 V2 -2.66667 -1.33333 0 + txt002 +TRI + V0 -2.66667 0 0 V1 -1.33333 0 0 V2 -2.66667 1.33333 0 + txt002 +TRI + V0 -1.33333 0 0 V1 -1.33333 1.33333 0 V2 -2.66667 1.33333 0 + txt002 +TRI + V0 -2.66667 2.66667 0 V1 -1.33333 2.66667 0 V2 -2.66667 4 0 + txt002 +TRI + V0 -1.33333 2.66667 0 V1 -1.33333 4 0 V2 -2.66667 4 0 + txt002 +TRI + V0 -1.33333 -4 0 V1 0 -4 0 V2 -1.33333 -2.66667 0 + txt002 +TRI + V0 0 -4 0 V1 0 -2.66667 0 V2 -1.33333 -2.66667 0 + txt002 +TRI + V0 -1.33333 -1.33333 0 V1 0 -1.33333 0 V2 -1.33333 0 0 + txt002 +TRI + V0 0 -1.33333 0 V1 0 0 0 V2 -1.33333 0 0 + txt002 +TRI + V0 -1.33333 1.33333 0 V1 0 1.33333 0 V2 -1.33333 2.66667 0 + txt002 +TRI + V0 0 1.33333 0 V1 0 2.66667 0 V2 -1.33333 2.66667 0 + txt002 +TRI + V0 0 -2.66667 0 V1 1.33333 -2.66667 0 V2 0 -1.33333 0 + txt002 +TRI + V0 1.33333 -2.66667 0 V1 1.33333 -1.33333 0 V2 0 -1.33333 0 + txt002 +TRI + V0 0 0 0 V1 1.33333 0 0 V2 0 1.33333 0 + txt002 +TRI + V0 1.33333 0 0 V1 1.33333 1.33333 0 V2 0 1.33333 0 + txt002 +TRI + V0 0 2.66667 0 V1 1.33333 2.66667 0 V2 0 4 0 + txt002 +TRI + V0 1.33333 2.66667 0 V1 1.33333 4 0 V2 0 4 0 + txt002 +TRI + V0 1.33333 -4 0 V1 2.66667 -4 0 V2 1.33333 -2.66667 0 + txt002 +TRI + V0 2.66667 -4 0 V1 2.66667 -2.66667 0 V2 1.33333 -2.66667 0 + txt002 +TRI + V0 1.33333 -1.33333 0 V1 2.66667 -1.33333 0 V2 1.33333 0 0 + txt002 +TRI + V0 2.66667 -1.33333 0 V1 2.66667 0 0 V2 1.33333 0 0 + txt002 +TRI + V0 1.33333 1.33333 0 V1 2.66667 1.33333 0 V2 1.33333 2.66667 0 + txt002 +TRI + V0 2.66667 1.33333 0 V1 2.66667 2.66667 0 V2 1.33333 2.66667 0 + txt002 +TRI + V0 2.66667 -2.66667 0 V1 4 -2.66667 0 V2 2.66667 -1.33333 0 + txt002 +TRI + V0 4 -2.66667 0 V1 4 -1.33333 0 V2 2.66667 -1.33333 0 + txt002 +TRI + V0 2.66667 0 0 V1 4 0 0 V2 2.66667 1.33333 0 + txt002 +TRI + V0 4 0 0 V1 4 1.33333 0 V2 2.66667 1.33333 0 + txt002 +TRI + V0 2.66667 2.66667 0 V1 4 2.66667 0 V2 2.66667 4 0 + txt002 +TRI + V0 4 2.66667 0 V1 4 4 0 V2 2.66667 4 0 + txt002 +TEXDEF txt003 AMBIENT 0 DIFFUSE 0.75 SPECULAR 0.25 OPACITY 1 +PHONG PLASTIC 0.25 PHONG_SIZE 45.2776 + COLOR 1 0.5 0.1 + TEXFUNC 0 + +STRI + V0 1.4 0 2.4 V1 1.35074 -0.375926 2.4 V2 1.33276 -0.370922 2.45469 + N0 -0.902861 -0 -0.429934 N1 -0.871509 0.234929 -0.430442 N2 -0.953562 0.257047 -0.156989 + txt003 +STRI + V0 1.33276 -0.370922 2.45469 V1 1.38137 0 2.45469 V2 1.4 0 2.4 + N0 -0.953562 0.257047 -0.156989 N1 -0.987636 -0 -0.156768 N2 -0.902861 -0 -0.429934 + txt003 +STRI + V0 1.35074 -0.375926 2.4 V1 1.21126 -0.711407 2.4 V2 1.19514 -0.701938 2.45469 + N0 -0.871509 0.234929 -0.430442 N1 -0.780517 0.4527 -0.43111 N2 -0.854265 0.495474 -0.157281 + txt003 +STRI + V0 1.19514 -0.701938 2.45469 V1 1.33276 -0.370922 2.45469 V2 1.35074 -0.375926 2.4 + N0 -0.854265 0.495474 -0.157281 N1 -0.953562 0.257047 -0.156989 N2 -0.871509 0.234929 -0.430442 + txt003 +STRI + V0 1.21126 -0.711407 2.4 V1 0.994 -0.994 2.4 V2 0.98077 -0.98077 2.45469 + N0 -0.780517 0.4527 -0.43111 N1 -0.637936 0.637936 -0.431366 N2 -0.698293 0.698293 -0.157393 + txt003 +STRI + V0 0.98077 -0.98077 2.45469 V1 1.19514 -0.701938 2.45469 V2 1.21126 -0.711407 2.4 + N0 -0.698293 0.698293 -0.157393 N1 -0.854265 0.495474 -0.157281 N2 -0.780517 0.4527 -0.43111 + txt003 +STRI + V0 0.994 -0.994 2.4 V1 0.711407 -1.21126 2.4 V2 0.701938 -1.19514 2.45469 + N0 -0.637936 0.637936 -0.431366 N1 -0.4527 0.780517 -0.43111 N2 -0.495474 0.854265 -0.157281 + txt003 +STRI + V0 0.701938 -1.19514 2.45469 V1 0.98077 -0.98077 2.45469 V2 0.994 -0.994 2.4 + N0 -0.495474 0.854265 -0.157281 N1 -0.698293 0.698293 -0.157393 N2 -0.637936 0.637936 -0.431366 + txt003 +STRI + V0 0.711407 -1.21126 2.4 V1 0.375926 -1.35074 2.4 V2 0.370922 -1.33276 2.45469 + N0 -0.4527 0.780517 -0.43111 N1 -0.234929 0.871509 -0.430442 N2 -0.257047 0.953562 -0.156989 + txt003 +STRI + V0 0.370922 -1.33276 2.45469 V1 0.701938 -1.19514 2.45469 V2 0.711407 -1.21126 2.4 + N0 -0.257047 0.953562 -0.156989 N1 -0.495474 0.854265 -0.157281 N2 -0.4527 0.780517 -0.43111 + txt003 +STRI + V0 0.375926 -1.35074 2.4 V1 0 -1.4 2.4 V2 0 -1.38137 2.45469 + N0 -0.234929 0.871509 -0.430442 N1 7.30595e-17 0.902861 -0.429934 N2 -9.89971e-17 0.987636 -0.156768 + txt003 +STRI + V0 0 -1.38137 2.45469 V1 0.370922 -1.33276 2.45469 V2 0.375926 -1.35074 2.4 + N0 -9.89971e-17 0.987636 -0.156768 N1 -0.257047 0.953562 -0.156989 N2 -0.234929 0.871509 -0.430442 + txt003 +STRI + V0 1.38137 0 2.45469 V1 1.33276 -0.370922 2.45469 V2 1.33555 -0.371699 2.4875 + N0 -0.987636 -0 -0.156768 N1 -0.953562 0.257047 -0.156989 N2 -0.849414 0.228972 0.475466 + txt003 +STRI + V0 1.33555 -0.371699 2.4875 V1 1.38426 0 2.4875 V2 1.38137 0 2.45469 + N0 -0.849414 0.228972 0.475466 N1 -0.880022 0 0.474933 N2 -0.987636 -0 -0.156768 + txt003 +STRI + V0 1.33276 -0.370922 2.45469 V1 1.19514 -0.701938 2.45469 V2 1.19764 -0.703409 2.4875 + N0 -0.953562 0.257047 -0.156989 N1 -0.854265 0.495474 -0.157281 N2 -0.760669 0.441188 0.476167 + txt003 +STRI + V0 1.19764 -0.703409 2.4875 V1 1.33555 -0.371699 2.4875 V2 1.33276 -0.370922 2.45469 + N0 -0.760669 0.441188 0.476167 N1 -0.849414 0.228972 0.475466 N2 -0.953562 0.257047 -0.156989 + txt003 +STRI + V0 1.19514 -0.701938 2.45469 V1 0.98077 -0.98077 2.45469 V2 0.982824 -0.982824 2.4875 + N0 -0.854265 0.495474 -0.157281 N1 -0.698293 0.698293 -0.157393 N2 -0.621695 0.621695 0.476435 + txt003 +STRI + V0 0.982824 -0.982824 2.4875 V1 1.19764 -0.703409 2.4875 V2 1.19514 -0.701938 2.45469 + N0 -0.621695 0.621695 0.476435 N1 -0.760669 0.441188 0.476167 N2 -0.854265 0.495474 -0.157281 + txt003 +STRI + V0 0.98077 -0.98077 2.45469 V1 0.701938 -1.19514 2.45469 V2 0.703409 -1.19764 2.4875 + N0 -0.698293 0.698293 -0.157393 N1 -0.495474 0.854265 -0.157281 N2 -0.441188 0.760669 0.476167 + txt003 +STRI + V0 0.703409 -1.19764 2.4875 V1 0.982824 -0.982824 2.4875 V2 0.98077 -0.98077 2.45469 + N0 -0.441188 0.760669 0.476167 N1 -0.621695 0.621695 0.476435 N2 -0.698293 0.698293 -0.157393 + txt003 +STRI + V0 0.701938 -1.19514 2.45469 V1 0.370922 -1.33276 2.45469 V2 0.371699 -1.33555 2.4875 + N0 -0.495474 0.854265 -0.157281 N1 -0.257047 0.953562 -0.156989 N2 -0.228972 0.849414 0.475466 + txt003 +STRI + V0 0.371699 -1.33555 2.4875 V1 0.703409 -1.19764 2.4875 V2 0.701938 -1.19514 2.45469 + N0 -0.228972 0.849414 0.475466 N1 -0.441188 0.760669 0.476167 N2 -0.495474 0.854265 -0.157281 + txt003 +STRI + V0 0.370922 -1.33276 2.45469 V1 0 -1.38137 2.45469 V2 0 -1.38426 2.4875 + N0 -0.257047 0.953562 -0.156989 N1 -9.89971e-17 0.987636 -0.156768 N2 -6.08179e-16 0.880022 0.474933 + txt003 +STRI + V0 0 -1.38426 2.4875 V1 0.371699 -1.33555 2.4875 V2 0.370922 -1.33276 2.45469 + N0 -6.08179e-16 0.880022 0.474933 N1 -0.228972 0.849414 0.475466 N2 -0.257047 0.953562 -0.156989 + txt003 +STRI + V0 1.38426 0 2.4875 V1 1.33555 -0.371699 2.4875 V2 1.35376 -0.376765 2.49844 + N0 -0.880022 0 0.474933 N1 -0.849414 0.228972 0.475466 N2 2.13636e-15 -5.93089e-16 1 + txt003 +STRI + V0 1.35376 -0.376765 2.49844 V1 1.40312 0 2.49844 V2 1.38426 0 2.4875 + N0 2.13636e-15 -5.93089e-16 1 N1 2.22045e-15 0 1 N2 -0.880022 0 0.474933 + txt003 +STRI + V0 1.33555 -0.371699 2.4875 V1 1.19764 -0.703409 2.4875 V2 1.21396 -0.712995 2.49844 + N0 -0.849414 0.228972 0.475466 N1 -0.760669 0.441188 0.476167 N2 1.87966e-15 -1.16933e-15 1 + txt003 +STRI + V0 1.21396 -0.712995 2.49844 V1 1.35376 -0.376765 2.49844 V2 1.33555 -0.371699 2.4875 + N0 1.87966e-15 -1.16933e-15 1 N1 2.13636e-15 -5.93089e-16 1 N2 -0.849414 0.228972 0.475466 + txt003 +STRI + V0 1.19764 -0.703409 2.4875 V1 0.982824 -0.982824 2.4875 V2 0.996219 -0.996219 2.49844 + N0 -0.760669 0.441188 0.476167 N1 -0.621695 0.621695 0.476435 N2 1.4538e-15 -1.67359e-15 1 + txt003 +STRI + V0 0.996219 -0.996219 2.49844 V1 1.21396 -0.712995 2.49844 V2 1.19764 -0.703409 2.4875 + N0 1.4538e-15 -1.67359e-15 1 N1 1.87966e-15 -1.16933e-15 1 N2 -0.760669 0.441188 0.476167 + txt003 +STRI + V0 0.982824 -0.982824 2.4875 V1 0.703409 -1.19764 2.4875 V2 0.712995 -1.21396 2.49844 + N0 -0.621695 0.621695 0.476435 N1 -0.441188 0.760669 0.476167 N2 8.74229e-16 -2.05298e-15 1 + txt003 +STRI + V0 0.712995 -1.21396 2.49844 V1 0.996219 -0.996219 2.49844 V2 0.982824 -0.982824 2.4875 + N0 8.74229e-16 -2.05298e-15 1 N1 1.4538e-15 -1.67359e-15 1 N2 -0.621695 0.621695 0.476435 + txt003 +STRI + V0 0.703409 -1.19764 2.4875 V1 0.371699 -1.33555 2.4875 V2 0.376765 -1.35376 2.49844 + N0 -0.441188 0.760669 0.476167 N1 -0.228972 0.849414 0.475466 N2 1.77072e-16 -2.25214e-15 1 + txt003 +STRI + V0 0.376765 -1.35376 2.49844 V1 0.712995 -1.21396 2.49844 V2 0.703409 -1.19764 2.4875 + N0 1.77072e-16 -2.25214e-15 1 N1 8.74229e-16 -2.05298e-15 1 N2 -0.441188 0.760669 0.476167 + txt003 +STRI + V0 0.371699 -1.33555 2.4875 V1 0 -1.38426 2.4875 V2 0 -1.40312 2.49844 + N0 -0.228972 0.849414 0.475466 N1 -6.08179e-16 0.880022 0.474933 N2 -5.65179e-16 -2.22045e-15 1 + txt003 +STRI + V0 0 -1.40312 2.49844 V1 0.376765 -1.35376 2.49844 V2 0.371699 -1.33555 2.4875 + N0 -5.65179e-16 -2.22045e-15 1 N1 1.77072e-16 -2.25214e-15 1 N2 -0.228972 0.849414 0.475466 + txt003 +STRI + V0 1.40312 0 2.49844 V1 1.35376 -0.376765 2.49844 V2 1.38201 -0.384628 2.4875 + N0 2.22045e-15 0 1 N1 2.13636e-15 -5.93089e-16 1 N2 0.537012 -0.14476 0.831061 + txt003 +STRI + V0 1.38201 -0.384628 2.4875 V1 1.43241 0 2.4875 V2 1.40312 0 2.49844 + N0 0.537012 -0.14476 0.831061 N1 0.556738 0 0.830688 N2 2.22045e-15 0 1 + txt003 +STRI + V0 1.35376 -0.376765 2.49844 V1 1.21396 -0.712995 2.49844 V2 1.2393 -0.727875 2.4875 + N0 2.13636e-15 -5.93089e-16 1 N1 1.87966e-15 -1.16933e-15 1 N2 0.480481 -0.278679 0.83155 + txt003 +STRI + V0 1.2393 -0.727875 2.4875 V1 1.38201 -0.384628 2.4875 V2 1.35376 -0.376765 2.49844 + N0 0.480481 -0.278679 0.83155 N1 0.537012 -0.14476 0.831061 N2 2.13636e-15 -5.93089e-16 1 + txt003 +STRI + V0 1.21396 -0.712995 2.49844 V1 0.996219 -0.996219 2.49844 V2 1.01701 -1.01701 2.4875 + N0 1.87966e-15 -1.16933e-15 1 N1 1.4538e-15 -1.67359e-15 1 N2 0.392564 -0.392564 0.831737 + txt003 +STRI + V0 1.01701 -1.01701 2.4875 V1 1.2393 -0.727875 2.4875 V2 1.21396 -0.712995 2.49844 + N0 0.392564 -0.392564 0.831737 N1 0.480481 -0.278679 0.83155 N2 1.87966e-15 -1.16933e-15 1 + txt003 +STRI + V0 0.996219 -0.996219 2.49844 V1 0.712995 -1.21396 2.49844 V2 0.727875 -1.2393 2.4875 + N0 1.4538e-15 -1.67359e-15 1 N1 8.74229e-16 -2.05298e-15 1 N2 0.278679 -0.480481 0.83155 + txt003 +STRI + V0 0.727875 -1.2393 2.4875 V1 1.01701 -1.01701 2.4875 V2 0.996219 -0.996219 2.49844 + N0 0.278679 -0.480481 0.83155 N1 0.392564 -0.392564 0.831737 N2 1.4538e-15 -1.67359e-15 1 + txt003 +STRI + V0 0.712995 -1.21396 2.49844 V1 0.376765 -1.35376 2.49844 V2 0.384628 -1.38201 2.4875 + N0 8.74229e-16 -2.05298e-15 1 N1 1.77072e-16 -2.25214e-15 1 N2 0.14476 -0.537012 0.831061 + txt003 +STRI + V0 0.384628 -1.38201 2.4875 V1 0.727875 -1.2393 2.4875 V2 0.712995 -1.21396 2.49844 + N0 0.14476 -0.537012 0.831061 N1 0.278679 -0.480481 0.83155 N2 8.74229e-16 -2.05298e-15 1 + txt003 +STRI + V0 0.376765 -1.35376 2.49844 V1 0 -1.40312 2.49844 V2 0 -1.43241 2.4875 + N0 1.77072e-16 -2.25214e-15 1 N1 -5.65179e-16 -2.22045e-15 1 N2 -4.5989e-16 -0.556738 0.830688 + txt003 +STRI + V0 0 -1.43241 2.4875 V1 0.384628 -1.38201 2.4875 V2 0.376765 -1.35376 2.49844 + N0 -4.5989e-16 -0.556738 0.830688 N1 0.14476 -0.537012 0.831061 N2 1.77072e-16 -2.25214e-15 1 + txt003 +STRI + V0 1.43241 0 2.4875 V1 1.38201 -0.384628 2.4875 V2 1.41495 -0.393796 2.45469 + N0 0.556738 0 0.830688 N1 0.537012 -0.14476 0.831061 N2 0.755869 -0.203756 0.622211 + txt003 +STRI + V0 1.41495 -0.393796 2.45469 V1 1.46655 0 2.45469 V2 1.43241 0 2.4875 + N0 0.755869 -0.203756 0.622211 N1 0.783289 0 0.621658 N2 0.556738 0 0.830688 + txt003 +STRI + V0 1.38201 -0.384628 2.4875 V1 1.2393 -0.727875 2.4875 V2 1.26884 -0.745225 2.45469 + N0 0.537012 -0.14476 0.831061 N1 0.480481 -0.278679 0.83155 N2 0.67669 -0.39248 0.622937 + txt003 +STRI + V0 1.26884 -0.745225 2.45469 V1 1.41495 -0.393796 2.45469 V2 1.38201 -0.384628 2.4875 + N0 0.67669 -0.39248 0.622937 N1 0.755869 -0.203756 0.622211 N2 0.537012 -0.14476 0.831061 + txt003 +STRI + V0 1.2393 -0.727875 2.4875 V1 1.01701 -1.01701 2.4875 V2 1.04125 -1.04125 2.45469 + N0 0.480481 -0.278679 0.83155 N1 0.392564 -0.392564 0.831737 N2 0.552993 -0.552993 0.623215 + txt003 +STRI + V0 1.04125 -1.04125 2.45469 V1 1.26884 -0.745225 2.45469 V2 1.2393 -0.727875 2.4875 + N0 0.552993 -0.552993 0.623215 N1 0.67669 -0.39248 0.622937 N2 0.480481 -0.278679 0.83155 + txt003 +STRI + V0 1.01701 -1.01701 2.4875 V1 0.727875 -1.2393 2.4875 V2 0.745225 -1.26884 2.45469 + N0 0.392564 -0.392564 0.831737 N1 0.278679 -0.480481 0.83155 N2 0.39248 -0.67669 0.622937 + txt003 +STRI + V0 0.745225 -1.26884 2.45469 V1 1.04125 -1.04125 2.45469 V2 1.01701 -1.01701 2.4875 + N0 0.39248 -0.67669 0.622937 N1 0.552993 -0.552993 0.623215 N2 0.392564 -0.392564 0.831737 + txt003 +STRI + V0 0.727875 -1.2393 2.4875 V1 0.384628 -1.38201 2.4875 V2 0.393796 -1.41495 2.45469 + N0 0.278679 -0.480481 0.83155 N1 0.14476 -0.537012 0.831061 N2 0.203756 -0.755869 0.622211 + txt003 +STRI + V0 0.393796 -1.41495 2.45469 V1 0.745225 -1.26884 2.45469 V2 0.727875 -1.2393 2.4875 + N0 0.203756 -0.755869 0.622211 N1 0.39248 -0.67669 0.622937 N2 0.278679 -0.480481 0.83155 + txt003 +STRI + V0 0.384628 -1.38201 2.4875 V1 0 -1.43241 2.4875 V2 0 -1.46655 2.45469 + N0 0.14476 -0.537012 0.831061 N1 -4.5989e-16 -0.556738 0.830688 N2 -1.94969e-16 -0.783289 0.621658 + txt003 +STRI + V0 0 -1.46655 2.45469 V1 0.393796 -1.41495 2.45469 V2 0.384628 -1.38201 2.4875 + N0 -1.94969e-16 -0.783289 0.621658 N1 0.203756 -0.755869 0.622211 N2 0.14476 -0.537012 0.831061 + txt003 +STRI + V0 1.46655 0 2.45469 V1 1.41495 -0.393796 2.45469 V2 1.44722 -0.402778 2.4 + N0 0.783289 0 0.621658 N1 0.755869 -0.203756 0.622211 N2 0.871509 -0.234929 0.430442 + txt003 +STRI + V0 1.44722 -0.402778 2.4 V1 1.5 0 2.4 V2 1.46655 0 2.45469 + N0 0.871509 -0.234929 0.430442 N1 0.902861 0 0.429934 N2 0.783289 0 0.621658 + txt003 +STRI + V0 1.41495 -0.393796 2.45469 V1 1.26884 -0.745225 2.45469 V2 1.29778 -0.762222 2.4 + N0 0.755869 -0.203756 0.622211 N1 0.67669 -0.39248 0.622937 N2 0.780517 -0.4527 0.43111 + txt003 +STRI + V0 1.29778 -0.762222 2.4 V1 1.44722 -0.402778 2.4 V2 1.41495 -0.393796 2.45469 + N0 0.780517 -0.4527 0.43111 N1 0.871509 -0.234929 0.430442 N2 0.755869 -0.203756 0.622211 + txt003 +STRI + V0 1.26884 -0.745225 2.45469 V1 1.04125 -1.04125 2.45469 V2 1.065 -1.065 2.4 + N0 0.67669 -0.39248 0.622937 N1 0.552993 -0.552993 0.623215 N2 0.637936 -0.637936 0.431366 + txt003 +STRI + V0 1.065 -1.065 2.4 V1 1.29778 -0.762222 2.4 V2 1.26884 -0.745225 2.45469 + N0 0.637936 -0.637936 0.431366 N1 0.780517 -0.4527 0.43111 N2 0.67669 -0.39248 0.622937 + txt003 +STRI + V0 1.04125 -1.04125 2.45469 V1 0.745225 -1.26884 2.45469 V2 0.762222 -1.29778 2.4 + N0 0.552993 -0.552993 0.623215 N1 0.39248 -0.67669 0.622937 N2 0.4527 -0.780517 0.43111 + txt003 +STRI + V0 0.762222 -1.29778 2.4 V1 1.065 -1.065 2.4 V2 1.04125 -1.04125 2.45469 + N0 0.4527 -0.780517 0.43111 N1 0.637936 -0.637936 0.431366 N2 0.552993 -0.552993 0.623215 + txt003 +STRI + V0 0.745225 -1.26884 2.45469 V1 0.393796 -1.41495 2.45469 V2 0.402778 -1.44722 2.4 + N0 0.39248 -0.67669 0.622937 N1 0.203756 -0.755869 0.622211 N2 0.234929 -0.871509 0.430442 + txt003 +STRI + V0 0.402778 -1.44722 2.4 V1 0.762222 -1.29778 2.4 V2 0.745225 -1.26884 2.45469 + N0 0.234929 -0.871509 0.430442 N1 0.4527 -0.780517 0.43111 N2 0.39248 -0.67669 0.622937 + txt003 +STRI + V0 0.393796 -1.41495 2.45469 V1 0 -1.46655 2.45469 V2 0 -1.5 2.4 + N0 0.203756 -0.755869 0.622211 N1 -1.94969e-16 -0.783289 0.621658 N2 -6.81889e-17 -0.902861 0.429934 + txt003 +STRI + V0 0 -1.5 2.4 V1 0.402778 -1.44722 2.4 V2 0.393796 -1.41495 2.45469 + N0 -6.81889e-17 -0.902861 0.429934 N1 0.234929 -0.871509 0.430442 N2 0.203756 -0.755869 0.622211 + txt003 +STRI + V0 0 -1.4 2.4 V1 -0.375926 -1.35074 2.4 V2 -0.370922 -1.33276 2.45469 + N0 0 0.902861 -0.429934 N1 0.234929 0.871509 -0.430442 N2 0.257047 0.953562 -0.156989 + txt003 +STRI + V0 -0.370922 -1.33276 2.45469 V1 0 -1.38137 2.45469 V2 0 -1.4 2.4 + N0 0.257047 0.953562 -0.156989 N1 0 0.987636 -0.156768 N2 0 0.902861 -0.429934 + txt003 +STRI + V0 -0.375926 -1.35074 2.4 V1 -0.711407 -1.21126 2.4 V2 -0.701938 -1.19514 2.45469 + N0 0.234929 0.871509 -0.430442 N1 0.4527 0.780517 -0.43111 N2 0.495474 0.854265 -0.157281 + txt003 +STRI + V0 -0.701938 -1.19514 2.45469 V1 -0.370922 -1.33276 2.45469 V2 -0.375926 -1.35074 2.4 + N0 0.495474 0.854265 -0.157281 N1 0.257047 0.953562 -0.156989 N2 0.234929 0.871509 -0.430442 + txt003 +STRI + V0 -0.711407 -1.21126 2.4 V1 -0.994 -0.994 2.4 V2 -0.98077 -0.98077 2.45469 + N0 0.4527 0.780517 -0.43111 N1 0.637936 0.637936 -0.431366 N2 0.698293 0.698293 -0.157393 + txt003 +STRI + V0 -0.98077 -0.98077 2.45469 V1 -0.701938 -1.19514 2.45469 V2 -0.711407 -1.21126 2.4 + N0 0.698293 0.698293 -0.157393 N1 0.495474 0.854265 -0.157281 N2 0.4527 0.780517 -0.43111 + txt003 +STRI + V0 -0.994 -0.994 2.4 V1 -1.21126 -0.711407 2.4 V2 -1.19514 -0.701938 2.45469 + N0 0.637936 0.637936 -0.431366 N1 0.780517 0.4527 -0.43111 N2 0.854265 0.495474 -0.157281 + txt003 +STRI + V0 -1.19514 -0.701938 2.45469 V1 -0.98077 -0.98077 2.45469 V2 -0.994 -0.994 2.4 + N0 0.854265 0.495474 -0.157281 N1 0.698293 0.698293 -0.157393 N2 0.637936 0.637936 -0.431366 + txt003 +STRI + V0 -1.21126 -0.711407 2.4 V1 -1.35074 -0.375926 2.4 V2 -1.33276 -0.370922 2.45469 + N0 0.780517 0.4527 -0.43111 N1 0.871509 0.234929 -0.430442 N2 0.953562 0.257047 -0.156989 + txt003 +STRI + V0 -1.33276 -0.370922 2.45469 V1 -1.19514 -0.701938 2.45469 V2 -1.21126 -0.711407 2.4 + N0 0.953562 0.257047 -0.156989 N1 0.854265 0.495474 -0.157281 N2 0.780517 0.4527 -0.43111 + txt003 +STRI + V0 -1.35074 -0.375926 2.4 V1 -1.4 0 2.4 V2 -1.38137 0 2.45469 + N0 0.871509 0.234929 -0.430442 N1 0.902861 -7.30595e-17 -0.429934 N2 0.987636 9.89971e-17 -0.156768 + txt003 +STRI + V0 -1.38137 0 2.45469 V1 -1.33276 -0.370922 2.45469 V2 -1.35074 -0.375926 2.4 + N0 0.987636 9.89971e-17 -0.156768 N1 0.953562 0.257047 -0.156989 N2 0.871509 0.234929 -0.430442 + txt003 +STRI + V0 0 -1.38137 2.45469 V1 -0.370922 -1.33276 2.45469 V2 -0.371699 -1.33555 2.4875 + N0 0 0.987636 -0.156768 N1 0.257047 0.953562 -0.156989 N2 0.228972 0.849414 0.475466 + txt003 +STRI + V0 -0.371699 -1.33555 2.4875 V1 0 -1.38426 2.4875 V2 0 -1.38137 2.45469 + N0 0.228972 0.849414 0.475466 N1 0 0.880022 0.474933 N2 0 0.987636 -0.156768 + txt003 +STRI + V0 -0.370922 -1.33276 2.45469 V1 -0.701938 -1.19514 2.45469 V2 -0.703409 -1.19764 2.4875 + N0 0.257047 0.953562 -0.156989 N1 0.495474 0.854265 -0.157281 N2 0.441188 0.760669 0.476167 + txt003 +STRI + V0 -0.703409 -1.19764 2.4875 V1 -0.371699 -1.33555 2.4875 V2 -0.370922 -1.33276 2.45469 + N0 0.441188 0.760669 0.476167 N1 0.228972 0.849414 0.475466 N2 0.257047 0.953562 -0.156989 + txt003 +STRI + V0 -0.701938 -1.19514 2.45469 V1 -0.98077 -0.98077 2.45469 V2 -0.982824 -0.982824 2.4875 + N0 0.495474 0.854265 -0.157281 N1 0.698293 0.698293 -0.157393 N2 0.621695 0.621695 0.476435 + txt003 +STRI + V0 -0.982824 -0.982824 2.4875 V1 -0.703409 -1.19764 2.4875 V2 -0.701938 -1.19514 2.45469 + N0 0.621695 0.621695 0.476435 N1 0.441188 0.760669 0.476167 N2 0.495474 0.854265 -0.157281 + txt003 +STRI + V0 -0.98077 -0.98077 2.45469 V1 -1.19514 -0.701938 2.45469 V2 -1.19764 -0.703409 2.4875 + N0 0.698293 0.698293 -0.157393 N1 0.854265 0.495474 -0.157281 N2 0.760669 0.441188 0.476167 + txt003 +STRI + V0 -1.19764 -0.703409 2.4875 V1 -0.982824 -0.982824 2.4875 V2 -0.98077 -0.98077 2.45469 + N0 0.760669 0.441188 0.476167 N1 0.621695 0.621695 0.476435 N2 0.698293 0.698293 -0.157393 + txt003 +STRI + V0 -1.19514 -0.701938 2.45469 V1 -1.33276 -0.370922 2.45469 V2 -1.33555 -0.371699 2.4875 + N0 0.854265 0.495474 -0.157281 N1 0.953562 0.257047 -0.156989 N2 0.849414 0.228972 0.475466 + txt003 +STRI + V0 -1.33555 -0.371699 2.4875 V1 -1.19764 -0.703409 2.4875 V2 -1.19514 -0.701938 2.45469 + N0 0.849414 0.228972 0.475466 N1 0.760669 0.441188 0.476167 N2 0.854265 0.495474 -0.157281 + txt003 +STRI + V0 -1.33276 -0.370922 2.45469 V1 -1.38137 0 2.45469 V2 -1.38426 0 2.4875 + N0 0.953562 0.257047 -0.156989 N1 0.987636 9.89971e-17 -0.156768 N2 0.880022 6.08179e-16 0.474933 + txt003 +STRI + V0 -1.38426 0 2.4875 V1 -1.33555 -0.371699 2.4875 V2 -1.33276 -0.370922 2.45469 + N0 0.880022 6.08179e-16 0.474933 N1 0.849414 0.228972 0.475466 N2 0.953562 0.257047 -0.156989 + txt003 +STRI + V0 0 -1.38426 2.4875 V1 -0.371699 -1.33555 2.4875 V2 -0.376765 -1.35376 2.49844 + N0 0 0.880022 0.474933 N1 0.228972 0.849414 0.475466 N2 -5.93089e-16 -2.13636e-15 1 + txt003 +STRI + V0 -0.376765 -1.35376 2.49844 V1 0 -1.40312 2.49844 V2 0 -1.38426 2.4875 + N0 -5.93089e-16 -2.13636e-15 1 N1 0 -2.22045e-15 1 N2 0 0.880022 0.474933 + txt003 +STRI + V0 -0.371699 -1.33555 2.4875 V1 -0.703409 -1.19764 2.4875 V2 -0.712995 -1.21396 2.49844 + N0 0.228972 0.849414 0.475466 N1 0.441188 0.760669 0.476167 N2 -1.16933e-15 -1.87966e-15 1 + txt003 +STRI + V0 -0.712995 -1.21396 2.49844 V1 -0.376765 -1.35376 2.49844 V2 -0.371699 -1.33555 2.4875 + N0 -1.16933e-15 -1.87966e-15 1 N1 -5.93089e-16 -2.13636e-15 1 N2 0.228972 0.849414 0.475466 + txt003 +STRI + V0 -0.703409 -1.19764 2.4875 V1 -0.982824 -0.982824 2.4875 V2 -0.996219 -0.996219 2.49844 + N0 0.441188 0.760669 0.476167 N1 0.621695 0.621695 0.476435 N2 -1.67359e-15 -1.4538e-15 1 + txt003 +STRI + V0 -0.996219 -0.996219 2.49844 V1 -0.712995 -1.21396 2.49844 V2 -0.703409 -1.19764 2.4875 + N0 -1.67359e-15 -1.4538e-15 1 N1 -1.16933e-15 -1.87966e-15 1 N2 0.441188 0.760669 0.476167 + txt003 +STRI + V0 -0.982824 -0.982824 2.4875 V1 -1.19764 -0.703409 2.4875 V2 -1.21396 -0.712995 2.49844 + N0 0.621695 0.621695 0.476435 N1 0.760669 0.441188 0.476167 N2 -2.05298e-15 -8.74229e-16 1 + txt003 +STRI + V0 -1.21396 -0.712995 2.49844 V1 -0.996219 -0.996219 2.49844 V2 -0.982824 -0.982824 2.4875 + N0 -2.05298e-15 -8.74229e-16 1 N1 -1.67359e-15 -1.4538e-15 1 N2 0.621695 0.621695 0.476435 + txt003 +STRI + V0 -1.19764 -0.703409 2.4875 V1 -1.33555 -0.371699 2.4875 V2 -1.35376 -0.376765 2.49844 + N0 0.760669 0.441188 0.476167 N1 0.849414 0.228972 0.475466 N2 -2.25214e-15 -1.77072e-16 1 + txt003 +STRI + V0 -1.35376 -0.376765 2.49844 V1 -1.21396 -0.712995 2.49844 V2 -1.19764 -0.703409 2.4875 + N0 -2.25214e-15 -1.77072e-16 1 N1 -2.05298e-15 -8.74229e-16 1 N2 0.760669 0.441188 0.476167 + txt003 +STRI + V0 -1.33555 -0.371699 2.4875 V1 -1.38426 0 2.4875 V2 -1.40312 0 2.49844 + N0 0.849414 0.228972 0.475466 N1 0.880022 6.08179e-16 0.474933 N2 -2.22045e-15 5.65179e-16 1 + txt003 +STRI + V0 -1.40312 0 2.49844 V1 -1.35376 -0.376765 2.49844 V2 -1.33555 -0.371699 2.4875 + N0 -2.22045e-15 5.65179e-16 1 N1 -2.25214e-15 -1.77072e-16 1 N2 0.849414 0.228972 0.475466 + txt003 +STRI + V0 0 -1.40312 2.49844 V1 -0.376765 -1.35376 2.49844 V2 -0.384628 -1.38201 2.4875 + N0 0 -2.22045e-15 1 N1 -5.93089e-16 -2.13636e-15 1 N2 -0.14476 -0.537012 0.831061 + txt003 +STRI + V0 -0.384628 -1.38201 2.4875 V1 0 -1.43241 2.4875 V2 0 -1.40312 2.49844 + N0 -0.14476 -0.537012 0.831061 N1 0 -0.556738 0.830688 N2 0 -2.22045e-15 1 + txt003 +STRI + V0 -0.376765 -1.35376 2.49844 V1 -0.712995 -1.21396 2.49844 V2 -0.727875 -1.2393 2.4875 + N0 -5.93089e-16 -2.13636e-15 1 N1 -1.16933e-15 -1.87966e-15 1 N2 -0.278679 -0.480481 0.83155 + txt003 +STRI + V0 -0.727875 -1.2393 2.4875 V1 -0.384628 -1.38201 2.4875 V2 -0.376765 -1.35376 2.49844 + N0 -0.278679 -0.480481 0.83155 N1 -0.14476 -0.537012 0.831061 N2 -5.93089e-16 -2.13636e-15 1 + txt003 +STRI + V0 -0.712995 -1.21396 2.49844 V1 -0.996219 -0.996219 2.49844 V2 -1.01701 -1.01701 2.4875 + N0 -1.16933e-15 -1.87966e-15 1 N1 -1.67359e-15 -1.4538e-15 1 N2 -0.392564 -0.392564 0.831737 + txt003 +STRI + V0 -1.01701 -1.01701 2.4875 V1 -0.727875 -1.2393 2.4875 V2 -0.712995 -1.21396 2.49844 + N0 -0.392564 -0.392564 0.831737 N1 -0.278679 -0.480481 0.83155 N2 -1.16933e-15 -1.87966e-15 1 + txt003 +STRI + V0 -0.996219 -0.996219 2.49844 V1 -1.21396 -0.712995 2.49844 V2 -1.2393 -0.727875 2.4875 + N0 -1.67359e-15 -1.4538e-15 1 N1 -2.05298e-15 -8.74229e-16 1 N2 -0.480481 -0.278679 0.83155 + txt003 +STRI + V0 -1.2393 -0.727875 2.4875 V1 -1.01701 -1.01701 2.4875 V2 -0.996219 -0.996219 2.49844 + N0 -0.480481 -0.278679 0.83155 N1 -0.392564 -0.392564 0.831737 N2 -1.67359e-15 -1.4538e-15 1 + txt003 +STRI + V0 -1.21396 -0.712995 2.49844 V1 -1.35376 -0.376765 2.49844 V2 -1.38201 -0.384628 2.4875 + N0 -2.05298e-15 -8.74229e-16 1 N1 -2.25214e-15 -1.77072e-16 1 N2 -0.537012 -0.14476 0.831061 + txt003 +STRI + V0 -1.38201 -0.384628 2.4875 V1 -1.2393 -0.727875 2.4875 V2 -1.21396 -0.712995 2.49844 + N0 -0.537012 -0.14476 0.831061 N1 -0.480481 -0.278679 0.83155 N2 -2.05298e-15 -8.74229e-16 1 + txt003 +STRI + V0 -1.35376 -0.376765 2.49844 V1 -1.40312 0 2.49844 V2 -1.43241 0 2.4875 + N0 -2.25214e-15 -1.77072e-16 1 N1 -2.22045e-15 5.65179e-16 1 N2 -0.556738 4.5989e-16 0.830688 + txt003 +STRI + V0 -1.43241 0 2.4875 V1 -1.38201 -0.384628 2.4875 V2 -1.35376 -0.376765 2.49844 + N0 -0.556738 4.5989e-16 0.830688 N1 -0.537012 -0.14476 0.831061 N2 -2.25214e-15 -1.77072e-16 1 + txt003 +STRI + V0 0 -1.43241 2.4875 V1 -0.384628 -1.38201 2.4875 V2 -0.393796 -1.41495 2.45469 + N0 0 -0.556738 0.830688 N1 -0.14476 -0.537012 0.831061 N2 -0.203756 -0.755869 0.622211 + txt003 +STRI + V0 -0.393796 -1.41495 2.45469 V1 0 -1.46655 2.45469 V2 0 -1.43241 2.4875 + N0 -0.203756 -0.755869 0.622211 N1 0 -0.783289 0.621658 N2 0 -0.556738 0.830688 + txt003 +STRI + V0 -0.384628 -1.38201 2.4875 V1 -0.727875 -1.2393 2.4875 V2 -0.745225 -1.26884 2.45469 + N0 -0.14476 -0.537012 0.831061 N1 -0.278679 -0.480481 0.83155 N2 -0.39248 -0.67669 0.622937 + txt003 +STRI + V0 -0.745225 -1.26884 2.45469 V1 -0.393796 -1.41495 2.45469 V2 -0.384628 -1.38201 2.4875 + N0 -0.39248 -0.67669 0.622937 N1 -0.203756 -0.755869 0.622211 N2 -0.14476 -0.537012 0.831061 + txt003 +STRI + V0 -0.727875 -1.2393 2.4875 V1 -1.01701 -1.01701 2.4875 V2 -1.04125 -1.04125 2.45469 + N0 -0.278679 -0.480481 0.83155 N1 -0.392564 -0.392564 0.831737 N2 -0.552993 -0.552993 0.623215 + txt003 +STRI + V0 -1.04125 -1.04125 2.45469 V1 -0.745225 -1.26884 2.45469 V2 -0.727875 -1.2393 2.4875 + N0 -0.552993 -0.552993 0.623215 N1 -0.39248 -0.67669 0.622937 N2 -0.278679 -0.480481 0.83155 + txt003 +STRI + V0 -1.01701 -1.01701 2.4875 V1 -1.2393 -0.727875 2.4875 V2 -1.26884 -0.745225 2.45469 + N0 -0.392564 -0.392564 0.831737 N1 -0.480481 -0.278679 0.83155 N2 -0.67669 -0.39248 0.622937 + txt003 +STRI + V0 -1.26884 -0.745225 2.45469 V1 -1.04125 -1.04125 2.45469 V2 -1.01701 -1.01701 2.4875 + N0 -0.67669 -0.39248 0.622937 N1 -0.552993 -0.552993 0.623215 N2 -0.392564 -0.392564 0.831737 + txt003 +STRI + V0 -1.2393 -0.727875 2.4875 V1 -1.38201 -0.384628 2.4875 V2 -1.41495 -0.393796 2.45469 + N0 -0.480481 -0.278679 0.83155 N1 -0.537012 -0.14476 0.831061 N2 -0.755869 -0.203756 0.622211 + txt003 +STRI + V0 -1.41495 -0.393796 2.45469 V1 -1.26884 -0.745225 2.45469 V2 -1.2393 -0.727875 2.4875 + N0 -0.755869 -0.203756 0.622211 N1 -0.67669 -0.39248 0.622937 N2 -0.480481 -0.278679 0.83155 + txt003 +STRI + V0 -1.38201 -0.384628 2.4875 V1 -1.43241 0 2.4875 V2 -1.46655 0 2.45469 + N0 -0.537012 -0.14476 0.831061 N1 -0.556738 4.5989e-16 0.830688 N2 -0.783289 1.94969e-16 0.621658 + txt003 +STRI + V0 -1.46655 0 2.45469 V1 -1.41495 -0.393796 2.45469 V2 -1.38201 -0.384628 2.4875 + N0 -0.783289 1.94969e-16 0.621658 N1 -0.755869 -0.203756 0.622211 N2 -0.537012 -0.14476 0.831061 + txt003 +STRI + V0 0 -1.46655 2.45469 V1 -0.393796 -1.41495 2.45469 V2 -0.402778 -1.44722 2.4 + N0 0 -0.783289 0.621658 N1 -0.203756 -0.755869 0.622211 N2 -0.234929 -0.871509 0.430442 + txt003 +STRI + V0 -0.402778 -1.44722 2.4 V1 0 -1.5 2.4 V2 0 -1.46655 2.45469 + N0 -0.234929 -0.871509 0.430442 N1 0 -0.902861 0.429934 N2 0 -0.783289 0.621658 + txt003 +STRI + V0 -0.393796 -1.41495 2.45469 V1 -0.745225 -1.26884 2.45469 V2 -0.762222 -1.29778 2.4 + N0 -0.203756 -0.755869 0.622211 N1 -0.39248 -0.67669 0.622937 N2 -0.4527 -0.780517 0.43111 + txt003 +STRI + V0 -0.762222 -1.29778 2.4 V1 -0.402778 -1.44722 2.4 V2 -0.393796 -1.41495 2.45469 + N0 -0.4527 -0.780517 0.43111 N1 -0.234929 -0.871509 0.430442 N2 -0.203756 -0.755869 0.622211 + txt003 +STRI + V0 -0.745225 -1.26884 2.45469 V1 -1.04125 -1.04125 2.45469 V2 -1.065 -1.065 2.4 + N0 -0.39248 -0.67669 0.622937 N1 -0.552993 -0.552993 0.623215 N2 -0.637936 -0.637936 0.431366 + txt003 +STRI + V0 -1.065 -1.065 2.4 V1 -0.762222 -1.29778 2.4 V2 -0.745225 -1.26884 2.45469 + N0 -0.637936 -0.637936 0.431366 N1 -0.4527 -0.780517 0.43111 N2 -0.39248 -0.67669 0.622937 + txt003 +STRI + V0 -1.04125 -1.04125 2.45469 V1 -1.26884 -0.745225 2.45469 V2 -1.29778 -0.762222 2.4 + N0 -0.552993 -0.552993 0.623215 N1 -0.67669 -0.39248 0.622937 N2 -0.780517 -0.4527 0.43111 + txt003 +STRI + V0 -1.29778 -0.762222 2.4 V1 -1.065 -1.065 2.4 V2 -1.04125 -1.04125 2.45469 + N0 -0.780517 -0.4527 0.43111 N1 -0.637936 -0.637936 0.431366 N2 -0.552993 -0.552993 0.623215 + txt003 +STRI + V0 -1.26884 -0.745225 2.45469 V1 -1.41495 -0.393796 2.45469 V2 -1.44722 -0.402778 2.4 + N0 -0.67669 -0.39248 0.622937 N1 -0.755869 -0.203756 0.622211 N2 -0.871509 -0.234929 0.430442 + txt003 +STRI + V0 -1.44722 -0.402778 2.4 V1 -1.29778 -0.762222 2.4 V2 -1.26884 -0.745225 2.45469 + N0 -0.871509 -0.234929 0.430442 N1 -0.780517 -0.4527 0.43111 N2 -0.67669 -0.39248 0.622937 + txt003 +STRI + V0 -1.41495 -0.393796 2.45469 V1 -1.46655 0 2.45469 V2 -1.5 0 2.4 + N0 -0.755869 -0.203756 0.622211 N1 -0.783289 1.94969e-16 0.621658 N2 -0.902861 6.81889e-17 0.429934 + txt003 +STRI + V0 -1.5 0 2.4 V1 -1.44722 -0.402778 2.4 V2 -1.41495 -0.393796 2.45469 + N0 -0.902861 6.81889e-17 0.429934 N1 -0.871509 -0.234929 0.430442 N2 -0.755869 -0.203756 0.622211 + txt003 +STRI + V0 -1.4 0 2.4 V1 -1.35074 0.375926 2.4 V2 -1.33276 0.370922 2.45469 + N0 0.902861 0 -0.429934 N1 0.871509 -0.234929 -0.430442 N2 0.953562 -0.257047 -0.156989 + txt003 +STRI + V0 -1.33276 0.370922 2.45469 V1 -1.38137 0 2.45469 V2 -1.4 0 2.4 + N0 0.953562 -0.257047 -0.156989 N1 0.987636 0 -0.156768 N2 0.902861 0 -0.429934 + txt003 +STRI + V0 -1.35074 0.375926 2.4 V1 -1.21126 0.711407 2.4 V2 -1.19514 0.701938 2.45469 + N0 0.871509 -0.234929 -0.430442 N1 0.780517 -0.4527 -0.43111 N2 0.854265 -0.495474 -0.157281 + txt003 +STRI + V0 -1.19514 0.701938 2.45469 V1 -1.33276 0.370922 2.45469 V2 -1.35074 0.375926 2.4 + N0 0.854265 -0.495474 -0.157281 N1 0.953562 -0.257047 -0.156989 N2 0.871509 -0.234929 -0.430442 + txt003 +STRI + V0 -1.21126 0.711407 2.4 V1 -0.994 0.994 2.4 V2 -0.98077 0.98077 2.45469 + N0 0.780517 -0.4527 -0.43111 N1 0.637936 -0.637936 -0.431366 N2 0.698293 -0.698293 -0.157393 + txt003 +STRI + V0 -0.98077 0.98077 2.45469 V1 -1.19514 0.701938 2.45469 V2 -1.21126 0.711407 2.4 + N0 0.698293 -0.698293 -0.157393 N1 0.854265 -0.495474 -0.157281 N2 0.780517 -0.4527 -0.43111 + txt003 +STRI + V0 -0.994 0.994 2.4 V1 -0.711407 1.21126 2.4 V2 -0.701938 1.19514 2.45469 + N0 0.637936 -0.637936 -0.431366 N1 0.4527 -0.780517 -0.43111 N2 0.495474 -0.854265 -0.157281 + txt003 +STRI + V0 -0.701938 1.19514 2.45469 V1 -0.98077 0.98077 2.45469 V2 -0.994 0.994 2.4 + N0 0.495474 -0.854265 -0.157281 N1 0.698293 -0.698293 -0.157393 N2 0.637936 -0.637936 -0.431366 + txt003 +STRI + V0 -0.711407 1.21126 2.4 V1 -0.375926 1.35074 2.4 V2 -0.370922 1.33276 2.45469 + N0 0.4527 -0.780517 -0.43111 N1 0.234929 -0.871509 -0.430442 N2 0.257047 -0.953562 -0.156989 + txt003 +STRI + V0 -0.370922 1.33276 2.45469 V1 -0.701938 1.19514 2.45469 V2 -0.711407 1.21126 2.4 + N0 0.257047 -0.953562 -0.156989 N1 0.495474 -0.854265 -0.157281 N2 0.4527 -0.780517 -0.43111 + txt003 +STRI + V0 -0.375926 1.35074 2.4 V1 0 1.4 2.4 V2 0 1.38137 2.45469 + N0 0.234929 -0.871509 -0.430442 N1 -7.30595e-17 -0.902861 -0.429934 N2 9.89971e-17 -0.987636 -0.156768 + txt003 +STRI + V0 0 1.38137 2.45469 V1 -0.370922 1.33276 2.45469 V2 -0.375926 1.35074 2.4 + N0 9.89971e-17 -0.987636 -0.156768 N1 0.257047 -0.953562 -0.156989 N2 0.234929 -0.871509 -0.430442 + txt003 +STRI + V0 -1.38137 0 2.45469 V1 -1.33276 0.370922 2.45469 V2 -1.33555 0.371699 2.4875 + N0 0.987636 0 -0.156768 N1 0.953562 -0.257047 -0.156989 N2 0.849414 -0.228972 0.475466 + txt003 +STRI + V0 -1.33555 0.371699 2.4875 V1 -1.38426 0 2.4875 V2 -1.38137 0 2.45469 + N0 0.849414 -0.228972 0.475466 N1 0.880022 -0 0.474933 N2 0.987636 0 -0.156768 + txt003 +STRI + V0 -1.33276 0.370922 2.45469 V1 -1.19514 0.701938 2.45469 V2 -1.19764 0.703409 2.4875 + N0 0.953562 -0.257047 -0.156989 N1 0.854265 -0.495474 -0.157281 N2 0.760669 -0.441188 0.476167 + txt003 +STRI + V0 -1.19764 0.703409 2.4875 V1 -1.33555 0.371699 2.4875 V2 -1.33276 0.370922 2.45469 + N0 0.760669 -0.441188 0.476167 N1 0.849414 -0.228972 0.475466 N2 0.953562 -0.257047 -0.156989 + txt003 +STRI + V0 -1.19514 0.701938 2.45469 V1 -0.98077 0.98077 2.45469 V2 -0.982824 0.982824 2.4875 + N0 0.854265 -0.495474 -0.157281 N1 0.698293 -0.698293 -0.157393 N2 0.621695 -0.621695 0.476435 + txt003 +STRI + V0 -0.982824 0.982824 2.4875 V1 -1.19764 0.703409 2.4875 V2 -1.19514 0.701938 2.45469 + N0 0.621695 -0.621695 0.476435 N1 0.760669 -0.441188 0.476167 N2 0.854265 -0.495474 -0.157281 + txt003 +STRI + V0 -0.98077 0.98077 2.45469 V1 -0.701938 1.19514 2.45469 V2 -0.703409 1.19764 2.4875 + N0 0.698293 -0.698293 -0.157393 N1 0.495474 -0.854265 -0.157281 N2 0.441188 -0.760669 0.476167 + txt003 +STRI + V0 -0.703409 1.19764 2.4875 V1 -0.982824 0.982824 2.4875 V2 -0.98077 0.98077 2.45469 + N0 0.441188 -0.760669 0.476167 N1 0.621695 -0.621695 0.476435 N2 0.698293 -0.698293 -0.157393 + txt003 +STRI + V0 -0.701938 1.19514 2.45469 V1 -0.370922 1.33276 2.45469 V2 -0.371699 1.33555 2.4875 + N0 0.495474 -0.854265 -0.157281 N1 0.257047 -0.953562 -0.156989 N2 0.228972 -0.849414 0.475466 + txt003 +STRI + V0 -0.371699 1.33555 2.4875 V1 -0.703409 1.19764 2.4875 V2 -0.701938 1.19514 2.45469 + N0 0.228972 -0.849414 0.475466 N1 0.441188 -0.760669 0.476167 N2 0.495474 -0.854265 -0.157281 + txt003 +STRI + V0 -0.370922 1.33276 2.45469 V1 0 1.38137 2.45469 V2 0 1.38426 2.4875 + N0 0.257047 -0.953562 -0.156989 N1 9.89971e-17 -0.987636 -0.156768 N2 6.08179e-16 -0.880022 0.474933 + txt003 +STRI + V0 0 1.38426 2.4875 V1 -0.371699 1.33555 2.4875 V2 -0.370922 1.33276 2.45469 + N0 6.08179e-16 -0.880022 0.474933 N1 0.228972 -0.849414 0.475466 N2 0.257047 -0.953562 -0.156989 + txt003 +STRI + V0 -1.38426 0 2.4875 V1 -1.33555 0.371699 2.4875 V2 -1.35376 0.376765 2.49844 + N0 0.880022 -0 0.474933 N1 0.849414 -0.228972 0.475466 N2 -2.13636e-15 5.93089e-16 1 + txt003 +STRI + V0 -1.35376 0.376765 2.49844 V1 -1.40312 0 2.49844 V2 -1.38426 0 2.4875 + N0 -2.13636e-15 5.93089e-16 1 N1 -2.22045e-15 0 1 N2 0.880022 -0 0.474933 + txt003 +STRI + V0 -1.33555 0.371699 2.4875 V1 -1.19764 0.703409 2.4875 V2 -1.21396 0.712995 2.49844 + N0 0.849414 -0.228972 0.475466 N1 0.760669 -0.441188 0.476167 N2 -1.87966e-15 1.16933e-15 1 + txt003 +STRI + V0 -1.21396 0.712995 2.49844 V1 -1.35376 0.376765 2.49844 V2 -1.33555 0.371699 2.4875 + N0 -1.87966e-15 1.16933e-15 1 N1 -2.13636e-15 5.93089e-16 1 N2 0.849414 -0.228972 0.475466 + txt003 +STRI + V0 -1.19764 0.703409 2.4875 V1 -0.982824 0.982824 2.4875 V2 -0.996219 0.996219 2.49844 + N0 0.760669 -0.441188 0.476167 N1 0.621695 -0.621695 0.476435 N2 -1.4538e-15 1.67359e-15 1 + txt003 +STRI + V0 -0.996219 0.996219 2.49844 V1 -1.21396 0.712995 2.49844 V2 -1.19764 0.703409 2.4875 + N0 -1.4538e-15 1.67359e-15 1 N1 -1.87966e-15 1.16933e-15 1 N2 0.760669 -0.441188 0.476167 + txt003 +STRI + V0 -0.982824 0.982824 2.4875 V1 -0.703409 1.19764 2.4875 V2 -0.712995 1.21396 2.49844 + N0 0.621695 -0.621695 0.476435 N1 0.441188 -0.760669 0.476167 N2 -8.74229e-16 2.05298e-15 1 + txt003 +STRI + V0 -0.712995 1.21396 2.49844 V1 -0.996219 0.996219 2.49844 V2 -0.982824 0.982824 2.4875 + N0 -8.74229e-16 2.05298e-15 1 N1 -1.4538e-15 1.67359e-15 1 N2 0.621695 -0.621695 0.476435 + txt003 +STRI + V0 -0.703409 1.19764 2.4875 V1 -0.371699 1.33555 2.4875 V2 -0.376765 1.35376 2.49844 + N0 0.441188 -0.760669 0.476167 N1 0.228972 -0.849414 0.475466 N2 -1.77072e-16 2.25214e-15 1 + txt003 +STRI + V0 -0.376765 1.35376 2.49844 V1 -0.712995 1.21396 2.49844 V2 -0.703409 1.19764 2.4875 + N0 -1.77072e-16 2.25214e-15 1 N1 -8.74229e-16 2.05298e-15 1 N2 0.441188 -0.760669 0.476167 + txt003 +STRI + V0 -0.371699 1.33555 2.4875 V1 0 1.38426 2.4875 V2 0 1.40312 2.49844 + N0 0.228972 -0.849414 0.475466 N1 6.08179e-16 -0.880022 0.474933 N2 5.65179e-16 2.22045e-15 1 + txt003 +STRI + V0 0 1.40312 2.49844 V1 -0.376765 1.35376 2.49844 V2 -0.371699 1.33555 2.4875 + N0 5.65179e-16 2.22045e-15 1 N1 -1.77072e-16 2.25214e-15 1 N2 0.228972 -0.849414 0.475466 + txt003 +STRI + V0 -1.40312 0 2.49844 V1 -1.35376 0.376765 2.49844 V2 -1.38201 0.384628 2.4875 + N0 -2.22045e-15 0 1 N1 -2.13636e-15 5.93089e-16 1 N2 -0.537012 0.14476 0.831061 + txt003 +STRI + V0 -1.38201 0.384628 2.4875 V1 -1.43241 0 2.4875 V2 -1.40312 0 2.49844 + N0 -0.537012 0.14476 0.831061 N1 -0.556738 0 0.830688 N2 -2.22045e-15 0 1 + txt003 +STRI + V0 -1.35376 0.376765 2.49844 V1 -1.21396 0.712995 2.49844 V2 -1.2393 0.727875 2.4875 + N0 -2.13636e-15 5.93089e-16 1 N1 -1.87966e-15 1.16933e-15 1 N2 -0.480481 0.278679 0.83155 + txt003 +STRI + V0 -1.2393 0.727875 2.4875 V1 -1.38201 0.384628 2.4875 V2 -1.35376 0.376765 2.49844 + N0 -0.480481 0.278679 0.83155 N1 -0.537012 0.14476 0.831061 N2 -2.13636e-15 5.93089e-16 1 + txt003 +STRI + V0 -1.21396 0.712995 2.49844 V1 -0.996219 0.996219 2.49844 V2 -1.01701 1.01701 2.4875 + N0 -1.87966e-15 1.16933e-15 1 N1 -1.4538e-15 1.67359e-15 1 N2 -0.392564 0.392564 0.831737 + txt003 +STRI + V0 -1.01701 1.01701 2.4875 V1 -1.2393 0.727875 2.4875 V2 -1.21396 0.712995 2.49844 + N0 -0.392564 0.392564 0.831737 N1 -0.480481 0.278679 0.83155 N2 -1.87966e-15 1.16933e-15 1 + txt003 +STRI + V0 -0.996219 0.996219 2.49844 V1 -0.712995 1.21396 2.49844 V2 -0.727875 1.2393 2.4875 + N0 -1.4538e-15 1.67359e-15 1 N1 -8.74229e-16 2.05298e-15 1 N2 -0.278679 0.480481 0.83155 + txt003 +STRI + V0 -0.727875 1.2393 2.4875 V1 -1.01701 1.01701 2.4875 V2 -0.996219 0.996219 2.49844 + N0 -0.278679 0.480481 0.83155 N1 -0.392564 0.392564 0.831737 N2 -1.4538e-15 1.67359e-15 1 + txt003 +STRI + V0 -0.712995 1.21396 2.49844 V1 -0.376765 1.35376 2.49844 V2 -0.384628 1.38201 2.4875 + N0 -8.74229e-16 2.05298e-15 1 N1 -1.77072e-16 2.25214e-15 1 N2 -0.14476 0.537012 0.831061 + txt003 +STRI + V0 -0.384628 1.38201 2.4875 V1 -0.727875 1.2393 2.4875 V2 -0.712995 1.21396 2.49844 + N0 -0.14476 0.537012 0.831061 N1 -0.278679 0.480481 0.83155 N2 -8.74229e-16 2.05298e-15 1 + txt003 +STRI + V0 -0.376765 1.35376 2.49844 V1 0 1.40312 2.49844 V2 0 1.43241 2.4875 + N0 -1.77072e-16 2.25214e-15 1 N1 5.65179e-16 2.22045e-15 1 N2 4.5989e-16 0.556738 0.830688 + txt003 +STRI + V0 0 1.43241 2.4875 V1 -0.384628 1.38201 2.4875 V2 -0.376765 1.35376 2.49844 + N0 4.5989e-16 0.556738 0.830688 N1 -0.14476 0.537012 0.831061 N2 -1.77072e-16 2.25214e-15 1 + txt003 +STRI + V0 -1.43241 0 2.4875 V1 -1.38201 0.384628 2.4875 V2 -1.41495 0.393796 2.45469 + N0 -0.556738 0 0.830688 N1 -0.537012 0.14476 0.831061 N2 -0.755869 0.203756 0.622211 + txt003 +STRI + V0 -1.41495 0.393796 2.45469 V1 -1.46655 0 2.45469 V2 -1.43241 0 2.4875 + N0 -0.755869 0.203756 0.622211 N1 -0.783289 0 0.621658 N2 -0.556738 0 0.830688 + txt003 +STRI + V0 -1.38201 0.384628 2.4875 V1 -1.2393 0.727875 2.4875 V2 -1.26884 0.745225 2.45469 + N0 -0.537012 0.14476 0.831061 N1 -0.480481 0.278679 0.83155 N2 -0.67669 0.39248 0.622937 + txt003 +STRI + V0 -1.26884 0.745225 2.45469 V1 -1.41495 0.393796 2.45469 V2 -1.38201 0.384628 2.4875 + N0 -0.67669 0.39248 0.622937 N1 -0.755869 0.203756 0.622211 N2 -0.537012 0.14476 0.831061 + txt003 +STRI + V0 -1.2393 0.727875 2.4875 V1 -1.01701 1.01701 2.4875 V2 -1.04125 1.04125 2.45469 + N0 -0.480481 0.278679 0.83155 N1 -0.392564 0.392564 0.831737 N2 -0.552993 0.552993 0.623215 + txt003 +STRI + V0 -1.04125 1.04125 2.45469 V1 -1.26884 0.745225 2.45469 V2 -1.2393 0.727875 2.4875 + N0 -0.552993 0.552993 0.623215 N1 -0.67669 0.39248 0.622937 N2 -0.480481 0.278679 0.83155 + txt003 +STRI + V0 -1.01701 1.01701 2.4875 V1 -0.727875 1.2393 2.4875 V2 -0.745225 1.26884 2.45469 + N0 -0.392564 0.392564 0.831737 N1 -0.278679 0.480481 0.83155 N2 -0.39248 0.67669 0.622937 + txt003 +STRI + V0 -0.745225 1.26884 2.45469 V1 -1.04125 1.04125 2.45469 V2 -1.01701 1.01701 2.4875 + N0 -0.39248 0.67669 0.622937 N1 -0.552993 0.552993 0.623215 N2 -0.392564 0.392564 0.831737 + txt003 +STRI + V0 -0.727875 1.2393 2.4875 V1 -0.384628 1.38201 2.4875 V2 -0.393796 1.41495 2.45469 + N0 -0.278679 0.480481 0.83155 N1 -0.14476 0.537012 0.831061 N2 -0.203756 0.755869 0.622211 + txt003 +STRI + V0 -0.393796 1.41495 2.45469 V1 -0.745225 1.26884 2.45469 V2 -0.727875 1.2393 2.4875 + N0 -0.203756 0.755869 0.622211 N1 -0.39248 0.67669 0.622937 N2 -0.278679 0.480481 0.83155 + txt003 +STRI + V0 -0.384628 1.38201 2.4875 V1 0 1.43241 2.4875 V2 0 1.46655 2.45469 + N0 -0.14476 0.537012 0.831061 N1 4.5989e-16 0.556738 0.830688 N2 1.94969e-16 0.783289 0.621658 + txt003 +STRI + V0 0 1.46655 2.45469 V1 -0.393796 1.41495 2.45469 V2 -0.384628 1.38201 2.4875 + N0 1.94969e-16 0.783289 0.621658 N1 -0.203756 0.755869 0.622211 N2 -0.14476 0.537012 0.831061 + txt003 +STRI + V0 -1.46655 0 2.45469 V1 -1.41495 0.393796 2.45469 V2 -1.44722 0.402778 2.4 + N0 -0.783289 0 0.621658 N1 -0.755869 0.203756 0.622211 N2 -0.871509 0.234929 0.430442 + txt003 +STRI + V0 -1.44722 0.402778 2.4 V1 -1.5 0 2.4 V2 -1.46655 0 2.45469 + N0 -0.871509 0.234929 0.430442 N1 -0.902861 0 0.429934 N2 -0.783289 0 0.621658 + txt003 +STRI + V0 -1.41495 0.393796 2.45469 V1 -1.26884 0.745225 2.45469 V2 -1.29778 0.762222 2.4 + N0 -0.755869 0.203756 0.622211 N1 -0.67669 0.39248 0.622937 N2 -0.780517 0.4527 0.43111 + txt003 +STRI + V0 -1.29778 0.762222 2.4 V1 -1.44722 0.402778 2.4 V2 -1.41495 0.393796 2.45469 + N0 -0.780517 0.4527 0.43111 N1 -0.871509 0.234929 0.430442 N2 -0.755869 0.203756 0.622211 + txt003 +STRI + V0 -1.26884 0.745225 2.45469 V1 -1.04125 1.04125 2.45469 V2 -1.065 1.065 2.4 + N0 -0.67669 0.39248 0.622937 N1 -0.552993 0.552993 0.623215 N2 -0.637936 0.637936 0.431366 + txt003 +STRI + V0 -1.065 1.065 2.4 V1 -1.29778 0.762222 2.4 V2 -1.26884 0.745225 2.45469 + N0 -0.637936 0.637936 0.431366 N1 -0.780517 0.4527 0.43111 N2 -0.67669 0.39248 0.622937 + txt003 +STRI + V0 -1.04125 1.04125 2.45469 V1 -0.745225 1.26884 2.45469 V2 -0.762222 1.29778 2.4 + N0 -0.552993 0.552993 0.623215 N1 -0.39248 0.67669 0.622937 N2 -0.4527 0.780517 0.43111 + txt003 +STRI + V0 -0.762222 1.29778 2.4 V1 -1.065 1.065 2.4 V2 -1.04125 1.04125 2.45469 + N0 -0.4527 0.780517 0.43111 N1 -0.637936 0.637936 0.431366 N2 -0.552993 0.552993 0.623215 + txt003 +STRI + V0 -0.745225 1.26884 2.45469 V1 -0.393796 1.41495 2.45469 V2 -0.402778 1.44722 2.4 + N0 -0.39248 0.67669 0.622937 N1 -0.203756 0.755869 0.622211 N2 -0.234929 0.871509 0.430442 + txt003 +STRI + V0 -0.402778 1.44722 2.4 V1 -0.762222 1.29778 2.4 V2 -0.745225 1.26884 2.45469 + N0 -0.234929 0.871509 0.430442 N1 -0.4527 0.780517 0.43111 N2 -0.39248 0.67669 0.622937 + txt003 +STRI + V0 -0.393796 1.41495 2.45469 V1 0 1.46655 2.45469 V2 0 1.5 2.4 + N0 -0.203756 0.755869 0.622211 N1 1.94969e-16 0.783289 0.621658 N2 6.81889e-17 0.902861 0.429934 + txt003 +STRI + V0 0 1.5 2.4 V1 -0.402778 1.44722 2.4 V2 -0.393796 1.41495 2.45469 + N0 6.81889e-17 0.902861 0.429934 N1 -0.234929 0.871509 0.430442 N2 -0.203756 0.755869 0.622211 + txt003 +STRI + V0 0 1.4 2.4 V1 0.375926 1.35074 2.4 V2 0.370922 1.33276 2.45469 + N0 0 -0.902861 -0.429934 N1 -0.234929 -0.871509 -0.430442 N2 -0.257047 -0.953562 -0.156989 + txt003 +STRI + V0 0.370922 1.33276 2.45469 V1 0 1.38137 2.45469 V2 0 1.4 2.4 + N0 -0.257047 -0.953562 -0.156989 N1 0 -0.987636 -0.156768 N2 0 -0.902861 -0.429934 + txt003 +STRI + V0 0.375926 1.35074 2.4 V1 0.711407 1.21126 2.4 V2 0.701938 1.19514 2.45469 + N0 -0.234929 -0.871509 -0.430442 N1 -0.4527 -0.780517 -0.43111 N2 -0.495474 -0.854265 -0.157281 + txt003 +STRI + V0 0.701938 1.19514 2.45469 V1 0.370922 1.33276 2.45469 V2 0.375926 1.35074 2.4 + N0 -0.495474 -0.854265 -0.157281 N1 -0.257047 -0.953562 -0.156989 N2 -0.234929 -0.871509 -0.430442 + txt003 +STRI + V0 0.711407 1.21126 2.4 V1 0.994 0.994 2.4 V2 0.98077 0.98077 2.45469 + N0 -0.4527 -0.780517 -0.43111 N1 -0.637936 -0.637936 -0.431366 N2 -0.698293 -0.698293 -0.157393 + txt003 +STRI + V0 0.98077 0.98077 2.45469 V1 0.701938 1.19514 2.45469 V2 0.711407 1.21126 2.4 + N0 -0.698293 -0.698293 -0.157393 N1 -0.495474 -0.854265 -0.157281 N2 -0.4527 -0.780517 -0.43111 + txt003 +STRI + V0 0.994 0.994 2.4 V1 1.21126 0.711407 2.4 V2 1.19514 0.701938 2.45469 + N0 -0.637936 -0.637936 -0.431366 N1 -0.780517 -0.4527 -0.43111 N2 -0.854265 -0.495474 -0.157281 + txt003 +STRI + V0 1.19514 0.701938 2.45469 V1 0.98077 0.98077 2.45469 V2 0.994 0.994 2.4 + N0 -0.854265 -0.495474 -0.157281 N1 -0.698293 -0.698293 -0.157393 N2 -0.637936 -0.637936 -0.431366 + txt003 +STRI + V0 1.21126 0.711407 2.4 V1 1.35074 0.375926 2.4 V2 1.33276 0.370922 2.45469 + N0 -0.780517 -0.4527 -0.43111 N1 -0.871509 -0.234929 -0.430442 N2 -0.953562 -0.257047 -0.156989 + txt003 +STRI + V0 1.33276 0.370922 2.45469 V1 1.19514 0.701938 2.45469 V2 1.21126 0.711407 2.4 + N0 -0.953562 -0.257047 -0.156989 N1 -0.854265 -0.495474 -0.157281 N2 -0.780517 -0.4527 -0.43111 + txt003 +STRI + V0 1.35074 0.375926 2.4 V1 1.4 0 2.4 V2 1.38137 0 2.45469 + N0 -0.871509 -0.234929 -0.430442 N1 -0.902861 7.30595e-17 -0.429934 N2 -0.987636 -9.89971e-17 -0.156768 + txt003 +STRI + V0 1.38137 0 2.45469 V1 1.33276 0.370922 2.45469 V2 1.35074 0.375926 2.4 + N0 -0.987636 -9.89971e-17 -0.156768 N1 -0.953562 -0.257047 -0.156989 N2 -0.871509 -0.234929 -0.430442 + txt003 +STRI + V0 0 1.38137 2.45469 V1 0.370922 1.33276 2.45469 V2 0.371699 1.33555 2.4875 + N0 0 -0.987636 -0.156768 N1 -0.257047 -0.953562 -0.156989 N2 -0.228972 -0.849414 0.475466 + txt003 +STRI + V0 0.371699 1.33555 2.4875 V1 0 1.38426 2.4875 V2 0 1.38137 2.45469 + N0 -0.228972 -0.849414 0.475466 N1 0 -0.880022 0.474933 N2 0 -0.987636 -0.156768 + txt003 +STRI + V0 0.370922 1.33276 2.45469 V1 0.701938 1.19514 2.45469 V2 0.703409 1.19764 2.4875 + N0 -0.257047 -0.953562 -0.156989 N1 -0.495474 -0.854265 -0.157281 N2 -0.441188 -0.760669 0.476167 + txt003 +STRI + V0 0.703409 1.19764 2.4875 V1 0.371699 1.33555 2.4875 V2 0.370922 1.33276 2.45469 + N0 -0.441188 -0.760669 0.476167 N1 -0.228972 -0.849414 0.475466 N2 -0.257047 -0.953562 -0.156989 + txt003 +STRI + V0 0.701938 1.19514 2.45469 V1 0.98077 0.98077 2.45469 V2 0.982824 0.982824 2.4875 + N0 -0.495474 -0.854265 -0.157281 N1 -0.698293 -0.698293 -0.157393 N2 -0.621695 -0.621695 0.476435 + txt003 +STRI + V0 0.982824 0.982824 2.4875 V1 0.703409 1.19764 2.4875 V2 0.701938 1.19514 2.45469 + N0 -0.621695 -0.621695 0.476435 N1 -0.441188 -0.760669 0.476167 N2 -0.495474 -0.854265 -0.157281 + txt003 +STRI + V0 0.98077 0.98077 2.45469 V1 1.19514 0.701938 2.45469 V2 1.19764 0.703409 2.4875 + N0 -0.698293 -0.698293 -0.157393 N1 -0.854265 -0.495474 -0.157281 N2 -0.760669 -0.441188 0.476167 + txt003 +STRI + V0 1.19764 0.703409 2.4875 V1 0.982824 0.982824 2.4875 V2 0.98077 0.98077 2.45469 + N0 -0.760669 -0.441188 0.476167 N1 -0.621695 -0.621695 0.476435 N2 -0.698293 -0.698293 -0.157393 + txt003 +STRI + V0 1.19514 0.701938 2.45469 V1 1.33276 0.370922 2.45469 V2 1.33555 0.371699 2.4875 + N0 -0.854265 -0.495474 -0.157281 N1 -0.953562 -0.257047 -0.156989 N2 -0.849414 -0.228972 0.475466 + txt003 +STRI + V0 1.33555 0.371699 2.4875 V1 1.19764 0.703409 2.4875 V2 1.19514 0.701938 2.45469 + N0 -0.849414 -0.228972 0.475466 N1 -0.760669 -0.441188 0.476167 N2 -0.854265 -0.495474 -0.157281 + txt003 +STRI + V0 1.33276 0.370922 2.45469 V1 1.38137 0 2.45469 V2 1.38426 0 2.4875 + N0 -0.953562 -0.257047 -0.156989 N1 -0.987636 -9.89971e-17 -0.156768 N2 -0.880022 -6.08179e-16 0.474933 + txt003 +STRI + V0 1.38426 0 2.4875 V1 1.33555 0.371699 2.4875 V2 1.33276 0.370922 2.45469 + N0 -0.880022 -6.08179e-16 0.474933 N1 -0.849414 -0.228972 0.475466 N2 -0.953562 -0.257047 -0.156989 + txt003 +STRI + V0 0 1.38426 2.4875 V1 0.371699 1.33555 2.4875 V2 0.376765 1.35376 2.49844 + N0 0 -0.880022 0.474933 N1 -0.228972 -0.849414 0.475466 N2 5.93089e-16 2.13636e-15 1 + txt003 +STRI + V0 0.376765 1.35376 2.49844 V1 0 1.40312 2.49844 V2 0 1.38426 2.4875 + N0 5.93089e-16 2.13636e-15 1 N1 -0 2.22045e-15 1 N2 0 -0.880022 0.474933 + txt003 +STRI + V0 0.371699 1.33555 2.4875 V1 0.703409 1.19764 2.4875 V2 0.712995 1.21396 2.49844 + N0 -0.228972 -0.849414 0.475466 N1 -0.441188 -0.760669 0.476167 N2 1.16933e-15 1.87966e-15 1 + txt003 +STRI + V0 0.712995 1.21396 2.49844 V1 0.376765 1.35376 2.49844 V2 0.371699 1.33555 2.4875 + N0 1.16933e-15 1.87966e-15 1 N1 5.93089e-16 2.13636e-15 1 N2 -0.228972 -0.849414 0.475466 + txt003 +STRI + V0 0.703409 1.19764 2.4875 V1 0.982824 0.982824 2.4875 V2 0.996219 0.996219 2.49844 + N0 -0.441188 -0.760669 0.476167 N1 -0.621695 -0.621695 0.476435 N2 1.67359e-15 1.4538e-15 1 + txt003 +STRI + V0 0.996219 0.996219 2.49844 V1 0.712995 1.21396 2.49844 V2 0.703409 1.19764 2.4875 + N0 1.67359e-15 1.4538e-15 1 N1 1.16933e-15 1.87966e-15 1 N2 -0.441188 -0.760669 0.476167 + txt003 +STRI + V0 0.982824 0.982824 2.4875 V1 1.19764 0.703409 2.4875 V2 1.21396 0.712995 2.49844 + N0 -0.621695 -0.621695 0.476435 N1 -0.760669 -0.441188 0.476167 N2 2.05298e-15 8.74229e-16 1 + txt003 +STRI + V0 1.21396 0.712995 2.49844 V1 0.996219 0.996219 2.49844 V2 0.982824 0.982824 2.4875 + N0 2.05298e-15 8.74229e-16 1 N1 1.67359e-15 1.4538e-15 1 N2 -0.621695 -0.621695 0.476435 + txt003 +STRI + V0 1.19764 0.703409 2.4875 V1 1.33555 0.371699 2.4875 V2 1.35376 0.376765 2.49844 + N0 -0.760669 -0.441188 0.476167 N1 -0.849414 -0.228972 0.475466 N2 2.25214e-15 1.77072e-16 1 + txt003 +STRI + V0 1.35376 0.376765 2.49844 V1 1.21396 0.712995 2.49844 V2 1.19764 0.703409 2.4875 + N0 2.25214e-15 1.77072e-16 1 N1 2.05298e-15 8.74229e-16 1 N2 -0.760669 -0.441188 0.476167 + txt003 +STRI + V0 1.33555 0.371699 2.4875 V1 1.38426 0 2.4875 V2 1.40312 0 2.49844 + N0 -0.849414 -0.228972 0.475466 N1 -0.880022 -6.08179e-16 0.474933 N2 2.22045e-15 -5.65179e-16 1 + txt003 +STRI + V0 1.40312 0 2.49844 V1 1.35376 0.376765 2.49844 V2 1.33555 0.371699 2.4875 + N0 2.22045e-15 -5.65179e-16 1 N1 2.25214e-15 1.77072e-16 1 N2 -0.849414 -0.228972 0.475466 + txt003 +STRI + V0 0 1.40312 2.49844 V1 0.376765 1.35376 2.49844 V2 0.384628 1.38201 2.4875 + N0 -0 2.22045e-15 1 N1 5.93089e-16 2.13636e-15 1 N2 0.14476 0.537012 0.831061 + txt003 +STRI + V0 0.384628 1.38201 2.4875 V1 0 1.43241 2.4875 V2 0 1.40312 2.49844 + N0 0.14476 0.537012 0.831061 N1 -0 0.556738 0.830688 N2 -0 2.22045e-15 1 + txt003 +STRI + V0 0.376765 1.35376 2.49844 V1 0.712995 1.21396 2.49844 V2 0.727875 1.2393 2.4875 + N0 5.93089e-16 2.13636e-15 1 N1 1.16933e-15 1.87966e-15 1 N2 0.278679 0.480481 0.83155 + txt003 +STRI + V0 0.727875 1.2393 2.4875 V1 0.384628 1.38201 2.4875 V2 0.376765 1.35376 2.49844 + N0 0.278679 0.480481 0.83155 N1 0.14476 0.537012 0.831061 N2 5.93089e-16 2.13636e-15 1 + txt003 +STRI + V0 0.712995 1.21396 2.49844 V1 0.996219 0.996219 2.49844 V2 1.01701 1.01701 2.4875 + N0 1.16933e-15 1.87966e-15 1 N1 1.67359e-15 1.4538e-15 1 N2 0.392564 0.392564 0.831737 + txt003 +STRI + V0 1.01701 1.01701 2.4875 V1 0.727875 1.2393 2.4875 V2 0.712995 1.21396 2.49844 + N0 0.392564 0.392564 0.831737 N1 0.278679 0.480481 0.83155 N2 1.16933e-15 1.87966e-15 1 + txt003 +STRI + V0 0.996219 0.996219 2.49844 V1 1.21396 0.712995 2.49844 V2 1.2393 0.727875 2.4875 + N0 1.67359e-15 1.4538e-15 1 N1 2.05298e-15 8.74229e-16 1 N2 0.480481 0.278679 0.83155 + txt003 +STRI + V0 1.2393 0.727875 2.4875 V1 1.01701 1.01701 2.4875 V2 0.996219 0.996219 2.49844 + N0 0.480481 0.278679 0.83155 N1 0.392564 0.392564 0.831737 N2 1.67359e-15 1.4538e-15 1 + txt003 +STRI + V0 1.21396 0.712995 2.49844 V1 1.35376 0.376765 2.49844 V2 1.38201 0.384628 2.4875 + N0 2.05298e-15 8.74229e-16 1 N1 2.25214e-15 1.77072e-16 1 N2 0.537012 0.14476 0.831061 + txt003 +STRI + V0 1.38201 0.384628 2.4875 V1 1.2393 0.727875 2.4875 V2 1.21396 0.712995 2.49844 + N0 0.537012 0.14476 0.831061 N1 0.480481 0.278679 0.83155 N2 2.05298e-15 8.74229e-16 1 + txt003 +STRI + V0 1.35376 0.376765 2.49844 V1 1.40312 0 2.49844 V2 1.43241 0 2.4875 + N0 2.25214e-15 1.77072e-16 1 N1 2.22045e-15 -5.65179e-16 1 N2 0.556738 -4.5989e-16 0.830688 + txt003 +STRI + V0 1.43241 0 2.4875 V1 1.38201 0.384628 2.4875 V2 1.35376 0.376765 2.49844 + N0 0.556738 -4.5989e-16 0.830688 N1 0.537012 0.14476 0.831061 N2 2.25214e-15 1.77072e-16 1 + txt003 +STRI + V0 0 1.43241 2.4875 V1 0.384628 1.38201 2.4875 V2 0.393796 1.41495 2.45469 + N0 -0 0.556738 0.830688 N1 0.14476 0.537012 0.831061 N2 0.203756 0.755869 0.622211 + txt003 +STRI + V0 0.393796 1.41495 2.45469 V1 0 1.46655 2.45469 V2 0 1.43241 2.4875 + N0 0.203756 0.755869 0.622211 N1 -0 0.783289 0.621658 N2 -0 0.556738 0.830688 + txt003 +STRI + V0 0.384628 1.38201 2.4875 V1 0.727875 1.2393 2.4875 V2 0.745225 1.26884 2.45469 + N0 0.14476 0.537012 0.831061 N1 0.278679 0.480481 0.83155 N2 0.39248 0.67669 0.622937 + txt003 +STRI + V0 0.745225 1.26884 2.45469 V1 0.393796 1.41495 2.45469 V2 0.384628 1.38201 2.4875 + N0 0.39248 0.67669 0.622937 N1 0.203756 0.755869 0.622211 N2 0.14476 0.537012 0.831061 + txt003 +STRI + V0 0.727875 1.2393 2.4875 V1 1.01701 1.01701 2.4875 V2 1.04125 1.04125 2.45469 + N0 0.278679 0.480481 0.83155 N1 0.392564 0.392564 0.831737 N2 0.552993 0.552993 0.623215 + txt003 +STRI + V0 1.04125 1.04125 2.45469 V1 0.745225 1.26884 2.45469 V2 0.727875 1.2393 2.4875 + N0 0.552993 0.552993 0.623215 N1 0.39248 0.67669 0.622937 N2 0.278679 0.480481 0.83155 + txt003 +STRI + V0 1.01701 1.01701 2.4875 V1 1.2393 0.727875 2.4875 V2 1.26884 0.745225 2.45469 + N0 0.392564 0.392564 0.831737 N1 0.480481 0.278679 0.83155 N2 0.67669 0.39248 0.622937 + txt003 +STRI + V0 1.26884 0.745225 2.45469 V1 1.04125 1.04125 2.45469 V2 1.01701 1.01701 2.4875 + N0 0.67669 0.39248 0.622937 N1 0.552993 0.552993 0.623215 N2 0.392564 0.392564 0.831737 + txt003 +STRI + V0 1.2393 0.727875 2.4875 V1 1.38201 0.384628 2.4875 V2 1.41495 0.393796 2.45469 + N0 0.480481 0.278679 0.83155 N1 0.537012 0.14476 0.831061 N2 0.755869 0.203756 0.622211 + txt003 +STRI + V0 1.41495 0.393796 2.45469 V1 1.26884 0.745225 2.45469 V2 1.2393 0.727875 2.4875 + N0 0.755869 0.203756 0.622211 N1 0.67669 0.39248 0.622937 N2 0.480481 0.278679 0.83155 + txt003 +STRI + V0 1.38201 0.384628 2.4875 V1 1.43241 0 2.4875 V2 1.46655 0 2.45469 + N0 0.537012 0.14476 0.831061 N1 0.556738 -4.5989e-16 0.830688 N2 0.783289 -1.94969e-16 0.621658 + txt003 +STRI + V0 1.46655 0 2.45469 V1 1.41495 0.393796 2.45469 V2 1.38201 0.384628 2.4875 + N0 0.783289 -1.94969e-16 0.621658 N1 0.755869 0.203756 0.622211 N2 0.537012 0.14476 0.831061 + txt003 +STRI + V0 0 1.46655 2.45469 V1 0.393796 1.41495 2.45469 V2 0.402778 1.44722 2.4 + N0 -0 0.783289 0.621658 N1 0.203756 0.755869 0.622211 N2 0.234929 0.871509 0.430442 + txt003 +STRI + V0 0.402778 1.44722 2.4 V1 0 1.5 2.4 V2 0 1.46655 2.45469 + N0 0.234929 0.871509 0.430442 N1 -0 0.902861 0.429934 N2 -0 0.783289 0.621658 + txt003 +STRI + V0 0.393796 1.41495 2.45469 V1 0.745225 1.26884 2.45469 V2 0.762222 1.29778 2.4 + N0 0.203756 0.755869 0.622211 N1 0.39248 0.67669 0.622937 N2 0.4527 0.780517 0.43111 + txt003 +STRI + V0 0.762222 1.29778 2.4 V1 0.402778 1.44722 2.4 V2 0.393796 1.41495 2.45469 + N0 0.4527 0.780517 0.43111 N1 0.234929 0.871509 0.430442 N2 0.203756 0.755869 0.622211 + txt003 +STRI + V0 0.745225 1.26884 2.45469 V1 1.04125 1.04125 2.45469 V2 1.065 1.065 2.4 + N0 0.39248 0.67669 0.622937 N1 0.552993 0.552993 0.623215 N2 0.637936 0.637936 0.431366 + txt003 +STRI + V0 1.065 1.065 2.4 V1 0.762222 1.29778 2.4 V2 0.745225 1.26884 2.45469 + N0 0.637936 0.637936 0.431366 N1 0.4527 0.780517 0.43111 N2 0.39248 0.67669 0.622937 + txt003 +STRI + V0 1.04125 1.04125 2.45469 V1 1.26884 0.745225 2.45469 V2 1.29778 0.762222 2.4 + N0 0.552993 0.552993 0.623215 N1 0.67669 0.39248 0.622937 N2 0.780517 0.4527 0.43111 + txt003 +STRI + V0 1.29778 0.762222 2.4 V1 1.065 1.065 2.4 V2 1.04125 1.04125 2.45469 + N0 0.780517 0.4527 0.43111 N1 0.637936 0.637936 0.431366 N2 0.552993 0.552993 0.623215 + txt003 +STRI + V0 1.26884 0.745225 2.45469 V1 1.41495 0.393796 2.45469 V2 1.44722 0.402778 2.4 + N0 0.67669 0.39248 0.622937 N1 0.755869 0.203756 0.622211 N2 0.871509 0.234929 0.430442 + txt003 +STRI + V0 1.44722 0.402778 2.4 V1 1.29778 0.762222 2.4 V2 1.26884 0.745225 2.45469 + N0 0.871509 0.234929 0.430442 N1 0.780517 0.4527 0.43111 N2 0.67669 0.39248 0.622937 + txt003 +STRI + V0 1.41495 0.393796 2.45469 V1 1.46655 0 2.45469 V2 1.5 0 2.4 + N0 0.755869 0.203756 0.622211 N1 0.783289 -1.94969e-16 0.621658 N2 0.902861 -6.81889e-17 0.429934 + txt003 +STRI + V0 1.5 0 2.4 V1 1.44722 0.402778 2.4 V2 1.41495 0.393796 2.45469 + N0 0.902861 -6.81889e-17 0.429934 N1 0.871509 0.234929 0.430442 N2 0.755869 0.203756 0.622211 + txt003 +STRI + V0 1.5 0 2.4 V1 1.44722 -0.402778 2.4 V2 1.56671 -0.436032 2.13785 + N0 0.902861 0 0.429934 N1 0.871509 -0.234929 0.430442 N2 0.875348 -0.235963 0.422003 + txt003 +STRI + V0 1.56671 -0.436032 2.13785 V1 1.62384 0 2.13785 V2 1.5 0 2.4 + N0 0.875348 -0.235963 0.422003 N1 0.906828 0 0.4215 N2 0.902861 0 0.429934 + txt003 +STRI + V0 1.44722 -0.402778 2.4 V1 1.29778 -0.762222 2.4 V2 1.40492 -0.825153 2.13785 + N0 0.871509 -0.234929 0.430442 N1 0.780517 -0.4527 0.43111 N2 0.783966 -0.4547 0.422664 + txt003 +STRI + V0 1.40492 -0.825153 2.13785 V1 1.56671 -0.436032 2.13785 V2 1.44722 -0.402778 2.4 + N0 0.783966 -0.4547 0.422664 N1 0.875348 -0.235963 0.422003 N2 0.871509 -0.234929 0.430442 + txt003 +STRI + V0 1.29778 -0.762222 2.4 V1 1.065 -1.065 2.4 V2 1.15293 -1.15293 2.13785 + N0 0.780517 -0.4527 0.43111 N1 0.637936 -0.637936 0.431366 N2 0.640758 -0.640758 0.422917 + txt003 +STRI + V0 1.15293 -1.15293 2.13785 V1 1.40492 -0.825153 2.13785 V2 1.29778 -0.762222 2.4 + N0 0.640758 -0.640758 0.422917 N1 0.783966 -0.4547 0.422664 N2 0.780517 -0.4527 0.43111 + txt003 +STRI + V0 1.065 -1.065 2.4 V1 0.762222 -1.29778 2.4 V2 0.825153 -1.40492 2.13785 + N0 0.637936 -0.637936 0.431366 N1 0.4527 -0.780517 0.43111 N2 0.4547 -0.783966 0.422664 + txt003 +STRI + V0 0.825153 -1.40492 2.13785 V1 1.15293 -1.15293 2.13785 V2 1.065 -1.065 2.4 + N0 0.4547 -0.783966 0.422664 N1 0.640758 -0.640758 0.422917 N2 0.637936 -0.637936 0.431366 + txt003 +STRI + V0 0.762222 -1.29778 2.4 V1 0.402778 -1.44722 2.4 V2 0.436032 -1.56671 2.13785 + N0 0.4527 -0.780517 0.43111 N1 0.234929 -0.871509 0.430442 N2 0.235963 -0.875348 0.422003 + txt003 +STRI + V0 0.436032 -1.56671 2.13785 V1 0.825153 -1.40492 2.13785 V2 0.762222 -1.29778 2.4 + N0 0.235963 -0.875348 0.422003 N1 0.4547 -0.783966 0.422664 N2 0.4527 -0.780517 0.43111 + txt003 +STRI + V0 0.402778 -1.44722 2.4 V1 0 -1.5 2.4 V2 2.22045e-16 -1.62384 2.13785 + N0 0.234929 -0.871509 0.430442 N1 -2.27296e-16 -0.902861 0.429934 N2 -2.05843e-16 -0.906828 0.4215 + txt003 +STRI + V0 2.22045e-16 -1.62384 2.13785 V1 0.436032 -1.56671 2.13785 V2 0.402778 -1.44722 2.4 + N0 -2.05843e-16 -0.906828 0.4215 N1 0.235963 -0.875348 0.422003 N2 0.234929 -0.871509 0.430442 + txt003 +STRI + V0 1.62384 0 2.13785 V1 1.56671 -0.436032 2.13785 V2 1.67949 -0.467421 1.87778 + N0 0.906828 0 0.4215 N1 0.875348 -0.235963 0.422003 N2 0.886771 -0.239043 0.395595 + txt003 +STRI + V0 1.67949 -0.467421 1.87778 V1 1.74074 0 1.87778 V2 1.62384 0 2.13785 + N0 0.886771 -0.239043 0.395595 N1 0.918633 0 0.395111 N2 0.906828 0 0.4215 + txt003 +STRI + V0 1.56671 -0.436032 2.13785 V1 1.40492 -0.825153 2.13785 V2 1.50606 -0.884554 1.87778 + N0 0.875348 -0.235963 0.422003 N1 0.783966 -0.4547 0.422664 N2 0.794229 -0.460653 0.39623 + txt003 +STRI + V0 1.50606 -0.884554 1.87778 V1 1.67949 -0.467421 1.87778 V2 1.56671 -0.436032 2.13785 + N0 0.794229 -0.460653 0.39623 N1 0.886771 -0.239043 0.395595 N2 0.875348 -0.235963 0.422003 + txt003 +STRI + V0 1.40492 -0.825153 2.13785 V1 1.15293 -1.15293 2.13785 V2 1.23593 -1.23593 1.87778 + N0 0.783966 -0.4547 0.422664 N1 0.640758 -0.640758 0.422917 N2 0.649156 -0.649156 0.396474 + txt003 +STRI + V0 1.23593 -1.23593 1.87778 V1 1.50606 -0.884554 1.87778 V2 1.40492 -0.825153 2.13785 + N0 0.649156 -0.649156 0.396474 N1 0.794229 -0.460653 0.39623 N2 0.783966 -0.4547 0.422664 + txt003 +STRI + V0 1.15293 -1.15293 2.13785 V1 0.825153 -1.40492 2.13785 V2 0.884554 -1.50606 1.87778 + N0 0.640758 -0.640758 0.422917 N1 0.4547 -0.783966 0.422664 N2 0.460653 -0.794229 0.39623 + txt003 +STRI + V0 0.884554 -1.50606 1.87778 V1 1.23593 -1.23593 1.87778 V2 1.15293 -1.15293 2.13785 + N0 0.460653 -0.794229 0.39623 N1 0.649156 -0.649156 0.396474 N2 0.640758 -0.640758 0.422917 + txt003 +STRI + V0 0.825153 -1.40492 2.13785 V1 0.436032 -1.56671 2.13785 V2 0.467421 -1.67949 1.87778 + N0 0.4547 -0.783966 0.422664 N1 0.235963 -0.875348 0.422003 N2 0.239043 -0.886771 0.395595 + txt003 +STRI + V0 0.467421 -1.67949 1.87778 V1 0.884554 -1.50606 1.87778 V2 0.825153 -1.40492 2.13785 + N0 0.239043 -0.886771 0.395595 N1 0.460653 -0.794229 0.39623 N2 0.4547 -0.783966 0.422664 + txt003 +STRI + V0 0.436032 -1.56671 2.13785 V1 2.22045e-16 -1.62384 2.13785 V2 0 -1.74074 1.87778 + N0 0.235963 -0.875348 0.422003 N1 -2.05843e-16 -0.906828 0.4215 N2 -1.79998e-16 -0.918633 0.395111 + txt003 +STRI + V0 0 -1.74074 1.87778 V1 0.467421 -1.67949 1.87778 V2 0.436032 -1.56671 2.13785 + N0 -1.79998e-16 -0.918633 0.395111 N1 0.239043 -0.886771 0.395595 N2 0.235963 -0.875348 0.422003 + txt003 +STRI + V0 1.74074 0 1.87778 V1 1.67949 -0.467421 1.87778 V2 1.77888 -0.495081 1.62188 + N0 0.918633 0 0.395111 N1 0.886771 -0.239043 0.395595 N2 0.90527 -0.244029 0.347757 + txt003 +STRI + V0 1.77888 -0.495081 1.62188 V1 1.84375 0 1.62188 V2 1.74074 0 1.87778 + N0 0.90527 -0.244029 0.347757 N1 0.937749 0 0.347314 N2 0.918633 0 0.395111 + txt003 +STRI + V0 1.67949 -0.467421 1.87778 V1 1.50606 -0.884554 1.87778 V2 1.59519 -0.936898 1.62188 + N0 0.886771 -0.239043 0.395595 N1 0.794229 -0.460653 0.39623 N2 0.810853 -0.470295 0.34834 + txt003 +STRI + V0 1.59519 -0.936898 1.62188 V1 1.77888 -0.495081 1.62188 V2 1.67949 -0.467421 1.87778 + N0 0.810853 -0.470295 0.34834 N1 0.90527 -0.244029 0.347757 N2 0.886771 -0.239043 0.395595 + txt003 +STRI + V0 1.50606 -0.884554 1.87778 V1 1.23593 -1.23593 1.87778 V2 1.30906 -1.30906 1.62188 + N0 0.794229 -0.460653 0.39623 N1 0.649156 -0.649156 0.396474 N2 0.662761 -0.662761 0.348563 + txt003 +STRI + V0 1.30906 -1.30906 1.62188 V1 1.59519 -0.936898 1.62188 V2 1.50606 -0.884554 1.87778 + N0 0.662761 -0.662761 0.348563 N1 0.810853 -0.470295 0.34834 N2 0.794229 -0.460653 0.39623 + txt003 +STRI + V0 1.23593 -1.23593 1.87778 V1 0.884554 -1.50606 1.87778 V2 0.936898 -1.59519 1.62187 + N0 0.649156 -0.649156 0.396474 N1 0.460653 -0.794229 0.39623 N2 0.470295 -0.810853 0.34834 + txt003 +STRI + V0 0.936898 -1.59519 1.62187 V1 1.30906 -1.30906 1.62188 V2 1.23593 -1.23593 1.87778 + N0 0.470295 -0.810853 0.34834 N1 0.662761 -0.662761 0.348563 N2 0.649156 -0.649156 0.396474 + txt003 +STRI + V0 0.884554 -1.50606 1.87778 V1 0.467421 -1.67949 1.87778 V2 0.495081 -1.77888 1.62187 + N0 0.460653 -0.794229 0.39623 N1 0.239043 -0.886771 0.395595 N2 0.244029 -0.90527 0.347757 + txt003 +STRI + V0 0.495081 -1.77888 1.62187 V1 0.936898 -1.59519 1.62187 V2 0.884554 -1.50606 1.87778 + N0 0.244029 -0.90527 0.347757 N1 0.470295 -0.810853 0.34834 N2 0.460653 -0.794229 0.39623 + txt003 +STRI + V0 0.467421 -1.67949 1.87778 V1 0 -1.74074 1.87778 V2 0 -1.84375 1.62187 + N0 0.239043 -0.886771 0.395595 N1 -1.79998e-16 -0.918633 0.395111 N2 -1.49384e-16 -0.937749 0.347314 + txt003 +STRI + V0 0 -1.84375 1.62187 V1 0.495081 -1.77888 1.62187 V2 0.467421 -1.67949 1.87778 + N0 -1.49384e-16 -0.937749 0.347314 N1 0.244029 -0.90527 0.347757 N2 0.239043 -0.886771 0.395595 + txt003 +STRI + V0 1.84375 0 1.62188 V1 1.77888 -0.495081 1.62188 V2 1.85816 -0.517147 1.37222 + N0 0.937749 0 0.347314 N1 0.90527 -0.244029 0.347757 N2 0.929073 -0.250446 0.272213 + txt003 +STRI + V0 1.85816 -0.517147 1.37222 V1 1.92593 0 1.37222 V2 1.84375 0 1.62188 + N0 0.929073 -0.250446 0.272213 N1 0.96234 0 0.271848 N2 0.937749 0 0.347314 + txt003 +STRI + V0 1.77888 -0.495081 1.62188 V1 1.59519 -0.936898 1.62188 V2 1.66628 -0.978656 1.37222 + N0 0.90527 -0.244029 0.347757 N1 0.810853 -0.470295 0.34834 N2 0.832247 -0.482704 0.272693 + txt003 +STRI + V0 1.66628 -0.978656 1.37222 V1 1.85816 -0.517147 1.37222 V2 1.77888 -0.495081 1.62188 + N0 0.832247 -0.482704 0.272693 N1 0.929073 -0.250446 0.272213 N2 0.90527 -0.244029 0.347757 + txt003 +STRI + V0 1.59519 -0.936898 1.62188 V1 1.30906 -1.30906 1.62188 V2 1.36741 -1.36741 1.37222 + N0 0.810853 -0.470295 0.34834 N1 0.662761 -0.662761 0.348563 N2 0.680271 -0.680271 0.272877 + txt003 +STRI + V0 1.36741 -1.36741 1.37222 V1 1.66628 -0.978656 1.37222 V2 1.59519 -0.936898 1.62188 + N0 0.680271 -0.680271 0.272877 N1 0.832247 -0.482704 0.272693 N2 0.810853 -0.470295 0.34834 + txt003 +STRI + V0 1.30906 -1.30906 1.62188 V1 0.936898 -1.59519 1.62187 V2 0.978656 -1.66628 1.37222 + N0 0.662761 -0.662761 0.348563 N1 0.470295 -0.810853 0.34834 N2 0.482704 -0.832247 0.272693 + txt003 +STRI + V0 0.978656 -1.66628 1.37222 V1 1.36741 -1.36741 1.37222 V2 1.30906 -1.30906 1.62188 + N0 0.482704 -0.832247 0.272693 N1 0.680271 -0.680271 0.272877 N2 0.662761 -0.662761 0.348563 + txt003 +STRI + V0 0.936898 -1.59519 1.62187 V1 0.495081 -1.77888 1.62187 V2 0.517147 -1.85816 1.37222 + N0 0.470295 -0.810853 0.34834 N1 0.244029 -0.90527 0.347757 N2 0.250446 -0.929073 0.272213 + txt003 +STRI + V0 0.517147 -1.85816 1.37222 V1 0.978656 -1.66628 1.37222 V2 0.936898 -1.59519 1.62187 + N0 0.250446 -0.929073 0.272213 N1 0.482704 -0.832247 0.272693 N2 0.470295 -0.810853 0.34834 + txt003 +STRI + V0 0.495081 -1.77888 1.62187 V1 0 -1.84375 1.62187 V2 2.22045e-16 -1.92593 1.37222 + N0 0.244029 -0.90527 0.347757 N1 -1.49384e-16 -0.937749 0.347314 N2 -1.11936e-16 -0.96234 0.271848 + txt003 +STRI + V0 2.22045e-16 -1.92593 1.37222 V1 0.517147 -1.85816 1.37222 V2 0.495081 -1.77888 1.62187 + N0 -1.11936e-16 -0.96234 0.271848 N1 0.250446 -0.929073 0.272213 N2 0.244029 -0.90527 0.347757 + txt003 +STRI + V0 1.92593 0 1.37222 V1 1.85816 -0.517147 1.37222 V2 1.91065 -0.531754 1.1309 + N0 0.96234 0 0.271848 N1 0.929073 -0.250446 0.272213 N2 0.953145 -0.256935 0.159686 + txt003 +STRI + V0 1.91065 -0.531754 1.1309 V1 1.98032 0 1.1309 V2 1.92593 0 1.37222 + N0 0.953145 -0.256935 0.159686 N1 0.987204 0 0.15946 N2 0.96234 0 0.271848 + txt003 +STRI + V0 1.85816 -0.517147 1.37222 V1 1.66628 -0.978656 1.37222 V2 1.71335 -1.0063 1.1309 + N0 0.929073 -0.250446 0.272213 N1 0.832247 -0.482704 0.272693 N2 0.853889 -0.495256 0.159982 + txt003 +STRI + V0 1.71335 -1.0063 1.1309 V1 1.91065 -0.531754 1.1309 V2 1.85816 -0.517147 1.37222 + N0 0.853889 -0.495256 0.159982 N1 0.953145 -0.256935 0.159686 N2 0.929073 -0.250446 0.272213 + txt003 +STRI + V0 1.66628 -0.978656 1.37222 V1 1.36741 -1.36741 1.37222 V2 1.40603 -1.40603 1.1309 + N0 0.832247 -0.482704 0.272693 N1 0.680271 -0.680271 0.272877 N2 0.697986 -0.697986 0.160096 + txt003 +STRI + V0 1.40603 -1.40603 1.1309 V1 1.71335 -1.0063 1.1309 V2 1.66628 -0.978656 1.37222 + N0 0.697986 -0.697986 0.160096 N1 0.853889 -0.495256 0.159982 N2 0.832247 -0.482704 0.272693 + txt003 +STRI + V0 1.36741 -1.36741 1.37222 V1 0.978656 -1.66628 1.37222 V2 1.0063 -1.71335 1.1309 + N0 0.680271 -0.680271 0.272877 N1 0.482704 -0.832247 0.272693 N2 0.495256 -0.853889 0.159982 + txt003 +STRI + V0 1.0063 -1.71335 1.1309 V1 1.40603 -1.40603 1.1309 V2 1.36741 -1.36741 1.37222 + N0 0.495256 -0.853889 0.159982 N1 0.697986 -0.697986 0.160096 N2 0.680271 -0.680271 0.272877 + txt003 +STRI + V0 0.978656 -1.66628 1.37222 V1 0.517147 -1.85816 1.37222 V2 0.531754 -1.91065 1.1309 + N0 0.482704 -0.832247 0.272693 N1 0.250446 -0.929073 0.272213 N2 0.256935 -0.953145 0.159686 + txt003 +STRI + V0 0.531754 -1.91065 1.1309 V1 1.0063 -1.71335 1.1309 V2 0.978656 -1.66628 1.37222 + N0 0.256935 -0.953145 0.159686 N1 0.495256 -0.853889 0.159982 N2 0.482704 -0.832247 0.272693 + txt003 +STRI + V0 0.517147 -1.85816 1.37222 V1 2.22045e-16 -1.92593 1.37222 V2 -2.22045e-16 -1.98032 1.1309 + N0 0.250446 -0.929073 0.272213 N1 -1.11936e-16 -0.96234 0.271848 N2 -6.38555e-17 -0.987204 0.15946 + txt003 +STRI + V0 -2.22045e-16 -1.98032 1.1309 V1 0.531754 -1.91065 1.1309 V2 0.517147 -1.85816 1.37222 + N0 -6.38555e-17 -0.987204 0.15946 N1 0.256935 -0.953145 0.159686 N2 0.250446 -0.929073 0.272213 + txt003 +STRI + V0 1.98032 0 1.1309 V1 1.91065 -0.531754 1.1309 V2 1.92963 -0.537037 0.9 + N0 0.987204 0 0.15946 N1 0.953145 -0.256935 0.159686 N2 0.965535 -0.260275 5.17854e-17 + txt003 +STRI + V0 1.92963 -0.537037 0.9 V1 2 0 0.9 V2 1.98032 0 1.1309 + N0 0.965535 -0.260275 5.17854e-17 N1 1 0 0 N2 0.987204 0 0.15946 + txt003 +STRI + V0 1.91065 -0.531754 1.1309 V1 1.71335 -1.0063 1.1309 V2 1.73037 -1.0163 0.9 + N0 0.953145 -0.256935 0.159686 N1 0.853889 -0.495256 0.159982 N2 0.865031 -0.501718 1.36587e-16 + txt003 +STRI + V0 1.73037 -1.0163 0.9 V1 1.92963 -0.537037 0.9 V2 1.91065 -0.531754 1.1309 + N0 0.865031 -0.501718 1.36587e-16 N1 0.965535 -0.260275 5.17854e-17 N2 0.953145 -0.256935 0.159686 + txt003 +STRI + V0 1.71335 -1.0063 1.1309 V1 1.40603 -1.40603 1.1309 V2 1.42 -1.42 0.9 + N0 0.853889 -0.495256 0.159982 N1 0.697986 -0.697986 0.160096 N2 0.707107 -0.707107 1.74455e-16 + txt003 +STRI + V0 1.42 -1.42 0.9 V1 1.73037 -1.0163 0.9 V2 1.71335 -1.0063 1.1309 + N0 0.707107 -0.707107 1.74455e-16 N1 0.865031 -0.501718 1.36587e-16 N2 0.853889 -0.495256 0.159982 + txt003 +STRI + V0 1.40603 -1.40603 1.1309 V1 1.0063 -1.71335 1.1309 V2 1.0163 -1.73037 0.9 + N0 0.697986 -0.697986 0.160096 N1 0.495256 -0.853889 0.159982 N2 0.501718 -0.865031 1.36587e-16 + txt003 +STRI + V0 1.0163 -1.73037 0.9 V1 1.42 -1.42 0.9 V2 1.40603 -1.40603 1.1309 + N0 0.501718 -0.865031 1.36587e-16 N1 0.707107 -0.707107 1.74455e-16 N2 0.697986 -0.697986 0.160096 + txt003 +STRI + V0 1.0063 -1.71335 1.1309 V1 0.531754 -1.91065 1.1309 V2 0.537037 -1.92963 0.9 + N0 0.495256 -0.853889 0.159982 N1 0.256935 -0.953145 0.159686 N2 0.260275 -0.965535 5.17854e-17 + txt003 +STRI + V0 0.537037 -1.92963 0.9 V1 1.0163 -1.73037 0.9 V2 1.0063 -1.71335 1.1309 + N0 0.260275 -0.965535 5.17854e-17 N1 0.501718 -0.865031 1.36587e-16 N2 0.495256 -0.853889 0.159982 + txt003 +STRI + V0 0.531754 -1.91065 1.1309 V1 -2.22045e-16 -1.98032 1.1309 V2 0 -2 0.9 + N0 0.256935 -0.953145 0.159686 N1 -6.38555e-17 -0.987204 0.15946 N2 0 -1 -0 + txt003 +STRI + V0 0 -2 0.9 V1 0.537037 -1.92963 0.9 V2 0.531754 -1.91065 1.1309 + N0 0 -1 -0 N1 0.260275 -0.965535 5.17854e-17 N2 0.256935 -0.953145 0.159686 + txt003 +STRI + V0 0 -1.5 2.4 V1 -0.402778 -1.44722 2.4 V2 -0.436032 -1.56671 2.13785 + N0 0 -0.902861 0.429934 N1 -0.234929 -0.871509 0.430442 N2 -0.235963 -0.875348 0.422003 + txt003 +STRI + V0 -0.436032 -1.56671 2.13785 V1 0 -1.62384 2.13785 V2 0 -1.5 2.4 + N0 -0.235963 -0.875348 0.422003 N1 0 -0.906828 0.4215 N2 0 -0.902861 0.429934 + txt003 +STRI + V0 -0.402778 -1.44722 2.4 V1 -0.762222 -1.29778 2.4 V2 -0.825153 -1.40492 2.13785 + N0 -0.234929 -0.871509 0.430442 N1 -0.4527 -0.780517 0.43111 N2 -0.4547 -0.783966 0.422664 + txt003 +STRI + V0 -0.825153 -1.40492 2.13785 V1 -0.436032 -1.56671 2.13785 V2 -0.402778 -1.44722 2.4 + N0 -0.4547 -0.783966 0.422664 N1 -0.235963 -0.875348 0.422003 N2 -0.234929 -0.871509 0.430442 + txt003 +STRI + V0 -0.762222 -1.29778 2.4 V1 -1.065 -1.065 2.4 V2 -1.15293 -1.15293 2.13785 + N0 -0.4527 -0.780517 0.43111 N1 -0.637936 -0.637936 0.431366 N2 -0.640758 -0.640758 0.422917 + txt003 +STRI + V0 -1.15293 -1.15293 2.13785 V1 -0.825153 -1.40492 2.13785 V2 -0.762222 -1.29778 2.4 + N0 -0.640758 -0.640758 0.422917 N1 -0.4547 -0.783966 0.422664 N2 -0.4527 -0.780517 0.43111 + txt003 +STRI + V0 -1.065 -1.065 2.4 V1 -1.29778 -0.762222 2.4 V2 -1.40492 -0.825153 2.13785 + N0 -0.637936 -0.637936 0.431366 N1 -0.780517 -0.4527 0.43111 N2 -0.783966 -0.4547 0.422664 + txt003 +STRI + V0 -1.40492 -0.825153 2.13785 V1 -1.15293 -1.15293 2.13785 V2 -1.065 -1.065 2.4 + N0 -0.783966 -0.4547 0.422664 N1 -0.640758 -0.640758 0.422917 N2 -0.637936 -0.637936 0.431366 + txt003 +STRI + V0 -1.29778 -0.762222 2.4 V1 -1.44722 -0.402778 2.4 V2 -1.56671 -0.436032 2.13785 + N0 -0.780517 -0.4527 0.43111 N1 -0.871509 -0.234929 0.430442 N2 -0.875348 -0.235963 0.422003 + txt003 +STRI + V0 -1.56671 -0.436032 2.13785 V1 -1.40492 -0.825153 2.13785 V2 -1.29778 -0.762222 2.4 + N0 -0.875348 -0.235963 0.422003 N1 -0.783966 -0.4547 0.422664 N2 -0.780517 -0.4527 0.43111 + txt003 +STRI + V0 -1.44722 -0.402778 2.4 V1 -1.5 0 2.4 V2 -1.62384 -2.22045e-16 2.13785 + N0 -0.871509 -0.234929 0.430442 N1 -0.902861 2.27296e-16 0.429934 N2 -0.906828 2.05843e-16 0.4215 + txt003 +STRI + V0 -1.62384 -2.22045e-16 2.13785 V1 -1.56671 -0.436032 2.13785 V2 -1.44722 -0.402778 2.4 + N0 -0.906828 2.05843e-16 0.4215 N1 -0.875348 -0.235963 0.422003 N2 -0.871509 -0.234929 0.430442 + txt003 +STRI + V0 0 -1.62384 2.13785 V1 -0.436032 -1.56671 2.13785 V2 -0.467421 -1.67949 1.87778 + N0 0 -0.906828 0.4215 N1 -0.235963 -0.875348 0.422003 N2 -0.239043 -0.886771 0.395595 + txt003 +STRI + V0 -0.467421 -1.67949 1.87778 V1 0 -1.74074 1.87778 V2 0 -1.62384 2.13785 + N0 -0.239043 -0.886771 0.395595 N1 0 -0.918633 0.395111 N2 0 -0.906828 0.4215 + txt003 +STRI + V0 -0.436032 -1.56671 2.13785 V1 -0.825153 -1.40492 2.13785 V2 -0.884554 -1.50606 1.87778 + N0 -0.235963 -0.875348 0.422003 N1 -0.4547 -0.783966 0.422664 N2 -0.460653 -0.794229 0.39623 + txt003 +STRI + V0 -0.884554 -1.50606 1.87778 V1 -0.467421 -1.67949 1.87778 V2 -0.436032 -1.56671 2.13785 + N0 -0.460653 -0.794229 0.39623 N1 -0.239043 -0.886771 0.395595 N2 -0.235963 -0.875348 0.422003 + txt003 +STRI + V0 -0.825153 -1.40492 2.13785 V1 -1.15293 -1.15293 2.13785 V2 -1.23593 -1.23593 1.87778 + N0 -0.4547 -0.783966 0.422664 N1 -0.640758 -0.640758 0.422917 N2 -0.649156 -0.649156 0.396474 + txt003 +STRI + V0 -1.23593 -1.23593 1.87778 V1 -0.884554 -1.50606 1.87778 V2 -0.825153 -1.40492 2.13785 + N0 -0.649156 -0.649156 0.396474 N1 -0.460653 -0.794229 0.39623 N2 -0.4547 -0.783966 0.422664 + txt003 +STRI + V0 -1.15293 -1.15293 2.13785 V1 -1.40492 -0.825153 2.13785 V2 -1.50606 -0.884554 1.87778 + N0 -0.640758 -0.640758 0.422917 N1 -0.783966 -0.4547 0.422664 N2 -0.794229 -0.460653 0.39623 + txt003 +STRI + V0 -1.50606 -0.884554 1.87778 V1 -1.23593 -1.23593 1.87778 V2 -1.15293 -1.15293 2.13785 + N0 -0.794229 -0.460653 0.39623 N1 -0.649156 -0.649156 0.396474 N2 -0.640758 -0.640758 0.422917 + txt003 +STRI + V0 -1.40492 -0.825153 2.13785 V1 -1.56671 -0.436032 2.13785 V2 -1.67949 -0.467421 1.87778 + N0 -0.783966 -0.4547 0.422664 N1 -0.875348 -0.235963 0.422003 N2 -0.886771 -0.239043 0.395595 + txt003 +STRI + V0 -1.67949 -0.467421 1.87778 V1 -1.50606 -0.884554 1.87778 V2 -1.40492 -0.825153 2.13785 + N0 -0.886771 -0.239043 0.395595 N1 -0.794229 -0.460653 0.39623 N2 -0.783966 -0.4547 0.422664 + txt003 +STRI + V0 -1.56671 -0.436032 2.13785 V1 -1.62384 -2.22045e-16 2.13785 V2 -1.74074 0 1.87778 + N0 -0.875348 -0.235963 0.422003 N1 -0.906828 2.05843e-16 0.4215 N2 -0.918633 1.79998e-16 0.395111 + txt003 +STRI + V0 -1.74074 0 1.87778 V1 -1.67949 -0.467421 1.87778 V2 -1.56671 -0.436032 2.13785 + N0 -0.918633 1.79998e-16 0.395111 N1 -0.886771 -0.239043 0.395595 N2 -0.875348 -0.235963 0.422003 + txt003 +STRI + V0 0 -1.74074 1.87778 V1 -0.467421 -1.67949 1.87778 V2 -0.495081 -1.77888 1.62188 + N0 0 -0.918633 0.395111 N1 -0.239043 -0.886771 0.395595 N2 -0.244029 -0.90527 0.347757 + txt003 +STRI + V0 -0.495081 -1.77888 1.62188 V1 0 -1.84375 1.62188 V2 0 -1.74074 1.87778 + N0 -0.244029 -0.90527 0.347757 N1 0 -0.937749 0.347314 N2 0 -0.918633 0.395111 + txt003 +STRI + V0 -0.467421 -1.67949 1.87778 V1 -0.884554 -1.50606 1.87778 V2 -0.936898 -1.59519 1.62188 + N0 -0.239043 -0.886771 0.395595 N1 -0.460653 -0.794229 0.39623 N2 -0.470295 -0.810853 0.34834 + txt003 +STRI + V0 -0.936898 -1.59519 1.62188 V1 -0.495081 -1.77888 1.62188 V2 -0.467421 -1.67949 1.87778 + N0 -0.470295 -0.810853 0.34834 N1 -0.244029 -0.90527 0.347757 N2 -0.239043 -0.886771 0.395595 + txt003 +STRI + V0 -0.884554 -1.50606 1.87778 V1 -1.23593 -1.23593 1.87778 V2 -1.30906 -1.30906 1.62188 + N0 -0.460653 -0.794229 0.39623 N1 -0.649156 -0.649156 0.396474 N2 -0.662761 -0.662761 0.348563 + txt003 +STRI + V0 -1.30906 -1.30906 1.62188 V1 -0.936898 -1.59519 1.62188 V2 -0.884554 -1.50606 1.87778 + N0 -0.662761 -0.662761 0.348563 N1 -0.470295 -0.810853 0.34834 N2 -0.460653 -0.794229 0.39623 + txt003 +STRI + V0 -1.23593 -1.23593 1.87778 V1 -1.50606 -0.884554 1.87778 V2 -1.59519 -0.936898 1.62187 + N0 -0.649156 -0.649156 0.396474 N1 -0.794229 -0.460653 0.39623 N2 -0.810853 -0.470295 0.34834 + txt003 +STRI + V0 -1.59519 -0.936898 1.62187 V1 -1.30906 -1.30906 1.62188 V2 -1.23593 -1.23593 1.87778 + N0 -0.810853 -0.470295 0.34834 N1 -0.662761 -0.662761 0.348563 N2 -0.649156 -0.649156 0.396474 + txt003 +STRI + V0 -1.50606 -0.884554 1.87778 V1 -1.67949 -0.467421 1.87778 V2 -1.77888 -0.495081 1.62187 + N0 -0.794229 -0.460653 0.39623 N1 -0.886771 -0.239043 0.395595 N2 -0.90527 -0.244029 0.347757 + txt003 +STRI + V0 -1.77888 -0.495081 1.62187 V1 -1.59519 -0.936898 1.62187 V2 -1.50606 -0.884554 1.87778 + N0 -0.90527 -0.244029 0.347757 N1 -0.810853 -0.470295 0.34834 N2 -0.794229 -0.460653 0.39623 + txt003 +STRI + V0 -1.67949 -0.467421 1.87778 V1 -1.74074 0 1.87778 V2 -1.84375 0 1.62187 + N0 -0.886771 -0.239043 0.395595 N1 -0.918633 1.79998e-16 0.395111 N2 -0.937749 1.49384e-16 0.347314 + txt003 +STRI + V0 -1.84375 0 1.62187 V1 -1.77888 -0.495081 1.62187 V2 -1.67949 -0.467421 1.87778 + N0 -0.937749 1.49384e-16 0.347314 N1 -0.90527 -0.244029 0.347757 N2 -0.886771 -0.239043 0.395595 + txt003 +STRI + V0 0 -1.84375 1.62188 V1 -0.495081 -1.77888 1.62188 V2 -0.517147 -1.85816 1.37222 + N0 0 -0.937749 0.347314 N1 -0.244029 -0.90527 0.347757 N2 -0.250446 -0.929073 0.272213 + txt003 +STRI + V0 -0.517147 -1.85816 1.37222 V1 0 -1.92593 1.37222 V2 0 -1.84375 1.62188 + N0 -0.250446 -0.929073 0.272213 N1 0 -0.96234 0.271848 N2 0 -0.937749 0.347314 + txt003 +STRI + V0 -0.495081 -1.77888 1.62188 V1 -0.936898 -1.59519 1.62188 V2 -0.978656 -1.66628 1.37222 + N0 -0.244029 -0.90527 0.347757 N1 -0.470295 -0.810853 0.34834 N2 -0.482704 -0.832247 0.272693 + txt003 +STRI + V0 -0.978656 -1.66628 1.37222 V1 -0.517147 -1.85816 1.37222 V2 -0.495081 -1.77888 1.62188 + N0 -0.482704 -0.832247 0.272693 N1 -0.250446 -0.929073 0.272213 N2 -0.244029 -0.90527 0.347757 + txt003 +STRI + V0 -0.936898 -1.59519 1.62188 V1 -1.30906 -1.30906 1.62188 V2 -1.36741 -1.36741 1.37222 + N0 -0.470295 -0.810853 0.34834 N1 -0.662761 -0.662761 0.348563 N2 -0.680271 -0.680271 0.272877 + txt003 +STRI + V0 -1.36741 -1.36741 1.37222 V1 -0.978656 -1.66628 1.37222 V2 -0.936898 -1.59519 1.62188 + N0 -0.680271 -0.680271 0.272877 N1 -0.482704 -0.832247 0.272693 N2 -0.470295 -0.810853 0.34834 + txt003 +STRI + V0 -1.30906 -1.30906 1.62188 V1 -1.59519 -0.936898 1.62187 V2 -1.66628 -0.978656 1.37222 + N0 -0.662761 -0.662761 0.348563 N1 -0.810853 -0.470295 0.34834 N2 -0.832247 -0.482704 0.272693 + txt003 +STRI + V0 -1.66628 -0.978656 1.37222 V1 -1.36741 -1.36741 1.37222 V2 -1.30906 -1.30906 1.62188 + N0 -0.832247 -0.482704 0.272693 N1 -0.680271 -0.680271 0.272877 N2 -0.662761 -0.662761 0.348563 + txt003 +STRI + V0 -1.59519 -0.936898 1.62187 V1 -1.77888 -0.495081 1.62187 V2 -1.85816 -0.517147 1.37222 + N0 -0.810853 -0.470295 0.34834 N1 -0.90527 -0.244029 0.347757 N2 -0.929073 -0.250446 0.272213 + txt003 +STRI + V0 -1.85816 -0.517147 1.37222 V1 -1.66628 -0.978656 1.37222 V2 -1.59519 -0.936898 1.62187 + N0 -0.929073 -0.250446 0.272213 N1 -0.832247 -0.482704 0.272693 N2 -0.810853 -0.470295 0.34834 + txt003 +STRI + V0 -1.77888 -0.495081 1.62187 V1 -1.84375 0 1.62187 V2 -1.92593 -2.22045e-16 1.37222 + N0 -0.90527 -0.244029 0.347757 N1 -0.937749 1.49384e-16 0.347314 N2 -0.96234 1.11936e-16 0.271848 + txt003 +STRI + V0 -1.92593 -2.22045e-16 1.37222 V1 -1.85816 -0.517147 1.37222 V2 -1.77888 -0.495081 1.62187 + N0 -0.96234 1.11936e-16 0.271848 N1 -0.929073 -0.250446 0.272213 N2 -0.90527 -0.244029 0.347757 + txt003 +STRI + V0 0 -1.92593 1.37222 V1 -0.517147 -1.85816 1.37222 V2 -0.531754 -1.91065 1.1309 + N0 0 -0.96234 0.271848 N1 -0.250446 -0.929073 0.272213 N2 -0.256935 -0.953145 0.159686 + txt003 +STRI + V0 -0.531754 -1.91065 1.1309 V1 0 -1.98032 1.1309 V2 0 -1.92593 1.37222 + N0 -0.256935 -0.953145 0.159686 N1 0 -0.987204 0.15946 N2 0 -0.96234 0.271848 + txt003 +STRI + V0 -0.517147 -1.85816 1.37222 V1 -0.978656 -1.66628 1.37222 V2 -1.0063 -1.71335 1.1309 + N0 -0.250446 -0.929073 0.272213 N1 -0.482704 -0.832247 0.272693 N2 -0.495256 -0.853889 0.159982 + txt003 +STRI + V0 -1.0063 -1.71335 1.1309 V1 -0.531754 -1.91065 1.1309 V2 -0.517147 -1.85816 1.37222 + N0 -0.495256 -0.853889 0.159982 N1 -0.256935 -0.953145 0.159686 N2 -0.250446 -0.929073 0.272213 + txt003 +STRI + V0 -0.978656 -1.66628 1.37222 V1 -1.36741 -1.36741 1.37222 V2 -1.40603 -1.40603 1.1309 + N0 -0.482704 -0.832247 0.272693 N1 -0.680271 -0.680271 0.272877 N2 -0.697986 -0.697986 0.160096 + txt003 +STRI + V0 -1.40603 -1.40603 1.1309 V1 -1.0063 -1.71335 1.1309 V2 -0.978656 -1.66628 1.37222 + N0 -0.697986 -0.697986 0.160096 N1 -0.495256 -0.853889 0.159982 N2 -0.482704 -0.832247 0.272693 + txt003 +STRI + V0 -1.36741 -1.36741 1.37222 V1 -1.66628 -0.978656 1.37222 V2 -1.71335 -1.0063 1.1309 + N0 -0.680271 -0.680271 0.272877 N1 -0.832247 -0.482704 0.272693 N2 -0.853889 -0.495256 0.159982 + txt003 +STRI + V0 -1.71335 -1.0063 1.1309 V1 -1.40603 -1.40603 1.1309 V2 -1.36741 -1.36741 1.37222 + N0 -0.853889 -0.495256 0.159982 N1 -0.697986 -0.697986 0.160096 N2 -0.680271 -0.680271 0.272877 + txt003 +STRI + V0 -1.66628 -0.978656 1.37222 V1 -1.85816 -0.517147 1.37222 V2 -1.91065 -0.531754 1.1309 + N0 -0.832247 -0.482704 0.272693 N1 -0.929073 -0.250446 0.272213 N2 -0.953145 -0.256935 0.159686 + txt003 +STRI + V0 -1.91065 -0.531754 1.1309 V1 -1.71335 -1.0063 1.1309 V2 -1.66628 -0.978656 1.37222 + N0 -0.953145 -0.256935 0.159686 N1 -0.853889 -0.495256 0.159982 N2 -0.832247 -0.482704 0.272693 + txt003 +STRI + V0 -1.85816 -0.517147 1.37222 V1 -1.92593 -2.22045e-16 1.37222 V2 -1.98032 2.22045e-16 1.1309 + N0 -0.929073 -0.250446 0.272213 N1 -0.96234 1.11936e-16 0.271848 N2 -0.987204 6.38555e-17 0.15946 + txt003 +STRI + V0 -1.98032 2.22045e-16 1.1309 V1 -1.91065 -0.531754 1.1309 V2 -1.85816 -0.517147 1.37222 + N0 -0.987204 6.38555e-17 0.15946 N1 -0.953145 -0.256935 0.159686 N2 -0.929073 -0.250446 0.272213 + txt003 +STRI + V0 0 -1.98032 1.1309 V1 -0.531754 -1.91065 1.1309 V2 -0.537037 -1.92963 0.9 + N0 0 -0.987204 0.15946 N1 -0.256935 -0.953145 0.159686 N2 -0.260275 -0.965535 5.17854e-17 + txt003 +STRI + V0 -0.537037 -1.92963 0.9 V1 0 -2 0.9 V2 0 -1.98032 1.1309 + N0 -0.260275 -0.965535 5.17854e-17 N1 -0 -1 -0 N2 0 -0.987204 0.15946 + txt003 +STRI + V0 -0.531754 -1.91065 1.1309 V1 -1.0063 -1.71335 1.1309 V2 -1.0163 -1.73037 0.9 + N0 -0.256935 -0.953145 0.159686 N1 -0.495256 -0.853889 0.159982 N2 -0.501718 -0.865031 1.36587e-16 + txt003 +STRI + V0 -1.0163 -1.73037 0.9 V1 -0.537037 -1.92963 0.9 V2 -0.531754 -1.91065 1.1309 + N0 -0.501718 -0.865031 1.36587e-16 N1 -0.260275 -0.965535 5.17854e-17 N2 -0.256935 -0.953145 0.159686 + txt003 +STRI + V0 -1.0063 -1.71335 1.1309 V1 -1.40603 -1.40603 1.1309 V2 -1.42 -1.42 0.9 + N0 -0.495256 -0.853889 0.159982 N1 -0.697986 -0.697986 0.160096 N2 -0.707107 -0.707107 1.74455e-16 + txt003 +STRI + V0 -1.42 -1.42 0.9 V1 -1.0163 -1.73037 0.9 V2 -1.0063 -1.71335 1.1309 + N0 -0.707107 -0.707107 1.74455e-16 N1 -0.501718 -0.865031 1.36587e-16 N2 -0.495256 -0.853889 0.159982 + txt003 +STRI + V0 -1.40603 -1.40603 1.1309 V1 -1.71335 -1.0063 1.1309 V2 -1.73037 -1.0163 0.9 + N0 -0.697986 -0.697986 0.160096 N1 -0.853889 -0.495256 0.159982 N2 -0.865031 -0.501718 1.36587e-16 + txt003 +STRI + V0 -1.73037 -1.0163 0.9 V1 -1.42 -1.42 0.9 V2 -1.40603 -1.40603 1.1309 + N0 -0.865031 -0.501718 1.36587e-16 N1 -0.707107 -0.707107 1.74455e-16 N2 -0.697986 -0.697986 0.160096 + txt003 +STRI + V0 -1.71335 -1.0063 1.1309 V1 -1.91065 -0.531754 1.1309 V2 -1.92963 -0.537037 0.9 + N0 -0.853889 -0.495256 0.159982 N1 -0.953145 -0.256935 0.159686 N2 -0.965535 -0.260275 5.17854e-17 + txt003 +STRI + V0 -1.92963 -0.537037 0.9 V1 -1.73037 -1.0163 0.9 V2 -1.71335 -1.0063 1.1309 + N0 -0.965535 -0.260275 5.17854e-17 N1 -0.865031 -0.501718 1.36587e-16 N2 -0.853889 -0.495256 0.159982 + txt003 +STRI + V0 -1.91065 -0.531754 1.1309 V1 -1.98032 2.22045e-16 1.1309 V2 -2 0 0.9 + N0 -0.953145 -0.256935 0.159686 N1 -0.987204 6.38555e-17 0.15946 N2 -1 0 0 + txt003 +STRI + V0 -2 0 0.9 V1 -1.92963 -0.537037 0.9 V2 -1.91065 -0.531754 1.1309 + N0 -1 0 0 N1 -0.965535 -0.260275 5.17854e-17 N2 -0.953145 -0.256935 0.159686 + txt003 +STRI + V0 -1.5 0 2.4 V1 -1.44722 0.402778 2.4 V2 -1.56671 0.436032 2.13785 + N0 -0.902861 0 0.429934 N1 -0.871509 0.234929 0.430442 N2 -0.875348 0.235963 0.422003 + txt003 +STRI + V0 -1.56671 0.436032 2.13785 V1 -1.62384 0 2.13785 V2 -1.5 0 2.4 + N0 -0.875348 0.235963 0.422003 N1 -0.906828 0 0.4215 N2 -0.902861 0 0.429934 + txt003 +STRI + V0 -1.44722 0.402778 2.4 V1 -1.29778 0.762222 2.4 V2 -1.40492 0.825153 2.13785 + N0 -0.871509 0.234929 0.430442 N1 -0.780517 0.4527 0.43111 N2 -0.783966 0.4547 0.422664 + txt003 +STRI + V0 -1.40492 0.825153 2.13785 V1 -1.56671 0.436032 2.13785 V2 -1.44722 0.402778 2.4 + N0 -0.783966 0.4547 0.422664 N1 -0.875348 0.235963 0.422003 N2 -0.871509 0.234929 0.430442 + txt003 +STRI + V0 -1.29778 0.762222 2.4 V1 -1.065 1.065 2.4 V2 -1.15293 1.15293 2.13785 + N0 -0.780517 0.4527 0.43111 N1 -0.637936 0.637936 0.431366 N2 -0.640758 0.640758 0.422917 + txt003 +STRI + V0 -1.15293 1.15293 2.13785 V1 -1.40492 0.825153 2.13785 V2 -1.29778 0.762222 2.4 + N0 -0.640758 0.640758 0.422917 N1 -0.783966 0.4547 0.422664 N2 -0.780517 0.4527 0.43111 + txt003 +STRI + V0 -1.065 1.065 2.4 V1 -0.762222 1.29778 2.4 V2 -0.825153 1.40492 2.13785 + N0 -0.637936 0.637936 0.431366 N1 -0.4527 0.780517 0.43111 N2 -0.4547 0.783966 0.422664 + txt003 +STRI + V0 -0.825153 1.40492 2.13785 V1 -1.15293 1.15293 2.13785 V2 -1.065 1.065 2.4 + N0 -0.4547 0.783966 0.422664 N1 -0.640758 0.640758 0.422917 N2 -0.637936 0.637936 0.431366 + txt003 +STRI + V0 -0.762222 1.29778 2.4 V1 -0.402778 1.44722 2.4 V2 -0.436032 1.56671 2.13785 + N0 -0.4527 0.780517 0.43111 N1 -0.234929 0.871509 0.430442 N2 -0.235963 0.875348 0.422003 + txt003 +STRI + V0 -0.436032 1.56671 2.13785 V1 -0.825153 1.40492 2.13785 V2 -0.762222 1.29778 2.4 + N0 -0.235963 0.875348 0.422003 N1 -0.4547 0.783966 0.422664 N2 -0.4527 0.780517 0.43111 + txt003 +STRI + V0 -0.402778 1.44722 2.4 V1 0 1.5 2.4 V2 -2.22045e-16 1.62384 2.13785 + N0 -0.234929 0.871509 0.430442 N1 2.27296e-16 0.902861 0.429934 N2 2.05843e-16 0.906828 0.4215 + txt003 +STRI + V0 -2.22045e-16 1.62384 2.13785 V1 -0.436032 1.56671 2.13785 V2 -0.402778 1.44722 2.4 + N0 2.05843e-16 0.906828 0.4215 N1 -0.235963 0.875348 0.422003 N2 -0.234929 0.871509 0.430442 + txt003 +STRI + V0 -1.62384 0 2.13785 V1 -1.56671 0.436032 2.13785 V2 -1.67949 0.467421 1.87778 + N0 -0.906828 0 0.4215 N1 -0.875348 0.235963 0.422003 N2 -0.886771 0.239043 0.395595 + txt003 +STRI + V0 -1.67949 0.467421 1.87778 V1 -1.74074 0 1.87778 V2 -1.62384 0 2.13785 + N0 -0.886771 0.239043 0.395595 N1 -0.918633 0 0.395111 N2 -0.906828 0 0.4215 + txt003 +STRI + V0 -1.56671 0.436032 2.13785 V1 -1.40492 0.825153 2.13785 V2 -1.50606 0.884554 1.87778 + N0 -0.875348 0.235963 0.422003 N1 -0.783966 0.4547 0.422664 N2 -0.794229 0.460653 0.39623 + txt003 +STRI + V0 -1.50606 0.884554 1.87778 V1 -1.67949 0.467421 1.87778 V2 -1.56671 0.436032 2.13785 + N0 -0.794229 0.460653 0.39623 N1 -0.886771 0.239043 0.395595 N2 -0.875348 0.235963 0.422003 + txt003 +STRI + V0 -1.40492 0.825153 2.13785 V1 -1.15293 1.15293 2.13785 V2 -1.23593 1.23593 1.87778 + N0 -0.783966 0.4547 0.422664 N1 -0.640758 0.640758 0.422917 N2 -0.649156 0.649156 0.396474 + txt003 +STRI + V0 -1.23593 1.23593 1.87778 V1 -1.50606 0.884554 1.87778 V2 -1.40492 0.825153 2.13785 + N0 -0.649156 0.649156 0.396474 N1 -0.794229 0.460653 0.39623 N2 -0.783966 0.4547 0.422664 + txt003 +STRI + V0 -1.15293 1.15293 2.13785 V1 -0.825153 1.40492 2.13785 V2 -0.884554 1.50606 1.87778 + N0 -0.640758 0.640758 0.422917 N1 -0.4547 0.783966 0.422664 N2 -0.460653 0.794229 0.39623 + txt003 +STRI + V0 -0.884554 1.50606 1.87778 V1 -1.23593 1.23593 1.87778 V2 -1.15293 1.15293 2.13785 + N0 -0.460653 0.794229 0.39623 N1 -0.649156 0.649156 0.396474 N2 -0.640758 0.640758 0.422917 + txt003 +STRI + V0 -0.825153 1.40492 2.13785 V1 -0.436032 1.56671 2.13785 V2 -0.467421 1.67949 1.87778 + N0 -0.4547 0.783966 0.422664 N1 -0.235963 0.875348 0.422003 N2 -0.239043 0.886771 0.395595 + txt003 +STRI + V0 -0.467421 1.67949 1.87778 V1 -0.884554 1.50606 1.87778 V2 -0.825153 1.40492 2.13785 + N0 -0.239043 0.886771 0.395595 N1 -0.460653 0.794229 0.39623 N2 -0.4547 0.783966 0.422664 + txt003 +STRI + V0 -0.436032 1.56671 2.13785 V1 -2.22045e-16 1.62384 2.13785 V2 0 1.74074 1.87778 + N0 -0.235963 0.875348 0.422003 N1 2.05843e-16 0.906828 0.4215 N2 1.79998e-16 0.918633 0.395111 + txt003 +STRI + V0 0 1.74074 1.87778 V1 -0.467421 1.67949 1.87778 V2 -0.436032 1.56671 2.13785 + N0 1.79998e-16 0.918633 0.395111 N1 -0.239043 0.886771 0.395595 N2 -0.235963 0.875348 0.422003 + txt003 +STRI + V0 -1.74074 0 1.87778 V1 -1.67949 0.467421 1.87778 V2 -1.77888 0.495081 1.62188 + N0 -0.918633 0 0.395111 N1 -0.886771 0.239043 0.395595 N2 -0.90527 0.244029 0.347757 + txt003 +STRI + V0 -1.77888 0.495081 1.62188 V1 -1.84375 0 1.62188 V2 -1.74074 0 1.87778 + N0 -0.90527 0.244029 0.347757 N1 -0.937749 0 0.347314 N2 -0.918633 0 0.395111 + txt003 +STRI + V0 -1.67949 0.467421 1.87778 V1 -1.50606 0.884554 1.87778 V2 -1.59519 0.936898 1.62188 + N0 -0.886771 0.239043 0.395595 N1 -0.794229 0.460653 0.39623 N2 -0.810853 0.470295 0.34834 + txt003 +STRI + V0 -1.59519 0.936898 1.62188 V1 -1.77888 0.495081 1.62188 V2 -1.67949 0.467421 1.87778 + N0 -0.810853 0.470295 0.34834 N1 -0.90527 0.244029 0.347757 N2 -0.886771 0.239043 0.395595 + txt003 +STRI + V0 -1.50606 0.884554 1.87778 V1 -1.23593 1.23593 1.87778 V2 -1.30906 1.30906 1.62188 + N0 -0.794229 0.460653 0.39623 N1 -0.649156 0.649156 0.396474 N2 -0.662761 0.662761 0.348563 + txt003 +STRI + V0 -1.30906 1.30906 1.62188 V1 -1.59519 0.936898 1.62188 V2 -1.50606 0.884554 1.87778 + N0 -0.662761 0.662761 0.348563 N1 -0.810853 0.470295 0.34834 N2 -0.794229 0.460653 0.39623 + txt003 +STRI + V0 -1.23593 1.23593 1.87778 V1 -0.884554 1.50606 1.87778 V2 -0.936898 1.59519 1.62187 + N0 -0.649156 0.649156 0.396474 N1 -0.460653 0.794229 0.39623 N2 -0.470295 0.810853 0.34834 + txt003 +STRI + V0 -0.936898 1.59519 1.62187 V1 -1.30906 1.30906 1.62188 V2 -1.23593 1.23593 1.87778 + N0 -0.470295 0.810853 0.34834 N1 -0.662761 0.662761 0.348563 N2 -0.649156 0.649156 0.396474 + txt003 +STRI + V0 -0.884554 1.50606 1.87778 V1 -0.467421 1.67949 1.87778 V2 -0.495081 1.77888 1.62187 + N0 -0.460653 0.794229 0.39623 N1 -0.239043 0.886771 0.395595 N2 -0.244029 0.90527 0.347757 + txt003 +STRI + V0 -0.495081 1.77888 1.62187 V1 -0.936898 1.59519 1.62187 V2 -0.884554 1.50606 1.87778 + N0 -0.244029 0.90527 0.347757 N1 -0.470295 0.810853 0.34834 N2 -0.460653 0.794229 0.39623 + txt003 +STRI + V0 -0.467421 1.67949 1.87778 V1 0 1.74074 1.87778 V2 0 1.84375 1.62187 + N0 -0.239043 0.886771 0.395595 N1 1.79998e-16 0.918633 0.395111 N2 1.49384e-16 0.937749 0.347314 + txt003 +STRI + V0 0 1.84375 1.62187 V1 -0.495081 1.77888 1.62187 V2 -0.467421 1.67949 1.87778 + N0 1.49384e-16 0.937749 0.347314 N1 -0.244029 0.90527 0.347757 N2 -0.239043 0.886771 0.395595 + txt003 +STRI + V0 -1.84375 0 1.62188 V1 -1.77888 0.495081 1.62188 V2 -1.85816 0.517147 1.37222 + N0 -0.937749 0 0.347314 N1 -0.90527 0.244029 0.347757 N2 -0.929073 0.250446 0.272213 + txt003 +STRI + V0 -1.85816 0.517147 1.37222 V1 -1.92593 0 1.37222 V2 -1.84375 0 1.62188 + N0 -0.929073 0.250446 0.272213 N1 -0.96234 0 0.271848 N2 -0.937749 0 0.347314 + txt003 +STRI + V0 -1.77888 0.495081 1.62188 V1 -1.59519 0.936898 1.62188 V2 -1.66628 0.978656 1.37222 + N0 -0.90527 0.244029 0.347757 N1 -0.810853 0.470295 0.34834 N2 -0.832247 0.482704 0.272693 + txt003 +STRI + V0 -1.66628 0.978656 1.37222 V1 -1.85816 0.517147 1.37222 V2 -1.77888 0.495081 1.62188 + N0 -0.832247 0.482704 0.272693 N1 -0.929073 0.250446 0.272213 N2 -0.90527 0.244029 0.347757 + txt003 +STRI + V0 -1.59519 0.936898 1.62188 V1 -1.30906 1.30906 1.62188 V2 -1.36741 1.36741 1.37222 + N0 -0.810853 0.470295 0.34834 N1 -0.662761 0.662761 0.348563 N2 -0.680271 0.680271 0.272877 + txt003 +STRI + V0 -1.36741 1.36741 1.37222 V1 -1.66628 0.978656 1.37222 V2 -1.59519 0.936898 1.62188 + N0 -0.680271 0.680271 0.272877 N1 -0.832247 0.482704 0.272693 N2 -0.810853 0.470295 0.34834 + txt003 +STRI + V0 -1.30906 1.30906 1.62188 V1 -0.936898 1.59519 1.62187 V2 -0.978656 1.66628 1.37222 + N0 -0.662761 0.662761 0.348563 N1 -0.470295 0.810853 0.34834 N2 -0.482704 0.832247 0.272693 + txt003 +STRI + V0 -0.978656 1.66628 1.37222 V1 -1.36741 1.36741 1.37222 V2 -1.30906 1.30906 1.62188 + N0 -0.482704 0.832247 0.272693 N1 -0.680271 0.680271 0.272877 N2 -0.662761 0.662761 0.348563 + txt003 +STRI + V0 -0.936898 1.59519 1.62187 V1 -0.495081 1.77888 1.62187 V2 -0.517147 1.85816 1.37222 + N0 -0.470295 0.810853 0.34834 N1 -0.244029 0.90527 0.347757 N2 -0.250446 0.929073 0.272213 + txt003 +STRI + V0 -0.517147 1.85816 1.37222 V1 -0.978656 1.66628 1.37222 V2 -0.936898 1.59519 1.62187 + N0 -0.250446 0.929073 0.272213 N1 -0.482704 0.832247 0.272693 N2 -0.470295 0.810853 0.34834 + txt003 +STRI + V0 -0.495081 1.77888 1.62187 V1 0 1.84375 1.62187 V2 -2.22045e-16 1.92593 1.37222 + N0 -0.244029 0.90527 0.347757 N1 1.49384e-16 0.937749 0.347314 N2 1.11936e-16 0.96234 0.271848 + txt003 +STRI + V0 -2.22045e-16 1.92593 1.37222 V1 -0.517147 1.85816 1.37222 V2 -0.495081 1.77888 1.62187 + N0 1.11936e-16 0.96234 0.271848 N1 -0.250446 0.929073 0.272213 N2 -0.244029 0.90527 0.347757 + txt003 +STRI + V0 -1.92593 0 1.37222 V1 -1.85816 0.517147 1.37222 V2 -1.91065 0.531754 1.1309 + N0 -0.96234 0 0.271848 N1 -0.929073 0.250446 0.272213 N2 -0.953145 0.256935 0.159686 + txt003 +STRI + V0 -1.91065 0.531754 1.1309 V1 -1.98032 0 1.1309 V2 -1.92593 0 1.37222 + N0 -0.953145 0.256935 0.159686 N1 -0.987204 0 0.15946 N2 -0.96234 0 0.271848 + txt003 +STRI + V0 -1.85816 0.517147 1.37222 V1 -1.66628 0.978656 1.37222 V2 -1.71335 1.0063 1.1309 + N0 -0.929073 0.250446 0.272213 N1 -0.832247 0.482704 0.272693 N2 -0.853889 0.495256 0.159982 + txt003 +STRI + V0 -1.71335 1.0063 1.1309 V1 -1.91065 0.531754 1.1309 V2 -1.85816 0.517147 1.37222 + N0 -0.853889 0.495256 0.159982 N1 -0.953145 0.256935 0.159686 N2 -0.929073 0.250446 0.272213 + txt003 +STRI + V0 -1.66628 0.978656 1.37222 V1 -1.36741 1.36741 1.37222 V2 -1.40603 1.40603 1.1309 + N0 -0.832247 0.482704 0.272693 N1 -0.680271 0.680271 0.272877 N2 -0.697986 0.697986 0.160096 + txt003 +STRI + V0 -1.40603 1.40603 1.1309 V1 -1.71335 1.0063 1.1309 V2 -1.66628 0.978656 1.37222 + N0 -0.697986 0.697986 0.160096 N1 -0.853889 0.495256 0.159982 N2 -0.832247 0.482704 0.272693 + txt003 +STRI + V0 -1.36741 1.36741 1.37222 V1 -0.978656 1.66628 1.37222 V2 -1.0063 1.71335 1.1309 + N0 -0.680271 0.680271 0.272877 N1 -0.482704 0.832247 0.272693 N2 -0.495256 0.853889 0.159982 + txt003 +STRI + V0 -1.0063 1.71335 1.1309 V1 -1.40603 1.40603 1.1309 V2 -1.36741 1.36741 1.37222 + N0 -0.495256 0.853889 0.159982 N1 -0.697986 0.697986 0.160096 N2 -0.680271 0.680271 0.272877 + txt003 +STRI + V0 -0.978656 1.66628 1.37222 V1 -0.517147 1.85816 1.37222 V2 -0.531754 1.91065 1.1309 + N0 -0.482704 0.832247 0.272693 N1 -0.250446 0.929073 0.272213 N2 -0.256935 0.953145 0.159686 + txt003 +STRI + V0 -0.531754 1.91065 1.1309 V1 -1.0063 1.71335 1.1309 V2 -0.978656 1.66628 1.37222 + N0 -0.256935 0.953145 0.159686 N1 -0.495256 0.853889 0.159982 N2 -0.482704 0.832247 0.272693 + txt003 +STRI + V0 -0.517147 1.85816 1.37222 V1 -2.22045e-16 1.92593 1.37222 V2 2.22045e-16 1.98032 1.1309 + N0 -0.250446 0.929073 0.272213 N1 1.11936e-16 0.96234 0.271848 N2 6.38555e-17 0.987204 0.15946 + txt003 +STRI + V0 2.22045e-16 1.98032 1.1309 V1 -0.531754 1.91065 1.1309 V2 -0.517147 1.85816 1.37222 + N0 6.38555e-17 0.987204 0.15946 N1 -0.256935 0.953145 0.159686 N2 -0.250446 0.929073 0.272213 + txt003 +STRI + V0 -1.98032 0 1.1309 V1 -1.91065 0.531754 1.1309 V2 -1.92963 0.537037 0.9 + N0 -0.987204 0 0.15946 N1 -0.953145 0.256935 0.159686 N2 -0.965535 0.260275 5.17854e-17 + txt003 +STRI + V0 -1.92963 0.537037 0.9 V1 -2 0 0.9 V2 -1.98032 0 1.1309 + N0 -0.965535 0.260275 5.17854e-17 N1 -1 0 0 N2 -0.987204 0 0.15946 + txt003 +STRI + V0 -1.91065 0.531754 1.1309 V1 -1.71335 1.0063 1.1309 V2 -1.73037 1.0163 0.9 + N0 -0.953145 0.256935 0.159686 N1 -0.853889 0.495256 0.159982 N2 -0.865031 0.501718 1.36587e-16 + txt003 +STRI + V0 -1.73037 1.0163 0.9 V1 -1.92963 0.537037 0.9 V2 -1.91065 0.531754 1.1309 + N0 -0.865031 0.501718 1.36587e-16 N1 -0.965535 0.260275 5.17854e-17 N2 -0.953145 0.256935 0.159686 + txt003 +STRI + V0 -1.71335 1.0063 1.1309 V1 -1.40603 1.40603 1.1309 V2 -1.42 1.42 0.9 + N0 -0.853889 0.495256 0.159982 N1 -0.697986 0.697986 0.160096 N2 -0.707107 0.707107 1.74455e-16 + txt003 +STRI + V0 -1.42 1.42 0.9 V1 -1.73037 1.0163 0.9 V2 -1.71335 1.0063 1.1309 + N0 -0.707107 0.707107 1.74455e-16 N1 -0.865031 0.501718 1.36587e-16 N2 -0.853889 0.495256 0.159982 + txt003 +STRI + V0 -1.40603 1.40603 1.1309 V1 -1.0063 1.71335 1.1309 V2 -1.0163 1.73037 0.9 + N0 -0.697986 0.697986 0.160096 N1 -0.495256 0.853889 0.159982 N2 -0.501718 0.865031 1.36587e-16 + txt003 +STRI + V0 -1.0163 1.73037 0.9 V1 -1.42 1.42 0.9 V2 -1.40603 1.40603 1.1309 + N0 -0.501718 0.865031 1.36587e-16 N1 -0.707107 0.707107 1.74455e-16 N2 -0.697986 0.697986 0.160096 + txt003 +STRI + V0 -1.0063 1.71335 1.1309 V1 -0.531754 1.91065 1.1309 V2 -0.537037 1.92963 0.9 + N0 -0.495256 0.853889 0.159982 N1 -0.256935 0.953145 0.159686 N2 -0.260275 0.965535 5.17854e-17 + txt003 +STRI + V0 -0.537037 1.92963 0.9 V1 -1.0163 1.73037 0.9 V2 -1.0063 1.71335 1.1309 + N0 -0.260275 0.965535 5.17854e-17 N1 -0.501718 0.865031 1.36587e-16 N2 -0.495256 0.853889 0.159982 + txt003 +STRI + V0 -0.531754 1.91065 1.1309 V1 2.22045e-16 1.98032 1.1309 V2 0 2 0.9 + N0 -0.256935 0.953145 0.159686 N1 6.38555e-17 0.987204 0.15946 N2 0 1 0 + txt003 +STRI + V0 0 2 0.9 V1 -0.537037 1.92963 0.9 V2 -0.531754 1.91065 1.1309 + N0 0 1 0 N1 -0.260275 0.965535 5.17854e-17 N2 -0.256935 0.953145 0.159686 + txt003 +STRI + V0 0 1.5 2.4 V1 0.402778 1.44722 2.4 V2 0.436032 1.56671 2.13785 + N0 -0 0.902861 0.429934 N1 0.234929 0.871509 0.430442 N2 0.235963 0.875348 0.422003 + txt003 +STRI + V0 0.436032 1.56671 2.13785 V1 0 1.62384 2.13785 V2 0 1.5 2.4 + N0 0.235963 0.875348 0.422003 N1 -0 0.906828 0.4215 N2 -0 0.902861 0.429934 + txt003 +STRI + V0 0.402778 1.44722 2.4 V1 0.762222 1.29778 2.4 V2 0.825153 1.40492 2.13785 + N0 0.234929 0.871509 0.430442 N1 0.4527 0.780517 0.43111 N2 0.4547 0.783966 0.422664 + txt003 +STRI + V0 0.825153 1.40492 2.13785 V1 0.436032 1.56671 2.13785 V2 0.402778 1.44722 2.4 + N0 0.4547 0.783966 0.422664 N1 0.235963 0.875348 0.422003 N2 0.234929 0.871509 0.430442 + txt003 +STRI + V0 0.762222 1.29778 2.4 V1 1.065 1.065 2.4 V2 1.15293 1.15293 2.13785 + N0 0.4527 0.780517 0.43111 N1 0.637936 0.637936 0.431366 N2 0.640758 0.640758 0.422917 + txt003 +STRI + V0 1.15293 1.15293 2.13785 V1 0.825153 1.40492 2.13785 V2 0.762222 1.29778 2.4 + N0 0.640758 0.640758 0.422917 N1 0.4547 0.783966 0.422664 N2 0.4527 0.780517 0.43111 + txt003 +STRI + V0 1.065 1.065 2.4 V1 1.29778 0.762222 2.4 V2 1.40492 0.825153 2.13785 + N0 0.637936 0.637936 0.431366 N1 0.780517 0.4527 0.43111 N2 0.783966 0.4547 0.422664 + txt003 +STRI + V0 1.40492 0.825153 2.13785 V1 1.15293 1.15293 2.13785 V2 1.065 1.065 2.4 + N0 0.783966 0.4547 0.422664 N1 0.640758 0.640758 0.422917 N2 0.637936 0.637936 0.431366 + txt003 +STRI + V0 1.29778 0.762222 2.4 V1 1.44722 0.402778 2.4 V2 1.56671 0.436032 2.13785 + N0 0.780517 0.4527 0.43111 N1 0.871509 0.234929 0.430442 N2 0.875348 0.235963 0.422003 + txt003 +STRI + V0 1.56671 0.436032 2.13785 V1 1.40492 0.825153 2.13785 V2 1.29778 0.762222 2.4 + N0 0.875348 0.235963 0.422003 N1 0.783966 0.4547 0.422664 N2 0.780517 0.4527 0.43111 + txt003 +STRI + V0 1.44722 0.402778 2.4 V1 1.5 0 2.4 V2 1.62384 2.22045e-16 2.13785 + N0 0.871509 0.234929 0.430442 N1 0.902861 -2.27296e-16 0.429934 N2 0.906828 -2.05843e-16 0.4215 + txt003 +STRI + V0 1.62384 2.22045e-16 2.13785 V1 1.56671 0.436032 2.13785 V2 1.44722 0.402778 2.4 + N0 0.906828 -2.05843e-16 0.4215 N1 0.875348 0.235963 0.422003 N2 0.871509 0.234929 0.430442 + txt003 +STRI + V0 0 1.62384 2.13785 V1 0.436032 1.56671 2.13785 V2 0.467421 1.67949 1.87778 + N0 -0 0.906828 0.4215 N1 0.235963 0.875348 0.422003 N2 0.239043 0.886771 0.395595 + txt003 +STRI + V0 0.467421 1.67949 1.87778 V1 0 1.74074 1.87778 V2 0 1.62384 2.13785 + N0 0.239043 0.886771 0.395595 N1 -0 0.918633 0.395111 N2 -0 0.906828 0.4215 + txt003 +STRI + V0 0.436032 1.56671 2.13785 V1 0.825153 1.40492 2.13785 V2 0.884554 1.50606 1.87778 + N0 0.235963 0.875348 0.422003 N1 0.4547 0.783966 0.422664 N2 0.460653 0.794229 0.39623 + txt003 +STRI + V0 0.884554 1.50606 1.87778 V1 0.467421 1.67949 1.87778 V2 0.436032 1.56671 2.13785 + N0 0.460653 0.794229 0.39623 N1 0.239043 0.886771 0.395595 N2 0.235963 0.875348 0.422003 + txt003 +STRI + V0 0.825153 1.40492 2.13785 V1 1.15293 1.15293 2.13785 V2 1.23593 1.23593 1.87778 + N0 0.4547 0.783966 0.422664 N1 0.640758 0.640758 0.422917 N2 0.649156 0.649156 0.396474 + txt003 +STRI + V0 1.23593 1.23593 1.87778 V1 0.884554 1.50606 1.87778 V2 0.825153 1.40492 2.13785 + N0 0.649156 0.649156 0.396474 N1 0.460653 0.794229 0.39623 N2 0.4547 0.783966 0.422664 + txt003 +STRI + V0 1.15293 1.15293 2.13785 V1 1.40492 0.825153 2.13785 V2 1.50606 0.884554 1.87778 + N0 0.640758 0.640758 0.422917 N1 0.783966 0.4547 0.422664 N2 0.794229 0.460653 0.39623 + txt003 +STRI + V0 1.50606 0.884554 1.87778 V1 1.23593 1.23593 1.87778 V2 1.15293 1.15293 2.13785 + N0 0.794229 0.460653 0.39623 N1 0.649156 0.649156 0.396474 N2 0.640758 0.640758 0.422917 + txt003 +STRI + V0 1.40492 0.825153 2.13785 V1 1.56671 0.436032 2.13785 V2 1.67949 0.467421 1.87778 + N0 0.783966 0.4547 0.422664 N1 0.875348 0.235963 0.422003 N2 0.886771 0.239043 0.395595 + txt003 +STRI + V0 1.67949 0.467421 1.87778 V1 1.50606 0.884554 1.87778 V2 1.40492 0.825153 2.13785 + N0 0.886771 0.239043 0.395595 N1 0.794229 0.460653 0.39623 N2 0.783966 0.4547 0.422664 + txt003 +STRI + V0 1.56671 0.436032 2.13785 V1 1.62384 2.22045e-16 2.13785 V2 1.74074 0 1.87778 + N0 0.875348 0.235963 0.422003 N1 0.906828 -2.05843e-16 0.4215 N2 0.918633 -1.79998e-16 0.395111 + txt003 +STRI + V0 1.74074 0 1.87778 V1 1.67949 0.467421 1.87778 V2 1.56671 0.436032 2.13785 + N0 0.918633 -1.79998e-16 0.395111 N1 0.886771 0.239043 0.395595 N2 0.875348 0.235963 0.422003 + txt003 +STRI + V0 0 1.74074 1.87778 V1 0.467421 1.67949 1.87778 V2 0.495081 1.77888 1.62188 + N0 -0 0.918633 0.395111 N1 0.239043 0.886771 0.395595 N2 0.244029 0.90527 0.347757 + txt003 +STRI + V0 0.495081 1.77888 1.62188 V1 0 1.84375 1.62188 V2 0 1.74074 1.87778 + N0 0.244029 0.90527 0.347757 N1 -0 0.937749 0.347314 N2 -0 0.918633 0.395111 + txt003 +STRI + V0 0.467421 1.67949 1.87778 V1 0.884554 1.50606 1.87778 V2 0.936898 1.59519 1.62188 + N0 0.239043 0.886771 0.395595 N1 0.460653 0.794229 0.39623 N2 0.470295 0.810853 0.34834 + txt003 +STRI + V0 0.936898 1.59519 1.62188 V1 0.495081 1.77888 1.62188 V2 0.467421 1.67949 1.87778 + N0 0.470295 0.810853 0.34834 N1 0.244029 0.90527 0.347757 N2 0.239043 0.886771 0.395595 + txt003 +STRI + V0 0.884554 1.50606 1.87778 V1 1.23593 1.23593 1.87778 V2 1.30906 1.30906 1.62188 + N0 0.460653 0.794229 0.39623 N1 0.649156 0.649156 0.396474 N2 0.662761 0.662761 0.348563 + txt003 +STRI + V0 1.30906 1.30906 1.62188 V1 0.936898 1.59519 1.62188 V2 0.884554 1.50606 1.87778 + N0 0.662761 0.662761 0.348563 N1 0.470295 0.810853 0.34834 N2 0.460653 0.794229 0.39623 + txt003 +STRI + V0 1.23593 1.23593 1.87778 V1 1.50606 0.884554 1.87778 V2 1.59519 0.936898 1.62187 + N0 0.649156 0.649156 0.396474 N1 0.794229 0.460653 0.39623 N2 0.810853 0.470295 0.34834 + txt003 +STRI + V0 1.59519 0.936898 1.62187 V1 1.30906 1.30906 1.62188 V2 1.23593 1.23593 1.87778 + N0 0.810853 0.470295 0.34834 N1 0.662761 0.662761 0.348563 N2 0.649156 0.649156 0.396474 + txt003 +STRI + V0 1.50606 0.884554 1.87778 V1 1.67949 0.467421 1.87778 V2 1.77888 0.495081 1.62187 + N0 0.794229 0.460653 0.39623 N1 0.886771 0.239043 0.395595 N2 0.90527 0.244029 0.347757 + txt003 +STRI + V0 1.77888 0.495081 1.62187 V1 1.59519 0.936898 1.62187 V2 1.50606 0.884554 1.87778 + N0 0.90527 0.244029 0.347757 N1 0.810853 0.470295 0.34834 N2 0.794229 0.460653 0.39623 + txt003 +STRI + V0 1.67949 0.467421 1.87778 V1 1.74074 0 1.87778 V2 1.84375 0 1.62187 + N0 0.886771 0.239043 0.395595 N1 0.918633 -1.79998e-16 0.395111 N2 0.937749 -1.49384e-16 0.347314 + txt003 +STRI + V0 1.84375 0 1.62187 V1 1.77888 0.495081 1.62187 V2 1.67949 0.467421 1.87778 + N0 0.937749 -1.49384e-16 0.347314 N1 0.90527 0.244029 0.347757 N2 0.886771 0.239043 0.395595 + txt003 +STRI + V0 0 1.84375 1.62188 V1 0.495081 1.77888 1.62188 V2 0.517147 1.85816 1.37222 + N0 -0 0.937749 0.347314 N1 0.244029 0.90527 0.347757 N2 0.250446 0.929073 0.272213 + txt003 +STRI + V0 0.517147 1.85816 1.37222 V1 0 1.92593 1.37222 V2 0 1.84375 1.62188 + N0 0.250446 0.929073 0.272213 N1 -0 0.96234 0.271848 N2 -0 0.937749 0.347314 + txt003 +STRI + V0 0.495081 1.77888 1.62188 V1 0.936898 1.59519 1.62188 V2 0.978656 1.66628 1.37222 + N0 0.244029 0.90527 0.347757 N1 0.470295 0.810853 0.34834 N2 0.482704 0.832247 0.272693 + txt003 +STRI + V0 0.978656 1.66628 1.37222 V1 0.517147 1.85816 1.37222 V2 0.495081 1.77888 1.62188 + N0 0.482704 0.832247 0.272693 N1 0.250446 0.929073 0.272213 N2 0.244029 0.90527 0.347757 + txt003 +STRI + V0 0.936898 1.59519 1.62188 V1 1.30906 1.30906 1.62188 V2 1.36741 1.36741 1.37222 + N0 0.470295 0.810853 0.34834 N1 0.662761 0.662761 0.348563 N2 0.680271 0.680271 0.272877 + txt003 +STRI + V0 1.36741 1.36741 1.37222 V1 0.978656 1.66628 1.37222 V2 0.936898 1.59519 1.62188 + N0 0.680271 0.680271 0.272877 N1 0.482704 0.832247 0.272693 N2 0.470295 0.810853 0.34834 + txt003 +STRI + V0 1.30906 1.30906 1.62188 V1 1.59519 0.936898 1.62187 V2 1.66628 0.978656 1.37222 + N0 0.662761 0.662761 0.348563 N1 0.810853 0.470295 0.34834 N2 0.832247 0.482704 0.272693 + txt003 +STRI + V0 1.66628 0.978656 1.37222 V1 1.36741 1.36741 1.37222 V2 1.30906 1.30906 1.62188 + N0 0.832247 0.482704 0.272693 N1 0.680271 0.680271 0.272877 N2 0.662761 0.662761 0.348563 + txt003 +STRI + V0 1.59519 0.936898 1.62187 V1 1.77888 0.495081 1.62187 V2 1.85816 0.517147 1.37222 + N0 0.810853 0.470295 0.34834 N1 0.90527 0.244029 0.347757 N2 0.929073 0.250446 0.272213 + txt003 +STRI + V0 1.85816 0.517147 1.37222 V1 1.66628 0.978656 1.37222 V2 1.59519 0.936898 1.62187 + N0 0.929073 0.250446 0.272213 N1 0.832247 0.482704 0.272693 N2 0.810853 0.470295 0.34834 + txt003 +STRI + V0 1.77888 0.495081 1.62187 V1 1.84375 0 1.62187 V2 1.92593 2.22045e-16 1.37222 + N0 0.90527 0.244029 0.347757 N1 0.937749 -1.49384e-16 0.347314 N2 0.96234 -1.11936e-16 0.271848 + txt003 +STRI + V0 1.92593 2.22045e-16 1.37222 V1 1.85816 0.517147 1.37222 V2 1.77888 0.495081 1.62187 + N0 0.96234 -1.11936e-16 0.271848 N1 0.929073 0.250446 0.272213 N2 0.90527 0.244029 0.347757 + txt003 +STRI + V0 0 1.92593 1.37222 V1 0.517147 1.85816 1.37222 V2 0.531754 1.91065 1.1309 + N0 -0 0.96234 0.271848 N1 0.250446 0.929073 0.272213 N2 0.256935 0.953145 0.159686 + txt003 +STRI + V0 0.531754 1.91065 1.1309 V1 0 1.98032 1.1309 V2 0 1.92593 1.37222 + N0 0.256935 0.953145 0.159686 N1 -0 0.987204 0.15946 N2 -0 0.96234 0.271848 + txt003 +STRI + V0 0.517147 1.85816 1.37222 V1 0.978656 1.66628 1.37222 V2 1.0063 1.71335 1.1309 + N0 0.250446 0.929073 0.272213 N1 0.482704 0.832247 0.272693 N2 0.495256 0.853889 0.159982 + txt003 +STRI + V0 1.0063 1.71335 1.1309 V1 0.531754 1.91065 1.1309 V2 0.517147 1.85816 1.37222 + N0 0.495256 0.853889 0.159982 N1 0.256935 0.953145 0.159686 N2 0.250446 0.929073 0.272213 + txt003 +STRI + V0 0.978656 1.66628 1.37222 V1 1.36741 1.36741 1.37222 V2 1.40603 1.40603 1.1309 + N0 0.482704 0.832247 0.272693 N1 0.680271 0.680271 0.272877 N2 0.697986 0.697986 0.160096 + txt003 +STRI + V0 1.40603 1.40603 1.1309 V1 1.0063 1.71335 1.1309 V2 0.978656 1.66628 1.37222 + N0 0.697986 0.697986 0.160096 N1 0.495256 0.853889 0.159982 N2 0.482704 0.832247 0.272693 + txt003 +STRI + V0 1.36741 1.36741 1.37222 V1 1.66628 0.978656 1.37222 V2 1.71335 1.0063 1.1309 + N0 0.680271 0.680271 0.272877 N1 0.832247 0.482704 0.272693 N2 0.853889 0.495256 0.159982 + txt003 +STRI + V0 1.71335 1.0063 1.1309 V1 1.40603 1.40603 1.1309 V2 1.36741 1.36741 1.37222 + N0 0.853889 0.495256 0.159982 N1 0.697986 0.697986 0.160096 N2 0.680271 0.680271 0.272877 + txt003 +STRI + V0 1.66628 0.978656 1.37222 V1 1.85816 0.517147 1.37222 V2 1.91065 0.531754 1.1309 + N0 0.832247 0.482704 0.272693 N1 0.929073 0.250446 0.272213 N2 0.953145 0.256935 0.159686 + txt003 +STRI + V0 1.91065 0.531754 1.1309 V1 1.71335 1.0063 1.1309 V2 1.66628 0.978656 1.37222 + N0 0.953145 0.256935 0.159686 N1 0.853889 0.495256 0.159982 N2 0.832247 0.482704 0.272693 + txt003 +STRI + V0 1.85816 0.517147 1.37222 V1 1.92593 2.22045e-16 1.37222 V2 1.98032 -2.22045e-16 1.1309 + N0 0.929073 0.250446 0.272213 N1 0.96234 -1.11936e-16 0.271848 N2 0.987204 -6.38555e-17 0.15946 + txt003 +STRI + V0 1.98032 -2.22045e-16 1.1309 V1 1.91065 0.531754 1.1309 V2 1.85816 0.517147 1.37222 + N0 0.987204 -6.38555e-17 0.15946 N1 0.953145 0.256935 0.159686 N2 0.929073 0.250446 0.272213 + txt003 +STRI + V0 0 1.98032 1.1309 V1 0.531754 1.91065 1.1309 V2 0.537037 1.92963 0.9 + N0 -0 0.987204 0.15946 N1 0.256935 0.953145 0.159686 N2 0.260275 0.965535 5.17854e-17 + txt003 +STRI + V0 0.537037 1.92963 0.9 V1 0 2 0.9 V2 0 1.98032 1.1309 + N0 0.260275 0.965535 5.17854e-17 N1 -0 1 0 N2 -0 0.987204 0.15946 + txt003 +STRI + V0 0.531754 1.91065 1.1309 V1 1.0063 1.71335 1.1309 V2 1.0163 1.73037 0.9 + N0 0.256935 0.953145 0.159686 N1 0.495256 0.853889 0.159982 N2 0.501718 0.865031 1.36587e-16 + txt003 +STRI + V0 1.0163 1.73037 0.9 V1 0.537037 1.92963 0.9 V2 0.531754 1.91065 1.1309 + N0 0.501718 0.865031 1.36587e-16 N1 0.260275 0.965535 5.17854e-17 N2 0.256935 0.953145 0.159686 + txt003 +STRI + V0 1.0063 1.71335 1.1309 V1 1.40603 1.40603 1.1309 V2 1.42 1.42 0.9 + N0 0.495256 0.853889 0.159982 N1 0.697986 0.697986 0.160096 N2 0.707107 0.707107 1.74455e-16 + txt003 +STRI + V0 1.42 1.42 0.9 V1 1.0163 1.73037 0.9 V2 1.0063 1.71335 1.1309 + N0 0.707107 0.707107 1.74455e-16 N1 0.501718 0.865031 1.36587e-16 N2 0.495256 0.853889 0.159982 + txt003 +STRI + V0 1.40603 1.40603 1.1309 V1 1.71335 1.0063 1.1309 V2 1.73037 1.0163 0.9 + N0 0.697986 0.697986 0.160096 N1 0.853889 0.495256 0.159982 N2 0.865031 0.501718 1.36587e-16 + txt003 +STRI + V0 1.73037 1.0163 0.9 V1 1.42 1.42 0.9 V2 1.40603 1.40603 1.1309 + N0 0.865031 0.501718 1.36587e-16 N1 0.707107 0.707107 1.74455e-16 N2 0.697986 0.697986 0.160096 + txt003 +STRI + V0 1.71335 1.0063 1.1309 V1 1.91065 0.531754 1.1309 V2 1.92963 0.537037 0.9 + N0 0.853889 0.495256 0.159982 N1 0.953145 0.256935 0.159686 N2 0.965535 0.260275 5.17854e-17 + txt003 +STRI + V0 1.92963 0.537037 0.9 V1 1.73037 1.0163 0.9 V2 1.71335 1.0063 1.1309 + N0 0.965535 0.260275 5.17854e-17 N1 0.865031 0.501718 1.36587e-16 N2 0.853889 0.495256 0.159982 + txt003 +STRI + V0 1.91065 0.531754 1.1309 V1 1.98032 -2.22045e-16 1.1309 V2 2 0 0.9 + N0 0.953145 0.256935 0.159686 N1 0.987204 -6.38555e-17 0.15946 N2 1 0 0 + txt003 +STRI + V0 2 0 0.9 V1 1.92963 0.537037 0.9 V2 1.91065 0.531754 1.1309 + N0 1 0 0 N1 0.965535 0.260275 5.17854e-17 N2 0.953145 0.256935 0.159686 + txt003 +STRI + V0 2 0 0.9 V1 1.92963 -0.537037 0.9 V2 1.8939 -0.527092 0.693403 + N0 1 0 0 N1 0.965535 -0.260275 0 N2 0.905874 -0.244192 -0.346067 + txt003 +STRI + V0 1.8939 -0.527092 0.693403 V1 1.96296 0 0.693403 V2 2 0 0.9 + N0 0.905874 -0.244192 -0.346067 N1 0.938373 0 -0.345625 N2 1 0 0 + txt003 +STRI + V0 1.92963 -0.537037 0.9 V1 1.73037 -1.0163 0.9 V2 1.69833 -0.997476 0.693403 + N0 0.965535 -0.260275 0 N1 0.865031 -0.501718 0 N2 0.811395 -0.470609 -0.346647 + txt003 +STRI + V0 1.69833 -0.997476 0.693403 V1 1.8939 -0.527092 0.693403 V2 1.92963 -0.537037 0.9 + N0 0.811395 -0.470609 -0.346647 N1 0.905874 -0.244192 -0.346067 N2 0.965535 -0.260275 0 + txt003 +STRI + V0 1.73037 -1.0163 0.9 V1 1.42 -1.42 0.9 V2 1.3937 -1.3937 0.693403 + N0 0.865031 -0.501718 0 N1 0.707107 -0.707107 0 N2 0.663205 -0.663205 -0.34687 + txt003 +STRI + V0 1.3937 -1.3937 0.693403 V1 1.69833 -0.997476 0.693403 V2 1.73037 -1.0163 0.9 + N0 0.663205 -0.663205 -0.34687 N1 0.811395 -0.470609 -0.346647 N2 0.865031 -0.501718 0 + txt003 +STRI + V0 1.42 -1.42 0.9 V1 1.0163 -1.73037 0.9 V2 0.997476 -1.69833 0.693403 + N0 0.707107 -0.707107 0 N1 0.501718 -0.865031 0 N2 0.470609 -0.811395 -0.346647 + txt003 +STRI + V0 0.997476 -1.69833 0.693403 V1 1.3937 -1.3937 0.693403 V2 1.42 -1.42 0.9 + N0 0.470609 -0.811395 -0.346647 N1 0.663205 -0.663205 -0.34687 N2 0.707107 -0.707107 0 + txt003 +STRI + V0 1.0163 -1.73037 0.9 V1 0.537037 -1.92963 0.9 V2 0.527092 -1.8939 0.693403 + N0 0.501718 -0.865031 0 N1 0.260275 -0.965535 0 N2 0.244192 -0.905874 -0.346067 + txt003 +STRI + V0 0.527092 -1.8939 0.693403 V1 0.997476 -1.69833 0.693403 V2 1.0163 -1.73037 0.9 + N0 0.244192 -0.905874 -0.346067 N1 0.470609 -0.811395 -0.346647 N2 0.501718 -0.865031 0 + txt003 +STRI + V0 0.537037 -1.92963 0.9 V1 0 -2 0.9 V2 2.22045e-16 -1.96296 0.693403 + N0 0.260275 -0.965535 0 N1 -0 -1 -0 N2 -3.49072e-17 -0.938373 -0.345625 + txt003 +STRI + V0 2.22045e-16 -1.96296 0.693403 V1 0.527092 -1.8939 0.693403 V2 0.537037 -1.92963 0.9 + N0 -3.49072e-17 -0.938373 -0.345625 N1 0.244192 -0.905874 -0.346067 N2 0.260275 -0.965535 0 + txt003 +STRI + V0 1.96296 0 0.693403 V1 1.8939 -0.527092 0.693403 V2 1.80456 -0.502229 0.522222 + N0 0.938373 0 -0.345625 N1 0.905874 -0.244192 -0.346067 N2 0.782908 -0.211045 -0.585248 + txt003 +STRI + V0 1.80456 -0.502229 0.522222 V1 1.87037 0 0.522222 V2 1.96296 0 0.693403 + N0 0.782908 -0.211045 -0.585248 N1 0.811257 0 -0.58469 N2 0.938373 0 -0.345625 + txt003 +STRI + V0 1.8939 -0.527092 0.693403 V1 1.69833 -0.997476 0.693403 V2 1.61822 -0.950425 0.522222 + N0 0.905874 -0.244192 -0.346067 N1 0.811395 -0.470609 -0.346647 N2 0.700957 -0.406555 -0.58598 + txt003 +STRI + V0 1.61822 -0.950425 0.522222 V1 1.80456 -0.502229 0.522222 V2 1.8939 -0.527092 0.693403 + N0 0.700957 -0.406555 -0.58598 N1 0.782908 -0.211045 -0.585248 N2 0.905874 -0.244192 -0.346067 + txt003 +STRI + V0 1.69833 -0.997476 0.693403 V1 1.3937 -1.3937 0.693403 V2 1.32796 -1.32796 0.522222 + N0 0.811395 -0.470609 -0.346647 N1 0.663205 -0.663205 -0.34687 N2 0.572843 -0.572843 -0.586261 + txt003 +STRI + V0 1.32796 -1.32796 0.522222 V1 1.61822 -0.950425 0.522222 V2 1.69833 -0.997476 0.693403 + N0 0.572843 -0.572843 -0.586261 N1 0.700957 -0.406555 -0.58598 N2 0.811395 -0.470609 -0.346647 + txt003 +STRI + V0 1.3937 -1.3937 0.693403 V1 0.997476 -1.69833 0.693403 V2 0.950425 -1.61822 0.522222 + N0 0.663205 -0.663205 -0.34687 N1 0.470609 -0.811395 -0.346647 N2 0.406555 -0.700957 -0.58598 + txt003 +STRI + V0 0.950425 -1.61822 0.522222 V1 1.32796 -1.32796 0.522222 V2 1.3937 -1.3937 0.693403 + N0 0.406555 -0.700957 -0.58598 N1 0.572843 -0.572843 -0.586261 N2 0.663205 -0.663205 -0.34687 + txt003 +STRI + V0 0.997476 -1.69833 0.693403 V1 0.527092 -1.8939 0.693403 V2 0.502229 -1.80456 0.522222 + N0 0.470609 -0.811395 -0.346647 N1 0.244192 -0.905874 -0.346067 N2 0.211045 -0.782908 -0.585248 + txt003 +STRI + V0 0.502229 -1.80456 0.522222 V1 0.950425 -1.61822 0.522222 V2 0.997476 -1.69833 0.693403 + N0 0.211045 -0.782908 -0.585248 N1 0.406555 -0.700957 -0.58598 N2 0.470609 -0.811395 -0.346647 + txt003 +STRI + V0 0.527092 -1.8939 0.693403 V1 2.22045e-16 -1.96296 0.693403 V2 2.22045e-16 -1.87037 0.522222 + N0 0.244192 -0.905874 -0.346067 N1 -3.49072e-17 -0.938373 -0.345625 N2 -6.19755e-17 -0.811257 -0.58469 + txt003 +STRI + V0 2.22045e-16 -1.87037 0.522222 V1 0.502229 -1.80456 0.522222 V2 0.527092 -1.8939 0.693403 + N0 -6.19755e-17 -0.811257 -0.58469 N1 0.211045 -0.782908 -0.585248 N2 0.244192 -0.905874 -0.346067 + txt003 +STRI + V0 1.87037 0 0.522222 V1 1.80456 -0.502229 0.522222 V2 1.68843 -0.469907 0.384375 + N0 0.811257 0 -0.58469 N1 0.782908 -0.211045 -0.585248 N2 0.673539 -0.181563 -0.716506 + txt003 +STRI + V0 1.68843 -0.469907 0.384375 V1 1.75 0 0.384375 V2 1.87037 0 0.522222 + N0 0.673539 -0.181563 -0.716506 N1 0.6981 0 -0.716 N2 0.811257 0 -0.58469 + txt003 +STRI + V0 1.80456 -0.502229 0.522222 V1 1.61822 -0.950425 0.522222 V2 1.51407 -0.889259 0.384375 + N0 0.782908 -0.211045 -0.585248 N1 0.700957 -0.406555 -0.58598 N2 0.602839 -0.349647 -0.717169 + txt003 +STRI + V0 1.51407 -0.889259 0.384375 V1 1.68843 -0.469907 0.384375 V2 1.80456 -0.502229 0.522222 + N0 0.602839 -0.349647 -0.717169 N1 0.673539 -0.181563 -0.716506 N2 0.782908 -0.211045 -0.585248 + txt003 +STRI + V0 1.61822 -0.950425 0.522222 V1 1.32796 -1.32796 0.522222 V2 1.2425 -1.2425 0.384375 + N0 0.700957 -0.406555 -0.58598 N1 0.572843 -0.572843 -0.586261 N2 0.492597 -0.492597 -0.717423 + txt003 +STRI + V0 1.2425 -1.2425 0.384375 V1 1.51407 -0.889259 0.384375 V2 1.61822 -0.950425 0.522222 + N0 0.492597 -0.492597 -0.717423 N1 0.602839 -0.349647 -0.717169 N2 0.700957 -0.406555 -0.58598 + txt003 +STRI + V0 1.32796 -1.32796 0.522222 V1 0.950425 -1.61822 0.522222 V2 0.889259 -1.51407 0.384375 + N0 0.572843 -0.572843 -0.586261 N1 0.406555 -0.700957 -0.58598 N2 0.349647 -0.602839 -0.717169 + txt003 +STRI + V0 0.889259 -1.51407 0.384375 V1 1.2425 -1.2425 0.384375 V2 1.32796 -1.32796 0.522222 + N0 0.349647 -0.602839 -0.717169 N1 0.492597 -0.492597 -0.717423 N2 0.572843 -0.572843 -0.586261 + txt003 +STRI + V0 0.950425 -1.61822 0.522222 V1 0.502229 -1.80456 0.522222 V2 0.469907 -1.68843 0.384375 + N0 0.406555 -0.700957 -0.58598 N1 0.211045 -0.782908 -0.585248 N2 0.181563 -0.673539 -0.716506 + txt003 +STRI + V0 0.469907 -1.68843 0.384375 V1 0.889259 -1.51407 0.384375 V2 0.950425 -1.61822 0.522222 + N0 0.181563 -0.673539 -0.716506 N1 0.349647 -0.602839 -0.717169 N2 0.406555 -0.700957 -0.58598 + txt003 +STRI + V0 0.502229 -1.80456 0.522222 V1 2.22045e-16 -1.87037 0.522222 V2 2.22045e-16 -1.75 0.384375 + N0 0.211045 -0.782908 -0.585248 N1 -6.19755e-17 -0.811257 -0.58469 N2 -8.11143e-17 -0.6981 -0.716 + txt003 +STRI + V0 2.22045e-16 -1.75 0.384375 V1 0.469907 -1.68843 0.384375 V2 0.502229 -1.80456 0.522222 + N0 -8.11143e-17 -0.6981 -0.716 N1 0.181563 -0.673539 -0.716506 N2 0.211045 -0.782908 -0.585248 + txt003 +STRI + V0 1.75 0 0.384375 V1 1.68843 -0.469907 0.384375 V2 1.57229 -0.437586 0.277778 + N0 0.6981 0 -0.716 N1 0.673539 -0.181563 -0.716506 N2 0.61392 -0.165491 -0.771826 + txt003 +STRI + V0 1.57229 -0.437586 0.277778 V1 1.62963 0 0.277778 V2 1.75 0 0.384375 + N0 0.61392 -0.165491 -0.771826 N1 0.636383 0 -0.771373 N2 0.6981 0 -0.716 + txt003 +STRI + V0 1.68843 -0.469907 0.384375 V1 1.51407 -0.889259 0.384375 V2 1.40993 -0.828093 0.277778 + N0 0.673539 -0.181563 -0.716506 N1 0.602839 -0.349647 -0.717169 N2 0.549392 -0.318647 -0.77242 + txt003 +STRI + V0 1.40993 -0.828093 0.277778 V1 1.57229 -0.437586 0.277778 V2 1.68843 -0.469907 0.384375 + N0 0.549392 -0.318647 -0.77242 N1 0.61392 -0.165491 -0.771826 N2 0.673539 -0.181563 -0.716506 + txt003 +STRI + V0 1.51407 -0.889259 0.384375 V1 1.2425 -1.2425 0.384375 V2 1.15704 -1.15704 0.277778 + N0 0.602839 -0.349647 -0.717169 N1 0.492597 -0.492597 -0.717423 N2 0.448897 -0.448897 -0.772647 + txt003 +STRI + V0 1.15704 -1.15704 0.277778 V1 1.40993 -0.828093 0.277778 V2 1.51407 -0.889259 0.384375 + N0 0.448897 -0.448897 -0.772647 N1 0.549392 -0.318647 -0.77242 N2 0.602839 -0.349647 -0.717169 + txt003 +STRI + V0 1.2425 -1.2425 0.384375 V1 0.889259 -1.51407 0.384375 V2 0.828093 -1.40993 0.277778 + N0 0.492597 -0.492597 -0.717423 N1 0.349647 -0.602839 -0.717169 N2 0.318647 -0.549392 -0.77242 + txt003 +STRI + V0 0.828093 -1.40993 0.277778 V1 1.15704 -1.15704 0.277778 V2 1.2425 -1.2425 0.384375 + N0 0.318647 -0.549392 -0.77242 N1 0.448897 -0.448897 -0.772647 N2 0.492597 -0.492597 -0.717423 + txt003 +STRI + V0 0.889259 -1.51407 0.384375 V1 0.469907 -1.68843 0.384375 V2 0.437586 -1.57229 0.277778 + N0 0.349647 -0.602839 -0.717169 N1 0.181563 -0.673539 -0.716506 N2 0.165491 -0.61392 -0.771826 + txt003 +STRI + V0 0.437586 -1.57229 0.277778 V1 0.828093 -1.40993 0.277778 V2 0.889259 -1.51407 0.384375 + N0 0.165491 -0.61392 -0.771826 N1 0.318647 -0.549392 -0.77242 N2 0.349647 -0.602839 -0.717169 + txt003 +STRI + V0 0.469907 -1.68843 0.384375 V1 2.22045e-16 -1.75 0.384375 V2 0 -1.62963 0.277778 + N0 0.181563 -0.673539 -0.716506 N1 -8.11143e-17 -0.6981 -0.716 N2 -1.97068e-16 -0.636383 -0.771373 + txt003 +STRI + V0 0 -1.62963 0.277778 V1 0.437586 -1.57229 0.277778 V2 0.469907 -1.68843 0.384375 + N0 -1.97068e-16 -0.636383 -0.771373 N1 0.165491 -0.61392 -0.771826 N2 0.181563 -0.673539 -0.716506 + txt003 +STRI + V0 1.62963 0 0.277778 V1 1.57229 -0.437586 0.277778 V2 1.48296 -0.412723 0.200347 + N0 0.636383 0 -0.771373 N1 0.61392 -0.165491 -0.771826 N2 0.651276 -0.175561 -0.738253 + txt003 +STRI + V0 1.48296 -0.412723 0.200347 V1 1.53704 0 0.200347 V2 1.62963 0 0.277778 + N0 0.651276 -0.175561 -0.738253 N1 0.675056 0 -0.737766 N2 0.636383 0 -0.771373 + txt003 +STRI + V0 1.57229 -0.437586 0.277778 V1 1.40993 -0.828093 0.277778 V2 1.32982 -0.781043 0.200347 + N0 0.61392 -0.165491 -0.771826 N1 0.549392 -0.318647 -0.77242 N2 0.582878 -0.338069 -0.738893 + txt003 +STRI + V0 1.32982 -0.781043 0.200347 V1 1.48296 -0.412723 0.200347 V2 1.57229 -0.437586 0.277778 + N0 0.582878 -0.338069 -0.738893 N1 0.651276 -0.175561 -0.738253 N2 0.61392 -0.165491 -0.771826 + txt003 +STRI + V0 1.40993 -0.828093 0.277778 V1 1.15704 -1.15704 0.277778 V2 1.0913 -1.0913 0.200347 + N0 0.549392 -0.318647 -0.77242 N1 0.448897 -0.448897 -0.772647 N2 0.476275 -0.476275 -0.739137 + txt003 +STRI + V0 1.0913 -1.0913 0.200347 V1 1.32982 -0.781043 0.200347 V2 1.40993 -0.828093 0.277778 + N0 0.476275 -0.476275 -0.739137 N1 0.582878 -0.338069 -0.738893 N2 0.549392 -0.318647 -0.77242 + txt003 +STRI + V0 1.15704 -1.15704 0.277778 V1 0.828093 -1.40993 0.277778 V2 0.781043 -1.32982 0.200347 + N0 0.448897 -0.448897 -0.772647 N1 0.318647 -0.549392 -0.77242 N2 0.338069 -0.582878 -0.738893 + txt003 +STRI + V0 0.781043 -1.32982 0.200347 V1 1.0913 -1.0913 0.200347 V2 1.15704 -1.15704 0.277778 + N0 0.338069 -0.582878 -0.738893 N1 0.476275 -0.476275 -0.739137 N2 0.448897 -0.448897 -0.772647 + txt003 +STRI + V0 0.828093 -1.40993 0.277778 V1 0.437586 -1.57229 0.277778 V2 0.412723 -1.48296 0.200347 + N0 0.318647 -0.549392 -0.77242 N1 0.165491 -0.61392 -0.771826 N2 0.175561 -0.651276 -0.738253 + txt003 +STRI + V0 0.412723 -1.48296 0.200347 V1 0.781043 -1.32982 0.200347 V2 0.828093 -1.40993 0.277778 + N0 0.175561 -0.651276 -0.738253 N1 0.338069 -0.582878 -0.738893 N2 0.318647 -0.549392 -0.77242 + txt003 +STRI + V0 0.437586 -1.57229 0.277778 V1 0 -1.62963 0.277778 V2 0 -1.53704 0.200347 + N0 0.165491 -0.61392 -0.771826 N1 -1.97068e-16 -0.636383 -0.771373 N2 -9.51605e-17 -0.675056 -0.737766 + txt003 +STRI + V0 0 -1.53704 0.200347 V1 0.412723 -1.48296 0.200347 V2 0.437586 -1.57229 0.277778 + N0 -9.51605e-17 -0.675056 -0.737766 N1 0.175561 -0.651276 -0.738253 N2 0.165491 -0.61392 -0.771826 + txt003 +STRI + V0 1.53704 0 0.200347 V1 1.48296 -0.412723 0.200347 V2 1.44722 -0.402778 0.15 + N0 0.675056 0 -0.737766 N1 0.651276 -0.175561 -0.738253 N2 0.965535 -0.260275 0 + txt003 +STRI + V0 1.44722 -0.402778 0.15 V1 1.5 0 0.15 V2 1.53704 0 0.200347 + N0 0.965535 -0.260275 0 N1 1 0 0 N2 0.675056 0 -0.737766 + txt003 +STRI + V0 1.48296 -0.412723 0.200347 V1 1.32982 -0.781043 0.200347 V2 1.29778 -0.762222 0.15 + N0 0.651276 -0.175561 -0.738253 N1 0.582878 -0.338069 -0.738893 N2 0.865031 -0.501718 0 + txt003 +STRI + V0 1.29778 -0.762222 0.15 V1 1.44722 -0.402778 0.15 V2 1.48296 -0.412723 0.200347 + N0 0.865031 -0.501718 0 N1 0.965535 -0.260275 0 N2 0.651276 -0.175561 -0.738253 + txt003 +STRI + V0 1.32982 -0.781043 0.200347 V1 1.0913 -1.0913 0.200347 V2 1.065 -1.065 0.15 + N0 0.582878 -0.338069 -0.738893 N1 0.476275 -0.476275 -0.739137 N2 0.707107 -0.707107 0 + txt003 +STRI + V0 1.065 -1.065 0.15 V1 1.29778 -0.762222 0.15 V2 1.32982 -0.781043 0.200347 + N0 0.707107 -0.707107 0 N1 0.865031 -0.501718 0 N2 0.582878 -0.338069 -0.738893 + txt003 +STRI + V0 1.0913 -1.0913 0.200347 V1 0.781043 -1.32982 0.200347 V2 0.762222 -1.29778 0.15 + N0 0.476275 -0.476275 -0.739137 N1 0.338069 -0.582878 -0.738893 N2 0.501718 -0.865031 0 + txt003 +STRI + V0 0.762222 -1.29778 0.15 V1 1.065 -1.065 0.15 V2 1.0913 -1.0913 0.200347 + N0 0.501718 -0.865031 0 N1 0.707107 -0.707107 0 N2 0.476275 -0.476275 -0.739137 + txt003 +STRI + V0 0.781043 -1.32982 0.200347 V1 0.412723 -1.48296 0.200347 V2 0.402778 -1.44722 0.15 + N0 0.338069 -0.582878 -0.738893 N1 0.175561 -0.651276 -0.738253 N2 0.260275 -0.965535 0 + txt003 +STRI + V0 0.402778 -1.44722 0.15 V1 0.762222 -1.29778 0.15 V2 0.781043 -1.32982 0.200347 + N0 0.260275 -0.965535 0 N1 0.501718 -0.865031 0 N2 0.338069 -0.582878 -0.738893 + txt003 +STRI + V0 0.412723 -1.48296 0.200347 V1 0 -1.53704 0.200347 V2 0 -1.5 0.15 + N0 0.175561 -0.651276 -0.738253 N1 -9.51605e-17 -0.675056 -0.737766 N2 -0 -1 -0 + txt003 +STRI + V0 0 -1.5 0.15 V1 0.402778 -1.44722 0.15 V2 0.412723 -1.48296 0.200347 + N0 -0 -1 -0 N1 0.260275 -0.965535 0 N2 0.175561 -0.651276 -0.738253 + txt003 +STRI + V0 0 -2 0.9 V1 -0.537037 -1.92963 0.9 V2 -0.527092 -1.8939 0.693403 + N0 -0 -1 -0 N1 -0.260275 -0.965535 -0 N2 -0.244192 -0.905874 -0.346067 + txt003 +STRI + V0 -0.527092 -1.8939 0.693403 V1 0 -1.96296 0.693403 V2 0 -2 0.9 + N0 -0.244192 -0.905874 -0.346067 N1 -0 -0.938373 -0.345625 N2 -0 -1 -0 + txt003 +STRI + V0 -0.537037 -1.92963 0.9 V1 -1.0163 -1.73037 0.9 V2 -0.997476 -1.69833 0.693403 + N0 -0.260275 -0.965535 -0 N1 -0.501718 -0.865031 -0 N2 -0.470609 -0.811395 -0.346647 + txt003 +STRI + V0 -0.997476 -1.69833 0.693403 V1 -0.527092 -1.8939 0.693403 V2 -0.537037 -1.92963 0.9 + N0 -0.470609 -0.811395 -0.346647 N1 -0.244192 -0.905874 -0.346067 N2 -0.260275 -0.965535 -0 + txt003 +STRI + V0 -1.0163 -1.73037 0.9 V1 -1.42 -1.42 0.9 V2 -1.3937 -1.3937 0.693403 + N0 -0.501718 -0.865031 -0 N1 -0.707107 -0.707107 -0 N2 -0.663205 -0.663205 -0.34687 + txt003 +STRI + V0 -1.3937 -1.3937 0.693403 V1 -0.997476 -1.69833 0.693403 V2 -1.0163 -1.73037 0.9 + N0 -0.663205 -0.663205 -0.34687 N1 -0.470609 -0.811395 -0.346647 N2 -0.501718 -0.865031 -0 + txt003 +STRI + V0 -1.42 -1.42 0.9 V1 -1.73037 -1.0163 0.9 V2 -1.69833 -0.997476 0.693403 + N0 -0.707107 -0.707107 -0 N1 -0.865031 -0.501718 -0 N2 -0.811395 -0.470609 -0.346647 + txt003 +STRI + V0 -1.69833 -0.997476 0.693403 V1 -1.3937 -1.3937 0.693403 V2 -1.42 -1.42 0.9 + N0 -0.811395 -0.470609 -0.346647 N1 -0.663205 -0.663205 -0.34687 N2 -0.707107 -0.707107 -0 + txt003 +STRI + V0 -1.73037 -1.0163 0.9 V1 -1.92963 -0.537037 0.9 V2 -1.8939 -0.527092 0.693403 + N0 -0.865031 -0.501718 -0 N1 -0.965535 -0.260275 -0 N2 -0.905874 -0.244192 -0.346067 + txt003 +STRI + V0 -1.8939 -0.527092 0.693403 V1 -1.69833 -0.997476 0.693403 V2 -1.73037 -1.0163 0.9 + N0 -0.905874 -0.244192 -0.346067 N1 -0.811395 -0.470609 -0.346647 N2 -0.865031 -0.501718 -0 + txt003 +STRI + V0 -1.92963 -0.537037 0.9 V1 -2 0 0.9 V2 -1.96296 -2.22045e-16 0.693403 + N0 -0.965535 -0.260275 -0 N1 -1 0 0 N2 -0.938373 3.49072e-17 -0.345625 + txt003 +STRI + V0 -1.96296 -2.22045e-16 0.693403 V1 -1.8939 -0.527092 0.693403 V2 -1.92963 -0.537037 0.9 + N0 -0.938373 3.49072e-17 -0.345625 N1 -0.905874 -0.244192 -0.346067 N2 -0.965535 -0.260275 -0 + txt003 +STRI + V0 0 -1.96296 0.693403 V1 -0.527092 -1.8939 0.693403 V2 -0.502229 -1.80456 0.522222 + N0 -0 -0.938373 -0.345625 N1 -0.244192 -0.905874 -0.346067 N2 -0.211045 -0.782908 -0.585248 + txt003 +STRI + V0 -0.502229 -1.80456 0.522222 V1 0 -1.87037 0.522222 V2 0 -1.96296 0.693403 + N0 -0.211045 -0.782908 -0.585248 N1 -0 -0.811257 -0.58469 N2 -0 -0.938373 -0.345625 + txt003 +STRI + V0 -0.527092 -1.8939 0.693403 V1 -0.997476 -1.69833 0.693403 V2 -0.950425 -1.61822 0.522222 + N0 -0.244192 -0.905874 -0.346067 N1 -0.470609 -0.811395 -0.346647 N2 -0.406555 -0.700957 -0.58598 + txt003 +STRI + V0 -0.950425 -1.61822 0.522222 V1 -0.502229 -1.80456 0.522222 V2 -0.527092 -1.8939 0.693403 + N0 -0.406555 -0.700957 -0.58598 N1 -0.211045 -0.782908 -0.585248 N2 -0.244192 -0.905874 -0.346067 + txt003 +STRI + V0 -0.997476 -1.69833 0.693403 V1 -1.3937 -1.3937 0.693403 V2 -1.32796 -1.32796 0.522222 + N0 -0.470609 -0.811395 -0.346647 N1 -0.663205 -0.663205 -0.34687 N2 -0.572843 -0.572843 -0.586261 + txt003 +STRI + V0 -1.32796 -1.32796 0.522222 V1 -0.950425 -1.61822 0.522222 V2 -0.997476 -1.69833 0.693403 + N0 -0.572843 -0.572843 -0.586261 N1 -0.406555 -0.700957 -0.58598 N2 -0.470609 -0.811395 -0.346647 + txt003 +STRI + V0 -1.3937 -1.3937 0.693403 V1 -1.69833 -0.997476 0.693403 V2 -1.61822 -0.950425 0.522222 + N0 -0.663205 -0.663205 -0.34687 N1 -0.811395 -0.470609 -0.346647 N2 -0.700957 -0.406555 -0.58598 + txt003 +STRI + V0 -1.61822 -0.950425 0.522222 V1 -1.32796 -1.32796 0.522222 V2 -1.3937 -1.3937 0.693403 + N0 -0.700957 -0.406555 -0.58598 N1 -0.572843 -0.572843 -0.586261 N2 -0.663205 -0.663205 -0.34687 + txt003 +STRI + V0 -1.69833 -0.997476 0.693403 V1 -1.8939 -0.527092 0.693403 V2 -1.80456 -0.502229 0.522222 + N0 -0.811395 -0.470609 -0.346647 N1 -0.905874 -0.244192 -0.346067 N2 -0.782908 -0.211045 -0.585248 + txt003 +STRI + V0 -1.80456 -0.502229 0.522222 V1 -1.61822 -0.950425 0.522222 V2 -1.69833 -0.997476 0.693403 + N0 -0.782908 -0.211045 -0.585248 N1 -0.700957 -0.406555 -0.58598 N2 -0.811395 -0.470609 -0.346647 + txt003 +STRI + V0 -1.8939 -0.527092 0.693403 V1 -1.96296 -2.22045e-16 0.693403 V2 -1.87037 -2.22045e-16 0.522222 + N0 -0.905874 -0.244192 -0.346067 N1 -0.938373 3.49072e-17 -0.345625 N2 -0.811257 6.19755e-17 -0.58469 + txt003 +STRI + V0 -1.87037 -2.22045e-16 0.522222 V1 -1.80456 -0.502229 0.522222 V2 -1.8939 -0.527092 0.693403 + N0 -0.811257 6.19755e-17 -0.58469 N1 -0.782908 -0.211045 -0.585248 N2 -0.905874 -0.244192 -0.346067 + txt003 +STRI + V0 0 -1.87037 0.522222 V1 -0.502229 -1.80456 0.522222 V2 -0.469907 -1.68843 0.384375 + N0 -0 -0.811257 -0.58469 N1 -0.211045 -0.782908 -0.585248 N2 -0.181563 -0.673539 -0.716506 + txt003 +STRI + V0 -0.469907 -1.68843 0.384375 V1 0 -1.75 0.384375 V2 0 -1.87037 0.522222 + N0 -0.181563 -0.673539 -0.716506 N1 -0 -0.6981 -0.716 N2 -0 -0.811257 -0.58469 + txt003 +STRI + V0 -0.502229 -1.80456 0.522222 V1 -0.950425 -1.61822 0.522222 V2 -0.889259 -1.51407 0.384375 + N0 -0.211045 -0.782908 -0.585248 N1 -0.406555 -0.700957 -0.58598 N2 -0.349647 -0.602839 -0.717169 + txt003 +STRI + V0 -0.889259 -1.51407 0.384375 V1 -0.469907 -1.68843 0.384375 V2 -0.502229 -1.80456 0.522222 + N0 -0.349647 -0.602839 -0.717169 N1 -0.181563 -0.673539 -0.716506 N2 -0.211045 -0.782908 -0.585248 + txt003 +STRI + V0 -0.950425 -1.61822 0.522222 V1 -1.32796 -1.32796 0.522222 V2 -1.2425 -1.2425 0.384375 + N0 -0.406555 -0.700957 -0.58598 N1 -0.572843 -0.572843 -0.586261 N2 -0.492597 -0.492597 -0.717423 + txt003 +STRI + V0 -1.2425 -1.2425 0.384375 V1 -0.889259 -1.51407 0.384375 V2 -0.950425 -1.61822 0.522222 + N0 -0.492597 -0.492597 -0.717423 N1 -0.349647 -0.602839 -0.717169 N2 -0.406555 -0.700957 -0.58598 + txt003 +STRI + V0 -1.32796 -1.32796 0.522222 V1 -1.61822 -0.950425 0.522222 V2 -1.51407 -0.889259 0.384375 + N0 -0.572843 -0.572843 -0.586261 N1 -0.700957 -0.406555 -0.58598 N2 -0.602839 -0.349647 -0.717169 + txt003 +STRI + V0 -1.51407 -0.889259 0.384375 V1 -1.2425 -1.2425 0.384375 V2 -1.32796 -1.32796 0.522222 + N0 -0.602839 -0.349647 -0.717169 N1 -0.492597 -0.492597 -0.717423 N2 -0.572843 -0.572843 -0.586261 + txt003 +STRI + V0 -1.61822 -0.950425 0.522222 V1 -1.80456 -0.502229 0.522222 V2 -1.68843 -0.469907 0.384375 + N0 -0.700957 -0.406555 -0.58598 N1 -0.782908 -0.211045 -0.585248 N2 -0.673539 -0.181563 -0.716506 + txt003 +STRI + V0 -1.68843 -0.469907 0.384375 V1 -1.51407 -0.889259 0.384375 V2 -1.61822 -0.950425 0.522222 + N0 -0.673539 -0.181563 -0.716506 N1 -0.602839 -0.349647 -0.717169 N2 -0.700957 -0.406555 -0.58598 + txt003 +STRI + V0 -1.80456 -0.502229 0.522222 V1 -1.87037 -2.22045e-16 0.522222 V2 -1.75 -2.22045e-16 0.384375 + N0 -0.782908 -0.211045 -0.585248 N1 -0.811257 6.19755e-17 -0.58469 N2 -0.6981 8.11143e-17 -0.716 + txt003 +STRI + V0 -1.75 -2.22045e-16 0.384375 V1 -1.68843 -0.469907 0.384375 V2 -1.80456 -0.502229 0.522222 + N0 -0.6981 8.11143e-17 -0.716 N1 -0.673539 -0.181563 -0.716506 N2 -0.782908 -0.211045 -0.585248 + txt003 +STRI + V0 0 -1.75 0.384375 V1 -0.469907 -1.68843 0.384375 V2 -0.437586 -1.57229 0.277778 + N0 -0 -0.6981 -0.716 N1 -0.181563 -0.673539 -0.716506 N2 -0.165491 -0.61392 -0.771826 + txt003 +STRI + V0 -0.437586 -1.57229 0.277778 V1 0 -1.62963 0.277778 V2 0 -1.75 0.384375 + N0 -0.165491 -0.61392 -0.771826 N1 -0 -0.636383 -0.771373 N2 -0 -0.6981 -0.716 + txt003 +STRI + V0 -0.469907 -1.68843 0.384375 V1 -0.889259 -1.51407 0.384375 V2 -0.828093 -1.40993 0.277778 + N0 -0.181563 -0.673539 -0.716506 N1 -0.349647 -0.602839 -0.717169 N2 -0.318647 -0.549392 -0.77242 + txt003 +STRI + V0 -0.828093 -1.40993 0.277778 V1 -0.437586 -1.57229 0.277778 V2 -0.469907 -1.68843 0.384375 + N0 -0.318647 -0.549392 -0.77242 N1 -0.165491 -0.61392 -0.771826 N2 -0.181563 -0.673539 -0.716506 + txt003 +STRI + V0 -0.889259 -1.51407 0.384375 V1 -1.2425 -1.2425 0.384375 V2 -1.15704 -1.15704 0.277778 + N0 -0.349647 -0.602839 -0.717169 N1 -0.492597 -0.492597 -0.717423 N2 -0.448897 -0.448897 -0.772647 + txt003 +STRI + V0 -1.15704 -1.15704 0.277778 V1 -0.828093 -1.40993 0.277778 V2 -0.889259 -1.51407 0.384375 + N0 -0.448897 -0.448897 -0.772647 N1 -0.318647 -0.549392 -0.77242 N2 -0.349647 -0.602839 -0.717169 + txt003 +STRI + V0 -1.2425 -1.2425 0.384375 V1 -1.51407 -0.889259 0.384375 V2 -1.40993 -0.828093 0.277778 + N0 -0.492597 -0.492597 -0.717423 N1 -0.602839 -0.349647 -0.717169 N2 -0.549392 -0.318647 -0.77242 + txt003 +STRI + V0 -1.40993 -0.828093 0.277778 V1 -1.15704 -1.15704 0.277778 V2 -1.2425 -1.2425 0.384375 + N0 -0.549392 -0.318647 -0.77242 N1 -0.448897 -0.448897 -0.772647 N2 -0.492597 -0.492597 -0.717423 + txt003 +STRI + V0 -1.51407 -0.889259 0.384375 V1 -1.68843 -0.469907 0.384375 V2 -1.57229 -0.437586 0.277778 + N0 -0.602839 -0.349647 -0.717169 N1 -0.673539 -0.181563 -0.716506 N2 -0.61392 -0.165491 -0.771826 + txt003 +STRI + V0 -1.57229 -0.437586 0.277778 V1 -1.40993 -0.828093 0.277778 V2 -1.51407 -0.889259 0.384375 + N0 -0.61392 -0.165491 -0.771826 N1 -0.549392 -0.318647 -0.77242 N2 -0.602839 -0.349647 -0.717169 + txt003 +STRI + V0 -1.68843 -0.469907 0.384375 V1 -1.75 -2.22045e-16 0.384375 V2 -1.62963 0 0.277778 + N0 -0.673539 -0.181563 -0.716506 N1 -0.6981 8.11143e-17 -0.716 N2 -0.636383 1.97068e-16 -0.771373 + txt003 +STRI + V0 -1.62963 0 0.277778 V1 -1.57229 -0.437586 0.277778 V2 -1.68843 -0.469907 0.384375 + N0 -0.636383 1.97068e-16 -0.771373 N1 -0.61392 -0.165491 -0.771826 N2 -0.673539 -0.181563 -0.716506 + txt003 +STRI + V0 0 -1.62963 0.277778 V1 -0.437586 -1.57229 0.277778 V2 -0.412723 -1.48296 0.200347 + N0 -0 -0.636383 -0.771373 N1 -0.165491 -0.61392 -0.771826 N2 -0.175561 -0.651276 -0.738253 + txt003 +STRI + V0 -0.412723 -1.48296 0.200347 V1 0 -1.53704 0.200347 V2 0 -1.62963 0.277778 + N0 -0.175561 -0.651276 -0.738253 N1 -0 -0.675056 -0.737766 N2 -0 -0.636383 -0.771373 + txt003 +STRI + V0 -0.437586 -1.57229 0.277778 V1 -0.828093 -1.40993 0.277778 V2 -0.781043 -1.32982 0.200347 + N0 -0.165491 -0.61392 -0.771826 N1 -0.318647 -0.549392 -0.77242 N2 -0.338069 -0.582878 -0.738893 + txt003 +STRI + V0 -0.781043 -1.32982 0.200347 V1 -0.412723 -1.48296 0.200347 V2 -0.437586 -1.57229 0.277778 + N0 -0.338069 -0.582878 -0.738893 N1 -0.175561 -0.651276 -0.738253 N2 -0.165491 -0.61392 -0.771826 + txt003 +STRI + V0 -0.828093 -1.40993 0.277778 V1 -1.15704 -1.15704 0.277778 V2 -1.0913 -1.0913 0.200347 + N0 -0.318647 -0.549392 -0.77242 N1 -0.448897 -0.448897 -0.772647 N2 -0.476275 -0.476275 -0.739137 + txt003 +STRI + V0 -1.0913 -1.0913 0.200347 V1 -0.781043 -1.32982 0.200347 V2 -0.828093 -1.40993 0.277778 + N0 -0.476275 -0.476275 -0.739137 N1 -0.338069 -0.582878 -0.738893 N2 -0.318647 -0.549392 -0.77242 + txt003 +STRI + V0 -1.15704 -1.15704 0.277778 V1 -1.40993 -0.828093 0.277778 V2 -1.32982 -0.781043 0.200347 + N0 -0.448897 -0.448897 -0.772647 N1 -0.549392 -0.318647 -0.77242 N2 -0.582878 -0.338069 -0.738893 + txt003 +STRI + V0 -1.32982 -0.781043 0.200347 V1 -1.0913 -1.0913 0.200347 V2 -1.15704 -1.15704 0.277778 + N0 -0.582878 -0.338069 -0.738893 N1 -0.476275 -0.476275 -0.739137 N2 -0.448897 -0.448897 -0.772647 + txt003 +STRI + V0 -1.40993 -0.828093 0.277778 V1 -1.57229 -0.437586 0.277778 V2 -1.48296 -0.412723 0.200347 + N0 -0.549392 -0.318647 -0.77242 N1 -0.61392 -0.165491 -0.771826 N2 -0.651276 -0.175561 -0.738253 + txt003 +STRI + V0 -1.48296 -0.412723 0.200347 V1 -1.32982 -0.781043 0.200347 V2 -1.40993 -0.828093 0.277778 + N0 -0.651276 -0.175561 -0.738253 N1 -0.582878 -0.338069 -0.738893 N2 -0.549392 -0.318647 -0.77242 + txt003 +STRI + V0 -1.57229 -0.437586 0.277778 V1 -1.62963 0 0.277778 V2 -1.53704 0 0.200347 + N0 -0.61392 -0.165491 -0.771826 N1 -0.636383 1.97068e-16 -0.771373 N2 -0.675056 9.51605e-17 -0.737766 + txt003 +STRI + V0 -1.53704 0 0.200347 V1 -1.48296 -0.412723 0.200347 V2 -1.57229 -0.437586 0.277778 + N0 -0.675056 9.51605e-17 -0.737766 N1 -0.651276 -0.175561 -0.738253 N2 -0.61392 -0.165491 -0.771826 + txt003 +STRI + V0 0 -1.53704 0.200347 V1 -0.412723 -1.48296 0.200347 V2 -0.402778 -1.44722 0.15 + N0 -0 -0.675056 -0.737766 N1 -0.175561 -0.651276 -0.738253 N2 -0.260275 -0.965535 -0 + txt003 +STRI + V0 -0.402778 -1.44722 0.15 V1 0 -1.5 0.15 V2 0 -1.53704 0.200347 + N0 -0.260275 -0.965535 -0 N1 -0 -1 -0 N2 -0 -0.675056 -0.737766 + txt003 +STRI + V0 -0.412723 -1.48296 0.200347 V1 -0.781043 -1.32982 0.200347 V2 -0.762222 -1.29778 0.15 + N0 -0.175561 -0.651276 -0.738253 N1 -0.338069 -0.582878 -0.738893 N2 -0.501718 -0.865031 -0 + txt003 +STRI + V0 -0.762222 -1.29778 0.15 V1 -0.402778 -1.44722 0.15 V2 -0.412723 -1.48296 0.200347 + N0 -0.501718 -0.865031 -0 N1 -0.260275 -0.965535 -0 N2 -0.175561 -0.651276 -0.738253 + txt003 +STRI + V0 -0.781043 -1.32982 0.200347 V1 -1.0913 -1.0913 0.200347 V2 -1.065 -1.065 0.15 + N0 -0.338069 -0.582878 -0.738893 N1 -0.476275 -0.476275 -0.739137 N2 -0.707107 -0.707107 -0 + txt003 +STRI + V0 -1.065 -1.065 0.15 V1 -0.762222 -1.29778 0.15 V2 -0.781043 -1.32982 0.200347 + N0 -0.707107 -0.707107 -0 N1 -0.501718 -0.865031 -0 N2 -0.338069 -0.582878 -0.738893 + txt003 +STRI + V0 -1.0913 -1.0913 0.200347 V1 -1.32982 -0.781043 0.200347 V2 -1.29778 -0.762222 0.15 + N0 -0.476275 -0.476275 -0.739137 N1 -0.582878 -0.338069 -0.738893 N2 -0.865031 -0.501718 -0 + txt003 +STRI + V0 -1.29778 -0.762222 0.15 V1 -1.065 -1.065 0.15 V2 -1.0913 -1.0913 0.200347 + N0 -0.865031 -0.501718 -0 N1 -0.707107 -0.707107 -0 N2 -0.476275 -0.476275 -0.739137 + txt003 +STRI + V0 -1.32982 -0.781043 0.200347 V1 -1.48296 -0.412723 0.200347 V2 -1.44722 -0.402778 0.15 + N0 -0.582878 -0.338069 -0.738893 N1 -0.651276 -0.175561 -0.738253 N2 -0.965535 -0.260275 -0 + txt003 +STRI + V0 -1.44722 -0.402778 0.15 V1 -1.29778 -0.762222 0.15 V2 -1.32982 -0.781043 0.200347 + N0 -0.965535 -0.260275 -0 N1 -0.865031 -0.501718 -0 N2 -0.582878 -0.338069 -0.738893 + txt003 +STRI + V0 -1.48296 -0.412723 0.200347 V1 -1.53704 0 0.200347 V2 -1.5 0 0.15 + N0 -0.651276 -0.175561 -0.738253 N1 -0.675056 9.51605e-17 -0.737766 N2 -1 0 0 + txt003 +STRI + V0 -1.5 0 0.15 V1 -1.44722 -0.402778 0.15 V2 -1.48296 -0.412723 0.200347 + N0 -1 0 0 N1 -0.965535 -0.260275 -0 N2 -0.651276 -0.175561 -0.738253 + txt003 +STRI + V0 -2 0 0.9 V1 -1.92963 0.537037 0.9 V2 -1.8939 0.527092 0.693403 + N0 -1 0 0 N1 -0.965535 0.260275 0 N2 -0.905874 0.244192 -0.346067 + txt003 +STRI + V0 -1.8939 0.527092 0.693403 V1 -1.96296 0 0.693403 V2 -2 0 0.9 + N0 -0.905874 0.244192 -0.346067 N1 -0.938373 0 -0.345625 N2 -1 0 0 + txt003 +STRI + V0 -1.92963 0.537037 0.9 V1 -1.73037 1.0163 0.9 V2 -1.69833 0.997476 0.693403 + N0 -0.965535 0.260275 0 N1 -0.865031 0.501718 0 N2 -0.811395 0.470609 -0.346647 + txt003 +STRI + V0 -1.69833 0.997476 0.693403 V1 -1.8939 0.527092 0.693403 V2 -1.92963 0.537037 0.9 + N0 -0.811395 0.470609 -0.346647 N1 -0.905874 0.244192 -0.346067 N2 -0.965535 0.260275 0 + txt003 +STRI + V0 -1.73037 1.0163 0.9 V1 -1.42 1.42 0.9 V2 -1.3937 1.3937 0.693403 + N0 -0.865031 0.501718 0 N1 -0.707107 0.707107 0 N2 -0.663205 0.663205 -0.34687 + txt003 +STRI + V0 -1.3937 1.3937 0.693403 V1 -1.69833 0.997476 0.693403 V2 -1.73037 1.0163 0.9 + N0 -0.663205 0.663205 -0.34687 N1 -0.811395 0.470609 -0.346647 N2 -0.865031 0.501718 0 + txt003 +STRI + V0 -1.42 1.42 0.9 V1 -1.0163 1.73037 0.9 V2 -0.997476 1.69833 0.693403 + N0 -0.707107 0.707107 0 N1 -0.501718 0.865031 0 N2 -0.470609 0.811395 -0.346647 + txt003 +STRI + V0 -0.997476 1.69833 0.693403 V1 -1.3937 1.3937 0.693403 V2 -1.42 1.42 0.9 + N0 -0.470609 0.811395 -0.346647 N1 -0.663205 0.663205 -0.34687 N2 -0.707107 0.707107 0 + txt003 +STRI + V0 -1.0163 1.73037 0.9 V1 -0.537037 1.92963 0.9 V2 -0.527092 1.8939 0.693403 + N0 -0.501718 0.865031 0 N1 -0.260275 0.965535 0 N2 -0.244192 0.905874 -0.346067 + txt003 +STRI + V0 -0.527092 1.8939 0.693403 V1 -0.997476 1.69833 0.693403 V2 -1.0163 1.73037 0.9 + N0 -0.244192 0.905874 -0.346067 N1 -0.470609 0.811395 -0.346647 N2 -0.501718 0.865031 0 + txt003 +STRI + V0 -0.537037 1.92963 0.9 V1 0 2 0.9 V2 -2.22045e-16 1.96296 0.693403 + N0 -0.260275 0.965535 0 N1 -0 1 0 N2 3.49072e-17 0.938373 -0.345625 + txt003 +STRI + V0 -2.22045e-16 1.96296 0.693403 V1 -0.527092 1.8939 0.693403 V2 -0.537037 1.92963 0.9 + N0 3.49072e-17 0.938373 -0.345625 N1 -0.244192 0.905874 -0.346067 N2 -0.260275 0.965535 0 + txt003 +STRI + V0 -1.96296 0 0.693403 V1 -1.8939 0.527092 0.693403 V2 -1.80456 0.502229 0.522222 + N0 -0.938373 0 -0.345625 N1 -0.905874 0.244192 -0.346067 N2 -0.782908 0.211045 -0.585248 + txt003 +STRI + V0 -1.80456 0.502229 0.522222 V1 -1.87037 0 0.522222 V2 -1.96296 0 0.693403 + N0 -0.782908 0.211045 -0.585248 N1 -0.811257 0 -0.58469 N2 -0.938373 0 -0.345625 + txt003 +STRI + V0 -1.8939 0.527092 0.693403 V1 -1.69833 0.997476 0.693403 V2 -1.61822 0.950425 0.522222 + N0 -0.905874 0.244192 -0.346067 N1 -0.811395 0.470609 -0.346647 N2 -0.700957 0.406555 -0.58598 + txt003 +STRI + V0 -1.61822 0.950425 0.522222 V1 -1.80456 0.502229 0.522222 V2 -1.8939 0.527092 0.693403 + N0 -0.700957 0.406555 -0.58598 N1 -0.782908 0.211045 -0.585248 N2 -0.905874 0.244192 -0.346067 + txt003 +STRI + V0 -1.69833 0.997476 0.693403 V1 -1.3937 1.3937 0.693403 V2 -1.32796 1.32796 0.522222 + N0 -0.811395 0.470609 -0.346647 N1 -0.663205 0.663205 -0.34687 N2 -0.572843 0.572843 -0.586261 + txt003 +STRI + V0 -1.32796 1.32796 0.522222 V1 -1.61822 0.950425 0.522222 V2 -1.69833 0.997476 0.693403 + N0 -0.572843 0.572843 -0.586261 N1 -0.700957 0.406555 -0.58598 N2 -0.811395 0.470609 -0.346647 + txt003 +STRI + V0 -1.3937 1.3937 0.693403 V1 -0.997476 1.69833 0.693403 V2 -0.950425 1.61822 0.522222 + N0 -0.663205 0.663205 -0.34687 N1 -0.470609 0.811395 -0.346647 N2 -0.406555 0.700957 -0.58598 + txt003 +STRI + V0 -0.950425 1.61822 0.522222 V1 -1.32796 1.32796 0.522222 V2 -1.3937 1.3937 0.693403 + N0 -0.406555 0.700957 -0.58598 N1 -0.572843 0.572843 -0.586261 N2 -0.663205 0.663205 -0.34687 + txt003 +STRI + V0 -0.997476 1.69833 0.693403 V1 -0.527092 1.8939 0.693403 V2 -0.502229 1.80456 0.522222 + N0 -0.470609 0.811395 -0.346647 N1 -0.244192 0.905874 -0.346067 N2 -0.211045 0.782908 -0.585248 + txt003 +STRI + V0 -0.502229 1.80456 0.522222 V1 -0.950425 1.61822 0.522222 V2 -0.997476 1.69833 0.693403 + N0 -0.211045 0.782908 -0.585248 N1 -0.406555 0.700957 -0.58598 N2 -0.470609 0.811395 -0.346647 + txt003 +STRI + V0 -0.527092 1.8939 0.693403 V1 -2.22045e-16 1.96296 0.693403 V2 -2.22045e-16 1.87037 0.522222 + N0 -0.244192 0.905874 -0.346067 N1 3.49072e-17 0.938373 -0.345625 N2 6.19755e-17 0.811257 -0.58469 + txt003 +STRI + V0 -2.22045e-16 1.87037 0.522222 V1 -0.502229 1.80456 0.522222 V2 -0.527092 1.8939 0.693403 + N0 6.19755e-17 0.811257 -0.58469 N1 -0.211045 0.782908 -0.585248 N2 -0.244192 0.905874 -0.346067 + txt003 +STRI + V0 -1.87037 0 0.522222 V1 -1.80456 0.502229 0.522222 V2 -1.68843 0.469907 0.384375 + N0 -0.811257 0 -0.58469 N1 -0.782908 0.211045 -0.585248 N2 -0.673539 0.181563 -0.716506 + txt003 +STRI + V0 -1.68843 0.469907 0.384375 V1 -1.75 0 0.384375 V2 -1.87037 0 0.522222 + N0 -0.673539 0.181563 -0.716506 N1 -0.6981 0 -0.716 N2 -0.811257 0 -0.58469 + txt003 +STRI + V0 -1.80456 0.502229 0.522222 V1 -1.61822 0.950425 0.522222 V2 -1.51407 0.889259 0.384375 + N0 -0.782908 0.211045 -0.585248 N1 -0.700957 0.406555 -0.58598 N2 -0.602839 0.349647 -0.717169 + txt003 +STRI + V0 -1.51407 0.889259 0.384375 V1 -1.68843 0.469907 0.384375 V2 -1.80456 0.502229 0.522222 + N0 -0.602839 0.349647 -0.717169 N1 -0.673539 0.181563 -0.716506 N2 -0.782908 0.211045 -0.585248 + txt003 +STRI + V0 -1.61822 0.950425 0.522222 V1 -1.32796 1.32796 0.522222 V2 -1.2425 1.2425 0.384375 + N0 -0.700957 0.406555 -0.58598 N1 -0.572843 0.572843 -0.586261 N2 -0.492597 0.492597 -0.717423 + txt003 +STRI + V0 -1.2425 1.2425 0.384375 V1 -1.51407 0.889259 0.384375 V2 -1.61822 0.950425 0.522222 + N0 -0.492597 0.492597 -0.717423 N1 -0.602839 0.349647 -0.717169 N2 -0.700957 0.406555 -0.58598 + txt003 +STRI + V0 -1.32796 1.32796 0.522222 V1 -0.950425 1.61822 0.522222 V2 -0.889259 1.51407 0.384375 + N0 -0.572843 0.572843 -0.586261 N1 -0.406555 0.700957 -0.58598 N2 -0.349647 0.602839 -0.717169 + txt003 +STRI + V0 -0.889259 1.51407 0.384375 V1 -1.2425 1.2425 0.384375 V2 -1.32796 1.32796 0.522222 + N0 -0.349647 0.602839 -0.717169 N1 -0.492597 0.492597 -0.717423 N2 -0.572843 0.572843 -0.586261 + txt003 +STRI + V0 -0.950425 1.61822 0.522222 V1 -0.502229 1.80456 0.522222 V2 -0.469907 1.68843 0.384375 + N0 -0.406555 0.700957 -0.58598 N1 -0.211045 0.782908 -0.585248 N2 -0.181563 0.673539 -0.716506 + txt003 +STRI + V0 -0.469907 1.68843 0.384375 V1 -0.889259 1.51407 0.384375 V2 -0.950425 1.61822 0.522222 + N0 -0.181563 0.673539 -0.716506 N1 -0.349647 0.602839 -0.717169 N2 -0.406555 0.700957 -0.58598 + txt003 +STRI + V0 -0.502229 1.80456 0.522222 V1 -2.22045e-16 1.87037 0.522222 V2 -2.22045e-16 1.75 0.384375 + N0 -0.211045 0.782908 -0.585248 N1 6.19755e-17 0.811257 -0.58469 N2 8.11143e-17 0.6981 -0.716 + txt003 +STRI + V0 -2.22045e-16 1.75 0.384375 V1 -0.469907 1.68843 0.384375 V2 -0.502229 1.80456 0.522222 + N0 8.11143e-17 0.6981 -0.716 N1 -0.181563 0.673539 -0.716506 N2 -0.211045 0.782908 -0.585248 + txt003 +STRI + V0 -1.75 0 0.384375 V1 -1.68843 0.469907 0.384375 V2 -1.57229 0.437586 0.277778 + N0 -0.6981 0 -0.716 N1 -0.673539 0.181563 -0.716506 N2 -0.61392 0.165491 -0.771826 + txt003 +STRI + V0 -1.57229 0.437586 0.277778 V1 -1.62963 0 0.277778 V2 -1.75 0 0.384375 + N0 -0.61392 0.165491 -0.771826 N1 -0.636383 0 -0.771373 N2 -0.6981 0 -0.716 + txt003 +STRI + V0 -1.68843 0.469907 0.384375 V1 -1.51407 0.889259 0.384375 V2 -1.40993 0.828093 0.277778 + N0 -0.673539 0.181563 -0.716506 N1 -0.602839 0.349647 -0.717169 N2 -0.549392 0.318647 -0.77242 + txt003 +STRI + V0 -1.40993 0.828093 0.277778 V1 -1.57229 0.437586 0.277778 V2 -1.68843 0.469907 0.384375 + N0 -0.549392 0.318647 -0.77242 N1 -0.61392 0.165491 -0.771826 N2 -0.673539 0.181563 -0.716506 + txt003 +STRI + V0 -1.51407 0.889259 0.384375 V1 -1.2425 1.2425 0.384375 V2 -1.15704 1.15704 0.277778 + N0 -0.602839 0.349647 -0.717169 N1 -0.492597 0.492597 -0.717423 N2 -0.448897 0.448897 -0.772647 + txt003 +STRI + V0 -1.15704 1.15704 0.277778 V1 -1.40993 0.828093 0.277778 V2 -1.51407 0.889259 0.384375 + N0 -0.448897 0.448897 -0.772647 N1 -0.549392 0.318647 -0.77242 N2 -0.602839 0.349647 -0.717169 + txt003 +STRI + V0 -1.2425 1.2425 0.384375 V1 -0.889259 1.51407 0.384375 V2 -0.828093 1.40993 0.277778 + N0 -0.492597 0.492597 -0.717423 N1 -0.349647 0.602839 -0.717169 N2 -0.318647 0.549392 -0.77242 + txt003 +STRI + V0 -0.828093 1.40993 0.277778 V1 -1.15704 1.15704 0.277778 V2 -1.2425 1.2425 0.384375 + N0 -0.318647 0.549392 -0.77242 N1 -0.448897 0.448897 -0.772647 N2 -0.492597 0.492597 -0.717423 + txt003 +STRI + V0 -0.889259 1.51407 0.384375 V1 -0.469907 1.68843 0.384375 V2 -0.437586 1.57229 0.277778 + N0 -0.349647 0.602839 -0.717169 N1 -0.181563 0.673539 -0.716506 N2 -0.165491 0.61392 -0.771826 + txt003 +STRI + V0 -0.437586 1.57229 0.277778 V1 -0.828093 1.40993 0.277778 V2 -0.889259 1.51407 0.384375 + N0 -0.165491 0.61392 -0.771826 N1 -0.318647 0.549392 -0.77242 N2 -0.349647 0.602839 -0.717169 + txt003 +STRI + V0 -0.469907 1.68843 0.384375 V1 -2.22045e-16 1.75 0.384375 V2 0 1.62963 0.277778 + N0 -0.181563 0.673539 -0.716506 N1 8.11143e-17 0.6981 -0.716 N2 1.97068e-16 0.636383 -0.771373 + txt003 +STRI + V0 0 1.62963 0.277778 V1 -0.437586 1.57229 0.277778 V2 -0.469907 1.68843 0.384375 + N0 1.97068e-16 0.636383 -0.771373 N1 -0.165491 0.61392 -0.771826 N2 -0.181563 0.673539 -0.716506 + txt003 +STRI + V0 -1.62963 0 0.277778 V1 -1.57229 0.437586 0.277778 V2 -1.48296 0.412723 0.200347 + N0 -0.636383 0 -0.771373 N1 -0.61392 0.165491 -0.771826 N2 -0.651276 0.175561 -0.738253 + txt003 +STRI + V0 -1.48296 0.412723 0.200347 V1 -1.53704 0 0.200347 V2 -1.62963 0 0.277778 + N0 -0.651276 0.175561 -0.738253 N1 -0.675056 0 -0.737766 N2 -0.636383 0 -0.771373 + txt003 +STRI + V0 -1.57229 0.437586 0.277778 V1 -1.40993 0.828093 0.277778 V2 -1.32982 0.781043 0.200347 + N0 -0.61392 0.165491 -0.771826 N1 -0.549392 0.318647 -0.77242 N2 -0.582878 0.338069 -0.738893 + txt003 +STRI + V0 -1.32982 0.781043 0.200347 V1 -1.48296 0.412723 0.200347 V2 -1.57229 0.437586 0.277778 + N0 -0.582878 0.338069 -0.738893 N1 -0.651276 0.175561 -0.738253 N2 -0.61392 0.165491 -0.771826 + txt003 +STRI + V0 -1.40993 0.828093 0.277778 V1 -1.15704 1.15704 0.277778 V2 -1.0913 1.0913 0.200347 + N0 -0.549392 0.318647 -0.77242 N1 -0.448897 0.448897 -0.772647 N2 -0.476275 0.476275 -0.739137 + txt003 +STRI + V0 -1.0913 1.0913 0.200347 V1 -1.32982 0.781043 0.200347 V2 -1.40993 0.828093 0.277778 + N0 -0.476275 0.476275 -0.739137 N1 -0.582878 0.338069 -0.738893 N2 -0.549392 0.318647 -0.77242 + txt003 +STRI + V0 -1.15704 1.15704 0.277778 V1 -0.828093 1.40993 0.277778 V2 -0.781043 1.32982 0.200347 + N0 -0.448897 0.448897 -0.772647 N1 -0.318647 0.549392 -0.77242 N2 -0.338069 0.582878 -0.738893 + txt003 +STRI + V0 -0.781043 1.32982 0.200347 V1 -1.0913 1.0913 0.200347 V2 -1.15704 1.15704 0.277778 + N0 -0.338069 0.582878 -0.738893 N1 -0.476275 0.476275 -0.739137 N2 -0.448897 0.448897 -0.772647 + txt003 +STRI + V0 -0.828093 1.40993 0.277778 V1 -0.437586 1.57229 0.277778 V2 -0.412723 1.48296 0.200347 + N0 -0.318647 0.549392 -0.77242 N1 -0.165491 0.61392 -0.771826 N2 -0.175561 0.651276 -0.738253 + txt003 +STRI + V0 -0.412723 1.48296 0.200347 V1 -0.781043 1.32982 0.200347 V2 -0.828093 1.40993 0.277778 + N0 -0.175561 0.651276 -0.738253 N1 -0.338069 0.582878 -0.738893 N2 -0.318647 0.549392 -0.77242 + txt003 +STRI + V0 -0.437586 1.57229 0.277778 V1 0 1.62963 0.277778 V2 0 1.53704 0.200347 + N0 -0.165491 0.61392 -0.771826 N1 1.97068e-16 0.636383 -0.771373 N2 9.51605e-17 0.675056 -0.737766 + txt003 +STRI + V0 0 1.53704 0.200347 V1 -0.412723 1.48296 0.200347 V2 -0.437586 1.57229 0.277778 + N0 9.51605e-17 0.675056 -0.737766 N1 -0.175561 0.651276 -0.738253 N2 -0.165491 0.61392 -0.771826 + txt003 +STRI + V0 -1.53704 0 0.200347 V1 -1.48296 0.412723 0.200347 V2 -1.44722 0.402778 0.15 + N0 -0.675056 0 -0.737766 N1 -0.651276 0.175561 -0.738253 N2 -0.965535 0.260275 0 + txt003 +STRI + V0 -1.44722 0.402778 0.15 V1 -1.5 0 0.15 V2 -1.53704 0 0.200347 + N0 -0.965535 0.260275 0 N1 -1 0 0 N2 -0.675056 0 -0.737766 + txt003 +STRI + V0 -1.48296 0.412723 0.200347 V1 -1.32982 0.781043 0.200347 V2 -1.29778 0.762222 0.15 + N0 -0.651276 0.175561 -0.738253 N1 -0.582878 0.338069 -0.738893 N2 -0.865031 0.501718 0 + txt003 +STRI + V0 -1.29778 0.762222 0.15 V1 -1.44722 0.402778 0.15 V2 -1.48296 0.412723 0.200347 + N0 -0.865031 0.501718 0 N1 -0.965535 0.260275 0 N2 -0.651276 0.175561 -0.738253 + txt003 +STRI + V0 -1.32982 0.781043 0.200347 V1 -1.0913 1.0913 0.200347 V2 -1.065 1.065 0.15 + N0 -0.582878 0.338069 -0.738893 N1 -0.476275 0.476275 -0.739137 N2 -0.707107 0.707107 0 + txt003 +STRI + V0 -1.065 1.065 0.15 V1 -1.29778 0.762222 0.15 V2 -1.32982 0.781043 0.200347 + N0 -0.707107 0.707107 0 N1 -0.865031 0.501718 0 N2 -0.582878 0.338069 -0.738893 + txt003 +STRI + V0 -1.0913 1.0913 0.200347 V1 -0.781043 1.32982 0.200347 V2 -0.762222 1.29778 0.15 + N0 -0.476275 0.476275 -0.739137 N1 -0.338069 0.582878 -0.738893 N2 -0.501718 0.865031 0 + txt003 +STRI + V0 -0.762222 1.29778 0.15 V1 -1.065 1.065 0.15 V2 -1.0913 1.0913 0.200347 + N0 -0.501718 0.865031 0 N1 -0.707107 0.707107 0 N2 -0.476275 0.476275 -0.739137 + txt003 +STRI + V0 -0.781043 1.32982 0.200347 V1 -0.412723 1.48296 0.200347 V2 -0.402778 1.44722 0.15 + N0 -0.338069 0.582878 -0.738893 N1 -0.175561 0.651276 -0.738253 N2 -0.260275 0.965535 0 + txt003 +STRI + V0 -0.402778 1.44722 0.15 V1 -0.762222 1.29778 0.15 V2 -0.781043 1.32982 0.200347 + N0 -0.260275 0.965535 0 N1 -0.501718 0.865031 0 N2 -0.338069 0.582878 -0.738893 + txt003 +STRI + V0 -0.412723 1.48296 0.200347 V1 0 1.53704 0.200347 V2 0 1.5 0.15 + N0 -0.175561 0.651276 -0.738253 N1 9.51605e-17 0.675056 -0.737766 N2 -0 1 0 + txt003 +STRI + V0 0 1.5 0.15 V1 -0.402778 1.44722 0.15 V2 -0.412723 1.48296 0.200347 + N0 -0 1 0 N1 -0.260275 0.965535 0 N2 -0.175561 0.651276 -0.738253 + txt003 +STRI + V0 0 2 0.9 V1 0.537037 1.92963 0.9 V2 0.527092 1.8939 0.693403 + N0 -0 1 0 N1 0.260275 0.965535 0 N2 0.244192 0.905874 -0.346067 + txt003 +STRI + V0 0.527092 1.8939 0.693403 V1 0 1.96296 0.693403 V2 0 2 0.9 + N0 0.244192 0.905874 -0.346067 N1 0 0.938373 -0.345625 N2 -0 1 0 + txt003 +STRI + V0 0.537037 1.92963 0.9 V1 1.0163 1.73037 0.9 V2 0.997476 1.69833 0.693403 + N0 0.260275 0.965535 0 N1 0.501718 0.865031 0 N2 0.470609 0.811395 -0.346647 + txt003 +STRI + V0 0.997476 1.69833 0.693403 V1 0.527092 1.8939 0.693403 V2 0.537037 1.92963 0.9 + N0 0.470609 0.811395 -0.346647 N1 0.244192 0.905874 -0.346067 N2 0.260275 0.965535 0 + txt003 +STRI + V0 1.0163 1.73037 0.9 V1 1.42 1.42 0.9 V2 1.3937 1.3937 0.693403 + N0 0.501718 0.865031 0 N1 0.707107 0.707107 0 N2 0.663205 0.663205 -0.34687 + txt003 +STRI + V0 1.3937 1.3937 0.693403 V1 0.997476 1.69833 0.693403 V2 1.0163 1.73037 0.9 + N0 0.663205 0.663205 -0.34687 N1 0.470609 0.811395 -0.346647 N2 0.501718 0.865031 0 + txt003 +STRI + V0 1.42 1.42 0.9 V1 1.73037 1.0163 0.9 V2 1.69833 0.997476 0.693403 + N0 0.707107 0.707107 0 N1 0.865031 0.501718 0 N2 0.811395 0.470609 -0.346647 + txt003 +STRI + V0 1.69833 0.997476 0.693403 V1 1.3937 1.3937 0.693403 V2 1.42 1.42 0.9 + N0 0.811395 0.470609 -0.346647 N1 0.663205 0.663205 -0.34687 N2 0.707107 0.707107 0 + txt003 +STRI + V0 1.73037 1.0163 0.9 V1 1.92963 0.537037 0.9 V2 1.8939 0.527092 0.693403 + N0 0.865031 0.501718 0 N1 0.965535 0.260275 0 N2 0.905874 0.244192 -0.346067 + txt003 +STRI + V0 1.8939 0.527092 0.693403 V1 1.69833 0.997476 0.693403 V2 1.73037 1.0163 0.9 + N0 0.905874 0.244192 -0.346067 N1 0.811395 0.470609 -0.346647 N2 0.865031 0.501718 0 + txt003 +STRI + V0 1.92963 0.537037 0.9 V1 2 0 0.9 V2 1.96296 2.22045e-16 0.693403 + N0 0.965535 0.260275 0 N1 1 0 0 N2 0.938373 -3.49072e-17 -0.345625 + txt003 +STRI + V0 1.96296 2.22045e-16 0.693403 V1 1.8939 0.527092 0.693403 V2 1.92963 0.537037 0.9 + N0 0.938373 -3.49072e-17 -0.345625 N1 0.905874 0.244192 -0.346067 N2 0.965535 0.260275 0 + txt003 +STRI + V0 0 1.96296 0.693403 V1 0.527092 1.8939 0.693403 V2 0.502229 1.80456 0.522222 + N0 0 0.938373 -0.345625 N1 0.244192 0.905874 -0.346067 N2 0.211045 0.782908 -0.585248 + txt003 +STRI + V0 0.502229 1.80456 0.522222 V1 0 1.87037 0.522222 V2 0 1.96296 0.693403 + N0 0.211045 0.782908 -0.585248 N1 0 0.811257 -0.58469 N2 0 0.938373 -0.345625 + txt003 +STRI + V0 0.527092 1.8939 0.693403 V1 0.997476 1.69833 0.693403 V2 0.950425 1.61822 0.522222 + N0 0.244192 0.905874 -0.346067 N1 0.470609 0.811395 -0.346647 N2 0.406555 0.700957 -0.58598 + txt003 +STRI + V0 0.950425 1.61822 0.522222 V1 0.502229 1.80456 0.522222 V2 0.527092 1.8939 0.693403 + N0 0.406555 0.700957 -0.58598 N1 0.211045 0.782908 -0.585248 N2 0.244192 0.905874 -0.346067 + txt003 +STRI + V0 0.997476 1.69833 0.693403 V1 1.3937 1.3937 0.693403 V2 1.32796 1.32796 0.522222 + N0 0.470609 0.811395 -0.346647 N1 0.663205 0.663205 -0.34687 N2 0.572843 0.572843 -0.586261 + txt003 +STRI + V0 1.32796 1.32796 0.522222 V1 0.950425 1.61822 0.522222 V2 0.997476 1.69833 0.693403 + N0 0.572843 0.572843 -0.586261 N1 0.406555 0.700957 -0.58598 N2 0.470609 0.811395 -0.346647 + txt003 +STRI + V0 1.3937 1.3937 0.693403 V1 1.69833 0.997476 0.693403 V2 1.61822 0.950425 0.522222 + N0 0.663205 0.663205 -0.34687 N1 0.811395 0.470609 -0.346647 N2 0.700957 0.406555 -0.58598 + txt003 +STRI + V0 1.61822 0.950425 0.522222 V1 1.32796 1.32796 0.522222 V2 1.3937 1.3937 0.693403 + N0 0.700957 0.406555 -0.58598 N1 0.572843 0.572843 -0.586261 N2 0.663205 0.663205 -0.34687 + txt003 +STRI + V0 1.69833 0.997476 0.693403 V1 1.8939 0.527092 0.693403 V2 1.80456 0.502229 0.522222 + N0 0.811395 0.470609 -0.346647 N1 0.905874 0.244192 -0.346067 N2 0.782908 0.211045 -0.585248 + txt003 +STRI + V0 1.80456 0.502229 0.522222 V1 1.61822 0.950425 0.522222 V2 1.69833 0.997476 0.693403 + N0 0.782908 0.211045 -0.585248 N1 0.700957 0.406555 -0.58598 N2 0.811395 0.470609 -0.346647 + txt003 +STRI + V0 1.8939 0.527092 0.693403 V1 1.96296 2.22045e-16 0.693403 V2 1.87037 2.22045e-16 0.522222 + N0 0.905874 0.244192 -0.346067 N1 0.938373 -3.49072e-17 -0.345625 N2 0.811257 -6.19755e-17 -0.58469 + txt003 +STRI + V0 1.87037 2.22045e-16 0.522222 V1 1.80456 0.502229 0.522222 V2 1.8939 0.527092 0.693403 + N0 0.811257 -6.19755e-17 -0.58469 N1 0.782908 0.211045 -0.585248 N2 0.905874 0.244192 -0.346067 + txt003 +STRI + V0 0 1.87037 0.522222 V1 0.502229 1.80456 0.522222 V2 0.469907 1.68843 0.384375 + N0 0 0.811257 -0.58469 N1 0.211045 0.782908 -0.585248 N2 0.181563 0.673539 -0.716506 + txt003 +STRI + V0 0.469907 1.68843 0.384375 V1 0 1.75 0.384375 V2 0 1.87037 0.522222 + N0 0.181563 0.673539 -0.716506 N1 0 0.6981 -0.716 N2 0 0.811257 -0.58469 + txt003 +STRI + V0 0.502229 1.80456 0.522222 V1 0.950425 1.61822 0.522222 V2 0.889259 1.51407 0.384375 + N0 0.211045 0.782908 -0.585248 N1 0.406555 0.700957 -0.58598 N2 0.349647 0.602839 -0.717169 + txt003 +STRI + V0 0.889259 1.51407 0.384375 V1 0.469907 1.68843 0.384375 V2 0.502229 1.80456 0.522222 + N0 0.349647 0.602839 -0.717169 N1 0.181563 0.673539 -0.716506 N2 0.211045 0.782908 -0.585248 + txt003 +STRI + V0 0.950425 1.61822 0.522222 V1 1.32796 1.32796 0.522222 V2 1.2425 1.2425 0.384375 + N0 0.406555 0.700957 -0.58598 N1 0.572843 0.572843 -0.586261 N2 0.492597 0.492597 -0.717423 + txt003 +STRI + V0 1.2425 1.2425 0.384375 V1 0.889259 1.51407 0.384375 V2 0.950425 1.61822 0.522222 + N0 0.492597 0.492597 -0.717423 N1 0.349647 0.602839 -0.717169 N2 0.406555 0.700957 -0.58598 + txt003 +STRI + V0 1.32796 1.32796 0.522222 V1 1.61822 0.950425 0.522222 V2 1.51407 0.889259 0.384375 + N0 0.572843 0.572843 -0.586261 N1 0.700957 0.406555 -0.58598 N2 0.602839 0.349647 -0.717169 + txt003 +STRI + V0 1.51407 0.889259 0.384375 V1 1.2425 1.2425 0.384375 V2 1.32796 1.32796 0.522222 + N0 0.602839 0.349647 -0.717169 N1 0.492597 0.492597 -0.717423 N2 0.572843 0.572843 -0.586261 + txt003 +STRI + V0 1.61822 0.950425 0.522222 V1 1.80456 0.502229 0.522222 V2 1.68843 0.469907 0.384375 + N0 0.700957 0.406555 -0.58598 N1 0.782908 0.211045 -0.585248 N2 0.673539 0.181563 -0.716506 + txt003 +STRI + V0 1.68843 0.469907 0.384375 V1 1.51407 0.889259 0.384375 V2 1.61822 0.950425 0.522222 + N0 0.673539 0.181563 -0.716506 N1 0.602839 0.349647 -0.717169 N2 0.700957 0.406555 -0.58598 + txt003 +STRI + V0 1.80456 0.502229 0.522222 V1 1.87037 2.22045e-16 0.522222 V2 1.75 2.22045e-16 0.384375 + N0 0.782908 0.211045 -0.585248 N1 0.811257 -6.19755e-17 -0.58469 N2 0.6981 -8.11143e-17 -0.716 + txt003 +STRI + V0 1.75 2.22045e-16 0.384375 V1 1.68843 0.469907 0.384375 V2 1.80456 0.502229 0.522222 + N0 0.6981 -8.11143e-17 -0.716 N1 0.673539 0.181563 -0.716506 N2 0.782908 0.211045 -0.585248 + txt003 +STRI + V0 0 1.75 0.384375 V1 0.469907 1.68843 0.384375 V2 0.437586 1.57229 0.277778 + N0 0 0.6981 -0.716 N1 0.181563 0.673539 -0.716506 N2 0.165491 0.61392 -0.771826 + txt003 +STRI + V0 0.437586 1.57229 0.277778 V1 0 1.62963 0.277778 V2 0 1.75 0.384375 + N0 0.165491 0.61392 -0.771826 N1 0 0.636383 -0.771373 N2 0 0.6981 -0.716 + txt003 +STRI + V0 0.469907 1.68843 0.384375 V1 0.889259 1.51407 0.384375 V2 0.828093 1.40993 0.277778 + N0 0.181563 0.673539 -0.716506 N1 0.349647 0.602839 -0.717169 N2 0.318647 0.549392 -0.77242 + txt003 +STRI + V0 0.828093 1.40993 0.277778 V1 0.437586 1.57229 0.277778 V2 0.469907 1.68843 0.384375 + N0 0.318647 0.549392 -0.77242 N1 0.165491 0.61392 -0.771826 N2 0.181563 0.673539 -0.716506 + txt003 +STRI + V0 0.889259 1.51407 0.384375 V1 1.2425 1.2425 0.384375 V2 1.15704 1.15704 0.277778 + N0 0.349647 0.602839 -0.717169 N1 0.492597 0.492597 -0.717423 N2 0.448897 0.448897 -0.772647 + txt003 +STRI + V0 1.15704 1.15704 0.277778 V1 0.828093 1.40993 0.277778 V2 0.889259 1.51407 0.384375 + N0 0.448897 0.448897 -0.772647 N1 0.318647 0.549392 -0.77242 N2 0.349647 0.602839 -0.717169 + txt003 +STRI + V0 1.2425 1.2425 0.384375 V1 1.51407 0.889259 0.384375 V2 1.40993 0.828093 0.277778 + N0 0.492597 0.492597 -0.717423 N1 0.602839 0.349647 -0.717169 N2 0.549392 0.318647 -0.77242 + txt003 +STRI + V0 1.40993 0.828093 0.277778 V1 1.15704 1.15704 0.277778 V2 1.2425 1.2425 0.384375 + N0 0.549392 0.318647 -0.77242 N1 0.448897 0.448897 -0.772647 N2 0.492597 0.492597 -0.717423 + txt003 +STRI + V0 1.51407 0.889259 0.384375 V1 1.68843 0.469907 0.384375 V2 1.57229 0.437586 0.277778 + N0 0.602839 0.349647 -0.717169 N1 0.673539 0.181563 -0.716506 N2 0.61392 0.165491 -0.771826 + txt003 +STRI + V0 1.57229 0.437586 0.277778 V1 1.40993 0.828093 0.277778 V2 1.51407 0.889259 0.384375 + N0 0.61392 0.165491 -0.771826 N1 0.549392 0.318647 -0.77242 N2 0.602839 0.349647 -0.717169 + txt003 +STRI + V0 1.68843 0.469907 0.384375 V1 1.75 2.22045e-16 0.384375 V2 1.62963 0 0.277778 + N0 0.673539 0.181563 -0.716506 N1 0.6981 -8.11143e-17 -0.716 N2 0.636383 -1.97068e-16 -0.771373 + txt003 +STRI + V0 1.62963 0 0.277778 V1 1.57229 0.437586 0.277778 V2 1.68843 0.469907 0.384375 + N0 0.636383 -1.97068e-16 -0.771373 N1 0.61392 0.165491 -0.771826 N2 0.673539 0.181563 -0.716506 + txt003 +STRI + V0 0 1.62963 0.277778 V1 0.437586 1.57229 0.277778 V2 0.412723 1.48296 0.200347 + N0 0 0.636383 -0.771373 N1 0.165491 0.61392 -0.771826 N2 0.175561 0.651276 -0.738253 + txt003 +STRI + V0 0.412723 1.48296 0.200347 V1 0 1.53704 0.200347 V2 0 1.62963 0.277778 + N0 0.175561 0.651276 -0.738253 N1 0 0.675056 -0.737766 N2 0 0.636383 -0.771373 + txt003 +STRI + V0 0.437586 1.57229 0.277778 V1 0.828093 1.40993 0.277778 V2 0.781043 1.32982 0.200347 + N0 0.165491 0.61392 -0.771826 N1 0.318647 0.549392 -0.77242 N2 0.338069 0.582878 -0.738893 + txt003 +STRI + V0 0.781043 1.32982 0.200347 V1 0.412723 1.48296 0.200347 V2 0.437586 1.57229 0.277778 + N0 0.338069 0.582878 -0.738893 N1 0.175561 0.651276 -0.738253 N2 0.165491 0.61392 -0.771826 + txt003 +STRI + V0 0.828093 1.40993 0.277778 V1 1.15704 1.15704 0.277778 V2 1.0913 1.0913 0.200347 + N0 0.318647 0.549392 -0.77242 N1 0.448897 0.448897 -0.772647 N2 0.476275 0.476275 -0.739137 + txt003 +STRI + V0 1.0913 1.0913 0.200347 V1 0.781043 1.32982 0.200347 V2 0.828093 1.40993 0.277778 + N0 0.476275 0.476275 -0.739137 N1 0.338069 0.582878 -0.738893 N2 0.318647 0.549392 -0.77242 + txt003 +STRI + V0 1.15704 1.15704 0.277778 V1 1.40993 0.828093 0.277778 V2 1.32982 0.781043 0.200347 + N0 0.448897 0.448897 -0.772647 N1 0.549392 0.318647 -0.77242 N2 0.582878 0.338069 -0.738893 + txt003 +STRI + V0 1.32982 0.781043 0.200347 V1 1.0913 1.0913 0.200347 V2 1.15704 1.15704 0.277778 + N0 0.582878 0.338069 -0.738893 N1 0.476275 0.476275 -0.739137 N2 0.448897 0.448897 -0.772647 + txt003 +STRI + V0 1.40993 0.828093 0.277778 V1 1.57229 0.437586 0.277778 V2 1.48296 0.412723 0.200347 + N0 0.549392 0.318647 -0.77242 N1 0.61392 0.165491 -0.771826 N2 0.651276 0.175561 -0.738253 + txt003 +STRI + V0 1.48296 0.412723 0.200347 V1 1.32982 0.781043 0.200347 V2 1.40993 0.828093 0.277778 + N0 0.651276 0.175561 -0.738253 N1 0.582878 0.338069 -0.738893 N2 0.549392 0.318647 -0.77242 + txt003 +STRI + V0 1.57229 0.437586 0.277778 V1 1.62963 0 0.277778 V2 1.53704 0 0.200347 + N0 0.61392 0.165491 -0.771826 N1 0.636383 -1.97068e-16 -0.771373 N2 0.675056 -9.51605e-17 -0.737766 + txt003 +STRI + V0 1.53704 0 0.200347 V1 1.48296 0.412723 0.200347 V2 1.57229 0.437586 0.277778 + N0 0.675056 -9.51605e-17 -0.737766 N1 0.651276 0.175561 -0.738253 N2 0.61392 0.165491 -0.771826 + txt003 +STRI + V0 0 1.53704 0.200347 V1 0.412723 1.48296 0.200347 V2 0.402778 1.44722 0.15 + N0 0 0.675056 -0.737766 N1 0.175561 0.651276 -0.738253 N2 0.260275 0.965535 0 + txt003 +STRI + V0 0.402778 1.44722 0.15 V1 0 1.5 0.15 V2 0 1.53704 0.200347 + N0 0.260275 0.965535 0 N1 -0 1 0 N2 0 0.675056 -0.737766 + txt003 +STRI + V0 0.412723 1.48296 0.200347 V1 0.781043 1.32982 0.200347 V2 0.762222 1.29778 0.15 + N0 0.175561 0.651276 -0.738253 N1 0.338069 0.582878 -0.738893 N2 0.501718 0.865031 0 + txt003 +STRI + V0 0.762222 1.29778 0.15 V1 0.402778 1.44722 0.15 V2 0.412723 1.48296 0.200347 + N0 0.501718 0.865031 0 N1 0.260275 0.965535 0 N2 0.175561 0.651276 -0.738253 + txt003 +STRI + V0 0.781043 1.32982 0.200347 V1 1.0913 1.0913 0.200347 V2 1.065 1.065 0.15 + N0 0.338069 0.582878 -0.738893 N1 0.476275 0.476275 -0.739137 N2 0.707107 0.707107 0 + txt003 +STRI + V0 1.065 1.065 0.15 V1 0.762222 1.29778 0.15 V2 0.781043 1.32982 0.200347 + N0 0.707107 0.707107 0 N1 0.501718 0.865031 0 N2 0.338069 0.582878 -0.738893 + txt003 +STRI + V0 1.0913 1.0913 0.200347 V1 1.32982 0.781043 0.200347 V2 1.29778 0.762222 0.15 + N0 0.476275 0.476275 -0.739137 N1 0.582878 0.338069 -0.738893 N2 0.865031 0.501718 0 + txt003 +STRI + V0 1.29778 0.762222 0.15 V1 1.065 1.065 0.15 V2 1.0913 1.0913 0.200347 + N0 0.865031 0.501718 0 N1 0.707107 0.707107 0 N2 0.476275 0.476275 -0.739137 + txt003 +STRI + V0 1.32982 0.781043 0.200347 V1 1.48296 0.412723 0.200347 V2 1.44722 0.402778 0.15 + N0 0.582878 0.338069 -0.738893 N1 0.651276 0.175561 -0.738253 N2 0.965535 0.260275 0 + txt003 +STRI + V0 1.44722 0.402778 0.15 V1 1.29778 0.762222 0.15 V2 1.32982 0.781043 0.200347 + N0 0.965535 0.260275 0 N1 0.865031 0.501718 0 N2 0.582878 0.338069 -0.738893 + txt003 +STRI + V0 1.48296 0.412723 0.200347 V1 1.53704 0 0.200347 V2 1.5 0 0.15 + N0 0.651276 0.175561 -0.738253 N1 0.675056 -9.51605e-17 -0.737766 N2 1 0 0 + txt003 +STRI + V0 1.5 0 0.15 V1 1.44722 0.402778 0.15 V2 1.48296 0.412723 0.200347 + N0 1 0 0 N1 0.965535 0.260275 0 N2 0.651276 0.175561 -0.738253 + txt003 +STRI + V0 -1.6 0 2.025 V1 -1.59259 -0.125 2.04167 V2 -1.92704 -0.125 2.04055 + N0 -0 -0 -1 N1 -0 -0.298275 -0.95448 N2 0.0104256 -0.297446 -0.954682 + txt003 +STRI + V0 -1.92704 -0.125 2.04055 V1 -1.92454 0 2.02396 V2 -1.6 0 2.025 + N0 0.0104256 -0.297446 -0.954682 N1 0.0104645 0 -0.999945 N2 -0 -0 -1 + txt003 +STRI + V0 -1.59259 -0.125 2.04167 V1 -1.57407 -0.2 2.08333 V2 -1.9333 -0.2 2.08202 + N0 -0 -0.298275 -0.95448 N1 -0 -0.707107 -0.707107 N2 0.00846382 -0.706077 -0.708084 + txt003 +STRI + V0 -1.9333 -0.2 2.08202 V1 -1.92704 -0.125 2.04055 V2 -1.59259 -0.125 2.04167 + N0 0.00846382 -0.706077 -0.708084 N1 0.0104256 -0.297446 -0.954682 N2 -0 -0.298275 -0.95448 + txt003 +STRI + V0 -1.57407 -0.2 2.08333 V1 -1.55 -0.225 2.1375 V2 -1.94144 -0.225 2.13594 + N0 -0 -0.707107 -0.707107 N1 0 -1 0 N2 -1.61364e-18 -1 -2.43505e-19 + txt003 +STRI + V0 -1.94144 -0.225 2.13594 V1 -1.9333 -0.2 2.08202 V2 -1.57407 -0.2 2.08333 + N0 -1.61364e-18 -1 -2.43505e-19 N1 0.00846382 -0.706077 -0.708084 N2 -0 -0.707107 -0.707107 + txt003 +STRI + V0 -1.55 -0.225 2.1375 V1 -1.52593 -0.2 2.19167 V2 -1.94957 -0.2 2.18985 + N0 0 -1 0 N1 0 -0.707107 0.707107 N2 -0.00997559 -0.706181 0.707961 + txt003 +STRI + V0 -1.94957 -0.2 2.18985 V1 -1.94144 -0.225 2.13594 V2 -1.55 -0.225 2.1375 + N0 -0.00997559 -0.706181 0.707961 N1 -1.61364e-18 -1 -2.43505e-19 N2 0 -1 0 + txt003 +STRI + V0 -1.52593 -0.2 2.19167 V1 -1.50741 -0.125 2.23333 V2 -1.95583 -0.125 2.23133 + N0 0 -0.707107 0.707107 N1 0 -0.298275 0.95448 N2 -0.0140841 -0.297589 0.95459 + txt003 +STRI + V0 -1.95583 -0.125 2.23133 V1 -1.94957 -0.2 2.18985 V2 -1.52593 -0.2 2.19167 + N0 -0.0140841 -0.297589 0.95459 N1 -0.00997559 -0.706181 0.707961 N2 0 -0.707107 0.707107 + txt003 +STRI + V0 -1.50741 -0.125 2.23333 V1 -1.5 0 2.25 V2 -1.95833 0 2.24792 + N0 0 -0.298275 0.95448 N1 0 1.97373e-15 1 N2 -0.0149983 1.96426e-15 0.999888 + txt003 +STRI + V0 -1.95833 0 2.24792 V1 -1.95583 -0.125 2.23133 V2 -1.50741 -0.125 2.23333 + N0 -0.0149983 1.96426e-15 0.999888 N1 -0.0140841 -0.297589 0.95459 N2 0 -0.298275 0.95448 + txt003 +STRI + V0 -1.92454 0 2.02396 V1 -1.92704 -0.125 2.04055 V2 -2.20645 -0.125 2.03272 + N0 0.0104645 0 -0.999945 N1 0.0104256 -0.297446 -0.954682 N2 0.0510028 -0.296675 -0.953616 + txt003 +STRI + V0 -2.20645 -0.125 2.03272 V1 -2.1963 0 2.01667 V2 -1.92454 0 2.02396 + N0 0.0510028 -0.296675 -0.953616 N1 0.0510696 0 -0.998695 N2 0.0104645 0 -0.999945 + txt003 +STRI + V0 -1.92704 -0.125 2.04055 V1 -1.9333 -0.2 2.08202 V2 -2.23182 -0.2 2.07284 + N0 0.0104256 -0.297446 -0.954682 N1 0.00846382 -0.706077 -0.708084 N2 0.0415994 -0.706072 -0.706918 + txt003 +STRI + V0 -2.23182 -0.2 2.07284 V1 -2.20645 -0.125 2.03272 V2 -1.92704 -0.125 2.04055 + N0 0.0415994 -0.706072 -0.706918 N1 0.0510028 -0.296675 -0.953616 N2 0.0104256 -0.297446 -0.954682 + txt003 +STRI + V0 -1.9333 -0.2 2.08202 V1 -1.94144 -0.225 2.13594 V2 -2.26481 -0.225 2.125 + N0 0.00846382 -0.706077 -0.708084 N1 -1.61364e-18 -1 -2.43505e-19 N2 -7.69071e-18 -1 -4.86421e-18 + txt003 +STRI + V0 -2.26481 -0.225 2.125 V1 -2.23182 -0.2 2.07284 V2 -1.9333 -0.2 2.08202 + N0 -7.69071e-18 -1 -4.86421e-18 N1 0.0415994 -0.706072 -0.706918 N2 0.00846382 -0.706077 -0.708084 + txt003 +STRI + V0 -1.94144 -0.225 2.13594 V1 -1.94957 -0.2 2.18985 V2 -2.29781 -0.2 2.17716 + N0 -1.61364e-18 -1 -2.43505e-19 N1 -0.00997559 -0.706181 0.707961 N2 -0.0493858 -0.708239 0.704243 + txt003 +STRI + V0 -2.29781 -0.2 2.17716 V1 -2.26481 -0.225 2.125 V2 -1.94144 -0.225 2.13594 + N0 -0.0493858 -0.708239 0.704243 N1 -7.69071e-18 -1 -4.86421e-18 N2 -1.61364e-18 -1 -2.43505e-19 + txt003 +STRI + V0 -1.94957 -0.2 2.18985 V1 -1.95583 -0.125 2.23133 V2 -2.32318 -0.125 2.21728 + N0 -0.00997559 -0.706181 0.707961 N1 -0.0140841 -0.297589 0.95459 N2 -0.0701017 -0.299663 0.951466 + txt003 +STRI + V0 -2.32318 -0.125 2.21728 V1 -2.29781 -0.2 2.17716 V2 -1.94957 -0.2 2.18985 + N0 -0.0701017 -0.299663 0.951466 N1 -0.0493858 -0.708239 0.704243 N2 -0.00997559 -0.706181 0.707961 + txt003 +STRI + V0 -1.95583 -0.125 2.23133 V1 -1.95833 0 2.24792 V2 -2.33333 0 2.23333 + N0 -0.0140841 -0.297589 0.95459 N1 -0.0149983 1.96426e-15 0.999888 N2 -0.0747899 1.66682e-15 0.997199 + txt003 +STRI + V0 -2.33333 0 2.23333 V1 -2.32318 -0.125 2.21728 V2 -1.95583 -0.125 2.23133 + N0 -0.0747899 1.66682e-15 0.997199 N1 -0.0701017 -0.299663 0.951466 N2 -0.0140841 -0.297589 0.95459 + txt003 +STRI + V0 -2.1963 0 2.01667 V1 -2.20645 -0.125 2.03272 V2 -2.42824 -0.125 2.01146 + N0 0.0510696 0 -0.998695 N1 0.0510028 -0.296675 -0.953616 N2 0.148104 -0.301279 -0.941964 + txt003 +STRI + V0 -2.42824 -0.125 2.01146 V1 -2.4125 0 1.99687 V2 -2.1963 0 2.01667 + N0 0.148104 -0.301279 -0.941964 N1 0.14834 0 -0.988936 N2 0.0510696 0 -0.998695 + txt003 +STRI + V0 -2.20645 -0.125 2.03272 V1 -2.23182 -0.2 2.07284 V2 -2.46759 -0.2 2.04792 + N0 0.0510028 -0.296675 -0.953616 N1 0.0415994 -0.706072 -0.706918 N2 0.119688 -0.715388 -0.6884 + txt003 +STRI + V0 -2.46759 -0.2 2.04792 V1 -2.42824 -0.125 2.01146 V2 -2.20645 -0.125 2.03272 + N0 0.119688 -0.715388 -0.6884 N1 0.148104 -0.301279 -0.941964 N2 0.0510028 -0.296675 -0.953616 + txt003 +STRI + V0 -2.23182 -0.2 2.07284 V1 -2.26481 -0.225 2.125 V2 -2.51875 -0.225 2.09531 + N0 0.0415994 -0.706072 -0.706918 N1 -7.69071e-18 -1 -4.86421e-18 N2 -1.96915e-17 -1 -2.12543e-17 + txt003 +STRI + V0 -2.51875 -0.225 2.09531 V1 -2.46759 -0.2 2.04792 V2 -2.23182 -0.2 2.07284 + N0 -1.96915e-17 -1 -2.12543e-17 N1 0.119688 -0.715388 -0.6884 N2 0.0415994 -0.706072 -0.706918 + txt003 +STRI + V0 -2.26481 -0.225 2.125 V1 -2.29781 -0.2 2.17716 V2 -2.56991 -0.2 2.14271 + N0 -7.69071e-18 -1 -4.86421e-18 N1 -0.0493858 -0.708239 0.704243 N2 -0.141352 -0.724137 0.675015 + txt003 +STRI + V0 -2.56991 -0.2 2.14271 V1 -2.51875 -0.225 2.09531 V2 -2.26481 -0.225 2.125 + N0 -0.141352 -0.724137 0.675015 N1 -1.96915e-17 -1 -2.12543e-17 N2 -7.69071e-18 -1 -4.86421e-18 + txt003 +STRI + V0 -2.29781 -0.2 2.17716 V1 -2.32318 -0.125 2.21728 V2 -2.60926 -0.125 2.17917 + N0 -0.0493858 -0.708239 0.704243 N1 -0.0701017 -0.299663 0.951466 N2 -0.204668 -0.313917 0.927128 + txt003 +STRI + V0 -2.60926 -0.125 2.17917 V1 -2.56991 -0.2 2.14271 V2 -2.29781 -0.2 2.17716 + N0 -0.204668 -0.313917 0.927128 N1 -0.141352 -0.724137 0.675015 N2 -0.0493858 -0.708239 0.704243 + txt003 +STRI + V0 -2.32318 -0.125 2.21728 V1 -2.33333 0 2.23333 V2 -2.625 0 2.19375 + N0 -0.0701017 -0.299663 0.951466 N1 -0.0747899 1.66682e-15 0.997199 N2 -0.219512 1.81728e-15 0.97561 + txt003 +STRI + V0 -2.625 0 2.19375 V1 -2.60926 -0.125 2.17917 V2 -2.32318 -0.125 2.21728 + N0 -0.219512 1.81728e-15 0.97561 N1 -0.204668 -0.313917 0.927128 N2 -0.0701017 -0.299663 0.951466 + txt003 +STRI + V0 -2.4125 0 1.99687 V1 -2.42824 -0.125 2.01146 V2 -2.58985 -0.125 1.97006 + N0 0.14834 0 -0.988936 N1 0.148104 -0.301279 -0.941964 N2 0.359682 -0.323804 -0.875089 + txt003 +STRI + V0 -2.58985 -0.125 1.97006 V1 -2.57037 0 1.95833 V2 -2.4125 0 1.99687 + N0 0.359682 -0.323804 -0.875089 N1 0.364399 0 -0.931243 N2 0.14834 0 -0.988936 + txt003 +STRI + V0 -2.42824 -0.125 2.01146 V1 -2.46759 -0.2 2.04792 V2 -2.63855 -0.2 1.99938 + N0 0.148104 -0.301279 -0.941964 N1 0.119688 -0.715388 -0.6884 N2 0.275915 -0.747596 -0.604128 + txt003 +STRI + V0 -2.63855 -0.2 1.99938 V1 -2.58985 -0.125 1.97006 V2 -2.42824 -0.125 2.01146 + N0 0.275915 -0.747596 -0.604128 N1 0.359682 -0.323804 -0.875089 N2 0.148104 -0.301279 -0.941964 + txt003 +STRI + V0 -2.46759 -0.2 2.04792 V1 -2.51875 -0.225 2.09531 V2 -2.70185 -0.225 2.0375 + N0 0.119688 -0.715388 -0.6884 N1 -1.96915e-17 -1 -2.12543e-17 N2 -3.40413e-17 -1 -5.65364e-17 + txt003 +STRI + V0 -2.70185 -0.225 2.0375 V1 -2.63855 -0.2 1.99938 V2 -2.46759 -0.2 2.04792 + N0 -3.40413e-17 -1 -5.65364e-17 N1 0.275915 -0.747596 -0.604128 N2 0.119688 -0.715388 -0.6884 + txt003 +STRI + V0 -2.51875 -0.225 2.09531 V1 -2.56991 -0.2 2.14271 V2 -2.76516 -0.2 2.07562 + N0 -1.96915e-17 -1 -2.12543e-17 N1 -0.141352 -0.724137 0.675015 N2 -0.313659 -0.763673 0.564289 + txt003 +STRI + V0 -2.76516 -0.2 2.07562 V1 -2.70185 -0.225 2.0375 V2 -2.51875 -0.225 2.09531 + N0 -0.313659 -0.763673 0.564289 N1 -3.40413e-17 -1 -5.65364e-17 N2 -1.96915e-17 -1 -2.12543e-17 + txt003 +STRI + V0 -2.56991 -0.2 2.14271 V1 -2.60926 -0.125 2.17917 V2 -2.81385 -0.125 2.10494 + N0 -0.141352 -0.724137 0.675015 N1 -0.204668 -0.313917 0.927128 N2 -0.474611 -0.350859 0.807244 + txt003 +STRI + V0 -2.81385 -0.125 2.10494 V1 -2.76516 -0.2 2.07562 V2 -2.56991 -0.2 2.14271 + N0 -0.474611 -0.350859 0.807244 N1 -0.313659 -0.763673 0.564289 N2 -0.141352 -0.724137 0.675015 + txt003 +STRI + V0 -2.60926 -0.125 2.17917 V1 -2.625 0 2.19375 V2 -2.83333 0 2.11667 + N0 -0.204668 -0.313917 0.927128 N1 -0.219512 1.81728e-15 0.97561 N2 -0.514496 1.6713e-15 0.857493 + txt003 +STRI + V0 -2.83333 0 2.11667 V1 -2.81385 -0.125 2.10494 V2 -2.60926 -0.125 2.17917 + N0 -0.514496 1.6713e-15 0.857493 N1 -0.474611 -0.350859 0.807244 N2 -0.204668 -0.313917 0.927128 + txt003 +STRI + V0 -2.57037 0 1.95833 V1 -2.58985 -0.125 1.97006 V2 -2.6887 -0.125 1.90181 + N0 0.364399 0 -0.931243 N1 0.359682 -0.323804 -0.875089 N2 0.727532 -0.37029 -0.577566 + txt003 +STRI + V0 -2.6887 -0.125 1.90181 V1 -2.66713 0 1.89479 V2 -2.57037 0 1.95833 + N0 0.727532 -0.37029 -0.577566 N1 0.767382 0 -0.64119 N2 0.364399 0 -0.931243 + txt003 +STRI + V0 -2.58985 -0.125 1.97006 V1 -2.63855 -0.2 1.99938 V2 -2.74263 -0.2 1.91937 + N0 0.359682 -0.323804 -0.875089 N1 0.275915 -0.747596 -0.604128 N2 0.497152 -0.792374 -0.35353 + txt003 +STRI + V0 -2.74263 -0.2 1.91937 V1 -2.6887 -0.125 1.90181 V2 -2.58985 -0.125 1.97006 + N0 0.497152 -0.792374 -0.35353 N1 0.727532 -0.37029 -0.577566 N2 0.359682 -0.323804 -0.875089 + txt003 +STRI + V0 -2.63855 -0.2 1.99938 V1 -2.70185 -0.225 2.0375 V2 -2.81273 -0.225 1.94219 + N0 0.275915 -0.747596 -0.604128 N1 -3.40413e-17 -1 -5.65364e-17 N2 -3.3285e-17 -1 -1.02253e-16 + txt003 +STRI + V0 -2.81273 -0.225 1.94219 V1 -2.74263 -0.2 1.91937 V2 -2.63855 -0.2 1.99938 + N0 -3.3285e-17 -1 -1.02253e-16 N1 0.497152 -0.792374 -0.35353 N2 0.275915 -0.747596 -0.604128 + txt003 +STRI + V0 -2.70185 -0.225 2.0375 V1 -2.76516 -0.2 2.07562 V2 -2.88284 -0.2 1.96501 + N0 -3.40413e-17 -1 -5.65364e-17 N1 -0.313659 -0.763673 0.564289 N2 -0.519903 -0.799556 0.300684 + txt003 +STRI + V0 -2.88284 -0.2 1.96501 V1 -2.81273 -0.225 1.94219 V2 -2.70185 -0.225 2.0375 + N0 -0.519903 -0.799556 0.300684 N1 -3.3285e-17 -1 -1.02253e-16 N2 -3.40413e-17 -1 -5.65364e-17 + txt003 +STRI + V0 -2.76516 -0.2 2.07562 V1 -2.81385 -0.125 2.10494 V2 -2.93676 -0.125 1.98256 + N0 -0.313659 -0.763673 0.564289 N1 -0.474611 -0.350859 0.807244 N2 -0.810111 -0.385772 0.441476 + txt003 +STRI + V0 -2.93676 -0.125 1.98256 V1 -2.88284 -0.2 1.96501 V2 -2.76516 -0.2 2.07562 + N0 -0.810111 -0.385772 0.441476 N1 -0.519903 -0.799556 0.300684 N2 -0.313659 -0.763673 0.564289 + txt003 +STRI + V0 -2.81385 -0.125 2.10494 V1 -2.83333 0 2.11667 V2 -2.95833 0 1.98958 + N0 -0.474611 -0.350859 0.807244 N1 -0.514496 1.6713e-15 0.857493 N2 -0.882353 9.28814e-16 0.470588 + txt003 +STRI + V0 -2.95833 0 1.98958 V1 -2.93676 -0.125 1.98256 V2 -2.81385 -0.125 2.10494 + N0 -0.882353 9.28814e-16 0.470588 N1 -0.810111 -0.385772 0.441476 N2 -0.474611 -0.350859 0.807244 + txt003 +STRI + V0 -2.66713 0 1.89479 V1 -2.6887 -0.125 1.90181 V2 -2.72222 -0.125 1.8 + N0 0.767382 0 -0.64119 N1 0.727532 -0.37029 -0.577566 N2 0.923077 -0.384615 2.05733e-15 + txt003 +STRI + V0 -2.72222 -0.125 1.8 V1 -2.7 0 1.8 V2 -2.66713 0 1.89479 + N0 0.923077 -0.384615 2.05733e-15 N1 1 0 2.63164e-15 N2 0.767382 0 -0.64119 + txt003 +STRI + V0 -2.6887 -0.125 1.90181 V1 -2.74263 -0.2 1.91937 V2 -2.77778 -0.2 1.8 + N0 0.727532 -0.37029 -0.577566 N1 0.497152 -0.792374 -0.35353 N2 0.6 -0.8 8.24322e-16 + txt003 +STRI + V0 -2.77778 -0.2 1.8 V1 -2.72222 -0.125 1.8 V2 -2.6887 -0.125 1.90181 + N0 0.6 -0.8 8.24322e-16 N1 0.923077 -0.384615 2.05733e-15 N2 0.727532 -0.37029 -0.577566 + txt003 +STRI + V0 -2.74263 -0.2 1.91937 V1 -2.81273 -0.225 1.94219 V2 -2.85 -0.225 1.8 + N0 0.497152 -0.792374 -0.35353 N1 -3.3285e-17 -1 -1.02253e-16 N2 -1.21738e-31 -1 -1.23358e-16 + txt003 +STRI + V0 -2.85 -0.225 1.8 V1 -2.77778 -0.2 1.8 V2 -2.74263 -0.2 1.91937 + N0 -1.21738e-31 -1 -1.23358e-16 N1 0.6 -0.8 8.24322e-16 N2 0.497152 -0.792374 -0.35353 + txt003 +STRI + V0 -2.81273 -0.225 1.94219 V1 -2.88284 -0.2 1.96501 V2 -2.92222 -0.2 1.8 + N0 -3.3285e-17 -1 -1.02253e-16 N1 -0.519903 -0.799556 0.300684 N2 -0.6 -0.8 -3.10757e-16 + txt003 +STRI + V0 -2.92222 -0.2 1.8 V1 -2.85 -0.225 1.8 V2 -2.81273 -0.225 1.94219 + N0 -0.6 -0.8 -3.10757e-16 N1 -1.21738e-31 -1 -1.23358e-16 N2 -3.3285e-17 -1 -1.02253e-16 + txt003 +STRI + V0 -2.88284 -0.2 1.96501 V1 -2.93676 -0.125 1.98256 V2 -2.97778 -0.125 1.8 + N0 -0.519903 -0.799556 0.300684 N1 -0.810111 -0.385772 0.441476 N2 -0.923077 -0.384615 -1.1396e-16 + txt003 +STRI + V0 -2.97778 -0.125 1.8 V1 -2.92222 -0.2 1.8 V2 -2.88284 -0.2 1.96501 + N0 -0.923077 -0.384615 -1.1396e-16 N1 -0.6 -0.8 -3.10757e-16 N2 -0.519903 -0.799556 0.300684 + txt003 +STRI + V0 -2.93676 -0.125 1.98256 V1 -2.95833 0 1.98958 V2 -3 0 1.8 + N0 -0.810111 -0.385772 0.441476 N1 -0.882353 9.28814e-16 0.470588 N2 -1 -4.93432e-16 -0 + txt003 +STRI + V0 -3 0 1.8 V1 -2.97778 -0.125 1.8 V2 -2.93676 -0.125 1.98256 + N0 -1 -4.93432e-16 -0 N1 -0.923077 -0.384615 -1.1396e-16 N2 -0.810111 -0.385772 0.441476 + txt003 +STRI + V0 -1.5 0 2.25 V1 -1.50741 0.125 2.23333 V2 -1.95583 0.125 2.23133 + N0 0 -0 1 N1 0 0.298275 0.95448 N2 -0.0140841 0.297589 0.95459 + txt003 +STRI + V0 -1.95583 0.125 2.23133 V1 -1.95833 0 2.24792 V2 -1.5 0 2.25 + N0 -0.0140841 0.297589 0.95459 N1 -0.0149983 0 0.999888 N2 0 -0 1 + txt003 +STRI + V0 -1.50741 0.125 2.23333 V1 -1.52593 0.2 2.19167 V2 -1.94957 0.2 2.18985 + N0 0 0.298275 0.95448 N1 0 0.707107 0.707107 N2 -0.00997559 0.706181 0.707961 + txt003 +STRI + V0 -1.94957 0.2 2.18985 V1 -1.95583 0.125 2.23133 V2 -1.50741 0.125 2.23333 + N0 -0.00997559 0.706181 0.707961 N1 -0.0140841 0.297589 0.95459 N2 0 0.298275 0.95448 + txt003 +STRI + V0 -1.52593 0.2 2.19167 V1 -1.55 0.225 2.1375 V2 -1.94144 0.225 2.13594 + N0 0 0.707107 0.707107 N1 0 1 0 N2 -1.61364e-18 1 -2.43505e-19 + txt003 +STRI + V0 -1.94144 0.225 2.13594 V1 -1.94957 0.2 2.18985 V2 -1.52593 0.2 2.19167 + N0 -1.61364e-18 1 -2.43505e-19 N1 -0.00997559 0.706181 0.707961 N2 0 0.707107 0.707107 + txt003 +STRI + V0 -1.55 0.225 2.1375 V1 -1.57407 0.2 2.08333 V2 -1.9333 0.2 2.08202 + N0 0 1 0 N1 0 0.707107 -0.707107 N2 0.00846382 0.706077 -0.708084 + txt003 +STRI + V0 -1.9333 0.2 2.08202 V1 -1.94144 0.225 2.13594 V2 -1.55 0.225 2.1375 + N0 0.00846382 0.706077 -0.708084 N1 -1.61364e-18 1 -2.43505e-19 N2 0 1 0 + txt003 +STRI + V0 -1.57407 0.2 2.08333 V1 -1.59259 0.125 2.04167 V2 -1.92704 0.125 2.04055 + N0 0 0.707107 -0.707107 N1 0 0.298275 -0.95448 N2 0.0104256 0.297446 -0.954682 + txt003 +STRI + V0 -1.92704 0.125 2.04055 V1 -1.9333 0.2 2.08202 V2 -1.57407 0.2 2.08333 + N0 0.0104256 0.297446 -0.954682 N1 0.00846382 0.706077 -0.708084 N2 0 0.707107 -0.707107 + txt003 +STRI + V0 -1.59259 0.125 2.04167 V1 -1.6 0 2.025 V2 -1.92454 0 2.02396 + N0 0 0.298275 -0.95448 N1 -0 -4.93432e-16 -1 N2 0.0104645 -4.86951e-16 -0.999945 + txt003 +STRI + V0 -1.92454 0 2.02396 V1 -1.92704 0.125 2.04055 V2 -1.59259 0.125 2.04167 + N0 0.0104645 -4.86951e-16 -0.999945 N1 0.0104256 0.297446 -0.954682 N2 0 0.298275 -0.95448 + txt003 +STRI + V0 -1.95833 0 2.24792 V1 -1.95583 0.125 2.23133 V2 -2.32318 0.125 2.21728 + N0 -0.0149983 0 0.999888 N1 -0.0140841 0.297589 0.95459 N2 -0.0701017 0.299663 0.951466 + txt003 +STRI + V0 -2.32318 0.125 2.21728 V1 -2.33333 0 2.23333 V2 -1.95833 0 2.24792 + N0 -0.0701017 0.299663 0.951466 N1 -0.0747899 0 0.997199 N2 -0.0149983 0 0.999888 + txt003 +STRI + V0 -1.95583 0.125 2.23133 V1 -1.94957 0.2 2.18985 V2 -2.29781 0.2 2.17716 + N0 -0.0140841 0.297589 0.95459 N1 -0.00997559 0.706181 0.707961 N2 -0.0493858 0.708239 0.704243 + txt003 +STRI + V0 -2.29781 0.2 2.17716 V1 -2.32318 0.125 2.21728 V2 -1.95583 0.125 2.23133 + N0 -0.0493858 0.708239 0.704243 N1 -0.0701017 0.299663 0.951466 N2 -0.0140841 0.297589 0.95459 + txt003 +STRI + V0 -1.94957 0.2 2.18985 V1 -1.94144 0.225 2.13594 V2 -2.26481 0.225 2.125 + N0 -0.00997559 0.706181 0.707961 N1 -1.61364e-18 1 -2.43505e-19 N2 -7.69071e-18 1 -4.86421e-18 + txt003 +STRI + V0 -2.26481 0.225 2.125 V1 -2.29781 0.2 2.17716 V2 -1.94957 0.2 2.18985 + N0 -7.69071e-18 1 -4.86421e-18 N1 -0.0493858 0.708239 0.704243 N2 -0.00997559 0.706181 0.707961 + txt003 +STRI + V0 -1.94144 0.225 2.13594 V1 -1.9333 0.2 2.08202 V2 -2.23182 0.2 2.07284 + N0 -1.61364e-18 1 -2.43505e-19 N1 0.00846382 0.706077 -0.708084 N2 0.0415994 0.706072 -0.706918 + txt003 +STRI + V0 -2.23182 0.2 2.07284 V1 -2.26481 0.225 2.125 V2 -1.94144 0.225 2.13594 + N0 0.0415994 0.706072 -0.706918 N1 -7.69071e-18 1 -4.86421e-18 N2 -1.61364e-18 1 -2.43505e-19 + txt003 +STRI + V0 -1.9333 0.2 2.08202 V1 -1.92704 0.125 2.04055 V2 -2.20645 0.125 2.03272 + N0 0.00846382 0.706077 -0.708084 N1 0.0104256 0.297446 -0.954682 N2 0.0510028 0.296675 -0.953616 + txt003 +STRI + V0 -2.20645 0.125 2.03272 V1 -2.23182 0.2 2.07284 V2 -1.9333 0.2 2.08202 + N0 0.0510028 0.296675 -0.953616 N1 0.0415994 0.706072 -0.706918 N2 0.00846382 0.706077 -0.708084 + txt003 +STRI + V0 -1.92704 0.125 2.04055 V1 -1.92454 0 2.02396 V2 -2.1963 0 2.01667 + N0 0.0104256 0.297446 -0.954682 N1 0.0104645 -4.86951e-16 -0.999945 N2 0.0510696 -2.08595e-16 -0.998695 + txt003 +STRI + V0 -2.1963 0 2.01667 V1 -2.20645 0.125 2.03272 V2 -1.92704 0.125 2.04055 + N0 0.0510696 -2.08595e-16 -0.998695 N1 0.0510028 0.296675 -0.953616 N2 0.0104256 0.297446 -0.954682 + txt003 +STRI + V0 -2.33333 0 2.23333 V1 -2.32318 0.125 2.21728 V2 -2.60926 0.125 2.17917 + N0 -0.0747899 0 0.997199 N1 -0.0701017 0.299663 0.951466 N2 -0.204668 0.313917 0.927128 + txt003 +STRI + V0 -2.60926 0.125 2.17917 V1 -2.625 0 2.19375 V2 -2.33333 0 2.23333 + N0 -0.204668 0.313917 0.927128 N1 -0.219512 0 0.97561 N2 -0.0747899 0 0.997199 + txt003 +STRI + V0 -2.32318 0.125 2.21728 V1 -2.29781 0.2 2.17716 V2 -2.56991 0.2 2.14271 + N0 -0.0701017 0.299663 0.951466 N1 -0.0493858 0.708239 0.704243 N2 -0.141352 0.724137 0.675015 + txt003 +STRI + V0 -2.56991 0.2 2.14271 V1 -2.60926 0.125 2.17917 V2 -2.32318 0.125 2.21728 + N0 -0.141352 0.724137 0.675015 N1 -0.204668 0.313917 0.927128 N2 -0.0701017 0.299663 0.951466 + txt003 +STRI + V0 -2.29781 0.2 2.17716 V1 -2.26481 0.225 2.125 V2 -2.51875 0.225 2.09531 + N0 -0.0493858 0.708239 0.704243 N1 -7.69071e-18 1 -4.86421e-18 N2 -1.96915e-17 1 -2.12543e-17 + txt003 +STRI + V0 -2.51875 0.225 2.09531 V1 -2.56991 0.2 2.14271 V2 -2.29781 0.2 2.17716 + N0 -1.96915e-17 1 -2.12543e-17 N1 -0.141352 0.724137 0.675015 N2 -0.0493858 0.708239 0.704243 + txt003 +STRI + V0 -2.26481 0.225 2.125 V1 -2.23182 0.2 2.07284 V2 -2.46759 0.2 2.04792 + N0 -7.69071e-18 1 -4.86421e-18 N1 0.0415994 0.706072 -0.706918 N2 0.119688 0.715388 -0.6884 + txt003 +STRI + V0 -2.46759 0.2 2.04792 V1 -2.51875 0.225 2.09531 V2 -2.26481 0.225 2.125 + N0 0.119688 0.715388 -0.6884 N1 -1.96915e-17 1 -2.12543e-17 N2 -7.69071e-18 1 -4.86421e-18 + txt003 +STRI + V0 -2.23182 0.2 2.07284 V1 -2.20645 0.125 2.03272 V2 -2.42824 0.125 2.01146 + N0 0.0415994 0.706072 -0.706918 N1 0.0510028 0.296675 -0.953616 N2 0.148104 0.301279 -0.941964 + txt003 +STRI + V0 -2.42824 0.125 2.01146 V1 -2.46759 0.2 2.04792 V2 -2.23182 0.2 2.07284 + N0 0.148104 0.301279 -0.941964 N1 0.119688 0.715388 -0.6884 N2 0.0415994 0.706072 -0.706918 + txt003 +STRI + V0 -2.20645 0.125 2.03272 V1 -2.1963 0 2.01667 V2 -2.4125 0 1.99687 + N0 0.0510028 0.296675 -0.953616 N1 0.0510696 -2.08595e-16 -0.998695 N2 0.14834 -4.14777e-16 -0.988936 + txt003 +STRI + V0 -2.4125 0 1.99687 V1 -2.42824 0.125 2.01146 V2 -2.20645 0.125 2.03272 + N0 0.14834 -4.14777e-16 -0.988936 N1 0.148104 0.301279 -0.941964 N2 0.0510028 0.296675 -0.953616 + txt003 +STRI + V0 -2.625 0 2.19375 V1 -2.60926 0.125 2.17917 V2 -2.81385 0.125 2.10494 + N0 -0.219512 0 0.97561 N1 -0.204668 0.313917 0.927128 N2 -0.474611 0.350859 0.807244 + txt003 +STRI + V0 -2.81385 0.125 2.10494 V1 -2.83333 0 2.11667 V2 -2.625 0 2.19375 + N0 -0.474611 0.350859 0.807244 N1 -0.514496 0 0.857493 N2 -0.219512 0 0.97561 + txt003 +STRI + V0 -2.60926 0.125 2.17917 V1 -2.56991 0.2 2.14271 V2 -2.76516 0.2 2.07562 + N0 -0.204668 0.313917 0.927128 N1 -0.141352 0.724137 0.675015 N2 -0.313659 0.763673 0.564289 + txt003 +STRI + V0 -2.76516 0.2 2.07562 V1 -2.81385 0.125 2.10494 V2 -2.60926 0.125 2.17917 + N0 -0.313659 0.763673 0.564289 N1 -0.474611 0.350859 0.807244 N2 -0.204668 0.313917 0.927128 + txt003 +STRI + V0 -2.56991 0.2 2.14271 V1 -2.51875 0.225 2.09531 V2 -2.70185 0.225 2.0375 + N0 -0.141352 0.724137 0.675015 N1 -1.96915e-17 1 -2.12543e-17 N2 -3.40413e-17 1 -5.65364e-17 + txt003 +STRI + V0 -2.70185 0.225 2.0375 V1 -2.76516 0.2 2.07562 V2 -2.56991 0.2 2.14271 + N0 -3.40413e-17 1 -5.65364e-17 N1 -0.313659 0.763673 0.564289 N2 -0.141352 0.724137 0.675015 + txt003 +STRI + V0 -2.51875 0.225 2.09531 V1 -2.46759 0.2 2.04792 V2 -2.63855 0.2 1.99938 + N0 -1.96915e-17 1 -2.12543e-17 N1 0.119688 0.715388 -0.6884 N2 0.275915 0.747596 -0.604128 + txt003 +STRI + V0 -2.63855 0.2 1.99938 V1 -2.70185 0.225 2.0375 V2 -2.51875 0.225 2.09531 + N0 0.275915 0.747596 -0.604128 N1 -3.40413e-17 1 -5.65364e-17 N2 -1.96915e-17 1 -2.12543e-17 + txt003 +STRI + V0 -2.46759 0.2 2.04792 V1 -2.42824 0.125 2.01146 V2 -2.58985 0.125 1.97006 + N0 0.119688 0.715388 -0.6884 N1 0.148104 0.301279 -0.941964 N2 0.359682 0.323804 -0.875089 + txt003 +STRI + V0 -2.58985 0.125 1.97006 V1 -2.63855 0.2 1.99938 V2 -2.46759 0.2 2.04792 + N0 0.359682 0.323804 -0.875089 N1 0.275915 0.747596 -0.604128 N2 0.119688 0.715388 -0.6884 + txt003 +STRI + V0 -2.42824 0.125 2.01146 V1 -2.4125 0 1.99687 V2 -2.57037 0 1.95833 + N0 0.148104 0.301279 -0.941964 N1 0.14834 -4.14777e-16 -0.988936 N2 0.364399 -4.84479e-16 -0.931243 + txt003 +STRI + V0 -2.57037 0 1.95833 V1 -2.58985 0.125 1.97006 V2 -2.42824 0.125 2.01146 + N0 0.364399 -4.84479e-16 -0.931243 N1 0.359682 0.323804 -0.875089 N2 0.148104 0.301279 -0.941964 + txt003 +STRI + V0 -2.83333 0 2.11667 V1 -2.81385 0.125 2.10494 V2 -2.93676 0.125 1.98256 + N0 -0.514496 0 0.857493 N1 -0.474611 0.350859 0.807244 N2 -0.810111 0.385772 0.441476 + txt003 +STRI + V0 -2.93676 0.125 1.98256 V1 -2.95833 0 1.98958 V2 -2.83333 0 2.11667 + N0 -0.810111 0.385772 0.441476 N1 -0.882353 0 0.470588 N2 -0.514496 0 0.857493 + txt003 +STRI + V0 -2.81385 0.125 2.10494 V1 -2.76516 0.2 2.07562 V2 -2.88284 0.2 1.96501 + N0 -0.474611 0.350859 0.807244 N1 -0.313659 0.763673 0.564289 N2 -0.519903 0.799556 0.300684 + txt003 +STRI + V0 -2.88284 0.2 1.96501 V1 -2.93676 0.125 1.98256 V2 -2.81385 0.125 2.10494 + N0 -0.519903 0.799556 0.300684 N1 -0.810111 0.385772 0.441476 N2 -0.474611 0.350859 0.807244 + txt003 +STRI + V0 -2.76516 0.2 2.07562 V1 -2.70185 0.225 2.0375 V2 -2.81273 0.225 1.94219 + N0 -0.313659 0.763673 0.564289 N1 -3.40413e-17 1 -5.65364e-17 N2 -3.3285e-17 1 -1.02253e-16 + txt003 +STRI + V0 -2.81273 0.225 1.94219 V1 -2.88284 0.2 1.96501 V2 -2.76516 0.2 2.07562 + N0 -3.3285e-17 1 -1.02253e-16 N1 -0.519903 0.799556 0.300684 N2 -0.313659 0.763673 0.564289 + txt003 +STRI + V0 -2.70185 0.225 2.0375 V1 -2.63855 0.2 1.99938 V2 -2.74263 0.2 1.91937 + N0 -3.40413e-17 1 -5.65364e-17 N1 0.275915 0.747596 -0.604128 N2 0.497152 0.792374 -0.35353 + txt003 +STRI + V0 -2.74263 0.2 1.91937 V1 -2.81273 0.225 1.94219 V2 -2.70185 0.225 2.0375 + N0 0.497152 0.792374 -0.35353 N1 -3.3285e-17 1 -1.02253e-16 N2 -3.40413e-17 1 -5.65364e-17 + txt003 +STRI + V0 -2.63855 0.2 1.99938 V1 -2.58985 0.125 1.97006 V2 -2.6887 0.125 1.90181 + N0 0.275915 0.747596 -0.604128 N1 0.359682 0.323804 -0.875089 N2 0.727532 0.37029 -0.577566 + txt003 +STRI + V0 -2.6887 0.125 1.90181 V1 -2.74263 0.2 1.91937 V2 -2.63855 0.2 1.99938 + N0 0.727532 0.37029 -0.577566 N1 0.497152 0.792374 -0.35353 N2 0.275915 0.747596 -0.604128 + txt003 +STRI + V0 -2.58985 0.125 1.97006 V1 -2.57037 0 1.95833 V2 -2.66713 0 1.89479 + N0 0.359682 0.323804 -0.875089 N1 0.364399 -4.84479e-16 -0.931243 N2 0.767382 -3.16384e-16 -0.64119 + txt003 +STRI + V0 -2.66713 0 1.89479 V1 -2.6887 0.125 1.90181 V2 -2.58985 0.125 1.97006 + N0 0.767382 -3.16384e-16 -0.64119 N1 0.727532 0.37029 -0.577566 N2 0.359682 0.323804 -0.875089 + txt003 +STRI + V0 -2.95833 0 1.98958 V1 -2.93676 0.125 1.98256 V2 -2.97778 0.125 1.8 + N0 -0.882353 0 0.470588 N1 -0.810111 0.385772 0.441476 N2 -0.923077 0.384615 -1.1396e-16 + txt003 +STRI + V0 -2.97778 0.125 1.8 V1 -3 0 1.8 V2 -2.95833 0 1.98958 + N0 -0.923077 0.384615 -1.1396e-16 N1 -1 0 0 N2 -0.882353 0 0.470588 + txt003 +STRI + V0 -2.93676 0.125 1.98256 V1 -2.88284 0.2 1.96501 V2 -2.92222 0.2 1.8 + N0 -0.810111 0.385772 0.441476 N1 -0.519903 0.799556 0.300684 N2 -0.6 0.8 -3.10757e-16 + txt003 +STRI + V0 -2.92222 0.2 1.8 V1 -2.97778 0.125 1.8 V2 -2.93676 0.125 1.98256 + N0 -0.6 0.8 -3.10757e-16 N1 -0.923077 0.384615 -1.1396e-16 N2 -0.810111 0.385772 0.441476 + txt003 +STRI + V0 -2.88284 0.2 1.96501 V1 -2.81273 0.225 1.94219 V2 -2.85 0.225 1.8 + N0 -0.519903 0.799556 0.300684 N1 -3.3285e-17 1 -1.02253e-16 N2 -2.13041e-31 1 -1.23358e-16 + txt003 +STRI + V0 -2.85 0.225 1.8 V1 -2.92222 0.2 1.8 V2 -2.88284 0.2 1.96501 + N0 -2.13041e-31 1 -1.23358e-16 N1 -0.6 0.8 -3.10757e-16 N2 -0.519903 0.799556 0.300684 + txt003 +STRI + V0 -2.81273 0.225 1.94219 V1 -2.74263 0.2 1.91937 V2 -2.77778 0.2 1.8 + N0 -3.3285e-17 1 -1.02253e-16 N1 0.497152 0.792374 -0.35353 N2 0.6 0.8 8.24322e-16 + txt003 +STRI + V0 -2.77778 0.2 1.8 V1 -2.85 0.225 1.8 V2 -2.81273 0.225 1.94219 + N0 0.6 0.8 8.24322e-16 N1 -2.13041e-31 1 -1.23358e-16 N2 -3.3285e-17 1 -1.02253e-16 + txt003 +STRI + V0 -2.74263 0.2 1.91937 V1 -2.6887 0.125 1.90181 V2 -2.72222 0.125 1.8 + N0 0.497152 0.792374 -0.35353 N1 0.727532 0.37029 -0.577566 N2 0.923077 0.384615 2.05733e-15 + txt003 +STRI + V0 -2.72222 0.125 1.8 V1 -2.77778 0.2 1.8 V2 -2.74263 0.2 1.91937 + N0 0.923077 0.384615 2.05733e-15 N1 0.6 0.8 8.24322e-16 N2 0.497152 0.792374 -0.35353 + txt003 +STRI + V0 -2.6887 0.125 1.90181 V1 -2.66713 0 1.89479 V2 -2.7 0 1.8 + N0 0.727532 0.37029 -0.577566 N1 0.767382 -3.16384e-16 -0.64119 N2 1 4.93432e-16 2.63164e-15 + txt003 +STRI + V0 -2.7 0 1.8 V1 -2.72222 0.125 1.8 V2 -2.6887 0.125 1.90181 + N0 1 4.93432e-16 2.63164e-15 N1 0.923077 0.384615 2.05733e-15 N2 0.727532 0.37029 -0.577566 + txt003 +STRI + V0 -2.7 0 1.8 V1 -2.72222 -0.125 1.8 V2 -2.70418 -0.125 1.66398 + N0 1 0 0 N1 0.923077 -0.384615 0 N2 0.895972 -0.38623 0.219226 + txt003 +STRI + V0 -2.70418 -0.125 1.66398 V1 -2.68287 0 1.67083 V2 -2.7 0 1.8 + N0 0.895972 -0.38623 0.219226 N1 0.972045 0 0.234794 N2 1 0 0 + txt003 +STRI + V0 -2.72222 -0.125 1.8 V1 -2.77778 -0.2 1.8 V2 -2.75747 -0.2 1.64684 + N0 0.923077 -0.384615 0 N1 0.6 -0.8 0 N2 0.57987 -0.801541 0.145888 + txt003 +STRI + V0 -2.75747 -0.2 1.64684 V1 -2.70418 -0.125 1.66398 V2 -2.72222 -0.125 1.8 + N0 0.57987 -0.801541 0.145888 N1 0.895972 -0.38623 0.219226 N2 0.923077 -0.384615 0 + txt003 +STRI + V0 -2.77778 -0.2 1.8 V1 -2.85 -0.225 1.8 V2 -2.82674 -0.225 1.62457 + N0 0.6 -0.8 0 N1 -0 -1 -0 N2 9.48478e-19 -1 -2.94924e-18 + txt003 +STRI + V0 -2.82674 -0.225 1.62457 V1 -2.75747 -0.2 1.64684 V2 -2.77778 -0.2 1.8 + N0 9.48478e-19 -1 -2.94924e-18 N1 0.57987 -0.801541 0.145888 N2 0.6 -0.8 0 + txt003 +STRI + V0 -2.85 -0.225 1.8 V1 -2.92222 -0.2 1.8 V2 -2.896 -0.2 1.60229 + N0 -0 -1 -0 N1 -0.6 -0.8 -0 N2 -0.577707 -0.801752 -0.153129 + txt003 +STRI + V0 -2.896 -0.2 1.60229 V1 -2.82674 -0.225 1.62457 V2 -2.85 -0.225 1.8 + N0 -0.577707 -0.801752 -0.153129 N1 9.48478e-19 -1 -2.94924e-18 N2 -0 -1 -0 + txt003 +STRI + V0 -2.92222 -0.2 1.8 V1 -2.97778 -0.125 1.8 V2 -2.94929 -0.125 1.58515 + N0 -0.6 -0.8 -0 N1 -0.923077 -0.384615 -0 N2 -0.890548 -0.386679 -0.23959 + txt003 +STRI + V0 -2.94929 -0.125 1.58515 V1 -2.896 -0.2 1.60229 V2 -2.92222 -0.2 1.8 + N0 -0.890548 -0.386679 -0.23959 N1 -0.577707 -0.801752 -0.153129 N2 -0.6 -0.8 -0 + txt003 +STRI + V0 -2.97778 -0.125 1.8 V1 -3 0 1.8 V2 -2.9706 0 1.5783 + N0 -0.923077 -0.384615 -0 N1 -1 -9.86865e-16 -0 N2 -0.965311 -7.59377e-16 -0.261102 + txt003 +STRI + V0 -2.9706 0 1.5783 V1 -2.94929 -0.125 1.58515 V2 -2.97778 -0.125 1.8 + N0 -0.965311 -7.59377e-16 -0.261102 N1 -0.890548 -0.386679 -0.23959 N2 -0.923077 -0.384615 -0 + txt003 +STRI + V0 -2.68287 0 1.67083 V1 -2.70418 -0.125 1.66398 V2 -2.64829 -0.125 1.50535 + N0 0.972045 0 0.234794 N1 0.895972 -0.38623 0.219226 N2 0.842942 -0.376421 0.38439 + txt003 +STRI + V0 -2.64829 -0.125 1.50535 V1 -2.62963 0 1.51667 V2 -2.68287 0 1.67083 + N0 0.842942 -0.376421 0.38439 N1 0.913812 0 0.406138 N2 0.972045 0 0.234794 + txt003 +STRI + V0 -2.70418 -0.125 1.66398 V1 -2.75747 -0.2 1.64684 V2 -2.69492 -0.2 1.47706 + N0 0.895972 -0.38623 0.219226 N1 0.57987 -0.801541 0.145888 N2 0.548194 -0.793356 0.264707 + txt003 +STRI + V0 -2.69492 -0.2 1.47706 V1 -2.64829 -0.125 1.50535 V2 -2.70418 -0.125 1.66398 + N0 0.548194 -0.793356 0.264707 N1 0.842942 -0.376421 0.38439 N2 0.895972 -0.38623 0.219226 + txt003 +STRI + V0 -2.75747 -0.2 1.64684 V1 -2.82674 -0.225 1.62457 V2 -2.75556 -0.225 1.44028 + N0 0.57987 -0.801541 0.145888 N1 9.48478e-19 -1 -2.94924e-18 N2 5.73642e-18 -1 -9.4564e-18 + txt003 +STRI + V0 -2.75556 -0.225 1.44028 V1 -2.69492 -0.2 1.47706 V2 -2.75747 -0.2 1.64684 + N0 5.73642e-18 -1 -9.4564e-18 N1 0.548194 -0.793356 0.264707 N2 0.57987 -0.801541 0.145888 + txt003 +STRI + V0 -2.82674 -0.225 1.62457 V1 -2.896 -0.2 1.60229 V2 -2.81619 -0.2 1.4035 + N0 9.48478e-19 -1 -2.94924e-18 N1 -0.577707 -0.801752 -0.153129 N2 -0.534196 -0.794341 -0.289235 + txt003 +STRI + V0 -2.81619 -0.2 1.4035 V1 -2.75556 -0.225 1.44028 V2 -2.82674 -0.225 1.62457 + N0 -0.534196 -0.794341 -0.289235 N1 5.73642e-18 -1 -9.4564e-18 N2 9.48478e-19 -1 -2.94924e-18 + txt003 +STRI + V0 -2.896 -0.2 1.60229 V1 -2.94929 -0.125 1.58515 V2 -2.86283 -0.125 1.37521 + N0 -0.577707 -0.801752 -0.153129 N1 -0.890548 -0.386679 -0.23959 N2 -0.807437 -0.378466 -0.452558 + txt003 +STRI + V0 -2.86283 -0.125 1.37521 V1 -2.81619 -0.2 1.4035 V2 -2.896 -0.2 1.60229 + N0 -0.807437 -0.378466 -0.452558 N1 -0.534196 -0.794341 -0.289235 N2 -0.577707 -0.801752 -0.153129 + txt003 +STRI + V0 -2.94929 -0.125 1.58515 V1 -2.9706 0 1.5783 V2 -2.88148 0 1.36389 + N0 -0.890548 -0.386679 -0.23959 N1 -0.965311 -7.59377e-16 -0.261102 N2 -0.869653 -7.07402e-16 -0.493664 + txt003 +STRI + V0 -2.88148 0 1.36389 V1 -2.86283 -0.125 1.37521 V2 -2.94929 -0.125 1.58515 + N0 -0.869653 -7.07402e-16 -0.493664 N1 -0.807437 -0.378466 -0.452558 N2 -0.890548 -0.386679 -0.23959 + txt003 +STRI + V0 -2.62963 0 1.51667 V1 -2.64829 -0.125 1.50535 V2 -2.55185 -0.125 1.33576 + N0 0.913812 0 0.406138 N1 0.842942 -0.376421 0.38439 N2 0.772293 -0.349434 0.530527 + txt003 +STRI + V0 -2.55185 -0.125 1.33576 V1 -2.5375 0 1.35 V2 -2.62963 0 1.51667 + N0 0.772293 -0.349434 0.530527 N1 0.83205 0 0.5547 N2 0.913812 0 0.406138 + txt003 +STRI + V0 -2.64829 -0.125 1.50535 V1 -2.69492 -0.2 1.47706 V2 -2.58773 -0.2 1.30017 + N0 0.842942 -0.376421 0.38439 N1 0.548194 -0.793356 0.264707 N2 0.515846 -0.768155 0.379264 + txt003 +STRI + V0 -2.58773 -0.2 1.30017 V1 -2.55185 -0.125 1.33576 V2 -2.64829 -0.125 1.50535 + N0 0.515846 -0.768155 0.379264 N1 0.772293 -0.349434 0.530527 N2 0.842942 -0.376421 0.38439 + txt003 +STRI + V0 -2.69492 -0.2 1.47706 V1 -2.75556 -0.225 1.44028 V2 -2.63437 -0.225 1.25391 + N0 0.548194 -0.793356 0.264707 N1 5.73642e-18 -1 -9.4564e-18 N2 1.5603e-17 -1 -1.57299e-17 + txt003 +STRI + V0 -2.63437 -0.225 1.25391 V1 -2.58773 -0.2 1.30017 V2 -2.69492 -0.2 1.47706 + N0 1.5603e-17 -1 -1.57299e-17 N1 0.515846 -0.768155 0.379264 N2 0.548194 -0.793356 0.264707 + txt003 +STRI + V0 -2.75556 -0.225 1.44028 V1 -2.81619 -0.2 1.4035 V2 -2.68102 -0.2 1.20764 + N0 5.73642e-18 -1 -9.4564e-18 N1 -0.534196 -0.794341 -0.289235 N2 -0.486433 -0.770599 -0.411777 + txt003 +STRI + V0 -2.68102 -0.2 1.20764 V1 -2.63437 -0.225 1.25391 V2 -2.75556 -0.225 1.44028 + N0 -0.486433 -0.770599 -0.411777 N1 1.5603e-17 -1 -1.57299e-17 N2 5.73642e-18 -1 -9.4564e-18 + txt003 +STRI + V0 -2.81619 -0.2 1.4035 V1 -2.86283 -0.125 1.37521 V2 -2.7169 -0.125 1.17205 + N0 -0.534196 -0.794341 -0.289235 N1 -0.807437 -0.378466 -0.452558 N2 -0.700515 -0.35392 -0.619694 + txt003 +STRI + V0 -2.7169 -0.125 1.17205 V1 -2.68102 -0.2 1.20764 V2 -2.81619 -0.2 1.4035 + N0 -0.700515 -0.35392 -0.619694 N1 -0.486433 -0.770599 -0.411777 N2 -0.534196 -0.794341 -0.289235 + txt003 +STRI + V0 -2.86283 -0.125 1.37521 V1 -2.88148 0 1.36389 V2 -2.73125 0 1.15781 + N0 -0.807437 -0.378466 -0.452558 N1 -0.869653 -7.07402e-16 -0.493664 N2 -0.743581 -2.38916e-16 -0.668646 + txt003 +STRI + V0 -2.73125 0 1.15781 V1 -2.7169 -0.125 1.17205 V2 -2.86283 -0.125 1.37521 + N0 -0.743581 -2.38916e-16 -0.668646 N1 -0.700515 -0.35392 -0.619694 N2 -0.807437 -0.378466 -0.452558 + txt003 +STRI + V0 -2.5375 0 1.35 V1 -2.55185 -0.125 1.33576 V2 -2.41221 -0.125 1.16687 + N0 0.83205 0 0.5547 N1 0.772293 -0.349434 0.530527 N2 0.676612 -0.31353 0.666255 + txt003 +STRI + V0 -2.41221 -0.125 1.16687 V1 -2.4037 0 1.18333 V2 -2.5375 0 1.35 + N0 0.676612 -0.31353 0.666255 N1 0.722374 0 0.691503 N2 0.83205 0 0.5547 + txt003 +STRI + V0 -2.55185 -0.125 1.33576 V1 -2.58773 -0.2 1.30017 V2 -2.43347 -0.2 1.12572 + N0 0.772293 -0.349434 0.530527 N1 0.515846 -0.768155 0.379264 N2 0.471519 -0.729692 0.495195 + txt003 +STRI + V0 -2.43347 -0.2 1.12572 V1 -2.41221 -0.125 1.16687 V2 -2.55185 -0.125 1.33576 + N0 0.471519 -0.729692 0.495195 N1 0.676612 -0.31353 0.666255 N2 0.772293 -0.349434 0.530527 + txt003 +STRI + V0 -2.58773 -0.2 1.30017 V1 -2.63437 -0.225 1.25391 V2 -2.46111 -0.225 1.07222 + N0 0.515846 -0.768155 0.379264 N1 1.5603e-17 -1 -1.57299e-17 N2 3.17396e-17 -1 -1.63988e-17 + txt003 +STRI + V0 -2.46111 -0.225 1.07222 V1 -2.43347 -0.2 1.12572 V2 -2.58773 -0.2 1.30017 + N0 3.17396e-17 -1 -1.63988e-17 N1 0.471519 -0.729692 0.495195 N2 0.515846 -0.768155 0.379264 + txt003 +STRI + V0 -2.63437 -0.225 1.25391 V1 -2.68102 -0.2 1.20764 V2 -2.48875 -0.2 1.01872 + N0 1.5603e-17 -1 -1.57299e-17 N1 -0.486433 -0.770599 -0.411777 N2 -0.433172 -0.735531 -0.520919 + txt003 +STRI + V0 -2.48875 -0.2 1.01872 V1 -2.46111 -0.225 1.07222 V2 -2.63437 -0.225 1.25391 + N0 -0.433172 -0.735531 -0.520919 N1 3.17396e-17 -1 -1.63988e-17 N2 1.5603e-17 -1 -1.57299e-17 + txt003 +STRI + V0 -2.68102 -0.2 1.20764 V1 -2.7169 -0.125 1.17205 V2 -2.51001 -0.125 0.977572 + N0 -0.486433 -0.770599 -0.411777 N1 -0.700515 -0.35392 -0.619694 N2 -0.589822 -0.322549 -0.740319 + txt003 +STRI + V0 -2.51001 -0.125 0.977572 V1 -2.48875 -0.2 1.01872 V2 -2.68102 -0.2 1.20764 + N0 -0.589822 -0.322549 -0.740319 N1 -0.433172 -0.735531 -0.520919 N2 -0.486433 -0.770599 -0.411777 + txt003 +STRI + V0 -2.7169 -0.125 1.17205 V1 -2.73125 0 1.15781 V2 -2.51852 0 0.961111 + N0 -0.700515 -0.35392 -0.619694 N1 -0.743581 -2.38916e-16 -0.668646 N2 -0.617031 -2.64751e-17 -0.786939 + txt003 +STRI + V0 -2.51852 0 0.961111 V1 -2.51001 -0.125 0.977572 V2 -2.7169 -0.125 1.17205 + N0 -0.617031 -2.64751e-17 -0.786939 N1 -0.589822 -0.322549 -0.740319 N2 -0.700515 -0.35392 -0.619694 + txt003 +STRI + V0 -2.4037 0 1.18333 V1 -2.41221 -0.125 1.16687 V2 -2.22668 -0.125 1.01033 + N0 0.722374 0 0.691503 N1 0.676612 -0.31353 0.666255 N2 0.548733 -0.289562 0.784249 + txt003 +STRI + V0 -2.22668 -0.125 1.01033 V1 -2.22546 0 1.02917 V2 -2.4037 0 1.18333 + N0 0.548733 -0.289562 0.784249 N1 0.580973 0 0.813923 N2 0.722374 0 0.691503 + txt003 +STRI + V0 -2.41221 -0.125 1.16687 V1 -2.43347 -0.2 1.12572 V2 -2.22972 -0.2 0.963227 + N0 0.676612 -0.31353 0.666255 N1 0.471519 -0.729692 0.495195 N2 0.396971 -0.700023 0.593618 + txt003 +STRI + V0 -2.22972 -0.2 0.963227 V1 -2.22668 -0.125 1.01033 V2 -2.41221 -0.125 1.16687 + N0 0.396971 -0.700023 0.593618 N1 0.548733 -0.289562 0.784249 N2 0.676612 -0.31353 0.666255 + txt003 +STRI + V0 -2.43347 -0.2 1.12572 V1 -2.46111 -0.225 1.07222 V2 -2.23368 -0.225 0.901997 + N0 0.471519 -0.729692 0.495195 N1 3.17396e-17 -1 -1.63988e-17 N2 5.4409e-17 -1 -3.51585e-18 + txt003 +STRI + V0 -2.23368 -0.225 0.901997 V1 -2.22972 -0.2 0.963227 V2 -2.43347 -0.2 1.12572 + N0 5.4409e-17 -1 -3.51585e-18 N1 0.396971 -0.700023 0.593618 N2 0.471519 -0.729692 0.495195 + txt003 +STRI + V0 -2.46111 -0.225 1.07222 V1 -2.48875 -0.2 1.01872 V2 -2.23764 -0.2 0.840766 + N0 3.17396e-17 -1 -1.63988e-17 N1 -0.433172 -0.735531 -0.520919 N2 -0.367048 -0.708353 -0.60292 + txt003 +STRI + V0 -2.23764 -0.2 0.840766 V1 -2.23368 -0.225 0.901997 V2 -2.46111 -0.225 1.07222 + N0 -0.367048 -0.708353 -0.60292 N1 5.4409e-17 -1 -3.51585e-18 N2 3.17396e-17 -1 -1.63988e-17 + txt003 +STRI + V0 -2.48875 -0.2 1.01872 V1 -2.51001 -0.125 0.977572 V2 -2.24068 -0.125 0.793666 + N0 -0.433172 -0.735531 -0.520919 N1 -0.589822 -0.322549 -0.740319 N2 -0.485318 -0.301052 -0.820874 + txt003 +STRI + V0 -2.24068 -0.125 0.793666 V1 -2.23764 -0.2 0.840766 V2 -2.48875 -0.2 1.01872 + N0 -0.485318 -0.301052 -0.820874 N1 -0.367048 -0.708353 -0.60292 N2 -0.433172 -0.735531 -0.520919 + txt003 +STRI + V0 -2.51001 -0.125 0.977572 V1 -2.51852 0 0.961111 V2 -2.2419 0 0.774826 + N0 -0.589822 -0.322549 -0.740319 N1 -0.617031 -2.64751e-17 -0.786939 N2 -0.504836 2.02979e-16 -0.863216 + txt003 +STRI + V0 -2.2419 0 0.774826 V1 -2.24068 -0.125 0.793666 V2 -2.51001 -0.125 0.977572 + N0 -0.504836 2.02979e-16 -0.863216 N1 -0.485318 -0.301052 -0.820874 N2 -0.589822 -0.322549 -0.740319 + txt003 +STRI + V0 -2.22546 0 1.02917 V1 -2.22668 -0.125 1.01033 V2 -1.99259 -0.125 0.877778 + N0 0.580973 0 0.813923 N1 0.548733 -0.289562 0.784249 N2 0.390503 -0.30734 0.867784 + txt003 +STRI + V0 -1.99259 -0.125 0.877778 V1 -2 0 0.9 V2 -2.22546 0 1.02917 + N0 0.390503 -0.30734 0.867784 N1 0.410365 0 0.911922 N2 0.580973 0 0.813923 + txt003 +STRI + V0 -2.22668 -0.125 1.01033 V1 -2.22972 -0.2 0.963227 V2 -1.97407 -0.2 0.822222 + N0 0.548733 -0.289562 0.784249 N1 0.396971 -0.700023 0.593618 N2 0.285351 -0.718662 0.634113 + txt003 +STRI + V0 -1.97407 -0.2 0.822222 V1 -1.99259 -0.125 0.877778 V2 -2.22668 -0.125 1.01033 + N0 0.285351 -0.718662 0.634113 N1 0.390503 -0.30734 0.867784 N2 0.548733 -0.289562 0.784249 + txt003 +STRI + V0 -2.22972 -0.2 0.963227 V1 -2.23368 -0.225 0.901997 V2 -1.95 -0.225 0.75 + N0 0.396971 -0.700023 0.593618 N1 5.4409e-17 -1 -3.51585e-18 N2 7.83687e-17 -1 2.61229e-17 + txt003 +STRI + V0 -1.95 -0.225 0.75 V1 -1.97407 -0.2 0.822222 V2 -2.22972 -0.2 0.963227 + N0 7.83687e-17 -1 2.61229e-17 N1 0.285351 -0.718662 0.634113 N2 0.396971 -0.700023 0.593618 + txt003 +STRI + V0 -2.23368 -0.225 0.901997 V1 -2.23764 -0.2 0.840766 V2 -1.92593 -0.2 0.677778 + N0 5.4409e-17 -1 -3.51585e-18 N1 -0.367048 -0.708353 -0.60292 N2 -0.285351 -0.718662 -0.634113 + txt003 +STRI + V0 -1.92593 -0.2 0.677778 V1 -1.95 -0.225 0.75 V2 -2.23368 -0.225 0.901997 + N0 -0.285351 -0.718662 -0.634113 N1 7.83687e-17 -1 2.61229e-17 N2 5.4409e-17 -1 -3.51585e-18 + txt003 +STRI + V0 -2.23764 -0.2 0.840766 V1 -2.24068 -0.125 0.793666 V2 -1.90741 -0.125 0.622222 + N0 -0.367048 -0.708353 -0.60292 N1 -0.485318 -0.301052 -0.820874 N2 -0.390503 -0.30734 -0.867784 + txt003 +STRI + V0 -1.90741 -0.125 0.622222 V1 -1.92593 -0.2 0.677778 V2 -2.23764 -0.2 0.840766 + N0 -0.390503 -0.30734 -0.867784 N1 -0.285351 -0.718662 -0.634113 N2 -0.367048 -0.708353 -0.60292 + txt003 +STRI + V0 -2.24068 -0.125 0.793666 V1 -2.2419 0 0.774826 V2 -1.9 0 0.6 + N0 -0.485318 -0.301052 -0.820874 N1 -0.504836 2.02979e-16 -0.863216 N2 -0.410365 4.49972e-17 -0.911922 + txt003 +STRI + V0 -1.9 0 0.6 V1 -1.90741 -0.125 0.622222 V2 -2.24068 -0.125 0.793666 + N0 -0.410365 4.49972e-17 -0.911922 N1 -0.390503 -0.30734 -0.867784 N2 -0.485318 -0.301052 -0.820874 + txt003 +STRI + V0 -3 0 1.8 V1 -2.97778 0.125 1.8 V2 -2.94929 0.125 1.58515 + N0 -1 0 0 N1 -0.923077 0.384615 0 N2 -0.890548 0.386679 -0.23959 + txt003 +STRI + V0 -2.94929 0.125 1.58515 V1 -2.9706 0 1.5783 V2 -3 0 1.8 + N0 -0.890548 0.386679 -0.23959 N1 -0.965311 0 -0.261102 N2 -1 0 0 + txt003 +STRI + V0 -2.97778 0.125 1.8 V1 -2.92222 0.2 1.8 V2 -2.896 0.2 1.60229 + N0 -0.923077 0.384615 0 N1 -0.6 0.8 0 N2 -0.577707 0.801752 -0.153129 + txt003 +STRI + V0 -2.896 0.2 1.60229 V1 -2.94929 0.125 1.58515 V2 -2.97778 0.125 1.8 + N0 -0.577707 0.801752 -0.153129 N1 -0.890548 0.386679 -0.23959 N2 -0.923077 0.384615 0 + txt003 +STRI + V0 -2.92222 0.2 1.8 V1 -2.85 0.225 1.8 V2 -2.82674 0.225 1.62457 + N0 -0.6 0.8 0 N1 -0 1 0 N2 9.48478e-19 1 -2.94924e-18 + txt003 +STRI + V0 -2.82674 0.225 1.62457 V1 -2.896 0.2 1.60229 V2 -2.92222 0.2 1.8 + N0 9.48478e-19 1 -2.94924e-18 N1 -0.577707 0.801752 -0.153129 N2 -0.6 0.8 0 + txt003 +STRI + V0 -2.85 0.225 1.8 V1 -2.77778 0.2 1.8 V2 -2.75747 0.2 1.64684 + N0 -0 1 0 N1 0.6 0.8 0 N2 0.57987 0.801541 0.145888 + txt003 +STRI + V0 -2.75747 0.2 1.64684 V1 -2.82674 0.225 1.62457 V2 -2.85 0.225 1.8 + N0 0.57987 0.801541 0.145888 N1 9.48478e-19 1 -2.94924e-18 N2 -0 1 0 + txt003 +STRI + V0 -2.77778 0.2 1.8 V1 -2.72222 0.125 1.8 V2 -2.70418 0.125 1.66398 + N0 0.6 0.8 0 N1 0.923077 0.384615 0 N2 0.895972 0.38623 0.219226 + txt003 +STRI + V0 -2.70418 0.125 1.66398 V1 -2.75747 0.2 1.64684 V2 -2.77778 0.2 1.8 + N0 0.895972 0.38623 0.219226 N1 0.57987 0.801541 0.145888 N2 0.6 0.8 0 + txt003 +STRI + V0 -2.72222 0.125 1.8 V1 -2.7 0 1.8 V2 -2.68287 0 1.67083 + N0 0.923077 0.384615 0 N1 1 9.86865e-16 0 N2 0.972045 1.13306e-15 0.234794 + txt003 +STRI + V0 -2.68287 0 1.67083 V1 -2.70418 0.125 1.66398 V2 -2.72222 0.125 1.8 + N0 0.972045 1.13306e-15 0.234794 N1 0.895972 0.38623 0.219226 N2 0.923077 0.384615 0 + txt003 +STRI + V0 -2.9706 0 1.5783 V1 -2.94929 0.125 1.58515 V2 -2.86283 0.125 1.37521 + N0 -0.965311 0 -0.261102 N1 -0.890548 0.386679 -0.23959 N2 -0.807437 0.378466 -0.452558 + txt003 +STRI + V0 -2.86283 0.125 1.37521 V1 -2.88148 0 1.36389 V2 -2.9706 0 1.5783 + N0 -0.807437 0.378466 -0.452558 N1 -0.869653 0 -0.493664 N2 -0.965311 0 -0.261102 + txt003 +STRI + V0 -2.94929 0.125 1.58515 V1 -2.896 0.2 1.60229 V2 -2.81619 0.2 1.4035 + N0 -0.890548 0.386679 -0.23959 N1 -0.577707 0.801752 -0.153129 N2 -0.534196 0.794341 -0.289235 + txt003 +STRI + V0 -2.81619 0.2 1.4035 V1 -2.86283 0.125 1.37521 V2 -2.94929 0.125 1.58515 + N0 -0.534196 0.794341 -0.289235 N1 -0.807437 0.378466 -0.452558 N2 -0.890548 0.386679 -0.23959 + txt003 +STRI + V0 -2.896 0.2 1.60229 V1 -2.82674 0.225 1.62457 V2 -2.75556 0.225 1.44028 + N0 -0.577707 0.801752 -0.153129 N1 9.48478e-19 1 -2.94924e-18 N2 5.73642e-18 1 -9.4564e-18 + txt003 +STRI + V0 -2.75556 0.225 1.44028 V1 -2.81619 0.2 1.4035 V2 -2.896 0.2 1.60229 + N0 5.73642e-18 1 -9.4564e-18 N1 -0.534196 0.794341 -0.289235 N2 -0.577707 0.801752 -0.153129 + txt003 +STRI + V0 -2.82674 0.225 1.62457 V1 -2.75747 0.2 1.64684 V2 -2.69492 0.2 1.47706 + N0 9.48478e-19 1 -2.94924e-18 N1 0.57987 0.801541 0.145888 N2 0.548194 0.793356 0.264707 + txt003 +STRI + V0 -2.69492 0.2 1.47706 V1 -2.75556 0.225 1.44028 V2 -2.82674 0.225 1.62457 + N0 0.548194 0.793356 0.264707 N1 5.73642e-18 1 -9.4564e-18 N2 9.48478e-19 1 -2.94924e-18 + txt003 +STRI + V0 -2.75747 0.2 1.64684 V1 -2.70418 0.125 1.66398 V2 -2.64829 0.125 1.50535 + N0 0.57987 0.801541 0.145888 N1 0.895972 0.38623 0.219226 N2 0.842942 0.376421 0.38439 + txt003 +STRI + V0 -2.64829 0.125 1.50535 V1 -2.69492 0.2 1.47706 V2 -2.75747 0.2 1.64684 + N0 0.842942 0.376421 0.38439 N1 0.548194 0.793356 0.264707 N2 0.57987 0.801541 0.145888 + txt003 +STRI + V0 -2.70418 0.125 1.66398 V1 -2.68287 0 1.67083 V2 -2.62963 0 1.51667 + N0 0.895972 0.38623 0.219226 N1 0.972045 1.13306e-15 0.234794 N2 0.913812 1.42786e-15 0.406138 + txt003 +STRI + V0 -2.62963 0 1.51667 V1 -2.64829 0.125 1.50535 V2 -2.70418 0.125 1.66398 + N0 0.913812 1.42786e-15 0.406138 N1 0.842942 0.376421 0.38439 N2 0.895972 0.38623 0.219226 + txt003 +STRI + V0 -2.88148 0 1.36389 V1 -2.86283 0.125 1.37521 V2 -2.7169 0.125 1.17205 + N0 -0.869653 0 -0.493664 N1 -0.807437 0.378466 -0.452558 N2 -0.700515 0.35392 -0.619694 + txt003 +STRI + V0 -2.7169 0.125 1.17205 V1 -2.73125 0 1.15781 V2 -2.88148 0 1.36389 + N0 -0.700515 0.35392 -0.619694 N1 -0.743581 0 -0.668646 N2 -0.869653 0 -0.493664 + txt003 +STRI + V0 -2.86283 0.125 1.37521 V1 -2.81619 0.2 1.4035 V2 -2.68102 0.2 1.20764 + N0 -0.807437 0.378466 -0.452558 N1 -0.534196 0.794341 -0.289235 N2 -0.486433 0.770599 -0.411777 + txt003 +STRI + V0 -2.68102 0.2 1.20764 V1 -2.7169 0.125 1.17205 V2 -2.86283 0.125 1.37521 + N0 -0.486433 0.770599 -0.411777 N1 -0.700515 0.35392 -0.619694 N2 -0.807437 0.378466 -0.452558 + txt003 +STRI + V0 -2.81619 0.2 1.4035 V1 -2.75556 0.225 1.44028 V2 -2.63437 0.225 1.25391 + N0 -0.534196 0.794341 -0.289235 N1 5.73642e-18 1 -9.4564e-18 N2 1.5603e-17 1 -1.57299e-17 + txt003 +STRI + V0 -2.63437 0.225 1.25391 V1 -2.68102 0.2 1.20764 V2 -2.81619 0.2 1.4035 + N0 1.5603e-17 1 -1.57299e-17 N1 -0.486433 0.770599 -0.411777 N2 -0.534196 0.794341 -0.289235 + txt003 +STRI + V0 -2.75556 0.225 1.44028 V1 -2.69492 0.2 1.47706 V2 -2.58773 0.2 1.30017 + N0 5.73642e-18 1 -9.4564e-18 N1 0.548194 0.793356 0.264707 N2 0.515846 0.768155 0.379264 + txt003 +STRI + V0 -2.58773 0.2 1.30017 V1 -2.63437 0.225 1.25391 V2 -2.75556 0.225 1.44028 + N0 0.515846 0.768155 0.379264 N1 1.5603e-17 1 -1.57299e-17 N2 5.73642e-18 1 -9.4564e-18 + txt003 +STRI + V0 -2.69492 0.2 1.47706 V1 -2.64829 0.125 1.50535 V2 -2.55185 0.125 1.33576 + N0 0.548194 0.793356 0.264707 N1 0.842942 0.376421 0.38439 N2 0.772293 0.349434 0.530527 + txt003 +STRI + V0 -2.55185 0.125 1.33576 V1 -2.58773 0.2 1.30017 V2 -2.69492 0.2 1.47706 + N0 0.772293 0.349434 0.530527 N1 0.515846 0.768155 0.379264 N2 0.548194 0.793356 0.264707 + txt003 +STRI + V0 -2.64829 0.125 1.50535 V1 -2.62963 0 1.51667 V2 -2.5375 0 1.35 + N0 0.842942 0.376421 0.38439 N1 0.913812 1.42786e-15 0.406138 N2 0.83205 1.23168e-15 0.5547 + txt003 +STRI + V0 -2.5375 0 1.35 V1 -2.55185 0.125 1.33576 V2 -2.64829 0.125 1.50535 + N0 0.83205 1.23168e-15 0.5547 N1 0.772293 0.349434 0.530527 N2 0.842942 0.376421 0.38439 + txt003 +STRI + V0 -2.73125 0 1.15781 V1 -2.7169 0.125 1.17205 V2 -2.51001 0.125 0.977572 + N0 -0.743581 0 -0.668646 N1 -0.700515 0.35392 -0.619694 N2 -0.589822 0.322549 -0.740319 + txt003 +STRI + V0 -2.51001 0.125 0.977572 V1 -2.51852 0 0.961111 V2 -2.73125 0 1.15781 + N0 -0.589822 0.322549 -0.740319 N1 -0.617031 0 -0.786939 N2 -0.743581 0 -0.668646 + txt003 +STRI + V0 -2.7169 0.125 1.17205 V1 -2.68102 0.2 1.20764 V2 -2.48875 0.2 1.01872 + N0 -0.700515 0.35392 -0.619694 N1 -0.486433 0.770599 -0.411777 N2 -0.433172 0.735531 -0.520919 + txt003 +STRI + V0 -2.48875 0.2 1.01872 V1 -2.51001 0.125 0.977572 V2 -2.7169 0.125 1.17205 + N0 -0.433172 0.735531 -0.520919 N1 -0.589822 0.322549 -0.740319 N2 -0.700515 0.35392 -0.619694 + txt003 +STRI + V0 -2.68102 0.2 1.20764 V1 -2.63437 0.225 1.25391 V2 -2.46111 0.225 1.07222 + N0 -0.486433 0.770599 -0.411777 N1 1.5603e-17 1 -1.57299e-17 N2 3.17396e-17 1 -1.63988e-17 + txt003 +STRI + V0 -2.46111 0.225 1.07222 V1 -2.48875 0.2 1.01872 V2 -2.68102 0.2 1.20764 + N0 3.17396e-17 1 -1.63988e-17 N1 -0.433172 0.735531 -0.520919 N2 -0.486433 0.770599 -0.411777 + txt003 +STRI + V0 -2.63437 0.225 1.25391 V1 -2.58773 0.2 1.30017 V2 -2.43347 0.2 1.12572 + N0 1.5603e-17 1 -1.57299e-17 N1 0.515846 0.768155 0.379264 N2 0.471519 0.729692 0.495195 + txt003 +STRI + V0 -2.43347 0.2 1.12572 V1 -2.46111 0.225 1.07222 V2 -2.63437 0.225 1.25391 + N0 0.471519 0.729692 0.495195 N1 3.17396e-17 1 -1.63988e-17 N2 1.5603e-17 1 -1.57299e-17 + txt003 +STRI + V0 -2.58773 0.2 1.30017 V1 -2.55185 0.125 1.33576 V2 -2.41221 0.125 1.16687 + N0 0.515846 0.768155 0.379264 N1 0.772293 0.349434 0.530527 N2 0.676612 0.31353 0.666255 + txt003 +STRI + V0 -2.41221 0.125 1.16687 V1 -2.43347 0.2 1.12572 V2 -2.58773 0.2 1.30017 + N0 0.676612 0.31353 0.666255 N1 0.471519 0.729692 0.495195 N2 0.515846 0.768155 0.379264 + txt003 +STRI + V0 -2.55185 0.125 1.33576 V1 -2.5375 0 1.35 V2 -2.4037 0 1.18333 + N0 0.772293 0.349434 0.530527 N1 0.83205 1.23168e-15 0.5547 N2 0.722374 1.2247e-15 0.691503 + txt003 +STRI + V0 -2.4037 0 1.18333 V1 -2.41221 0.125 1.16687 V2 -2.55185 0.125 1.33576 + N0 0.722374 1.2247e-15 0.691503 N1 0.676612 0.31353 0.666255 N2 0.772293 0.349434 0.530527 + txt003 +STRI + V0 -2.51852 0 0.961111 V1 -2.51001 0.125 0.977572 V2 -2.24068 0.125 0.793666 + N0 -0.617031 0 -0.786939 N1 -0.589822 0.322549 -0.740319 N2 -0.485318 0.301052 -0.820874 + txt003 +STRI + V0 -2.24068 0.125 0.793666 V1 -2.2419 0 0.774826 V2 -2.51852 0 0.961111 + N0 -0.485318 0.301052 -0.820874 N1 -0.504836 0 -0.863216 N2 -0.617031 0 -0.786939 + txt003 +STRI + V0 -2.51001 0.125 0.977572 V1 -2.48875 0.2 1.01872 V2 -2.23764 0.2 0.840766 + N0 -0.589822 0.322549 -0.740319 N1 -0.433172 0.735531 -0.520919 N2 -0.367048 0.708353 -0.60292 + txt003 +STRI + V0 -2.23764 0.2 0.840766 V1 -2.24068 0.125 0.793666 V2 -2.51001 0.125 0.977572 + N0 -0.367048 0.708353 -0.60292 N1 -0.485318 0.301052 -0.820874 N2 -0.589822 0.322549 -0.740319 + txt003 +STRI + V0 -2.48875 0.2 1.01872 V1 -2.46111 0.225 1.07222 V2 -2.23368 0.225 0.901997 + N0 -0.433172 0.735531 -0.520919 N1 3.17396e-17 1 -1.63988e-17 N2 5.4409e-17 1 -3.51585e-18 + txt003 +STRI + V0 -2.23368 0.225 0.901997 V1 -2.23764 0.2 0.840766 V2 -2.48875 0.2 1.01872 + N0 5.4409e-17 1 -3.51585e-18 N1 -0.367048 0.708353 -0.60292 N2 -0.433172 0.735531 -0.520919 + txt003 +STRI + V0 -2.46111 0.225 1.07222 V1 -2.43347 0.2 1.12572 V2 -2.22972 0.2 0.963227 + N0 3.17396e-17 1 -1.63988e-17 N1 0.471519 0.729692 0.495195 N2 0.396971 0.700023 0.593618 + txt003 +STRI + V0 -2.22972 0.2 0.963227 V1 -2.23368 0.225 0.901997 V2 -2.46111 0.225 1.07222 + N0 0.396971 0.700023 0.593618 N1 5.4409e-17 1 -3.51585e-18 N2 3.17396e-17 1 -1.63988e-17 + txt003 +STRI + V0 -2.43347 0.2 1.12572 V1 -2.41221 0.125 1.16687 V2 -2.22668 0.125 1.01033 + N0 0.471519 0.729692 0.495195 N1 0.676612 0.31353 0.666255 N2 0.548733 0.289562 0.784249 + txt003 +STRI + V0 -2.22668 0.125 1.01033 V1 -2.22972 0.2 0.963227 V2 -2.43347 0.2 1.12572 + N0 0.548733 0.289562 0.784249 N1 0.396971 0.700023 0.593618 N2 0.471519 0.729692 0.495195 + txt003 +STRI + V0 -2.41221 0.125 1.16687 V1 -2.4037 0 1.18333 V2 -2.22546 0 1.02917 + N0 0.676612 0.31353 0.666255 N1 0.722374 1.2247e-15 0.691503 N2 0.580973 1.1041e-15 0.813923 + txt003 +STRI + V0 -2.22546 0 1.02917 V1 -2.22668 0.125 1.01033 V2 -2.41221 0.125 1.16687 + N0 0.580973 1.1041e-15 0.813923 N1 0.548733 0.289562 0.784249 N2 0.676612 0.31353 0.666255 + txt003 +STRI + V0 -2.2419 0 0.774826 V1 -2.24068 0.125 0.793666 V2 -1.90741 0.125 0.622222 + N0 -0.504836 0 -0.863216 N1 -0.485318 0.301052 -0.820874 N2 -0.390503 0.30734 -0.867784 + txt003 +STRI + V0 -1.90741 0.125 0.622222 V1 -1.9 0 0.6 V2 -2.2419 0 0.774826 + N0 -0.390503 0.30734 -0.867784 N1 -0.410365 0 -0.911922 N2 -0.504836 0 -0.863216 + txt003 +STRI + V0 -2.24068 0.125 0.793666 V1 -2.23764 0.2 0.840766 V2 -1.92593 0.2 0.677778 + N0 -0.485318 0.301052 -0.820874 N1 -0.367048 0.708353 -0.60292 N2 -0.285351 0.718662 -0.634113 + txt003 +STRI + V0 -1.92593 0.2 0.677778 V1 -1.90741 0.125 0.622222 V2 -2.24068 0.125 0.793666 + N0 -0.285351 0.718662 -0.634113 N1 -0.390503 0.30734 -0.867784 N2 -0.485318 0.301052 -0.820874 + txt003 +STRI + V0 -2.23764 0.2 0.840766 V1 -2.23368 0.225 0.901997 V2 -1.95 0.225 0.75 + N0 -0.367048 0.708353 -0.60292 N1 5.4409e-17 1 -3.51585e-18 N2 7.83687e-17 1 2.61229e-17 + txt003 +STRI + V0 -1.95 0.225 0.75 V1 -1.92593 0.2 0.677778 V2 -2.23764 0.2 0.840766 + N0 7.83687e-17 1 2.61229e-17 N1 -0.285351 0.718662 -0.634113 N2 -0.367048 0.708353 -0.60292 + txt003 +STRI + V0 -2.23368 0.225 0.901997 V1 -2.22972 0.2 0.963227 V2 -1.97407 0.2 0.822222 + N0 5.4409e-17 1 -3.51585e-18 N1 0.396971 0.700023 0.593618 N2 0.285351 0.718662 0.634113 + txt003 +STRI + V0 -1.97407 0.2 0.822222 V1 -1.95 0.225 0.75 V2 -2.23368 0.225 0.901997 + N0 0.285351 0.718662 0.634113 N1 7.83687e-17 1 2.61229e-17 N2 5.4409e-17 1 -3.51585e-18 + txt003 +STRI + V0 -2.22972 0.2 0.963227 V1 -2.22668 0.125 1.01033 V2 -1.99259 0.125 0.877778 + N0 0.396971 0.700023 0.593618 N1 0.548733 0.289562 0.784249 N2 0.390503 0.30734 0.867784 + txt003 +STRI + V0 -1.99259 0.125 0.877778 V1 -1.97407 0.2 0.822222 V2 -2.22972 0.2 0.963227 + N0 0.390503 0.30734 0.867784 N1 0.285351 0.718662 0.634113 N2 0.396971 0.700023 0.593618 + txt003 +STRI + V0 -2.22668 0.125 1.01033 V1 -2.22546 0 1.02917 V2 -2 0 0.9 + N0 0.548733 0.289562 0.784249 N1 0.580973 1.1041e-15 0.813923 N2 0.410365 1.30492e-15 0.911922 + txt003 +STRI + V0 -2 0 0.9 V1 -1.99259 0.125 0.877778 V2 -2.22668 0.125 1.01033 + N0 0.410365 1.30492e-15 0.911922 N1 0.390503 0.30734 0.867784 N2 0.548733 0.289562 0.784249 + txt003 +STRI + V0 1.7 0 1.425 V1 1.7 -0.275 1.36389 V2 2.07238 -0.262346 1.42521 + N0 -0 0 1 N1 -0.0157732 -0.461877 0.886804 N2 -0.291732 -0.426807 0.855995 + txt003 +STRI + V0 2.07238 -0.262346 1.42521 V1 2.0588 0 1.47639 V2 1.7 0 1.425 + N0 -0.291732 -0.426807 0.855995 N1 -0.333935 0 0.942596 N2 -0 0 1 + txt003 +STRI + V0 1.7 -0.275 1.36389 V1 1.7 -0.44 1.21111 V2 2.10633 -0.419753 1.29725 + N0 -0.0157732 -0.461877 0.886804 N1 -0.0291362 -0.857129 0.514277 N2 -0.135104 -0.834377 0.534381 + txt003 +STRI + V0 2.10633 -0.419753 1.29725 V1 2.07238 -0.262346 1.42521 V2 1.7 -0.275 1.36389 + N0 -0.135104 -0.834377 0.534381 N1 -0.291732 -0.426807 0.855995 N2 -0.0157732 -0.461877 0.886804 + txt003 +STRI + V0 1.7 -0.44 1.21111 V1 1.7 -0.495 1.0125 V2 2.15046 -0.472222 1.1309 + N0 -0.0291362 -0.857129 0.514277 N1 0 -1 -0 N2 0.110195 -0.99348 0.0292376 + txt003 +STRI + V0 2.15046 -0.472222 1.1309 V1 2.10633 -0.419753 1.29725 V2 1.7 -0.44 1.21111 + N0 0.110195 -0.99348 0.0292376 N1 -0.135104 -0.834377 0.534381 N2 -0.0291362 -0.857129 0.514277 + txt003 +STRI + V0 1.7 -0.495 1.0125 V1 1.7 -0.44 0.813889 V2 2.1946 -0.419753 0.964558 + N0 0 -1 -0 N1 0.0673462 -0.855546 -0.513328 N2 0.348602 -0.814337 -0.464038 + txt003 +STRI + V0 2.1946 -0.419753 0.964558 V1 2.15046 -0.472222 1.1309 V2 1.7 -0.495 1.0125 + N0 0.348602 -0.814337 -0.464038 N1 0.110195 -0.99348 0.0292376 N2 0 -1 -0 + txt003 +STRI + V0 1.7 -0.44 0.813889 V1 1.7 -0.275 0.661111 V2 2.22855 -0.262346 0.8366 + N0 0.0673462 -0.855546 -0.513328 N1 0.134339 -0.457747 -0.878875 N2 0.492146 -0.41068 -0.767551 + txt003 +STRI + V0 2.22855 -0.262346 0.8366 V1 2.1946 -0.419753 0.964558 V2 1.7 -0.44 0.813889 + N0 0.492146 -0.41068 -0.767551 N1 0.348602 -0.814337 -0.464038 N2 0.0673462 -0.855546 -0.513328 + txt003 +STRI + V0 1.7 -0.275 0.661111 V1 1.7 0 0.6 V2 2.24213 0 0.785417 + N0 0.134339 -0.457747 -0.878875 N1 0.158678 9.39168e-16 -0.98733 N2 0.528678 6.47717e-16 -0.848822 + txt003 +STRI + V0 2.24213 0 0.785417 V1 2.22855 -0.262346 0.8366 V2 1.7 -0.275 0.661111 + N0 0.528678 6.47717e-16 -0.848822 N1 0.492146 -0.41068 -0.767551 N2 0.134339 -0.457747 -0.878875 + txt003 +STRI + V0 2.0588 0 1.47639 V1 2.07238 -0.262346 1.42521 V2 2.29012 -0.23071 1.57202 + N0 -0.333935 0 0.942596 N1 -0.291732 -0.426807 0.855995 N2 -0.64585 -0.390219 0.656206 + txt003 +STRI + V0 2.29012 -0.23071 1.57202 V1 2.27037 0 1.61111 V2 2.0588 0 1.47639 + N0 -0.64585 -0.390219 0.656206 N1 -0.731055 0 0.682318 N2 -0.333935 0 0.942596 + txt003 +STRI + V0 2.07238 -0.262346 1.42521 V1 2.10633 -0.419753 1.29725 V2 2.33951 -0.369136 1.47428 + N0 -0.291732 -0.426807 0.855995 N1 -0.135104 -0.834377 0.534381 N2 -0.312511 -0.816863 0.484842 + txt003 +STRI + V0 2.33951 -0.369136 1.47428 V1 2.29012 -0.23071 1.57202 V2 2.07238 -0.262346 1.42521 + N0 -0.312511 -0.816863 0.484842 N1 -0.64585 -0.390219 0.656206 N2 -0.291732 -0.426807 0.855995 + txt003 +STRI + V0 2.10633 -0.419753 1.29725 V1 2.15046 -0.472222 1.1309 V2 2.4037 -0.415278 1.34722 + N0 -0.135104 -0.834377 0.534381 N1 0.110195 -0.99348 0.0292376 N2 0.215359 -0.970454 0.108813 + txt003 +STRI + V0 2.4037 -0.415278 1.34722 V1 2.33951 -0.369136 1.47428 V2 2.10633 -0.419753 1.29725 + N0 0.215359 -0.970454 0.108813 N1 -0.312511 -0.816863 0.484842 N2 -0.135104 -0.834377 0.534381 + txt003 +STRI + V0 2.15046 -0.472222 1.1309 V1 2.1946 -0.419753 0.964558 V2 2.4679 -0.369136 1.22016 + N0 0.110195 -0.99348 0.0292376 N1 0.348602 -0.814337 -0.464038 N2 0.627607 -0.733748 -0.260237 + txt003 +STRI + V0 2.4679 -0.369136 1.22016 V1 2.4037 -0.415278 1.34722 V2 2.15046 -0.472222 1.1309 + N0 0.627607 -0.733748 -0.260237 N1 0.215359 -0.970454 0.108813 N2 0.110195 -0.99348 0.0292376 + txt003 +STRI + V0 2.1946 -0.419753 0.964558 V1 2.22855 -0.262346 0.8366 V2 2.51728 -0.23071 1.12243 + N0 0.348602 -0.814337 -0.464038 N1 0.492146 -0.41068 -0.767551 N2 0.813963 -0.348056 -0.465103 + txt003 +STRI + V0 2.51728 -0.23071 1.12243 V1 2.4679 -0.369136 1.22016 V2 2.1946 -0.419753 0.964558 + N0 0.813963 -0.348056 -0.465103 N1 0.627607 -0.733748 -0.260237 N2 0.348602 -0.814337 -0.464038 + txt003 +STRI + V0 2.22855 -0.262346 0.8366 V1 2.24213 0 0.785417 V2 2.53704 0 1.08333 + N0 0.492146 -0.41068 -0.767551 N1 0.528678 6.47717e-16 -0.848822 N2 0.854063 9.88017e-16 -0.52017 + txt003 +STRI + V0 2.53704 0 1.08333 V1 2.51728 -0.23071 1.12243 V2 2.22855 -0.262346 0.8366 + N0 0.854063 9.88017e-16 -0.52017 N1 0.813963 -0.348056 -0.465103 N2 0.492146 -0.41068 -0.767551 + txt003 +STRI + V0 2.27037 0 1.61111 V1 2.29012 -0.23071 1.57202 V2 2.40972 -0.189583 1.77361 + N0 -0.731055 0 0.682318 N1 -0.64585 -0.390219 0.656206 N2 -0.835237 -0.363942 0.412221 + txt003 +STRI + V0 2.40972 -0.189583 1.77361 V1 2.3875 0 1.8 V2 2.27037 0 1.61111 + N0 -0.835237 -0.363942 0.412221 N1 -0.920582 0 0.39055 N2 -0.731055 0 0.682318 + txt003 +STRI + V0 2.29012 -0.23071 1.57202 V1 2.33951 -0.369136 1.47428 V2 2.46528 -0.303333 1.70764 + N0 -0.64585 -0.390219 0.656206 N1 -0.312511 -0.816863 0.484842 N2 -0.451323 -0.803033 0.38916 + txt003 +STRI + V0 2.46528 -0.303333 1.70764 V1 2.40972 -0.189583 1.77361 V2 2.29012 -0.23071 1.57202 + N0 -0.451323 -0.803033 0.38916 N1 -0.835237 -0.363942 0.412221 N2 -0.64585 -0.390219 0.656206 + txt003 +STRI + V0 2.33951 -0.369136 1.47428 V1 2.4037 -0.415278 1.34722 V2 2.5375 -0.34125 1.62187 + N0 -0.312511 -0.816863 0.484842 N1 0.215359 -0.970454 0.108813 N2 0.214084 -0.960035 0.180281 + txt003 +STRI + V0 2.5375 -0.34125 1.62187 V1 2.46528 -0.303333 1.70764 V2 2.33951 -0.369136 1.47428 + N0 0.214084 -0.960035 0.180281 N1 -0.451323 -0.803033 0.38916 N2 -0.312511 -0.816863 0.484842 + txt003 +STRI + V0 2.4037 -0.415278 1.34722 V1 2.4679 -0.369136 1.22016 V2 2.60972 -0.303333 1.53611 + N0 0.215359 -0.970454 0.108813 N1 0.627607 -0.733748 -0.260237 N2 0.705424 -0.704198 -0.0805066 + txt003 +STRI + V0 2.60972 -0.303333 1.53611 V1 2.5375 -0.34125 1.62187 V2 2.4037 -0.415278 1.34722 + N0 0.705424 -0.704198 -0.0805066 N1 0.214084 -0.960035 0.180281 N2 0.215359 -0.970454 0.108813 + txt003 +STRI + V0 2.4679 -0.369136 1.22016 V1 2.51728 -0.23071 1.12243 V2 2.66528 -0.189583 1.47014 + N0 0.627607 -0.733748 -0.260237 N1 0.813963 -0.348056 -0.465103 N2 0.913262 -0.329186 -0.239977 + txt003 +STRI + V0 2.66528 -0.189583 1.47014 V1 2.60972 -0.303333 1.53611 V2 2.4679 -0.369136 1.22016 + N0 0.913262 -0.329186 -0.239977 N1 0.705424 -0.704198 -0.0805066 N2 0.627607 -0.733748 -0.260237 + txt003 +STRI + V0 2.51728 -0.23071 1.12243 V1 2.53704 0 1.08333 V2 2.6875 0 1.44375 + N0 0.813963 -0.348056 -0.465103 N1 0.854063 9.88017e-16 -0.52017 N2 0.957826 1.83855e-15 -0.287348 + txt003 +STRI + V0 2.6875 0 1.44375 V1 2.66528 -0.189583 1.47014 V2 2.51728 -0.23071 1.12243 + N0 0.957826 1.83855e-15 -0.287348 N1 0.913262 -0.329186 -0.239977 N2 0.813963 -0.348056 -0.465103 + txt003 +STRI + V0 2.3875 0 1.8 V1 2.40972 -0.189583 1.77361 V2 2.48765 -0.148457 1.99928 + N0 -0.920582 0 0.39055 N1 -0.835237 -0.363942 0.412221 N2 -0.842821 -0.409176 0.34961 + txt003 +STRI + V0 2.48765 -0.148457 1.99928 V1 2.46296 0 2.01389 V2 2.3875 0 1.8 + N0 -0.842821 -0.409176 0.34961 N1 -0.948683 0 0.316228 N2 -0.920582 0 0.39055 + txt003 +STRI + V0 2.40972 -0.189583 1.77361 V1 2.46528 -0.303333 1.70764 V2 2.54938 -0.237531 1.96276 + N0 -0.835237 -0.363942 0.412221 N1 -0.451323 -0.803033 0.38916 N2 -0.452673 -0.821162 0.347535 + txt003 +STRI + V0 2.54938 -0.237531 1.96276 V1 2.48765 -0.148457 1.99928 V2 2.40972 -0.189583 1.77361 + N0 -0.452673 -0.821162 0.347535 N1 -0.842821 -0.409176 0.34961 N2 -0.835237 -0.363942 0.412221 + txt003 +STRI + V0 2.46528 -0.303333 1.70764 V1 2.5375 -0.34125 1.62187 V2 2.62963 -0.267222 1.91528 + N0 -0.451323 -0.803033 0.38916 N1 0.214084 -0.960035 0.180281 N2 0.113546 -0.974822 0.191909 + txt003 +STRI + V0 2.62963 -0.267222 1.91528 V1 2.54938 -0.237531 1.96276 V2 2.46528 -0.303333 1.70764 + N0 0.113546 -0.974822 0.191909 N1 -0.452673 -0.821162 0.347535 N2 -0.451323 -0.803033 0.38916 + txt003 +STRI + V0 2.5375 -0.34125 1.62187 V1 2.60972 -0.303333 1.53611 V2 2.70988 -0.237531 1.8678 + N0 0.214084 -0.960035 0.180281 N1 0.705424 -0.704198 -0.0805066 N2 0.60461 -0.794635 -0.0547983 + txt003 +STRI + V0 2.70988 -0.237531 1.8678 V1 2.62963 -0.267222 1.91528 V2 2.5375 -0.34125 1.62187 + N0 0.60461 -0.794635 -0.0547983 N1 0.113546 -0.974822 0.191909 N2 0.214084 -0.960035 0.180281 + txt003 +STRI + V0 2.60972 -0.303333 1.53611 V1 2.66528 -0.189583 1.47014 V2 2.7716 -0.148457 1.83128 + N0 0.705424 -0.704198 -0.0805066 N1 0.913262 -0.329186 -0.239977 N2 0.880144 -0.401503 -0.253261 + txt003 +STRI + V0 2.7716 -0.148457 1.83128 V1 2.70988 -0.237531 1.8678 V2 2.60972 -0.303333 1.53611 + N0 0.880144 -0.401503 -0.253261 N1 0.60461 -0.794635 -0.0547983 N2 0.705424 -0.704198 -0.0805066 + txt003 +STRI + V0 2.66528 -0.189583 1.47014 V1 2.6875 0 1.44375 V2 2.7963 0 1.81667 + N0 0.913262 -0.329186 -0.239977 N1 0.957826 1.83855e-15 -0.287348 N2 0.947588 3.02585e-15 -0.319493 + txt003 +STRI + V0 2.7963 0 1.81667 V1 2.7716 -0.148457 1.83128 V2 2.66528 -0.189583 1.47014 + N0 0.947588 3.02585e-15 -0.319493 N1 0.880144 -0.401503 -0.253261 N2 0.913262 -0.329186 -0.239977 + txt003 +STRI + V0 2.46296 0 2.01389 V1 2.48765 -0.148457 1.99928 V2 2.5804 -0.116821 2.21831 + N0 -0.948683 0 0.316228 N1 -0.842821 -0.409176 0.34961 N2 -0.723795 -0.498863 0.476715 + txt003 +STRI + V0 2.5804 -0.116821 2.21831 V1 2.54954 0 2.22361 V2 2.46296 0 2.01389 + N0 -0.723795 -0.498863 0.476715 N1 -0.874591 0 0.484861 N2 -0.948683 0 0.316228 + txt003 +STRI + V0 2.48765 -0.148457 1.99928 V1 2.54938 -0.237531 1.96276 V2 2.65756 -0.186914 2.20507 + N0 -0.842821 -0.409176 0.34961 N1 -0.452673 -0.821162 0.347535 N2 -0.365378 -0.851743 0.375544 + txt003 +STRI + V0 2.65756 -0.186914 2.20507 V1 2.5804 -0.116821 2.21831 V2 2.48765 -0.148457 1.99928 + N0 -0.365378 -0.851743 0.375544 N1 -0.723795 -0.498863 0.476715 N2 -0.842821 -0.409176 0.34961 + txt003 +STRI + V0 2.54938 -0.237531 1.96276 V1 2.62963 -0.267222 1.91528 V2 2.75787 -0.210278 2.18785 + N0 -0.452673 -0.821162 0.347535 N1 0.113546 -0.974822 0.191909 N2 0.0260102 -0.988113 0.151516 + txt003 +STRI + V0 2.75787 -0.210278 2.18785 V1 2.65756 -0.186914 2.20507 V2 2.54938 -0.237531 1.96276 + N0 0.0260102 -0.988113 0.151516 N1 -0.365378 -0.851743 0.375544 N2 -0.452673 -0.821162 0.347535 + txt003 +STRI + V0 2.62963 -0.267222 1.91528 V1 2.70988 -0.237531 1.8678 V2 2.85818 -0.186914 2.17063 + N0 0.113546 -0.974822 0.191909 N1 0.60461 -0.794635 -0.0547983 N2 0.417243 -0.88974 -0.185122 + txt003 +STRI + V0 2.85818 -0.186914 2.17063 V1 2.75787 -0.210278 2.18785 V2 2.62963 -0.267222 1.91528 + N0 0.417243 -0.88974 -0.185122 N1 0.0260102 -0.988113 0.151516 N2 0.113546 -0.974822 0.191909 + txt003 +STRI + V0 2.70988 -0.237531 1.8678 V1 2.7716 -0.148457 1.83128 V2 2.93534 -0.116821 2.15738 + N0 0.60461 -0.794635 -0.0547983 N1 0.880144 -0.401503 -0.253261 N2 0.70819 -0.492319 -0.506053 + txt003 +STRI + V0 2.93534 -0.116821 2.15738 V1 2.85818 -0.186914 2.17063 V2 2.70988 -0.237531 1.8678 + N0 0.70819 -0.492319 -0.506053 N1 0.417243 -0.88974 -0.185122 N2 0.60461 -0.794635 -0.0547983 + txt003 +STRI + V0 2.7716 -0.148457 1.83128 V1 2.7963 0 1.81667 V2 2.9662 0 2.15208 + N0 0.880144 -0.401503 -0.253261 N1 0.947588 3.02585e-15 -0.319493 N2 0.787582 4.30265e-15 -0.61621 + txt003 +STRI + V0 2.9662 0 2.15208 V1 2.93534 -0.116821 2.15738 V2 2.7716 -0.148457 1.83128 + N0 0.787582 4.30265e-15 -0.61621 N1 0.70819 -0.492319 -0.506053 N2 0.880144 -0.401503 -0.253261 + txt003 +STRI + V0 2.54954 0 2.22361 V1 2.5804 -0.116821 2.21831 V2 2.74444 -0.104167 2.4 + N0 -0.874591 0 0.484861 N1 -0.723795 -0.498863 0.476715 N2 -0.497164 -0.497164 0.711095 + txt003 +STRI + V0 2.74444 -0.104167 2.4 V1 2.7 0 2.4 V2 2.54954 0 2.22361 + N0 -0.497164 -0.497164 0.711095 N1 -0.6 0 0.8 N2 -0.874591 0 0.484861 + txt003 +STRI + V0 2.5804 -0.116821 2.21831 V1 2.65756 -0.186914 2.20507 V2 2.85556 -0.166667 2.4 + N0 -0.723795 -0.498863 0.476715 N1 -0.365378 -0.851743 0.375544 N2 -0.267368 -0.855576 0.443288 + txt003 +STRI + V0 2.85556 -0.166667 2.4 V1 2.74444 -0.104167 2.4 V2 2.5804 -0.116821 2.21831 + N0 -0.267368 -0.855576 0.443288 N1 -0.497164 -0.497164 0.711095 N2 -0.723795 -0.498863 0.476715 + txt003 +STRI + V0 2.65756 -0.186914 2.20507 V1 2.75787 -0.210278 2.18785 V2 3 -0.1875 2.4 + N0 -0.365378 -0.851743 0.375544 N1 0.0260102 -0.988113 0.151516 N2 0 -1 2.19303e-16 + txt003 +STRI + V0 3 -0.1875 2.4 V1 2.85556 -0.166667 2.4 V2 2.65756 -0.186914 2.20507 + N0 0 -1 2.19303e-16 N1 -0.267368 -0.855576 0.443288 N2 -0.365378 -0.851743 0.375544 + txt003 +STRI + V0 2.75787 -0.210278 2.18785 V1 2.85818 -0.186914 2.17063 V2 3.14444 -0.166667 2.4 + N0 0.0260102 -0.988113 0.151516 N1 0.417243 -0.88974 -0.185122 N2 0.250514 -0.801644 -0.54278 + txt003 +STRI + V0 3.14444 -0.166667 2.4 V1 3 -0.1875 2.4 V2 2.75787 -0.210278 2.18785 + N0 0.250514 -0.801644 -0.54278 N1 0 -1 2.19303e-16 N2 0.0260102 -0.988113 0.151516 + txt003 +STRI + V0 2.85818 -0.186914 2.17063 V1 2.93534 -0.116821 2.15738 V2 3.25556 -0.104167 2.4 + N0 0.417243 -0.88974 -0.185122 N1 0.70819 -0.492319 -0.506053 N2 0.366221 -0.366221 -0.855433 + txt003 +STRI + V0 3.25556 -0.104167 2.4 V1 3.14444 -0.166667 2.4 V2 2.85818 -0.186914 2.17063 + N0 0.366221 -0.366221 -0.855433 N1 0.250514 -0.801644 -0.54278 N2 0.417243 -0.88974 -0.185122 + txt003 +STRI + V0 2.93534 -0.116821 2.15738 V1 2.9662 0 2.15208 V2 3.3 0 2.4 + N0 0.70819 -0.492319 -0.506053 N1 0.787582 4.30265e-15 -0.61621 N2 0.384615 6.46776e-15 -0.923077 + txt003 +STRI + V0 3.3 0 2.4 V1 3.25556 -0.104167 2.4 V2 2.93534 -0.116821 2.15738 + N0 0.384615 6.46776e-15 -0.923077 N1 0.366221 -0.366221 -0.855433 N2 0.70819 -0.492319 -0.506053 + txt003 +STRI + V0 1.7 0 0.6 V1 1.7 0.275 0.661111 V2 2.22855 0.262346 0.8366 + N0 0.158678 0 -0.98733 N1 0.134339 0.457747 -0.878875 N2 0.492146 0.41068 -0.767551 + txt003 +STRI + V0 2.22855 0.262346 0.8366 V1 2.24213 0 0.785417 V2 1.7 0 0.6 + N0 0.492146 0.41068 -0.767551 N1 0.528678 0 -0.848822 N2 0.158678 0 -0.98733 + txt003 +STRI + V0 1.7 0.275 0.661111 V1 1.7 0.44 0.813889 V2 2.1946 0.419753 0.964558 + N0 0.134339 0.457747 -0.878875 N1 0.0673462 0.855546 -0.513328 N2 0.348602 0.814337 -0.464038 + txt003 +STRI + V0 2.1946 0.419753 0.964558 V1 2.22855 0.262346 0.8366 V2 1.7 0.275 0.661111 + N0 0.348602 0.814337 -0.464038 N1 0.492146 0.41068 -0.767551 N2 0.134339 0.457747 -0.878875 + txt003 +STRI + V0 1.7 0.44 0.813889 V1 1.7 0.495 1.0125 V2 2.15046 0.472222 1.1309 + N0 0.0673462 0.855546 -0.513328 N1 0 1 -0 N2 0.110195 0.99348 0.0292376 + txt003 +STRI + V0 2.15046 0.472222 1.1309 V1 2.1946 0.419753 0.964558 V2 1.7 0.44 0.813889 + N0 0.110195 0.99348 0.0292376 N1 0.348602 0.814337 -0.464038 N2 0.0673462 0.855546 -0.513328 + txt003 +STRI + V0 1.7 0.495 1.0125 V1 1.7 0.44 1.21111 V2 2.10633 0.419753 1.29725 + N0 0 1 -0 N1 -0.0291362 0.857129 0.514277 N2 -0.135104 0.834377 0.534381 + txt003 +STRI + V0 2.10633 0.419753 1.29725 V1 2.15046 0.472222 1.1309 V2 1.7 0.495 1.0125 + N0 -0.135104 0.834377 0.534381 N1 0.110195 0.99348 0.0292376 N2 0 1 -0 + txt003 +STRI + V0 1.7 0.44 1.21111 V1 1.7 0.275 1.36389 V2 2.07238 0.262346 1.42521 + N0 -0.0291362 0.857129 0.514277 N1 -0.0157732 0.461877 0.886804 N2 -0.291732 0.426807 0.855995 + txt003 +STRI + V0 2.07238 0.262346 1.42521 V1 2.10633 0.419753 1.29725 V2 1.7 0.44 1.21111 + N0 -0.291732 0.426807 0.855995 N1 -0.135104 0.834377 0.534381 N2 -0.0291362 0.857129 0.514277 + txt003 +STRI + V0 1.7 0.275 1.36389 V1 1.7 0 1.425 V2 2.0588 0 1.47639 + N0 -0.0157732 0.461877 0.886804 N1 0 -4.48575e-16 1 N2 -0.333935 -3.25455e-16 0.942596 + txt003 +STRI + V0 2.0588 0 1.47639 V1 2.07238 0.262346 1.42521 V2 1.7 0.275 1.36389 + N0 -0.333935 -3.25455e-16 0.942596 N1 -0.291732 0.426807 0.855995 N2 -0.0157732 0.461877 0.886804 + txt003 +STRI + V0 2.24213 0 0.785417 V1 2.22855 0.262346 0.8366 V2 2.51728 0.23071 1.12243 + N0 0.528678 0 -0.848822 N1 0.492146 0.41068 -0.767551 N2 0.813963 0.348056 -0.465103 + txt003 +STRI + V0 2.51728 0.23071 1.12243 V1 2.53704 0 1.08333 V2 2.24213 0 0.785417 + N0 0.813963 0.348056 -0.465103 N1 0.854063 0 -0.52017 N2 0.528678 0 -0.848822 + txt003 +STRI + V0 2.22855 0.262346 0.8366 V1 2.1946 0.419753 0.964558 V2 2.4679 0.369136 1.22016 + N0 0.492146 0.41068 -0.767551 N1 0.348602 0.814337 -0.464038 N2 0.627607 0.733748 -0.260237 + txt003 +STRI + V0 2.4679 0.369136 1.22016 V1 2.51728 0.23071 1.12243 V2 2.22855 0.262346 0.8366 + N0 0.627607 0.733748 -0.260237 N1 0.813963 0.348056 -0.465103 N2 0.492146 0.41068 -0.767551 + txt003 +STRI + V0 2.1946 0.419753 0.964558 V1 2.15046 0.472222 1.1309 V2 2.4037 0.415278 1.34722 + N0 0.348602 0.814337 -0.464038 N1 0.110195 0.99348 0.0292376 N2 0.215359 0.970454 0.108813 + txt003 +STRI + V0 2.4037 0.415278 1.34722 V1 2.4679 0.369136 1.22016 V2 2.1946 0.419753 0.964558 + N0 0.215359 0.970454 0.108813 N1 0.627607 0.733748 -0.260237 N2 0.348602 0.814337 -0.464038 + txt003 +STRI + V0 2.15046 0.472222 1.1309 V1 2.10633 0.419753 1.29725 V2 2.33951 0.369136 1.47428 + N0 0.110195 0.99348 0.0292376 N1 -0.135104 0.834377 0.534381 N2 -0.312511 0.816863 0.484842 + txt003 +STRI + V0 2.33951 0.369136 1.47428 V1 2.4037 0.415278 1.34722 V2 2.15046 0.472222 1.1309 + N0 -0.312511 0.816863 0.484842 N1 0.215359 0.970454 0.108813 N2 0.110195 0.99348 0.0292376 + txt003 +STRI + V0 2.10633 0.419753 1.29725 V1 2.07238 0.262346 1.42521 V2 2.29012 0.23071 1.57202 + N0 -0.135104 0.834377 0.534381 N1 -0.291732 0.426807 0.855995 N2 -0.64585 0.390219 0.656206 + txt003 +STRI + V0 2.29012 0.23071 1.57202 V1 2.33951 0.369136 1.47428 V2 2.10633 0.419753 1.29725 + N0 -0.64585 0.390219 0.656206 N1 -0.312511 0.816863 0.484842 N2 -0.135104 0.834377 0.534381 + txt003 +STRI + V0 2.07238 0.262346 1.42521 V1 2.0588 0 1.47639 V2 2.27037 0 1.61111 + N0 -0.291732 0.426807 0.855995 N1 -0.333935 -3.25455e-16 0.942596 N2 -0.731055 -1.69385e-16 0.682318 + txt003 +STRI + V0 2.27037 0 1.61111 V1 2.29012 0.23071 1.57202 V2 2.07238 0.262346 1.42521 + N0 -0.731055 -1.69385e-16 0.682318 N1 -0.64585 0.390219 0.656206 N2 -0.291732 0.426807 0.855995 + txt003 +STRI + V0 2.53704 0 1.08333 V1 2.51728 0.23071 1.12243 V2 2.66528 0.189583 1.47014 + N0 0.854063 0 -0.52017 N1 0.813963 0.348056 -0.465103 N2 0.913262 0.329186 -0.239977 + txt003 +STRI + V0 2.66528 0.189583 1.47014 V1 2.6875 0 1.44375 V2 2.53704 0 1.08333 + N0 0.913262 0.329186 -0.239977 N1 0.957826 0 -0.287348 N2 0.854063 0 -0.52017 + txt003 +STRI + V0 2.51728 0.23071 1.12243 V1 2.4679 0.369136 1.22016 V2 2.60972 0.303333 1.53611 + N0 0.813963 0.348056 -0.465103 N1 0.627607 0.733748 -0.260237 N2 0.705424 0.704198 -0.0805066 + txt003 +STRI + V0 2.60972 0.303333 1.53611 V1 2.66528 0.189583 1.47014 V2 2.51728 0.23071 1.12243 + N0 0.705424 0.704198 -0.0805066 N1 0.913262 0.329186 -0.239977 N2 0.813963 0.348056 -0.465103 + txt003 +STRI + V0 2.4679 0.369136 1.22016 V1 2.4037 0.415278 1.34722 V2 2.5375 0.34125 1.62188 + N0 0.627607 0.733748 -0.260237 N1 0.215359 0.970454 0.108813 N2 0.214084 0.960035 0.180281 + txt003 +STRI + V0 2.5375 0.34125 1.62188 V1 2.60972 0.303333 1.53611 V2 2.4679 0.369136 1.22016 + N0 0.214084 0.960035 0.180281 N1 0.705424 0.704198 -0.0805066 N2 0.627607 0.733748 -0.260237 + txt003 +STRI + V0 2.4037 0.415278 1.34722 V1 2.33951 0.369136 1.47428 V2 2.46528 0.303333 1.70764 + N0 0.215359 0.970454 0.108813 N1 -0.312511 0.816863 0.484842 N2 -0.451323 0.803033 0.38916 + txt003 +STRI + V0 2.46528 0.303333 1.70764 V1 2.5375 0.34125 1.62188 V2 2.4037 0.415278 1.34722 + N0 -0.451323 0.803033 0.38916 N1 0.214084 0.960035 0.180281 N2 0.215359 0.970454 0.108813 + txt003 +STRI + V0 2.33951 0.369136 1.47428 V1 2.29012 0.23071 1.57202 V2 2.40972 0.189583 1.77361 + N0 -0.312511 0.816863 0.484842 N1 -0.64585 0.390219 0.656206 N2 -0.835237 0.363942 0.412221 + txt003 +STRI + V0 2.40972 0.189583 1.77361 V1 2.46528 0.303333 1.70764 V2 2.33951 0.369136 1.47428 + N0 -0.835237 0.363942 0.412221 N1 -0.451323 0.803033 0.38916 N2 -0.312511 0.816863 0.484842 + txt003 +STRI + V0 2.29012 0.23071 1.57202 V1 2.27037 0 1.61111 V2 2.3875 0 1.8 + N0 -0.64585 0.390219 0.656206 N1 -0.731055 -1.69385e-16 0.682318 N2 -0.920582 -2.76813e-16 0.39055 + txt003 +STRI + V0 2.3875 0 1.8 V1 2.40972 0.189583 1.77361 V2 2.29012 0.23071 1.57202 + N0 -0.920582 -2.76813e-16 0.39055 N1 -0.835237 0.363942 0.412221 N2 -0.64585 0.390219 0.656206 + txt003 +STRI + V0 2.6875 0 1.44375 V1 2.66528 0.189583 1.47014 V2 2.7716 0.148457 1.83128 + N0 0.957826 0 -0.287348 N1 0.913262 0.329186 -0.239977 N2 0.880144 0.401503 -0.253261 + txt003 +STRI + V0 2.7716 0.148457 1.83128 V1 2.7963 0 1.81667 V2 2.6875 0 1.44375 + N0 0.880144 0.401503 -0.253261 N1 0.947588 0 -0.319493 N2 0.957826 0 -0.287348 + txt003 +STRI + V0 2.66528 0.189583 1.47014 V1 2.60972 0.303333 1.53611 V2 2.70988 0.237531 1.8678 + N0 0.913262 0.329186 -0.239977 N1 0.705424 0.704198 -0.0805066 N2 0.60461 0.794635 -0.0547983 + txt003 +STRI + V0 2.70988 0.237531 1.8678 V1 2.7716 0.148457 1.83128 V2 2.66528 0.189583 1.47014 + N0 0.60461 0.794635 -0.0547983 N1 0.880144 0.401503 -0.253261 N2 0.913262 0.329186 -0.239977 + txt003 +STRI + V0 2.60972 0.303333 1.53611 V1 2.5375 0.34125 1.62188 V2 2.62963 0.267222 1.91528 + N0 0.705424 0.704198 -0.0805066 N1 0.214084 0.960035 0.180281 N2 0.113546 0.974822 0.191909 + txt003 +STRI + V0 2.62963 0.267222 1.91528 V1 2.70988 0.237531 1.8678 V2 2.60972 0.303333 1.53611 + N0 0.113546 0.974822 0.191909 N1 0.60461 0.794635 -0.0547983 N2 0.705424 0.704198 -0.0805066 + txt003 +STRI + V0 2.5375 0.34125 1.62188 V1 2.46528 0.303333 1.70764 V2 2.54938 0.237531 1.96276 + N0 0.214084 0.960035 0.180281 N1 -0.451323 0.803033 0.38916 N2 -0.452673 0.821162 0.347535 + txt003 +STRI + V0 2.54938 0.237531 1.96276 V1 2.62963 0.267222 1.91528 V2 2.5375 0.34125 1.62188 + N0 -0.452673 0.821162 0.347535 N1 0.113546 0.974822 0.191909 N2 0.214084 0.960035 0.180281 + txt003 +STRI + V0 2.46528 0.303333 1.70764 V1 2.40972 0.189583 1.77361 V2 2.48765 0.148457 1.99928 + N0 -0.451323 0.803033 0.38916 N1 -0.835237 0.363942 0.412221 N2 -0.842821 0.409176 0.34961 + txt003 +STRI + V0 2.48765 0.148457 1.99928 V1 2.54938 0.237531 1.96276 V2 2.46528 0.303333 1.70764 + N0 -0.842821 0.409176 0.34961 N1 -0.452673 0.821162 0.347535 N2 -0.451323 0.803033 0.38916 + txt003 +STRI + V0 2.40972 0.189583 1.77361 V1 2.3875 0 1.8 V2 2.46296 0 2.01389 + N0 -0.835237 0.363942 0.412221 N1 -0.920582 -2.76813e-16 0.39055 N2 -0.948683 -4.59839e-16 0.316228 + txt003 +STRI + V0 2.46296 0 2.01389 V1 2.48765 0.148457 1.99928 V2 2.40972 0.189583 1.77361 + N0 -0.948683 -4.59839e-16 0.316228 N1 -0.842821 0.409176 0.34961 N2 -0.835237 0.363942 0.412221 + txt003 +STRI + V0 2.7963 0 1.81667 V1 2.7716 0.148457 1.83128 V2 2.93534 0.116821 2.15738 + N0 0.947588 0 -0.319493 N1 0.880144 0.401503 -0.253261 N2 0.70819 0.492319 -0.506053 + txt003 +STRI + V0 2.93534 0.116821 2.15738 V1 2.9662 0 2.15208 V2 2.7963 0 1.81667 + N0 0.70819 0.492319 -0.506053 N1 0.787582 0 -0.61621 N2 0.947588 0 -0.319493 + txt003 +STRI + V0 2.7716 0.148457 1.83128 V1 2.70988 0.237531 1.8678 V2 2.85818 0.186914 2.17063 + N0 0.880144 0.401503 -0.253261 N1 0.60461 0.794635 -0.0547983 N2 0.417243 0.88974 -0.185122 + txt003 +STRI + V0 2.85818 0.186914 2.17063 V1 2.93534 0.116821 2.15738 V2 2.7716 0.148457 1.83128 + N0 0.417243 0.88974 -0.185122 N1 0.70819 0.492319 -0.506053 N2 0.880144 0.401503 -0.253261 + txt003 +STRI + V0 2.70988 0.237531 1.8678 V1 2.62963 0.267222 1.91528 V2 2.75787 0.210278 2.18785 + N0 0.60461 0.794635 -0.0547983 N1 0.113546 0.974822 0.191909 N2 0.0260102 0.988113 0.151516 + txt003 +STRI + V0 2.75787 0.210278 2.18785 V1 2.85818 0.186914 2.17063 V2 2.70988 0.237531 1.8678 + N0 0.0260102 0.988113 0.151516 N1 0.417243 0.88974 -0.185122 N2 0.60461 0.794635 -0.0547983 + txt003 +STRI + V0 2.62963 0.267222 1.91528 V1 2.54938 0.237531 1.96276 V2 2.65756 0.186914 2.20507 + N0 0.113546 0.974822 0.191909 N1 -0.452673 0.821162 0.347535 N2 -0.365378 0.851743 0.375544 + txt003 +STRI + V0 2.65756 0.186914 2.20507 V1 2.75787 0.210278 2.18785 V2 2.62963 0.267222 1.91528 + N0 -0.365378 0.851743 0.375544 N1 0.0260102 0.988113 0.151516 N2 0.113546 0.974822 0.191909 + txt003 +STRI + V0 2.54938 0.237531 1.96276 V1 2.48765 0.148457 1.99928 V2 2.5804 0.116821 2.21831 + N0 -0.452673 0.821162 0.347535 N1 -0.842821 0.409176 0.34961 N2 -0.723795 0.498863 0.476715 + txt003 +STRI + V0 2.5804 0.116821 2.21831 V1 2.65756 0.186914 2.20507 V2 2.54938 0.237531 1.96276 + N0 -0.723795 0.498863 0.476715 N1 -0.365378 0.851743 0.375544 N2 -0.452673 0.821162 0.347535 + txt003 +STRI + V0 2.48765 0.148457 1.99928 V1 2.46296 0 2.01389 V2 2.54954 0 2.22361 + N0 -0.842821 0.409176 0.34961 N1 -0.948683 -4.59839e-16 0.316228 N2 -0.874591 -1.30753e-15 0.484861 + txt003 +STRI + V0 2.54954 0 2.22361 V1 2.5804 0.116821 2.21831 V2 2.48765 0.148457 1.99928 + N0 -0.874591 -1.30753e-15 0.484861 N1 -0.723795 0.498863 0.476715 N2 -0.842821 0.409176 0.34961 + txt003 +STRI + V0 2.9662 0 2.15208 V1 2.93534 0.116821 2.15738 V2 3.25556 0.104167 2.4 + N0 0.787582 0 -0.61621 N1 0.70819 0.492319 -0.506053 N2 0.366221 0.366221 -0.855433 + txt003 +STRI + V0 3.25556 0.104167 2.4 V1 3.3 0 2.4 V2 2.9662 0 2.15208 + N0 0.366221 0.366221 -0.855433 N1 0.384615 0 -0.923077 N2 0.787582 0 -0.61621 + txt003 +STRI + V0 2.93534 0.116821 2.15738 V1 2.85818 0.186914 2.17063 V2 3.14444 0.166667 2.4 + N0 0.70819 0.492319 -0.506053 N1 0.417243 0.88974 -0.185122 N2 0.250514 0.801644 -0.54278 + txt003 +STRI + V0 3.14444 0.166667 2.4 V1 3.25556 0.104167 2.4 V2 2.93534 0.116821 2.15738 + N0 0.250514 0.801644 -0.54278 N1 0.366221 0.366221 -0.855433 N2 0.70819 0.492319 -0.506053 + txt003 +STRI + V0 2.85818 0.186914 2.17063 V1 2.75787 0.210278 2.18785 V2 3 0.1875 2.4 + N0 0.417243 0.88974 -0.185122 N1 0.0260102 0.988113 0.151516 N2 4.05793e-32 1 2.19303e-16 + txt003 +STRI + V0 3 0.1875 2.4 V1 3.14444 0.166667 2.4 V2 2.85818 0.186914 2.17063 + N0 4.05793e-32 1 2.19303e-16 N1 0.250514 0.801644 -0.54278 N2 0.417243 0.88974 -0.185122 + txt003 +STRI + V0 2.75787 0.210278 2.18785 V1 2.65756 0.186914 2.20507 V2 2.85556 0.166667 2.4 + N0 0.0260102 0.988113 0.151516 N1 -0.365378 0.851743 0.375544 N2 -0.267368 0.855576 0.443288 + txt003 +STRI + V0 2.85556 0.166667 2.4 V1 3 0.1875 2.4 V2 2.75787 0.210278 2.18785 + N0 -0.267368 0.855576 0.443288 N1 4.05793e-32 1 2.19303e-16 N2 0.0260102 0.988113 0.151516 + txt003 +STRI + V0 2.65756 0.186914 2.20507 V1 2.5804 0.116821 2.21831 V2 2.74444 0.104167 2.4 + N0 -0.365378 0.851743 0.375544 N1 -0.723795 0.498863 0.476715 N2 -0.497164 0.497164 0.711095 + txt003 +STRI + V0 2.74444 0.104167 2.4 V1 2.85556 0.166667 2.4 V2 2.65756 0.186914 2.20507 + N0 -0.497164 0.497164 0.711095 N1 -0.267368 0.855576 0.443288 N2 -0.365378 0.851743 0.375544 + txt003 +STRI + V0 2.5804 0.116821 2.21831 V1 2.54954 0 2.22361 V2 2.7 0 2.4 + N0 -0.723795 0.498863 0.476715 N1 -0.874591 -1.30753e-15 0.484861 N2 -0.6 -3.55271e-15 0.8 + txt003 +STRI + V0 2.7 0 2.4 V1 2.74444 0.104167 2.4 V2 2.5804 0.116821 2.21831 + N0 -0.6 -3.55271e-15 0.8 N1 -0.497164 0.497164 0.711095 N2 -0.723795 0.498863 0.476715 + txt003 +STRI + V0 2.7 0 2.4 V1 2.74444 -0.104167 2.4 V2 2.79641 -0.10108 2.43193 + N0 -0.6 0 0.8 N1 -0.497164 -0.497164 0.711095 N2 -0.387052 -0.411886 0.824949 + txt003 +STRI + V0 2.79641 -0.10108 2.43193 V1 2.74907 0 2.43125 V2 2.7 0 2.4 + N0 -0.387052 -0.411886 0.824949 N1 -0.467888 0 0.883788 N2 -0.6 0 0.8 + txt003 +STRI + V0 2.74444 -0.104167 2.4 V1 2.85556 -0.166667 2.4 V2 2.91474 -0.161728 2.43361 + N0 -0.497164 -0.497164 0.711095 N1 -0.267368 -0.855576 0.443288 N2 -0.215548 -0.724209 0.655027 + txt003 +STRI + V0 2.91474 -0.161728 2.43361 V1 2.79641 -0.10108 2.43193 V2 2.74444 -0.104167 2.4 + N0 -0.215548 -0.724209 0.655027 N1 -0.387052 -0.411886 0.824949 N2 -0.497164 -0.497164 0.711095 + txt003 +STRI + V0 2.85556 -0.166667 2.4 V1 3 -0.1875 2.4 V2 3.06858 -0.181944 2.43581 + N0 -0.267368 -0.855576 0.443288 N1 0 -1 0 N2 -0.00489618 -0.939227 0.343261 + txt003 +STRI + V0 3.06858 -0.181944 2.43581 V1 2.91474 -0.161728 2.43361 V2 2.85556 -0.166667 2.4 + N0 -0.00489618 -0.939227 0.343261 N1 -0.215548 -0.724209 0.655027 N2 -0.267368 -0.855576 0.443288 + txt003 +STRI + V0 3 -0.1875 2.4 V1 3.14444 -0.166667 2.4 V2 3.22241 -0.161728 2.438 + N0 0 -1 0 N1 0.250514 -0.801644 -0.54278 N2 0.269127 -0.933284 -0.237808 + txt003 +STRI + V0 3.22241 -0.161728 2.438 V1 3.06858 -0.181944 2.43581 V2 3 -0.1875 2.4 + N0 0.269127 -0.933284 -0.237808 N1 -0.00489618 -0.939227 0.343261 N2 0 -1 0 + txt003 +STRI + V0 3.14444 -0.166667 2.4 V1 3.25556 -0.104167 2.4 V2 3.34075 -0.10108 2.43969 + N0 0.250514 -0.801644 -0.54278 N1 0.366221 -0.366221 -0.855433 N2 0.442187 -0.473386 -0.761824 + txt003 +STRI + V0 3.34075 -0.10108 2.43969 V1 3.22241 -0.161728 2.438 V2 3.14444 -0.166667 2.4 + N0 0.442187 -0.473386 -0.761824 N1 0.269127 -0.933284 -0.237808 N2 0.250514 -0.801644 -0.54278 + txt003 +STRI + V0 3.25556 -0.104167 2.4 V1 3.3 0 2.4 V2 3.38808 0 2.44036 + N0 0.366221 -0.366221 -0.855433 N1 0.384615 -2.55067e-15 -0.923077 N2 0.463425 -2.75328e-15 -0.886136 + txt003 +STRI + V0 3.38808 0 2.44036 V1 3.34075 -0.10108 2.43969 V2 3.25556 -0.104167 2.4 + N0 0.463425 -2.75328e-15 -0.886136 N1 0.442187 -0.473386 -0.761824 N2 0.366221 -0.366221 -0.855433 + txt003 +STRI + V0 2.74907 0 2.43125 V1 2.79641 -0.10108 2.43193 V2 2.83978 -0.0933642 2.45123 + N0 -0.467888 0 0.883788 N1 -0.387052 -0.411886 0.824949 N2 -0.253997 -0.272114 0.928138 + txt003 +STRI + V0 2.83978 -0.0933642 2.45123 V1 2.79259 0 2.45 V2 2.74907 0 2.43125 + N0 -0.253997 -0.272114 0.928138 N1 -0.306009 0 0.952029 N2 -0.467888 0 0.883788 + txt003 +STRI + V0 2.79641 -0.10108 2.43193 V1 2.91474 -0.161728 2.43361 V2 2.95775 -0.149383 2.45432 + N0 -0.387052 -0.411886 0.824949 N1 -0.215548 -0.724209 0.655027 N2 -0.14959 -0.481391 0.863647 + txt003 +STRI + V0 2.95775 -0.149383 2.45432 V1 2.83978 -0.0933642 2.45123 V2 2.79641 -0.10108 2.43193 + N0 -0.14959 -0.481391 0.863647 N1 -0.253997 -0.272114 0.928138 N2 -0.387052 -0.411886 0.824949 + txt003 +STRI + V0 2.91474 -0.161728 2.43361 V1 3.06858 -0.181944 2.43581 V2 3.11111 -0.168056 2.45833 + N0 -0.215548 -0.724209 0.655027 N1 -0.00489618 -0.939227 0.343261 N2 -0.0195232 -0.665415 0.746219 + txt003 +STRI + V0 3.11111 -0.168056 2.45833 V1 2.95775 -0.149383 2.45432 V2 2.91474 -0.161728 2.43361 + N0 -0.0195232 -0.665415 0.746219 N1 -0.14959 -0.481391 0.863647 N2 -0.215548 -0.724209 0.655027 + txt003 +STRI + V0 3.06858 -0.181944 2.43581 V1 3.22241 -0.161728 2.438 V2 3.26447 -0.149383 2.46235 + N0 -0.00489618 -0.939227 0.343261 N1 0.269127 -0.933284 -0.237808 N2 0.218115 -0.87054 0.44112 + txt003 +STRI + V0 3.26447 -0.149383 2.46235 V1 3.11111 -0.168056 2.45833 V2 3.06858 -0.181944 2.43581 + N0 0.218115 -0.87054 0.44112 N1 -0.0195232 -0.665415 0.746219 N2 -0.00489618 -0.939227 0.343261 + txt003 +STRI + V0 3.22241 -0.161728 2.438 V1 3.34075 -0.10108 2.43969 V2 3.38244 -0.0933642 2.46543 + N0 0.269127 -0.933284 -0.237808 N1 0.442187 -0.473386 -0.761824 N2 0.612385 -0.714958 -0.337372 + txt003 +STRI + V0 3.38244 -0.0933642 2.46543 V1 3.26447 -0.149383 2.46235 V2 3.22241 -0.161728 2.438 + N0 0.612385 -0.714958 -0.337372 N1 0.218115 -0.87054 0.44112 N2 0.269127 -0.933284 -0.237808 + txt003 +STRI + V0 3.34075 -0.10108 2.43969 V1 3.38808 0 2.44036 V2 3.42963 0 2.46667 + N0 0.442187 -0.473386 -0.761824 N1 0.463425 -2.75328e-15 -0.886136 N2 0.694136 -3.24605e-15 -0.719844 + txt003 +STRI + V0 3.42963 0 2.46667 V1 3.38244 -0.0933642 2.46543 V2 3.34075 -0.10108 2.43969 + N0 0.694136 -3.24605e-15 -0.719844 N1 0.612385 -0.714958 -0.337372 N2 0.442187 -0.473386 -0.761824 + txt003 +STRI + V0 2.79259 0 2.45 V1 2.83978 -0.0933642 2.45123 V2 2.86968 -0.0833333 2.45781 + N0 -0.306009 0 0.952029 N1 -0.253997 -0.272114 0.928138 N2 -0.0182321 0.0210195 0.999613 + txt003 +STRI + V0 2.86968 -0.0833333 2.45781 V1 2.825 0 2.45625 V2 2.79259 0 2.45 + N0 -0.0182321 0.0210195 0.999613 N1 2.22045e-15 0 1 N2 -0.306009 0 0.952029 + txt003 +STRI + V0 2.83978 -0.0933642 2.45123 V1 2.95775 -0.149383 2.45432 V2 2.98137 -0.133333 2.46172 + N0 -0.253997 -0.272114 0.928138 N1 -0.14959 -0.481391 0.863647 N2 -0.0369301 -0.00796532 0.999286 + txt003 +STRI + V0 2.98137 -0.133333 2.46172 V1 2.86968 -0.0833333 2.45781 V2 2.83978 -0.0933642 2.45123 + N0 -0.0369301 -0.00796532 0.999286 N1 -0.0182321 0.0210195 0.999613 N2 -0.253997 -0.272114 0.928138 + txt003 +STRI + V0 2.95775 -0.149383 2.45432 V1 3.11111 -0.168056 2.45833 V2 3.12656 -0.15 2.4668 + N0 -0.14959 -0.481391 0.863647 N1 -0.0195232 -0.665415 0.746219 N2 -0.0348909 -0.0594438 0.997622 + txt003 +STRI + V0 3.12656 -0.15 2.4668 V1 2.98137 -0.133333 2.46172 V2 2.95775 -0.149383 2.45432 + N0 -0.0348909 -0.0594438 0.997622 N1 -0.0369301 -0.00796532 0.999286 N2 -0.14959 -0.481391 0.863647 + txt003 +STRI + V0 3.11111 -0.168056 2.45833 V1 3.26447 -0.149383 2.46235 V2 3.27176 -0.133333 2.47187 + N0 -0.0195232 -0.665415 0.746219 N1 0.218115 -0.87054 0.44112 N2 -0.00787186 -0.108144 0.994104 + txt003 +STRI + V0 3.27176 -0.133333 2.47187 V1 3.12656 -0.15 2.4668 V2 3.11111 -0.168056 2.45833 + N0 -0.00787186 -0.108144 0.994104 N1 -0.0348909 -0.0594438 0.997622 N2 -0.0195232 -0.665415 0.746219 + txt003 +STRI + V0 3.26447 -0.149383 2.46235 V1 3.38244 -0.0933642 2.46543 V2 3.38345 -0.0833333 2.47578 + N0 0.218115 -0.87054 0.44112 N1 0.612385 -0.714958 -0.337372 N2 0.0539577 -0.111406 0.992309 + txt003 +STRI + V0 3.38345 -0.0833333 2.47578 V1 3.27176 -0.133333 2.47187 V2 3.26447 -0.149383 2.46235 + N0 0.0539577 -0.111406 0.992309 N1 -0.00787186 -0.108144 0.994104 N2 0.218115 -0.87054 0.44112 + txt003 +STRI + V0 3.38244 -0.0933642 2.46543 V1 3.42963 0 2.46667 V2 3.42813 0 2.47734 + N0 0.612385 -0.714958 -0.337372 N1 0.694136 -3.24605e-15 -0.719844 N2 0.106533 1.89241e-15 0.994309 + txt003 +STRI + V0 3.42813 0 2.47734 V1 3.38345 -0.0833333 2.47578 V2 3.38244 -0.0933642 2.46543 + N0 0.106533 1.89241e-15 0.994309 N1 0.0539577 -0.111406 0.992309 N2 0.612385 -0.714958 -0.337372 + txt003 +STRI + V0 2.825 0 2.45625 V1 2.86968 -0.0833333 2.45781 V2 2.88121 -0.0733025 2.45154 + N0 2.22045e-15 0 1 N1 -0.0182321 0.0210195 0.999613 N2 0.507715 0.682832 0.525324 + txt003 +STRI + V0 2.88121 -0.0733025 2.45154 V1 2.84074 0 2.45 V2 2.825 0 2.45625 + N0 0.507715 0.682832 0.525324 N1 0.913812 0 0.406138 N2 2.22045e-15 0 1 + txt003 +STRI + V0 2.86968 -0.0833333 2.45781 V1 2.98137 -0.133333 2.46172 V2 2.98237 -0.117284 2.4554 + N0 -0.0182321 0.0210195 0.999613 N1 -0.0369301 -0.00796532 0.999286 N2 0.148477 0.721529 0.676277 + txt003 +STRI + V0 2.98237 -0.117284 2.4554 V1 2.88121 -0.0733025 2.45154 V2 2.86968 -0.0833333 2.45781 + N0 0.148477 0.721529 0.676277 N1 0.507715 0.682832 0.525324 N2 -0.0182321 0.0210195 0.999613 + txt003 +STRI + V0 2.98137 -0.133333 2.46172 V1 3.12656 -0.15 2.4668 V2 3.11389 -0.131944 2.46042 + N0 -0.0369301 -0.00796532 0.999286 N1 -0.0348909 -0.0594438 0.997622 N2 -0.0300305 0.615625 0.787467 + txt003 +STRI + V0 3.11389 -0.131944 2.46042 V1 2.98237 -0.117284 2.4554 V2 2.98137 -0.133333 2.46172 + N0 -0.0300305 0.615625 0.787467 N1 0.148477 0.721529 0.676277 N2 -0.0369301 -0.00796532 0.999286 + txt003 +STRI + V0 3.12656 -0.15 2.4668 V1 3.27176 -0.133333 2.47187 V2 3.2454 -0.117284 2.46543 + N0 -0.0348909 -0.0594438 0.997622 N1 -0.00787186 -0.108144 0.994104 N2 -0.144371 0.459364 0.876437 + txt003 +STRI + V0 3.2454 -0.117284 2.46543 V1 3.11389 -0.131944 2.46042 V2 3.12656 -0.15 2.4668 + N0 -0.144371 0.459364 0.876437 N1 -0.0300305 0.615625 0.787467 N2 -0.0348909 -0.0594438 0.997622 + txt003 +STRI + V0 3.27176 -0.133333 2.47187 V1 3.38345 -0.0833333 2.47578 V2 3.34657 -0.0733025 2.46929 + N0 -0.00787186 -0.108144 0.994104 N1 0.0539577 -0.111406 0.992309 N2 -0.223743 0.242919 0.943891 + txt003 +STRI + V0 3.34657 -0.0733025 2.46929 V1 3.2454 -0.117284 2.46543 V2 3.27176 -0.133333 2.47187 + N0 -0.223743 0.242919 0.943891 N1 -0.144371 0.459364 0.876437 N2 -0.00787186 -0.108144 0.994104 + txt003 +STRI + V0 3.38345 -0.0833333 2.47578 V1 3.42813 0 2.47734 V2 3.38704 0 2.47083 + N0 0.0539577 -0.111406 0.992309 N1 0.106533 1.89241e-15 0.994309 N2 -0.253109 3.19224e-15 0.967438 + txt003 +STRI + V0 3.38704 0 2.47083 V1 3.34657 -0.0733025 2.46929 V2 3.38345 -0.0833333 2.47578 + N0 -0.253109 3.19224e-15 0.967438 N1 -0.223743 0.242919 0.943891 N2 0.0539577 -0.111406 0.992309 + txt003 +STRI + V0 2.84074 0 2.45 V1 2.88121 -0.0733025 2.45154 V2 2.86949 -0.0655864 2.43231 + N0 0.913812 0 0.406138 N1 0.507715 0.682832 0.525324 N2 0.577416 0.711734 -0.400031 + txt003 +STRI + V0 2.86949 -0.0655864 2.43231 V1 2.83426 0 2.43125 V2 2.84074 0 2.45 + N0 0.577416 0.711734 -0.400031 N1 0.789352 0 -0.613941 N2 0.913812 0 0.406138 + txt003 +STRI + V0 2.88121 -0.0733025 2.45154 V1 2.98237 -0.117284 2.4554 V2 2.95756 -0.104938 2.43496 + N0 0.507715 0.682832 0.525324 N1 0.148477 0.721529 0.676277 N2 0.241288 0.970358 -0.0136399 + txt003 +STRI + V0 2.95756 -0.104938 2.43496 V1 2.86949 -0.0655864 2.43231 V2 2.88121 -0.0733025 2.45154 + N0 0.241288 0.970358 -0.0136399 N1 0.577416 0.711734 -0.400031 N2 0.507715 0.682832 0.525324 + txt003 +STRI + V0 2.98237 -0.117284 2.4554 V1 3.11389 -0.131944 2.46042 V2 3.07205 -0.118056 2.43841 + N0 0.148477 0.721529 0.676277 N1 -0.0300305 0.615625 0.787467 N2 -0.0103804 0.938666 0.344672 + txt003 +STRI + V0 3.07205 -0.118056 2.43841 V1 2.95756 -0.104938 2.43496 V2 2.98237 -0.117284 2.4554 + N0 -0.0103804 0.938666 0.344672 N1 0.241288 0.970358 -0.0136399 N2 0.148477 0.721529 0.676277 + txt003 +STRI + V0 3.11389 -0.131944 2.46042 V1 3.2454 -0.117284 2.46543 V2 3.18654 -0.104938 2.44186 + N0 -0.0300305 0.615625 0.787467 N1 -0.144371 0.459364 0.876437 N2 -0.199105 0.721639 0.663019 + txt003 +STRI + V0 3.18654 -0.104938 2.44186 V1 3.07205 -0.118056 2.43841 V2 3.11389 -0.131944 2.46042 + N0 -0.199105 0.721639 0.663019 N1 -0.0103804 0.938666 0.344672 N2 -0.0300305 0.615625 0.787467 + txt003 +STRI + V0 3.2454 -0.117284 2.46543 V1 3.34657 -0.0733025 2.46929 V2 3.27461 -0.0655864 2.44451 + N0 -0.144371 0.459364 0.876437 N1 -0.223743 0.242919 0.943891 N2 -0.316294 0.364979 0.875641 + txt003 +STRI + V0 3.27461 -0.0655864 2.44451 V1 3.18654 -0.104938 2.44186 V2 3.2454 -0.117284 2.46543 + N0 -0.316294 0.364979 0.875641 N1 -0.199105 0.721639 0.663019 N2 -0.144371 0.459364 0.876437 + txt003 +STRI + V0 3.34657 -0.0733025 2.46929 V1 3.38704 0 2.47083 V2 3.30984 0 2.44557 + N0 -0.223743 0.242919 0.943891 N1 -0.253109 3.19224e-15 0.967438 N2 -0.349987 4.0695e-15 0.936755 + txt003 +STRI + V0 3.30984 0 2.44557 V1 3.27461 -0.0655864 2.44451 V2 3.34657 -0.0733025 2.46929 + N0 -0.349987 4.0695e-15 0.936755 N1 -0.316294 0.364979 0.875641 N2 -0.223743 0.242919 0.943891 + txt003 +STRI + V0 2.83426 0 2.43125 V1 2.86949 -0.0655864 2.43231 V2 2.82963 -0.0625 2.4 + N0 0.789352 0 -0.613941 N1 0.577416 0.711734 -0.400031 N2 0.483629 0.537366 -0.690899 + txt003 +STRI + V0 2.82963 -0.0625 2.4 V1 2.8 0 2.4 V2 2.83426 0 2.43125 + N0 0.483629 0.537366 -0.690899 N1 0.6 0 -0.8 N2 0.789352 0 -0.613941 + txt003 +STRI + V0 2.86949 -0.0655864 2.43231 V1 2.95756 -0.104938 2.43496 V2 2.9037 -0.1 2.4 + N0 0.577416 0.711734 -0.400031 N1 0.241288 0.970358 -0.0136399 N2 0.247465 0.879877 -0.405681 + txt003 +STRI + V0 2.9037 -0.1 2.4 V1 2.82963 -0.0625 2.4 V2 2.86949 -0.0655864 2.43231 + N0 0.247465 0.879877 -0.405681 N1 0.483629 0.537366 -0.690899 N2 0.577416 0.711734 -0.400031 + txt003 +STRI + V0 2.95756 -0.104938 2.43496 V1 3.07205 -0.118056 2.43841 V2 3 -0.1125 2.4 + N0 0.241288 0.970358 -0.0136399 N1 -0.0103804 0.938666 0.344672 N2 0 1 0 + txt003 +STRI + V0 3 -0.1125 2.4 V1 2.9037 -0.1 2.4 V2 2.95756 -0.104938 2.43496 + N0 0 1 0 N1 0.247465 0.879877 -0.405681 N2 0.241288 0.970358 -0.0136399 + txt003 +STRI + V0 3.07205 -0.118056 2.43841 V1 3.18654 -0.104938 2.44186 V2 3.0963 -0.1 2.4 + N0 -0.0103804 0.938666 0.344672 N1 -0.199105 0.721639 0.663019 N2 -0.236617 0.841304 0.486024 + txt003 +STRI + V0 3.0963 -0.1 2.4 V1 3 -0.1125 2.4 V2 3.07205 -0.118056 2.43841 + N0 -0.236617 0.841304 0.486024 N1 0 1 0 N2 -0.0103804 0.938666 0.344672 + txt003 +STRI + V0 3.18654 -0.104938 2.44186 V1 3.27461 -0.0655864 2.44451 V2 3.17037 -0.0625 2.4 + N0 -0.199105 0.721639 0.663019 N1 -0.316294 0.364979 0.875641 N2 -0.378646 0.420717 0.824393 + txt003 +STRI + V0 3.17037 -0.0625 2.4 V1 3.0963 -0.1 2.4 V2 3.18654 -0.104938 2.44186 + N0 -0.378646 0.420717 0.824393 N1 -0.236617 0.841304 0.486024 N2 -0.199105 0.721639 0.663019 + txt003 +STRI + V0 3.27461 -0.0655864 2.44451 V1 3.30984 0 2.44557 V2 3.2 0 2.4 + N0 -0.316294 0.364979 0.875641 N1 -0.349987 4.0695e-15 0.936755 N2 -0.410365 4.31973e-15 0.911922 + txt003 +STRI + V0 3.2 0 2.4 V1 3.17037 -0.0625 2.4 V2 3.27461 -0.0655864 2.44451 + N0 -0.410365 4.31973e-15 0.911922 N1 -0.378646 0.420717 0.824393 N2 -0.316294 0.364979 0.875641 + txt003 +STRI + V0 3.3 0 2.4 V1 3.25556 0.104167 2.4 V2 3.34075 0.10108 2.43969 + N0 0.384615 0 -0.923077 N1 0.366221 0.366221 -0.855433 N2 0.442187 0.473386 -0.761824 + txt003 +STRI + V0 3.34075 0.10108 2.43969 V1 3.38808 0 2.44036 V2 3.3 0 2.4 + N0 0.442187 0.473386 -0.761824 N1 0.463425 0 -0.886136 N2 0.384615 0 -0.923077 + txt003 +STRI + V0 3.25556 0.104167 2.4 V1 3.14444 0.166667 2.4 V2 3.22241 0.161728 2.438 + N0 0.366221 0.366221 -0.855433 N1 0.250514 0.801644 -0.54278 N2 0.269127 0.933284 -0.237808 + txt003 +STRI + V0 3.22241 0.161728 2.438 V1 3.34075 0.10108 2.43969 V2 3.25556 0.104167 2.4 + N0 0.269127 0.933284 -0.237808 N1 0.442187 0.473386 -0.761824 N2 0.366221 0.366221 -0.855433 + txt003 +STRI + V0 3.14444 0.166667 2.4 V1 3 0.1875 2.4 V2 3.06858 0.181944 2.43581 + N0 0.250514 0.801644 -0.54278 N1 0 1 -0 N2 -0.00489618 0.939227 0.343261 + txt003 +STRI + V0 3.06858 0.181944 2.43581 V1 3.22241 0.161728 2.438 V2 3.14444 0.166667 2.4 + N0 -0.00489618 0.939227 0.343261 N1 0.269127 0.933284 -0.237808 N2 0.250514 0.801644 -0.54278 + txt003 +STRI + V0 3 0.1875 2.4 V1 2.85556 0.166667 2.4 V2 2.91474 0.161728 2.43361 + N0 0 1 -0 N1 -0.267368 0.855576 0.443288 N2 -0.215548 0.724209 0.655027 + txt003 +STRI + V0 2.91474 0.161728 2.43361 V1 3.06858 0.181944 2.43581 V2 3 0.1875 2.4 + N0 -0.215548 0.724209 0.655027 N1 -0.00489618 0.939227 0.343261 N2 0 1 -0 + txt003 +STRI + V0 2.85556 0.166667 2.4 V1 2.74444 0.104167 2.4 V2 2.79641 0.10108 2.43193 + N0 -0.267368 0.855576 0.443288 N1 -0.497164 0.497164 0.711095 N2 -0.387052 0.411886 0.824949 + txt003 +STRI + V0 2.79641 0.10108 2.43193 V1 2.91474 0.161728 2.43361 V2 2.85556 0.166667 2.4 + N0 -0.387052 0.411886 0.824949 N1 -0.215548 0.724209 0.655027 N2 -0.267368 0.855576 0.443288 + txt003 +STRI + V0 2.74444 0.104167 2.4 V1 2.7 0 2.4 V2 2.74907 0 2.43125 + N0 -0.497164 0.497164 0.711095 N1 -0.6 2.24387e-29 0.8 N2 -0.467888 -4.75841e-16 0.883788 + txt003 +STRI + V0 2.74907 0 2.43125 V1 2.79641 0.10108 2.43193 V2 2.74444 0.104167 2.4 + N0 -0.467888 -4.75841e-16 0.883788 N1 -0.387052 0.411886 0.824949 N2 -0.497164 0.497164 0.711095 + txt003 +STRI + V0 3.38808 0 2.44036 V1 3.34075 0.10108 2.43969 V2 3.38244 0.0933642 2.46543 + N0 0.463425 0 -0.886136 N1 0.442187 0.473386 -0.761824 N2 0.612385 0.714958 -0.337372 + txt003 +STRI + V0 3.38244 0.0933642 2.46543 V1 3.42963 0 2.46667 V2 3.38808 0 2.44036 + N0 0.612385 0.714958 -0.337372 N1 0.694136 0 -0.719844 N2 0.463425 0 -0.886136 + txt003 +STRI + V0 3.34075 0.10108 2.43969 V1 3.22241 0.161728 2.438 V2 3.26447 0.149383 2.46235 + N0 0.442187 0.473386 -0.761824 N1 0.269127 0.933284 -0.237808 N2 0.218115 0.87054 0.44112 + txt003 +STRI + V0 3.26447 0.149383 2.46235 V1 3.38244 0.0933642 2.46543 V2 3.34075 0.10108 2.43969 + N0 0.218115 0.87054 0.44112 N1 0.612385 0.714958 -0.337372 N2 0.442187 0.473386 -0.761824 + txt003 +STRI + V0 3.22241 0.161728 2.438 V1 3.06858 0.181944 2.43581 V2 3.11111 0.168056 2.45833 + N0 0.269127 0.933284 -0.237808 N1 -0.00489618 0.939227 0.343261 N2 -0.0195232 0.665415 0.746219 + txt003 +STRI + V0 3.11111 0.168056 2.45833 V1 3.26447 0.149383 2.46235 V2 3.22241 0.161728 2.438 + N0 -0.0195232 0.665415 0.746219 N1 0.218115 0.87054 0.44112 N2 0.269127 0.933284 -0.237808 + txt003 +STRI + V0 3.06858 0.181944 2.43581 V1 2.91474 0.161728 2.43361 V2 2.95775 0.149383 2.45432 + N0 -0.00489618 0.939227 0.343261 N1 -0.215548 0.724209 0.655027 N2 -0.14959 0.481391 0.863647 + txt003 +STRI + V0 2.95775 0.149383 2.45432 V1 3.11111 0.168056 2.45833 V2 3.06858 0.181944 2.43581 + N0 -0.14959 0.481391 0.863647 N1 -0.0195232 0.665415 0.746219 N2 -0.00489618 0.939227 0.343261 + txt003 +STRI + V0 2.91474 0.161728 2.43361 V1 2.79641 0.10108 2.43193 V2 2.83978 0.0933642 2.45123 + N0 -0.215548 0.724209 0.655027 N1 -0.387052 0.411886 0.824949 N2 -0.253997 0.272114 0.928138 + txt003 +STRI + V0 2.83978 0.0933642 2.45123 V1 2.95775 0.149383 2.45432 V2 2.91474 0.161728 2.43361 + N0 -0.253997 0.272114 0.928138 N1 -0.14959 0.481391 0.863647 N2 -0.215548 0.724209 0.655027 + txt003 +STRI + V0 2.79641 0.10108 2.43193 V1 2.74907 0 2.43125 V2 2.79259 0 2.45 + N0 -0.387052 0.411886 0.824949 N1 -0.467888 -4.75841e-16 0.883788 N2 -0.306009 -1.09783e-15 0.952029 + txt003 +STRI + V0 2.79259 0 2.45 V1 2.83978 0.0933642 2.45123 V2 2.79641 0.10108 2.43193 + N0 -0.306009 -1.09783e-15 0.952029 N1 -0.253997 0.272114 0.928138 N2 -0.387052 0.411886 0.824949 + txt003 +STRI + V0 3.42963 0 2.46667 V1 3.38244 0.0933642 2.46543 V2 3.38345 0.0833333 2.47578 + N0 0.694136 0 -0.719844 N1 0.612385 0.714958 -0.337372 N2 0.0539577 0.111406 0.992309 + txt003 +STRI + V0 3.38345 0.0833333 2.47578 V1 3.42813 0 2.47734 V2 3.42963 0 2.46667 + N0 0.0539577 0.111406 0.992309 N1 0.106533 -0 0.994309 N2 0.694136 0 -0.719844 + txt003 +STRI + V0 3.38244 0.0933642 2.46543 V1 3.26447 0.149383 2.46235 V2 3.27176 0.133333 2.47188 + N0 0.612385 0.714958 -0.337372 N1 0.218115 0.87054 0.44112 N2 -0.00787186 0.108144 0.994104 + txt003 +STRI + V0 3.27176 0.133333 2.47188 V1 3.38345 0.0833333 2.47578 V2 3.38244 0.0933642 2.46543 + N0 -0.00787186 0.108144 0.994104 N1 0.0539577 0.111406 0.992309 N2 0.612385 0.714958 -0.337372 + txt003 +STRI + V0 3.26447 0.149383 2.46235 V1 3.11111 0.168056 2.45833 V2 3.12656 0.15 2.4668 + N0 0.218115 0.87054 0.44112 N1 -0.0195232 0.665415 0.746219 N2 -0.0348909 0.0594438 0.997622 + txt003 +STRI + V0 3.12656 0.15 2.4668 V1 3.27176 0.133333 2.47188 V2 3.26447 0.149383 2.46235 + N0 -0.0348909 0.0594438 0.997622 N1 -0.00787186 0.108144 0.994104 N2 0.218115 0.87054 0.44112 + txt003 +STRI + V0 3.11111 0.168056 2.45833 V1 2.95775 0.149383 2.45432 V2 2.98137 0.133333 2.46172 + N0 -0.0195232 0.665415 0.746219 N1 -0.14959 0.481391 0.863647 N2 -0.0369301 0.00796532 0.999286 + txt003 +STRI + V0 2.98137 0.133333 2.46172 V1 3.12656 0.15 2.4668 V2 3.11111 0.168056 2.45833 + N0 -0.0369301 0.00796532 0.999286 N1 -0.0348909 0.0594438 0.997622 N2 -0.0195232 0.665415 0.746219 + txt003 +STRI + V0 2.95775 0.149383 2.45432 V1 2.83978 0.0933642 2.45123 V2 2.86968 0.0833333 2.45781 + N0 -0.14959 0.481391 0.863647 N1 -0.253997 0.272114 0.928138 N2 -0.0182321 -0.0210195 0.999613 + txt003 +STRI + V0 2.86968 0.0833333 2.45781 V1 2.98137 0.133333 2.46172 V2 2.95775 0.149383 2.45432 + N0 -0.0182321 -0.0210195 0.999613 N1 -0.0369301 0.00796532 0.999286 N2 -0.14959 0.481391 0.863647 + txt003 +STRI + V0 2.83978 0.0933642 2.45123 V1 2.79259 0 2.45 V2 2.825 0 2.45625 + N0 -0.253997 0.272114 0.928138 N1 -0.306009 -1.09783e-15 0.952029 N2 2.22045e-15 -2.22045e-15 1 + txt003 +STRI + V0 2.825 0 2.45625 V1 2.86968 0.0833333 2.45781 V2 2.83978 0.0933642 2.45123 + N0 2.22045e-15 -2.22045e-15 1 N1 -0.0182321 -0.0210195 0.999613 N2 -0.253997 0.272114 0.928138 + txt003 +STRI + V0 3.42813 0 2.47734 V1 3.38345 0.0833333 2.47578 V2 3.34657 0.0733025 2.46929 + N0 0.106533 -0 0.994309 N1 0.0539577 0.111406 0.992309 N2 -0.223743 -0.242919 0.943891 + txt003 +STRI + V0 3.34657 0.0733025 2.46929 V1 3.38704 0 2.47083 V2 3.42813 0 2.47734 + N0 -0.223743 -0.242919 0.943891 N1 -0.253109 0 0.967438 N2 0.106533 -0 0.994309 + txt003 +STRI + V0 3.38345 0.0833333 2.47578 V1 3.27176 0.133333 2.47188 V2 3.2454 0.117284 2.46543 + N0 0.0539577 0.111406 0.992309 N1 -0.00787186 0.108144 0.994104 N2 -0.144371 -0.459364 0.876437 + txt003 +STRI + V0 3.2454 0.117284 2.46543 V1 3.34657 0.0733025 2.46929 V2 3.38345 0.0833333 2.47578 + N0 -0.144371 -0.459364 0.876437 N1 -0.223743 -0.242919 0.943891 N2 0.0539577 0.111406 0.992309 + txt003 +STRI + V0 3.27176 0.133333 2.47188 V1 3.12656 0.15 2.4668 V2 3.11389 0.131944 2.46042 + N0 -0.00787186 0.108144 0.994104 N1 -0.0348909 0.0594438 0.997622 N2 -0.0300305 -0.615625 0.787467 + txt003 +STRI + V0 3.11389 0.131944 2.46042 V1 3.2454 0.117284 2.46543 V2 3.27176 0.133333 2.47188 + N0 -0.0300305 -0.615625 0.787467 N1 -0.144371 -0.459364 0.876437 N2 -0.00787186 0.108144 0.994104 + txt003 +STRI + V0 3.12656 0.15 2.4668 V1 2.98137 0.133333 2.46172 V2 2.98237 0.117284 2.4554 + N0 -0.0348909 0.0594438 0.997622 N1 -0.0369301 0.00796532 0.999286 N2 0.148477 -0.721529 0.676277 + txt003 +STRI + V0 2.98237 0.117284 2.4554 V1 3.11389 0.131944 2.46042 V2 3.12656 0.15 2.4668 + N0 0.148477 -0.721529 0.676277 N1 -0.0300305 -0.615625 0.787467 N2 -0.0348909 0.0594438 0.997622 + txt003 +STRI + V0 2.98137 0.133333 2.46172 V1 2.86968 0.0833333 2.45781 V2 2.88121 0.0733025 2.45154 + N0 -0.0369301 0.00796532 0.999286 N1 -0.0182321 -0.0210195 0.999613 N2 0.507715 -0.682832 0.525324 + txt003 +STRI + V0 2.88121 0.0733025 2.45154 V1 2.98237 0.117284 2.4554 V2 2.98137 0.133333 2.46172 + N0 0.507715 -0.682832 0.525324 N1 0.148477 -0.721529 0.676277 N2 -0.0369301 0.00796532 0.999286 + txt003 +STRI + V0 2.86968 0.0833333 2.45781 V1 2.825 0 2.45625 V2 2.84074 0 2.45 + N0 -0.0182321 -0.0210195 0.999613 N1 2.22045e-15 -2.22045e-15 1 N2 0.913812 -4.13289e-15 0.406138 + txt003 +STRI + V0 2.84074 0 2.45 V1 2.88121 0.0733025 2.45154 V2 2.86968 0.0833333 2.45781 + N0 0.913812 -4.13289e-15 0.406138 N1 0.507715 -0.682832 0.525324 N2 -0.0182321 -0.0210195 0.999613 + txt003 +STRI + V0 3.38704 0 2.47083 V1 3.34657 0.0733025 2.46929 V2 3.27461 0.0655864 2.44451 + N0 -0.253109 0 0.967438 N1 -0.223743 -0.242919 0.943891 N2 -0.316294 -0.364979 0.875641 + txt003 +STRI + V0 3.27461 0.0655864 2.44451 V1 3.30984 0 2.44557 V2 3.38704 0 2.47083 + N0 -0.316294 -0.364979 0.875641 N1 -0.349987 0 0.936755 N2 -0.253109 0 0.967438 + txt003 +STRI + V0 3.34657 0.0733025 2.46929 V1 3.2454 0.117284 2.46543 V2 3.18654 0.104938 2.44186 + N0 -0.223743 -0.242919 0.943891 N1 -0.144371 -0.459364 0.876437 N2 -0.199105 -0.721639 0.663019 + txt003 +STRI + V0 3.18654 0.104938 2.44186 V1 3.27461 0.0655864 2.44451 V2 3.34657 0.0733025 2.46929 + N0 -0.199105 -0.721639 0.663019 N1 -0.316294 -0.364979 0.875641 N2 -0.223743 -0.242919 0.943891 + txt003 +STRI + V0 3.2454 0.117284 2.46543 V1 3.11389 0.131944 2.46042 V2 3.07205 0.118056 2.43841 + N0 -0.144371 -0.459364 0.876437 N1 -0.0300305 -0.615625 0.787467 N2 -0.0103804 -0.938666 0.344672 + txt003 +STRI + V0 3.07205 0.118056 2.43841 V1 3.18654 0.104938 2.44186 V2 3.2454 0.117284 2.46543 + N0 -0.0103804 -0.938666 0.344672 N1 -0.199105 -0.721639 0.663019 N2 -0.144371 -0.459364 0.876437 + txt003 +STRI + V0 3.11389 0.131944 2.46042 V1 2.98237 0.117284 2.4554 V2 2.95756 0.104938 2.43496 + N0 -0.0300305 -0.615625 0.787467 N1 0.148477 -0.721529 0.676277 N2 0.241288 -0.970358 -0.0136399 + txt003 +STRI + V0 2.95756 0.104938 2.43496 V1 3.07205 0.118056 2.43841 V2 3.11389 0.131944 2.46042 + N0 0.241288 -0.970358 -0.0136399 N1 -0.0103804 -0.938666 0.344672 N2 -0.0300305 -0.615625 0.787467 + txt003 +STRI + V0 2.98237 0.117284 2.4554 V1 2.88121 0.0733025 2.45154 V2 2.86949 0.0655864 2.43231 + N0 0.148477 -0.721529 0.676277 N1 0.507715 -0.682832 0.525324 N2 0.577416 -0.711734 -0.400031 + txt003 +STRI + V0 2.86949 0.0655864 2.43231 V1 2.95756 0.104938 2.43496 V2 2.98237 0.117284 2.4554 + N0 0.577416 -0.711734 -0.400031 N1 0.241288 -0.970358 -0.0136399 N2 0.148477 -0.721529 0.676277 + txt003 +STRI + V0 2.88121 0.0733025 2.45154 V1 2.84074 0 2.45 V2 2.83426 0 2.43125 + N0 0.507715 -0.682832 0.525324 N1 0.913812 -4.13289e-15 0.406138 N2 0.789352 -1.30938e-15 -0.613941 + txt003 +STRI + V0 2.83426 0 2.43125 V1 2.86949 0.0655864 2.43231 V2 2.88121 0.0733025 2.45154 + N0 0.789352 -1.30938e-15 -0.613941 N1 0.577416 -0.711734 -0.400031 N2 0.507715 -0.682832 0.525324 + txt003 +STRI + V0 3.30984 0 2.44557 V1 3.27461 0.0655864 2.44451 V2 3.17037 0.0625 2.4 + N0 -0.349987 0 0.936755 N1 -0.316294 -0.364979 0.875641 N2 -0.378646 -0.420717 0.824393 + txt003 +STRI + V0 3.17037 0.0625 2.4 V1 3.2 0 2.4 V2 3.30984 0 2.44557 + N0 -0.378646 -0.420717 0.824393 N1 -0.410365 0 0.911922 N2 -0.349987 0 0.936755 + txt003 +STRI + V0 3.27461 0.0655864 2.44451 V1 3.18654 0.104938 2.44186 V2 3.0963 0.1 2.4 + N0 -0.316294 -0.364979 0.875641 N1 -0.199105 -0.721639 0.663019 N2 -0.236617 -0.841304 0.486024 + txt003 +STRI + V0 3.0963 0.1 2.4 V1 3.17037 0.0625 2.4 V2 3.27461 0.0655864 2.44451 + N0 -0.236617 -0.841304 0.486024 N1 -0.378646 -0.420717 0.824393 N2 -0.316294 -0.364979 0.875641 + txt003 +STRI + V0 3.18654 0.104938 2.44186 V1 3.07205 0.118056 2.43841 V2 3 0.1125 2.4 + N0 -0.199105 -0.721639 0.663019 N1 -0.0103804 -0.938666 0.344672 N2 0 -1 0 + txt003 +STRI + V0 3 0.1125 2.4 V1 3.0963 0.1 2.4 V2 3.18654 0.104938 2.44186 + N0 0 -1 0 N1 -0.236617 -0.841304 0.486024 N2 -0.199105 -0.721639 0.663019 + txt003 +STRI + V0 3.07205 0.118056 2.43841 V1 2.95756 0.104938 2.43496 V2 2.9037 0.1 2.4 + N0 -0.0103804 -0.938666 0.344672 N1 0.241288 -0.970358 -0.0136399 N2 0.247465 -0.879877 -0.405681 + txt003 +STRI + V0 2.9037 0.1 2.4 V1 3 0.1125 2.4 V2 3.07205 0.118056 2.43841 + N0 0.247465 -0.879877 -0.405681 N1 0 -1 0 N2 -0.0103804 -0.938666 0.344672 + txt003 +STRI + V0 2.95756 0.104938 2.43496 V1 2.86949 0.0655864 2.43231 V2 2.82963 0.0625 2.4 + N0 0.241288 -0.970358 -0.0136399 N1 0.577416 -0.711734 -0.400031 N2 0.483629 -0.537366 -0.690899 + txt003 +STRI + V0 2.82963 0.0625 2.4 V1 2.9037 0.1 2.4 V2 2.95756 0.104938 2.43496 + N0 0.483629 -0.537366 -0.690899 N1 0.247465 -0.879877 -0.405681 N2 0.241288 -0.970358 -0.0136399 + txt003 +STRI + V0 2.86949 0.0655864 2.43231 V1 2.83426 0 2.43125 V2 2.8 0 2.4 + N0 0.577416 -0.711734 -0.400031 N1 0.789352 -1.30938e-15 -0.613941 N2 0.6 -3.73979e-29 -0.8 + txt003 +STRI + V0 2.8 0 2.4 V1 2.82963 0.0625 2.4 V2 2.86949 0.0655864 2.43231 + N0 0.6 -3.73979e-29 -0.8 N1 0.483629 -0.537366 -0.690899 N2 0.577416 -0.711734 -0.400031 + txt003 +STRI + V0 0.268946 -0.0750782 3.12708 V1 0.278704 0 3.12708 V2 0 0 3.15 + N0 0.241077 -0.0645609 0.968356 N1 0.249998 0 0.968246 N2 0 0 1 + txt003 +STRI + V0 0.241285 -0.141931 3.12708 V1 0.268946 -0.0750782 3.12708 V2 0 0 3.15 + N0 0.215548 -0.124615 0.968509 N1 0.241077 -0.0645609 0.968356 N2 0 0 1 + txt003 +STRI + V0 0.19814 -0.19814 3.12708 V1 0.241285 -0.141931 3.12708 V2 0 0 3.15 + N0 0.175885 -0.175885 0.96857 N1 0.215548 -0.124615 0.968509 N2 0 0 1 + txt003 +STRI + V0 0.141931 -0.241285 3.12708 V1 0.19814 -0.19814 3.12708 V2 0 0 3.15 + N0 0.124615 -0.215548 0.968509 N1 0.175885 -0.175885 0.96857 N2 0 0 1 + txt003 +STRI + V0 0.0750782 -0.268946 3.12708 V1 0.141931 -0.241285 3.12708 V2 0 0 3.15 + N0 0.0645609 -0.241077 0.968356 N1 0.124615 -0.215548 0.968509 N2 0 0 1 + txt003 +STRI + V0 0 -0.278704 3.12708 V1 0.0750782 -0.268946 3.12708 V2 0 0 3.15 + N0 -2.80184e-15 -0.249998 0.968246 N1 0.0645609 -0.241077 0.968356 N2 0 0 1 + txt003 +STRI + V0 0.278704 0 3.12708 V1 0.268946 -0.0750782 3.12708 V2 0.350254 -0.0977709 3.06667 + N0 0.249998 0 0.968246 N1 0.241077 -0.0645609 0.968356 N2 0.955496 -0.255913 0.146755 + txt003 +STRI + V0 0.350254 -0.0977709 3.06667 V1 0.362963 0 3.06667 V2 0.278704 0 3.12708 + N0 0.955496 -0.255913 0.146755 N1 0.989203 0 0.146549 N2 0.249998 0 0.968246 + txt003 +STRI + V0 0.268946 -0.0750782 3.12708 V1 0.241285 -0.141931 3.12708 V2 0.314228 -0.184834 3.06667 + N0 0.241077 -0.0645609 0.968356 N1 0.215548 -0.124615 0.968509 N2 0.856312 -0.495088 0.147029 + txt003 +STRI + V0 0.314228 -0.184834 3.06667 V1 0.350254 -0.0977709 3.06667 V2 0.268946 -0.0750782 3.12708 + N0 0.856312 -0.495088 0.147029 N1 0.955496 -0.255913 0.146755 N2 0.241077 -0.0645609 0.968356 + txt003 +STRI + V0 0.241285 -0.141931 3.12708 V1 0.19814 -0.19814 3.12708 V2 0.258037 -0.258037 3.06667 + N0 0.215548 -0.124615 0.968509 N1 0.175885 -0.175885 0.96857 N2 0.699411 -0.699411 0.147135 + txt003 +STRI + V0 0.258037 -0.258037 3.06667 V1 0.314228 -0.184834 3.06667 V2 0.241285 -0.141931 3.12708 + N0 0.699411 -0.699411 0.147135 N1 0.856312 -0.495088 0.147029 N2 0.215548 -0.124615 0.968509 + txt003 +STRI + V0 0.19814 -0.19814 3.12708 V1 0.141931 -0.241285 3.12708 V2 0.184834 -0.314228 3.06667 + N0 0.175885 -0.175885 0.96857 N1 0.124615 -0.215548 0.968509 N2 0.495088 -0.856312 0.147029 + txt003 +STRI + V0 0.184834 -0.314228 3.06667 V1 0.258037 -0.258037 3.06667 V2 0.19814 -0.19814 3.12708 + N0 0.495088 -0.856312 0.147029 N1 0.699411 -0.699411 0.147135 N2 0.175885 -0.175885 0.96857 + txt003 +STRI + V0 0.141931 -0.241285 3.12708 V1 0.0750782 -0.268946 3.12708 V2 0.0977709 -0.350254 3.06667 + N0 0.124615 -0.215548 0.968509 N1 0.0645609 -0.241077 0.968356 N2 0.255913 -0.955496 0.146755 + txt003 +STRI + V0 0.0977709 -0.350254 3.06667 V1 0.184834 -0.314228 3.06667 V2 0.141931 -0.241285 3.12708 + N0 0.255913 -0.955496 0.146755 N1 0.495088 -0.856312 0.147029 N2 0.124615 -0.215548 0.968509 + txt003 +STRI + V0 0.0750782 -0.268946 3.12708 V1 0 -0.278704 3.12708 V2 0 -0.362963 3.06667 + N0 0.0645609 -0.241077 0.968356 N1 -2.80184e-15 -0.249998 0.968246 N2 -4.98112e-16 -0.989203 0.146549 + txt003 +STRI + V0 0 -0.362963 3.06667 V1 0.0977709 -0.350254 3.06667 V2 0.0750782 -0.268946 3.12708 + N0 -4.98112e-16 -0.989203 0.146549 N1 0.255913 -0.955496 0.146755 N2 0.0645609 -0.241077 0.968356 + txt003 +STRI + V0 0.362963 0 3.06667 V1 0.350254 -0.0977709 3.06667 V2 0.313617 -0.0875289 2.98125 + N0 0.989203 0 0.146549 N1 0.955496 -0.255913 0.146755 N2 0.753688 -0.201937 -0.625441 + txt003 +STRI + V0 0.313617 -0.0875289 2.98125 V1 0.325 0 2.98125 V2 0.362963 0 3.06667 + N0 0.753688 -0.201937 -0.625441 N1 0.780869 0 -0.624695 N2 0.989203 0 0.146549 + txt003 +STRI + V0 0.350254 -0.0977709 3.06667 V1 0.314228 -0.184834 3.06667 V2 0.281352 -0.165481 2.98125 + N0 0.955496 -0.255913 0.146755 N1 0.856312 -0.495088 0.147029 N2 0.674735 -0.390178 -0.626493 + txt003 +STRI + V0 0.281352 -0.165481 2.98125 V1 0.313617 -0.0875289 2.98125 V2 0.350254 -0.0977709 3.06667 + N0 0.674735 -0.390178 -0.626493 N1 0.753688 -0.201937 -0.625441 N2 0.955496 -0.255913 0.146755 + txt003 +STRI + V0 0.314228 -0.184834 3.06667 V1 0.258037 -0.258037 3.06667 V2 0.231031 -0.231031 2.98125 + N0 0.856312 -0.495088 0.147029 N1 0.699411 -0.699411 0.147135 N2 0.550896 -0.550896 -0.626919 + txt003 +STRI + V0 0.231031 -0.231031 2.98125 V1 0.281352 -0.165481 2.98125 V2 0.314228 -0.184834 3.06667 + N0 0.550896 -0.550896 -0.626919 N1 0.674735 -0.390178 -0.626493 N2 0.856312 -0.495088 0.147029 + txt003 +STRI + V0 0.258037 -0.258037 3.06667 V1 0.184834 -0.314228 3.06667 V2 0.165481 -0.281352 2.98125 + N0 0.699411 -0.699411 0.147135 N1 0.495088 -0.856312 0.147029 N2 0.390178 -0.674735 -0.626493 + txt003 +STRI + V0 0.165481 -0.281352 2.98125 V1 0.231031 -0.231031 2.98125 V2 0.258037 -0.258037 3.06667 + N0 0.390178 -0.674735 -0.626493 N1 0.550896 -0.550896 -0.626919 N2 0.699411 -0.699411 0.147135 + txt003 +STRI + V0 0.184834 -0.314228 3.06667 V1 0.0977709 -0.350254 3.06667 V2 0.0875289 -0.313617 2.98125 + N0 0.495088 -0.856312 0.147029 N1 0.255913 -0.955496 0.146755 N2 0.201937 -0.753688 -0.625441 + txt003 +STRI + V0 0.0875289 -0.313617 2.98125 V1 0.165481 -0.281352 2.98125 V2 0.184834 -0.314228 3.06667 + N0 0.201937 -0.753688 -0.625441 N1 0.390178 -0.674735 -0.626493 N2 0.495088 -0.856312 0.147029 + txt003 +STRI + V0 0.0977709 -0.350254 3.06667 V1 0 -0.362963 3.06667 V2 -1.11022e-16 -0.325 2.98125 + N0 0.255913 -0.955496 0.146755 N1 -4.98112e-16 -0.989203 0.146549 N2 1.51803e-15 -0.780869 -0.624695 + txt003 +STRI + V0 -1.11022e-16 -0.325 2.98125 V1 0.0875289 -0.313617 2.98125 V2 0.0977709 -0.350254 3.06667 + N0 1.51803e-15 -0.780869 -0.624695 N1 0.201937 -0.753688 -0.625441 N2 0.255913 -0.955496 0.146755 + txt003 +STRI + V0 0.325 0 2.98125 V1 0.313617 -0.0875289 2.98125 V2 0.228728 -0.0638032 2.88333 + N0 0.780869 0 -0.624695 N1 0.753688 -0.201937 -0.625441 N2 0.721244 -0.193465 -0.665116 + txt003 +STRI + V0 0.228728 -0.0638032 2.88333 V1 0.237037 0 2.88333 V2 0.325 0 2.98125 + N0 0.721244 -0.193465 -0.665116 N1 0.747409 0 -0.664364 N2 0.780869 0 -0.624695 + txt003 +STRI + V0 0.313617 -0.0875289 2.98125 V1 0.281352 -0.165481 2.98125 V2 0.20518 -0.120647 2.88333 + N0 0.753688 -0.201937 -0.625441 N1 0.674735 -0.390178 -0.626493 N2 0.645526 -0.373497 -0.66618 + txt003 +STRI + V0 0.20518 -0.120647 2.88333 V1 0.228728 -0.0638032 2.88333 V2 0.313617 -0.0875289 2.98125 + N0 0.645526 -0.373497 -0.66618 N1 0.721244 -0.193465 -0.665116 N2 0.753688 -0.201937 -0.625441 + txt003 +STRI + V0 0.281352 -0.165481 2.98125 V1 0.231031 -0.231031 2.98125 V2 0.168463 -0.168463 2.88333 + N0 0.674735 -0.390178 -0.626493 N1 0.550896 -0.550896 -0.626919 N2 0.527081 -0.527081 -0.666611 + txt003 +STRI + V0 0.168463 -0.168463 2.88333 V1 0.20518 -0.120647 2.88333 V2 0.281352 -0.165481 2.98125 + N0 0.527081 -0.527081 -0.666611 N1 0.645526 -0.373497 -0.66618 N2 0.674735 -0.390178 -0.626493 + txt003 +STRI + V0 0.231031 -0.231031 2.98125 V1 0.165481 -0.281352 2.98125 V2 0.120647 -0.20518 2.88333 + N0 0.550896 -0.550896 -0.626919 N1 0.390178 -0.674735 -0.626493 N2 0.373497 -0.645526 -0.66618 + txt003 +STRI + V0 0.120647 -0.20518 2.88333 V1 0.168463 -0.168463 2.88333 V2 0.231031 -0.231031 2.98125 + N0 0.373497 -0.645526 -0.66618 N1 0.527081 -0.527081 -0.666611 N2 0.550896 -0.550896 -0.626919 + txt003 +STRI + V0 0.165481 -0.281352 2.98125 V1 0.0875289 -0.313617 2.98125 V2 0.0638032 -0.228728 2.88333 + N0 0.390178 -0.674735 -0.626493 N1 0.201937 -0.753688 -0.625441 N2 0.193465 -0.721244 -0.665116 + txt003 +STRI + V0 0.0638032 -0.228728 2.88333 V1 0.120647 -0.20518 2.88333 V2 0.165481 -0.281352 2.98125 + N0 0.193465 -0.721244 -0.665116 N1 0.373497 -0.645526 -0.66618 N2 0.390178 -0.674735 -0.626493 + txt003 +STRI + V0 0.0875289 -0.313617 2.98125 V1 -1.11022e-16 -0.325 2.98125 V2 -1.11022e-16 -0.237037 2.88333 + N0 0.201937 -0.753688 -0.625441 N1 1.51803e-15 -0.780869 -0.624695 N2 2.42292e-15 -0.747409 -0.664364 + txt003 +STRI + V0 -1.11022e-16 -0.237037 2.88333 V1 0.0638032 -0.228728 2.88333 V2 0.0875289 -0.313617 2.98125 + N0 2.42292e-15 -0.747409 -0.664364 N1 0.193465 -0.721244 -0.665116 N2 0.201937 -0.753688 -0.625441 + txt003 +STRI + V0 0.237037 0 2.88333 V1 0.228728 -0.0638032 2.88333 V2 0.165279 -0.0460445 2.78542 + N0 0.747409 0 -0.664364 N1 0.721244 -0.193465 -0.665116 N2 0.917897 -0.246906 -0.310647 + txt003 +STRI + V0 0.165279 -0.0460445 2.78542 V1 0.171296 0 2.78542 V2 0.237037 0 2.88333 + N0 0.917897 -0.246906 -0.310647 N1 0.950775 0 -0.309882 N2 0.747409 0 -0.664364 + txt003 +STRI + V0 0.228728 -0.0638032 2.88333 V1 0.20518 -0.120647 2.88333 V2 0.148234 -0.0871056 2.78542 + N0 0.721244 -0.193465 -0.665116 N1 0.645526 -0.373497 -0.66618 N2 0.822132 -0.476337 -0.311772 + txt003 +STRI + V0 0.148234 -0.0871056 2.78542 V1 0.165279 -0.0460445 2.78542 V2 0.228728 -0.0638032 2.88333 + N0 0.822132 -0.476337 -0.311772 N1 0.917897 -0.246906 -0.310647 N2 0.721244 -0.193465 -0.665116 + txt003 +STRI + V0 0.20518 -0.120647 2.88333 V1 0.168463 -0.168463 2.88333 V2 0.121672 -0.121672 2.78542 + N0 0.645526 -0.373497 -0.66618 N1 0.527081 -0.527081 -0.666611 N2 0.671754 -0.671754 -0.312241 + txt003 +STRI + V0 0.121672 -0.121672 2.78542 V1 0.148234 -0.0871056 2.78542 V2 0.20518 -0.120647 2.88333 + N0 0.671754 -0.671754 -0.312241 N1 0.822132 -0.476337 -0.311772 N2 0.645526 -0.373497 -0.66618 + txt003 +STRI + V0 0.168463 -0.168463 2.88333 V1 0.120647 -0.20518 2.88333 V2 0.0871056 -0.148234 2.78542 + N0 0.527081 -0.527081 -0.666611 N1 0.373497 -0.645526 -0.66618 N2 0.476337 -0.822132 -0.311772 + txt003 +STRI + V0 0.0871056 -0.148234 2.78542 V1 0.121672 -0.121672 2.78542 V2 0.168463 -0.168463 2.88333 + N0 0.476337 -0.822132 -0.311772 N1 0.671754 -0.671754 -0.312241 N2 0.527081 -0.527081 -0.666611 + txt003 +STRI + V0 0.120647 -0.20518 2.88333 V1 0.0638032 -0.228728 2.88333 V2 0.0460445 -0.165279 2.78542 + N0 0.373497 -0.645526 -0.66618 N1 0.193465 -0.721244 -0.665116 N2 0.246906 -0.917897 -0.310647 + txt003 +STRI + V0 0.0460445 -0.165279 2.78542 V1 0.0871056 -0.148234 2.78542 V2 0.120647 -0.20518 2.88333 + N0 0.246906 -0.917897 -0.310647 N1 0.476337 -0.822132 -0.311772 N2 0.373497 -0.645526 -0.66618 + txt003 +STRI + V0 0.0638032 -0.228728 2.88333 V1 -1.11022e-16 -0.237037 2.88333 V2 -6.66134e-16 -0.171296 2.78542 + N0 0.193465 -0.721244 -0.665116 N1 2.42292e-15 -0.747409 -0.664364 N2 2.16507e-15 -0.950775 -0.309882 + txt003 +STRI + V0 -6.66134e-16 -0.171296 2.78542 V1 0.0460445 -0.165279 2.78542 V2 0.0638032 -0.228728 2.88333 + N0 2.16507e-15 -0.950775 -0.309882 N1 0.246906 -0.917897 -0.310647 N2 0.193465 -0.721244 -0.665116 + txt003 +STRI + V0 0.171296 0 2.78542 V1 0.165279 -0.0460445 2.78542 V2 0.192963 -0.0537037 2.7 + N0 0.950775 0 -0.309882 N1 0.917897 -0.246906 -0.310647 N2 0.578783 -0.15602 0.800417 + txt003 +STRI + V0 0.192963 -0.0537037 2.7 V1 0.2 0 2.7 V2 0.171296 0 2.78542 + N0 0.578783 -0.15602 0.800417 N1 0.6 0 0.8 N2 0.950775 0 -0.309882 + txt003 +STRI + V0 0.165279 -0.0460445 2.78542 V1 0.148234 -0.0871056 2.78542 V2 0.173037 -0.10163 2.7 + N0 0.917897 -0.246906 -0.310647 N1 0.822132 -0.476337 -0.311772 N2 0.517905 -0.300385 0.800964 + txt003 +STRI + V0 0.173037 -0.10163 2.7 V1 0.192963 -0.0537037 2.7 V2 0.165279 -0.0460445 2.78542 + N0 0.517905 -0.300385 0.800964 N1 0.578783 -0.15602 0.800417 N2 0.917897 -0.246906 -0.310647 + txt003 +STRI + V0 0.148234 -0.0871056 2.78542 V1 0.121672 -0.121672 2.78542 V2 0.142 -0.142 2.7 + N0 0.822132 -0.476337 -0.311772 N1 0.671754 -0.671754 -0.312241 N2 0.423155 -0.423155 0.801174 + txt003 +STRI + V0 0.142 -0.142 2.7 V1 0.173037 -0.10163 2.7 V2 0.148234 -0.0871056 2.78542 + N0 0.423155 -0.423155 0.801174 N1 0.517905 -0.300385 0.800964 N2 0.822132 -0.476337 -0.311772 + txt003 +STRI + V0 0.121672 -0.121672 2.78542 V1 0.0871056 -0.148234 2.78542 V2 0.10163 -0.173037 2.7 + N0 0.671754 -0.671754 -0.312241 N1 0.476337 -0.822132 -0.311772 N2 0.300385 -0.517905 0.800964 + txt003 +STRI + V0 0.10163 -0.173037 2.7 V1 0.142 -0.142 2.7 V2 0.121672 -0.121672 2.78542 + N0 0.300385 -0.517905 0.800964 N1 0.423155 -0.423155 0.801174 N2 0.671754 -0.671754 -0.312241 + txt003 +STRI + V0 0.0871056 -0.148234 2.78542 V1 0.0460445 -0.165279 2.78542 V2 0.0537037 -0.192963 2.7 + N0 0.476337 -0.822132 -0.311772 N1 0.246906 -0.917897 -0.310647 N2 0.15602 -0.578783 0.800417 + txt003 +STRI + V0 0.0537037 -0.192963 2.7 V1 0.10163 -0.173037 2.7 V2 0.0871056 -0.148234 2.78542 + N0 0.15602 -0.578783 0.800417 N1 0.300385 -0.517905 0.800964 N2 0.476337 -0.822132 -0.311772 + txt003 +STRI + V0 0.0460445 -0.165279 2.78542 V1 -6.66134e-16 -0.171296 2.78542 V2 0 -0.2 2.7 + N0 0.246906 -0.917897 -0.310647 N1 2.16507e-15 -0.950775 -0.309882 N2 -3.17207e-15 -0.6 0.8 + txt003 +STRI + V0 0 -0.2 2.7 V1 0.0537037 -0.192963 2.7 V2 0.0460445 -0.165279 2.78542 + N0 -3.17207e-15 -0.6 0.8 N1 0.15602 -0.578783 0.800417 N2 0.246906 -0.917897 -0.310647 + txt003 +STRI + V0 -0.0750782 -0.268946 3.12708 V1 0 -0.278704 3.12708 V2 0 0 3.15 + N0 -0.0645609 -0.241077 0.968356 N1 0 -0.249998 0.968246 N2 0 0 1 + txt003 +STRI + V0 -0.141931 -0.241285 3.12708 V1 -0.0750782 -0.268946 3.12708 V2 0 0 3.15 + N0 -0.124615 -0.215548 0.968509 N1 -0.0645609 -0.241077 0.968356 N2 0 0 1 + txt003 +STRI + V0 -0.19814 -0.19814 3.12708 V1 -0.141931 -0.241285 3.12708 V2 0 0 3.15 + N0 -0.175885 -0.175885 0.96857 N1 -0.124615 -0.215548 0.968509 N2 0 0 1 + txt003 +STRI + V0 -0.241285 -0.141931 3.12708 V1 -0.19814 -0.19814 3.12708 V2 0 0 3.15 + N0 -0.215548 -0.124615 0.968509 N1 -0.175885 -0.175885 0.96857 N2 0 0 1 + txt003 +STRI + V0 -0.268946 -0.0750782 3.12708 V1 -0.241285 -0.141931 3.12708 V2 0 0 3.15 + N0 -0.241077 -0.0645609 0.968356 N1 -0.215548 -0.124615 0.968509 N2 0 0 1 + txt003 +STRI + V0 -0.278704 0 3.12708 V1 -0.268946 -0.0750782 3.12708 V2 0 0 3.15 + N0 -0.249998 2.80184e-15 0.968246 N1 -0.241077 -0.0645609 0.968356 N2 0 0 1 + txt003 +STRI + V0 0 -0.278704 3.12708 V1 -0.0750782 -0.268946 3.12708 V2 -0.0977709 -0.350254 3.06667 + N0 0 -0.249998 0.968246 N1 -0.0645609 -0.241077 0.968356 N2 -0.255913 -0.955496 0.146755 + txt003 +STRI + V0 -0.0977709 -0.350254 3.06667 V1 0 -0.362963 3.06667 V2 0 -0.278704 3.12708 + N0 -0.255913 -0.955496 0.146755 N1 0 -0.989203 0.146549 N2 0 -0.249998 0.968246 + txt003 +STRI + V0 -0.0750782 -0.268946 3.12708 V1 -0.141931 -0.241285 3.12708 V2 -0.184834 -0.314228 3.06667 + N0 -0.0645609 -0.241077 0.968356 N1 -0.124615 -0.215548 0.968509 N2 -0.495088 -0.856312 0.147029 + txt003 +STRI + V0 -0.184834 -0.314228 3.06667 V1 -0.0977709 -0.350254 3.06667 V2 -0.0750782 -0.268946 3.12708 + N0 -0.495088 -0.856312 0.147029 N1 -0.255913 -0.955496 0.146755 N2 -0.0645609 -0.241077 0.968356 + txt003 +STRI + V0 -0.141931 -0.241285 3.12708 V1 -0.19814 -0.19814 3.12708 V2 -0.258037 -0.258037 3.06667 + N0 -0.124615 -0.215548 0.968509 N1 -0.175885 -0.175885 0.96857 N2 -0.699411 -0.699411 0.147135 + txt003 +STRI + V0 -0.258037 -0.258037 3.06667 V1 -0.184834 -0.314228 3.06667 V2 -0.141931 -0.241285 3.12708 + N0 -0.699411 -0.699411 0.147135 N1 -0.495088 -0.856312 0.147029 N2 -0.124615 -0.215548 0.968509 + txt003 +STRI + V0 -0.19814 -0.19814 3.12708 V1 -0.241285 -0.141931 3.12708 V2 -0.314228 -0.184834 3.06667 + N0 -0.175885 -0.175885 0.96857 N1 -0.215548 -0.124615 0.968509 N2 -0.856312 -0.495088 0.147029 + txt003 +STRI + V0 -0.314228 -0.184834 3.06667 V1 -0.258037 -0.258037 3.06667 V2 -0.19814 -0.19814 3.12708 + N0 -0.856312 -0.495088 0.147029 N1 -0.699411 -0.699411 0.147135 N2 -0.175885 -0.175885 0.96857 + txt003 +STRI + V0 -0.241285 -0.141931 3.12708 V1 -0.268946 -0.0750782 3.12708 V2 -0.350254 -0.0977709 3.06667 + N0 -0.215548 -0.124615 0.968509 N1 -0.241077 -0.0645609 0.968356 N2 -0.955496 -0.255913 0.146755 + txt003 +STRI + V0 -0.350254 -0.0977709 3.06667 V1 -0.314228 -0.184834 3.06667 V2 -0.241285 -0.141931 3.12708 + N0 -0.955496 -0.255913 0.146755 N1 -0.856312 -0.495088 0.147029 N2 -0.215548 -0.124615 0.968509 + txt003 +STRI + V0 -0.268946 -0.0750782 3.12708 V1 -0.278704 0 3.12708 V2 -0.362963 0 3.06667 + N0 -0.241077 -0.0645609 0.968356 N1 -0.249998 2.80184e-15 0.968246 N2 -0.989203 4.98112e-16 0.146549 + txt003 +STRI + V0 -0.362963 0 3.06667 V1 -0.350254 -0.0977709 3.06667 V2 -0.268946 -0.0750782 3.12708 + N0 -0.989203 4.98112e-16 0.146549 N1 -0.955496 -0.255913 0.146755 N2 -0.241077 -0.0645609 0.968356 + txt003 +STRI + V0 0 -0.362963 3.06667 V1 -0.0977709 -0.350254 3.06667 V2 -0.0875289 -0.313617 2.98125 + N0 0 -0.989203 0.146549 N1 -0.255913 -0.955496 0.146755 N2 -0.201937 -0.753688 -0.625441 + txt003 +STRI + V0 -0.0875289 -0.313617 2.98125 V1 0 -0.325 2.98125 V2 0 -0.362963 3.06667 + N0 -0.201937 -0.753688 -0.625441 N1 -0 -0.780869 -0.624695 N2 0 -0.989203 0.146549 + txt003 +STRI + V0 -0.0977709 -0.350254 3.06667 V1 -0.184834 -0.314228 3.06667 V2 -0.165481 -0.281352 2.98125 + N0 -0.255913 -0.955496 0.146755 N1 -0.495088 -0.856312 0.147029 N2 -0.390178 -0.674735 -0.626493 + txt003 +STRI + V0 -0.165481 -0.281352 2.98125 V1 -0.0875289 -0.313617 2.98125 V2 -0.0977709 -0.350254 3.06667 + N0 -0.390178 -0.674735 -0.626493 N1 -0.201937 -0.753688 -0.625441 N2 -0.255913 -0.955496 0.146755 + txt003 +STRI + V0 -0.184834 -0.314228 3.06667 V1 -0.258037 -0.258037 3.06667 V2 -0.231031 -0.231031 2.98125 + N0 -0.495088 -0.856312 0.147029 N1 -0.699411 -0.699411 0.147135 N2 -0.550896 -0.550896 -0.626919 + txt003 +STRI + V0 -0.231031 -0.231031 2.98125 V1 -0.165481 -0.281352 2.98125 V2 -0.184834 -0.314228 3.06667 + N0 -0.550896 -0.550896 -0.626919 N1 -0.390178 -0.674735 -0.626493 N2 -0.495088 -0.856312 0.147029 + txt003 +STRI + V0 -0.258037 -0.258037 3.06667 V1 -0.314228 -0.184834 3.06667 V2 -0.281352 -0.165481 2.98125 + N0 -0.699411 -0.699411 0.147135 N1 -0.856312 -0.495088 0.147029 N2 -0.674735 -0.390178 -0.626493 + txt003 +STRI + V0 -0.281352 -0.165481 2.98125 V1 -0.231031 -0.231031 2.98125 V2 -0.258037 -0.258037 3.06667 + N0 -0.674735 -0.390178 -0.626493 N1 -0.550896 -0.550896 -0.626919 N2 -0.699411 -0.699411 0.147135 + txt003 +STRI + V0 -0.314228 -0.184834 3.06667 V1 -0.350254 -0.0977709 3.06667 V2 -0.313617 -0.0875289 2.98125 + N0 -0.856312 -0.495088 0.147029 N1 -0.955496 -0.255913 0.146755 N2 -0.753688 -0.201937 -0.625441 + txt003 +STRI + V0 -0.313617 -0.0875289 2.98125 V1 -0.281352 -0.165481 2.98125 V2 -0.314228 -0.184834 3.06667 + N0 -0.753688 -0.201937 -0.625441 N1 -0.674735 -0.390178 -0.626493 N2 -0.856312 -0.495088 0.147029 + txt003 +STRI + V0 -0.350254 -0.0977709 3.06667 V1 -0.362963 0 3.06667 V2 -0.325 1.11022e-16 2.98125 + N0 -0.955496 -0.255913 0.146755 N1 -0.989203 4.98112e-16 0.146549 N2 -0.780869 -1.51803e-15 -0.624695 + txt003 +STRI + V0 -0.325 1.11022e-16 2.98125 V1 -0.313617 -0.0875289 2.98125 V2 -0.350254 -0.0977709 3.06667 + N0 -0.780869 -1.51803e-15 -0.624695 N1 -0.753688 -0.201937 -0.625441 N2 -0.955496 -0.255913 0.146755 + txt003 +STRI + V0 0 -0.325 2.98125 V1 -0.0875289 -0.313617 2.98125 V2 -0.0638032 -0.228728 2.88333 + N0 -0 -0.780869 -0.624695 N1 -0.201937 -0.753688 -0.625441 N2 -0.193465 -0.721244 -0.665116 + txt003 +STRI + V0 -0.0638032 -0.228728 2.88333 V1 0 -0.237037 2.88333 V2 0 -0.325 2.98125 + N0 -0.193465 -0.721244 -0.665116 N1 -0 -0.747409 -0.664364 N2 -0 -0.780869 -0.624695 + txt003 +STRI + V0 -0.0875289 -0.313617 2.98125 V1 -0.165481 -0.281352 2.98125 V2 -0.120647 -0.20518 2.88333 + N0 -0.201937 -0.753688 -0.625441 N1 -0.390178 -0.674735 -0.626493 N2 -0.373497 -0.645526 -0.66618 + txt003 +STRI + V0 -0.120647 -0.20518 2.88333 V1 -0.0638032 -0.228728 2.88333 V2 -0.0875289 -0.313617 2.98125 + N0 -0.373497 -0.645526 -0.66618 N1 -0.193465 -0.721244 -0.665116 N2 -0.201937 -0.753688 -0.625441 + txt003 +STRI + V0 -0.165481 -0.281352 2.98125 V1 -0.231031 -0.231031 2.98125 V2 -0.168463 -0.168463 2.88333 + N0 -0.390178 -0.674735 -0.626493 N1 -0.550896 -0.550896 -0.626919 N2 -0.527081 -0.527081 -0.666611 + txt003 +STRI + V0 -0.168463 -0.168463 2.88333 V1 -0.120647 -0.20518 2.88333 V2 -0.165481 -0.281352 2.98125 + N0 -0.527081 -0.527081 -0.666611 N1 -0.373497 -0.645526 -0.66618 N2 -0.390178 -0.674735 -0.626493 + txt003 +STRI + V0 -0.231031 -0.231031 2.98125 V1 -0.281352 -0.165481 2.98125 V2 -0.20518 -0.120647 2.88333 + N0 -0.550896 -0.550896 -0.626919 N1 -0.674735 -0.390178 -0.626493 N2 -0.645526 -0.373497 -0.66618 + txt003 +STRI + V0 -0.20518 -0.120647 2.88333 V1 -0.168463 -0.168463 2.88333 V2 -0.231031 -0.231031 2.98125 + N0 -0.645526 -0.373497 -0.66618 N1 -0.527081 -0.527081 -0.666611 N2 -0.550896 -0.550896 -0.626919 + txt003 +STRI + V0 -0.281352 -0.165481 2.98125 V1 -0.313617 -0.0875289 2.98125 V2 -0.228728 -0.0638032 2.88333 + N0 -0.674735 -0.390178 -0.626493 N1 -0.753688 -0.201937 -0.625441 N2 -0.721244 -0.193465 -0.665116 + txt003 +STRI + V0 -0.228728 -0.0638032 2.88333 V1 -0.20518 -0.120647 2.88333 V2 -0.281352 -0.165481 2.98125 + N0 -0.721244 -0.193465 -0.665116 N1 -0.645526 -0.373497 -0.66618 N2 -0.674735 -0.390178 -0.626493 + txt003 +STRI + V0 -0.313617 -0.0875289 2.98125 V1 -0.325 1.11022e-16 2.98125 V2 -0.237037 1.11022e-16 2.88333 + N0 -0.753688 -0.201937 -0.625441 N1 -0.780869 -1.51803e-15 -0.624695 N2 -0.747409 -2.42292e-15 -0.664364 + txt003 +STRI + V0 -0.237037 1.11022e-16 2.88333 V1 -0.228728 -0.0638032 2.88333 V2 -0.313617 -0.0875289 2.98125 + N0 -0.747409 -2.42292e-15 -0.664364 N1 -0.721244 -0.193465 -0.665116 N2 -0.753688 -0.201937 -0.625441 + txt003 +STRI + V0 0 -0.237037 2.88333 V1 -0.0638032 -0.228728 2.88333 V2 -0.0460445 -0.165279 2.78542 + N0 -0 -0.747409 -0.664364 N1 -0.193465 -0.721244 -0.665116 N2 -0.246906 -0.917897 -0.310647 + txt003 +STRI + V0 -0.0460445 -0.165279 2.78542 V1 0 -0.171296 2.78542 V2 0 -0.237037 2.88333 + N0 -0.246906 -0.917897 -0.310647 N1 -0 -0.950775 -0.309882 N2 -0 -0.747409 -0.664364 + txt003 +STRI + V0 -0.0638032 -0.228728 2.88333 V1 -0.120647 -0.20518 2.88333 V2 -0.0871056 -0.148234 2.78542 + N0 -0.193465 -0.721244 -0.665116 N1 -0.373497 -0.645526 -0.66618 N2 -0.476337 -0.822132 -0.311772 + txt003 +STRI + V0 -0.0871056 -0.148234 2.78542 V1 -0.0460445 -0.165279 2.78542 V2 -0.0638032 -0.228728 2.88333 + N0 -0.476337 -0.822132 -0.311772 N1 -0.246906 -0.917897 -0.310647 N2 -0.193465 -0.721244 -0.665116 + txt003 +STRI + V0 -0.120647 -0.20518 2.88333 V1 -0.168463 -0.168463 2.88333 V2 -0.121672 -0.121672 2.78542 + N0 -0.373497 -0.645526 -0.66618 N1 -0.527081 -0.527081 -0.666611 N2 -0.671754 -0.671754 -0.312241 + txt003 +STRI + V0 -0.121672 -0.121672 2.78542 V1 -0.0871056 -0.148234 2.78542 V2 -0.120647 -0.20518 2.88333 + N0 -0.671754 -0.671754 -0.312241 N1 -0.476337 -0.822132 -0.311772 N2 -0.373497 -0.645526 -0.66618 + txt003 +STRI + V0 -0.168463 -0.168463 2.88333 V1 -0.20518 -0.120647 2.88333 V2 -0.148234 -0.0871056 2.78542 + N0 -0.527081 -0.527081 -0.666611 N1 -0.645526 -0.373497 -0.66618 N2 -0.822132 -0.476337 -0.311772 + txt003 +STRI + V0 -0.148234 -0.0871056 2.78542 V1 -0.121672 -0.121672 2.78542 V2 -0.168463 -0.168463 2.88333 + N0 -0.822132 -0.476337 -0.311772 N1 -0.671754 -0.671754 -0.312241 N2 -0.527081 -0.527081 -0.666611 + txt003 +STRI + V0 -0.20518 -0.120647 2.88333 V1 -0.228728 -0.0638032 2.88333 V2 -0.165279 -0.0460445 2.78542 + N0 -0.645526 -0.373497 -0.66618 N1 -0.721244 -0.193465 -0.665116 N2 -0.917897 -0.246906 -0.310647 + txt003 +STRI + V0 -0.165279 -0.0460445 2.78542 V1 -0.148234 -0.0871056 2.78542 V2 -0.20518 -0.120647 2.88333 + N0 -0.917897 -0.246906 -0.310647 N1 -0.822132 -0.476337 -0.311772 N2 -0.645526 -0.373497 -0.66618 + txt003 +STRI + V0 -0.228728 -0.0638032 2.88333 V1 -0.237037 1.11022e-16 2.88333 V2 -0.171296 6.66134e-16 2.78542 + N0 -0.721244 -0.193465 -0.665116 N1 -0.747409 -2.42292e-15 -0.664364 N2 -0.950775 -2.16507e-15 -0.309882 + txt003 +STRI + V0 -0.171296 6.66134e-16 2.78542 V1 -0.165279 -0.0460445 2.78542 V2 -0.228728 -0.0638032 2.88333 + N0 -0.950775 -2.16507e-15 -0.309882 N1 -0.917897 -0.246906 -0.310647 N2 -0.721244 -0.193465 -0.665116 + txt003 +STRI + V0 0 -0.171296 2.78542 V1 -0.0460445 -0.165279 2.78542 V2 -0.0537037 -0.192963 2.7 + N0 -0 -0.950775 -0.309882 N1 -0.246906 -0.917897 -0.310647 N2 -0.15602 -0.578783 0.800417 + txt003 +STRI + V0 -0.0537037 -0.192963 2.7 V1 0 -0.2 2.7 V2 0 -0.171296 2.78542 + N0 -0.15602 -0.578783 0.800417 N1 0 -0.6 0.8 N2 -0 -0.950775 -0.309882 + txt003 +STRI + V0 -0.0460445 -0.165279 2.78542 V1 -0.0871056 -0.148234 2.78542 V2 -0.10163 -0.173037 2.7 + N0 -0.246906 -0.917897 -0.310647 N1 -0.476337 -0.822132 -0.311772 N2 -0.300385 -0.517905 0.800964 + txt003 +STRI + V0 -0.10163 -0.173037 2.7 V1 -0.0537037 -0.192963 2.7 V2 -0.0460445 -0.165279 2.78542 + N0 -0.300385 -0.517905 0.800964 N1 -0.15602 -0.578783 0.800417 N2 -0.246906 -0.917897 -0.310647 + txt003 +STRI + V0 -0.0871056 -0.148234 2.78542 V1 -0.121672 -0.121672 2.78542 V2 -0.142 -0.142 2.7 + N0 -0.476337 -0.822132 -0.311772 N1 -0.671754 -0.671754 -0.312241 N2 -0.423155 -0.423155 0.801174 + txt003 +STRI + V0 -0.142 -0.142 2.7 V1 -0.10163 -0.173037 2.7 V2 -0.0871056 -0.148234 2.78542 + N0 -0.423155 -0.423155 0.801174 N1 -0.300385 -0.517905 0.800964 N2 -0.476337 -0.822132 -0.311772 + txt003 +STRI + V0 -0.121672 -0.121672 2.78542 V1 -0.148234 -0.0871056 2.78542 V2 -0.173037 -0.10163 2.7 + N0 -0.671754 -0.671754 -0.312241 N1 -0.822132 -0.476337 -0.311772 N2 -0.517905 -0.300385 0.800964 + txt003 +STRI + V0 -0.173037 -0.10163 2.7 V1 -0.142 -0.142 2.7 V2 -0.121672 -0.121672 2.78542 + N0 -0.517905 -0.300385 0.800964 N1 -0.423155 -0.423155 0.801174 N2 -0.671754 -0.671754 -0.312241 + txt003 +STRI + V0 -0.148234 -0.0871056 2.78542 V1 -0.165279 -0.0460445 2.78542 V2 -0.192963 -0.0537037 2.7 + N0 -0.822132 -0.476337 -0.311772 N1 -0.917897 -0.246906 -0.310647 N2 -0.578783 -0.15602 0.800417 + txt003 +STRI + V0 -0.192963 -0.0537037 2.7 V1 -0.173037 -0.10163 2.7 V2 -0.148234 -0.0871056 2.78542 + N0 -0.578783 -0.15602 0.800417 N1 -0.517905 -0.300385 0.800964 N2 -0.822132 -0.476337 -0.311772 + txt003 +STRI + V0 -0.165279 -0.0460445 2.78542 V1 -0.171296 6.66134e-16 2.78542 V2 -0.2 0 2.7 + N0 -0.917897 -0.246906 -0.310647 N1 -0.950775 -2.16507e-15 -0.309882 N2 -0.6 3.17207e-15 0.8 + txt003 +STRI + V0 -0.2 0 2.7 V1 -0.192963 -0.0537037 2.7 V2 -0.165279 -0.0460445 2.78542 + N0 -0.6 3.17207e-15 0.8 N1 -0.578783 -0.15602 0.800417 N2 -0.917897 -0.246906 -0.310647 + txt003 +STRI + V0 -0.268946 0.0750782 3.12708 V1 -0.278704 0 3.12708 V2 0 0 3.15 + N0 -0.241077 0.0645609 0.968356 N1 -0.249998 0 0.968246 N2 0 0 1 + txt003 +STRI + V0 -0.241285 0.141931 3.12708 V1 -0.268946 0.0750782 3.12708 V2 0 0 3.15 + N0 -0.215548 0.124615 0.968509 N1 -0.241077 0.0645609 0.968356 N2 0 0 1 + txt003 +STRI + V0 -0.19814 0.19814 3.12708 V1 -0.241285 0.141931 3.12708 V2 0 0 3.15 + N0 -0.175885 0.175885 0.96857 N1 -0.215548 0.124615 0.968509 N2 0 0 1 + txt003 +STRI + V0 -0.141931 0.241285 3.12708 V1 -0.19814 0.19814 3.12708 V2 0 0 3.15 + N0 -0.124615 0.215548 0.968509 N1 -0.175885 0.175885 0.96857 N2 0 0 1 + txt003 +STRI + V0 -0.0750782 0.268946 3.12708 V1 -0.141931 0.241285 3.12708 V2 0 0 3.15 + N0 -0.0645609 0.241077 0.968356 N1 -0.124615 0.215548 0.968509 N2 0 0 1 + txt003 +STRI + V0 0 0.278704 3.12708 V1 -0.0750782 0.268946 3.12708 V2 0 0 3.15 + N0 2.80184e-15 0.249998 0.968246 N1 -0.0645609 0.241077 0.968356 N2 0 0 1 + txt003 +STRI + V0 -0.278704 0 3.12708 V1 -0.268946 0.0750782 3.12708 V2 -0.350254 0.0977709 3.06667 + N0 -0.249998 0 0.968246 N1 -0.241077 0.0645609 0.968356 N2 -0.955496 0.255913 0.146755 + txt003 +STRI + V0 -0.350254 0.0977709 3.06667 V1 -0.362963 0 3.06667 V2 -0.278704 0 3.12708 + N0 -0.955496 0.255913 0.146755 N1 -0.989203 0 0.146549 N2 -0.249998 0 0.968246 + txt003 +STRI + V0 -0.268946 0.0750782 3.12708 V1 -0.241285 0.141931 3.12708 V2 -0.314228 0.184834 3.06667 + N0 -0.241077 0.0645609 0.968356 N1 -0.215548 0.124615 0.968509 N2 -0.856312 0.495088 0.147029 + txt003 +STRI + V0 -0.314228 0.184834 3.06667 V1 -0.350254 0.0977709 3.06667 V2 -0.268946 0.0750782 3.12708 + N0 -0.856312 0.495088 0.147029 N1 -0.955496 0.255913 0.146755 N2 -0.241077 0.0645609 0.968356 + txt003 +STRI + V0 -0.241285 0.141931 3.12708 V1 -0.19814 0.19814 3.12708 V2 -0.258037 0.258037 3.06667 + N0 -0.215548 0.124615 0.968509 N1 -0.175885 0.175885 0.96857 N2 -0.699411 0.699411 0.147135 + txt003 +STRI + V0 -0.258037 0.258037 3.06667 V1 -0.314228 0.184834 3.06667 V2 -0.241285 0.141931 3.12708 + N0 -0.699411 0.699411 0.147135 N1 -0.856312 0.495088 0.147029 N2 -0.215548 0.124615 0.968509 + txt003 +STRI + V0 -0.19814 0.19814 3.12708 V1 -0.141931 0.241285 3.12708 V2 -0.184834 0.314228 3.06667 + N0 -0.175885 0.175885 0.96857 N1 -0.124615 0.215548 0.968509 N2 -0.495088 0.856312 0.147029 + txt003 +STRI + V0 -0.184834 0.314228 3.06667 V1 -0.258037 0.258037 3.06667 V2 -0.19814 0.19814 3.12708 + N0 -0.495088 0.856312 0.147029 N1 -0.699411 0.699411 0.147135 N2 -0.175885 0.175885 0.96857 + txt003 +STRI + V0 -0.141931 0.241285 3.12708 V1 -0.0750782 0.268946 3.12708 V2 -0.0977709 0.350254 3.06667 + N0 -0.124615 0.215548 0.968509 N1 -0.0645609 0.241077 0.968356 N2 -0.255913 0.955496 0.146755 + txt003 +STRI + V0 -0.0977709 0.350254 3.06667 V1 -0.184834 0.314228 3.06667 V2 -0.141931 0.241285 3.12708 + N0 -0.255913 0.955496 0.146755 N1 -0.495088 0.856312 0.147029 N2 -0.124615 0.215548 0.968509 + txt003 +STRI + V0 -0.0750782 0.268946 3.12708 V1 0 0.278704 3.12708 V2 0 0.362963 3.06667 + N0 -0.0645609 0.241077 0.968356 N1 2.80184e-15 0.249998 0.968246 N2 4.98112e-16 0.989203 0.146549 + txt003 +STRI + V0 0 0.362963 3.06667 V1 -0.0977709 0.350254 3.06667 V2 -0.0750782 0.268946 3.12708 + N0 4.98112e-16 0.989203 0.146549 N1 -0.255913 0.955496 0.146755 N2 -0.0645609 0.241077 0.968356 + txt003 +STRI + V0 -0.362963 0 3.06667 V1 -0.350254 0.0977709 3.06667 V2 -0.313617 0.0875289 2.98125 + N0 -0.989203 0 0.146549 N1 -0.955496 0.255913 0.146755 N2 -0.753688 0.201937 -0.625441 + txt003 +STRI + V0 -0.313617 0.0875289 2.98125 V1 -0.325 0 2.98125 V2 -0.362963 0 3.06667 + N0 -0.753688 0.201937 -0.625441 N1 -0.780869 0 -0.624695 N2 -0.989203 0 0.146549 + txt003 +STRI + V0 -0.350254 0.0977709 3.06667 V1 -0.314228 0.184834 3.06667 V2 -0.281352 0.165481 2.98125 + N0 -0.955496 0.255913 0.146755 N1 -0.856312 0.495088 0.147029 N2 -0.674735 0.390178 -0.626493 + txt003 +STRI + V0 -0.281352 0.165481 2.98125 V1 -0.313617 0.0875289 2.98125 V2 -0.350254 0.0977709 3.06667 + N0 -0.674735 0.390178 -0.626493 N1 -0.753688 0.201937 -0.625441 N2 -0.955496 0.255913 0.146755 + txt003 +STRI + V0 -0.314228 0.184834 3.06667 V1 -0.258037 0.258037 3.06667 V2 -0.231031 0.231031 2.98125 + N0 -0.856312 0.495088 0.147029 N1 -0.699411 0.699411 0.147135 N2 -0.550896 0.550896 -0.626919 + txt003 +STRI + V0 -0.231031 0.231031 2.98125 V1 -0.281352 0.165481 2.98125 V2 -0.314228 0.184834 3.06667 + N0 -0.550896 0.550896 -0.626919 N1 -0.674735 0.390178 -0.626493 N2 -0.856312 0.495088 0.147029 + txt003 +STRI + V0 -0.258037 0.258037 3.06667 V1 -0.184834 0.314228 3.06667 V2 -0.165481 0.281352 2.98125 + N0 -0.699411 0.699411 0.147135 N1 -0.495088 0.856312 0.147029 N2 -0.390178 0.674735 -0.626493 + txt003 +STRI + V0 -0.165481 0.281352 2.98125 V1 -0.231031 0.231031 2.98125 V2 -0.258037 0.258037 3.06667 + N0 -0.390178 0.674735 -0.626493 N1 -0.550896 0.550896 -0.626919 N2 -0.699411 0.699411 0.147135 + txt003 +STRI + V0 -0.184834 0.314228 3.06667 V1 -0.0977709 0.350254 3.06667 V2 -0.0875289 0.313617 2.98125 + N0 -0.495088 0.856312 0.147029 N1 -0.255913 0.955496 0.146755 N2 -0.201937 0.753688 -0.625441 + txt003 +STRI + V0 -0.0875289 0.313617 2.98125 V1 -0.165481 0.281352 2.98125 V2 -0.184834 0.314228 3.06667 + N0 -0.201937 0.753688 -0.625441 N1 -0.390178 0.674735 -0.626493 N2 -0.495088 0.856312 0.147029 + txt003 +STRI + V0 -0.0977709 0.350254 3.06667 V1 0 0.362963 3.06667 V2 1.11022e-16 0.325 2.98125 + N0 -0.255913 0.955496 0.146755 N1 4.98112e-16 0.989203 0.146549 N2 -1.51803e-15 0.780869 -0.624695 + txt003 +STRI + V0 1.11022e-16 0.325 2.98125 V1 -0.0875289 0.313617 2.98125 V2 -0.0977709 0.350254 3.06667 + N0 -1.51803e-15 0.780869 -0.624695 N1 -0.201937 0.753688 -0.625441 N2 -0.255913 0.955496 0.146755 + txt003 +STRI + V0 -0.325 0 2.98125 V1 -0.313617 0.0875289 2.98125 V2 -0.228728 0.0638032 2.88333 + N0 -0.780869 0 -0.624695 N1 -0.753688 0.201937 -0.625441 N2 -0.721244 0.193465 -0.665116 + txt003 +STRI + V0 -0.228728 0.0638032 2.88333 V1 -0.237037 0 2.88333 V2 -0.325 0 2.98125 + N0 -0.721244 0.193465 -0.665116 N1 -0.747409 0 -0.664364 N2 -0.780869 0 -0.624695 + txt003 +STRI + V0 -0.313617 0.0875289 2.98125 V1 -0.281352 0.165481 2.98125 V2 -0.20518 0.120647 2.88333 + N0 -0.753688 0.201937 -0.625441 N1 -0.674735 0.390178 -0.626493 N2 -0.645526 0.373497 -0.66618 + txt003 +STRI + V0 -0.20518 0.120647 2.88333 V1 -0.228728 0.0638032 2.88333 V2 -0.313617 0.0875289 2.98125 + N0 -0.645526 0.373497 -0.66618 N1 -0.721244 0.193465 -0.665116 N2 -0.753688 0.201937 -0.625441 + txt003 +STRI + V0 -0.281352 0.165481 2.98125 V1 -0.231031 0.231031 2.98125 V2 -0.168463 0.168463 2.88333 + N0 -0.674735 0.390178 -0.626493 N1 -0.550896 0.550896 -0.626919 N2 -0.527081 0.527081 -0.666611 + txt003 +STRI + V0 -0.168463 0.168463 2.88333 V1 -0.20518 0.120647 2.88333 V2 -0.281352 0.165481 2.98125 + N0 -0.527081 0.527081 -0.666611 N1 -0.645526 0.373497 -0.66618 N2 -0.674735 0.390178 -0.626493 + txt003 +STRI + V0 -0.231031 0.231031 2.98125 V1 -0.165481 0.281352 2.98125 V2 -0.120647 0.20518 2.88333 + N0 -0.550896 0.550896 -0.626919 N1 -0.390178 0.674735 -0.626493 N2 -0.373497 0.645526 -0.66618 + txt003 +STRI + V0 -0.120647 0.20518 2.88333 V1 -0.168463 0.168463 2.88333 V2 -0.231031 0.231031 2.98125 + N0 -0.373497 0.645526 -0.66618 N1 -0.527081 0.527081 -0.666611 N2 -0.550896 0.550896 -0.626919 + txt003 +STRI + V0 -0.165481 0.281352 2.98125 V1 -0.0875289 0.313617 2.98125 V2 -0.0638032 0.228728 2.88333 + N0 -0.390178 0.674735 -0.626493 N1 -0.201937 0.753688 -0.625441 N2 -0.193465 0.721244 -0.665116 + txt003 +STRI + V0 -0.0638032 0.228728 2.88333 V1 -0.120647 0.20518 2.88333 V2 -0.165481 0.281352 2.98125 + N0 -0.193465 0.721244 -0.665116 N1 -0.373497 0.645526 -0.66618 N2 -0.390178 0.674735 -0.626493 + txt003 +STRI + V0 -0.0875289 0.313617 2.98125 V1 1.11022e-16 0.325 2.98125 V2 1.11022e-16 0.237037 2.88333 + N0 -0.201937 0.753688 -0.625441 N1 -1.51803e-15 0.780869 -0.624695 N2 -2.42292e-15 0.747409 -0.664364 + txt003 +STRI + V0 1.11022e-16 0.237037 2.88333 V1 -0.0638032 0.228728 2.88333 V2 -0.0875289 0.313617 2.98125 + N0 -2.42292e-15 0.747409 -0.664364 N1 -0.193465 0.721244 -0.665116 N2 -0.201937 0.753688 -0.625441 + txt003 +STRI + V0 -0.237037 0 2.88333 V1 -0.228728 0.0638032 2.88333 V2 -0.165279 0.0460445 2.78542 + N0 -0.747409 0 -0.664364 N1 -0.721244 0.193465 -0.665116 N2 -0.917897 0.246906 -0.310647 + txt003 +STRI + V0 -0.165279 0.0460445 2.78542 V1 -0.171296 0 2.78542 V2 -0.237037 0 2.88333 + N0 -0.917897 0.246906 -0.310647 N1 -0.950775 0 -0.309882 N2 -0.747409 0 -0.664364 + txt003 +STRI + V0 -0.228728 0.0638032 2.88333 V1 -0.20518 0.120647 2.88333 V2 -0.148234 0.0871056 2.78542 + N0 -0.721244 0.193465 -0.665116 N1 -0.645526 0.373497 -0.66618 N2 -0.822132 0.476337 -0.311772 + txt003 +STRI + V0 -0.148234 0.0871056 2.78542 V1 -0.165279 0.0460445 2.78542 V2 -0.228728 0.0638032 2.88333 + N0 -0.822132 0.476337 -0.311772 N1 -0.917897 0.246906 -0.310647 N2 -0.721244 0.193465 -0.665116 + txt003 +STRI + V0 -0.20518 0.120647 2.88333 V1 -0.168463 0.168463 2.88333 V2 -0.121672 0.121672 2.78542 + N0 -0.645526 0.373497 -0.66618 N1 -0.527081 0.527081 -0.666611 N2 -0.671754 0.671754 -0.312241 + txt003 +STRI + V0 -0.121672 0.121672 2.78542 V1 -0.148234 0.0871056 2.78542 V2 -0.20518 0.120647 2.88333 + N0 -0.671754 0.671754 -0.312241 N1 -0.822132 0.476337 -0.311772 N2 -0.645526 0.373497 -0.66618 + txt003 +STRI + V0 -0.168463 0.168463 2.88333 V1 -0.120647 0.20518 2.88333 V2 -0.0871056 0.148234 2.78542 + N0 -0.527081 0.527081 -0.666611 N1 -0.373497 0.645526 -0.66618 N2 -0.476337 0.822132 -0.311772 + txt003 +STRI + V0 -0.0871056 0.148234 2.78542 V1 -0.121672 0.121672 2.78542 V2 -0.168463 0.168463 2.88333 + N0 -0.476337 0.822132 -0.311772 N1 -0.671754 0.671754 -0.312241 N2 -0.527081 0.527081 -0.666611 + txt003 +STRI + V0 -0.120647 0.20518 2.88333 V1 -0.0638032 0.228728 2.88333 V2 -0.0460445 0.165279 2.78542 + N0 -0.373497 0.645526 -0.66618 N1 -0.193465 0.721244 -0.665116 N2 -0.246906 0.917897 -0.310647 + txt003 +STRI + V0 -0.0460445 0.165279 2.78542 V1 -0.0871056 0.148234 2.78542 V2 -0.120647 0.20518 2.88333 + N0 -0.246906 0.917897 -0.310647 N1 -0.476337 0.822132 -0.311772 N2 -0.373497 0.645526 -0.66618 + txt003 +STRI + V0 -0.0638032 0.228728 2.88333 V1 1.11022e-16 0.237037 2.88333 V2 6.66134e-16 0.171296 2.78542 + N0 -0.193465 0.721244 -0.665116 N1 -2.42292e-15 0.747409 -0.664364 N2 -2.16507e-15 0.950775 -0.309882 + txt003 +STRI + V0 6.66134e-16 0.171296 2.78542 V1 -0.0460445 0.165279 2.78542 V2 -0.0638032 0.228728 2.88333 + N0 -2.16507e-15 0.950775 -0.309882 N1 -0.246906 0.917897 -0.310647 N2 -0.193465 0.721244 -0.665116 + txt003 +STRI + V0 -0.171296 0 2.78542 V1 -0.165279 0.0460445 2.78542 V2 -0.192963 0.0537037 2.7 + N0 -0.950775 0 -0.309882 N1 -0.917897 0.246906 -0.310647 N2 -0.578783 0.15602 0.800417 + txt003 +STRI + V0 -0.192963 0.0537037 2.7 V1 -0.2 0 2.7 V2 -0.171296 0 2.78542 + N0 -0.578783 0.15602 0.800417 N1 -0.6 0 0.8 N2 -0.950775 0 -0.309882 + txt003 +STRI + V0 -0.165279 0.0460445 2.78542 V1 -0.148234 0.0871056 2.78542 V2 -0.173037 0.10163 2.7 + N0 -0.917897 0.246906 -0.310647 N1 -0.822132 0.476337 -0.311772 N2 -0.517905 0.300385 0.800964 + txt003 +STRI + V0 -0.173037 0.10163 2.7 V1 -0.192963 0.0537037 2.7 V2 -0.165279 0.0460445 2.78542 + N0 -0.517905 0.300385 0.800964 N1 -0.578783 0.15602 0.800417 N2 -0.917897 0.246906 -0.310647 + txt003 +STRI + V0 -0.148234 0.0871056 2.78542 V1 -0.121672 0.121672 2.78542 V2 -0.142 0.142 2.7 + N0 -0.822132 0.476337 -0.311772 N1 -0.671754 0.671754 -0.312241 N2 -0.423155 0.423155 0.801174 + txt003 +STRI + V0 -0.142 0.142 2.7 V1 -0.173037 0.10163 2.7 V2 -0.148234 0.0871056 2.78542 + N0 -0.423155 0.423155 0.801174 N1 -0.517905 0.300385 0.800964 N2 -0.822132 0.476337 -0.311772 + txt003 +STRI + V0 -0.121672 0.121672 2.78542 V1 -0.0871056 0.148234 2.78542 V2 -0.10163 0.173037 2.7 + N0 -0.671754 0.671754 -0.312241 N1 -0.476337 0.822132 -0.311772 N2 -0.300385 0.517905 0.800964 + txt003 +STRI + V0 -0.10163 0.173037 2.7 V1 -0.142 0.142 2.7 V2 -0.121672 0.121672 2.78542 + N0 -0.300385 0.517905 0.800964 N1 -0.423155 0.423155 0.801174 N2 -0.671754 0.671754 -0.312241 + txt003 +STRI + V0 -0.0871056 0.148234 2.78542 V1 -0.0460445 0.165279 2.78542 V2 -0.0537037 0.192963 2.7 + N0 -0.476337 0.822132 -0.311772 N1 -0.246906 0.917897 -0.310647 N2 -0.15602 0.578783 0.800417 + txt003 +STRI + V0 -0.0537037 0.192963 2.7 V1 -0.10163 0.173037 2.7 V2 -0.0871056 0.148234 2.78542 + N0 -0.15602 0.578783 0.800417 N1 -0.300385 0.517905 0.800964 N2 -0.476337 0.822132 -0.311772 + txt003 +STRI + V0 -0.0460445 0.165279 2.78542 V1 6.66134e-16 0.171296 2.78542 V2 0 0.2 2.7 + N0 -0.246906 0.917897 -0.310647 N1 -2.16507e-15 0.950775 -0.309882 N2 3.17207e-15 0.6 0.8 + txt003 +STRI + V0 0 0.2 2.7 V1 -0.0537037 0.192963 2.7 V2 -0.0460445 0.165279 2.78542 + N0 3.17207e-15 0.6 0.8 N1 -0.15602 0.578783 0.800417 N2 -0.246906 0.917897 -0.310647 + txt003 +STRI + V0 0.0750782 0.268946 3.12708 V1 0 0.278704 3.12708 V2 0 0 3.15 + N0 0.0645609 0.241077 0.968356 N1 -0 0.249998 0.968246 N2 0 0 1 + txt003 +STRI + V0 0.141931 0.241285 3.12708 V1 0.0750782 0.268946 3.12708 V2 0 0 3.15 + N0 0.124615 0.215548 0.968509 N1 0.0645609 0.241077 0.968356 N2 0 0 1 + txt003 +STRI + V0 0.19814 0.19814 3.12708 V1 0.141931 0.241285 3.12708 V2 0 0 3.15 + N0 0.175885 0.175885 0.96857 N1 0.124615 0.215548 0.968509 N2 0 0 1 + txt003 +STRI + V0 0.241285 0.141931 3.12708 V1 0.19814 0.19814 3.12708 V2 0 0 3.15 + N0 0.215548 0.124615 0.968509 N1 0.175885 0.175885 0.96857 N2 0 0 1 + txt003 +STRI + V0 0.268946 0.0750782 3.12708 V1 0.241285 0.141931 3.12708 V2 0 0 3.15 + N0 0.241077 0.0645609 0.968356 N1 0.215548 0.124615 0.968509 N2 0 0 1 + txt003 +STRI + V0 0.278704 0 3.12708 V1 0.268946 0.0750782 3.12708 V2 0 0 3.15 + N0 0.249998 -2.80184e-15 0.968246 N1 0.241077 0.0645609 0.968356 N2 0 0 1 + txt003 +STRI + V0 0 0.278704 3.12708 V1 0.0750782 0.268946 3.12708 V2 0.0977709 0.350254 3.06667 + N0 -0 0.249998 0.968246 N1 0.0645609 0.241077 0.968356 N2 0.255913 0.955496 0.146755 + txt003 +STRI + V0 0.0977709 0.350254 3.06667 V1 0 0.362963 3.06667 V2 0 0.278704 3.12708 + N0 0.255913 0.955496 0.146755 N1 -0 0.989203 0.146549 N2 -0 0.249998 0.968246 + txt003 +STRI + V0 0.0750782 0.268946 3.12708 V1 0.141931 0.241285 3.12708 V2 0.184834 0.314228 3.06667 + N0 0.0645609 0.241077 0.968356 N1 0.124615 0.215548 0.968509 N2 0.495088 0.856312 0.147029 + txt003 +STRI + V0 0.184834 0.314228 3.06667 V1 0.0977709 0.350254 3.06667 V2 0.0750782 0.268946 3.12708 + N0 0.495088 0.856312 0.147029 N1 0.255913 0.955496 0.146755 N2 0.0645609 0.241077 0.968356 + txt003 +STRI + V0 0.141931 0.241285 3.12708 V1 0.19814 0.19814 3.12708 V2 0.258037 0.258037 3.06667 + N0 0.124615 0.215548 0.968509 N1 0.175885 0.175885 0.96857 N2 0.699411 0.699411 0.147135 + txt003 +STRI + V0 0.258037 0.258037 3.06667 V1 0.184834 0.314228 3.06667 V2 0.141931 0.241285 3.12708 + N0 0.699411 0.699411 0.147135 N1 0.495088 0.856312 0.147029 N2 0.124615 0.215548 0.968509 + txt003 +STRI + V0 0.19814 0.19814 3.12708 V1 0.241285 0.141931 3.12708 V2 0.314228 0.184834 3.06667 + N0 0.175885 0.175885 0.96857 N1 0.215548 0.124615 0.968509 N2 0.856312 0.495088 0.147029 + txt003 +STRI + V0 0.314228 0.184834 3.06667 V1 0.258037 0.258037 3.06667 V2 0.19814 0.19814 3.12708 + N0 0.856312 0.495088 0.147029 N1 0.699411 0.699411 0.147135 N2 0.175885 0.175885 0.96857 + txt003 +STRI + V0 0.241285 0.141931 3.12708 V1 0.268946 0.0750782 3.12708 V2 0.350254 0.0977709 3.06667 + N0 0.215548 0.124615 0.968509 N1 0.241077 0.0645609 0.968356 N2 0.955496 0.255913 0.146755 + txt003 +STRI + V0 0.350254 0.0977709 3.06667 V1 0.314228 0.184834 3.06667 V2 0.241285 0.141931 3.12708 + N0 0.955496 0.255913 0.146755 N1 0.856312 0.495088 0.147029 N2 0.215548 0.124615 0.968509 + txt003 +STRI + V0 0.268946 0.0750782 3.12708 V1 0.278704 0 3.12708 V2 0.362963 0 3.06667 + N0 0.241077 0.0645609 0.968356 N1 0.249998 -2.80184e-15 0.968246 N2 0.989203 -4.98112e-16 0.146549 + txt003 +STRI + V0 0.362963 0 3.06667 V1 0.350254 0.0977709 3.06667 V2 0.268946 0.0750782 3.12708 + N0 0.989203 -4.98112e-16 0.146549 N1 0.955496 0.255913 0.146755 N2 0.241077 0.0645609 0.968356 + txt003 +STRI + V0 0 0.362963 3.06667 V1 0.0977709 0.350254 3.06667 V2 0.0875289 0.313617 2.98125 + N0 -0 0.989203 0.146549 N1 0.255913 0.955496 0.146755 N2 0.201937 0.753688 -0.625441 + txt003 +STRI + V0 0.0875289 0.313617 2.98125 V1 0 0.325 2.98125 V2 0 0.362963 3.06667 + N0 0.201937 0.753688 -0.625441 N1 0 0.780869 -0.624695 N2 -0 0.989203 0.146549 + txt003 +STRI + V0 0.0977709 0.350254 3.06667 V1 0.184834 0.314228 3.06667 V2 0.165481 0.281352 2.98125 + N0 0.255913 0.955496 0.146755 N1 0.495088 0.856312 0.147029 N2 0.390178 0.674735 -0.626493 + txt003 +STRI + V0 0.165481 0.281352 2.98125 V1 0.0875289 0.313617 2.98125 V2 0.0977709 0.350254 3.06667 + N0 0.390178 0.674735 -0.626493 N1 0.201937 0.753688 -0.625441 N2 0.255913 0.955496 0.146755 + txt003 +STRI + V0 0.184834 0.314228 3.06667 V1 0.258037 0.258037 3.06667 V2 0.231031 0.231031 2.98125 + N0 0.495088 0.856312 0.147029 N1 0.699411 0.699411 0.147135 N2 0.550896 0.550896 -0.626919 + txt003 +STRI + V0 0.231031 0.231031 2.98125 V1 0.165481 0.281352 2.98125 V2 0.184834 0.314228 3.06667 + N0 0.550896 0.550896 -0.626919 N1 0.390178 0.674735 -0.626493 N2 0.495088 0.856312 0.147029 + txt003 +STRI + V0 0.258037 0.258037 3.06667 V1 0.314228 0.184834 3.06667 V2 0.281352 0.165481 2.98125 + N0 0.699411 0.699411 0.147135 N1 0.856312 0.495088 0.147029 N2 0.674735 0.390178 -0.626493 + txt003 +STRI + V0 0.281352 0.165481 2.98125 V1 0.231031 0.231031 2.98125 V2 0.258037 0.258037 3.06667 + N0 0.674735 0.390178 -0.626493 N1 0.550896 0.550896 -0.626919 N2 0.699411 0.699411 0.147135 + txt003 +STRI + V0 0.314228 0.184834 3.06667 V1 0.350254 0.0977709 3.06667 V2 0.313617 0.0875289 2.98125 + N0 0.856312 0.495088 0.147029 N1 0.955496 0.255913 0.146755 N2 0.753688 0.201937 -0.625441 + txt003 +STRI + V0 0.313617 0.0875289 2.98125 V1 0.281352 0.165481 2.98125 V2 0.314228 0.184834 3.06667 + N0 0.753688 0.201937 -0.625441 N1 0.674735 0.390178 -0.626493 N2 0.856312 0.495088 0.147029 + txt003 +STRI + V0 0.350254 0.0977709 3.06667 V1 0.362963 0 3.06667 V2 0.325 -1.11022e-16 2.98125 + N0 0.955496 0.255913 0.146755 N1 0.989203 -4.98112e-16 0.146549 N2 0.780869 1.51803e-15 -0.624695 + txt003 +STRI + V0 0.325 -1.11022e-16 2.98125 V1 0.313617 0.0875289 2.98125 V2 0.350254 0.0977709 3.06667 + N0 0.780869 1.51803e-15 -0.624695 N1 0.753688 0.201937 -0.625441 N2 0.955496 0.255913 0.146755 + txt003 +STRI + V0 0 0.325 2.98125 V1 0.0875289 0.313617 2.98125 V2 0.0638032 0.228728 2.88333 + N0 0 0.780869 -0.624695 N1 0.201937 0.753688 -0.625441 N2 0.193465 0.721244 -0.665116 + txt003 +STRI + V0 0.0638032 0.228728 2.88333 V1 0 0.237037 2.88333 V2 0 0.325 2.98125 + N0 0.193465 0.721244 -0.665116 N1 0 0.747409 -0.664364 N2 0 0.780869 -0.624695 + txt003 +STRI + V0 0.0875289 0.313617 2.98125 V1 0.165481 0.281352 2.98125 V2 0.120647 0.20518 2.88333 + N0 0.201937 0.753688 -0.625441 N1 0.390178 0.674735 -0.626493 N2 0.373497 0.645526 -0.66618 + txt003 +STRI + V0 0.120647 0.20518 2.88333 V1 0.0638032 0.228728 2.88333 V2 0.0875289 0.313617 2.98125 + N0 0.373497 0.645526 -0.66618 N1 0.193465 0.721244 -0.665116 N2 0.201937 0.753688 -0.625441 + txt003 +STRI + V0 0.165481 0.281352 2.98125 V1 0.231031 0.231031 2.98125 V2 0.168463 0.168463 2.88333 + N0 0.390178 0.674735 -0.626493 N1 0.550896 0.550896 -0.626919 N2 0.527081 0.527081 -0.666611 + txt003 +STRI + V0 0.168463 0.168463 2.88333 V1 0.120647 0.20518 2.88333 V2 0.165481 0.281352 2.98125 + N0 0.527081 0.527081 -0.666611 N1 0.373497 0.645526 -0.66618 N2 0.390178 0.674735 -0.626493 + txt003 +STRI + V0 0.231031 0.231031 2.98125 V1 0.281352 0.165481 2.98125 V2 0.20518 0.120647 2.88333 + N0 0.550896 0.550896 -0.626919 N1 0.674735 0.390178 -0.626493 N2 0.645526 0.373497 -0.66618 + txt003 +STRI + V0 0.20518 0.120647 2.88333 V1 0.168463 0.168463 2.88333 V2 0.231031 0.231031 2.98125 + N0 0.645526 0.373497 -0.66618 N1 0.527081 0.527081 -0.666611 N2 0.550896 0.550896 -0.626919 + txt003 +STRI + V0 0.281352 0.165481 2.98125 V1 0.313617 0.0875289 2.98125 V2 0.228728 0.0638032 2.88333 + N0 0.674735 0.390178 -0.626493 N1 0.753688 0.201937 -0.625441 N2 0.721244 0.193465 -0.665116 + txt003 +STRI + V0 0.228728 0.0638032 2.88333 V1 0.20518 0.120647 2.88333 V2 0.281352 0.165481 2.98125 + N0 0.721244 0.193465 -0.665116 N1 0.645526 0.373497 -0.66618 N2 0.674735 0.390178 -0.626493 + txt003 +STRI + V0 0.313617 0.0875289 2.98125 V1 0.325 -1.11022e-16 2.98125 V2 0.237037 -1.11022e-16 2.88333 + N0 0.753688 0.201937 -0.625441 N1 0.780869 1.51803e-15 -0.624695 N2 0.747409 2.42292e-15 -0.664364 + txt003 +STRI + V0 0.237037 -1.11022e-16 2.88333 V1 0.228728 0.0638032 2.88333 V2 0.313617 0.0875289 2.98125 + N0 0.747409 2.42292e-15 -0.664364 N1 0.721244 0.193465 -0.665116 N2 0.753688 0.201937 -0.625441 + txt003 +STRI + V0 0 0.237037 2.88333 V1 0.0638032 0.228728 2.88333 V2 0.0460445 0.165279 2.78542 + N0 0 0.747409 -0.664364 N1 0.193465 0.721244 -0.665116 N2 0.246906 0.917897 -0.310647 + txt003 +STRI + V0 0.0460445 0.165279 2.78542 V1 0 0.171296 2.78542 V2 0 0.237037 2.88333 + N0 0.246906 0.917897 -0.310647 N1 0 0.950775 -0.309882 N2 0 0.747409 -0.664364 + txt003 +STRI + V0 0.0638032 0.228728 2.88333 V1 0.120647 0.20518 2.88333 V2 0.0871056 0.148234 2.78542 + N0 0.193465 0.721244 -0.665116 N1 0.373497 0.645526 -0.66618 N2 0.476337 0.822132 -0.311772 + txt003 +STRI + V0 0.0871056 0.148234 2.78542 V1 0.0460445 0.165279 2.78542 V2 0.0638032 0.228728 2.88333 + N0 0.476337 0.822132 -0.311772 N1 0.246906 0.917897 -0.310647 N2 0.193465 0.721244 -0.665116 + txt003 +STRI + V0 0.120647 0.20518 2.88333 V1 0.168463 0.168463 2.88333 V2 0.121672 0.121672 2.78542 + N0 0.373497 0.645526 -0.66618 N1 0.527081 0.527081 -0.666611 N2 0.671754 0.671754 -0.312241 + txt003 +STRI + V0 0.121672 0.121672 2.78542 V1 0.0871056 0.148234 2.78542 V2 0.120647 0.20518 2.88333 + N0 0.671754 0.671754 -0.312241 N1 0.476337 0.822132 -0.311772 N2 0.373497 0.645526 -0.66618 + txt003 +STRI + V0 0.168463 0.168463 2.88333 V1 0.20518 0.120647 2.88333 V2 0.148234 0.0871056 2.78542 + N0 0.527081 0.527081 -0.666611 N1 0.645526 0.373497 -0.66618 N2 0.822132 0.476337 -0.311772 + txt003 +STRI + V0 0.148234 0.0871056 2.78542 V1 0.121672 0.121672 2.78542 V2 0.168463 0.168463 2.88333 + N0 0.822132 0.476337 -0.311772 N1 0.671754 0.671754 -0.312241 N2 0.527081 0.527081 -0.666611 + txt003 +STRI + V0 0.20518 0.120647 2.88333 V1 0.228728 0.0638032 2.88333 V2 0.165279 0.0460445 2.78542 + N0 0.645526 0.373497 -0.66618 N1 0.721244 0.193465 -0.665116 N2 0.917897 0.246906 -0.310647 + txt003 +STRI + V0 0.165279 0.0460445 2.78542 V1 0.148234 0.0871056 2.78542 V2 0.20518 0.120647 2.88333 + N0 0.917897 0.246906 -0.310647 N1 0.822132 0.476337 -0.311772 N2 0.645526 0.373497 -0.66618 + txt003 +STRI + V0 0.228728 0.0638032 2.88333 V1 0.237037 -1.11022e-16 2.88333 V2 0.171296 -6.66134e-16 2.78542 + N0 0.721244 0.193465 -0.665116 N1 0.747409 2.42292e-15 -0.664364 N2 0.950775 2.16507e-15 -0.309882 + txt003 +STRI + V0 0.171296 -6.66134e-16 2.78542 V1 0.165279 0.0460445 2.78542 V2 0.228728 0.0638032 2.88333 + N0 0.950775 2.16507e-15 -0.309882 N1 0.917897 0.246906 -0.310647 N2 0.721244 0.193465 -0.665116 + txt003 +STRI + V0 0 0.171296 2.78542 V1 0.0460445 0.165279 2.78542 V2 0.0537037 0.192963 2.7 + N0 0 0.950775 -0.309882 N1 0.246906 0.917897 -0.310647 N2 0.15602 0.578783 0.800417 + txt003 +STRI + V0 0.0537037 0.192963 2.7 V1 0 0.2 2.7 V2 0 0.171296 2.78542 + N0 0.15602 0.578783 0.800417 N1 -0 0.6 0.8 N2 0 0.950775 -0.309882 + txt003 +STRI + V0 0.0460445 0.165279 2.78542 V1 0.0871056 0.148234 2.78542 V2 0.10163 0.173037 2.7 + N0 0.246906 0.917897 -0.310647 N1 0.476337 0.822132 -0.311772 N2 0.300385 0.517905 0.800964 + txt003 +STRI + V0 0.10163 0.173037 2.7 V1 0.0537037 0.192963 2.7 V2 0.0460445 0.165279 2.78542 + N0 0.300385 0.517905 0.800964 N1 0.15602 0.578783 0.800417 N2 0.246906 0.917897 -0.310647 + txt003 +STRI + V0 0.0871056 0.148234 2.78542 V1 0.121672 0.121672 2.78542 V2 0.142 0.142 2.7 + N0 0.476337 0.822132 -0.311772 N1 0.671754 0.671754 -0.312241 N2 0.423155 0.423155 0.801174 + txt003 +STRI + V0 0.142 0.142 2.7 V1 0.10163 0.173037 2.7 V2 0.0871056 0.148234 2.78542 + N0 0.423155 0.423155 0.801174 N1 0.300385 0.517905 0.800964 N2 0.476337 0.822132 -0.311772 + txt003 +STRI + V0 0.121672 0.121672 2.78542 V1 0.148234 0.0871056 2.78542 V2 0.173037 0.10163 2.7 + N0 0.671754 0.671754 -0.312241 N1 0.822132 0.476337 -0.311772 N2 0.517905 0.300385 0.800964 + txt003 +STRI + V0 0.173037 0.10163 2.7 V1 0.142 0.142 2.7 V2 0.121672 0.121672 2.78542 + N0 0.517905 0.300385 0.800964 N1 0.423155 0.423155 0.801174 N2 0.671754 0.671754 -0.312241 + txt003 +STRI + V0 0.148234 0.0871056 2.78542 V1 0.165279 0.0460445 2.78542 V2 0.192963 0.0537037 2.7 + N0 0.822132 0.476337 -0.311772 N1 0.917897 0.246906 -0.310647 N2 0.578783 0.15602 0.800417 + txt003 +STRI + V0 0.192963 0.0537037 2.7 V1 0.173037 0.10163 2.7 V2 0.148234 0.0871056 2.78542 + N0 0.578783 0.15602 0.800417 N1 0.517905 0.300385 0.800964 N2 0.822132 0.476337 -0.311772 + txt003 +STRI + V0 0.165279 0.0460445 2.78542 V1 0.171296 -6.66134e-16 2.78542 V2 0.2 0 2.7 + N0 0.917897 0.246906 -0.310647 N1 0.950775 2.16507e-15 -0.309882 N2 0.6 -3.17207e-15 0.8 + txt003 +STRI + V0 0.2 0 2.7 V1 0.192963 0.0537037 2.7 V2 0.165279 0.0460445 2.78542 + N0 0.6 -3.17207e-15 0.8 N1 0.578783 0.15602 0.800417 N2 0.917897 0.246906 -0.310647 + txt003 +STRI + V0 0.2 0 2.7 V1 0.192963 -0.0537037 2.7 V2 0.338579 -0.0942301 2.63611 + N0 0.6 0 0.8 N1 0.578783 -0.15602 0.800417 N2 0.258756 -0.0697517 0.963421 + txt003 +STRI + V0 0.338579 -0.0942301 2.63611 V1 0.350926 0 2.63611 V2 0.2 0 2.7 + N0 0.258756 -0.0697517 0.963421 N1 0.268354 0 0.96332 N2 0.6 0 0.8 + txt003 +STRI + V0 0.192963 -0.0537037 2.7 V1 0.173037 -0.10163 2.7 V2 0.303616 -0.178322 2.63611 + N0 0.578783 -0.15602 0.800417 N1 0.517905 -0.300385 0.800964 N2 0.231413 -0.134219 0.963552 + txt003 +STRI + V0 0.303616 -0.178322 2.63611 V1 0.338579 -0.0942301 2.63611 V2 0.192963 -0.0537037 2.7 + N0 0.231413 -0.134219 0.963552 N1 0.258756 -0.0697517 0.963421 N2 0.578783 -0.15602 0.800417 + txt003 +STRI + V0 0.173037 -0.10163 2.7 V1 0.142 -0.142 2.7 V2 0.249157 -0.249157 2.63611 + N0 0.517905 -0.300385 0.800964 N1 0.423155 -0.423155 0.801174 N2 0.189037 -0.189037 0.963603 + txt003 +STRI + V0 0.249157 -0.249157 2.63611 V1 0.303616 -0.178322 2.63611 V2 0.173037 -0.10163 2.7 + N0 0.189037 -0.189037 0.963603 N1 0.231413 -0.134219 0.963552 N2 0.517905 -0.300385 0.800964 + txt003 +STRI + V0 0.142 -0.142 2.7 V1 0.10163 -0.173037 2.7 V2 0.178322 -0.303616 2.63611 + N0 0.423155 -0.423155 0.801174 N1 0.300385 -0.517905 0.800964 N2 0.134219 -0.231413 0.963552 + txt003 +STRI + V0 0.178322 -0.303616 2.63611 V1 0.249157 -0.249157 2.63611 V2 0.142 -0.142 2.7 + N0 0.134219 -0.231413 0.963552 N1 0.189037 -0.189037 0.963603 N2 0.423155 -0.423155 0.801174 + txt003 +STRI + V0 0.10163 -0.173037 2.7 V1 0.0537037 -0.192963 2.7 V2 0.0942301 -0.338579 2.63611 + N0 0.300385 -0.517905 0.800964 N1 0.15602 -0.578783 0.800417 N2 0.0697517 -0.258756 0.963421 + txt003 +STRI + V0 0.0942301 -0.338579 2.63611 V1 0.178322 -0.303616 2.63611 V2 0.10163 -0.173037 2.7 + N0 0.0697517 -0.258756 0.963421 N1 0.134219 -0.231413 0.963552 N2 0.300385 -0.517905 0.800964 + txt003 +STRI + V0 0.0537037 -0.192963 2.7 V1 0 -0.2 2.7 V2 5.55112e-17 -0.350926 2.63611 + N0 0.15602 -0.578783 0.800417 N1 -9.91271e-17 -0.6 0.8 N2 0 -0.268354 0.96332 + txt003 +STRI + V0 5.55112e-17 -0.350926 2.63611 V1 0.0942301 -0.338579 2.63611 V2 0.0537037 -0.192963 2.7 + N0 0 -0.268354 0.96332 N1 0.0697517 -0.258756 0.963421 N2 0.15602 -0.578783 0.800417 + txt003 +STRI + V0 0.350926 0 2.63611 V1 0.338579 -0.0942301 2.63611 V2 0.553875 -0.15415 2.58889 + N0 0.268354 0 0.96332 N1 0.258756 -0.0697517 0.963421 N2 0.162011 -0.0436726 0.985822 + txt003 +STRI + V0 0.553875 -0.15415 2.58889 V1 0.574074 0 2.58889 V2 0.350926 0 2.63611 + N0 0.162011 -0.0436726 0.985822 N1 0.168031 0 0.985782 N2 0.268354 0 0.96332 + txt003 +STRI + V0 0.338579 -0.0942301 2.63611 V1 0.303616 -0.178322 2.63611 V2 0.49668 -0.291715 2.58889 + N0 0.258756 -0.0697517 0.963421 N1 0.231413 -0.134219 0.963552 N2 0.144879 -0.0840299 0.985875 + txt003 +STRI + V0 0.49668 -0.291715 2.58889 V1 0.553875 -0.15415 2.58889 V2 0.338579 -0.0942301 2.63611 + N0 0.144879 -0.0840299 0.985875 N1 0.162011 -0.0436726 0.985822 N2 0.258756 -0.0697517 0.963421 + txt003 +STRI + V0 0.303616 -0.178322 2.63611 V1 0.249157 -0.249157 2.63611 V2 0.407593 -0.407593 2.58889 + N0 0.231413 -0.134219 0.963552 N1 0.189037 -0.189037 0.963603 N2 0.118345 -0.118345 0.985895 + txt003 +STRI + V0 0.407593 -0.407593 2.58889 V1 0.49668 -0.291715 2.58889 V2 0.303616 -0.178322 2.63611 + N0 0.118345 -0.118345 0.985895 N1 0.144879 -0.0840299 0.985875 N2 0.231413 -0.134219 0.963552 + txt003 +STRI + V0 0.249157 -0.249157 2.63611 V1 0.178322 -0.303616 2.63611 V2 0.291715 -0.49668 2.58889 + N0 0.189037 -0.189037 0.963603 N1 0.134219 -0.231413 0.963552 N2 0.0840299 -0.144879 0.985875 + txt003 +STRI + V0 0.291715 -0.49668 2.58889 V1 0.407593 -0.407593 2.58889 V2 0.249157 -0.249157 2.63611 + N0 0.0840299 -0.144879 0.985875 N1 0.118345 -0.118345 0.985895 N2 0.189037 -0.189037 0.963603 + txt003 +STRI + V0 0.178322 -0.303616 2.63611 V1 0.0942301 -0.338579 2.63611 V2 0.15415 -0.553875 2.58889 + N0 0.134219 -0.231413 0.963552 N1 0.0697517 -0.258756 0.963421 N2 0.0436726 -0.162011 0.985822 + txt003 +STRI + V0 0.15415 -0.553875 2.58889 V1 0.291715 -0.49668 2.58889 V2 0.178322 -0.303616 2.63611 + N0 0.0436726 -0.162011 0.985822 N1 0.0840299 -0.144879 0.985875 N2 0.134219 -0.231413 0.963552 + txt003 +STRI + V0 0.0942301 -0.338579 2.63611 V1 5.55112e-17 -0.350926 2.63611 V2 2.22045e-16 -0.574074 2.58889 + N0 0.0697517 -0.258756 0.963421 N1 0 -0.268354 0.96332 N2 -1.93429e-17 -0.168031 0.985782 + txt003 +STRI + V0 2.22045e-16 -0.574074 2.58889 V1 0.15415 -0.553875 2.58889 V2 0.0942301 -0.338579 2.63611 + N0 -1.93429e-17 -0.168031 0.985782 N1 0.0436726 -0.162011 0.985822 N2 0.0697517 -0.258756 0.963421 + txt003 +STRI + V0 0.574074 0 2.58889 V1 0.553875 -0.15415 2.58889 V2 0.795972 -0.221528 2.55 + N0 0.168031 0 0.985782 N1 0.162011 -0.0436726 0.985822 N2 0.143025 -0.0385545 0.988968 + txt003 +STRI + V0 0.795972 -0.221528 2.55 V1 0.825 0 2.55 V2 0.574074 0 2.58889 + N0 0.143025 -0.0385545 0.988968 N1 0.14834 0 0.988936 N2 0.168031 0 0.985782 + txt003 +STRI + V0 0.553875 -0.15415 2.58889 V1 0.49668 -0.291715 2.58889 V2 0.713778 -0.419222 2.55 + N0 0.162011 -0.0436726 0.985822 N1 0.144879 -0.0840299 0.985875 N2 0.127899 -0.0741814 0.989009 + txt003 +STRI + V0 0.713778 -0.419222 2.55 V1 0.795972 -0.221528 2.55 V2 0.553875 -0.15415 2.58889 + N0 0.127899 -0.0741814 0.989009 N1 0.143025 -0.0385545 0.988968 N2 0.162011 -0.0436726 0.985822 + txt003 +STRI + V0 0.49668 -0.291715 2.58889 V1 0.407593 -0.407593 2.58889 V2 0.58575 -0.58575 2.55 + N0 0.144879 -0.0840299 0.985875 N1 0.118345 -0.118345 0.985895 N2 0.104474 -0.104474 0.989025 + txt003 +STRI + V0 0.58575 -0.58575 2.55 V1 0.713778 -0.419222 2.55 V2 0.49668 -0.291715 2.58889 + N0 0.104474 -0.104474 0.989025 N1 0.127899 -0.0741814 0.989009 N2 0.144879 -0.0840299 0.985875 + txt003 +STRI + V0 0.407593 -0.407593 2.58889 V1 0.291715 -0.49668 2.58889 V2 0.419222 -0.713778 2.55 + N0 0.118345 -0.118345 0.985895 N1 0.0840299 -0.144879 0.985875 N2 0.0741814 -0.127899 0.989009 + txt003 +STRI + V0 0.419222 -0.713778 2.55 V1 0.58575 -0.58575 2.55 V2 0.407593 -0.407593 2.58889 + N0 0.0741814 -0.127899 0.989009 N1 0.104474 -0.104474 0.989025 N2 0.118345 -0.118345 0.985895 + txt003 +STRI + V0 0.291715 -0.49668 2.58889 V1 0.15415 -0.553875 2.58889 V2 0.221528 -0.795972 2.55 + N0 0.0840299 -0.144879 0.985875 N1 0.0436726 -0.162011 0.985822 N2 0.0385545 -0.143025 0.988968 + txt003 +STRI + V0 0.221528 -0.795972 2.55 V1 0.419222 -0.713778 2.55 V2 0.291715 -0.49668 2.58889 + N0 0.0385545 -0.143025 0.988968 N1 0.0741814 -0.127899 0.989009 N2 0.0840299 -0.144879 0.985875 + txt003 +STRI + V0 0.15415 -0.553875 2.58889 V1 2.22045e-16 -0.574074 2.58889 V2 1.11022e-16 -0.825 2.55 + N0 0.0436726 -0.162011 0.985822 N1 -1.93429e-17 -0.168031 0.985782 N2 -2.37649e-17 -0.14834 0.988936 + txt003 +STRI + V0 1.11022e-16 -0.825 2.55 V1 0.221528 -0.795972 2.55 V2 0.15415 -0.553875 2.58889 + N0 -2.37649e-17 -0.14834 0.988936 N1 0.0385545 -0.143025 0.988968 N2 0.0436726 -0.162011 0.985822 + txt003 +STRI + V0 0.825 0 2.55 V1 0.795972 -0.221528 2.55 V2 1.02199 -0.284431 2.51111 + N0 0.14834 0 0.988936 N1 0.143025 -0.0385545 0.988968 N2 0.186699 -0.0503275 0.981127 + txt003 +STRI + V0 1.02199 -0.284431 2.51111 V1 1.05926 0 2.51111 V2 0.825 0 2.55 + N0 0.186699 -0.0503275 0.981127 N1 0.193633 0 0.981074 N2 0.14834 0 0.988936 + txt003 +STRI + V0 0.795972 -0.221528 2.55 V1 0.713778 -0.419222 2.55 V2 0.916455 -0.538261 2.51111 + N0 0.143025 -0.0385545 0.988968 N1 0.127899 -0.0741814 0.989009 N2 0.166959 -0.0968361 0.981197 + txt003 +STRI + V0 0.916455 -0.538261 2.51111 V1 1.02199 -0.284431 2.51111 V2 0.795972 -0.221528 2.55 + N0 0.166959 -0.0968361 0.981197 N1 0.186699 -0.0503275 0.981127 N2 0.143025 -0.0385545 0.988968 + txt003 +STRI + V0 0.713778 -0.419222 2.55 V1 0.58575 -0.58575 2.55 V2 0.752074 -0.752074 2.51111 + N0 0.127899 -0.0741814 0.989009 N1 0.104474 -0.104474 0.989025 N2 0.136382 -0.136382 0.981224 + txt003 +STRI + V0 0.752074 -0.752074 2.51111 V1 0.916455 -0.538261 2.51111 V2 0.713778 -0.419222 2.55 + N0 0.136382 -0.136382 0.981224 N1 0.166959 -0.0968361 0.981197 N2 0.127899 -0.0741814 0.989009 + txt003 +STRI + V0 0.58575 -0.58575 2.55 V1 0.419222 -0.713778 2.55 V2 0.538261 -0.916455 2.51111 + N0 0.104474 -0.104474 0.989025 N1 0.0741814 -0.127899 0.989009 N2 0.0968361 -0.166959 0.981197 + txt003 +STRI + V0 0.538261 -0.916455 2.51111 V1 0.752074 -0.752074 2.51111 V2 0.58575 -0.58575 2.55 + N0 0.0968361 -0.166959 0.981197 N1 0.136382 -0.136382 0.981224 N2 0.104474 -0.104474 0.989025 + txt003 +STRI + V0 0.419222 -0.713778 2.55 V1 0.221528 -0.795972 2.55 V2 0.284431 -1.02199 2.51111 + N0 0.0741814 -0.127899 0.989009 N1 0.0385545 -0.143025 0.988968 N2 0.0503275 -0.186699 0.981127 + txt003 +STRI + V0 0.284431 -1.02199 2.51111 V1 0.538261 -0.916455 2.51111 V2 0.419222 -0.713778 2.55 + N0 0.0503275 -0.186699 0.981127 N1 0.0968361 -0.166959 0.981197 N2 0.0741814 -0.127899 0.989009 + txt003 +STRI + V0 0.221528 -0.795972 2.55 V1 1.11022e-16 -0.825 2.55 V2 4.44089e-16 -1.05926 2.51111 + N0 0.0385545 -0.143025 0.988968 N1 -2.37649e-17 -0.14834 0.988936 N2 -7.24819e-17 -0.193633 0.981074 + txt003 +STRI + V0 4.44089e-16 -1.05926 2.51111 V1 0.284431 -1.02199 2.51111 V2 0.221528 -0.795972 2.55 + N0 -7.24819e-17 -0.193633 0.981074 N1 0.0503275 -0.186699 0.981127 N2 0.0385545 -0.143025 0.988968 + txt003 +STRI + V0 1.05926 0 2.51111 V1 1.02199 -0.284431 2.51111 V2 1.18904 -0.330924 2.46389 + N0 0.193633 0 0.981074 N1 0.186699 -0.0503275 0.981127 N2 0.376378 -0.101459 0.920894 + txt003 +STRI + V0 1.18904 -0.330924 2.46389 V1 1.23241 0 2.46389 V2 1.05926 0 2.51111 + N0 0.376378 -0.101459 0.920894 N1 0.390293 0 0.920691 N2 0.193633 0 0.981074 + txt003 +STRI + V0 1.02199 -0.284431 2.51111 V1 0.916455 -0.538261 2.51111 V2 1.06626 -0.626246 2.46389 + N0 0.186699 -0.0503275 0.981127 N1 0.166959 -0.0968361 0.981197 N2 0.336657 -0.195261 0.92116 + txt003 +STRI + V0 1.06626 -0.626246 2.46389 V1 1.18904 -0.330924 2.46389 V2 1.02199 -0.284431 2.51111 + N0 0.336657 -0.195261 0.92116 N1 0.376378 -0.101459 0.920894 N2 0.186699 -0.0503275 0.981127 + txt003 +STRI + V0 0.916455 -0.538261 2.51111 V1 0.752074 -0.752074 2.51111 V2 0.875009 -0.875009 2.46389 + N0 0.166959 -0.0968361 0.981197 N1 0.136382 -0.136382 0.981224 N2 0.275025 -0.275025 0.921262 + txt003 +STRI + V0 0.875009 -0.875009 2.46389 V1 1.06626 -0.626246 2.46389 V2 0.916455 -0.538261 2.51111 + N0 0.275025 -0.275025 0.921262 N1 0.336657 -0.195261 0.92116 N2 0.166959 -0.0968361 0.981197 + txt003 +STRI + V0 0.752074 -0.752074 2.51111 V1 0.538261 -0.916455 2.51111 V2 0.626246 -1.06626 2.46389 + N0 0.136382 -0.136382 0.981224 N1 0.0968361 -0.166959 0.981197 N2 0.195261 -0.336657 0.92116 + txt003 +STRI + V0 0.626246 -1.06626 2.46389 V1 0.875009 -0.875009 2.46389 V2 0.752074 -0.752074 2.51111 + N0 0.195261 -0.336657 0.92116 N1 0.275025 -0.275025 0.921262 N2 0.136382 -0.136382 0.981224 + txt003 +STRI + V0 0.538261 -0.916455 2.51111 V1 0.284431 -1.02199 2.51111 V2 0.330924 -1.18904 2.46389 + N0 0.0968361 -0.166959 0.981197 N1 0.0503275 -0.186699 0.981127 N2 0.101459 -0.376378 0.920894 + txt003 +STRI + V0 0.330924 -1.18904 2.46389 V1 0.626246 -1.06626 2.46389 V2 0.538261 -0.916455 2.51111 + N0 0.101459 -0.376378 0.920894 N1 0.195261 -0.336657 0.92116 N2 0.0968361 -0.166959 0.981197 + txt003 +STRI + V0 0.284431 -1.02199 2.51111 V1 4.44089e-16 -1.05926 2.51111 V2 4.44089e-16 -1.23241 2.46389 + N0 0.0503275 -0.186699 0.981127 N1 -7.24819e-17 -0.193633 0.981074 N2 -8.37138e-17 -0.390293 0.920691 + txt003 +STRI + V0 4.44089e-16 -1.23241 2.46389 V1 0.330924 -1.18904 2.46389 V2 0.284431 -1.02199 2.51111 + N0 -8.37138e-17 -0.390293 0.920691 N1 0.101459 -0.376378 0.920894 N2 0.0503275 -0.186699 0.981127 + txt003 +STRI + V0 1.23241 0 2.46389 V1 1.18904 -0.330924 2.46389 V2 1.25426 -0.349074 2.4 + N0 0.390293 0 0.920691 N1 0.376378 -0.101459 0.920894 N2 0.965535 -0.260275 -1.02004e-15 + txt003 +STRI + V0 1.25426 -0.349074 2.4 V1 1.3 0 2.4 V2 1.23241 0 2.46389 + N0 0.965535 -0.260275 -1.02004e-15 N1 1 0 -9.86865e-16 N2 0.390293 0 0.920691 + txt003 +STRI + V0 1.18904 -0.330924 2.46389 V1 1.06626 -0.626246 2.46389 V2 1.12474 -0.660593 2.4 + N0 0.376378 -0.101459 0.920894 N1 0.336657 -0.195261 0.92116 N2 0.865031 -0.501718 -9.69705e-16 + txt003 +STRI + V0 1.12474 -0.660593 2.4 V1 1.25426 -0.349074 2.4 V2 1.18904 -0.330924 2.46389 + N0 0.865031 -0.501718 -9.69705e-16 N1 0.965535 -0.260275 -1.02004e-15 N2 0.376378 -0.101459 0.920894 + txt003 +STRI + V0 1.06626 -0.626246 2.46389 V1 0.875009 -0.875009 2.46389 V2 0.923 -0.923 2.4 + N0 0.336657 -0.195261 0.92116 N1 0.275025 -0.275025 0.921262 N2 0.707107 -0.707107 -7.41433e-16 + txt003 +STRI + V0 0.923 -0.923 2.4 V1 1.12474 -0.660593 2.4 V2 1.06626 -0.626246 2.46389 + N0 0.707107 -0.707107 -7.41433e-16 N1 0.865031 -0.501718 -9.69705e-16 N2 0.336657 -0.195261 0.92116 + txt003 +STRI + V0 0.875009 -0.875009 2.46389 V1 0.626246 -1.06626 2.46389 V2 0.660593 -1.12474 2.4 + N0 0.275025 -0.275025 0.921262 N1 0.195261 -0.336657 0.92116 N2 0.501718 -0.865031 -4.67305e-16 + txt003 +STRI + V0 0.660593 -1.12474 2.4 V1 0.923 -0.923 2.4 V2 0.875009 -0.875009 2.46389 + N0 0.501718 -0.865031 -4.67305e-16 N1 0.707107 -0.707107 -7.41433e-16 N2 0.275025 -0.275025 0.921262 + txt003 +STRI + V0 0.626246 -1.06626 2.46389 V1 0.330924 -1.18904 2.46389 V2 0.349074 -1.25426 2.4 + N0 0.195261 -0.336657 0.92116 N1 0.101459 -0.376378 0.920894 N2 0.260275 -0.965535 -5.24893e-16 + txt003 +STRI + V0 0.349074 -1.25426 2.4 V1 0.660593 -1.12474 2.4 V2 0.626246 -1.06626 2.46389 + N0 0.260275 -0.965535 -5.24893e-16 N1 0.501718 -0.865031 -4.67305e-16 N2 0.195261 -0.336657 0.92116 + txt003 +STRI + V0 0.330924 -1.18904 2.46389 V1 4.44089e-16 -1.23241 2.46389 V2 6.66134e-16 -1.3 2.4 + N0 0.101459 -0.376378 0.920894 N1 -8.37138e-17 -0.390293 0.920691 N2 -4.06675e-16 -1 -1.4803e-15 + txt003 +STRI + V0 6.66134e-16 -1.3 2.4 V1 0.349074 -1.25426 2.4 V2 0.330924 -1.18904 2.46389 + N0 -4.06675e-16 -1 -1.4803e-15 N1 0.260275 -0.965535 -5.24893e-16 N2 0.101459 -0.376378 0.920894 + txt003 +STRI + V0 0 -0.2 2.7 V1 -0.0537037 -0.192963 2.7 V2 -0.0942301 -0.338579 2.63611 + N0 0 -0.6 0.8 N1 -0.15602 -0.578783 0.800417 N2 -0.0697517 -0.258756 0.963421 + txt003 +STRI + V0 -0.0942301 -0.338579 2.63611 V1 0 -0.350926 2.63611 V2 0 -0.2 2.7 + N0 -0.0697517 -0.258756 0.963421 N1 0 -0.268354 0.96332 N2 0 -0.6 0.8 + txt003 +STRI + V0 -0.0537037 -0.192963 2.7 V1 -0.10163 -0.173037 2.7 V2 -0.178322 -0.303616 2.63611 + N0 -0.15602 -0.578783 0.800417 N1 -0.300385 -0.517905 0.800964 N2 -0.134219 -0.231413 0.963552 + txt003 +STRI + V0 -0.178322 -0.303616 2.63611 V1 -0.0942301 -0.338579 2.63611 V2 -0.0537037 -0.192963 2.7 + N0 -0.134219 -0.231413 0.963552 N1 -0.0697517 -0.258756 0.963421 N2 -0.15602 -0.578783 0.800417 + txt003 +STRI + V0 -0.10163 -0.173037 2.7 V1 -0.142 -0.142 2.7 V2 -0.249157 -0.249157 2.63611 + N0 -0.300385 -0.517905 0.800964 N1 -0.423155 -0.423155 0.801174 N2 -0.189037 -0.189037 0.963603 + txt003 +STRI + V0 -0.249157 -0.249157 2.63611 V1 -0.178322 -0.303616 2.63611 V2 -0.10163 -0.173037 2.7 + N0 -0.189037 -0.189037 0.963603 N1 -0.134219 -0.231413 0.963552 N2 -0.300385 -0.517905 0.800964 + txt003 +STRI + V0 -0.142 -0.142 2.7 V1 -0.173037 -0.10163 2.7 V2 -0.303616 -0.178322 2.63611 + N0 -0.423155 -0.423155 0.801174 N1 -0.517905 -0.300385 0.800964 N2 -0.231413 -0.134219 0.963552 + txt003 +STRI + V0 -0.303616 -0.178322 2.63611 V1 -0.249157 -0.249157 2.63611 V2 -0.142 -0.142 2.7 + N0 -0.231413 -0.134219 0.963552 N1 -0.189037 -0.189037 0.963603 N2 -0.423155 -0.423155 0.801174 + txt003 +STRI + V0 -0.173037 -0.10163 2.7 V1 -0.192963 -0.0537037 2.7 V2 -0.338579 -0.0942301 2.63611 + N0 -0.517905 -0.300385 0.800964 N1 -0.578783 -0.15602 0.800417 N2 -0.258756 -0.0697517 0.963421 + txt003 +STRI + V0 -0.338579 -0.0942301 2.63611 V1 -0.303616 -0.178322 2.63611 V2 -0.173037 -0.10163 2.7 + N0 -0.258756 -0.0697517 0.963421 N1 -0.231413 -0.134219 0.963552 N2 -0.517905 -0.300385 0.800964 + txt003 +STRI + V0 -0.192963 -0.0537037 2.7 V1 -0.2 0 2.7 V2 -0.350926 -5.55112e-17 2.63611 + N0 -0.578783 -0.15602 0.800417 N1 -0.6 9.91271e-17 0.8 N2 -0.268354 0 0.96332 + txt003 +STRI + V0 -0.350926 -5.55112e-17 2.63611 V1 -0.338579 -0.0942301 2.63611 V2 -0.192963 -0.0537037 2.7 + N0 -0.268354 0 0.96332 N1 -0.258756 -0.0697517 0.963421 N2 -0.578783 -0.15602 0.800417 + txt003 +STRI + V0 0 -0.350926 2.63611 V1 -0.0942301 -0.338579 2.63611 V2 -0.15415 -0.553875 2.58889 + N0 0 -0.268354 0.96332 N1 -0.0697517 -0.258756 0.963421 N2 -0.0436726 -0.162011 0.985822 + txt003 +STRI + V0 -0.15415 -0.553875 2.58889 V1 0 -0.574074 2.58889 V2 0 -0.350926 2.63611 + N0 -0.0436726 -0.162011 0.985822 N1 0 -0.168031 0.985782 N2 0 -0.268354 0.96332 + txt003 +STRI + V0 -0.0942301 -0.338579 2.63611 V1 -0.178322 -0.303616 2.63611 V2 -0.291715 -0.49668 2.58889 + N0 -0.0697517 -0.258756 0.963421 N1 -0.134219 -0.231413 0.963552 N2 -0.0840299 -0.144879 0.985875 + txt003 +STRI + V0 -0.291715 -0.49668 2.58889 V1 -0.15415 -0.553875 2.58889 V2 -0.0942301 -0.338579 2.63611 + N0 -0.0840299 -0.144879 0.985875 N1 -0.0436726 -0.162011 0.985822 N2 -0.0697517 -0.258756 0.963421 + txt003 +STRI + V0 -0.178322 -0.303616 2.63611 V1 -0.249157 -0.249157 2.63611 V2 -0.407593 -0.407593 2.58889 + N0 -0.134219 -0.231413 0.963552 N1 -0.189037 -0.189037 0.963603 N2 -0.118345 -0.118345 0.985895 + txt003 +STRI + V0 -0.407593 -0.407593 2.58889 V1 -0.291715 -0.49668 2.58889 V2 -0.178322 -0.303616 2.63611 + N0 -0.118345 -0.118345 0.985895 N1 -0.0840299 -0.144879 0.985875 N2 -0.134219 -0.231413 0.963552 + txt003 +STRI + V0 -0.249157 -0.249157 2.63611 V1 -0.303616 -0.178322 2.63611 V2 -0.49668 -0.291715 2.58889 + N0 -0.189037 -0.189037 0.963603 N1 -0.231413 -0.134219 0.963552 N2 -0.144879 -0.0840299 0.985875 + txt003 +STRI + V0 -0.49668 -0.291715 2.58889 V1 -0.407593 -0.407593 2.58889 V2 -0.249157 -0.249157 2.63611 + N0 -0.144879 -0.0840299 0.985875 N1 -0.118345 -0.118345 0.985895 N2 -0.189037 -0.189037 0.963603 + txt003 +STRI + V0 -0.303616 -0.178322 2.63611 V1 -0.338579 -0.0942301 2.63611 V2 -0.553875 -0.15415 2.58889 + N0 -0.231413 -0.134219 0.963552 N1 -0.258756 -0.0697517 0.963421 N2 -0.162011 -0.0436726 0.985822 + txt003 +STRI + V0 -0.553875 -0.15415 2.58889 V1 -0.49668 -0.291715 2.58889 V2 -0.303616 -0.178322 2.63611 + N0 -0.162011 -0.0436726 0.985822 N1 -0.144879 -0.0840299 0.985875 N2 -0.231413 -0.134219 0.963552 + txt003 +STRI + V0 -0.338579 -0.0942301 2.63611 V1 -0.350926 -5.55112e-17 2.63611 V2 -0.574074 -2.22045e-16 2.58889 + N0 -0.258756 -0.0697517 0.963421 N1 -0.268354 0 0.96332 N2 -0.168031 1.93429e-17 0.985782 + txt003 +STRI + V0 -0.574074 -2.22045e-16 2.58889 V1 -0.553875 -0.15415 2.58889 V2 -0.338579 -0.0942301 2.63611 + N0 -0.168031 1.93429e-17 0.985782 N1 -0.162011 -0.0436726 0.985822 N2 -0.258756 -0.0697517 0.963421 + txt003 +STRI + V0 0 -0.574074 2.58889 V1 -0.15415 -0.553875 2.58889 V2 -0.221528 -0.795972 2.55 + N0 0 -0.168031 0.985782 N1 -0.0436726 -0.162011 0.985822 N2 -0.0385545 -0.143025 0.988968 + txt003 +STRI + V0 -0.221528 -0.795972 2.55 V1 0 -0.825 2.55 V2 0 -0.574074 2.58889 + N0 -0.0385545 -0.143025 0.988968 N1 0 -0.14834 0.988936 N2 0 -0.168031 0.985782 + txt003 +STRI + V0 -0.15415 -0.553875 2.58889 V1 -0.291715 -0.49668 2.58889 V2 -0.419222 -0.713778 2.55 + N0 -0.0436726 -0.162011 0.985822 N1 -0.0840299 -0.144879 0.985875 N2 -0.0741814 -0.127899 0.989009 + txt003 +STRI + V0 -0.419222 -0.713778 2.55 V1 -0.221528 -0.795972 2.55 V2 -0.15415 -0.553875 2.58889 + N0 -0.0741814 -0.127899 0.989009 N1 -0.0385545 -0.143025 0.988968 N2 -0.0436726 -0.162011 0.985822 + txt003 +STRI + V0 -0.291715 -0.49668 2.58889 V1 -0.407593 -0.407593 2.58889 V2 -0.58575 -0.58575 2.55 + N0 -0.0840299 -0.144879 0.985875 N1 -0.118345 -0.118345 0.985895 N2 -0.104474 -0.104474 0.989025 + txt003 +STRI + V0 -0.58575 -0.58575 2.55 V1 -0.419222 -0.713778 2.55 V2 -0.291715 -0.49668 2.58889 + N0 -0.104474 -0.104474 0.989025 N1 -0.0741814 -0.127899 0.989009 N2 -0.0840299 -0.144879 0.985875 + txt003 +STRI + V0 -0.407593 -0.407593 2.58889 V1 -0.49668 -0.291715 2.58889 V2 -0.713778 -0.419222 2.55 + N0 -0.118345 -0.118345 0.985895 N1 -0.144879 -0.0840299 0.985875 N2 -0.127899 -0.0741814 0.989009 + txt003 +STRI + V0 -0.713778 -0.419222 2.55 V1 -0.58575 -0.58575 2.55 V2 -0.407593 -0.407593 2.58889 + N0 -0.127899 -0.0741814 0.989009 N1 -0.104474 -0.104474 0.989025 N2 -0.118345 -0.118345 0.985895 + txt003 +STRI + V0 -0.49668 -0.291715 2.58889 V1 -0.553875 -0.15415 2.58889 V2 -0.795972 -0.221528 2.55 + N0 -0.144879 -0.0840299 0.985875 N1 -0.162011 -0.0436726 0.985822 N2 -0.143025 -0.0385545 0.988968 + txt003 +STRI + V0 -0.795972 -0.221528 2.55 V1 -0.713778 -0.419222 2.55 V2 -0.49668 -0.291715 2.58889 + N0 -0.143025 -0.0385545 0.988968 N1 -0.127899 -0.0741814 0.989009 N2 -0.144879 -0.0840299 0.985875 + txt003 +STRI + V0 -0.553875 -0.15415 2.58889 V1 -0.574074 -2.22045e-16 2.58889 V2 -0.825 -1.11022e-16 2.55 + N0 -0.162011 -0.0436726 0.985822 N1 -0.168031 1.93429e-17 0.985782 N2 -0.14834 2.37649e-17 0.988936 + txt003 +STRI + V0 -0.825 -1.11022e-16 2.55 V1 -0.795972 -0.221528 2.55 V2 -0.553875 -0.15415 2.58889 + N0 -0.14834 2.37649e-17 0.988936 N1 -0.143025 -0.0385545 0.988968 N2 -0.162011 -0.0436726 0.985822 + txt003 +STRI + V0 0 -0.825 2.55 V1 -0.221528 -0.795972 2.55 V2 -0.284431 -1.02199 2.51111 + N0 0 -0.14834 0.988936 N1 -0.0385545 -0.143025 0.988968 N2 -0.0503275 -0.186699 0.981127 + txt003 +STRI + V0 -0.284431 -1.02199 2.51111 V1 0 -1.05926 2.51111 V2 0 -0.825 2.55 + N0 -0.0503275 -0.186699 0.981127 N1 0 -0.193633 0.981074 N2 0 -0.14834 0.988936 + txt003 +STRI + V0 -0.221528 -0.795972 2.55 V1 -0.419222 -0.713778 2.55 V2 -0.538261 -0.916455 2.51111 + N0 -0.0385545 -0.143025 0.988968 N1 -0.0741814 -0.127899 0.989009 N2 -0.0968361 -0.166959 0.981197 + txt003 +STRI + V0 -0.538261 -0.916455 2.51111 V1 -0.284431 -1.02199 2.51111 V2 -0.221528 -0.795972 2.55 + N0 -0.0968361 -0.166959 0.981197 N1 -0.0503275 -0.186699 0.981127 N2 -0.0385545 -0.143025 0.988968 + txt003 +STRI + V0 -0.419222 -0.713778 2.55 V1 -0.58575 -0.58575 2.55 V2 -0.752074 -0.752074 2.51111 + N0 -0.0741814 -0.127899 0.989009 N1 -0.104474 -0.104474 0.989025 N2 -0.136382 -0.136382 0.981224 + txt003 +STRI + V0 -0.752074 -0.752074 2.51111 V1 -0.538261 -0.916455 2.51111 V2 -0.419222 -0.713778 2.55 + N0 -0.136382 -0.136382 0.981224 N1 -0.0968361 -0.166959 0.981197 N2 -0.0741814 -0.127899 0.989009 + txt003 +STRI + V0 -0.58575 -0.58575 2.55 V1 -0.713778 -0.419222 2.55 V2 -0.916455 -0.538261 2.51111 + N0 -0.104474 -0.104474 0.989025 N1 -0.127899 -0.0741814 0.989009 N2 -0.166959 -0.0968361 0.981197 + txt003 +STRI + V0 -0.916455 -0.538261 2.51111 V1 -0.752074 -0.752074 2.51111 V2 -0.58575 -0.58575 2.55 + N0 -0.166959 -0.0968361 0.981197 N1 -0.136382 -0.136382 0.981224 N2 -0.104474 -0.104474 0.989025 + txt003 +STRI + V0 -0.713778 -0.419222 2.55 V1 -0.795972 -0.221528 2.55 V2 -1.02199 -0.284431 2.51111 + N0 -0.127899 -0.0741814 0.989009 N1 -0.143025 -0.0385545 0.988968 N2 -0.186699 -0.0503275 0.981127 + txt003 +STRI + V0 -1.02199 -0.284431 2.51111 V1 -0.916455 -0.538261 2.51111 V2 -0.713778 -0.419222 2.55 + N0 -0.186699 -0.0503275 0.981127 N1 -0.166959 -0.0968361 0.981197 N2 -0.127899 -0.0741814 0.989009 + txt003 +STRI + V0 -0.795972 -0.221528 2.55 V1 -0.825 -1.11022e-16 2.55 V2 -1.05926 -4.44089e-16 2.51111 + N0 -0.143025 -0.0385545 0.988968 N1 -0.14834 2.37649e-17 0.988936 N2 -0.193633 7.24819e-17 0.981074 + txt003 +STRI + V0 -1.05926 -4.44089e-16 2.51111 V1 -1.02199 -0.284431 2.51111 V2 -0.795972 -0.221528 2.55 + N0 -0.193633 7.24819e-17 0.981074 N1 -0.186699 -0.0503275 0.981127 N2 -0.143025 -0.0385545 0.988968 + txt003 +STRI + V0 0 -1.05926 2.51111 V1 -0.284431 -1.02199 2.51111 V2 -0.330924 -1.18904 2.46389 + N0 0 -0.193633 0.981074 N1 -0.0503275 -0.186699 0.981127 N2 -0.101459 -0.376378 0.920894 + txt003 +STRI + V0 -0.330924 -1.18904 2.46389 V1 0 -1.23241 2.46389 V2 0 -1.05926 2.51111 + N0 -0.101459 -0.376378 0.920894 N1 0 -0.390293 0.920691 N2 0 -0.193633 0.981074 + txt003 +STRI + V0 -0.284431 -1.02199 2.51111 V1 -0.538261 -0.916455 2.51111 V2 -0.626246 -1.06626 2.46389 + N0 -0.0503275 -0.186699 0.981127 N1 -0.0968361 -0.166959 0.981197 N2 -0.195261 -0.336657 0.92116 + txt003 +STRI + V0 -0.626246 -1.06626 2.46389 V1 -0.330924 -1.18904 2.46389 V2 -0.284431 -1.02199 2.51111 + N0 -0.195261 -0.336657 0.92116 N1 -0.101459 -0.376378 0.920894 N2 -0.0503275 -0.186699 0.981127 + txt003 +STRI + V0 -0.538261 -0.916455 2.51111 V1 -0.752074 -0.752074 2.51111 V2 -0.875009 -0.875009 2.46389 + N0 -0.0968361 -0.166959 0.981197 N1 -0.136382 -0.136382 0.981224 N2 -0.275025 -0.275025 0.921262 + txt003 +STRI + V0 -0.875009 -0.875009 2.46389 V1 -0.626246 -1.06626 2.46389 V2 -0.538261 -0.916455 2.51111 + N0 -0.275025 -0.275025 0.921262 N1 -0.195261 -0.336657 0.92116 N2 -0.0968361 -0.166959 0.981197 + txt003 +STRI + V0 -0.752074 -0.752074 2.51111 V1 -0.916455 -0.538261 2.51111 V2 -1.06626 -0.626246 2.46389 + N0 -0.136382 -0.136382 0.981224 N1 -0.166959 -0.0968361 0.981197 N2 -0.336657 -0.195261 0.92116 + txt003 +STRI + V0 -1.06626 -0.626246 2.46389 V1 -0.875009 -0.875009 2.46389 V2 -0.752074 -0.752074 2.51111 + N0 -0.336657 -0.195261 0.92116 N1 -0.275025 -0.275025 0.921262 N2 -0.136382 -0.136382 0.981224 + txt003 +STRI + V0 -0.916455 -0.538261 2.51111 V1 -1.02199 -0.284431 2.51111 V2 -1.18904 -0.330924 2.46389 + N0 -0.166959 -0.0968361 0.981197 N1 -0.186699 -0.0503275 0.981127 N2 -0.376378 -0.101459 0.920894 + txt003 +STRI + V0 -1.18904 -0.330924 2.46389 V1 -1.06626 -0.626246 2.46389 V2 -0.916455 -0.538261 2.51111 + N0 -0.376378 -0.101459 0.920894 N1 -0.336657 -0.195261 0.92116 N2 -0.166959 -0.0968361 0.981197 + txt003 +STRI + V0 -1.02199 -0.284431 2.51111 V1 -1.05926 -4.44089e-16 2.51111 V2 -1.23241 -4.44089e-16 2.46389 + N0 -0.186699 -0.0503275 0.981127 N1 -0.193633 7.24819e-17 0.981074 N2 -0.390293 8.37138e-17 0.920691 + txt003 +STRI + V0 -1.23241 -4.44089e-16 2.46389 V1 -1.18904 -0.330924 2.46389 V2 -1.02199 -0.284431 2.51111 + N0 -0.390293 8.37138e-17 0.920691 N1 -0.376378 -0.101459 0.920894 N2 -0.186699 -0.0503275 0.981127 + txt003 +STRI + V0 0 -1.23241 2.46389 V1 -0.330924 -1.18904 2.46389 V2 -0.349074 -1.25426 2.4 + N0 0 -0.390293 0.920691 N1 -0.101459 -0.376378 0.920894 N2 -0.260275 -0.965535 -1.02004e-15 + txt003 +STRI + V0 -0.349074 -1.25426 2.4 V1 0 -1.3 2.4 V2 0 -1.23241 2.46389 + N0 -0.260275 -0.965535 -1.02004e-15 N1 -0 -1 -9.86865e-16 N2 0 -0.390293 0.920691 + txt003 +STRI + V0 -0.330924 -1.18904 2.46389 V1 -0.626246 -1.06626 2.46389 V2 -0.660593 -1.12474 2.4 + N0 -0.101459 -0.376378 0.920894 N1 -0.195261 -0.336657 0.92116 N2 -0.501718 -0.865031 -9.69705e-16 + txt003 +STRI + V0 -0.660593 -1.12474 2.4 V1 -0.349074 -1.25426 2.4 V2 -0.330924 -1.18904 2.46389 + N0 -0.501718 -0.865031 -9.69705e-16 N1 -0.260275 -0.965535 -1.02004e-15 N2 -0.101459 -0.376378 0.920894 + txt003 +STRI + V0 -0.626246 -1.06626 2.46389 V1 -0.875009 -0.875009 2.46389 V2 -0.923 -0.923 2.4 + N0 -0.195261 -0.336657 0.92116 N1 -0.275025 -0.275025 0.921262 N2 -0.707107 -0.707107 -7.41433e-16 + txt003 +STRI + V0 -0.923 -0.923 2.4 V1 -0.660593 -1.12474 2.4 V2 -0.626246 -1.06626 2.46389 + N0 -0.707107 -0.707107 -7.41433e-16 N1 -0.501718 -0.865031 -9.69705e-16 N2 -0.195261 -0.336657 0.92116 + txt003 +STRI + V0 -0.875009 -0.875009 2.46389 V1 -1.06626 -0.626246 2.46389 V2 -1.12474 -0.660593 2.4 + N0 -0.275025 -0.275025 0.921262 N1 -0.336657 -0.195261 0.92116 N2 -0.865031 -0.501718 -4.67305e-16 + txt003 +STRI + V0 -1.12474 -0.660593 2.4 V1 -0.923 -0.923 2.4 V2 -0.875009 -0.875009 2.46389 + N0 -0.865031 -0.501718 -4.67305e-16 N1 -0.707107 -0.707107 -7.41433e-16 N2 -0.275025 -0.275025 0.921262 + txt003 +STRI + V0 -1.06626 -0.626246 2.46389 V1 -1.18904 -0.330924 2.46389 V2 -1.25426 -0.349074 2.4 + N0 -0.336657 -0.195261 0.92116 N1 -0.376378 -0.101459 0.920894 N2 -0.965535 -0.260275 -5.24893e-16 + txt003 +STRI + V0 -1.25426 -0.349074 2.4 V1 -1.12474 -0.660593 2.4 V2 -1.06626 -0.626246 2.46389 + N0 -0.965535 -0.260275 -5.24893e-16 N1 -0.865031 -0.501718 -4.67305e-16 N2 -0.336657 -0.195261 0.92116 + txt003 +STRI + V0 -1.18904 -0.330924 2.46389 V1 -1.23241 -4.44089e-16 2.46389 V2 -1.3 -6.66134e-16 2.4 + N0 -0.376378 -0.101459 0.920894 N1 -0.390293 8.37138e-17 0.920691 N2 -1 4.06675e-16 -1.4803e-15 + txt003 +STRI + V0 -1.3 -6.66134e-16 2.4 V1 -1.25426 -0.349074 2.4 V2 -1.18904 -0.330924 2.46389 + N0 -1 4.06675e-16 -1.4803e-15 N1 -0.965535 -0.260275 -5.24893e-16 N2 -0.376378 -0.101459 0.920894 + txt003 +STRI + V0 -0.2 0 2.7 V1 -0.192963 0.0537037 2.7 V2 -0.338579 0.0942301 2.63611 + N0 -0.6 0 0.8 N1 -0.578783 0.15602 0.800417 N2 -0.258756 0.0697517 0.963421 + txt003 +STRI + V0 -0.338579 0.0942301 2.63611 V1 -0.350926 0 2.63611 V2 -0.2 0 2.7 + N0 -0.258756 0.0697517 0.963421 N1 -0.268354 0 0.96332 N2 -0.6 0 0.8 + txt003 +STRI + V0 -0.192963 0.0537037 2.7 V1 -0.173037 0.10163 2.7 V2 -0.303616 0.178322 2.63611 + N0 -0.578783 0.15602 0.800417 N1 -0.517905 0.300385 0.800964 N2 -0.231413 0.134219 0.963552 + txt003 +STRI + V0 -0.303616 0.178322 2.63611 V1 -0.338579 0.0942301 2.63611 V2 -0.192963 0.0537037 2.7 + N0 -0.231413 0.134219 0.963552 N1 -0.258756 0.0697517 0.963421 N2 -0.578783 0.15602 0.800417 + txt003 +STRI + V0 -0.173037 0.10163 2.7 V1 -0.142 0.142 2.7 V2 -0.249157 0.249157 2.63611 + N0 -0.517905 0.300385 0.800964 N1 -0.423155 0.423155 0.801174 N2 -0.189037 0.189037 0.963603 + txt003 +STRI + V0 -0.249157 0.249157 2.63611 V1 -0.303616 0.178322 2.63611 V2 -0.173037 0.10163 2.7 + N0 -0.189037 0.189037 0.963603 N1 -0.231413 0.134219 0.963552 N2 -0.517905 0.300385 0.800964 + txt003 +STRI + V0 -0.142 0.142 2.7 V1 -0.10163 0.173037 2.7 V2 -0.178322 0.303616 2.63611 + N0 -0.423155 0.423155 0.801174 N1 -0.300385 0.517905 0.800964 N2 -0.134219 0.231413 0.963552 + txt003 +STRI + V0 -0.178322 0.303616 2.63611 V1 -0.249157 0.249157 2.63611 V2 -0.142 0.142 2.7 + N0 -0.134219 0.231413 0.963552 N1 -0.189037 0.189037 0.963603 N2 -0.423155 0.423155 0.801174 + txt003 +STRI + V0 -0.10163 0.173037 2.7 V1 -0.0537037 0.192963 2.7 V2 -0.0942301 0.338579 2.63611 + N0 -0.300385 0.517905 0.800964 N1 -0.15602 0.578783 0.800417 N2 -0.0697517 0.258756 0.963421 + txt003 +STRI + V0 -0.0942301 0.338579 2.63611 V1 -0.178322 0.303616 2.63611 V2 -0.10163 0.173037 2.7 + N0 -0.0697517 0.258756 0.963421 N1 -0.134219 0.231413 0.963552 N2 -0.300385 0.517905 0.800964 + txt003 +STRI + V0 -0.0537037 0.192963 2.7 V1 0 0.2 2.7 V2 -5.55112e-17 0.350926 2.63611 + N0 -0.15602 0.578783 0.800417 N1 9.91271e-17 0.6 0.8 N2 -0 0.268354 0.96332 + txt003 +STRI + V0 -5.55112e-17 0.350926 2.63611 V1 -0.0942301 0.338579 2.63611 V2 -0.0537037 0.192963 2.7 + N0 -0 0.268354 0.96332 N1 -0.0697517 0.258756 0.963421 N2 -0.15602 0.578783 0.800417 + txt003 +STRI + V0 -0.350926 0 2.63611 V1 -0.338579 0.0942301 2.63611 V2 -0.553875 0.15415 2.58889 + N0 -0.268354 0 0.96332 N1 -0.258756 0.0697517 0.963421 N2 -0.162011 0.0436726 0.985822 + txt003 +STRI + V0 -0.553875 0.15415 2.58889 V1 -0.574074 0 2.58889 V2 -0.350926 0 2.63611 + N0 -0.162011 0.0436726 0.985822 N1 -0.168031 0 0.985782 N2 -0.268354 0 0.96332 + txt003 +STRI + V0 -0.338579 0.0942301 2.63611 V1 -0.303616 0.178322 2.63611 V2 -0.49668 0.291715 2.58889 + N0 -0.258756 0.0697517 0.963421 N1 -0.231413 0.134219 0.963552 N2 -0.144879 0.0840299 0.985875 + txt003 +STRI + V0 -0.49668 0.291715 2.58889 V1 -0.553875 0.15415 2.58889 V2 -0.338579 0.0942301 2.63611 + N0 -0.144879 0.0840299 0.985875 N1 -0.162011 0.0436726 0.985822 N2 -0.258756 0.0697517 0.963421 + txt003 +STRI + V0 -0.303616 0.178322 2.63611 V1 -0.249157 0.249157 2.63611 V2 -0.407593 0.407593 2.58889 + N0 -0.231413 0.134219 0.963552 N1 -0.189037 0.189037 0.963603 N2 -0.118345 0.118345 0.985895 + txt003 +STRI + V0 -0.407593 0.407593 2.58889 V1 -0.49668 0.291715 2.58889 V2 -0.303616 0.178322 2.63611 + N0 -0.118345 0.118345 0.985895 N1 -0.144879 0.0840299 0.985875 N2 -0.231413 0.134219 0.963552 + txt003 +STRI + V0 -0.249157 0.249157 2.63611 V1 -0.178322 0.303616 2.63611 V2 -0.291715 0.49668 2.58889 + N0 -0.189037 0.189037 0.963603 N1 -0.134219 0.231413 0.963552 N2 -0.0840299 0.144879 0.985875 + txt003 +STRI + V0 -0.291715 0.49668 2.58889 V1 -0.407593 0.407593 2.58889 V2 -0.249157 0.249157 2.63611 + N0 -0.0840299 0.144879 0.985875 N1 -0.118345 0.118345 0.985895 N2 -0.189037 0.189037 0.963603 + txt003 +STRI + V0 -0.178322 0.303616 2.63611 V1 -0.0942301 0.338579 2.63611 V2 -0.15415 0.553875 2.58889 + N0 -0.134219 0.231413 0.963552 N1 -0.0697517 0.258756 0.963421 N2 -0.0436726 0.162011 0.985822 + txt003 +STRI + V0 -0.15415 0.553875 2.58889 V1 -0.291715 0.49668 2.58889 V2 -0.178322 0.303616 2.63611 + N0 -0.0436726 0.162011 0.985822 N1 -0.0840299 0.144879 0.985875 N2 -0.134219 0.231413 0.963552 + txt003 +STRI + V0 -0.0942301 0.338579 2.63611 V1 -5.55112e-17 0.350926 2.63611 V2 -2.22045e-16 0.574074 2.58889 + N0 -0.0697517 0.258756 0.963421 N1 -0 0.268354 0.96332 N2 1.93429e-17 0.168031 0.985782 + txt003 +STRI + V0 -2.22045e-16 0.574074 2.58889 V1 -0.15415 0.553875 2.58889 V2 -0.0942301 0.338579 2.63611 + N0 1.93429e-17 0.168031 0.985782 N1 -0.0436726 0.162011 0.985822 N2 -0.0697517 0.258756 0.963421 + txt003 +STRI + V0 -0.574074 0 2.58889 V1 -0.553875 0.15415 2.58889 V2 -0.795972 0.221528 2.55 + N0 -0.168031 0 0.985782 N1 -0.162011 0.0436726 0.985822 N2 -0.143025 0.0385545 0.988968 + txt003 +STRI + V0 -0.795972 0.221528 2.55 V1 -0.825 0 2.55 V2 -0.574074 0 2.58889 + N0 -0.143025 0.0385545 0.988968 N1 -0.14834 0 0.988936 N2 -0.168031 0 0.985782 + txt003 +STRI + V0 -0.553875 0.15415 2.58889 V1 -0.49668 0.291715 2.58889 V2 -0.713778 0.419222 2.55 + N0 -0.162011 0.0436726 0.985822 N1 -0.144879 0.0840299 0.985875 N2 -0.127899 0.0741814 0.989009 + txt003 +STRI + V0 -0.713778 0.419222 2.55 V1 -0.795972 0.221528 2.55 V2 -0.553875 0.15415 2.58889 + N0 -0.127899 0.0741814 0.989009 N1 -0.143025 0.0385545 0.988968 N2 -0.162011 0.0436726 0.985822 + txt003 +STRI + V0 -0.49668 0.291715 2.58889 V1 -0.407593 0.407593 2.58889 V2 -0.58575 0.58575 2.55 + N0 -0.144879 0.0840299 0.985875 N1 -0.118345 0.118345 0.985895 N2 -0.104474 0.104474 0.989025 + txt003 +STRI + V0 -0.58575 0.58575 2.55 V1 -0.713778 0.419222 2.55 V2 -0.49668 0.291715 2.58889 + N0 -0.104474 0.104474 0.989025 N1 -0.127899 0.0741814 0.989009 N2 -0.144879 0.0840299 0.985875 + txt003 +STRI + V0 -0.407593 0.407593 2.58889 V1 -0.291715 0.49668 2.58889 V2 -0.419222 0.713778 2.55 + N0 -0.118345 0.118345 0.985895 N1 -0.0840299 0.144879 0.985875 N2 -0.0741814 0.127899 0.989009 + txt003 +STRI + V0 -0.419222 0.713778 2.55 V1 -0.58575 0.58575 2.55 V2 -0.407593 0.407593 2.58889 + N0 -0.0741814 0.127899 0.989009 N1 -0.104474 0.104474 0.989025 N2 -0.118345 0.118345 0.985895 + txt003 +STRI + V0 -0.291715 0.49668 2.58889 V1 -0.15415 0.553875 2.58889 V2 -0.221528 0.795972 2.55 + N0 -0.0840299 0.144879 0.985875 N1 -0.0436726 0.162011 0.985822 N2 -0.0385545 0.143025 0.988968 + txt003 +STRI + V0 -0.221528 0.795972 2.55 V1 -0.419222 0.713778 2.55 V2 -0.291715 0.49668 2.58889 + N0 -0.0385545 0.143025 0.988968 N1 -0.0741814 0.127899 0.989009 N2 -0.0840299 0.144879 0.985875 + txt003 +STRI + V0 -0.15415 0.553875 2.58889 V1 -2.22045e-16 0.574074 2.58889 V2 -1.11022e-16 0.825 2.55 + N0 -0.0436726 0.162011 0.985822 N1 1.93429e-17 0.168031 0.985782 N2 2.37649e-17 0.14834 0.988936 + txt003 +STRI + V0 -1.11022e-16 0.825 2.55 V1 -0.221528 0.795972 2.55 V2 -0.15415 0.553875 2.58889 + N0 2.37649e-17 0.14834 0.988936 N1 -0.0385545 0.143025 0.988968 N2 -0.0436726 0.162011 0.985822 + txt003 +STRI + V0 -0.825 0 2.55 V1 -0.795972 0.221528 2.55 V2 -1.02199 0.284431 2.51111 + N0 -0.14834 0 0.988936 N1 -0.143025 0.0385545 0.988968 N2 -0.186699 0.0503275 0.981127 + txt003 +STRI + V0 -1.02199 0.284431 2.51111 V1 -1.05926 0 2.51111 V2 -0.825 0 2.55 + N0 -0.186699 0.0503275 0.981127 N1 -0.193633 0 0.981074 N2 -0.14834 0 0.988936 + txt003 +STRI + V0 -0.795972 0.221528 2.55 V1 -0.713778 0.419222 2.55 V2 -0.916455 0.538261 2.51111 + N0 -0.143025 0.0385545 0.988968 N1 -0.127899 0.0741814 0.989009 N2 -0.166959 0.0968361 0.981197 + txt003 +STRI + V0 -0.916455 0.538261 2.51111 V1 -1.02199 0.284431 2.51111 V2 -0.795972 0.221528 2.55 + N0 -0.166959 0.0968361 0.981197 N1 -0.186699 0.0503275 0.981127 N2 -0.143025 0.0385545 0.988968 + txt003 +STRI + V0 -0.713778 0.419222 2.55 V1 -0.58575 0.58575 2.55 V2 -0.752074 0.752074 2.51111 + N0 -0.127899 0.0741814 0.989009 N1 -0.104474 0.104474 0.989025 N2 -0.136382 0.136382 0.981224 + txt003 +STRI + V0 -0.752074 0.752074 2.51111 V1 -0.916455 0.538261 2.51111 V2 -0.713778 0.419222 2.55 + N0 -0.136382 0.136382 0.981224 N1 -0.166959 0.0968361 0.981197 N2 -0.127899 0.0741814 0.989009 + txt003 +STRI + V0 -0.58575 0.58575 2.55 V1 -0.419222 0.713778 2.55 V2 -0.538261 0.916455 2.51111 + N0 -0.104474 0.104474 0.989025 N1 -0.0741814 0.127899 0.989009 N2 -0.0968361 0.166959 0.981197 + txt003 +STRI + V0 -0.538261 0.916455 2.51111 V1 -0.752074 0.752074 2.51111 V2 -0.58575 0.58575 2.55 + N0 -0.0968361 0.166959 0.981197 N1 -0.136382 0.136382 0.981224 N2 -0.104474 0.104474 0.989025 + txt003 +STRI + V0 -0.419222 0.713778 2.55 V1 -0.221528 0.795972 2.55 V2 -0.284431 1.02199 2.51111 + N0 -0.0741814 0.127899 0.989009 N1 -0.0385545 0.143025 0.988968 N2 -0.0503275 0.186699 0.981127 + txt003 +STRI + V0 -0.284431 1.02199 2.51111 V1 -0.538261 0.916455 2.51111 V2 -0.419222 0.713778 2.55 + N0 -0.0503275 0.186699 0.981127 N1 -0.0968361 0.166959 0.981197 N2 -0.0741814 0.127899 0.989009 + txt003 +STRI + V0 -0.221528 0.795972 2.55 V1 -1.11022e-16 0.825 2.55 V2 -4.44089e-16 1.05926 2.51111 + N0 -0.0385545 0.143025 0.988968 N1 2.37649e-17 0.14834 0.988936 N2 7.24819e-17 0.193633 0.981074 + txt003 +STRI + V0 -4.44089e-16 1.05926 2.51111 V1 -0.284431 1.02199 2.51111 V2 -0.221528 0.795972 2.55 + N0 7.24819e-17 0.193633 0.981074 N1 -0.0503275 0.186699 0.981127 N2 -0.0385545 0.143025 0.988968 + txt003 +STRI + V0 -1.05926 0 2.51111 V1 -1.02199 0.284431 2.51111 V2 -1.18904 0.330924 2.46389 + N0 -0.193633 0 0.981074 N1 -0.186699 0.0503275 0.981127 N2 -0.376378 0.101459 0.920894 + txt003 +STRI + V0 -1.18904 0.330924 2.46389 V1 -1.23241 0 2.46389 V2 -1.05926 0 2.51111 + N0 -0.376378 0.101459 0.920894 N1 -0.390293 0 0.920691 N2 -0.193633 0 0.981074 + txt003 +STRI + V0 -1.02199 0.284431 2.51111 V1 -0.916455 0.538261 2.51111 V2 -1.06626 0.626246 2.46389 + N0 -0.186699 0.0503275 0.981127 N1 -0.166959 0.0968361 0.981197 N2 -0.336657 0.195261 0.92116 + txt003 +STRI + V0 -1.06626 0.626246 2.46389 V1 -1.18904 0.330924 2.46389 V2 -1.02199 0.284431 2.51111 + N0 -0.336657 0.195261 0.92116 N1 -0.376378 0.101459 0.920894 N2 -0.186699 0.0503275 0.981127 + txt003 +STRI + V0 -0.916455 0.538261 2.51111 V1 -0.752074 0.752074 2.51111 V2 -0.875009 0.875009 2.46389 + N0 -0.166959 0.0968361 0.981197 N1 -0.136382 0.136382 0.981224 N2 -0.275025 0.275025 0.921262 + txt003 +STRI + V0 -0.875009 0.875009 2.46389 V1 -1.06626 0.626246 2.46389 V2 -0.916455 0.538261 2.51111 + N0 -0.275025 0.275025 0.921262 N1 -0.336657 0.195261 0.92116 N2 -0.166959 0.0968361 0.981197 + txt003 +STRI + V0 -0.752074 0.752074 2.51111 V1 -0.538261 0.916455 2.51111 V2 -0.626246 1.06626 2.46389 + N0 -0.136382 0.136382 0.981224 N1 -0.0968361 0.166959 0.981197 N2 -0.195261 0.336657 0.92116 + txt003 +STRI + V0 -0.626246 1.06626 2.46389 V1 -0.875009 0.875009 2.46389 V2 -0.752074 0.752074 2.51111 + N0 -0.195261 0.336657 0.92116 N1 -0.275025 0.275025 0.921262 N2 -0.136382 0.136382 0.981224 + txt003 +STRI + V0 -0.538261 0.916455 2.51111 V1 -0.284431 1.02199 2.51111 V2 -0.330924 1.18904 2.46389 + N0 -0.0968361 0.166959 0.981197 N1 -0.0503275 0.186699 0.981127 N2 -0.101459 0.376378 0.920894 + txt003 +STRI + V0 -0.330924 1.18904 2.46389 V1 -0.626246 1.06626 2.46389 V2 -0.538261 0.916455 2.51111 + N0 -0.101459 0.376378 0.920894 N1 -0.195261 0.336657 0.92116 N2 -0.0968361 0.166959 0.981197 + txt003 +STRI + V0 -0.284431 1.02199 2.51111 V1 -4.44089e-16 1.05926 2.51111 V2 -4.44089e-16 1.23241 2.46389 + N0 -0.0503275 0.186699 0.981127 N1 7.24819e-17 0.193633 0.981074 N2 8.37138e-17 0.390293 0.920691 + txt003 +STRI + V0 -4.44089e-16 1.23241 2.46389 V1 -0.330924 1.18904 2.46389 V2 -0.284431 1.02199 2.51111 + N0 8.37138e-17 0.390293 0.920691 N1 -0.101459 0.376378 0.920894 N2 -0.0503275 0.186699 0.981127 + txt003 +STRI + V0 -1.23241 0 2.46389 V1 -1.18904 0.330924 2.46389 V2 -1.25426 0.349074 2.4 + N0 -0.390293 0 0.920691 N1 -0.376378 0.101459 0.920894 N2 -0.965535 0.260275 -1.02004e-15 + txt003 +STRI + V0 -1.25426 0.349074 2.4 V1 -1.3 0 2.4 V2 -1.23241 0 2.46389 + N0 -0.965535 0.260275 -1.02004e-15 N1 -1 0 -9.86865e-16 N2 -0.390293 0 0.920691 + txt003 +STRI + V0 -1.18904 0.330924 2.46389 V1 -1.06626 0.626246 2.46389 V2 -1.12474 0.660593 2.4 + N0 -0.376378 0.101459 0.920894 N1 -0.336657 0.195261 0.92116 N2 -0.865031 0.501718 -9.69705e-16 + txt003 +STRI + V0 -1.12474 0.660593 2.4 V1 -1.25426 0.349074 2.4 V2 -1.18904 0.330924 2.46389 + N0 -0.865031 0.501718 -9.69705e-16 N1 -0.965535 0.260275 -1.02004e-15 N2 -0.376378 0.101459 0.920894 + txt003 +STRI + V0 -1.06626 0.626246 2.46389 V1 -0.875009 0.875009 2.46389 V2 -0.923 0.923 2.4 + N0 -0.336657 0.195261 0.92116 N1 -0.275025 0.275025 0.921262 N2 -0.707107 0.707107 -7.41433e-16 + txt003 +STRI + V0 -0.923 0.923 2.4 V1 -1.12474 0.660593 2.4 V2 -1.06626 0.626246 2.46389 + N0 -0.707107 0.707107 -7.41433e-16 N1 -0.865031 0.501718 -9.69705e-16 N2 -0.336657 0.195261 0.92116 + txt003 +STRI + V0 -0.875009 0.875009 2.46389 V1 -0.626246 1.06626 2.46389 V2 -0.660593 1.12474 2.4 + N0 -0.275025 0.275025 0.921262 N1 -0.195261 0.336657 0.92116 N2 -0.501718 0.865031 -4.67305e-16 + txt003 +STRI + V0 -0.660593 1.12474 2.4 V1 -0.923 0.923 2.4 V2 -0.875009 0.875009 2.46389 + N0 -0.501718 0.865031 -4.67305e-16 N1 -0.707107 0.707107 -7.41433e-16 N2 -0.275025 0.275025 0.921262 + txt003 +STRI + V0 -0.626246 1.06626 2.46389 V1 -0.330924 1.18904 2.46389 V2 -0.349074 1.25426 2.4 + N0 -0.195261 0.336657 0.92116 N1 -0.101459 0.376378 0.920894 N2 -0.260275 0.965535 -5.24893e-16 + txt003 +STRI + V0 -0.349074 1.25426 2.4 V1 -0.660593 1.12474 2.4 V2 -0.626246 1.06626 2.46389 + N0 -0.260275 0.965535 -5.24893e-16 N1 -0.501718 0.865031 -4.67305e-16 N2 -0.195261 0.336657 0.92116 + txt003 +STRI + V0 -0.330924 1.18904 2.46389 V1 -4.44089e-16 1.23241 2.46389 V2 -6.66134e-16 1.3 2.4 + N0 -0.101459 0.376378 0.920894 N1 8.37138e-17 0.390293 0.920691 N2 4.06675e-16 1 -1.4803e-15 + txt003 +STRI + V0 -6.66134e-16 1.3 2.4 V1 -0.349074 1.25426 2.4 V2 -0.330924 1.18904 2.46389 + N0 4.06675e-16 1 -1.4803e-15 N1 -0.260275 0.965535 -5.24893e-16 N2 -0.101459 0.376378 0.920894 + txt003 +STRI + V0 0 0.2 2.7 V1 0.0537037 0.192963 2.7 V2 0.0942301 0.338579 2.63611 + N0 -0 0.6 0.8 N1 0.15602 0.578783 0.800417 N2 0.0697517 0.258756 0.963421 + txt003 +STRI + V0 0.0942301 0.338579 2.63611 V1 0 0.350926 2.63611 V2 0 0.2 2.7 + N0 0.0697517 0.258756 0.963421 N1 -0 0.268354 0.96332 N2 -0 0.6 0.8 + txt003 +STRI + V0 0.0537037 0.192963 2.7 V1 0.10163 0.173037 2.7 V2 0.178322 0.303616 2.63611 + N0 0.15602 0.578783 0.800417 N1 0.300385 0.517905 0.800964 N2 0.134219 0.231413 0.963552 + txt003 +STRI + V0 0.178322 0.303616 2.63611 V1 0.0942301 0.338579 2.63611 V2 0.0537037 0.192963 2.7 + N0 0.134219 0.231413 0.963552 N1 0.0697517 0.258756 0.963421 N2 0.15602 0.578783 0.800417 + txt003 +STRI + V0 0.10163 0.173037 2.7 V1 0.142 0.142 2.7 V2 0.249157 0.249157 2.63611 + N0 0.300385 0.517905 0.800964 N1 0.423155 0.423155 0.801174 N2 0.189037 0.189037 0.963603 + txt003 +STRI + V0 0.249157 0.249157 2.63611 V1 0.178322 0.303616 2.63611 V2 0.10163 0.173037 2.7 + N0 0.189037 0.189037 0.963603 N1 0.134219 0.231413 0.963552 N2 0.300385 0.517905 0.800964 + txt003 +STRI + V0 0.142 0.142 2.7 V1 0.173037 0.10163 2.7 V2 0.303616 0.178322 2.63611 + N0 0.423155 0.423155 0.801174 N1 0.517905 0.300385 0.800964 N2 0.231413 0.134219 0.963552 + txt003 +STRI + V0 0.303616 0.178322 2.63611 V1 0.249157 0.249157 2.63611 V2 0.142 0.142 2.7 + N0 0.231413 0.134219 0.963552 N1 0.189037 0.189037 0.963603 N2 0.423155 0.423155 0.801174 + txt003 +STRI + V0 0.173037 0.10163 2.7 V1 0.192963 0.0537037 2.7 V2 0.338579 0.0942301 2.63611 + N0 0.517905 0.300385 0.800964 N1 0.578783 0.15602 0.800417 N2 0.258756 0.0697517 0.963421 + txt003 +STRI + V0 0.338579 0.0942301 2.63611 V1 0.303616 0.178322 2.63611 V2 0.173037 0.10163 2.7 + N0 0.258756 0.0697517 0.963421 N1 0.231413 0.134219 0.963552 N2 0.517905 0.300385 0.800964 + txt003 +STRI + V0 0.192963 0.0537037 2.7 V1 0.2 0 2.7 V2 0.350926 5.55112e-17 2.63611 + N0 0.578783 0.15602 0.800417 N1 0.6 -9.91271e-17 0.8 N2 0.268354 0 0.96332 + txt003 +STRI + V0 0.350926 5.55112e-17 2.63611 V1 0.338579 0.0942301 2.63611 V2 0.192963 0.0537037 2.7 + N0 0.268354 0 0.96332 N1 0.258756 0.0697517 0.963421 N2 0.578783 0.15602 0.800417 + txt003 +STRI + V0 0 0.350926 2.63611 V1 0.0942301 0.338579 2.63611 V2 0.15415 0.553875 2.58889 + N0 -0 0.268354 0.96332 N1 0.0697517 0.258756 0.963421 N2 0.0436726 0.162011 0.985822 + txt003 +STRI + V0 0.15415 0.553875 2.58889 V1 0 0.574074 2.58889 V2 0 0.350926 2.63611 + N0 0.0436726 0.162011 0.985822 N1 -0 0.168031 0.985782 N2 -0 0.268354 0.96332 + txt003 +STRI + V0 0.0942301 0.338579 2.63611 V1 0.178322 0.303616 2.63611 V2 0.291715 0.49668 2.58889 + N0 0.0697517 0.258756 0.963421 N1 0.134219 0.231413 0.963552 N2 0.0840299 0.144879 0.985875 + txt003 +STRI + V0 0.291715 0.49668 2.58889 V1 0.15415 0.553875 2.58889 V2 0.0942301 0.338579 2.63611 + N0 0.0840299 0.144879 0.985875 N1 0.0436726 0.162011 0.985822 N2 0.0697517 0.258756 0.963421 + txt003 +STRI + V0 0.178322 0.303616 2.63611 V1 0.249157 0.249157 2.63611 V2 0.407593 0.407593 2.58889 + N0 0.134219 0.231413 0.963552 N1 0.189037 0.189037 0.963603 N2 0.118345 0.118345 0.985895 + txt003 +STRI + V0 0.407593 0.407593 2.58889 V1 0.291715 0.49668 2.58889 V2 0.178322 0.303616 2.63611 + N0 0.118345 0.118345 0.985895 N1 0.0840299 0.144879 0.985875 N2 0.134219 0.231413 0.963552 + txt003 +STRI + V0 0.249157 0.249157 2.63611 V1 0.303616 0.178322 2.63611 V2 0.49668 0.291715 2.58889 + N0 0.189037 0.189037 0.963603 N1 0.231413 0.134219 0.963552 N2 0.144879 0.0840299 0.985875 + txt003 +STRI + V0 0.49668 0.291715 2.58889 V1 0.407593 0.407593 2.58889 V2 0.249157 0.249157 2.63611 + N0 0.144879 0.0840299 0.985875 N1 0.118345 0.118345 0.985895 N2 0.189037 0.189037 0.963603 + txt003 +STRI + V0 0.303616 0.178322 2.63611 V1 0.338579 0.0942301 2.63611 V2 0.553875 0.15415 2.58889 + N0 0.231413 0.134219 0.963552 N1 0.258756 0.0697517 0.963421 N2 0.162011 0.0436726 0.985822 + txt003 +STRI + V0 0.553875 0.15415 2.58889 V1 0.49668 0.291715 2.58889 V2 0.303616 0.178322 2.63611 + N0 0.162011 0.0436726 0.985822 N1 0.144879 0.0840299 0.985875 N2 0.231413 0.134219 0.963552 + txt003 +STRI + V0 0.338579 0.0942301 2.63611 V1 0.350926 5.55112e-17 2.63611 V2 0.574074 2.22045e-16 2.58889 + N0 0.258756 0.0697517 0.963421 N1 0.268354 0 0.96332 N2 0.168031 -1.93429e-17 0.985782 + txt003 +STRI + V0 0.574074 2.22045e-16 2.58889 V1 0.553875 0.15415 2.58889 V2 0.338579 0.0942301 2.63611 + N0 0.168031 -1.93429e-17 0.985782 N1 0.162011 0.0436726 0.985822 N2 0.258756 0.0697517 0.963421 + txt003 +STRI + V0 0 0.574074 2.58889 V1 0.15415 0.553875 2.58889 V2 0.221528 0.795972 2.55 + N0 -0 0.168031 0.985782 N1 0.0436726 0.162011 0.985822 N2 0.0385545 0.143025 0.988968 + txt003 +STRI + V0 0.221528 0.795972 2.55 V1 0 0.825 2.55 V2 0 0.574074 2.58889 + N0 0.0385545 0.143025 0.988968 N1 -0 0.14834 0.988936 N2 -0 0.168031 0.985782 + txt003 +STRI + V0 0.15415 0.553875 2.58889 V1 0.291715 0.49668 2.58889 V2 0.419222 0.713778 2.55 + N0 0.0436726 0.162011 0.985822 N1 0.0840299 0.144879 0.985875 N2 0.0741814 0.127899 0.989009 + txt003 +STRI + V0 0.419222 0.713778 2.55 V1 0.221528 0.795972 2.55 V2 0.15415 0.553875 2.58889 + N0 0.0741814 0.127899 0.989009 N1 0.0385545 0.143025 0.988968 N2 0.0436726 0.162011 0.985822 + txt003 +STRI + V0 0.291715 0.49668 2.58889 V1 0.407593 0.407593 2.58889 V2 0.58575 0.58575 2.55 + N0 0.0840299 0.144879 0.985875 N1 0.118345 0.118345 0.985895 N2 0.104474 0.104474 0.989025 + txt003 +STRI + V0 0.58575 0.58575 2.55 V1 0.419222 0.713778 2.55 V2 0.291715 0.49668 2.58889 + N0 0.104474 0.104474 0.989025 N1 0.0741814 0.127899 0.989009 N2 0.0840299 0.144879 0.985875 + txt003 +STRI + V0 0.407593 0.407593 2.58889 V1 0.49668 0.291715 2.58889 V2 0.713778 0.419222 2.55 + N0 0.118345 0.118345 0.985895 N1 0.144879 0.0840299 0.985875 N2 0.127899 0.0741814 0.989009 + txt003 +STRI + V0 0.713778 0.419222 2.55 V1 0.58575 0.58575 2.55 V2 0.407593 0.407593 2.58889 + N0 0.127899 0.0741814 0.989009 N1 0.104474 0.104474 0.989025 N2 0.118345 0.118345 0.985895 + txt003 +STRI + V0 0.49668 0.291715 2.58889 V1 0.553875 0.15415 2.58889 V2 0.795972 0.221528 2.55 + N0 0.144879 0.0840299 0.985875 N1 0.162011 0.0436726 0.985822 N2 0.143025 0.0385545 0.988968 + txt003 +STRI + V0 0.795972 0.221528 2.55 V1 0.713778 0.419222 2.55 V2 0.49668 0.291715 2.58889 + N0 0.143025 0.0385545 0.988968 N1 0.127899 0.0741814 0.989009 N2 0.144879 0.0840299 0.985875 + txt003 +STRI + V0 0.553875 0.15415 2.58889 V1 0.574074 2.22045e-16 2.58889 V2 0.825 1.11022e-16 2.55 + N0 0.162011 0.0436726 0.985822 N1 0.168031 -1.93429e-17 0.985782 N2 0.14834 -2.37649e-17 0.988936 + txt003 +STRI + V0 0.825 1.11022e-16 2.55 V1 0.795972 0.221528 2.55 V2 0.553875 0.15415 2.58889 + N0 0.14834 -2.37649e-17 0.988936 N1 0.143025 0.0385545 0.988968 N2 0.162011 0.0436726 0.985822 + txt003 +STRI + V0 0 0.825 2.55 V1 0.221528 0.795972 2.55 V2 0.284431 1.02199 2.51111 + N0 -0 0.14834 0.988936 N1 0.0385545 0.143025 0.988968 N2 0.0503275 0.186699 0.981127 + txt003 +STRI + V0 0.284431 1.02199 2.51111 V1 0 1.05926 2.51111 V2 0 0.825 2.55 + N0 0.0503275 0.186699 0.981127 N1 -0 0.193633 0.981074 N2 -0 0.14834 0.988936 + txt003 +STRI + V0 0.221528 0.795972 2.55 V1 0.419222 0.713778 2.55 V2 0.538261 0.916455 2.51111 + N0 0.0385545 0.143025 0.988968 N1 0.0741814 0.127899 0.989009 N2 0.0968361 0.166959 0.981197 + txt003 +STRI + V0 0.538261 0.916455 2.51111 V1 0.284431 1.02199 2.51111 V2 0.221528 0.795972 2.55 + N0 0.0968361 0.166959 0.981197 N1 0.0503275 0.186699 0.981127 N2 0.0385545 0.143025 0.988968 + txt003 +STRI + V0 0.419222 0.713778 2.55 V1 0.58575 0.58575 2.55 V2 0.752074 0.752074 2.51111 + N0 0.0741814 0.127899 0.989009 N1 0.104474 0.104474 0.989025 N2 0.136382 0.136382 0.981224 + txt003 +STRI + V0 0.752074 0.752074 2.51111 V1 0.538261 0.916455 2.51111 V2 0.419222 0.713778 2.55 + N0 0.136382 0.136382 0.981224 N1 0.0968361 0.166959 0.981197 N2 0.0741814 0.127899 0.989009 + txt003 +STRI + V0 0.58575 0.58575 2.55 V1 0.713778 0.419222 2.55 V2 0.916455 0.538261 2.51111 + N0 0.104474 0.104474 0.989025 N1 0.127899 0.0741814 0.989009 N2 0.166959 0.0968361 0.981197 + txt003 +STRI + V0 0.916455 0.538261 2.51111 V1 0.752074 0.752074 2.51111 V2 0.58575 0.58575 2.55 + N0 0.166959 0.0968361 0.981197 N1 0.136382 0.136382 0.981224 N2 0.104474 0.104474 0.989025 + txt003 +STRI + V0 0.713778 0.419222 2.55 V1 0.795972 0.221528 2.55 V2 1.02199 0.284431 2.51111 + N0 0.127899 0.0741814 0.989009 N1 0.143025 0.0385545 0.988968 N2 0.186699 0.0503275 0.981127 + txt003 +STRI + V0 1.02199 0.284431 2.51111 V1 0.916455 0.538261 2.51111 V2 0.713778 0.419222 2.55 + N0 0.186699 0.0503275 0.981127 N1 0.166959 0.0968361 0.981197 N2 0.127899 0.0741814 0.989009 + txt003 +STRI + V0 0.795972 0.221528 2.55 V1 0.825 1.11022e-16 2.55 V2 1.05926 4.44089e-16 2.51111 + N0 0.143025 0.0385545 0.988968 N1 0.14834 -2.37649e-17 0.988936 N2 0.193633 -7.24819e-17 0.981074 + txt003 +STRI + V0 1.05926 4.44089e-16 2.51111 V1 1.02199 0.284431 2.51111 V2 0.795972 0.221528 2.55 + N0 0.193633 -7.24819e-17 0.981074 N1 0.186699 0.0503275 0.981127 N2 0.143025 0.0385545 0.988968 + txt003 +STRI + V0 0 1.05926 2.51111 V1 0.284431 1.02199 2.51111 V2 0.330924 1.18904 2.46389 + N0 -0 0.193633 0.981074 N1 0.0503275 0.186699 0.981127 N2 0.101459 0.376378 0.920894 + txt003 +STRI + V0 0.330924 1.18904 2.46389 V1 0 1.23241 2.46389 V2 0 1.05926 2.51111 + N0 0.101459 0.376378 0.920894 N1 -0 0.390293 0.920691 N2 -0 0.193633 0.981074 + txt003 +STRI + V0 0.284431 1.02199 2.51111 V1 0.538261 0.916455 2.51111 V2 0.626246 1.06626 2.46389 + N0 0.0503275 0.186699 0.981127 N1 0.0968361 0.166959 0.981197 N2 0.195261 0.336657 0.92116 + txt003 +STRI + V0 0.626246 1.06626 2.46389 V1 0.330924 1.18904 2.46389 V2 0.284431 1.02199 2.51111 + N0 0.195261 0.336657 0.92116 N1 0.101459 0.376378 0.920894 N2 0.0503275 0.186699 0.981127 + txt003 +STRI + V0 0.538261 0.916455 2.51111 V1 0.752074 0.752074 2.51111 V2 0.875009 0.875009 2.46389 + N0 0.0968361 0.166959 0.981197 N1 0.136382 0.136382 0.981224 N2 0.275025 0.275025 0.921262 + txt003 +STRI + V0 0.875009 0.875009 2.46389 V1 0.626246 1.06626 2.46389 V2 0.538261 0.916455 2.51111 + N0 0.275025 0.275025 0.921262 N1 0.195261 0.336657 0.92116 N2 0.0968361 0.166959 0.981197 + txt003 +STRI + V0 0.752074 0.752074 2.51111 V1 0.916455 0.538261 2.51111 V2 1.06626 0.626246 2.46389 + N0 0.136382 0.136382 0.981224 N1 0.166959 0.0968361 0.981197 N2 0.336657 0.195261 0.92116 + txt003 +STRI + V0 1.06626 0.626246 2.46389 V1 0.875009 0.875009 2.46389 V2 0.752074 0.752074 2.51111 + N0 0.336657 0.195261 0.92116 N1 0.275025 0.275025 0.921262 N2 0.136382 0.136382 0.981224 + txt003 +STRI + V0 0.916455 0.538261 2.51111 V1 1.02199 0.284431 2.51111 V2 1.18904 0.330924 2.46389 + N0 0.166959 0.0968361 0.981197 N1 0.186699 0.0503275 0.981127 N2 0.376378 0.101459 0.920894 + txt003 +STRI + V0 1.18904 0.330924 2.46389 V1 1.06626 0.626246 2.46389 V2 0.916455 0.538261 2.51111 + N0 0.376378 0.101459 0.920894 N1 0.336657 0.195261 0.92116 N2 0.166959 0.0968361 0.981197 + txt003 +STRI + V0 1.02199 0.284431 2.51111 V1 1.05926 4.44089e-16 2.51111 V2 1.23241 4.44089e-16 2.46389 + N0 0.186699 0.0503275 0.981127 N1 0.193633 -7.24819e-17 0.981074 N2 0.390293 -8.37138e-17 0.920691 + txt003 +STRI + V0 1.23241 4.44089e-16 2.46389 V1 1.18904 0.330924 2.46389 V2 1.02199 0.284431 2.51111 + N0 0.390293 -8.37138e-17 0.920691 N1 0.376378 0.101459 0.920894 N2 0.186699 0.0503275 0.981127 + txt003 +STRI + V0 0 1.23241 2.46389 V1 0.330924 1.18904 2.46389 V2 0.349074 1.25426 2.4 + N0 -0 0.390293 0.920691 N1 0.101459 0.376378 0.920894 N2 0.260275 0.965535 -1.02004e-15 + txt003 +STRI + V0 0.349074 1.25426 2.4 V1 0 1.3 2.4 V2 0 1.23241 2.46389 + N0 0.260275 0.965535 -1.02004e-15 N1 0 1 -9.86865e-16 N2 -0 0.390293 0.920691 + txt003 +STRI + V0 0.330924 1.18904 2.46389 V1 0.626246 1.06626 2.46389 V2 0.660593 1.12474 2.4 + N0 0.101459 0.376378 0.920894 N1 0.195261 0.336657 0.92116 N2 0.501718 0.865031 -9.69705e-16 + txt003 +STRI + V0 0.660593 1.12474 2.4 V1 0.349074 1.25426 2.4 V2 0.330924 1.18904 2.46389 + N0 0.501718 0.865031 -9.69705e-16 N1 0.260275 0.965535 -1.02004e-15 N2 0.101459 0.376378 0.920894 + txt003 +STRI + V0 0.626246 1.06626 2.46389 V1 0.875009 0.875009 2.46389 V2 0.923 0.923 2.4 + N0 0.195261 0.336657 0.92116 N1 0.275025 0.275025 0.921262 N2 0.707107 0.707107 -7.41433e-16 + txt003 +STRI + V0 0.923 0.923 2.4 V1 0.660593 1.12474 2.4 V2 0.626246 1.06626 2.46389 + N0 0.707107 0.707107 -7.41433e-16 N1 0.501718 0.865031 -9.69705e-16 N2 0.195261 0.336657 0.92116 + txt003 +STRI + V0 0.875009 0.875009 2.46389 V1 1.06626 0.626246 2.46389 V2 1.12474 0.660593 2.4 + N0 0.275025 0.275025 0.921262 N1 0.336657 0.195261 0.92116 N2 0.865031 0.501718 -4.67305e-16 + txt003 +STRI + V0 1.12474 0.660593 2.4 V1 0.923 0.923 2.4 V2 0.875009 0.875009 2.46389 + N0 0.865031 0.501718 -4.67305e-16 N1 0.707107 0.707107 -7.41433e-16 N2 0.275025 0.275025 0.921262 + txt003 +STRI + V0 1.06626 0.626246 2.46389 V1 1.18904 0.330924 2.46389 V2 1.25426 0.349074 2.4 + N0 0.336657 0.195261 0.92116 N1 0.376378 0.101459 0.920894 N2 0.965535 0.260275 -5.24893e-16 + txt003 +STRI + V0 1.25426 0.349074 2.4 V1 1.12474 0.660593 2.4 V2 1.06626 0.626246 2.46389 + N0 0.965535 0.260275 -5.24893e-16 N1 0.865031 0.501718 -4.67305e-16 N2 0.336657 0.195261 0.92116 + txt003 +STRI + V0 1.18904 0.330924 2.46389 V1 1.23241 4.44089e-16 2.46389 V2 1.3 6.66134e-16 2.4 + N0 0.376378 0.101459 0.920894 N1 0.390293 -8.37138e-17 0.920691 N2 1 -4.06675e-16 -1.4803e-15 + txt003 +STRI + V0 1.3 6.66134e-16 2.4 V1 1.25426 0.349074 2.4 V2 1.18904 0.330924 2.46389 + N0 1 -4.06675e-16 -1.4803e-15 N1 0.965535 0.260275 -5.24893e-16 N2 0.376378 0.101459 0.920894 + txt003 +STRI + V0 0.584584 0.162696 0.00590278 V1 0.605903 0 0.00590278 V2 0 0 0 + N0 0.0218614 0.00589307 -0.999744 N1 0.0226746 0 -0.999743 N2 0 0 -1 + txt003 +STRI + V0 0.524218 0.307888 0.00590278 V1 0.584584 0.162696 0.00590278 V2 0 0 0 + N0 0.0195486 0.0113382 -0.999745 N1 0.0218614 0.00589307 -0.999744 N2 0 0 -1 + txt003 +STRI + V0 0.430191 0.430191 0.00590278 V1 0.524218 0.307888 0.00590278 V2 0 0 0 + N0 0.015968 0.015968 -0.999745 N1 0.0195486 0.0113382 -0.999745 N2 0 0 -1 + txt003 +STRI + V0 0.307888 0.524218 0.00590278 V1 0.430191 0.430191 0.00590278 V2 0 0 0 + N0 0.0113382 0.0195486 -0.999745 N1 0.015968 0.015968 -0.999745 N2 0 0 -1 + txt003 +STRI + V0 0.162696 0.584584 0.00590278 V1 0.307888 0.524218 0.00590278 V2 0 0 0 + N0 0.00589307 0.0218614 -0.999744 N1 0.0113382 0.0195486 -0.999745 N2 0 0 -1 + txt003 +STRI + V0 0 0.605903 0.00590278 V1 0.162696 0.584584 0.00590278 V2 0 0 0 + N0 4.94615e-18 0.0226746 -0.999743 N1 0.00589307 0.0218614 -0.999744 N2 0 0 -1 + txt003 +STRI + V0 0.605903 0 0.00590278 V1 0.584584 0.162696 0.00590278 V2 0.986255 0.274486 0.0222222 + N0 0.0226746 0 -0.999743 N1 0.0218614 0.00589307 -0.999744 N2 0.0601415 0.0162121 -0.998058 + txt003 +STRI + V0 0.986255 0.274486 0.0222222 V1 1.02222 0 0.0222222 V2 0.605903 0 0.00590278 + N0 0.0601415 0.0162121 -0.998058 N1 0.0623783 0 -0.998053 N2 0.0226746 0 -0.999743 + txt003 +STRI + V0 0.584584 0.162696 0.00590278 V1 0.524218 0.307888 0.00590278 V2 0.884412 0.51944 0.0222222 + N0 0.0218614 0.00589307 -0.999744 N1 0.0195486 0.0113382 -0.999745 N2 0.0537792 0.0311919 -0.998066 + txt003 +STRI + V0 0.884412 0.51944 0.0222222 V1 0.986255 0.274486 0.0222222 V2 0.584584 0.162696 0.00590278 + N0 0.0537792 0.0311919 -0.998066 N1 0.0601415 0.0162121 -0.998058 N2 0.0218614 0.00589307 -0.999744 + txt003 +STRI + V0 0.524218 0.307888 0.00590278 V1 0.430191 0.430191 0.00590278 V2 0.725778 0.725778 0.0222222 + N0 0.0195486 0.0113382 -0.999745 N1 0.015968 0.015968 -0.999745 N2 0.0439291 0.0439291 -0.998068 + txt003 +STRI + V0 0.725778 0.725778 0.0222222 V1 0.884412 0.51944 0.0222222 V2 0.524218 0.307888 0.00590278 + N0 0.0439291 0.0439291 -0.998068 N1 0.0537792 0.0311919 -0.998066 N2 0.0195486 0.0113382 -0.999745 + txt003 +STRI + V0 0.430191 0.430191 0.00590278 V1 0.307888 0.524218 0.00590278 V2 0.51944 0.884412 0.0222222 + N0 0.015968 0.015968 -0.999745 N1 0.0113382 0.0195486 -0.999745 N2 0.0311919 0.0537792 -0.998066 + txt003 +STRI + V0 0.51944 0.884412 0.0222222 V1 0.725778 0.725778 0.0222222 V2 0.430191 0.430191 0.00590278 + N0 0.0311919 0.0537792 -0.998066 N1 0.0439291 0.0439291 -0.998068 N2 0.015968 0.015968 -0.999745 + txt003 +STRI + V0 0.307888 0.524218 0.00590278 V1 0.162696 0.584584 0.00590278 V2 0.274486 0.986255 0.0222222 + N0 0.0113382 0.0195486 -0.999745 N1 0.00589307 0.0218614 -0.999744 N2 0.0162121 0.0601415 -0.998058 + txt003 +STRI + V0 0.274486 0.986255 0.0222222 V1 0.51944 0.884412 0.0222222 V2 0.307888 0.524218 0.00590278 + N0 0.0162121 0.0601415 -0.998058 N1 0.0311919 0.0537792 -0.998066 N2 0.0113382 0.0195486 -0.999745 + txt003 +STRI + V0 0.162696 0.584584 0.00590278 V1 0 0.605903 0.00590278 V2 -2.22045e-16 1.02222 0.0222222 + N0 0.00589307 0.0218614 -0.999744 N1 4.94615e-18 0.0226746 -0.999743 N2 0 0.0623783 -0.998053 + txt003 +STRI + V0 -2.22045e-16 1.02222 0.0222222 V1 0.274486 0.986255 0.0222222 V2 0.162696 0.584584 0.00590278 + N0 0 0.0623783 -0.998053 N1 0.0162121 0.0601415 -0.998058 N2 0.00589307 0.0218614 -0.999744 + txt003 +STRI + V0 1.02222 0 0.0222222 V1 0.986255 0.274486 0.0222222 V2 1.23918 0.344878 0.046875 + N0 0.0623783 0 -0.998053 N1 0.0601415 0.0162121 -0.998058 N2 0.136353 0.0367561 -0.989978 + txt003 +STRI + V0 1.23918 0.344878 0.046875 V1 1.28438 0 0.046875 V2 1.02222 0 0.0222222 + N0 0.136353 0.0367561 -0.989978 N1 0.141421 0 -0.989949 N2 0.0623783 0 -0.998053 + txt003 +STRI + V0 0.986255 0.274486 0.0222222 V1 0.884412 0.51944 0.0222222 V2 1.11122 0.652653 0.046875 + N0 0.0601415 0.0162121 -0.998058 N1 0.0537792 0.0311919 -0.998066 N2 0.121932 0.0707208 -0.990016 + txt003 +STRI + V0 1.11122 0.652653 0.046875 V1 1.23918 0.344878 0.046875 V2 0.986255 0.274486 0.0222222 + N0 0.121932 0.0707208 -0.990016 N1 0.136353 0.0367561 -0.989978 N2 0.0601415 0.0162121 -0.998058 + txt003 +STRI + V0 0.884412 0.51944 0.0222222 V1 0.725778 0.725778 0.0222222 V2 0.911906 0.911906 0.046875 + N0 0.0537792 0.0311919 -0.998066 N1 0.0439291 0.0439291 -0.998068 N2 0.0996006 0.0996006 -0.99003 + txt003 +STRI + V0 0.911906 0.911906 0.046875 V1 1.11122 0.652653 0.046875 V2 0.884412 0.51944 0.0222222 + N0 0.0996006 0.0996006 -0.99003 N1 0.121932 0.0707208 -0.990016 N2 0.0537792 0.0311919 -0.998066 + txt003 +STRI + V0 0.725778 0.725778 0.0222222 V1 0.51944 0.884412 0.0222222 V2 0.652653 1.11122 0.046875 + N0 0.0439291 0.0439291 -0.998068 N1 0.0311919 0.0537792 -0.998066 N2 0.0707208 0.121932 -0.990016 + txt003 +STRI + V0 0.652653 1.11122 0.046875 V1 0.911906 0.911906 0.046875 V2 0.725778 0.725778 0.0222222 + N0 0.0707208 0.121932 -0.990016 N1 0.0996006 0.0996006 -0.99003 N2 0.0439291 0.0439291 -0.998068 + txt003 +STRI + V0 0.51944 0.884412 0.0222222 V1 0.274486 0.986255 0.0222222 V2 0.344878 1.23918 0.046875 + N0 0.0311919 0.0537792 -0.998066 N1 0.0162121 0.0601415 -0.998058 N2 0.0367561 0.136353 -0.989978 + txt003 +STRI + V0 0.344878 1.23918 0.046875 V1 0.652653 1.11122 0.046875 V2 0.51944 0.884412 0.0222222 + N0 0.0367561 0.136353 -0.989978 N1 0.0707208 0.121932 -0.990016 N2 0.0311919 0.0537792 -0.998066 + txt003 +STRI + V0 0.274486 0.986255 0.0222222 V1 -2.22045e-16 1.02222 0.0222222 V2 2.22045e-16 1.28437 0.046875 + N0 0.0162121 0.0601415 -0.998058 N1 0 0.0623783 -0.998053 N2 0 0.141421 -0.989949 + txt003 +STRI + V0 2.22045e-16 1.28437 0.046875 V1 0.344878 1.23918 0.046875 V2 0.274486 0.986255 0.0222222 + N0 0 0.141421 -0.989949 N1 0.0367561 0.136353 -0.989978 N2 0.0162121 0.0601415 -0.998058 + txt003 +STRI + V0 1.28438 0 0.046875 V1 1.23918 0.344878 0.046875 V2 1.37754 0.383385 0.0777778 + N0 0.141421 0 -0.989949 N1 0.136353 0.0367561 -0.989978 N2 0.316788 0.085395 -0.944644 + txt003 +STRI + V0 1.37754 0.383385 0.0777778 V1 1.42778 0 0.0777778 V2 1.28438 0 0.046875 + N0 0.316788 0.085395 -0.944644 N1 0.328521 0 -0.944497 N2 0.141421 0 -0.989949 + txt003 +STRI + V0 1.23918 0.344878 0.046875 V1 1.11122 0.652653 0.046875 V2 1.23529 0.725523 0.0777778 + N0 0.136353 0.0367561 -0.989978 N1 0.121932 0.0707208 -0.990016 N2 0.283331 0.164332 -0.944838 + txt003 +STRI + V0 1.23529 0.725523 0.0777778 V1 1.37754 0.383385 0.0777778 V2 1.23918 0.344878 0.046875 + N0 0.283331 0.164332 -0.944838 N1 0.316788 0.085395 -0.944644 N2 0.136353 0.0367561 -0.989978 + txt003 +STRI + V0 1.11122 0.652653 0.046875 V1 0.911906 0.911906 0.046875 V2 1.01372 1.01372 0.0777778 + N0 0.121932 0.0707208 -0.990016 N1 0.0996006 0.0996006 -0.99003 N2 0.231454 0.231454 -0.944912 + txt003 +STRI + V0 1.01372 1.01372 0.0777778 V1 1.23529 0.725523 0.0777778 V2 1.11122 0.652653 0.046875 + N0 0.231454 0.231454 -0.944912 N1 0.283331 0.164332 -0.944838 N2 0.121932 0.0707208 -0.990016 + txt003 +STRI + V0 0.911906 0.911906 0.046875 V1 0.652653 1.11122 0.046875 V2 0.725523 1.23529 0.0777778 + N0 0.0996006 0.0996006 -0.99003 N1 0.0707208 0.121932 -0.990016 N2 0.164332 0.283331 -0.944838 + txt003 +STRI + V0 0.725523 1.23529 0.0777778 V1 1.01372 1.01372 0.0777778 V2 0.911906 0.911906 0.046875 + N0 0.164332 0.283331 -0.944838 N1 0.231454 0.231454 -0.944912 N2 0.0996006 0.0996006 -0.99003 + txt003 +STRI + V0 0.652653 1.11122 0.046875 V1 0.344878 1.23918 0.046875 V2 0.383385 1.37754 0.0777778 + N0 0.0707208 0.121932 -0.990016 N1 0.0367561 0.136353 -0.989978 N2 0.085395 0.316788 -0.944644 + txt003 +STRI + V0 0.383385 1.37754 0.0777778 V1 0.725523 1.23529 0.0777778 V2 0.652653 1.11122 0.046875 + N0 0.085395 0.316788 -0.944644 N1 0.164332 0.283331 -0.944838 N2 0.0707208 0.121932 -0.990016 + txt003 +STRI + V0 0.344878 1.23918 0.046875 V1 2.22045e-16 1.28437 0.046875 V2 -2.22045e-16 1.42778 0.0777778 + N0 0.0367561 0.136353 -0.989978 N1 0 0.141421 -0.989949 N2 6.08223e-17 0.328521 -0.944497 + txt003 +STRI + V0 -2.22045e-16 1.42778 0.0777778 V1 0.383385 1.37754 0.0777778 V2 0.344878 1.23918 0.046875 + N0 6.08223e-17 0.328521 -0.944497 N1 0.085395 0.316788 -0.944644 N2 0.0367561 0.136353 -0.989978 + txt003 +STRI + V0 1.42778 0 0.0777778 V1 1.37754 0.383385 0.0777778 V2 1.4355 0.399515 0.112847 + N0 0.328521 0 -0.944497 N1 0.316788 0.085395 -0.944644 N2 0.743044 0.200299 -0.638566 + txt003 +STRI + V0 1.4355 0.399515 0.112847 V1 1.48785 0 0.112847 V2 1.42778 0 0.0777778 + N0 0.743044 0.200299 -0.638566 N1 0.770022 0 -0.638018 N2 0.328521 0 -0.944497 + txt003 +STRI + V0 1.37754 0.383385 0.0777778 V1 1.23529 0.725523 0.0777778 V2 1.28726 0.756047 0.112847 + N0 0.316788 0.085395 -0.944644 N1 0.283331 0.164332 -0.944838 N2 0.665182 0.385806 -0.639286 + txt003 +STRI + V0 1.28726 0.756047 0.112847 V1 1.4355 0.399515 0.112847 V2 1.37754 0.383385 0.0777778 + N0 0.665182 0.385806 -0.639286 N1 0.743044 0.200299 -0.638566 N2 0.316788 0.085395 -0.944644 + txt003 +STRI + V0 1.23529 0.725523 0.0777778 V1 1.01372 1.01372 0.0777778 V2 1.05637 1.05637 0.112847 + N0 0.283331 0.164332 -0.944838 N1 0.231454 0.231454 -0.944912 N2 0.543581 0.543581 -0.639562 + txt003 +STRI + V0 1.05637 1.05637 0.112847 V1 1.28726 0.756047 0.112847 V2 1.23529 0.725523 0.0777778 + N0 0.543581 0.543581 -0.639562 N1 0.665182 0.385806 -0.639286 N2 0.283331 0.164332 -0.944838 + txt003 +STRI + V0 1.01372 1.01372 0.0777778 V1 0.725523 1.23529 0.0777778 V2 0.756047 1.28726 0.112847 + N0 0.231454 0.231454 -0.944912 N1 0.164332 0.283331 -0.944838 N2 0.385806 0.665182 -0.639286 + txt003 +STRI + V0 0.756047 1.28726 0.112847 V1 1.05637 1.05637 0.112847 V2 1.01372 1.01372 0.0777778 + N0 0.385806 0.665182 -0.639286 N1 0.543581 0.543581 -0.639562 N2 0.231454 0.231454 -0.944912 + txt003 +STRI + V0 0.725523 1.23529 0.0777778 V1 0.383385 1.37754 0.0777778 V2 0.399515 1.4355 0.112847 + N0 0.164332 0.283331 -0.944838 N1 0.085395 0.316788 -0.944644 N2 0.200299 0.743044 -0.638566 + txt003 +STRI + V0 0.399515 1.4355 0.112847 V1 0.756047 1.28726 0.112847 V2 0.725523 1.23529 0.0777778 + N0 0.200299 0.743044 -0.638566 N1 0.385806 0.665182 -0.639286 N2 0.164332 0.283331 -0.944838 + txt003 +STRI + V0 0.383385 1.37754 0.0777778 V1 -2.22045e-16 1.42778 0.0777778 V2 0 1.48785 0.112847 + N0 0.085395 0.316788 -0.944644 N1 6.08223e-17 0.328521 -0.944497 N2 1.36806e-16 0.770022 -0.638018 + txt003 +STRI + V0 0 1.48785 0.112847 V1 0.399515 1.4355 0.112847 V2 0.383385 1.37754 0.0777778 + N0 1.36806e-16 0.770022 -0.638018 N1 0.200299 0.743044 -0.638566 N2 0.085395 0.316788 -0.944644 + txt003 +STRI + V0 1.48785 0 0.112847 V1 1.4355 0.399515 0.112847 V2 1.44722 0.402778 0.15 + N0 0.770022 0 -0.638018 N1 0.743044 0.200299 -0.638566 N2 0.965535 0.260275 -2.07142e-16 + txt003 +STRI + V0 1.44722 0.402778 0.15 V1 1.5 0 0.15 V2 1.48785 0 0.112847 + N0 0.965535 0.260275 -2.07142e-16 N1 1 0 0 N2 0.770022 0 -0.638018 + txt003 +STRI + V0 1.4355 0.399515 0.112847 V1 1.28726 0.756047 0.112847 V2 1.29778 0.762222 0.15 + N0 0.743044 0.200299 -0.638566 N1 0.665182 0.385806 -0.639286 N2 0.865031 0.501718 -5.46348e-16 + txt003 +STRI + V0 1.29778 0.762222 0.15 V1 1.44722 0.402778 0.15 V2 1.4355 0.399515 0.112847 + N0 0.865031 0.501718 -5.46348e-16 N1 0.965535 0.260275 -2.07142e-16 N2 0.743044 0.200299 -0.638566 + txt003 +STRI + V0 1.28726 0.756047 0.112847 V1 1.05637 1.05637 0.112847 V2 1.065 1.065 0.15 + N0 0.665182 0.385806 -0.639286 N1 0.543581 0.543581 -0.639562 N2 0.707107 0.707107 -6.97819e-16 + txt003 +STRI + V0 1.065 1.065 0.15 V1 1.29778 0.762222 0.15 V2 1.28726 0.756047 0.112847 + N0 0.707107 0.707107 -6.97819e-16 N1 0.865031 0.501718 -5.46348e-16 N2 0.665182 0.385806 -0.639286 + txt003 +STRI + V0 1.05637 1.05637 0.112847 V1 0.756047 1.28726 0.112847 V2 0.762222 1.29778 0.15 + N0 0.543581 0.543581 -0.639562 N1 0.385806 0.665182 -0.639286 N2 0.501718 0.865031 -5.46348e-16 + txt003 +STRI + V0 0.762222 1.29778 0.15 V1 1.065 1.065 0.15 V2 1.05637 1.05637 0.112847 + N0 0.501718 0.865031 -5.46348e-16 N1 0.707107 0.707107 -6.97819e-16 N2 0.543581 0.543581 -0.639562 + txt003 +STRI + V0 0.756047 1.28726 0.112847 V1 0.399515 1.4355 0.112847 V2 0.402778 1.44722 0.15 + N0 0.385806 0.665182 -0.639286 N1 0.200299 0.743044 -0.638566 N2 0.260275 0.965535 -2.07142e-16 + txt003 +STRI + V0 0.402778 1.44722 0.15 V1 0.762222 1.29778 0.15 V2 0.756047 1.28726 0.112847 + N0 0.260275 0.965535 -2.07142e-16 N1 0.501718 0.865031 -5.46348e-16 N2 0.385806 0.665182 -0.639286 + txt003 +STRI + V0 0.399515 1.4355 0.112847 V1 0 1.48785 0.112847 V2 0 1.5 0.15 + N0 0.200299 0.743044 -0.638566 N1 1.36806e-16 0.770022 -0.638018 N2 0 1 -0 + txt003 +STRI + V0 0 1.5 0.15 V1 0.402778 1.44722 0.15 V2 0.399515 1.4355 0.112847 + N0 0 1 -0 N1 0.260275 0.965535 -2.07142e-16 N2 0.200299 0.743044 -0.638566 + txt003 +STRI + V0 -0.162696 0.584584 0.00590278 V1 0 0.605903 0.00590278 V2 0 0 0 + N0 -0.00589307 0.0218614 -0.999744 N1 0 0.0226746 -0.999743 N2 0 0 -1 + txt003 +STRI + V0 -0.307888 0.524218 0.00590278 V1 -0.162696 0.584584 0.00590278 V2 0 0 0 + N0 -0.0113382 0.0195486 -0.999745 N1 -0.00589307 0.0218614 -0.999744 N2 0 0 -1 + txt003 +STRI + V0 -0.430191 0.430191 0.00590278 V1 -0.307888 0.524218 0.00590278 V2 0 0 0 + N0 -0.015968 0.015968 -0.999745 N1 -0.0113382 0.0195486 -0.999745 N2 0 0 -1 + txt003 +STRI + V0 -0.524218 0.307888 0.00590278 V1 -0.430191 0.430191 0.00590278 V2 0 0 0 + N0 -0.0195486 0.0113382 -0.999745 N1 -0.015968 0.015968 -0.999745 N2 0 0 -1 + txt003 +STRI + V0 -0.584584 0.162696 0.00590278 V1 -0.524218 0.307888 0.00590278 V2 0 0 0 + N0 -0.0218614 0.00589307 -0.999744 N1 -0.0195486 0.0113382 -0.999745 N2 0 0 -1 + txt003 +STRI + V0 -0.605903 0 0.00590278 V1 -0.584584 0.162696 0.00590278 V2 0 0 0 + N0 -0.0226746 4.94615e-18 -0.999743 N1 -0.0218614 0.00589307 -0.999744 N2 0 0 -1 + txt003 +STRI + V0 0 0.605903 0.00590278 V1 -0.162696 0.584584 0.00590278 V2 -0.274486 0.986255 0.0222222 + N0 0 0.0226746 -0.999743 N1 -0.00589307 0.0218614 -0.999744 N2 -0.0162121 0.0601415 -0.998058 + txt003 +STRI + V0 -0.274486 0.986255 0.0222222 V1 0 1.02222 0.0222222 V2 0 0.605903 0.00590278 + N0 -0.0162121 0.0601415 -0.998058 N1 0 0.0623783 -0.998053 N2 0 0.0226746 -0.999743 + txt003 +STRI + V0 -0.162696 0.584584 0.00590278 V1 -0.307888 0.524218 0.00590278 V2 -0.51944 0.884412 0.0222222 + N0 -0.00589307 0.0218614 -0.999744 N1 -0.0113382 0.0195486 -0.999745 N2 -0.0311919 0.0537792 -0.998066 + txt003 +STRI + V0 -0.51944 0.884412 0.0222222 V1 -0.274486 0.986255 0.0222222 V2 -0.162696 0.584584 0.00590278 + N0 -0.0311919 0.0537792 -0.998066 N1 -0.0162121 0.0601415 -0.998058 N2 -0.00589307 0.0218614 -0.999744 + txt003 +STRI + V0 -0.307888 0.524218 0.00590278 V1 -0.430191 0.430191 0.00590278 V2 -0.725778 0.725778 0.0222222 + N0 -0.0113382 0.0195486 -0.999745 N1 -0.015968 0.015968 -0.999745 N2 -0.0439291 0.0439291 -0.998068 + txt003 +STRI + V0 -0.725778 0.725778 0.0222222 V1 -0.51944 0.884412 0.0222222 V2 -0.307888 0.524218 0.00590278 + N0 -0.0439291 0.0439291 -0.998068 N1 -0.0311919 0.0537792 -0.998066 N2 -0.0113382 0.0195486 -0.999745 + txt003 +STRI + V0 -0.430191 0.430191 0.00590278 V1 -0.524218 0.307888 0.00590278 V2 -0.884412 0.51944 0.0222222 + N0 -0.015968 0.015968 -0.999745 N1 -0.0195486 0.0113382 -0.999745 N2 -0.0537792 0.0311919 -0.998066 + txt003 +STRI + V0 -0.884412 0.51944 0.0222222 V1 -0.725778 0.725778 0.0222222 V2 -0.430191 0.430191 0.00590278 + N0 -0.0537792 0.0311919 -0.998066 N1 -0.0439291 0.0439291 -0.998068 N2 -0.015968 0.015968 -0.999745 + txt003 +STRI + V0 -0.524218 0.307888 0.00590278 V1 -0.584584 0.162696 0.00590278 V2 -0.986255 0.274486 0.0222222 + N0 -0.0195486 0.0113382 -0.999745 N1 -0.0218614 0.00589307 -0.999744 N2 -0.0601415 0.0162121 -0.998058 + txt003 +STRI + V0 -0.986255 0.274486 0.0222222 V1 -0.884412 0.51944 0.0222222 V2 -0.524218 0.307888 0.00590278 + N0 -0.0601415 0.0162121 -0.998058 N1 -0.0537792 0.0311919 -0.998066 N2 -0.0195486 0.0113382 -0.999745 + txt003 +STRI + V0 -0.584584 0.162696 0.00590278 V1 -0.605903 0 0.00590278 V2 -1.02222 -2.22045e-16 0.0222222 + N0 -0.0218614 0.00589307 -0.999744 N1 -0.0226746 4.94615e-18 -0.999743 N2 -0.0623783 -0 -0.998053 + txt003 +STRI + V0 -1.02222 -2.22045e-16 0.0222222 V1 -0.986255 0.274486 0.0222222 V2 -0.584584 0.162696 0.00590278 + N0 -0.0623783 -0 -0.998053 N1 -0.0601415 0.0162121 -0.998058 N2 -0.0218614 0.00589307 -0.999744 + txt003 +STRI + V0 0 1.02222 0.0222222 V1 -0.274486 0.986255 0.0222222 V2 -0.344878 1.23918 0.046875 + N0 0 0.0623783 -0.998053 N1 -0.0162121 0.0601415 -0.998058 N2 -0.0367561 0.136353 -0.989978 + txt003 +STRI + V0 -0.344878 1.23918 0.046875 V1 0 1.28438 0.046875 V2 0 1.02222 0.0222222 + N0 -0.0367561 0.136353 -0.989978 N1 0 0.141421 -0.989949 N2 0 0.0623783 -0.998053 + txt003 +STRI + V0 -0.274486 0.986255 0.0222222 V1 -0.51944 0.884412 0.0222222 V2 -0.652653 1.11122 0.046875 + N0 -0.0162121 0.0601415 -0.998058 N1 -0.0311919 0.0537792 -0.998066 N2 -0.0707208 0.121932 -0.990016 + txt003 +STRI + V0 -0.652653 1.11122 0.046875 V1 -0.344878 1.23918 0.046875 V2 -0.274486 0.986255 0.0222222 + N0 -0.0707208 0.121932 -0.990016 N1 -0.0367561 0.136353 -0.989978 N2 -0.0162121 0.0601415 -0.998058 + txt003 +STRI + V0 -0.51944 0.884412 0.0222222 V1 -0.725778 0.725778 0.0222222 V2 -0.911906 0.911906 0.046875 + N0 -0.0311919 0.0537792 -0.998066 N1 -0.0439291 0.0439291 -0.998068 N2 -0.0996006 0.0996006 -0.99003 + txt003 +STRI + V0 -0.911906 0.911906 0.046875 V1 -0.652653 1.11122 0.046875 V2 -0.51944 0.884412 0.0222222 + N0 -0.0996006 0.0996006 -0.99003 N1 -0.0707208 0.121932 -0.990016 N2 -0.0311919 0.0537792 -0.998066 + txt003 +STRI + V0 -0.725778 0.725778 0.0222222 V1 -0.884412 0.51944 0.0222222 V2 -1.11122 0.652653 0.046875 + N0 -0.0439291 0.0439291 -0.998068 N1 -0.0537792 0.0311919 -0.998066 N2 -0.121932 0.0707208 -0.990016 + txt003 +STRI + V0 -1.11122 0.652653 0.046875 V1 -0.911906 0.911906 0.046875 V2 -0.725778 0.725778 0.0222222 + N0 -0.121932 0.0707208 -0.990016 N1 -0.0996006 0.0996006 -0.99003 N2 -0.0439291 0.0439291 -0.998068 + txt003 +STRI + V0 -0.884412 0.51944 0.0222222 V1 -0.986255 0.274486 0.0222222 V2 -1.23918 0.344878 0.046875 + N0 -0.0537792 0.0311919 -0.998066 N1 -0.0601415 0.0162121 -0.998058 N2 -0.136353 0.0367561 -0.989978 + txt003 +STRI + V0 -1.23918 0.344878 0.046875 V1 -1.11122 0.652653 0.046875 V2 -0.884412 0.51944 0.0222222 + N0 -0.136353 0.0367561 -0.989978 N1 -0.121932 0.0707208 -0.990016 N2 -0.0537792 0.0311919 -0.998066 + txt003 +STRI + V0 -0.986255 0.274486 0.0222222 V1 -1.02222 -2.22045e-16 0.0222222 V2 -1.28437 2.22045e-16 0.046875 + N0 -0.0601415 0.0162121 -0.998058 N1 -0.0623783 -0 -0.998053 N2 -0.141421 -0 -0.989949 + txt003 +STRI + V0 -1.28437 2.22045e-16 0.046875 V1 -1.23918 0.344878 0.046875 V2 -0.986255 0.274486 0.0222222 + N0 -0.141421 -0 -0.989949 N1 -0.136353 0.0367561 -0.989978 N2 -0.0601415 0.0162121 -0.998058 + txt003 +STRI + V0 0 1.28438 0.046875 V1 -0.344878 1.23918 0.046875 V2 -0.383385 1.37754 0.0777778 + N0 0 0.141421 -0.989949 N1 -0.0367561 0.136353 -0.989978 N2 -0.085395 0.316788 -0.944644 + txt003 +STRI + V0 -0.383385 1.37754 0.0777778 V1 0 1.42778 0.0777778 V2 0 1.28438 0.046875 + N0 -0.085395 0.316788 -0.944644 N1 0 0.328521 -0.944497 N2 0 0.141421 -0.989949 + txt003 +STRI + V0 -0.344878 1.23918 0.046875 V1 -0.652653 1.11122 0.046875 V2 -0.725523 1.23529 0.0777778 + N0 -0.0367561 0.136353 -0.989978 N1 -0.0707208 0.121932 -0.990016 N2 -0.164332 0.283331 -0.944838 + txt003 +STRI + V0 -0.725523 1.23529 0.0777778 V1 -0.383385 1.37754 0.0777778 V2 -0.344878 1.23918 0.046875 + N0 -0.164332 0.283331 -0.944838 N1 -0.085395 0.316788 -0.944644 N2 -0.0367561 0.136353 -0.989978 + txt003 +STRI + V0 -0.652653 1.11122 0.046875 V1 -0.911906 0.911906 0.046875 V2 -1.01372 1.01372 0.0777778 + N0 -0.0707208 0.121932 -0.990016 N1 -0.0996006 0.0996006 -0.99003 N2 -0.231454 0.231454 -0.944912 + txt003 +STRI + V0 -1.01372 1.01372 0.0777778 V1 -0.725523 1.23529 0.0777778 V2 -0.652653 1.11122 0.046875 + N0 -0.231454 0.231454 -0.944912 N1 -0.164332 0.283331 -0.944838 N2 -0.0707208 0.121932 -0.990016 + txt003 +STRI + V0 -0.911906 0.911906 0.046875 V1 -1.11122 0.652653 0.046875 V2 -1.23529 0.725523 0.0777778 + N0 -0.0996006 0.0996006 -0.99003 N1 -0.121932 0.0707208 -0.990016 N2 -0.283331 0.164332 -0.944838 + txt003 +STRI + V0 -1.23529 0.725523 0.0777778 V1 -1.01372 1.01372 0.0777778 V2 -0.911906 0.911906 0.046875 + N0 -0.283331 0.164332 -0.944838 N1 -0.231454 0.231454 -0.944912 N2 -0.0996006 0.0996006 -0.99003 + txt003 +STRI + V0 -1.11122 0.652653 0.046875 V1 -1.23918 0.344878 0.046875 V2 -1.37754 0.383385 0.0777778 + N0 -0.121932 0.0707208 -0.990016 N1 -0.136353 0.0367561 -0.989978 N2 -0.316788 0.085395 -0.944644 + txt003 +STRI + V0 -1.37754 0.383385 0.0777778 V1 -1.23529 0.725523 0.0777778 V2 -1.11122 0.652653 0.046875 + N0 -0.316788 0.085395 -0.944644 N1 -0.283331 0.164332 -0.944838 N2 -0.121932 0.0707208 -0.990016 + txt003 +STRI + V0 -1.23918 0.344878 0.046875 V1 -1.28437 2.22045e-16 0.046875 V2 -1.42778 -2.22045e-16 0.0777778 + N0 -0.136353 0.0367561 -0.989978 N1 -0.141421 -0 -0.989949 N2 -0.328521 6.08223e-17 -0.944497 + txt003 +STRI + V0 -1.42778 -2.22045e-16 0.0777778 V1 -1.37754 0.383385 0.0777778 V2 -1.23918 0.344878 0.046875 + N0 -0.328521 6.08223e-17 -0.944497 N1 -0.316788 0.085395 -0.944644 N2 -0.136353 0.0367561 -0.989978 + txt003 +STRI + V0 0 1.42778 0.0777778 V1 -0.383385 1.37754 0.0777778 V2 -0.399515 1.4355 0.112847 + N0 0 0.328521 -0.944497 N1 -0.085395 0.316788 -0.944644 N2 -0.200299 0.743044 -0.638566 + txt003 +STRI + V0 -0.399515 1.4355 0.112847 V1 0 1.48785 0.112847 V2 0 1.42778 0.0777778 + N0 -0.200299 0.743044 -0.638566 N1 0 0.770022 -0.638018 N2 0 0.328521 -0.944497 + txt003 +STRI + V0 -0.383385 1.37754 0.0777778 V1 -0.725523 1.23529 0.0777778 V2 -0.756047 1.28726 0.112847 + N0 -0.085395 0.316788 -0.944644 N1 -0.164332 0.283331 -0.944838 N2 -0.385806 0.665182 -0.639286 + txt003 +STRI + V0 -0.756047 1.28726 0.112847 V1 -0.399515 1.4355 0.112847 V2 -0.383385 1.37754 0.0777778 + N0 -0.385806 0.665182 -0.639286 N1 -0.200299 0.743044 -0.638566 N2 -0.085395 0.316788 -0.944644 + txt003 +STRI + V0 -0.725523 1.23529 0.0777778 V1 -1.01372 1.01372 0.0777778 V2 -1.05637 1.05637 0.112847 + N0 -0.164332 0.283331 -0.944838 N1 -0.231454 0.231454 -0.944912 N2 -0.543581 0.543581 -0.639562 + txt003 +STRI + V0 -1.05637 1.05637 0.112847 V1 -0.756047 1.28726 0.112847 V2 -0.725523 1.23529 0.0777778 + N0 -0.543581 0.543581 -0.639562 N1 -0.385806 0.665182 -0.639286 N2 -0.164332 0.283331 -0.944838 + txt003 +STRI + V0 -1.01372 1.01372 0.0777778 V1 -1.23529 0.725523 0.0777778 V2 -1.28726 0.756047 0.112847 + N0 -0.231454 0.231454 -0.944912 N1 -0.283331 0.164332 -0.944838 N2 -0.665182 0.385806 -0.639286 + txt003 +STRI + V0 -1.28726 0.756047 0.112847 V1 -1.05637 1.05637 0.112847 V2 -1.01372 1.01372 0.0777778 + N0 -0.665182 0.385806 -0.639286 N1 -0.543581 0.543581 -0.639562 N2 -0.231454 0.231454 -0.944912 + txt003 +STRI + V0 -1.23529 0.725523 0.0777778 V1 -1.37754 0.383385 0.0777778 V2 -1.4355 0.399515 0.112847 + N0 -0.283331 0.164332 -0.944838 N1 -0.316788 0.085395 -0.944644 N2 -0.743044 0.200299 -0.638566 + txt003 +STRI + V0 -1.4355 0.399515 0.112847 V1 -1.28726 0.756047 0.112847 V2 -1.23529 0.725523 0.0777778 + N0 -0.743044 0.200299 -0.638566 N1 -0.665182 0.385806 -0.639286 N2 -0.283331 0.164332 -0.944838 + txt003 +STRI + V0 -1.37754 0.383385 0.0777778 V1 -1.42778 -2.22045e-16 0.0777778 V2 -1.48785 0 0.112847 + N0 -0.316788 0.085395 -0.944644 N1 -0.328521 6.08223e-17 -0.944497 N2 -0.770022 1.36806e-16 -0.638018 + txt003 +STRI + V0 -1.48785 0 0.112847 V1 -1.4355 0.399515 0.112847 V2 -1.37754 0.383385 0.0777778 + N0 -0.770022 1.36806e-16 -0.638018 N1 -0.743044 0.200299 -0.638566 N2 -0.316788 0.085395 -0.944644 + txt003 +STRI + V0 0 1.48785 0.112847 V1 -0.399515 1.4355 0.112847 V2 -0.402778 1.44722 0.15 + N0 0 0.770022 -0.638018 N1 -0.200299 0.743044 -0.638566 N2 -0.260275 0.965535 -2.07142e-16 + txt003 +STRI + V0 -0.402778 1.44722 0.15 V1 0 1.5 0.15 V2 0 1.48785 0.112847 + N0 -0.260275 0.965535 -2.07142e-16 N1 0 1 -0 N2 0 0.770022 -0.638018 + txt003 +STRI + V0 -0.399515 1.4355 0.112847 V1 -0.756047 1.28726 0.112847 V2 -0.762222 1.29778 0.15 + N0 -0.200299 0.743044 -0.638566 N1 -0.385806 0.665182 -0.639286 N2 -0.501718 0.865031 -5.46348e-16 + txt003 +STRI + V0 -0.762222 1.29778 0.15 V1 -0.402778 1.44722 0.15 V2 -0.399515 1.4355 0.112847 + N0 -0.501718 0.865031 -5.46348e-16 N1 -0.260275 0.965535 -2.07142e-16 N2 -0.200299 0.743044 -0.638566 + txt003 +STRI + V0 -0.756047 1.28726 0.112847 V1 -1.05637 1.05637 0.112847 V2 -1.065 1.065 0.15 + N0 -0.385806 0.665182 -0.639286 N1 -0.543581 0.543581 -0.639562 N2 -0.707107 0.707107 -6.97819e-16 + txt003 +STRI + V0 -1.065 1.065 0.15 V1 -0.762222 1.29778 0.15 V2 -0.756047 1.28726 0.112847 + N0 -0.707107 0.707107 -6.97819e-16 N1 -0.501718 0.865031 -5.46348e-16 N2 -0.385806 0.665182 -0.639286 + txt003 +STRI + V0 -1.05637 1.05637 0.112847 V1 -1.28726 0.756047 0.112847 V2 -1.29778 0.762222 0.15 + N0 -0.543581 0.543581 -0.639562 N1 -0.665182 0.385806 -0.639286 N2 -0.865031 0.501718 -5.46348e-16 + txt003 +STRI + V0 -1.29778 0.762222 0.15 V1 -1.065 1.065 0.15 V2 -1.05637 1.05637 0.112847 + N0 -0.865031 0.501718 -5.46348e-16 N1 -0.707107 0.707107 -6.97819e-16 N2 -0.543581 0.543581 -0.639562 + txt003 +STRI + V0 -1.28726 0.756047 0.112847 V1 -1.4355 0.399515 0.112847 V2 -1.44722 0.402778 0.15 + N0 -0.665182 0.385806 -0.639286 N1 -0.743044 0.200299 -0.638566 N2 -0.965535 0.260275 -2.07142e-16 + txt003 +STRI + V0 -1.44722 0.402778 0.15 V1 -1.29778 0.762222 0.15 V2 -1.28726 0.756047 0.112847 + N0 -0.965535 0.260275 -2.07142e-16 N1 -0.865031 0.501718 -5.46348e-16 N2 -0.665182 0.385806 -0.639286 + txt003 +STRI + V0 -1.4355 0.399515 0.112847 V1 -1.48785 0 0.112847 V2 -1.5 0 0.15 + N0 -0.743044 0.200299 -0.638566 N1 -0.770022 1.36806e-16 -0.638018 N2 -1 0 0 + txt003 +STRI + V0 -1.5 0 0.15 V1 -1.44722 0.402778 0.15 V2 -1.4355 0.399515 0.112847 + N0 -1 0 0 N1 -0.965535 0.260275 -2.07142e-16 N2 -0.743044 0.200299 -0.638566 + txt003 +STRI + V0 -0.584584 -0.162696 0.00590278 V1 -0.605903 0 0.00590278 V2 0 0 0 + N0 -0.0218614 -0.00589307 -0.999744 N1 -0.0226746 -0 -0.999743 N2 0 0 -1 + txt003 +STRI + V0 -0.524218 -0.307888 0.00590278 V1 -0.584584 -0.162696 0.00590278 V2 0 0 0 + N0 -0.0195486 -0.0113382 -0.999745 N1 -0.0218614 -0.00589307 -0.999744 N2 0 0 -1 + txt003 +STRI + V0 -0.430191 -0.430191 0.00590278 V1 -0.524218 -0.307888 0.00590278 V2 0 0 0 + N0 -0.015968 -0.015968 -0.999745 N1 -0.0195486 -0.0113382 -0.999745 N2 0 0 -1 + txt003 +STRI + V0 -0.307888 -0.524218 0.00590278 V1 -0.430191 -0.430191 0.00590278 V2 0 0 0 + N0 -0.0113382 -0.0195486 -0.999745 N1 -0.015968 -0.015968 -0.999745 N2 0 0 -1 + txt003 +STRI + V0 -0.162696 -0.584584 0.00590278 V1 -0.307888 -0.524218 0.00590278 V2 0 0 0 + N0 -0.00589307 -0.0218614 -0.999744 N1 -0.0113382 -0.0195486 -0.999745 N2 0 0 -1 + txt003 +STRI + V0 0 -0.605903 0.00590278 V1 -0.162696 -0.584584 0.00590278 V2 0 0 0 + N0 -4.94615e-18 -0.0226746 -0.999743 N1 -0.00589307 -0.0218614 -0.999744 N2 0 0 -1 + txt003 +STRI + V0 -0.605903 0 0.00590278 V1 -0.584584 -0.162696 0.00590278 V2 -0.986255 -0.274486 0.0222222 + N0 -0.0226746 -0 -0.999743 N1 -0.0218614 -0.00589307 -0.999744 N2 -0.0601415 -0.0162121 -0.998058 + txt003 +STRI + V0 -0.986255 -0.274486 0.0222222 V1 -1.02222 0 0.0222222 V2 -0.605903 0 0.00590278 + N0 -0.0601415 -0.0162121 -0.998058 N1 -0.0623783 -0 -0.998053 N2 -0.0226746 -0 -0.999743 + txt003 +STRI + V0 -0.584584 -0.162696 0.00590278 V1 -0.524218 -0.307888 0.00590278 V2 -0.884412 -0.51944 0.0222222 + N0 -0.0218614 -0.00589307 -0.999744 N1 -0.0195486 -0.0113382 -0.999745 N2 -0.0537792 -0.0311919 -0.998066 + txt003 +STRI + V0 -0.884412 -0.51944 0.0222222 V1 -0.986255 -0.274486 0.0222222 V2 -0.584584 -0.162696 0.00590278 + N0 -0.0537792 -0.0311919 -0.998066 N1 -0.0601415 -0.0162121 -0.998058 N2 -0.0218614 -0.00589307 -0.999744 + txt003 +STRI + V0 -0.524218 -0.307888 0.00590278 V1 -0.430191 -0.430191 0.00590278 V2 -0.725778 -0.725778 0.0222222 + N0 -0.0195486 -0.0113382 -0.999745 N1 -0.015968 -0.015968 -0.999745 N2 -0.0439291 -0.0439291 -0.998068 + txt003 +STRI + V0 -0.725778 -0.725778 0.0222222 V1 -0.884412 -0.51944 0.0222222 V2 -0.524218 -0.307888 0.00590278 + N0 -0.0439291 -0.0439291 -0.998068 N1 -0.0537792 -0.0311919 -0.998066 N2 -0.0195486 -0.0113382 -0.999745 + txt003 +STRI + V0 -0.430191 -0.430191 0.00590278 V1 -0.307888 -0.524218 0.00590278 V2 -0.51944 -0.884412 0.0222222 + N0 -0.015968 -0.015968 -0.999745 N1 -0.0113382 -0.0195486 -0.999745 N2 -0.0311919 -0.0537792 -0.998066 + txt003 +STRI + V0 -0.51944 -0.884412 0.0222222 V1 -0.725778 -0.725778 0.0222222 V2 -0.430191 -0.430191 0.00590278 + N0 -0.0311919 -0.0537792 -0.998066 N1 -0.0439291 -0.0439291 -0.998068 N2 -0.015968 -0.015968 -0.999745 + txt003 +STRI + V0 -0.307888 -0.524218 0.00590278 V1 -0.162696 -0.584584 0.00590278 V2 -0.274486 -0.986255 0.0222222 + N0 -0.0113382 -0.0195486 -0.999745 N1 -0.00589307 -0.0218614 -0.999744 N2 -0.0162121 -0.0601415 -0.998058 + txt003 +STRI + V0 -0.274486 -0.986255 0.0222222 V1 -0.51944 -0.884412 0.0222222 V2 -0.307888 -0.524218 0.00590278 + N0 -0.0162121 -0.0601415 -0.998058 N1 -0.0311919 -0.0537792 -0.998066 N2 -0.0113382 -0.0195486 -0.999745 + txt003 +STRI + V0 -0.162696 -0.584584 0.00590278 V1 0 -0.605903 0.00590278 V2 2.22045e-16 -1.02222 0.0222222 + N0 -0.00589307 -0.0218614 -0.999744 N1 -4.94615e-18 -0.0226746 -0.999743 N2 0 -0.0623783 -0.998053 + txt003 +STRI + V0 2.22045e-16 -1.02222 0.0222222 V1 -0.274486 -0.986255 0.0222222 V2 -0.162696 -0.584584 0.00590278 + N0 0 -0.0623783 -0.998053 N1 -0.0162121 -0.0601415 -0.998058 N2 -0.00589307 -0.0218614 -0.999744 + txt003 +STRI + V0 -1.02222 0 0.0222222 V1 -0.986255 -0.274486 0.0222222 V2 -1.23918 -0.344878 0.046875 + N0 -0.0623783 -0 -0.998053 N1 -0.0601415 -0.0162121 -0.998058 N2 -0.136353 -0.0367561 -0.989978 + txt003 +STRI + V0 -1.23918 -0.344878 0.046875 V1 -1.28438 0 0.046875 V2 -1.02222 0 0.0222222 + N0 -0.136353 -0.0367561 -0.989978 N1 -0.141421 -0 -0.989949 N2 -0.0623783 -0 -0.998053 + txt003 +STRI + V0 -0.986255 -0.274486 0.0222222 V1 -0.884412 -0.51944 0.0222222 V2 -1.11122 -0.652653 0.046875 + N0 -0.0601415 -0.0162121 -0.998058 N1 -0.0537792 -0.0311919 -0.998066 N2 -0.121932 -0.0707208 -0.990016 + txt003 +STRI + V0 -1.11122 -0.652653 0.046875 V1 -1.23918 -0.344878 0.046875 V2 -0.986255 -0.274486 0.0222222 + N0 -0.121932 -0.0707208 -0.990016 N1 -0.136353 -0.0367561 -0.989978 N2 -0.0601415 -0.0162121 -0.998058 + txt003 +STRI + V0 -0.884412 -0.51944 0.0222222 V1 -0.725778 -0.725778 0.0222222 V2 -0.911906 -0.911906 0.046875 + N0 -0.0537792 -0.0311919 -0.998066 N1 -0.0439291 -0.0439291 -0.998068 N2 -0.0996006 -0.0996006 -0.99003 + txt003 +STRI + V0 -0.911906 -0.911906 0.046875 V1 -1.11122 -0.652653 0.046875 V2 -0.884412 -0.51944 0.0222222 + N0 -0.0996006 -0.0996006 -0.99003 N1 -0.121932 -0.0707208 -0.990016 N2 -0.0537792 -0.0311919 -0.998066 + txt003 +STRI + V0 -0.725778 -0.725778 0.0222222 V1 -0.51944 -0.884412 0.0222222 V2 -0.652653 -1.11122 0.046875 + N0 -0.0439291 -0.0439291 -0.998068 N1 -0.0311919 -0.0537792 -0.998066 N2 -0.0707208 -0.121932 -0.990016 + txt003 +STRI + V0 -0.652653 -1.11122 0.046875 V1 -0.911906 -0.911906 0.046875 V2 -0.725778 -0.725778 0.0222222 + N0 -0.0707208 -0.121932 -0.990016 N1 -0.0996006 -0.0996006 -0.99003 N2 -0.0439291 -0.0439291 -0.998068 + txt003 +STRI + V0 -0.51944 -0.884412 0.0222222 V1 -0.274486 -0.986255 0.0222222 V2 -0.344878 -1.23918 0.046875 + N0 -0.0311919 -0.0537792 -0.998066 N1 -0.0162121 -0.0601415 -0.998058 N2 -0.0367561 -0.136353 -0.989978 + txt003 +STRI + V0 -0.344878 -1.23918 0.046875 V1 -0.652653 -1.11122 0.046875 V2 -0.51944 -0.884412 0.0222222 + N0 -0.0367561 -0.136353 -0.989978 N1 -0.0707208 -0.121932 -0.990016 N2 -0.0311919 -0.0537792 -0.998066 + txt003 +STRI + V0 -0.274486 -0.986255 0.0222222 V1 2.22045e-16 -1.02222 0.0222222 V2 -2.22045e-16 -1.28437 0.046875 + N0 -0.0162121 -0.0601415 -0.998058 N1 0 -0.0623783 -0.998053 N2 0 -0.141421 -0.989949 + txt003 +STRI + V0 -2.22045e-16 -1.28437 0.046875 V1 -0.344878 -1.23918 0.046875 V2 -0.274486 -0.986255 0.0222222 + N0 0 -0.141421 -0.989949 N1 -0.0367561 -0.136353 -0.989978 N2 -0.0162121 -0.0601415 -0.998058 + txt003 +STRI + V0 -1.28438 0 0.046875 V1 -1.23918 -0.344878 0.046875 V2 -1.37754 -0.383385 0.0777778 + N0 -0.141421 -0 -0.989949 N1 -0.136353 -0.0367561 -0.989978 N2 -0.316788 -0.085395 -0.944644 + txt003 +STRI + V0 -1.37754 -0.383385 0.0777778 V1 -1.42778 0 0.0777778 V2 -1.28438 0 0.046875 + N0 -0.316788 -0.085395 -0.944644 N1 -0.328521 -0 -0.944497 N2 -0.141421 -0 -0.989949 + txt003 +STRI + V0 -1.23918 -0.344878 0.046875 V1 -1.11122 -0.652653 0.046875 V2 -1.23529 -0.725523 0.0777778 + N0 -0.136353 -0.0367561 -0.989978 N1 -0.121932 -0.0707208 -0.990016 N2 -0.283331 -0.164332 -0.944838 + txt003 +STRI + V0 -1.23529 -0.725523 0.0777778 V1 -1.37754 -0.383385 0.0777778 V2 -1.23918 -0.344878 0.046875 + N0 -0.283331 -0.164332 -0.944838 N1 -0.316788 -0.085395 -0.944644 N2 -0.136353 -0.0367561 -0.989978 + txt003 +STRI + V0 -1.11122 -0.652653 0.046875 V1 -0.911906 -0.911906 0.046875 V2 -1.01372 -1.01372 0.0777778 + N0 -0.121932 -0.0707208 -0.990016 N1 -0.0996006 -0.0996006 -0.99003 N2 -0.231454 -0.231454 -0.944912 + txt003 +STRI + V0 -1.01372 -1.01372 0.0777778 V1 -1.23529 -0.725523 0.0777778 V2 -1.11122 -0.652653 0.046875 + N0 -0.231454 -0.231454 -0.944912 N1 -0.283331 -0.164332 -0.944838 N2 -0.121932 -0.0707208 -0.990016 + txt003 +STRI + V0 -0.911906 -0.911906 0.046875 V1 -0.652653 -1.11122 0.046875 V2 -0.725523 -1.23529 0.0777778 + N0 -0.0996006 -0.0996006 -0.99003 N1 -0.0707208 -0.121932 -0.990016 N2 -0.164332 -0.283331 -0.944838 + txt003 +STRI + V0 -0.725523 -1.23529 0.0777778 V1 -1.01372 -1.01372 0.0777778 V2 -0.911906 -0.911906 0.046875 + N0 -0.164332 -0.283331 -0.944838 N1 -0.231454 -0.231454 -0.944912 N2 -0.0996006 -0.0996006 -0.99003 + txt003 +STRI + V0 -0.652653 -1.11122 0.046875 V1 -0.344878 -1.23918 0.046875 V2 -0.383385 -1.37754 0.0777778 + N0 -0.0707208 -0.121932 -0.990016 N1 -0.0367561 -0.136353 -0.989978 N2 -0.085395 -0.316788 -0.944644 + txt003 +STRI + V0 -0.383385 -1.37754 0.0777778 V1 -0.725523 -1.23529 0.0777778 V2 -0.652653 -1.11122 0.046875 + N0 -0.085395 -0.316788 -0.944644 N1 -0.164332 -0.283331 -0.944838 N2 -0.0707208 -0.121932 -0.990016 + txt003 +STRI + V0 -0.344878 -1.23918 0.046875 V1 -2.22045e-16 -1.28437 0.046875 V2 2.22045e-16 -1.42778 0.0777778 + N0 -0.0367561 -0.136353 -0.989978 N1 0 -0.141421 -0.989949 N2 -6.08223e-17 -0.328521 -0.944497 + txt003 +STRI + V0 2.22045e-16 -1.42778 0.0777778 V1 -0.383385 -1.37754 0.0777778 V2 -0.344878 -1.23918 0.046875 + N0 -6.08223e-17 -0.328521 -0.944497 N1 -0.085395 -0.316788 -0.944644 N2 -0.0367561 -0.136353 -0.989978 + txt003 +STRI + V0 -1.42778 0 0.0777778 V1 -1.37754 -0.383385 0.0777778 V2 -1.4355 -0.399515 0.112847 + N0 -0.328521 -0 -0.944497 N1 -0.316788 -0.085395 -0.944644 N2 -0.743044 -0.200299 -0.638566 + txt003 +STRI + V0 -1.4355 -0.399515 0.112847 V1 -1.48785 0 0.112847 V2 -1.42778 0 0.0777778 + N0 -0.743044 -0.200299 -0.638566 N1 -0.770022 -0 -0.638018 N2 -0.328521 -0 -0.944497 + txt003 +STRI + V0 -1.37754 -0.383385 0.0777778 V1 -1.23529 -0.725523 0.0777778 V2 -1.28726 -0.756047 0.112847 + N0 -0.316788 -0.085395 -0.944644 N1 -0.283331 -0.164332 -0.944838 N2 -0.665182 -0.385806 -0.639286 + txt003 +STRI + V0 -1.28726 -0.756047 0.112847 V1 -1.4355 -0.399515 0.112847 V2 -1.37754 -0.383385 0.0777778 + N0 -0.665182 -0.385806 -0.639286 N1 -0.743044 -0.200299 -0.638566 N2 -0.316788 -0.085395 -0.944644 + txt003 +STRI + V0 -1.23529 -0.725523 0.0777778 V1 -1.01372 -1.01372 0.0777778 V2 -1.05637 -1.05637 0.112847 + N0 -0.283331 -0.164332 -0.944838 N1 -0.231454 -0.231454 -0.944912 N2 -0.543581 -0.543581 -0.639562 + txt003 +STRI + V0 -1.05637 -1.05637 0.112847 V1 -1.28726 -0.756047 0.112847 V2 -1.23529 -0.725523 0.0777778 + N0 -0.543581 -0.543581 -0.639562 N1 -0.665182 -0.385806 -0.639286 N2 -0.283331 -0.164332 -0.944838 + txt003 +STRI + V0 -1.01372 -1.01372 0.0777778 V1 -0.725523 -1.23529 0.0777778 V2 -0.756047 -1.28726 0.112847 + N0 -0.231454 -0.231454 -0.944912 N1 -0.164332 -0.283331 -0.944838 N2 -0.385806 -0.665182 -0.639286 + txt003 +STRI + V0 -0.756047 -1.28726 0.112847 V1 -1.05637 -1.05637 0.112847 V2 -1.01372 -1.01372 0.0777778 + N0 -0.385806 -0.665182 -0.639286 N1 -0.543581 -0.543581 -0.639562 N2 -0.231454 -0.231454 -0.944912 + txt003 +STRI + V0 -0.725523 -1.23529 0.0777778 V1 -0.383385 -1.37754 0.0777778 V2 -0.399515 -1.4355 0.112847 + N0 -0.164332 -0.283331 -0.944838 N1 -0.085395 -0.316788 -0.944644 N2 -0.200299 -0.743044 -0.638566 + txt003 +STRI + V0 -0.399515 -1.4355 0.112847 V1 -0.756047 -1.28726 0.112847 V2 -0.725523 -1.23529 0.0777778 + N0 -0.200299 -0.743044 -0.638566 N1 -0.385806 -0.665182 -0.639286 N2 -0.164332 -0.283331 -0.944838 + txt003 +STRI + V0 -0.383385 -1.37754 0.0777778 V1 2.22045e-16 -1.42778 0.0777778 V2 0 -1.48785 0.112847 + N0 -0.085395 -0.316788 -0.944644 N1 -6.08223e-17 -0.328521 -0.944497 N2 -1.36806e-16 -0.770022 -0.638018 + txt003 +STRI + V0 0 -1.48785 0.112847 V1 -0.399515 -1.4355 0.112847 V2 -0.383385 -1.37754 0.0777778 + N0 -1.36806e-16 -0.770022 -0.638018 N1 -0.200299 -0.743044 -0.638566 N2 -0.085395 -0.316788 -0.944644 + txt003 +STRI + V0 -1.48785 0 0.112847 V1 -1.4355 -0.399515 0.112847 V2 -1.44722 -0.402778 0.15 + N0 -0.770022 -0 -0.638018 N1 -0.743044 -0.200299 -0.638566 N2 -0.965535 -0.260275 -2.07142e-16 + txt003 +STRI + V0 -1.44722 -0.402778 0.15 V1 -1.5 0 0.15 V2 -1.48785 0 0.112847 + N0 -0.965535 -0.260275 -2.07142e-16 N1 -1 0 0 N2 -0.770022 -0 -0.638018 + txt003 +STRI + V0 -1.4355 -0.399515 0.112847 V1 -1.28726 -0.756047 0.112847 V2 -1.29778 -0.762222 0.15 + N0 -0.743044 -0.200299 -0.638566 N1 -0.665182 -0.385806 -0.639286 N2 -0.865031 -0.501718 -5.46348e-16 + txt003 +STRI + V0 -1.29778 -0.762222 0.15 V1 -1.44722 -0.402778 0.15 V2 -1.4355 -0.399515 0.112847 + N0 -0.865031 -0.501718 -5.46348e-16 N1 -0.965535 -0.260275 -2.07142e-16 N2 -0.743044 -0.200299 -0.638566 + txt003 +STRI + V0 -1.28726 -0.756047 0.112847 V1 -1.05637 -1.05637 0.112847 V2 -1.065 -1.065 0.15 + N0 -0.665182 -0.385806 -0.639286 N1 -0.543581 -0.543581 -0.639562 N2 -0.707107 -0.707107 -6.97819e-16 + txt003 +STRI + V0 -1.065 -1.065 0.15 V1 -1.29778 -0.762222 0.15 V2 -1.28726 -0.756047 0.112847 + N0 -0.707107 -0.707107 -6.97819e-16 N1 -0.865031 -0.501718 -5.46348e-16 N2 -0.665182 -0.385806 -0.639286 + txt003 +STRI + V0 -1.05637 -1.05637 0.112847 V1 -0.756047 -1.28726 0.112847 V2 -0.762222 -1.29778 0.15 + N0 -0.543581 -0.543581 -0.639562 N1 -0.385806 -0.665182 -0.639286 N2 -0.501718 -0.865031 -5.46348e-16 + txt003 +STRI + V0 -0.762222 -1.29778 0.15 V1 -1.065 -1.065 0.15 V2 -1.05637 -1.05637 0.112847 + N0 -0.501718 -0.865031 -5.46348e-16 N1 -0.707107 -0.707107 -6.97819e-16 N2 -0.543581 -0.543581 -0.639562 + txt003 +STRI + V0 -0.756047 -1.28726 0.112847 V1 -0.399515 -1.4355 0.112847 V2 -0.402778 -1.44722 0.15 + N0 -0.385806 -0.665182 -0.639286 N1 -0.200299 -0.743044 -0.638566 N2 -0.260275 -0.965535 -2.07142e-16 + txt003 +STRI + V0 -0.402778 -1.44722 0.15 V1 -0.762222 -1.29778 0.15 V2 -0.756047 -1.28726 0.112847 + N0 -0.260275 -0.965535 -2.07142e-16 N1 -0.501718 -0.865031 -5.46348e-16 N2 -0.385806 -0.665182 -0.639286 + txt003 +STRI + V0 -0.399515 -1.4355 0.112847 V1 0 -1.48785 0.112847 V2 0 -1.5 0.15 + N0 -0.200299 -0.743044 -0.638566 N1 -1.36806e-16 -0.770022 -0.638018 N2 0 -1 0 + txt003 +STRI + V0 0 -1.5 0.15 V1 -0.402778 -1.44722 0.15 V2 -0.399515 -1.4355 0.112847 + N0 0 -1 0 N1 -0.260275 -0.965535 -2.07142e-16 N2 -0.200299 -0.743044 -0.638566 + txt003 +STRI + V0 0.162696 -0.584584 0.00590278 V1 0 -0.605903 0.00590278 V2 0 0 0 + N0 0.00589307 -0.0218614 -0.999744 N1 0 -0.0226746 -0.999743 N2 0 0 -1 + txt003 +STRI + V0 0.307888 -0.524218 0.00590278 V1 0.162696 -0.584584 0.00590278 V2 0 0 0 + N0 0.0113382 -0.0195486 -0.999745 N1 0.00589307 -0.0218614 -0.999744 N2 0 0 -1 + txt003 +STRI + V0 0.430191 -0.430191 0.00590278 V1 0.307888 -0.524218 0.00590278 V2 0 0 0 + N0 0.015968 -0.015968 -0.999745 N1 0.0113382 -0.0195486 -0.999745 N2 0 0 -1 + txt003 +STRI + V0 0.524218 -0.307888 0.00590278 V1 0.430191 -0.430191 0.00590278 V2 0 0 0 + N0 0.0195486 -0.0113382 -0.999745 N1 0.015968 -0.015968 -0.999745 N2 0 0 -1 + txt003 +STRI + V0 0.584584 -0.162696 0.00590278 V1 0.524218 -0.307888 0.00590278 V2 0 0 0 + N0 0.0218614 -0.00589307 -0.999744 N1 0.0195486 -0.0113382 -0.999745 N2 0 0 -1 + txt003 +STRI + V0 0.605903 0 0.00590278 V1 0.584584 -0.162696 0.00590278 V2 0 0 0 + N0 0.0226746 -4.94615e-18 -0.999743 N1 0.0218614 -0.00589307 -0.999744 N2 0 0 -1 + txt003 +STRI + V0 0 -0.605903 0.00590278 V1 0.162696 -0.584584 0.00590278 V2 0.274486 -0.986255 0.0222222 + N0 0 -0.0226746 -0.999743 N1 0.00589307 -0.0218614 -0.999744 N2 0.0162121 -0.0601415 -0.998058 + txt003 +STRI + V0 0.274486 -0.986255 0.0222222 V1 0 -1.02222 0.0222222 V2 0 -0.605903 0.00590278 + N0 0.0162121 -0.0601415 -0.998058 N1 0 -0.0623783 -0.998053 N2 0 -0.0226746 -0.999743 + txt003 +STRI + V0 0.162696 -0.584584 0.00590278 V1 0.307888 -0.524218 0.00590278 V2 0.51944 -0.884412 0.0222222 + N0 0.00589307 -0.0218614 -0.999744 N1 0.0113382 -0.0195486 -0.999745 N2 0.0311919 -0.0537792 -0.998066 + txt003 +STRI + V0 0.51944 -0.884412 0.0222222 V1 0.274486 -0.986255 0.0222222 V2 0.162696 -0.584584 0.00590278 + N0 0.0311919 -0.0537792 -0.998066 N1 0.0162121 -0.0601415 -0.998058 N2 0.00589307 -0.0218614 -0.999744 + txt003 +STRI + V0 0.307888 -0.524218 0.00590278 V1 0.430191 -0.430191 0.00590278 V2 0.725778 -0.725778 0.0222222 + N0 0.0113382 -0.0195486 -0.999745 N1 0.015968 -0.015968 -0.999745 N2 0.0439291 -0.0439291 -0.998068 + txt003 +STRI + V0 0.725778 -0.725778 0.0222222 V1 0.51944 -0.884412 0.0222222 V2 0.307888 -0.524218 0.00590278 + N0 0.0439291 -0.0439291 -0.998068 N1 0.0311919 -0.0537792 -0.998066 N2 0.0113382 -0.0195486 -0.999745 + txt003 +STRI + V0 0.430191 -0.430191 0.00590278 V1 0.524218 -0.307888 0.00590278 V2 0.884412 -0.51944 0.0222222 + N0 0.015968 -0.015968 -0.999745 N1 0.0195486 -0.0113382 -0.999745 N2 0.0537792 -0.0311919 -0.998066 + txt003 +STRI + V0 0.884412 -0.51944 0.0222222 V1 0.725778 -0.725778 0.0222222 V2 0.430191 -0.430191 0.00590278 + N0 0.0537792 -0.0311919 -0.998066 N1 0.0439291 -0.0439291 -0.998068 N2 0.015968 -0.015968 -0.999745 + txt003 +STRI + V0 0.524218 -0.307888 0.00590278 V1 0.584584 -0.162696 0.00590278 V2 0.986255 -0.274486 0.0222222 + N0 0.0195486 -0.0113382 -0.999745 N1 0.0218614 -0.00589307 -0.999744 N2 0.0601415 -0.0162121 -0.998058 + txt003 +STRI + V0 0.986255 -0.274486 0.0222222 V1 0.884412 -0.51944 0.0222222 V2 0.524218 -0.307888 0.00590278 + N0 0.0601415 -0.0162121 -0.998058 N1 0.0537792 -0.0311919 -0.998066 N2 0.0195486 -0.0113382 -0.999745 + txt003 +STRI + V0 0.584584 -0.162696 0.00590278 V1 0.605903 0 0.00590278 V2 1.02222 2.22045e-16 0.0222222 + N0 0.0218614 -0.00589307 -0.999744 N1 0.0226746 -4.94615e-18 -0.999743 N2 0.0623783 0 -0.998053 + txt003 +STRI + V0 1.02222 2.22045e-16 0.0222222 V1 0.986255 -0.274486 0.0222222 V2 0.584584 -0.162696 0.00590278 + N0 0.0623783 0 -0.998053 N1 0.0601415 -0.0162121 -0.998058 N2 0.0218614 -0.00589307 -0.999744 + txt003 +STRI + V0 0 -1.02222 0.0222222 V1 0.274486 -0.986255 0.0222222 V2 0.344878 -1.23918 0.046875 + N0 0 -0.0623783 -0.998053 N1 0.0162121 -0.0601415 -0.998058 N2 0.0367561 -0.136353 -0.989978 + txt003 +STRI + V0 0.344878 -1.23918 0.046875 V1 0 -1.28438 0.046875 V2 0 -1.02222 0.0222222 + N0 0.0367561 -0.136353 -0.989978 N1 0 -0.141421 -0.989949 N2 0 -0.0623783 -0.998053 + txt003 +STRI + V0 0.274486 -0.986255 0.0222222 V1 0.51944 -0.884412 0.0222222 V2 0.652653 -1.11122 0.046875 + N0 0.0162121 -0.0601415 -0.998058 N1 0.0311919 -0.0537792 -0.998066 N2 0.0707208 -0.121932 -0.990016 + txt003 +STRI + V0 0.652653 -1.11122 0.046875 V1 0.344878 -1.23918 0.046875 V2 0.274486 -0.986255 0.0222222 + N0 0.0707208 -0.121932 -0.990016 N1 0.0367561 -0.136353 -0.989978 N2 0.0162121 -0.0601415 -0.998058 + txt003 +STRI + V0 0.51944 -0.884412 0.0222222 V1 0.725778 -0.725778 0.0222222 V2 0.911906 -0.911906 0.046875 + N0 0.0311919 -0.0537792 -0.998066 N1 0.0439291 -0.0439291 -0.998068 N2 0.0996006 -0.0996006 -0.99003 + txt003 +STRI + V0 0.911906 -0.911906 0.046875 V1 0.652653 -1.11122 0.046875 V2 0.51944 -0.884412 0.0222222 + N0 0.0996006 -0.0996006 -0.99003 N1 0.0707208 -0.121932 -0.990016 N2 0.0311919 -0.0537792 -0.998066 + txt003 +STRI + V0 0.725778 -0.725778 0.0222222 V1 0.884412 -0.51944 0.0222222 V2 1.11122 -0.652653 0.046875 + N0 0.0439291 -0.0439291 -0.998068 N1 0.0537792 -0.0311919 -0.998066 N2 0.121932 -0.0707208 -0.990016 + txt003 +STRI + V0 1.11122 -0.652653 0.046875 V1 0.911906 -0.911906 0.046875 V2 0.725778 -0.725778 0.0222222 + N0 0.121932 -0.0707208 -0.990016 N1 0.0996006 -0.0996006 -0.99003 N2 0.0439291 -0.0439291 -0.998068 + txt003 +STRI + V0 0.884412 -0.51944 0.0222222 V1 0.986255 -0.274486 0.0222222 V2 1.23918 -0.344878 0.046875 + N0 0.0537792 -0.0311919 -0.998066 N1 0.0601415 -0.0162121 -0.998058 N2 0.136353 -0.0367561 -0.989978 + txt003 +STRI + V0 1.23918 -0.344878 0.046875 V1 1.11122 -0.652653 0.046875 V2 0.884412 -0.51944 0.0222222 + N0 0.136353 -0.0367561 -0.989978 N1 0.121932 -0.0707208 -0.990016 N2 0.0537792 -0.0311919 -0.998066 + txt003 +STRI + V0 0.986255 -0.274486 0.0222222 V1 1.02222 2.22045e-16 0.0222222 V2 1.28437 -2.22045e-16 0.046875 + N0 0.0601415 -0.0162121 -0.998058 N1 0.0623783 0 -0.998053 N2 0.141421 0 -0.989949 + txt003 +STRI + V0 1.28437 -2.22045e-16 0.046875 V1 1.23918 -0.344878 0.046875 V2 0.986255 -0.274486 0.0222222 + N0 0.141421 0 -0.989949 N1 0.136353 -0.0367561 -0.989978 N2 0.0601415 -0.0162121 -0.998058 + txt003 +STRI + V0 0 -1.28438 0.046875 V1 0.344878 -1.23918 0.046875 V2 0.383385 -1.37754 0.0777778 + N0 0 -0.141421 -0.989949 N1 0.0367561 -0.136353 -0.989978 N2 0.085395 -0.316788 -0.944644 + txt003 +STRI + V0 0.383385 -1.37754 0.0777778 V1 0 -1.42778 0.0777778 V2 0 -1.28438 0.046875 + N0 0.085395 -0.316788 -0.944644 N1 0 -0.328521 -0.944497 N2 0 -0.141421 -0.989949 + txt003 +STRI + V0 0.344878 -1.23918 0.046875 V1 0.652653 -1.11122 0.046875 V2 0.725523 -1.23529 0.0777778 + N0 0.0367561 -0.136353 -0.989978 N1 0.0707208 -0.121932 -0.990016 N2 0.164332 -0.283331 -0.944838 + txt003 +STRI + V0 0.725523 -1.23529 0.0777778 V1 0.383385 -1.37754 0.0777778 V2 0.344878 -1.23918 0.046875 + N0 0.164332 -0.283331 -0.944838 N1 0.085395 -0.316788 -0.944644 N2 0.0367561 -0.136353 -0.989978 + txt003 +STRI + V0 0.652653 -1.11122 0.046875 V1 0.911906 -0.911906 0.046875 V2 1.01372 -1.01372 0.0777778 + N0 0.0707208 -0.121932 -0.990016 N1 0.0996006 -0.0996006 -0.99003 N2 0.231454 -0.231454 -0.944912 + txt003 +STRI + V0 1.01372 -1.01372 0.0777778 V1 0.725523 -1.23529 0.0777778 V2 0.652653 -1.11122 0.046875 + N0 0.231454 -0.231454 -0.944912 N1 0.164332 -0.283331 -0.944838 N2 0.0707208 -0.121932 -0.990016 + txt003 +STRI + V0 0.911906 -0.911906 0.046875 V1 1.11122 -0.652653 0.046875 V2 1.23529 -0.725523 0.0777778 + N0 0.0996006 -0.0996006 -0.99003 N1 0.121932 -0.0707208 -0.990016 N2 0.283331 -0.164332 -0.944838 + txt003 +STRI + V0 1.23529 -0.725523 0.0777778 V1 1.01372 -1.01372 0.0777778 V2 0.911906 -0.911906 0.046875 + N0 0.283331 -0.164332 -0.944838 N1 0.231454 -0.231454 -0.944912 N2 0.0996006 -0.0996006 -0.99003 + txt003 +STRI + V0 1.11122 -0.652653 0.046875 V1 1.23918 -0.344878 0.046875 V2 1.37754 -0.383385 0.0777778 + N0 0.121932 -0.0707208 -0.990016 N1 0.136353 -0.0367561 -0.989978 N2 0.316788 -0.085395 -0.944644 + txt003 +STRI + V0 1.37754 -0.383385 0.0777778 V1 1.23529 -0.725523 0.0777778 V2 1.11122 -0.652653 0.046875 + N0 0.316788 -0.085395 -0.944644 N1 0.283331 -0.164332 -0.944838 N2 0.121932 -0.0707208 -0.990016 + txt003 +STRI + V0 1.23918 -0.344878 0.046875 V1 1.28437 -2.22045e-16 0.046875 V2 1.42778 2.22045e-16 0.0777778 + N0 0.136353 -0.0367561 -0.989978 N1 0.141421 0 -0.989949 N2 0.328521 -6.08223e-17 -0.944497 + txt003 +STRI + V0 1.42778 2.22045e-16 0.0777778 V1 1.37754 -0.383385 0.0777778 V2 1.23918 -0.344878 0.046875 + N0 0.328521 -6.08223e-17 -0.944497 N1 0.316788 -0.085395 -0.944644 N2 0.136353 -0.0367561 -0.989978 + txt003 +STRI + V0 0 -1.42778 0.0777778 V1 0.383385 -1.37754 0.0777778 V2 0.399515 -1.4355 0.112847 + N0 0 -0.328521 -0.944497 N1 0.085395 -0.316788 -0.944644 N2 0.200299 -0.743044 -0.638566 + txt003 +STRI + V0 0.399515 -1.4355 0.112847 V1 0 -1.48785 0.112847 V2 0 -1.42778 0.0777778 + N0 0.200299 -0.743044 -0.638566 N1 0 -0.770022 -0.638018 N2 0 -0.328521 -0.944497 + txt003 +STRI + V0 0.383385 -1.37754 0.0777778 V1 0.725523 -1.23529 0.0777778 V2 0.756047 -1.28726 0.112847 + N0 0.085395 -0.316788 -0.944644 N1 0.164332 -0.283331 -0.944838 N2 0.385806 -0.665182 -0.639286 + txt003 +STRI + V0 0.756047 -1.28726 0.112847 V1 0.399515 -1.4355 0.112847 V2 0.383385 -1.37754 0.0777778 + N0 0.385806 -0.665182 -0.639286 N1 0.200299 -0.743044 -0.638566 N2 0.085395 -0.316788 -0.944644 + txt003 +STRI + V0 0.725523 -1.23529 0.0777778 V1 1.01372 -1.01372 0.0777778 V2 1.05637 -1.05637 0.112847 + N0 0.164332 -0.283331 -0.944838 N1 0.231454 -0.231454 -0.944912 N2 0.543581 -0.543581 -0.639562 + txt003 +STRI + V0 1.05637 -1.05637 0.112847 V1 0.756047 -1.28726 0.112847 V2 0.725523 -1.23529 0.0777778 + N0 0.543581 -0.543581 -0.639562 N1 0.385806 -0.665182 -0.639286 N2 0.164332 -0.283331 -0.944838 + txt003 +STRI + V0 1.01372 -1.01372 0.0777778 V1 1.23529 -0.725523 0.0777778 V2 1.28726 -0.756047 0.112847 + N0 0.231454 -0.231454 -0.944912 N1 0.283331 -0.164332 -0.944838 N2 0.665182 -0.385806 -0.639286 + txt003 +STRI + V0 1.28726 -0.756047 0.112847 V1 1.05637 -1.05637 0.112847 V2 1.01372 -1.01372 0.0777778 + N0 0.665182 -0.385806 -0.639286 N1 0.543581 -0.543581 -0.639562 N2 0.231454 -0.231454 -0.944912 + txt003 +STRI + V0 1.23529 -0.725523 0.0777778 V1 1.37754 -0.383385 0.0777778 V2 1.4355 -0.399515 0.112847 + N0 0.283331 -0.164332 -0.944838 N1 0.316788 -0.085395 -0.944644 N2 0.743044 -0.200299 -0.638566 + txt003 +STRI + V0 1.4355 -0.399515 0.112847 V1 1.28726 -0.756047 0.112847 V2 1.23529 -0.725523 0.0777778 + N0 0.743044 -0.200299 -0.638566 N1 0.665182 -0.385806 -0.639286 N2 0.283331 -0.164332 -0.944838 + txt003 +STRI + V0 1.37754 -0.383385 0.0777778 V1 1.42778 2.22045e-16 0.0777778 V2 1.48785 0 0.112847 + N0 0.316788 -0.085395 -0.944644 N1 0.328521 -6.08223e-17 -0.944497 N2 0.770022 -1.36806e-16 -0.638018 + txt003 +STRI + V0 1.48785 0 0.112847 V1 1.4355 -0.399515 0.112847 V2 1.37754 -0.383385 0.0777778 + N0 0.770022 -1.36806e-16 -0.638018 N1 0.743044 -0.200299 -0.638566 N2 0.316788 -0.085395 -0.944644 + txt003 +STRI + V0 0 -1.48785 0.112847 V1 0.399515 -1.4355 0.112847 V2 0.402778 -1.44722 0.15 + N0 0 -0.770022 -0.638018 N1 0.200299 -0.743044 -0.638566 N2 0.260275 -0.965535 -2.07142e-16 + txt003 +STRI + V0 0.402778 -1.44722 0.15 V1 0 -1.5 0.15 V2 0 -1.48785 0.112847 + N0 0.260275 -0.965535 -2.07142e-16 N1 0 -1 0 N2 0 -0.770022 -0.638018 + txt003 +STRI + V0 0.399515 -1.4355 0.112847 V1 0.756047 -1.28726 0.112847 V2 0.762222 -1.29778 0.15 + N0 0.200299 -0.743044 -0.638566 N1 0.385806 -0.665182 -0.639286 N2 0.501718 -0.865031 -5.46348e-16 + txt003 +STRI + V0 0.762222 -1.29778 0.15 V1 0.402778 -1.44722 0.15 V2 0.399515 -1.4355 0.112847 + N0 0.501718 -0.865031 -5.46348e-16 N1 0.260275 -0.965535 -2.07142e-16 N2 0.200299 -0.743044 -0.638566 + txt003 +STRI + V0 0.756047 -1.28726 0.112847 V1 1.05637 -1.05637 0.112847 V2 1.065 -1.065 0.15 + N0 0.385806 -0.665182 -0.639286 N1 0.543581 -0.543581 -0.639562 N2 0.707107 -0.707107 -6.97819e-16 + txt003 +STRI + V0 1.065 -1.065 0.15 V1 0.762222 -1.29778 0.15 V2 0.756047 -1.28726 0.112847 + N0 0.707107 -0.707107 -6.97819e-16 N1 0.501718 -0.865031 -5.46348e-16 N2 0.385806 -0.665182 -0.639286 + txt003 +STRI + V0 1.05637 -1.05637 0.112847 V1 1.28726 -0.756047 0.112847 V2 1.29778 -0.762222 0.15 + N0 0.543581 -0.543581 -0.639562 N1 0.665182 -0.385806 -0.639286 N2 0.865031 -0.501718 -5.46348e-16 + txt003 +STRI + V0 1.29778 -0.762222 0.15 V1 1.065 -1.065 0.15 V2 1.05637 -1.05637 0.112847 + N0 0.865031 -0.501718 -5.46348e-16 N1 0.707107 -0.707107 -6.97819e-16 N2 0.543581 -0.543581 -0.639562 + txt003 +STRI + V0 1.28726 -0.756047 0.112847 V1 1.4355 -0.399515 0.112847 V2 1.44722 -0.402778 0.15 + N0 0.665182 -0.385806 -0.639286 N1 0.743044 -0.200299 -0.638566 N2 0.965535 -0.260275 -2.07142e-16 + txt003 +STRI + V0 1.44722 -0.402778 0.15 V1 1.29778 -0.762222 0.15 V2 1.28726 -0.756047 0.112847 + N0 0.965535 -0.260275 -2.07142e-16 N1 0.865031 -0.501718 -5.46348e-16 N2 0.665182 -0.385806 -0.639286 + txt003 +STRI + V0 1.4355 -0.399515 0.112847 V1 1.48785 0 0.112847 V2 1.5 0 0.15 + N0 0.743044 -0.200299 -0.638566 N1 0.770022 -1.36806e-16 -0.638018 N2 1 0 0 + txt003 +STRI + V0 1.5 0 0.15 V1 1.44722 -0.402778 0.15 V2 1.4355 -0.399515 0.112847 + N0 1 0 0 N1 0.965535 -0.260275 -2.07142e-16 N2 0.743044 -0.200299 -0.638566 + txt003 + +END_SCENE diff --git a/xdl/third_party/tbb/examples/parallel_for/tachyon/dat/trypsin4pti.dat b/xdl/third_party/tbb/examples/parallel_for/tachyon/dat/trypsin4pti.dat new file mode 100644 index 00000000..7d547f28 --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/tachyon/dat/trypsin4pti.dat @@ -0,0 +1,538 @@ +BEGIN_SCENE + OUTFILE /dev/null + RESOLUTION 768 768 + VERBOSE 0 + +CAMERA + ZOOM 1.0 + ASPECTRATIO 1.0 + ANTIALIASING 0 + RAYDEPTH 4 + CENTER 15.0 20.0 -50.0 + VIEWDIR 0.0 0.0 1.0 + UPDIR 0.0 1.0 0.0 +END_CAMERA + + +LIGHT + CENTER 40.0 50.0 -40.0 + RAD 0.2 + COLOR 0.5 0.5 0.5 + +LIGHT + CENTER -40.0 20.0 -40.0 + RAD 0.2 + COLOR 0.5 0.5 0.5 + + +TEXDEF O AMBIENT 0.1 DIFFUSE 0.9 SPECULAR 0.0 OPACITY 1.0 + PHONG PLASTIC 0.5 PHONG_SIZE 24.8 + COLOR 1.0 0.0 0.0 TEXFUNC 0 +TEXALIAS OH O +TEXALIAS OD1 O +TEXALIAS OD2 O +TEXALIAS OE1 O +TEXALIAS OE2 O +TEXALIAS OG O +TEXALIAS OG1 O +TEXALIAS OG2 O +TEXALIAS OXT O + +TEXDEF C AMBIENT 0.1 DIFFUSE 0.5 SPECULAR 0.0 OPACITY 1.0 + PHONG PLASTIC 0.5 PHONG_SIZE 24.8 + COLOR 0.5 0.5 0.5 TEXFUNC 0 +TEXALIAS CA C +TEXALIAS CB C +TEXALIAS CD C +TEXALIAS CD1 C +TEXALIAS CD2 C +TEXALIAS CE C +TEXALIAS CE1 C +TEXALIAS CE2 C +TEXALIAS CG C +TEXALIAS CG1 C +TEXALIAS CG2 C +TEXALIAS CZ C + +TEXDEF N AMBIENT 0.1 DIFFUSE 0.9 SPECULAR 0.0 OPACITY 1.0 + PHONG PLASTIC 0.5 PHONG_SIZE 24.8 + COLOR 0.5 0.5 1.0 TEXFUNC 0 +TEXALIAS ND2 N +TEXALIAS NH1 N +TEXALIAS NH2 N +TEXALIAS NE N +TEXALIAS NE2 N +TEXALIAS NZ N + +TEXDEF SD AMBIENT 0.1 DIFFUSE 0.9 SPECULAR 0.0 OPACITY 1.0 + PHONG METAL 0.5 PHONG_SIZE 24.8 + COLOR 1.0 1.0 1.0 TEXFUNC 0 + +TEXDEF SG AMBIENT 0.1 DIFFUSE 0.9 SPECULAR 0.0 OPACITY 1.0 + PHONG PLASTIC 0.5 PHONG_SIZE 24.8 + COLOR 1.0 1.0 1.0 TEXFUNC 0 + +SPHERE CENTER 26.465000 27.452000 -2.490000 RAD 1.0 N +SPHERE CENTER 25.497000 26.862000 -1.573000 RAD 1.0 CA +SPHERE CENTER 26.193001 26.179001 -0.437000 RAD 1.0 C +SPHERE CENTER 27.270000 25.549000 -0.624000 RAD 1.0 O +SPHERE CENTER 24.583000 25.804001 -2.239000 RAD 1.0 CB +SPHERE CENTER 25.091000 24.375000 -2.409000 RAD 1.0 CG +SPHERE CENTER 24.018999 23.427999 -2.996000 RAD 1.0 CD +SPHERE CENTER 23.591000 24.028000 -4.287000 RAD 1.0 NE +SPHERE CENTER 24.299000 23.972000 -5.389000 RAD 1.0 CZ +SPHERE CENTER 25.431999 23.261000 -5.440000 RAD 1.0 NH1 +SPHERE CENTER 23.721001 24.372999 -6.467000 RAD 1.0 NH2 +SPHERE CENTER 25.667000 26.396000 0.708000 RAD 1.0 N +SPHERE CENTER 26.222000 25.760000 1.891000 RAD 1.0 CA +SPHERE CENTER 26.207001 24.242001 1.830000 RAD 1.0 C +SPHERE CENTER 25.400000 23.576000 1.139000 RAD 1.0 O +SPHERE CENTER 25.260000 26.207001 3.033000 RAD 1.0 CB +SPHERE CENTER 24.511999 27.427999 2.493000 RAD 1.0 CG +SPHERE CENTER 24.606001 27.382000 0.978000 RAD 1.0 CD +SPHERE CENTER 27.170000 23.634001 2.462000 RAD 1.0 N +SPHERE CENTER 27.284000 22.163000 2.498000 RAD 1.0 CA +SPHERE CENTER 26.042999 21.506001 3.085000 RAD 1.0 C +SPHERE CENTER 25.752001 20.350000 2.705000 RAD 1.0 O +SPHERE CENTER 28.424999 21.747000 3.461000 RAD 1.0 CB +SPHERE CENTER 29.791000 21.886000 2.787000 RAD 1.0 CG +SPHERE CENTER 29.875000 22.104000 1.543000 RAD 1.0 OD1 +SPHERE CENTER 30.806000 21.500999 3.431000 RAD 1.0 OD2 +SPHERE CENTER 25.393999 22.184000 4.041000 RAD 1.0 N +SPHERE CENTER 24.172001 21.584999 4.618000 RAD 1.0 CA +SPHERE CENTER 23.009001 21.375000 3.624000 RAD 1.0 C +SPHERE CENTER 22.082001 20.603001 3.921000 RAD 1.0 O +SPHERE CENTER 23.691999 22.330999 5.862000 RAD 1.0 CB +SPHERE CENTER 23.191999 23.778999 5.639000 RAD 1.0 CG +SPHERE CENTER 21.961000 24.002001 5.060000 RAD 1.0 CD1 +SPHERE CENTER 23.951000 24.841000 6.050000 RAD 1.0 CD2 +SPHERE CENTER 21.497000 25.281000 4.869000 RAD 1.0 CE1 +SPHERE CENTER 23.510000 26.124001 5.854000 RAD 1.0 CE2 +SPHERE CENTER 22.277000 26.363001 5.249000 RAD 1.0 CZ +SPHERE CENTER 23.094999 22.004000 2.522000 RAD 1.0 N +SPHERE CENTER 22.106001 21.863001 1.467000 RAD 1.0 CA +SPHERE CENTER 22.191999 20.518000 0.830000 RAD 1.0 C +SPHERE CENTER 21.230000 20.068001 0.167000 RAD 1.0 O +SPHERE CENTER 22.358000 22.903999 0.371000 RAD 1.0 CB +SPHERE CENTER 22.145000 24.591999 0.888000 RAD 1.0 SG +SPHERE CENTER 23.326000 19.826000 1.008000 RAD 1.0 N +SPHERE CENTER 23.436001 18.459999 0.459000 RAD 1.0 CA +SPHERE CENTER 22.958000 17.365000 1.407000 RAD 1.0 C +SPHERE CENTER 22.938000 16.180000 0.999000 RAD 1.0 O +SPHERE CENTER 24.898001 18.084000 0.131000 RAD 1.0 CB +SPHERE CENTER 25.572001 19.129000 -0.776000 RAD 1.0 CG +SPHERE CENTER 27.037001 18.695000 -1.116000 RAD 1.0 CD1 +SPHERE CENTER 24.791000 19.488001 -2.049000 RAD 1.0 CD2 +SPHERE CENTER 22.545000 17.716000 2.628000 RAD 1.0 N +SPHERE CENTER 22.039000 16.646000 3.528000 RAD 1.0 CA +SPHERE CENTER 20.615999 16.285000 3.113000 RAD 1.0 C +SPHERE CENTER 19.860001 17.136000 2.576000 RAD 1.0 O +SPHERE CENTER 21.764000 17.216999 4.920000 RAD 1.0 CB +SPHERE CENTER 22.813999 18.035000 5.647000 RAD 1.0 CG +SPHERE CENTER 22.152000 18.707001 6.870000 RAD 1.0 CD +SPHERE CENTER 22.980000 19.100000 7.718000 RAD 1.0 OE1 +SPHERE CENTER 21.086000 19.403999 6.779000 RAD 1.0 OE2 +SPHERE CENTER 20.254000 15.031000 3.334000 RAD 1.0 N +SPHERE CENTER 18.892000 14.554000 3.034000 RAD 1.0 CA +SPHERE CENTER 17.954000 15.160000 4.079000 RAD 1.0 C +SPHERE CENTER 18.443001 15.606000 5.146000 RAD 1.0 O +SPHERE CENTER 18.910000 13.045000 3.274000 RAD 1.0 CB +SPHERE CENTER 20.226000 12.742000 4.021000 RAD 1.0 CG +SPHERE CENTER 21.107000 14.009000 3.934000 RAD 1.0 CD +SPHERE CENTER 16.681999 15.232000 3.767000 RAD 1.0 N +SPHERE CENTER 15.690000 15.852000 4.661000 RAD 1.0 CA +SPHERE CENTER 15.550000 15.006000 5.916000 RAD 1.0 C +SPHERE CENTER 15.693000 13.769000 5.836000 RAD 1.0 O +SPHERE CENTER 14.367000 15.707000 3.867000 RAD 1.0 CB +SPHERE CENTER 14.571000 14.716000 2.710000 RAD 1.0 CG +SPHERE CENTER 16.090000 14.597000 2.574000 RAD 1.0 CD +SPHERE CENTER 15.365000 15.630000 7.042000 RAD 1.0 N +SPHERE CENTER 15.310000 14.908000 8.298000 RAD 1.0 CA +SPHERE CENTER 13.953000 15.177000 8.952000 RAD 1.0 C +SPHERE CENTER 13.699000 16.320000 9.382000 RAD 1.0 O +SPHERE CENTER 16.532000 15.383000 9.122000 RAD 1.0 CB +SPHERE CENTER 16.608000 14.781000 10.525000 RAD 1.0 CG +SPHERE CENTER 17.132000 13.535000 10.707000 RAD 1.0 CD1 +SPHERE CENTER 16.155001 15.523000 11.588000 RAD 1.0 CD2 +SPHERE CENTER 17.216000 12.999000 11.982000 RAD 1.0 CE1 +SPHERE CENTER 16.266001 14.985000 12.862000 RAD 1.0 CE2 +SPHERE CENTER 16.808001 13.746000 13.047000 RAD 1.0 CZ +SPHERE CENTER 16.878000 13.192000 14.372000 RAD 1.0 OH +SPHERE CENTER 13.161000 14.146000 9.088000 RAD 1.0 N +SPHERE CENTER 11.802000 14.321000 9.642000 RAD 1.0 CA +SPHERE CENTER 11.855000 14.484000 11.146000 RAD 1.0 C +SPHERE CENTER 11.105000 15.314000 11.759000 RAD 1.0 O +SPHERE CENTER 10.963000 13.105000 9.273000 RAD 1.0 CB +SPHERE CENTER 10.706000 13.192000 7.854000 RAD 1.0 OG1 +SPHERE CENTER 9.611000 13.152000 10.045000 RAD 1.0 CG2 +SPHERE CENTER 12.789000 13.760000 11.726000 RAD 1.0 N +SPHERE CENTER 13.002000 13.922000 13.198000 RAD 1.0 CA +SPHERE CENTER 12.107000 12.944000 13.909000 RAD 1.0 C +SPHERE CENTER 11.333000 12.212000 13.239000 RAD 1.0 O +SPHERE CENTER 12.235000 12.905000 15.210000 RAD 1.0 N +SPHERE CENTER 11.516000 11.958000 16.066999 RAD 1.0 CA +SPHERE CENTER 10.094000 12.319000 16.468000 RAD 1.0 C +SPHERE CENTER 9.440000 11.442000 17.052000 RAD 1.0 O +SPHERE CENTER 12.272000 11.936000 17.370001 RAD 1.0 CB +SPHERE CENTER 13.164000 13.172000 17.399000 RAD 1.0 CG +SPHERE CENTER 13.281000 13.627000 15.925000 RAD 1.0 CD +SPHERE CENTER 9.629000 13.519000 16.214001 RAD 1.0 N +SPHERE CENTER 8.290000 13.980000 16.615999 RAD 1.0 CA +SPHERE CENTER 7.268000 13.720000 15.515000 RAD 1.0 C +SPHERE CENTER 7.672000 13.397000 14.387000 RAD 1.0 O +SPHERE CENTER 8.279000 15.441000 16.966999 RAD 1.0 CB +SPHERE CENTER 9.221000 15.735000 18.490000 RAD 1.0 SG +SPHERE CENTER 6.027000 13.680000 15.869000 RAD 1.0 N +SPHERE CENTER 5.005000 13.220000 14.945000 RAD 1.0 CA +SPHERE CENTER 3.964000 14.283000 14.630000 RAD 1.0 C +SPHERE CENTER 2.777000 13.949000 14.377000 RAD 1.0 O +SPHERE CENTER 4.310000 11.998000 15.592000 RAD 1.0 CB +SPHERE CENTER 5.273000 10.848000 15.913000 RAD 1.0 CG +SPHERE CENTER 5.781000 10.034000 14.702000 RAD 1.0 CD +SPHERE CENTER 6.855000 9.016000 15.126000 RAD 1.0 CE +SPHERE CENTER 7.357000 8.291000 13.953000 RAD 1.0 NZ +SPHERE CENTER 4.325000 15.549000 14.618000 RAD 1.0 N +SPHERE CENTER 3.513000 16.639999 14.122000 RAD 1.0 CA +SPHERE CENTER 3.561000 16.615000 12.586000 RAD 1.0 C +SPHERE CENTER 4.270000 15.752000 12.023000 RAD 1.0 O +SPHERE CENTER 3.984000 17.995001 14.670000 RAD 1.0 CB +SPHERE CENTER 2.781000 17.424999 11.943000 RAD 1.0 N +SPHERE CENTER 2.700000 17.355000 10.457000 RAD 1.0 CA +SPHERE CENTER 2.875000 18.731001 9.887000 RAD 1.0 C +SPHERE CENTER 1.878000 19.469999 9.653000 RAD 1.0 O +SPHERE CENTER 1.320000 16.787001 9.970000 RAD 1.0 CB +SPHERE CENTER 1.186000 15.339000 10.395000 RAD 1.0 CG +SPHERE CENTER -0.170000 14.751000 9.963000 RAD 1.0 CD +SPHERE CENTER -1.132000 15.455000 10.801000 RAD 1.0 NE +SPHERE CENTER -1.531000 14.913000 11.939000 RAD 1.0 CZ +SPHERE CENTER -1.172000 13.658000 12.165000 RAD 1.0 NH1 +SPHERE CENTER -2.202000 15.647000 12.795000 RAD 1.0 NH2 +SPHERE CENTER 4.154000 19.110001 9.817000 RAD 1.0 N +SPHERE CENTER 4.595000 20.444000 9.391000 RAD 1.0 CA +SPHERE CENTER 5.249000 20.388000 8.012000 RAD 1.0 C +SPHERE CENTER 6.193000 19.612000 7.834000 RAD 1.0 O +SPHERE CENTER 5.590000 20.988001 10.452000 RAD 1.0 CB +SPHERE CENTER 4.792000 21.062000 11.815000 RAD 1.0 CG1 +SPHERE CENTER 5.985000 22.451000 10.085000 RAD 1.0 CG2 +SPHERE CENTER 5.689000 21.535999 12.955000 RAD 1.0 CD1 +SPHERE CENTER 4.586000 20.955999 7.035000 RAD 1.0 N +SPHERE CENTER 5.154000 20.879000 5.697000 RAD 1.0 CA +SPHERE CENTER 6.286000 21.912001 5.572000 RAD 1.0 C +SPHERE CENTER 6.156000 23.146000 5.785000 RAD 1.0 O +SPHERE CENTER 4.095000 21.205000 4.648000 RAD 1.0 CB +SPHERE CENTER 2.836000 20.316999 4.886000 RAD 1.0 CG1 +SPHERE CENTER 4.655000 20.930000 3.250000 RAD 1.0 CG2 +SPHERE CENTER 3.122000 18.813999 4.850000 RAD 1.0 CD1 +SPHERE CENTER 7.451000 21.372000 5.297000 RAD 1.0 N +SPHERE CENTER 8.602000 22.257000 5.060000 RAD 1.0 CA +SPHERE CENTER 9.150000 21.950001 3.673000 RAD 1.0 C +SPHERE CENTER 8.840000 20.896000 3.088000 RAD 1.0 O +SPHERE CENTER 9.698000 21.896999 6.092000 RAD 1.0 CB +SPHERE CENTER 9.226000 22.299999 7.493000 RAD 1.0 CG +SPHERE CENTER 9.248000 23.850000 7.622000 RAD 1.0 CD +SPHERE CENTER 8.810000 24.311001 8.962000 RAD 1.0 NE +SPHERE CENTER 9.575000 24.336000 10.075000 RAD 1.0 CZ +SPHERE CENTER 10.888000 24.077000 10.044000 RAD 1.0 NH1 +SPHERE CENTER 9.050000 24.893000 11.170000 RAD 1.0 NH2 +SPHERE CENTER 10.178000 22.695000 3.318000 RAD 1.0 N +SPHERE CENTER 10.959000 22.444000 2.085000 RAD 1.0 CA +SPHERE CENTER 12.407000 22.010000 2.386000 RAD 1.0 C +SPHERE CENTER 12.987000 22.511999 3.378000 RAD 1.0 O +SPHERE CENTER 10.997000 23.770000 1.282000 RAD 1.0 CB +SPHERE CENTER 9.641000 24.038000 0.627000 RAD 1.0 CG +SPHERE CENTER 8.639000 24.591999 1.399000 RAD 1.0 CD1 +SPHERE CENTER 9.451000 23.725000 -0.691000 RAD 1.0 CD2 +SPHERE CENTER 7.403000 24.861000 0.831000 RAD 1.0 CE1 +SPHERE CENTER 8.213000 23.993000 -1.249000 RAD 1.0 CE2 +SPHERE CENTER 7.215000 24.576000 -0.494000 RAD 1.0 CZ +SPHERE CENTER 5.879000 24.768999 -1.060000 RAD 1.0 OH +SPHERE CENTER 12.977000 21.141001 1.535000 RAD 1.0 N +SPHERE CENTER 14.449000 20.892000 1.626000 RAD 1.0 CA +SPHERE CENTER 15.018000 21.045000 0.237000 RAD 1.0 C +SPHERE CENTER 14.250000 20.837000 -0.740000 RAD 1.0 O +SPHERE CENTER 14.664000 19.434999 2.142000 RAD 1.0 CB +SPHERE CENTER 14.283000 18.275999 1.191000 RAD 1.0 CG +SPHERE CENTER 15.290000 17.639000 0.506000 RAD 1.0 CD1 +SPHERE CENTER 12.962000 17.907000 0.976000 RAD 1.0 CD2 +SPHERE CENTER 14.981000 16.632000 -0.392000 RAD 1.0 CE1 +SPHERE CENTER 12.638000 16.909000 0.061000 RAD 1.0 CE2 +SPHERE CENTER 13.673000 16.261999 -0.626000 RAD 1.0 CZ +SPHERE CENTER 16.336000 21.281000 0.152000 RAD 1.0 N +SPHERE CENTER 16.948000 21.292000 -1.153000 RAD 1.0 CA +SPHERE CENTER 17.365000 19.888000 -1.542000 RAD 1.0 C +SPHERE CENTER 18.009001 19.184000 -0.744000 RAD 1.0 O +SPHERE CENTER 18.188000 22.194000 -1.071000 RAD 1.0 CB +SPHERE CENTER 18.906000 22.263000 -2.442000 RAD 1.0 CG +SPHERE CENTER 20.089001 21.621000 -2.663000 RAD 1.0 CD1 +SPHERE CENTER 18.361000 23.033001 -3.436000 RAD 1.0 CD2 +SPHERE CENTER 20.733000 21.778999 -3.896000 RAD 1.0 CE1 +SPHERE CENTER 18.990999 23.184999 -4.662000 RAD 1.0 CE2 +SPHERE CENTER 20.184999 22.562000 -4.864000 RAD 1.0 CZ +SPHERE CENTER 20.826000 22.768000 -6.115000 RAD 1.0 OH +SPHERE CENTER 16.913000 19.452999 -2.726000 RAD 1.0 N +SPHERE CENTER 17.295000 18.160000 -3.291000 RAD 1.0 CA +SPHERE CENTER 18.406000 18.332001 -4.341000 RAD 1.0 C +SPHERE CENTER 18.166000 18.843000 -5.464000 RAD 1.0 O +SPHERE CENTER 16.052000 17.558001 -3.946000 RAD 1.0 CB +SPHERE CENTER 16.354000 16.226999 -4.626000 RAD 1.0 CG +SPHERE CENTER 17.531000 15.754000 -4.725000 RAD 1.0 OD1 +SPHERE CENTER 15.234000 15.549000 -4.870000 RAD 1.0 ND2 +SPHERE CENTER 19.655001 18.124001 -3.871000 RAD 1.0 N +SPHERE CENTER 20.851000 18.420000 -4.681000 RAD 1.0 CA +SPHERE CENTER 20.920000 17.650000 -6.010000 RAD 1.0 C +SPHERE CENTER 21.385000 18.257000 -6.997000 RAD 1.0 O +SPHERE CENTER 22.112000 18.070999 -3.866000 RAD 1.0 CB +SPHERE CENTER 20.333000 16.480000 -6.081000 RAD 1.0 N +SPHERE CENTER 20.243999 15.784000 -7.383000 RAD 1.0 CA +SPHERE CENTER 19.287001 16.482000 -8.327000 RAD 1.0 C +SPHERE CENTER 19.478001 16.368999 -9.556000 RAD 1.0 O +SPHERE CENTER 19.732000 14.353000 -7.259000 RAD 1.0 CB +SPHERE CENTER 20.799999 13.485000 -6.626000 RAD 1.0 CG +SPHERE CENTER 20.299000 12.037000 -6.533000 RAD 1.0 CD +SPHERE CENTER 21.386999 11.067000 -6.033000 RAD 1.0 CE +SPHERE CENTER 21.820999 11.437000 -4.681000 RAD 1.0 NZ +SPHERE CENTER 18.212999 17.041000 -7.772000 RAD 1.0 N +SPHERE CENTER 17.181999 17.617001 -8.631000 RAD 1.0 CA +SPHERE CENTER 17.468000 19.070000 -8.921000 RAD 1.0 C +SPHERE CENTER 16.909000 19.707001 -9.863000 RAD 1.0 O +SPHERE CENTER 15.833000 17.423000 -7.901000 RAD 1.0 CB +SPHERE CENTER 18.299000 19.622000 -8.061000 RAD 1.0 N +SPHERE CENTER 18.625999 21.035999 -8.237000 RAD 1.0 CA +SPHERE CENTER 17.587999 22.051001 -7.738000 RAD 1.0 C +SPHERE CENTER 17.702000 23.257999 -8.056000 RAD 1.0 O +SPHERE CENTER 16.632000 21.566000 -6.970000 RAD 1.0 N +SPHERE CENTER 15.576000 22.431999 -6.478000 RAD 1.0 CA +SPHERE CENTER 14.947000 21.879999 -5.199000 RAD 1.0 C +SPHERE CENTER 15.304000 20.784000 -4.719000 RAD 1.0 O +SPHERE CENTER 14.553000 22.764999 -7.568000 RAD 1.0 CB +SPHERE CENTER 14.018000 21.514000 -8.283000 RAD 1.0 CG +SPHERE CENTER 13.211000 20.593000 -7.394000 RAD 1.0 CD1 +SPHERE CENTER 13.189000 21.898001 -9.518000 RAD 1.0 CD2 +SPHERE CENTER 14.114000 22.691999 -4.605000 RAD 1.0 N +SPHERE CENTER 13.591000 22.299999 -3.306000 RAD 1.0 CA +SPHERE CENTER 12.246000 21.612000 -3.398000 RAD 1.0 C +SPHERE CENTER 11.508000 21.862000 -4.381000 RAD 1.0 O +SPHERE CENTER 13.406000 23.628000 -2.540000 RAD 1.0 CB +SPHERE CENTER 14.977000 24.433001 -2.196000 RAD 1.0 SG +SPHERE CENTER 12.005000 20.672001 -2.530000 RAD 1.0 N +SPHERE CENTER 10.813000 19.820999 -2.569000 RAD 1.0 CA +SPHERE CENTER 10.208000 19.822001 -1.167000 RAD 1.0 C +SPHERE CENTER 10.918000 20.218000 -0.210000 RAD 1.0 O +SPHERE CENTER 11.110000 18.377001 -3.007000 RAD 1.0 CB +SPHERE CENTER 11.604000 18.464001 -4.496000 RAD 1.0 CG +SPHERE CENTER 12.041000 17.093000 -4.992000 RAD 1.0 CD +SPHERE CENTER 12.104000 16.884001 -6.223000 RAD 1.0 OE1 +SPHERE CENTER 12.461000 16.246000 -4.115000 RAD 1.0 NE2 +SPHERE CENTER 8.983000 19.459000 -1.072000 RAD 1.0 N +SPHERE CENTER 8.377000 19.427999 0.280000 RAD 1.0 CA +SPHERE CENTER 8.573000 18.100000 0.950000 RAD 1.0 C +SPHERE CENTER 8.785000 17.013000 0.347000 RAD 1.0 O +SPHERE CENTER 6.844000 19.700001 0.273000 RAD 1.0 CB +SPHERE CENTER 6.304000 18.825001 -0.706000 RAD 1.0 OG1 +SPHERE CENTER 6.585000 21.149000 -0.177000 RAD 1.0 CG2 +SPHERE CENTER 8.526000 18.187000 2.280000 RAD 1.0 N +SPHERE CENTER 8.582000 16.999001 3.087000 RAD 1.0 CA +SPHERE CENTER 7.801000 17.273001 4.382000 RAD 1.0 C +SPHERE CENTER 7.554000 18.469000 4.665000 RAD 1.0 O +SPHERE CENTER 10.066000 16.503000 3.399000 RAD 1.0 CB +SPHERE CENTER 10.840000 17.323999 4.462000 RAD 1.0 CG +SPHERE CENTER 11.188000 16.711000 5.670000 RAD 1.0 CD1 +SPHERE CENTER 11.224000 18.618999 4.188000 RAD 1.0 CD2 +SPHERE CENTER 11.912000 17.452999 6.617000 RAD 1.0 CE1 +SPHERE CENTER 11.948000 19.333000 5.129000 RAD 1.0 CE2 +SPHERE CENTER 12.277000 18.763000 6.344000 RAD 1.0 CZ +SPHERE CENTER 7.455000 16.219999 5.116000 RAD 1.0 N +SPHERE CENTER 6.756000 16.414000 6.390000 RAD 1.0 CA +SPHERE CENTER 7.798000 16.358999 7.491000 RAD 1.0 C +SPHERE CENTER 8.422000 15.296000 7.692000 RAD 1.0 O +SPHERE CENTER 5.716000 15.281000 6.557000 RAD 1.0 CB +SPHERE CENTER 4.973000 15.432000 7.882000 RAD 1.0 CG1 +SPHERE CENTER 4.667000 15.326000 5.371000 RAD 1.0 CG2 +SPHERE CENTER 7.953000 17.509001 8.095000 RAD 1.0 N +SPHERE CENTER 8.816000 17.659000 9.286000 RAD 1.0 CA +SPHERE CENTER 7.941000 17.294001 10.498000 RAD 1.0 C +SPHERE CENTER 6.818000 17.832001 10.661000 RAD 1.0 O +SPHERE CENTER 9.260000 19.136000 9.274000 RAD 1.0 CB +SPHERE CENTER 10.066000 19.506001 10.540000 RAD 1.0 CG +SPHERE CENTER 11.058000 18.667999 11.032000 RAD 1.0 CD1 +SPHERE CENTER 9.728000 20.677999 11.181000 RAD 1.0 CD2 +SPHERE CENTER 11.713000 19.021999 12.217000 RAD 1.0 CE1 +SPHERE CENTER 10.401000 21.042000 12.346000 RAD 1.0 CE2 +SPHERE CENTER 11.371000 20.211000 12.851000 RAD 1.0 CZ +SPHERE CENTER 12.040000 20.579000 14.049000 RAD 1.0 OH +SPHERE CENTER 8.505000 16.504999 11.400000 RAD 1.0 N +SPHERE CENTER 7.774000 16.076000 12.622000 RAD 1.0 CA +SPHERE CENTER 7.696000 17.099001 13.728000 RAD 1.0 C +SPHERE CENTER 6.978000 16.834999 14.718000 RAD 1.0 O +SPHERE CENTER 8.385000 18.202000 13.646000 RAD 1.0 N +SPHERE CENTER 8.275000 19.365999 14.533000 RAD 1.0 CA +SPHERE CENTER 9.338000 19.430000 15.620000 RAD 1.0 C +SPHERE CENTER 9.309000 20.379999 16.415001 RAD 1.0 O +SPHERE CENTER 10.317000 18.555000 15.610000 RAD 1.0 N +SPHERE CENTER 11.453000 18.707001 16.541000 RAD 1.0 CA +SPHERE CENTER 12.763000 18.232000 15.950000 RAD 1.0 C +SPHERE CENTER 12.753000 17.224001 15.201000 RAD 1.0 O +SPHERE CENTER 11.179000 18.055000 17.937000 RAD 1.0 CB +SPHERE CENTER 11.154000 16.283001 17.922001 RAD 1.0 SG +SPHERE CENTER 13.828000 18.788000 16.528999 RAD 1.0 N +SPHERE CENTER 15.222000 18.386999 16.261999 RAD 1.0 CA +SPHERE CENTER 15.644000 18.605000 14.798000 RAD 1.0 C +SPHERE CENTER 16.306000 17.708000 14.224000 RAD 1.0 O +SPHERE CENTER 15.486000 16.941000 16.719000 RAD 1.0 CB +SPHERE CENTER 14.949000 16.624001 18.146999 RAD 1.0 CG +SPHERE CENTER 15.484000 17.593000 19.195000 RAD 1.0 CD +SPHERE CENTER 15.081000 17.068001 20.497000 RAD 1.0 NE +SPHERE CENTER 15.268000 17.830999 21.573999 RAD 1.0 CZ +SPHERE CENTER 15.870000 19.020000 21.452999 RAD 1.0 NH1 +SPHERE CENTER 14.930000 17.320999 22.753000 RAD 1.0 NH2 +SPHERE CENTER 15.154000 19.670000 14.180000 RAD 1.0 N +SPHERE CENTER 15.461000 19.893999 12.733000 RAD 1.0 CA +SPHERE CENTER 16.969000 19.924000 12.482000 RAD 1.0 C +SPHERE CENTER 17.752001 20.431000 13.327000 RAD 1.0 O +SPHERE CENTER 14.918000 21.275000 12.366000 RAD 1.0 CB +SPHERE CENTER 17.282000 19.622000 11.271000 RAD 1.0 N +SPHERE CENTER 18.584999 19.886999 10.687000 RAD 1.0 CA +SPHERE CENTER 18.461000 21.087000 9.753000 RAD 1.0 C +SPHERE CENTER 17.371000 21.708000 9.790000 RAD 1.0 O +SPHERE CENTER 18.961000 18.612000 9.934000 RAD 1.0 CB +SPHERE CENTER 19.486000 17.514999 10.843000 RAD 1.0 CG +SPHERE CENTER 20.042999 16.424999 9.926000 RAD 1.0 CD +SPHERE CENTER 20.782000 15.386000 10.779000 RAD 1.0 CE +SPHERE CENTER 20.985001 14.137000 10.021000 RAD 1.0 NZ +SPHERE CENTER 19.577000 21.643999 9.215000 RAD 1.0 N +SPHERE CENTER 19.570999 22.903000 8.543000 RAD 1.0 CA +SPHERE CENTER 18.898001 22.847000 7.144000 RAD 1.0 C +SPHERE CENTER 18.476000 23.930000 6.690000 RAD 1.0 O +SPHERE CENTER 20.981001 23.469999 8.429000 RAD 1.0 CB +SPHERE CENTER 21.461000 24.047001 9.786000 RAD 1.0 CG +SPHERE CENTER 22.614000 25.047001 9.608000 RAD 1.0 CD +SPHERE CENTER 22.118999 26.403999 9.384000 RAD 1.0 NE +SPHERE CENTER 22.948000 27.426001 9.370000 RAD 1.0 CZ +SPHERE CENTER 24.253000 27.187000 9.415000 RAD 1.0 NH1 +SPHERE CENTER 22.472000 28.634001 9.297000 RAD 1.0 NH2 +SPHERE CENTER 18.870001 21.715000 6.474000 RAD 1.0 N +SPHERE CENTER 18.209999 21.712999 5.169000 RAD 1.0 CA +SPHERE CENTER 16.671000 21.559000 5.372000 RAD 1.0 C +SPHERE CENTER 16.068001 20.466000 5.197000 RAD 1.0 O +SPHERE CENTER 18.745001 20.506001 4.379000 RAD 1.0 CB +SPHERE CENTER 18.295000 20.591999 2.909000 RAD 1.0 CG +SPHERE CENTER 17.721001 21.629000 2.499000 RAD 1.0 OD1 +SPHERE CENTER 18.664000 19.563999 2.134000 RAD 1.0 ND2 +SPHERE CENTER 16.097000 22.643000 5.820000 RAD 1.0 N +SPHERE CENTER 14.676000 22.662001 6.349000 RAD 1.0 CA +SPHERE CENTER 14.157000 24.101999 6.384000 RAD 1.0 C +SPHERE CENTER 14.715000 24.959000 7.120000 RAD 1.0 O +SPHERE CENTER 14.577000 21.951000 7.736000 RAD 1.0 CB +SPHERE CENTER 13.128000 21.861000 8.301000 RAD 1.0 CG +SPHERE CENTER 12.432000 22.889000 8.208000 RAD 1.0 OD1 +SPHERE CENTER 12.975000 21.035000 9.288000 RAD 1.0 ND2 +SPHERE CENTER 13.324000 24.438000 5.381000 RAD 1.0 N +SPHERE CENTER 12.918000 25.816999 5.120000 RAD 1.0 CA +SPHERE CENTER 11.388000 25.961000 5.164000 RAD 1.0 C +SPHERE CENTER 10.669000 24.966000 4.915000 RAD 1.0 O +SPHERE CENTER 13.372000 26.372999 3.741000 RAD 1.0 CB +SPHERE CENTER 14.913000 26.191999 3.701000 RAD 1.0 CG +SPHERE CENTER 15.492000 25.002001 3.268000 RAD 1.0 CD1 +SPHERE CENTER 15.705000 27.252001 4.053000 RAD 1.0 CD2 +SPHERE CENTER 16.877001 24.881001 3.132000 RAD 1.0 CE1 +SPHERE CENTER 17.108999 27.125999 3.941000 RAD 1.0 CE2 +SPHERE CENTER 17.659000 25.957001 3.487000 RAD 1.0 CZ +SPHERE CENTER 10.949000 27.146999 5.460000 RAD 1.0 N +SPHERE CENTER 9.480000 27.343000 5.498000 RAD 1.0 CA +SPHERE CENTER 8.875000 27.670000 4.157000 RAD 1.0 C +SPHERE CENTER 7.634000 27.622999 4.057000 RAD 1.0 O +SPHERE CENTER 9.045000 28.475000 6.433000 RAD 1.0 CB +SPHERE CENTER 9.258000 27.945999 7.875000 RAD 1.0 CG +SPHERE CENTER 9.119000 29.052000 8.948000 RAD 1.0 CD +SPHERE CENTER 10.025000 28.736000 10.167000 RAD 1.0 CE +SPHERE CENTER 9.826000 29.728001 11.231000 RAD 1.0 NZ +SPHERE CENTER 9.687000 27.909000 3.152000 RAD 1.0 N +SPHERE CENTER 9.124000 28.167999 1.840000 RAD 1.0 CA +SPHERE CENTER 10.108000 27.719000 0.765000 RAD 1.0 C +SPHERE CENTER 11.332000 27.660000 1.047000 RAD 1.0 O +SPHERE CENTER 8.778000 29.648001 1.642000 RAD 1.0 CB +SPHERE CENTER 10.000000 30.391001 1.484000 RAD 1.0 OG +SPHERE CENTER 9.604000 27.471001 -0.422000 RAD 1.0 N +SPHERE CENTER 10.526000 27.160999 -1.512000 RAD 1.0 CA +SPHERE CENTER 11.423000 28.346001 -1.863000 RAD 1.0 C +SPHERE CENTER 12.634000 28.115000 -2.136000 RAD 1.0 O +SPHERE CENTER 9.782000 26.679001 -2.783000 RAD 1.0 CB +SPHERE CENTER 10.966000 29.570000 -1.682000 RAD 1.0 N +SPHERE CENTER 11.751000 30.764000 -1.998000 RAD 1.0 CA +SPHERE CENTER 12.900000 30.964001 -1.040000 RAD 1.0 C +SPHERE CENTER 14.032000 31.282000 -1.463000 RAD 1.0 O +SPHERE CENTER 10.871000 32.021999 -2.024000 RAD 1.0 CB +SPHERE CENTER 9.868000 32.069000 -3.200000 RAD 1.0 CG +SPHERE CENTER 8.525000 31.417000 -2.847000 RAD 1.0 CD +SPHERE CENTER 7.573000 31.562000 -3.638000 RAD 1.0 OE1 +SPHERE CENTER 8.368000 30.636999 -1.865000 RAD 1.0 OE2 +SPHERE CENTER 12.658000 30.686001 0.225000 RAD 1.0 N +SPHERE CENTER 13.804000 30.775000 1.163000 RAD 1.0 CA +SPHERE CENTER 14.824000 29.667000 0.941000 RAD 1.0 C +SPHERE CENTER 16.058001 29.903999 1.049000 RAD 1.0 O +SPHERE CENTER 13.347000 30.500000 2.601000 RAD 1.0 CB +SPHERE CENTER 12.813000 31.775999 3.236000 RAD 1.0 CG +SPHERE CENTER 12.716000 32.875000 2.613000 RAD 1.0 OD1 +SPHERE CENTER 12.096000 31.598000 4.247000 RAD 1.0 OD2 +SPHERE CENTER 14.305000 28.478001 0.644000 RAD 1.0 N +SPHERE CENTER 15.128000 27.301001 0.379000 RAD 1.0 CA +SPHERE CENTER 16.006001 27.523001 -0.852000 RAD 1.0 C +SPHERE CENTER 17.247999 27.267000 -0.809000 RAD 1.0 O +SPHERE CENTER 14.238000 26.045000 0.259000 RAD 1.0 CB +SPHERE CENTER 15.047000 24.530001 -0.176000 RAD 1.0 SG +SPHERE CENTER 15.384000 28.062000 -1.870000 RAD 1.0 N +SPHERE CENTER 16.191999 28.302000 -3.048000 RAD 1.0 CA +SPHERE CENTER 17.171000 29.452999 -2.841000 RAD 1.0 C +SPHERE CENTER 18.246000 29.474001 -3.490000 RAD 1.0 O +SPHERE CENTER 15.267000 28.570999 -4.266000 RAD 1.0 CB +SPHERE CENTER 14.634000 27.261000 -4.708000 RAD 1.0 CG +SPHERE CENTER 15.759000 25.962000 -5.253000 RAD 1.0 SD +SPHERE CENTER 16.306999 26.625000 -6.805000 RAD 1.0 CE +SPHERE CENTER 16.775999 30.469999 -2.099000 RAD 1.0 N +SPHERE CENTER 17.652000 31.617001 -1.869000 RAD 1.0 CA +SPHERE CENTER 18.910000 31.125999 -1.141000 RAD 1.0 C +SPHERE CENTER 20.049999 31.469999 -1.556000 RAD 1.0 O +SPHERE CENTER 16.934000 32.595001 -0.930000 RAD 1.0 CB +SPHERE CENTER 17.721001 33.839001 -0.540000 RAD 1.0 CG +SPHERE CENTER 16.740999 35.039001 -0.291000 RAD 1.0 CD +SPHERE CENTER 15.472000 34.667999 0.404000 RAD 1.0 NE +SPHERE CENTER 14.256000 34.889999 -0.074000 RAD 1.0 CZ +SPHERE CENTER 13.983000 35.465000 -1.233000 RAD 1.0 NH1 +SPHERE CENTER 13.260000 34.542999 0.660000 RAD 1.0 NH2 +SPHERE CENTER 18.726999 30.198999 -0.237000 RAD 1.0 N +SPHERE CENTER 19.889999 29.693001 0.496000 RAD 1.0 CA +SPHERE CENTER 20.636999 28.649000 -0.297000 RAD 1.0 C +SPHERE CENTER 21.871000 28.686001 -0.287000 RAD 1.0 O +SPHERE CENTER 19.416000 29.106001 1.823000 RAD 1.0 CB +SPHERE CENTER 18.643999 30.132000 2.537000 RAD 1.0 OG1 +SPHERE CENTER 20.615999 28.506001 2.662000 RAD 1.0 CG2 +SPHERE CENTER 19.988001 27.747000 -0.961000 RAD 1.0 N +SPHERE CENTER 20.669001 26.563999 -1.471000 RAD 1.0 CA +SPHERE CENTER 20.773001 26.534000 -2.963000 RAD 1.0 C +SPHERE CENTER 21.341000 25.552999 -3.498000 RAD 1.0 O +SPHERE CENTER 19.955999 25.260000 -1.056000 RAD 1.0 CB +SPHERE CENTER 20.128000 24.914000 0.713000 RAD 1.0 SG +SPHERE CENTER 20.132000 27.441999 -3.608000 RAD 1.0 N +SPHERE CENTER 19.987000 27.268000 -5.071000 RAD 1.0 CA +SPHERE CENTER 21.257000 27.575001 -5.849000 RAD 1.0 C +SPHERE CENTER 21.386000 27.129000 -7.018000 RAD 1.0 O +SPHERE CENTER 22.225000 28.049999 -5.113000 RAD 1.0 N +SPHERE CENTER 23.639000 28.131001 -5.505000 RAD 1.0 CA +SPHERE CENTER 23.886999 29.393000 -6.316000 RAD 1.0 C +SPHERE CENTER 22.948999 30.065001 -6.822000 RAD 1.0 O +SPHERE CENTER 25.146000 29.681000 -6.493000 RAD 1.0 N +SPHERE CENTER 25.617001 30.840000 -7.256000 RAD 1.0 CA +SPHERE CENTER 25.247999 30.735001 -8.729000 RAD 1.0 C +SPHERE CENTER 24.962000 31.791000 -9.369000 RAD 1.0 O +SPHERE CENTER 27.160000 30.980000 -7.146000 RAD 1.0 CB +SPHERE CENTER 24.919001 29.594000 -9.172000 RAD 1.0 OXT + +PLANE + CENTER 0.0 -25.0 0.0 + NORMAL 0.0 1.0 0.0 + TEXTURE + AMBIENT 0.1 DIFFUSE 0.9 SPECULAR 0.0 OPACITY 1.0 + COLOR 1.0 1.0 1.0 + TEXFUNC 0 + +END_SCENE diff --git a/xdl/third_party/tbb/examples/parallel_for/tachyon/msvs/gui.ico b/xdl/third_party/tbb/examples/parallel_for/tachyon/msvs/gui.ico new file mode 100644 index 00000000..d551aa3a Binary files /dev/null and b/xdl/third_party/tbb/examples/parallel_for/tachyon/msvs/gui.ico differ diff --git a/xdl/third_party/tbb/examples/parallel_for/tachyon/msvs/gui.rc b/xdl/third_party/tbb/examples/parallel_for/tachyon/msvs/gui.rc new file mode 100644 index 00000000..5a13d046 --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/tachyon/msvs/gui.rc @@ -0,0 +1,90 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#define APSTUDIO_HIDDEN_SYMBOLS +#include "windows.h" +#undef APSTUDIO_HIDDEN_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_GUI ICON "gui.ico" +IDI_SMALL ICON "small.ico" + + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#define APSTUDIO_HIDDEN_SYMBOLS\r\n" + "#include ""windows.h""\r\n" + "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE +BEGIN + IDS_APP_TITLE "gui" + IDC_GUI "GUI" +END + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/xdl/third_party/tbb/examples/parallel_for/tachyon/msvs/resource.h b/xdl/third_party/tbb/examples/parallel_for/tachyon/msvs/resource.h new file mode 100644 index 00000000..4c49a395 --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/tachyon/msvs/resource.h @@ -0,0 +1,28 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +#define IDC_MYICON 2 +#define IDD_GUI 102 +#define IDS_APP_TITLE 103 +#define IDI_GUI 107 +#define IDI_SMALL 108 +#define IDC_GUI 109 +#define IDR_MAINFRAME 128 +#define IDC_STATIC -1 diff --git a/xdl/third_party/tbb/examples/parallel_for/tachyon/msvs/small.ico b/xdl/third_party/tbb/examples/parallel_for/tachyon/msvs/small.ico new file mode 100644 index 00000000..d551aa3a Binary files /dev/null and b/xdl/third_party/tbb/examples/parallel_for/tachyon/msvs/small.ico differ diff --git a/xdl/third_party/tbb/examples/parallel_for/tachyon/msvs/tachyon.serial.vcxproj b/xdl/third_party/tbb/examples/parallel_for/tachyon/msvs/tachyon.serial.vcxproj new file mode 100644 index 00000000..1969c6d6 --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/tachyon/msvs/tachyon.serial.vcxproj @@ -0,0 +1,393 @@ + + + + + DDDebug + Win32 + + + DDDebug + x64 + + + DDRelease + Win32 + + + DDRelease + x64 + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {924517DF-2B6A-47D5-8A11-CC047CC4D8E9} + tachyon.serial + Win32Proj + + + + + Application + MultiByte + v120 + + + Application + MultiByte + true + true + v120 + + + Application + MultiByte + true + true + v120 + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + Application + MultiByte + true + true + v120 + + + Application + MultiByte + true + true + v120 + + + Application + MultiByte + v120 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.40219.1 + $(TEMP)\tbb_examples\$(Platform)\$(Configuration)\serial\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Platform)\$(Configuration)\serial\ + false + $(TEMP)\tbb_examples\$(Platform)\$(Configuration)\serial\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Platform)\$(Configuration)\serial\ + false + $(TEMP)\tbb_examples\$(Platform)\$(Configuration)\serial\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Platform)\$(Configuration)\serial\ + false + $(TEMP)\tbb_examples\$(Platform)\$(Configuration)\serial\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Platform)\$(Configuration)\serial\ + false + $(TEMP)\tbb_examples\$(Platform)\$(Configuration)\serial\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Platform)\$(Configuration)\serial\ + false + $(TEMP)\tbb_examples\$(Platform)\$(Configuration)\serial\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Platform)\$(Configuration)\serial\ + false + $(TEMP)\tbb_examples\$(Platform)\$(Configuration)\serial\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Platform)\$(Configuration)\serial\ + false + $(TEMP)\tbb_examples\$(Platform)\$(Configuration)\serial\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Platform)\$(Configuration)\serial\ + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + true + Speed + true + false + WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebugDLL + StreamingSIMDExtensions2 + + + $(IntDir)%(Filename).pdb + Level2 + ProgramDatabase + + + true + Windows + UseLinkTimeCodeGeneration + MachineX86 + false + + + + + X64 + + + Disabled + true + Speed + true + false + WIN64;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebugDLL + + + $(IntDir)%(Filename).pdb + Level2 + ProgramDatabase + + + true + Windows + UseLinkTimeCodeGeneration + MachineX64 + false + + + + + true + Speed + true + true + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + MultiThreadedDLL + StreamingSIMDExtensions2 + + + $(IntDir)%(Filename).pdb + Level2 + ProgramDatabase + + + true + Windows + true + true + MachineX86 + false + + + + + X64 + + + true + Speed + true + true + WIN64;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + MultiThreadedDLL + + + $(IntDir)%(Filename).pdb + Level2 + ProgramDatabase + + + true + Windows + true + true + MachineX64 + false + + + + + true + Speed + true + true + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + MultiThreadedDLL + StreamingSIMDExtensions2 + + + $(IntDir)%(Filename).pdb + Level2 + ProgramDatabase + + + $(DXSDK_DIR)\lib\x86;%(AdditionalLibraryDirectories) + true + Windows + true + true + MachineX86 + false + + + + + X64 + + + true + Speed + true + true + WIN64;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + MultiThreadedDLL + + + $(IntDir)%(Filename).pdb + Level2 + ProgramDatabase + + + $(DXSDK_DIR)\lib\x64;%(AdditionalLibraryDirectories) + true + Windows + true + true + MachineX64 + false + + + + + Disabled + true + Speed + true + false + WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebugDLL + StreamingSIMDExtensions2 + + + $(IntDir)%(Filename).pdb + Level2 + ProgramDatabase + + + $(DXSDK_DIR)\lib\x86;%(AdditionalLibraryDirectories) + true + Windows + UseLinkTimeCodeGeneration + MachineX86 + false + + + + + X64 + + + Disabled + true + Speed + true + false + WIN64;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebugDLL + + + $(IntDir)%(Filename).pdb + Level2 + ProgramDatabase + + + $(DXSDK_DIR)\lib\x64;%(AdditionalLibraryDirectories) + true + Windows + UseLinkTimeCodeGeneration + MachineX64 + false + + + + + {924517df-2b6a-47d5-8a11-cc247cc4d810} + false + false + true + + + + + + + + + \ No newline at end of file diff --git a/xdl/third_party/tbb/examples/parallel_for/tachyon/msvs/tachyon.sln b/xdl/third_party/tbb/examples/parallel_for/tachyon/msvs/tachyon.sln new file mode 100644 index 00000000..86122734 --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/tachyon/msvs/tachyon.sln @@ -0,0 +1,94 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.40629.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tachyon.tbb", "tachyon.tbb.vcxproj", "{6E9B1702-78E0-4D64-B771-8B274D963B58}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tachyon.common", "tachyon.vcxproj", "{924517DF-2B6A-47D5-8A11-CC247CC4D810}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tachyon.serial", "tachyon.serial.vcxproj", "{924517DF-2B6A-47D5-8A11-CC047CC4D8E9}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tachyon.tbb1d", "tachyon.tbb1d.vcxproj", "{924517DF-2B6A-47D5-8A11-CC347CC4D8E9}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + _GDI Release|Win32 = _GDI Release|Win32 + _GDI Release|x64 = _GDI Release|x64 + DD Debug|Win32 = DD Debug|Win32 + DD Debug|x64 = DD Debug|x64 + DD Release|Win32 = DD Release|Win32 + DD Release|x64 = DD Release|x64 + GDI Debug|Win32 = GDI Debug|Win32 + GDI Debug|x64 = GDI Debug|x64 + Description = Tachyon ray-tracer example + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {6E9B1702-78E0-4D64-B771-8B274D963B58}._GDI Release|Win32.ActiveCfg = Release|Win32 + {6E9B1702-78E0-4D64-B771-8B274D963B58}._GDI Release|Win32.Build.0 = Release|Win32 + {6E9B1702-78E0-4D64-B771-8B274D963B58}._GDI Release|x64.ActiveCfg = Release|x64 + {6E9B1702-78E0-4D64-B771-8B274D963B58}._GDI Release|x64.Build.0 = Release|x64 + {6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Debug|Win32.ActiveCfg = DDDebug|Win32 + {6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Debug|Win32.Build.0 = DDDebug|Win32 + {6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Debug|x64.ActiveCfg = DDDebug|x64 + {6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Debug|x64.Build.0 = DDDebug|x64 + {6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Release|Win32.ActiveCfg = DDRelease|Win32 + {6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Release|Win32.Build.0 = DDRelease|Win32 + {6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Release|x64.ActiveCfg = DDRelease|x64 + {6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Release|x64.Build.0 = DDRelease|x64 + {6E9B1702-78E0-4D64-B771-8B274D963B58}.GDI Debug|Win32.ActiveCfg = Debug|Win32 + {6E9B1702-78E0-4D64-B771-8B274D963B58}.GDI Debug|Win32.Build.0 = Debug|Win32 + {6E9B1702-78E0-4D64-B771-8B274D963B58}.GDI Debug|x64.ActiveCfg = Debug|x64 + {6E9B1702-78E0-4D64-B771-8B274D963B58}.GDI Debug|x64.Build.0 = Debug|x64 + {924517DF-2B6A-47D5-8A11-CC247CC4D810}._GDI Release|Win32.ActiveCfg = Release|Win32 + {924517DF-2B6A-47D5-8A11-CC247CC4D810}._GDI Release|Win32.Build.0 = Release|Win32 + {924517DF-2B6A-47D5-8A11-CC247CC4D810}._GDI Release|x64.ActiveCfg = Release|x64 + {924517DF-2B6A-47D5-8A11-CC247CC4D810}._GDI Release|x64.Build.0 = Release|x64 + {924517DF-2B6A-47D5-8A11-CC247CC4D810}.DD Debug|Win32.ActiveCfg = DDDebug|Win32 + {924517DF-2B6A-47D5-8A11-CC247CC4D810}.DD Debug|Win32.Build.0 = DDDebug|Win32 + {924517DF-2B6A-47D5-8A11-CC247CC4D810}.DD Debug|x64.ActiveCfg = DDDebug|x64 + {924517DF-2B6A-47D5-8A11-CC247CC4D810}.DD Debug|x64.Build.0 = DDDebug|x64 + {924517DF-2B6A-47D5-8A11-CC247CC4D810}.DD Release|Win32.ActiveCfg = DDRelease|Win32 + {924517DF-2B6A-47D5-8A11-CC247CC4D810}.DD Release|Win32.Build.0 = DDRelease|Win32 + {924517DF-2B6A-47D5-8A11-CC247CC4D810}.DD Release|x64.ActiveCfg = DDRelease|x64 + {924517DF-2B6A-47D5-8A11-CC247CC4D810}.DD Release|x64.Build.0 = DDRelease|x64 + {924517DF-2B6A-47D5-8A11-CC247CC4D810}.GDI Debug|Win32.ActiveCfg = Debug|Win32 + {924517DF-2B6A-47D5-8A11-CC247CC4D810}.GDI Debug|Win32.Build.0 = Debug|Win32 + {924517DF-2B6A-47D5-8A11-CC247CC4D810}.GDI Debug|x64.ActiveCfg = Debug|x64 + {924517DF-2B6A-47D5-8A11-CC247CC4D810}.GDI Debug|x64.Build.0 = Debug|x64 + {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}._GDI Release|Win32.ActiveCfg = Release|Win32 + {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}._GDI Release|Win32.Build.0 = Release|Win32 + {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}._GDI Release|x64.ActiveCfg = Release|x64 + {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}._GDI Release|x64.Build.0 = Release|x64 + {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.DD Debug|Win32.ActiveCfg = DDDebug|Win32 + {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.DD Debug|Win32.Build.0 = DDDebug|Win32 + {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.DD Debug|x64.ActiveCfg = DDDebug|x64 + {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.DD Debug|x64.Build.0 = DDDebug|x64 + {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.DD Release|Win32.ActiveCfg = DDRelease|Win32 + {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.DD Release|Win32.Build.0 = DDRelease|Win32 + {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.DD Release|x64.ActiveCfg = DDRelease|x64 + {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.DD Release|x64.Build.0 = DDRelease|x64 + {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.GDI Debug|Win32.ActiveCfg = Debug|Win32 + {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.GDI Debug|Win32.Build.0 = Debug|Win32 + {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.GDI Debug|x64.ActiveCfg = Debug|x64 + {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.GDI Debug|x64.Build.0 = Debug|x64 + {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}._GDI Release|Win32.ActiveCfg = Release|Win32 + {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}._GDI Release|Win32.Build.0 = Release|Win32 + {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}._GDI Release|x64.ActiveCfg = Release|x64 + {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}._GDI Release|x64.Build.0 = Release|x64 + {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.DD Debug|Win32.ActiveCfg = DDDebug|Win32 + {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.DD Debug|Win32.Build.0 = DDDebug|Win32 + {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.DD Debug|x64.ActiveCfg = DDDebug|x64 + {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.DD Debug|x64.Build.0 = DDDebug|x64 + {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.DD Release|Win32.ActiveCfg = DDRelease|Win32 + {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.DD Release|Win32.Build.0 = DDRelease|Win32 + {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.DD Release|x64.ActiveCfg = DDRelease|x64 + {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.DD Release|x64.Build.0 = DDRelease|x64 + {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.GDI Debug|Win32.ActiveCfg = Debug|Win32 + {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.GDI Debug|Win32.Build.0 = Debug|Win32 + {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.GDI Debug|x64.ActiveCfg = Debug|x64 + {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.GDI Debug|x64.Build.0 = Debug|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/xdl/third_party/tbb/examples/parallel_for/tachyon/msvs/tachyon.tbb.vcxproj b/xdl/third_party/tbb/examples/parallel_for/tachyon/msvs/tachyon.tbb.vcxproj new file mode 100644 index 00000000..2e7881ea --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/tachyon/msvs/tachyon.tbb.vcxproj @@ -0,0 +1,445 @@ + + + + + DDDebug + Win32 + + + DDDebug + x64 + + + DDRelease + Win32 + + + DDRelease + x64 + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {6E9B1702-78E0-4D64-B771-8B274D963B58} + tachyon.tbb + Win32Proj + + + + + Application + MultiByte + v120 + + + Application + MultiByte + true + true + v120 + + + Application + MultiByte + true + true + v120 + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + Application + MultiByte + true + true + v120 + + + Application + MultiByte + true + true + v120 + + + Application + MultiByte + v120 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.40219.1 + $(TEMP)\tbb_examples\$(Platform)\$(Configuration)\tbb\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Platform)\$(Configuration)\tbb\ + false + $(TEMP)\tbb_examples\$(Platform)\$(Configuration)\tbb\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Platform)\$(Configuration)\tbb\ + false + $(TEMP)\tbb_examples\$(Platform)\$(Configuration)\tbb\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Platform)\$(Configuration)\tbb\ + false + $(TEMP)\tbb_examples\$(Platform)\$(Configuration)\tbb\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Platform)\$(Configuration)\tbb\ + false + $(TEMP)\tbb_examples\$(Platform)\$(Configuration)\tbb\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Platform)\$(Configuration)\tbb\ + false + $(TEMP)\tbb_examples\$(Platform)\$(Configuration)\tbb\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Platform)\$(Configuration)\tbb\ + false + $(TEMP)\tbb_examples\$(Platform)\$(Configuration)\tbb\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Platform)\$(Configuration)\tbb\ + false + $(TEMP)\tbb_examples\$(Platform)\$(Configuration)\tbb\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Platform)\$(Configuration)\tbb\ + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + true + Speed + true + false + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + TBB_USE_DEBUG;_CRT_SECURE_NO_DEPRECATE;WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebugDLL + StreamingSIMDExtensions2 + + + $(IntDir)%(Filename).pdb + Level2 + ProgramDatabase + + + tbb_debug.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc12;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc12;%(AdditionalLibraryDirectories) + true + Windows + UseLinkTimeCodeGeneration + MachineX86 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 debug "$(OutDir)" + + + + + X64 + + + Disabled + true + Speed + true + false + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + TBB_USE_DEBUG;_CRT_SECURE_NO_DEPRECATE;WIN64;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebugDLL + + + $(IntDir)%(Filename).pdb + Level2 + ProgramDatabase + + + tbb_debug.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc12;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc12;%(AdditionalLibraryDirectories) + true + Windows + UseLinkTimeCodeGeneration + MachineX64 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 debug "$(OutDir)" + + + + + true + Speed + true + true + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_DEPRECATE;WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + MultiThreadedDLL + StreamingSIMDExtensions2 + + + $(IntDir)%(Filename).pdb + Level2 + ProgramDatabase + + + tbb.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc12;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc12;%(AdditionalLibraryDirectories) + true + Windows + true + true + MachineX86 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 release "$(OutDir)" + + + + + X64 + + + true + Speed + true + true + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_DEPRECATE;WIN64;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + MultiThreadedDLL + + + $(IntDir)%(Filename).pdb + Level2 + ProgramDatabase + + + tbb.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc12;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc12;%(AdditionalLibraryDirectories) + true + Windows + true + true + MachineX64 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 release "$(OutDir)" + + + + + true + Speed + true + true + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_DEPRECATE;WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + MultiThreadedDLL + StreamingSIMDExtensions2 + + + $(IntDir)%(Filename).pdb + Level2 + ProgramDatabase + + + tbb.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc12;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc12;$(DXSDK_DIR)\lib\x86;%(AdditionalLibraryDirectories) + true + Windows + true + true + MachineX86 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 release "$(OutDir)" + + + + + X64 + + + true + Speed + true + true + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_DEPRECATE;WIN64;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + MultiThreadedDLL + + + $(IntDir)%(Filename).pdb + Level2 + ProgramDatabase + + + tbb.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc12;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc12;$(DXSDK_DIR)\lib\x64;%(AdditionalLibraryDirectories) + true + Windows + true + true + MachineX64 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 release "$(OutDir)" + + + + + Disabled + true + Speed + true + false + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + TBB_USE_DEBUG;_CRT_SECURE_NO_DEPRECATE;WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebugDLL + StreamingSIMDExtensions2 + + + $(IntDir)%(Filename).pdb + Level2 + ProgramDatabase + + + tbb_debug.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc12;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc12;$(DXSDK_DIR)\lib\x86;%(AdditionalLibraryDirectories) + true + Windows + UseLinkTimeCodeGeneration + MachineX86 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 debug "$(OutDir)" + + + + + X64 + + + Disabled + true + Speed + true + false + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + TBB_USE_DEBUG;_CRT_SECURE_NO_DEPRECATE;WIN64;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebugDLL + + + $(IntDir)%(Filename).pdb + Level2 + ProgramDatabase + + + tbb_debug.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc12;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc12;$(DXSDK_DIR)\lib\x64;%(AdditionalLibraryDirectories) + true + Windows + UseLinkTimeCodeGeneration + MachineX64 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 debug "$(OutDir)" + + + + + {924517df-2b6a-47d5-8a11-cc247cc4d810} + false + false + true + + + + + + + + + \ No newline at end of file diff --git a/xdl/third_party/tbb/examples/parallel_for/tachyon/msvs/tachyon.tbb1d.vcxproj b/xdl/third_party/tbb/examples/parallel_for/tachyon/msvs/tachyon.tbb1d.vcxproj new file mode 100644 index 00000000..36106dee --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/tachyon/msvs/tachyon.tbb1d.vcxproj @@ -0,0 +1,445 @@ + + + + + DDDebug + Win32 + + + DDDebug + x64 + + + DDRelease + Win32 + + + DDRelease + x64 + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {924517DF-2B6A-47D5-8A11-CC347CC4D8E9} + tachyon.tbb1d + Win32Proj + + + + + Application + MultiByte + v120 + + + Application + MultiByte + true + true + v120 + + + Application + MultiByte + true + true + v120 + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + Application + MultiByte + true + true + v120 + + + Application + MultiByte + true + true + v120 + + + Application + MultiByte + v120 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.40219.1 + $(TEMP)\tbb_examples\$(Platform)\$(Configuration)\tbb1d\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Platform)\$(Configuration)\tbb1d\ + false + $(TEMP)\tbb_examples\$(Platform)\$(Configuration)\tbb1d\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Platform)\$(Configuration)\tbb1d\ + false + $(TEMP)\tbb_examples\$(Platform)\$(Configuration)\tbb1d\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Platform)\$(Configuration)\tbb1d\ + false + $(TEMP)\tbb_examples\$(Platform)\$(Configuration)\tbb1d\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Platform)\$(Configuration)\tbb1d\ + false + $(TEMP)\tbb_examples\$(Platform)\$(Configuration)\tbb1d\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Platform)\$(Configuration)\tbb1d\ + false + $(TEMP)\tbb_examples\$(Platform)\$(Configuration)\tbb1d\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Platform)\$(Configuration)\tbb1d\ + false + $(TEMP)\tbb_examples\$(Platform)\$(Configuration)\tbb1d\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Platform)\$(Configuration)\tbb1d\ + false + $(TEMP)\tbb_examples\$(Platform)\$(Configuration)\tbb1d\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Platform)\$(Configuration)\tbb1d\ + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + true + Speed + true + false + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + TBB_USE_DEBUG;_CRT_SECURE_NO_DEPRECATE;WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebugDLL + StreamingSIMDExtensions2 + + + $(IntDir)%(Filename).pdb + Level2 + ProgramDatabase + + + tbb_debug.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc12;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc12;%(AdditionalLibraryDirectories) + true + Windows + UseLinkTimeCodeGeneration + MachineX86 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 debug "$(OutDir)" + + + + + X64 + + + Disabled + true + Speed + true + false + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + TBB_USE_DEBUG;_CRT_SECURE_NO_DEPRECATE;WIN64;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebugDLL + + + $(IntDir)%(Filename).pdb + Level2 + ProgramDatabase + + + tbb_debug.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc12;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc12;%(AdditionalLibraryDirectories) + true + Windows + UseLinkTimeCodeGeneration + MachineX64 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 debug "$(OutDir)" + + + + + true + Speed + true + true + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_DEPRECATE;WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + MultiThreadedDLL + StreamingSIMDExtensions2 + + + $(IntDir)%(Filename).pdb + Level2 + ProgramDatabase + + + tbb.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc12;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc12;%(AdditionalLibraryDirectories) + true + Windows + true + true + MachineX86 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 release "$(OutDir)" + + + + + X64 + + + true + Speed + true + true + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_DEPRECATE;WIN64;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + MultiThreadedDLL + + + $(IntDir)%(Filename).pdb + Level2 + ProgramDatabase + + + tbb.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc12;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc12;%(AdditionalLibraryDirectories) + true + Windows + true + true + MachineX64 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 release "$(OutDir)" + + + + + true + Speed + true + true + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_DEPRECATE;WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + MultiThreadedDLL + StreamingSIMDExtensions2 + + + $(IntDir)%(Filename).pdb + Level2 + ProgramDatabase + + + tbb.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc12;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc12;$(DXSDK_DIR)\lib\x86;%(AdditionalLibraryDirectories) + true + Windows + true + true + MachineX86 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 release "$(OutDir)" + + + + + X64 + + + true + Speed + true + true + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_DEPRECATE;WIN64;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + MultiThreadedDLL + + + $(IntDir)%(Filename).pdb + Level2 + ProgramDatabase + + + tbb.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc12;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc12;$(DXSDK_DIR)\lib\x64;%(AdditionalLibraryDirectories) + true + Windows + true + true + MachineX64 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 release "$(OutDir)" + + + + + Disabled + true + Speed + true + false + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + TBB_USE_DEBUG;_CRT_SECURE_NO_DEPRECATE;WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebugDLL + StreamingSIMDExtensions2 + + + $(IntDir)%(Filename).pdb + Level2 + ProgramDatabase + + + tbb_debug.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc12;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc12;$(DXSDK_DIR)\lib\x86;%(AdditionalLibraryDirectories) + true + Windows + UseLinkTimeCodeGeneration + MachineX86 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 debug "$(OutDir)" + + + + + X64 + + + Disabled + true + Speed + true + false + $(TBBROOT)\include;$(SolutionDir)\..\..\..\..\include;%(AdditionalIncludeDirectories) + TBB_USE_DEBUG;_CRT_SECURE_NO_DEPRECATE;WIN64;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebugDLL + + + $(IntDir)%(Filename).pdb + Level2 + ProgramDatabase + + + tbb_debug.lib;%(AdditionalDependencies) + $(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc12;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc12;$(DXSDK_DIR)\lib\x64;%(AdditionalLibraryDirectories) + true + Windows + UseLinkTimeCodeGeneration + MachineX64 + false + + + Copying DLLs and PDBs + call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 debug "$(OutDir)" + + + + + {924517df-2b6a-47d5-8a11-cc247cc4d810} + false + false + true + + + + + + + + + \ No newline at end of file diff --git a/xdl/third_party/tbb/examples/parallel_for/tachyon/msvs/tachyon.vcxproj b/xdl/third_party/tbb/examples/parallel_for/tachyon/msvs/tachyon.vcxproj new file mode 100644 index 00000000..21502b24 --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/tachyon/msvs/tachyon.vcxproj @@ -0,0 +1,455 @@ + + + + + DDDebug + Win32 + + + DDDebug + x64 + + + DDRelease + Win32 + + + DDRelease + x64 + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + tachyon.common + {924517DF-2B6A-47D5-8A11-CC247CC4D810} + tachyon.common + Win32Proj + + + + + StaticLibrary + MultiByte + false + v120 + + + StaticLibrary + MultiByte + true + true + v120 + + + StaticLibrary + MultiByte + true + true + v120 + + + StaticLibrary + MultiByte + false + v120 + + + StaticLibrary + MultiByte + false + v120 + + + StaticLibrary + MultiByte + true + true + v120 + + + StaticLibrary + MultiByte + true + true + v120 + + + StaticLibrary + MultiByte + false + v120 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.40219.1 + $(TEMP)\tbb_examples\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Configuration)\ + $(TEMP)\tbb_examples\$(Platform)\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Platform)\$(Configuration)\ + $(TEMP)\tbb_examples\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Configuration)\ + $(TEMP)\tbb_examples\$(Platform)\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Platform)\$(Configuration)\ + $(TEMP)\tbb_examples\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Configuration)\ + $(TEMP)\tbb_examples\$(Platform)\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Platform)\$(Configuration)\ + $(TEMP)\tbb_examples\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Configuration)\ + $(TEMP)\tbb_examples\$(Platform)\$(Configuration)\ + $(TEMP)\tbb_examples\$(SolutionName)\$(Platform)\$(Configuration)\ + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + Speed + true + false + DEFAULT_MODELFILE=balls.dat;EMULATE_PTHREADS;WIN32;_WINDOWS;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebugDLL + true + StreamingSIMDExtensions2 + + + Level2 + ProgramDatabase + + + /MACHINE:X86 %(AdditionalOptions) + + + + + X64 + + + Disabled + Speed + true + false + DEFAULT_MODELFILE=balls.dat;EMULATE_PTHREADS;WIN64;_WINDOWS;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebugDLL + true + + + Level2 + ProgramDatabase + + + /MACHINE:X64 %(AdditionalOptions) + + + + + Speed + true + true + DEFAULT_MODELFILE=balls.dat;EMULATE_PTHREADS;WIN32;_WINDOWS;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions) + MultiThreadedDLL + true + StreamingSIMDExtensions2 + + + Level2 + ProgramDatabase + + + /MACHINE:X86 %(AdditionalOptions) + + + + + X64 + + + Speed + true + true + DEFAULT_MODELFILE=balls.dat;EMULATE_PTHREADS;WIN64;_WINDOWS;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level2 + ProgramDatabase + + + /MACHINE:X64 %(AdditionalOptions) + + + + + ..\..\..\common\gui\dxcheck.bat + + + Speed + true + true + DEFAULT_MODELFILE=balls.dat;EMULATE_PTHREADS;WIN32;_WINDOWS;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions) + MultiThreadedDLL + true + StreamingSIMDExtensions2 + + + Level2 + ProgramDatabase + + + /MACHINE:X86 %(AdditionalOptions) + + + + + ..\..\..\common\gui\dxcheck.bat + + + X64 + + + Speed + true + true + DEFAULT_MODELFILE=balls.dat;EMULATE_PTHREADS;WIN64;_WINDOWS;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level2 + ProgramDatabase + + + /MACHINE:X64 %(AdditionalOptions) + + + + + ..\..\..\common\gui\dxcheck.bat + + + Disabled + Speed + true + false + DEFAULT_MODELFILE=balls.dat;EMULATE_PTHREADS;WIN32;_WINDOWS;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebugDLL + true + StreamingSIMDExtensions2 + + + Level2 + ProgramDatabase + + + /MACHINE:X86 %(AdditionalOptions) + + + + + ..\..\..\common\gui\dxcheck.bat + + + X64 + + + Disabled + Speed + true + false + DEFAULT_MODELFILE=balls.dat;EMULATE_PTHREADS;WIN64;_WINDOWS;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebugDLL + true + + + Level2 + ProgramDatabase + + + /MACHINE:X64 %(AdditionalOptions) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $(DXSDK_DIR)\include;%(AdditionalIncludeDirectories) + _WINDOWS;_DEBUG + $(DXSDK_DIR)\include;%(AdditionalIncludeDirectories) + _WINDOWS;_DEBUG + $(DXSDK_DIR)\include;%(AdditionalIncludeDirectories) + _WINDOWS;NDEBUG + $(DXSDK_DIR)\include;%(AdditionalIncludeDirectories) + _WINDOWS;NDEBUG + true + true + true + true + + + true + true + true + true + _WINDOWS;_DEBUG + _WINDOWS;_DEBUG + _WINDOWS;NDEBUG + _WINDOWS;NDEBUG + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/xdl/third_party/tbb/examples/parallel_for/tachyon/msvs/win8ui/App.xaml b/xdl/third_party/tbb/examples/parallel_for/tachyon/msvs/win8ui/App.xaml new file mode 100644 index 00000000..df49ca82 --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/tachyon/msvs/win8ui/App.xaml @@ -0,0 +1,15 @@ + + + + + + + + + + + diff --git a/xdl/third_party/tbb/examples/parallel_for/tachyon/msvs/win8ui/App.xaml.cpp b/xdl/third_party/tbb/examples/parallel_for/tachyon/msvs/win8ui/App.xaml.cpp new file mode 100644 index 00000000..ff153805 --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/tachyon/msvs/win8ui/App.xaml.cpp @@ -0,0 +1,54 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +#include "DirectXPage.xaml.h" + +using namespace tbbTachyon; + +using namespace Platform; +using namespace Windows::ApplicationModel; +using namespace Windows::ApplicationModel::Activation; +using namespace Windows::Foundation; +using namespace Windows::Foundation::Collections; +using namespace Windows::Storage; +using namespace Windows::UI::Xaml; +using namespace Windows::UI::Xaml::Controls; +using namespace Windows::UI::Xaml::Controls::Primitives; +using namespace Windows::UI::Xaml::Data; +using namespace Windows::UI::Xaml::Input; +using namespace Windows::UI::Xaml::Interop; +using namespace Windows::UI::Xaml::Media; +using namespace Windows::UI::Xaml::Navigation; + +#include "src/tachyon_video.h" + +App::App() +{ + InitializeComponent(); +} + +void App::OnLaunched(Windows::ApplicationModel::Activation::LaunchActivatedEventArgs^ pArgs) +{ + m_directXPage = ref new DirectXPage(); + + // Place the frame in the current Window and ensure that it is active + Window::Current->Content = m_directXPage; + Window::Current->Activate(); +} diff --git a/xdl/third_party/tbb/examples/parallel_for/tachyon/msvs/win8ui/App.xaml.h b/xdl/third_party/tbb/examples/parallel_for/tachyon/msvs/win8ui/App.xaml.h new file mode 100644 index 00000000..10740484 --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/tachyon/msvs/win8ui/App.xaml.h @@ -0,0 +1,41 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + + +#pragma once + +#include "App.g.h" +#include "DirectXPage.xaml.h" + +namespace tbbTachyon +{ + /// + /// Provides application-specific behavior to supplement the default Application class. + /// + ref class App sealed + { + public: + App(); + virtual void OnLaunched(Windows::ApplicationModel::Activation::LaunchActivatedEventArgs^ pArgs) override; + + private: + DirectXPage^ m_directXPage; + }; +} diff --git a/xdl/third_party/tbb/examples/parallel_for/tachyon/msvs/win8ui/Assets/Logo.png b/xdl/third_party/tbb/examples/parallel_for/tachyon/msvs/win8ui/Assets/Logo.png new file mode 100644 index 00000000..bc91a8ef Binary files /dev/null and b/xdl/third_party/tbb/examples/parallel_for/tachyon/msvs/win8ui/Assets/Logo.png differ diff --git a/xdl/third_party/tbb/examples/parallel_for/tachyon/msvs/win8ui/Assets/SmallLogo.png b/xdl/third_party/tbb/examples/parallel_for/tachyon/msvs/win8ui/Assets/SmallLogo.png new file mode 100644 index 00000000..cddf7a14 Binary files /dev/null and b/xdl/third_party/tbb/examples/parallel_for/tachyon/msvs/win8ui/Assets/SmallLogo.png differ diff --git a/xdl/third_party/tbb/examples/parallel_for/tachyon/msvs/win8ui/Assets/SplashScreen.png b/xdl/third_party/tbb/examples/parallel_for/tachyon/msvs/win8ui/Assets/SplashScreen.png new file mode 100644 index 00000000..37af2706 Binary files /dev/null and b/xdl/third_party/tbb/examples/parallel_for/tachyon/msvs/win8ui/Assets/SplashScreen.png differ diff --git a/xdl/third_party/tbb/examples/parallel_for/tachyon/msvs/win8ui/Assets/StoreLogo.png b/xdl/third_party/tbb/examples/parallel_for/tachyon/msvs/win8ui/Assets/StoreLogo.png new file mode 100644 index 00000000..42a13f0f Binary files /dev/null and b/xdl/third_party/tbb/examples/parallel_for/tachyon/msvs/win8ui/Assets/StoreLogo.png differ diff --git a/xdl/third_party/tbb/examples/parallel_for/tachyon/msvs/win8ui/Common/StandardStyles.xaml b/xdl/third_party/tbb/examples/parallel_for/tachyon/msvs/win8ui/Common/StandardStyles.xaml new file mode 100644 index 00000000..81fb398e --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/tachyon/msvs/win8ui/Common/StandardStyles.xaml @@ -0,0 +1,1007 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Mouse + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/xdl/third_party/tbb/examples/parallel_for/tachyon/msvs/win8ui/DirectXBase.cpp b/xdl/third_party/tbb/examples/parallel_for/tachyon/msvs/win8ui/DirectXBase.cpp new file mode 100644 index 00000000..721d1c98 --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/tachyon/msvs/win8ui/DirectXBase.cpp @@ -0,0 +1,413 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +#include "pch.h" +#include "DirectXBase.h" +#include +#include + +using namespace Microsoft::WRL; +using namespace Windows::UI::Core; +using namespace Windows::UI::Xaml::Controls; +using namespace Windows::Foundation; +using namespace Windows::Graphics::Display; +using namespace D2D1; + +// Constructor. +DirectXBase::DirectXBase() : + m_dpi(-1.0f) +{ +} + +// Initialize the DirectX resources required to run. +void DirectXBase::Initialize(CoreWindow^ window, SwapChainBackgroundPanel^ panel, float dpi) +{ + m_window = window; + m_panel = panel; + + CreateDeviceIndependentResources(); + CreateDeviceResources(); + SetDpi(dpi); +} + +// These are the resources required independent of the device. +void DirectXBase::CreateDeviceIndependentResources() +{ + D2D1_FACTORY_OPTIONS options; + ZeroMemory(&options, sizeof(D2D1_FACTORY_OPTIONS)); + +#if defined(_DEBUG) + // If the project is in a debug build, enable Direct2D debugging via SDK Layers + // TODO: investigate resource leaks reported by a debug version of a device. + // options.debugLevel = D2D1_DEBUG_LEVEL_INFORMATION; +#endif + + DX::ThrowIfFailed( + D2D1CreateFactory( + D2D1_FACTORY_TYPE_SINGLE_THREADED, + __uuidof(ID2D1Factory1), + &options, + &m_d2dFactory + ) + ); + + DX::ThrowIfFailed( + DWriteCreateFactory( + DWRITE_FACTORY_TYPE_SHARED, + __uuidof(IDWriteFactory), + &m_dwriteFactory + ) + ); + + DX::ThrowIfFailed( + CoCreateInstance( + CLSID_WICImagingFactory, + nullptr, + CLSCTX_INPROC_SERVER, + IID_PPV_ARGS(&m_wicFactory) + ) + ); +} + +// These are the resources that depend on the device. +void DirectXBase::CreateDeviceResources() +{ + // This flag adds support for surfaces with a different color channel ordering than the API default. + // It is recommended usage, and is required for compatibility with Direct2D. + UINT creationFlags = D3D11_CREATE_DEVICE_BGRA_SUPPORT; + ComPtr dxgiDevice; + +#if defined(_DEBUG) + // If the project is in a debug build, enable debugging via SDK Layers with this flag. + creationFlags |= D3D11_CREATE_DEVICE_DEBUG; +#endif + + // This array defines the set of DirectX hardware feature levels this app will support. + // Note the ordering should be preserved. + // Don't forget to declare your application's minimum required feature level in its + // description. All applications are assumed to support 9.1 unless otherwise stated. + D3D_FEATURE_LEVEL featureLevels[] = + { + D3D_FEATURE_LEVEL_11_1, + D3D_FEATURE_LEVEL_11_0, + D3D_FEATURE_LEVEL_10_1, + D3D_FEATURE_LEVEL_10_0, + D3D_FEATURE_LEVEL_9_3, + D3D_FEATURE_LEVEL_9_2, + D3D_FEATURE_LEVEL_9_1 + }; + + // Create the DX11 API device object, and get a corresponding context. + ComPtr device; + ComPtr context; + DX::ThrowIfFailed( + D3D11CreateDevice( + nullptr, // specify null to use the default adapter + D3D_DRIVER_TYPE_HARDWARE, + 0, // leave as 0 unless software device + creationFlags, // optionally set debug and Direct2D compatibility flags + featureLevels, // list of feature levels this app can support + ARRAYSIZE(featureLevels), // number of entries in above list + D3D11_SDK_VERSION, // always set this to D3D11_SDK_VERSION for Metro style apps + &device, // returns the Direct3D device created + &m_featureLevel, // returns feature level of device created + &context // returns the device immediate context + ) + ); + // Get the DirectX11.1 device by QI off the DirectX11 one. + DX::ThrowIfFailed( + device.As(&m_d3dDevice) + ); + + // And get the corresponding device context in the same way. + DX::ThrowIfFailed( + context.As(&m_d3dContext) + ); + + // Obtain the underlying DXGI device of the Direct3D11.1 device. + DX::ThrowIfFailed( + m_d3dDevice.As(&dxgiDevice) + ); + + // Obtain the Direct2D device for 2-D rendering. + DX::ThrowIfFailed( + m_d2dFactory->CreateDevice(dxgiDevice.Get(), &m_d2dDevice) + ); + + // And get its corresponding device context object. + DX::ThrowIfFailed( + m_d2dDevice->CreateDeviceContext( + D2D1_DEVICE_CONTEXT_OPTIONS_NONE, + &m_d2dContext + ) + ); + + // Release the swap chain (if it exists) as it will be incompatible with the new device. + m_swapChain = nullptr; +} + +// Helps track the DPI in the helper class. +// This is called in the dpiChanged event handler in the view class. +void DirectXBase::SetDpi(float dpi) +{ + if (dpi != m_dpi) + { + // Save the DPI of this display in our class. + m_dpi = dpi; + + // Update Direct2D's stored DPI. + m_d2dContext->SetDpi(m_dpi, m_dpi); + + // Often a DPI change implies a window size change. In some cases Windows will issues + // both a size changed event and a DPI changed event. In this case, the resulting bounds + // will not change, and the window resize code will only be executed once. + UpdateForWindowSizeChange(); + } +} + +// This routine is called in the event handler for the view SizeChanged event. +void DirectXBase::UpdateForWindowSizeChange() +{ + // Only handle window size changed if there is no pending DPI change. + if (m_dpi != DisplayProperties::LogicalDpi) + return; + + if (m_window->Bounds.Width != m_windowBounds.Width || + m_window->Bounds.Height != m_windowBounds.Height) + { + m_d2dContext->SetTarget(nullptr); + m_d2dTargetBitmap = nullptr; + m_renderTargetView = nullptr; + m_depthStencilView = nullptr; + CreateWindowSizeDependentResources(); + } +} + +// Allocate all memory resources that change on a window SizeChanged event. +void DirectXBase::CreateWindowSizeDependentResources() +{ + // Store the window bounds so the next time we get a SizeChanged event we can + // avoid rebuilding everything if the size is identical. + m_windowBounds = m_window->Bounds; + + // Calculate the necessary swap chain and render target size in pixels. + m_renderTargetSize.Width = ConvertDipsToPixels(m_windowBounds.Width); + m_renderTargetSize.Height = ConvertDipsToPixels(m_windowBounds.Height); + + // If the swap chain already exists, resize it. + if (m_swapChain != nullptr) + { + DX::ThrowIfFailed( + m_swapChain->ResizeBuffers( + 2, + static_cast(m_renderTargetSize.Width), + static_cast(m_renderTargetSize.Height), + DXGI_FORMAT_B8G8R8A8_UNORM, + 0 + ) + ); + } + // Otherwise, create a new one. + else + { + // Allocate a descriptor. + DXGI_SWAP_CHAIN_DESC1 swapChainDesc = {0}; + swapChainDesc.Width = static_cast(m_renderTargetSize.Width); // Match the size of the windowm. + swapChainDesc.Height = static_cast(m_renderTargetSize.Height); + swapChainDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; // This is the most common swapchain format. + swapChainDesc.Stereo = false; + swapChainDesc.SampleDesc.Count = 1; // Don't use multi-sampling. + swapChainDesc.SampleDesc.Quality = 0; + swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; + swapChainDesc.BufferCount = 2; // Use double buffering to enable flip. + swapChainDesc.Scaling = DXGI_SCALING_STRETCH; + swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL; // All Metro style apps must use this SwapEffect. + swapChainDesc.Flags = 0; + + // Once the desired swap chain description is configured, it must be created on the same adapter as our D3D Device. + + // First, retrieve the underlying DXGI Device from the D3D Device. + ComPtr dxgiDevice; + DX::ThrowIfFailed( + m_d3dDevice.As(&dxgiDevice) + ); + + // Identify the physical adapter (GPU or card) this device is running on. + ComPtr dxgiAdapter; + DX::ThrowIfFailed( + dxgiDevice->GetAdapter(&dxgiAdapter) + ); + + // And obtain the factory object that created it. + ComPtr dxgiFactory; + DX::ThrowIfFailed( + dxgiAdapter->GetParent(IID_PPV_ARGS(&dxgiFactory)) + ); + + // Create the swap chain and then associate it with the SwapChainBackgroundPanel. + DX::ThrowIfFailed( + dxgiFactory->CreateSwapChainForComposition( + m_d3dDevice.Get(), + &swapChainDesc, + nullptr, + &m_swapChain + ) + ); + + ComPtr panelNative; + DX::ThrowIfFailed( + reinterpret_cast(m_panel)->QueryInterface(IID_PPV_ARGS(&panelNative)) + ); + + DX::ThrowIfFailed( + panelNative->SetSwapChain(m_swapChain.Get()) + ); + + // Ensure that DXGI does not queue more than one frame at a time. This both reduces + // latency and ensures that the application will only render after each VSync, minimizing + // power consumption. + DX::ThrowIfFailed( + dxgiDevice->SetMaximumFrameLatency(1) + ); + } + + // Obtain the backbuffer for this window which will be the final 3D rendertarget. + ComPtr backBuffer; + DX::ThrowIfFailed( + m_swapChain->GetBuffer(0, IID_PPV_ARGS(&backBuffer)) + ); + + // Create a view interface on the rendertarget to use on bind. + DX::ThrowIfFailed( + m_d3dDevice->CreateRenderTargetView( + backBuffer.Get(), + nullptr, + &m_renderTargetView + ) + ); + + // Create a descriptor for the depth/stencil buffer. + CD3D11_TEXTURE2D_DESC depthStencilDesc( + DXGI_FORMAT_D24_UNORM_S8_UINT, + static_cast(m_renderTargetSize.Width), + static_cast(m_renderTargetSize.Height), + 1, + 1, + D3D11_BIND_DEPTH_STENCIL + ); + + // Allocate a 2-D surface as the depth/stencil buffer. + ComPtr depthStencil; + DX::ThrowIfFailed( + m_d3dDevice->CreateTexture2D( + &depthStencilDesc, + nullptr, + &depthStencil + ) + ); + + // Create a DepthStencil view on this surface to use on bind. + CD3D11_DEPTH_STENCIL_VIEW_DESC depthStencilViewDesc(D3D11_DSV_DIMENSION_TEXTURE2D); + DX::ThrowIfFailed( + m_d3dDevice->CreateDepthStencilView( + depthStencil.Get(), + &depthStencilViewDesc, + &m_depthStencilView + ) + ); + + // Create a viewport descriptor of the full window size. + CD3D11_VIEWPORT viewport( + 0.0f, + 0.0f, + m_renderTargetSize.Width, + m_renderTargetSize.Height + ); + + // Set the current viewport using the descriptor. + m_d3dContext->RSSetViewports(1, &viewport); + + // Now we set up the Direct2D render target bitmap linked to the swapchain. + // Whenever we render to this bitmap, it will be directly rendered to the + // swapchain associated with the window. + D2D1_BITMAP_PROPERTIES1 bitmapProperties = + BitmapProperties1( + D2D1_BITMAP_OPTIONS_TARGET | D2D1_BITMAP_OPTIONS_CANNOT_DRAW, + PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_PREMULTIPLIED), + m_dpi, + m_dpi + ); + + // Direct2D needs the DXGI version of the backbuffer surface pointer. + ComPtr dxgiBackBuffer; + DX::ThrowIfFailed( + m_swapChain->GetBuffer(0, IID_PPV_ARGS(&dxgiBackBuffer)) + ); + + // Get a D2D surface from the DXGI back buffer to use as the D2D render target. + DX::ThrowIfFailed( + m_d2dContext->CreateBitmapFromDxgiSurface( + dxgiBackBuffer.Get(), + &bitmapProperties, + &m_d2dTargetBitmap + ) + ); + + // So now we can set the Direct2D render target. + m_d2dContext->SetTarget(m_d2dTargetBitmap.Get()); + + // Set D2D text anti-alias mode to Grayscale to ensure proper rendering of text on intermediate surfaces. + m_d2dContext->SetTextAntialiasMode(D2D1_TEXT_ANTIALIAS_MODE_GRAYSCALE); +} + +// Method to deliver the final image to the display. +void DirectXBase::Present() +{ + // The application may optionally specify "dirty" or "scroll" rects to improve efficiency + // in certain scenarios. + DXGI_PRESENT_PARAMETERS parameters = {0}; + parameters.DirtyRectsCount = 0; + parameters.pDirtyRects = nullptr; + parameters.pScrollRect = nullptr; + parameters.pScrollOffset = nullptr; + + // The first argument instructs DXGI to block until VSync, putting the application + // to sleep until the next VSync. This ensures we don't waste any cycles rendering + // frames that will never be displayed to the screen. + HRESULT hr = m_swapChain->Present1(1, 0, ¶meters); + + // If the device was removed either by a disconnect or a driver upgrade, we + // must completely reinitialize the renderer. + if (hr == DXGI_ERROR_DEVICE_REMOVED || hr == DXGI_ERROR_DEVICE_RESET) + { + Initialize(m_window.Get(), m_panel, m_dpi); + } + else + { + DX::ThrowIfFailed(hr); + } +} + +// Method to convert a length in device-independent pixels (DIPs) to a length in physical pixels. +float DirectXBase::ConvertDipsToPixels(float dips) +{ + static const float dipsPerInch = 96.0f; + return floor(dips * m_dpi / dipsPerInch + 0.5f); // Round to nearest integer. +} diff --git a/xdl/third_party/tbb/examples/parallel_for/tachyon/msvs/win8ui/DirectXBase.h b/xdl/third_party/tbb/examples/parallel_for/tachyon/msvs/win8ui/DirectXBase.h new file mode 100644 index 00000000..9964fb06 --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/tachyon/msvs/win8ui/DirectXBase.h @@ -0,0 +1,92 @@ +/* + Copyright (c) 2005-2018 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +*/ + +#pragma once + +#include +#include +#include +#include +#include +#include +#include "App.xaml.h" +#include + +#pragma warning (disable: 4449) + +// Helper utilities to make DirectX APIs work with exceptions +namespace DX +{ + inline void ThrowIfFailed(HRESULT hr) + { + if (FAILED(hr)) + { + // Set a breakpoint on this line to catch DirectX API errors + throw Platform::Exception::CreateException(hr); + } + } +} + +// Helper class that initializes DirectX APIs +ref class DirectXBase abstract +{ +internal: + DirectXBase(); + +public: + virtual void Initialize(Windows::UI::Core::CoreWindow^ window, Windows::UI::Xaml::Controls::SwapChainBackgroundPanel^ panel, float dpi); + virtual void CreateDeviceIndependentResources(); + virtual void CreateDeviceResources(); + virtual void SetDpi(float dpi); + virtual void CreateWindowSizeDependentResources(); + virtual void UpdateForWindowSizeChange(); + virtual void Render() = 0; + virtual void Present(); + virtual float ConvertDipsToPixels(float dips); + +protected private: + + Platform::Agile m_window; + Windows::UI::Xaml::Controls::SwapChainBackgroundPanel^ m_panel; + + // Direct2D Objects + Microsoft::WRL::ComPtr m_d2dFactory; + Microsoft::WRL::ComPtr m_d2dDevice; + Microsoft::WRL::ComPtr m_d2dContext; + Microsoft::WRL::ComPtr m_d2dTargetBitmap; + + // DirectWrite & Windows Imaging Component Objects + Microsoft::WRL::ComPtr m_dwriteFactory; + Microsoft::WRL::ComPtr m_wicFactory; + + // Direct3D Objects + Microsoft::WRL::ComPtr m_d3dDevice; + Microsoft::WRL::ComPtr m_d3dContext; + Microsoft::WRL::ComPtr m_swapChain; + Microsoft::WRL::ComPtr m_renderTargetView; + Microsoft::WRL::ComPtr m_depthStencilView; + + D3D_FEATURE_LEVEL m_featureLevel; + Windows::Foundation::Size m_renderTargetSize; + Windows::Foundation::Rect m_windowBounds; + float m_dpi; +}; + +#pragma warning (default: 4449) diff --git a/xdl/third_party/tbb/examples/parallel_for/tachyon/msvs/win8ui/DirectXPage.xaml b/xdl/third_party/tbb/examples/parallel_for/tachyon/msvs/win8ui/DirectXPage.xaml new file mode 100644 index 00000000..a255074c --- /dev/null +++ b/xdl/third_party/tbb/examples/parallel_for/tachyon/msvs/win8ui/DirectXPage.xaml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + +